229 lines
8.0 KiB
Java
229 lines
8.0 KiB
Java
|
package org.jmrtd.io;
|
||
|
|
||
|
import com.google.common.primitives.UnsignedBytes;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import org.jmrtd.io.FragmentBuffer;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class InputStreamBuffer {
|
||
|
public FragmentBuffer buffer;
|
||
|
private PositionInputStream carrier;
|
||
|
|
||
|
public InputStreamBuffer(InputStream inputStream, int i) {
|
||
|
PositionInputStream positionInputStream = new PositionInputStream(inputStream);
|
||
|
this.carrier = positionInputStream;
|
||
|
positionInputStream.mark(i);
|
||
|
this.buffer = new FragmentBuffer(i);
|
||
|
}
|
||
|
|
||
|
public void updateFrom(InputStreamBuffer inputStreamBuffer) {
|
||
|
this.buffer.updateFrom(inputStreamBuffer.buffer);
|
||
|
}
|
||
|
|
||
|
public SubInputStream getInputStream() {
|
||
|
SubInputStream subInputStream;
|
||
|
synchronized (this.carrier) {
|
||
|
subInputStream = new SubInputStream(this, this.carrier);
|
||
|
}
|
||
|
return subInputStream;
|
||
|
}
|
||
|
|
||
|
public int getPosition() {
|
||
|
int position;
|
||
|
synchronized (this) {
|
||
|
position = this.buffer.getPosition();
|
||
|
}
|
||
|
return position;
|
||
|
}
|
||
|
|
||
|
public int getBytesBuffered() {
|
||
|
int bytesBuffered;
|
||
|
synchronized (this) {
|
||
|
bytesBuffered = this.buffer.getBytesBuffered();
|
||
|
}
|
||
|
return bytesBuffered;
|
||
|
}
|
||
|
|
||
|
public int getLength() {
|
||
|
return this.buffer.getLength();
|
||
|
}
|
||
|
|
||
|
public String toString() {
|
||
|
StringBuilder sb = new StringBuilder("InputStreamBuffer [");
|
||
|
sb.append(this.buffer);
|
||
|
sb.append("]");
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class SubInputStream extends InputStream {
|
||
|
static final boolean $assertionsDisabled = false;
|
||
|
private Object syncObject;
|
||
|
final InputStreamBuffer this$0;
|
||
|
private int position = 0;
|
||
|
private int markedPosition = -1;
|
||
|
|
||
|
@Override // java.io.InputStream, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public void close() throws IOException {
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public boolean markSupported() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public SubInputStream(InputStreamBuffer inputStreamBuffer, Object obj) {
|
||
|
this.this$0 = inputStreamBuffer;
|
||
|
this.syncObject = obj;
|
||
|
}
|
||
|
|
||
|
public FragmentBuffer getBuffer() {
|
||
|
return this.this$0.buffer;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public int read() throws IOException {
|
||
|
synchronized (this.syncObject) {
|
||
|
if (this.position >= this.this$0.buffer.getLength()) {
|
||
|
return -1;
|
||
|
}
|
||
|
if (!this.this$0.buffer.isCoveredByFragment(this.position)) {
|
||
|
if (this.this$0.carrier.markSupported()) {
|
||
|
syncCarrierPosition(this.position);
|
||
|
}
|
||
|
try {
|
||
|
int read = this.this$0.carrier.read();
|
||
|
if (read < 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
FragmentBuffer fragmentBuffer = this.this$0.buffer;
|
||
|
int i = this.position;
|
||
|
this.position = i + 1;
|
||
|
fragmentBuffer.addFragment(i, (byte) read);
|
||
|
return read;
|
||
|
} catch (IOException e) {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
byte[] buffer = this.this$0.buffer.getBuffer();
|
||
|
int i2 = this.position;
|
||
|
this.position = i2 + 1;
|
||
|
return buffer[i2] & UnsignedBytes.MAX_VALUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public int read(byte[] bArr) throws IOException {
|
||
|
int read;
|
||
|
synchronized (this.syncObject) {
|
||
|
read = read(bArr, 0, bArr.length);
|
||
|
}
|
||
|
return read;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public int read(byte[] bArr, int i, int i2) throws IOException {
|
||
|
synchronized (this.syncObject) {
|
||
|
if (bArr == null) {
|
||
|
throw new NullPointerException();
|
||
|
}
|
||
|
if (i < 0 || i2 < 0 || i2 > bArr.length - i) {
|
||
|
throw new IndexOutOfBoundsException();
|
||
|
}
|
||
|
if (i2 == 0) {
|
||
|
return 0;
|
||
|
}
|
||
|
if (i2 > this.this$0.buffer.getLength() - this.position) {
|
||
|
i2 = this.this$0.buffer.getLength() - this.position;
|
||
|
}
|
||
|
if (this.position >= this.this$0.buffer.getLength()) {
|
||
|
return -1;
|
||
|
}
|
||
|
if (this.this$0.carrier.markSupported()) {
|
||
|
syncCarrierPosition(this.position);
|
||
|
}
|
||
|
FragmentBuffer.Fragment smallestUnbufferedFragment = this.this$0.buffer.getSmallestUnbufferedFragment(this.position, i2);
|
||
|
if (smallestUnbufferedFragment.getLength() > 0) {
|
||
|
int offset = smallestUnbufferedFragment.getOffset() - this.position;
|
||
|
int length = smallestUnbufferedFragment.getLength();
|
||
|
System.arraycopy(this.this$0.buffer.getBuffer(), this.position, bArr, i, offset);
|
||
|
this.position += offset;
|
||
|
if (this.this$0.carrier.markSupported()) {
|
||
|
syncCarrierPosition(this.position);
|
||
|
}
|
||
|
int i3 = i + offset;
|
||
|
int read = this.this$0.carrier.read(bArr, i3, length);
|
||
|
this.this$0.buffer.addFragment(smallestUnbufferedFragment.getOffset(), bArr, i3, read);
|
||
|
this.position += read;
|
||
|
return offset + read;
|
||
|
}
|
||
|
int min = Math.min(i2, this.this$0.buffer.getLength() - this.position);
|
||
|
System.arraycopy(this.this$0.buffer.getBuffer(), this.position, bArr, i, min);
|
||
|
this.position += min;
|
||
|
return min;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public long skip(long j) throws IOException {
|
||
|
long skip;
|
||
|
synchronized (this.syncObject) {
|
||
|
int bufferedLength = this.this$0.buffer.getBufferedLength(this.position);
|
||
|
long j2 = bufferedLength;
|
||
|
if (j <= j2) {
|
||
|
this.position = (int) (this.position + j);
|
||
|
return j;
|
||
|
}
|
||
|
this.position += bufferedLength;
|
||
|
if (this.this$0.carrier.markSupported()) {
|
||
|
syncCarrierPosition(this.position);
|
||
|
skip = this.this$0.carrier.skip(j - j2);
|
||
|
this.position += (int) skip;
|
||
|
} else {
|
||
|
skip = super.skip(j - j2);
|
||
|
}
|
||
|
return j2 + skip;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public int available() throws IOException {
|
||
|
return this.this$0.buffer.getBufferedLength(this.position);
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public void mark(int i) {
|
||
|
synchronized (this) {
|
||
|
this.markedPosition = this.position;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public void reset() throws IOException {
|
||
|
synchronized (this) {
|
||
|
int i = this.markedPosition;
|
||
|
if (i < 0) {
|
||
|
throw new IOException("Invalid reset, was mark() called?");
|
||
|
}
|
||
|
this.position = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void syncCarrierPosition(int i) throws IOException {
|
||
|
if (i == this.this$0.carrier.getPosition()) {
|
||
|
return;
|
||
|
}
|
||
|
this.this$0.carrier.reset();
|
||
|
int i2 = 0;
|
||
|
while (i2 < i) {
|
||
|
i2 = (int) (i2 + this.this$0.carrier.skip(i - i2));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int getPosition() {
|
||
|
return this.position;
|
||
|
}
|
||
|
}
|
||
|
}
|