363 lines
12 KiB
Java
363 lines
12 KiB
Java
|
package io.grpc.internal;
|
||
|
|
||
|
import com.google.common.base.Charsets;
|
||
|
import com.google.common.base.Preconditions;
|
||
|
import com.google.common.primitives.UnsignedBytes;
|
||
|
import io.grpc.Detachable;
|
||
|
import io.grpc.HasByteBuffer;
|
||
|
import io.grpc.KnownLength;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.io.OutputStream;
|
||
|
import java.nio.ByteBuffer;
|
||
|
import java.nio.InvalidMarkException;
|
||
|
import java.nio.charset.Charset;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public final class ReadableBuffers {
|
||
|
private static final ReadableBuffer EMPTY_BUFFER = new ByteArrayWrapper(new byte[0]);
|
||
|
|
||
|
public static ReadableBuffer wrap(byte[] bArr) {
|
||
|
return new ByteArrayWrapper(bArr, 0, bArr.length);
|
||
|
}
|
||
|
|
||
|
public static ReadableBuffer wrap(byte[] bArr, int i, int i2) {
|
||
|
return new ByteArrayWrapper(bArr, i, i2);
|
||
|
}
|
||
|
|
||
|
public static ReadableBuffer wrap(ByteBuffer byteBuffer) {
|
||
|
return new ByteReadableBufferWrapper(byteBuffer);
|
||
|
}
|
||
|
|
||
|
public static byte[] readArray(ReadableBuffer readableBuffer) {
|
||
|
Preconditions.checkNotNull(readableBuffer, "buffer");
|
||
|
int readableBytes = readableBuffer.readableBytes();
|
||
|
byte[] bArr = new byte[readableBytes];
|
||
|
readableBuffer.readBytes(bArr, 0, readableBytes);
|
||
|
return bArr;
|
||
|
}
|
||
|
|
||
|
public static String readAsString(ReadableBuffer readableBuffer, Charset charset) {
|
||
|
Preconditions.checkNotNull(charset, "charset");
|
||
|
return new String(readArray(readableBuffer), charset);
|
||
|
}
|
||
|
|
||
|
public static String readAsStringUtf8(ReadableBuffer readableBuffer) {
|
||
|
return readAsString(readableBuffer, Charsets.UTF_8);
|
||
|
}
|
||
|
|
||
|
public static InputStream openStream(ReadableBuffer readableBuffer, boolean z) {
|
||
|
if (!z) {
|
||
|
readableBuffer = ignoreClose(readableBuffer);
|
||
|
}
|
||
|
return new BufferInputStream(readableBuffer);
|
||
|
}
|
||
|
|
||
|
public static ReadableBuffer ignoreClose(ReadableBuffer readableBuffer) {
|
||
|
return new ForwardingReadableBuffer(readableBuffer) { // from class: io.grpc.internal.ReadableBuffers.1
|
||
|
@Override // io.grpc.internal.ForwardingReadableBuffer, io.grpc.internal.ReadableBuffer, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public void close() {
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
static class ByteArrayWrapper extends AbstractReadableBuffer {
|
||
|
final byte[] bytes;
|
||
|
final int end;
|
||
|
int mark;
|
||
|
int offset;
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public boolean hasArray() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public boolean markSupported() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
ByteArrayWrapper(byte[] bArr) {
|
||
|
this(bArr, 0, bArr.length);
|
||
|
}
|
||
|
|
||
|
ByteArrayWrapper(byte[] bArr, int i, int i2) {
|
||
|
this.mark = -1;
|
||
|
Preconditions.checkArgument(i >= 0, "offset must be >= 0");
|
||
|
Preconditions.checkArgument(i2 >= 0, "length must be >= 0");
|
||
|
int i3 = i2 + i;
|
||
|
Preconditions.checkArgument(i3 <= bArr.length, "offset + length exceeds array boundary");
|
||
|
this.bytes = (byte[]) Preconditions.checkNotNull(bArr, "bytes");
|
||
|
this.offset = i;
|
||
|
this.end = i3;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void skipBytes(int i) {
|
||
|
checkReadable(i);
|
||
|
this.offset += i;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public int readUnsignedByte() {
|
||
|
checkReadable(1);
|
||
|
byte[] bArr = this.bytes;
|
||
|
int i = this.offset;
|
||
|
this.offset = i + 1;
|
||
|
return bArr[i] & UnsignedBytes.MAX_VALUE;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void readBytes(byte[] bArr, int i, int i2) {
|
||
|
System.arraycopy(this.bytes, this.offset, bArr, i, i2);
|
||
|
this.offset += i2;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void readBytes(ByteBuffer byteBuffer) {
|
||
|
Preconditions.checkNotNull(byteBuffer, "dest");
|
||
|
int remaining = byteBuffer.remaining();
|
||
|
checkReadable(remaining);
|
||
|
byteBuffer.put(this.bytes, this.offset, remaining);
|
||
|
this.offset += remaining;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void readBytes(OutputStream outputStream, int i) throws IOException {
|
||
|
checkReadable(i);
|
||
|
outputStream.write(this.bytes, this.offset, i);
|
||
|
this.offset += i;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public ByteArrayWrapper readBytes(int i) {
|
||
|
checkReadable(i);
|
||
|
int i2 = this.offset;
|
||
|
this.offset = i2 + i;
|
||
|
return new ByteArrayWrapper(this.bytes, i2, i);
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public void reset() {
|
||
|
int i = this.mark;
|
||
|
if (i == -1) {
|
||
|
throw new InvalidMarkException();
|
||
|
}
|
||
|
this.offset = i;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public int readableBytes() {
|
||
|
return this.end - this.offset;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public void mark() {
|
||
|
this.mark = this.offset;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public int arrayOffset() {
|
||
|
return this.offset;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public byte[] array() {
|
||
|
return this.bytes;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
static class ByteReadableBufferWrapper extends AbstractReadableBuffer {
|
||
|
final ByteBuffer bytes;
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public boolean byteBufferSupported() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public boolean markSupported() {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
ByteReadableBufferWrapper(ByteBuffer byteBuffer) {
|
||
|
this.bytes = (ByteBuffer) Preconditions.checkNotNull(byteBuffer, "bytes");
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public int readableBytes() {
|
||
|
return this.bytes.remaining();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public int readUnsignedByte() {
|
||
|
checkReadable(1);
|
||
|
return this.bytes.get() & UnsignedBytes.MAX_VALUE;
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void skipBytes(int i) {
|
||
|
checkReadable(i);
|
||
|
ByteBuffer byteBuffer = this.bytes;
|
||
|
byteBuffer.position(byteBuffer.position() + i);
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void readBytes(byte[] bArr, int i, int i2) {
|
||
|
checkReadable(i2);
|
||
|
this.bytes.get(bArr, i, i2);
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void readBytes(ByteBuffer byteBuffer) {
|
||
|
Preconditions.checkNotNull(byteBuffer, "dest");
|
||
|
int remaining = byteBuffer.remaining();
|
||
|
checkReadable(remaining);
|
||
|
int limit = this.bytes.limit();
|
||
|
ByteBuffer byteBuffer2 = this.bytes;
|
||
|
byteBuffer2.limit(byteBuffer2.position() + remaining);
|
||
|
byteBuffer.put(this.bytes);
|
||
|
this.bytes.limit(limit);
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public void readBytes(OutputStream outputStream, int i) throws IOException {
|
||
|
checkReadable(i);
|
||
|
if (hasArray()) {
|
||
|
outputStream.write(array(), arrayOffset(), i);
|
||
|
ByteBuffer byteBuffer = this.bytes;
|
||
|
byteBuffer.position(byteBuffer.position() + i);
|
||
|
} else {
|
||
|
byte[] bArr = new byte[i];
|
||
|
this.bytes.get(bArr);
|
||
|
outputStream.write(bArr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.ReadableBuffer
|
||
|
public ByteReadableBufferWrapper readBytes(int i) {
|
||
|
checkReadable(i);
|
||
|
ByteBuffer duplicate = this.bytes.duplicate();
|
||
|
duplicate.limit(this.bytes.position() + i);
|
||
|
ByteBuffer byteBuffer = this.bytes;
|
||
|
byteBuffer.position(byteBuffer.position() + i);
|
||
|
return new ByteReadableBufferWrapper(duplicate);
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public boolean hasArray() {
|
||
|
return this.bytes.hasArray();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public byte[] array() {
|
||
|
return this.bytes.array();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public int arrayOffset() {
|
||
|
return this.bytes.arrayOffset() + this.bytes.position();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public void mark() {
|
||
|
this.bytes.mark();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public void reset() {
|
||
|
this.bytes.reset();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.internal.AbstractReadableBuffer, io.grpc.internal.ReadableBuffer
|
||
|
public ByteBuffer getByteBuffer() {
|
||
|
return this.bytes.slice();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
static final class BufferInputStream extends InputStream implements KnownLength, HasByteBuffer, Detachable {
|
||
|
private ReadableBuffer buffer;
|
||
|
|
||
|
public BufferInputStream(ReadableBuffer readableBuffer) {
|
||
|
this.buffer = (ReadableBuffer) Preconditions.checkNotNull(readableBuffer, "buffer");
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream, io.grpc.KnownLength
|
||
|
public final int available() throws IOException {
|
||
|
return this.buffer.readableBytes();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public final int read() {
|
||
|
if (this.buffer.readableBytes() == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
return this.buffer.readUnsignedByte();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public final int read(byte[] bArr, int i, int i2) throws IOException {
|
||
|
if (this.buffer.readableBytes() == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
int min = Math.min(this.buffer.readableBytes(), i2);
|
||
|
this.buffer.readBytes(bArr, i, min);
|
||
|
return min;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public final long skip(long j) throws IOException {
|
||
|
int min = (int) Math.min(this.buffer.readableBytes(), j);
|
||
|
this.buffer.skipBytes(min);
|
||
|
return min;
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public final void mark(int i) {
|
||
|
this.buffer.mark();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public final void reset() throws IOException {
|
||
|
this.buffer.reset();
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream
|
||
|
public final boolean markSupported() {
|
||
|
return this.buffer.markSupported();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.HasByteBuffer
|
||
|
public final boolean byteBufferSupported() {
|
||
|
return this.buffer.byteBufferSupported();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.HasByteBuffer
|
||
|
public final ByteBuffer getByteBuffer() {
|
||
|
return this.buffer.getByteBuffer();
|
||
|
}
|
||
|
|
||
|
@Override // io.grpc.Detachable
|
||
|
public final InputStream detach() {
|
||
|
ReadableBuffer readableBuffer = this.buffer;
|
||
|
this.buffer = readableBuffer.readBytes(0);
|
||
|
return new BufferInputStream(readableBuffer);
|
||
|
}
|
||
|
|
||
|
@Override // java.io.InputStream, java.io.Closeable, java.lang.AutoCloseable
|
||
|
public final void close() throws IOException {
|
||
|
this.buffer.close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private ReadableBuffers() {
|
||
|
}
|
||
|
|
||
|
public static ReadableBuffer empty() {
|
||
|
return EMPTY_BUFFER;
|
||
|
}
|
||
|
}
|