init commit
This commit is contained in:
@@ -0,0 +1,305 @@
|
||||
/*
|
||||
* Decompiled with CFR 0.152.
|
||||
*/
|
||||
package com.ea.nimble;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.ListIterator;
|
||||
|
||||
public class ByteBufferIOStream {
|
||||
protected static final int SEGMENT_SIZE = 4096;
|
||||
protected int m_availableSegment = 0;
|
||||
protected LinkedList<byte[]> m_buffer = new LinkedList<>();
|
||||
protected boolean m_closed = false;
|
||||
protected ByteBufferInputStream m_input = new ByteBufferInputStream();
|
||||
protected ByteBufferOutputStream m_output = new ByteBufferOutputStream();
|
||||
protected int m_readPosition = 0;
|
||||
protected int m_writePosition = 0;
|
||||
|
||||
public ByteBufferIOStream() {
|
||||
this(1);
|
||||
}
|
||||
|
||||
public ByteBufferIOStream(int n2) {
|
||||
int n3 = n2;
|
||||
if (n2 <= 0) {
|
||||
n3 = 1;
|
||||
}
|
||||
n3 = (n3 - 1) / 4096;
|
||||
n2 = 0;
|
||||
while (n2 < n3 + 1) {
|
||||
this.m_buffer.add(new byte[4096]);
|
||||
++n2;
|
||||
}
|
||||
}
|
||||
|
||||
public void appendSegmentToBuffer(byte[] byArray, int n2) throws IOException {
|
||||
if (this.m_writePosition == 0 && byArray.length == 4096) {
|
||||
ListIterator<byte[]> listIterator = this.m_buffer.listIterator();
|
||||
for (int i2 = 0; i2 < this.m_availableSegment; ++i2) {
|
||||
listIterator.next();
|
||||
}
|
||||
listIterator.add(byArray);
|
||||
if (n2 != 4096) {
|
||||
this.m_writePosition = n2;
|
||||
return;
|
||||
}
|
||||
++this.m_availableSegment;
|
||||
return;
|
||||
}
|
||||
this.getOutputStream().write(byArray, 0, n2);
|
||||
}
|
||||
|
||||
public int available() throws IOException {
|
||||
return this.m_input.available();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
this.m_closed = false;
|
||||
this.m_availableSegment = 0;
|
||||
this.m_writePosition = 0;
|
||||
this.m_readPosition = 0;
|
||||
}
|
||||
|
||||
protected void closeIOStream() {
|
||||
this.m_closed = true;
|
||||
}
|
||||
|
||||
public InputStream getInputStream() {
|
||||
return this.m_input;
|
||||
}
|
||||
|
||||
public OutputStream getOutputStream() {
|
||||
return this.m_output;
|
||||
}
|
||||
|
||||
public byte[] growBufferBySegment() throws IOException {
|
||||
if (this.m_writePosition != 0) {
|
||||
throw new IOException("Bad location to grow buffer");
|
||||
}
|
||||
ListIterator<byte[]> listIterator = this.m_buffer.listIterator();
|
||||
int n2 = 0;
|
||||
while (true) {
|
||||
if (n2 >= this.m_availableSegment) {
|
||||
byte[] byArray = new byte[4096];
|
||||
listIterator.add(byArray);
|
||||
++this.m_availableSegment;
|
||||
return byArray;
|
||||
}
|
||||
listIterator.next();
|
||||
++n2;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] prepareSegment() {
|
||||
if (this.m_availableSegment + 1 >= this.m_buffer.size()) {
|
||||
return new byte[4096];
|
||||
}
|
||||
if (this.m_buffer.size() != 0) return this.m_buffer.removeLast();
|
||||
return null;
|
||||
}
|
||||
|
||||
protected class ByteBufferInputStream
|
||||
extends InputStream {
|
||||
protected ByteBufferInputStream() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int available() throws IOException {
|
||||
if (!ByteBufferIOStream.this.m_closed) return ByteBufferIOStream.this.m_availableSegment * 4096 + ByteBufferIOStream.this.m_writePosition - ByteBufferIOStream.this.m_readPosition;
|
||||
throw new IOException("ByteBufferIOStream is closed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
ByteBufferIOStream.this.closeIOStream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean markSupported() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
if (this.available() <= 0) {
|
||||
throw new IOException("Nothing to read in ByteBufferIOStream");
|
||||
}
|
||||
byte by2 = ByteBufferIOStream.this.m_buffer.getFirst()[ByteBufferIOStream.this.m_readPosition];
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
++byteBufferIOStream.m_readPosition;
|
||||
if (ByteBufferIOStream.this.m_readPosition < 4096) return by2;
|
||||
ByteBufferIOStream.this.m_buffer.add(ByteBufferIOStream.this.m_buffer.poll());
|
||||
ByteBufferIOStream.this.m_readPosition = 0;
|
||||
byteBufferIOStream = ByteBufferIOStream.this;
|
||||
--byteBufferIOStream.m_availableSegment;
|
||||
return by2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(byte[] byArray) throws IOException {
|
||||
return this.read(byArray, 0, byArray.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(byte[] object, int n2, int n3) throws IOException {
|
||||
if (n2 < 0) throw new IndexOutOfBoundsException("The reading range of out of buffer boundary.");
|
||||
if (n3 < 0) throw new IndexOutOfBoundsException("The reading range of out of buffer boundary.");
|
||||
if (n2 + n3 > ((byte[])object).length) {
|
||||
throw new IndexOutOfBoundsException("The reading range of out of buffer boundary.");
|
||||
}
|
||||
int n4 = this.available();
|
||||
if (n4 <= 0) {
|
||||
return -1;
|
||||
}
|
||||
int n5 = n3;
|
||||
if (n3 > n4) {
|
||||
n5 = n4;
|
||||
}
|
||||
if (n5 < (n3 = 4096 - ByteBufferIOStream.this.m_readPosition)) {
|
||||
System.arraycopy(ByteBufferIOStream.this.m_buffer.getFirst(), ByteBufferIOStream.this.m_readPosition, object, n2, n5);
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
byteBufferIOStream.m_readPosition += n5;
|
||||
return n5;
|
||||
}
|
||||
System.arraycopy(ByteBufferIOStream.this.m_buffer.getFirst(), ByteBufferIOStream.this.m_readPosition, object, n2, n3);
|
||||
ByteBufferIOStream.this.m_buffer.add(ByteBufferIOStream.this.m_buffer.poll());
|
||||
n4 = n5 - n3;
|
||||
n2 += n3;
|
||||
int n6 = n4 / 4096;
|
||||
n3 = 0;
|
||||
while (true) {
|
||||
if (n3 >= n6) {
|
||||
System.arraycopy(ByteBufferIOStream.this.m_buffer.getFirst(), 0, object, n2, n4);
|
||||
ByteBufferIOStream.this.m_readPosition = n4;
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
byteBufferIOStream.m_availableSegment -= n6 + 1;
|
||||
return n5;
|
||||
}
|
||||
System.arraycopy(ByteBufferIOStream.this.m_buffer.getFirst(), 0, object, n2, 4096);
|
||||
ByteBufferIOStream.this.m_buffer.add(ByteBufferIOStream.this.m_buffer.poll());
|
||||
n4 -= 4096;
|
||||
n2 += 4096;
|
||||
++n3;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long skip(long l2) throws IOException {
|
||||
int n2;
|
||||
int n3 = this.available();
|
||||
if (n3 <= 0) {
|
||||
return 0L;
|
||||
}
|
||||
long l3 = l2;
|
||||
if (l2 > (long)n3) {
|
||||
l3 = n3;
|
||||
}
|
||||
if ((n3 = (int)l3) < (n2 = 4096 - ByteBufferIOStream.this.m_readPosition)) {
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
byteBufferIOStream.m_readPosition += n3;
|
||||
return l3;
|
||||
}
|
||||
ByteBufferIOStream.this.m_buffer.add(ByteBufferIOStream.this.m_buffer.poll());
|
||||
n2 = n3 - n2;
|
||||
int n4 = n2 / 4096;
|
||||
n3 = 0;
|
||||
while (true) {
|
||||
if (n3 >= n4) {
|
||||
ByteBufferIOStream.this.m_readPosition = n2;
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
byteBufferIOStream.m_availableSegment -= n4 + 1;
|
||||
return l3;
|
||||
}
|
||||
ByteBufferIOStream.this.m_buffer.add(ByteBufferIOStream.this.m_buffer.poll());
|
||||
n2 -= 4096;
|
||||
++n3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected class ByteBufferOutputStream
|
||||
extends OutputStream {
|
||||
protected ByteBufferOutputStream() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
ByteBufferIOStream.this.closeIOStream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(int n2) throws IOException {
|
||||
if (ByteBufferIOStream.this.m_closed) {
|
||||
throw new IOException("ByteBufferIOStream is closed");
|
||||
}
|
||||
ByteBufferIOStream.this.m_buffer.getFirst()[ByteBufferIOStream.this.m_writePosition] = (byte)n2;
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
++byteBufferIOStream.m_writePosition;
|
||||
if (ByteBufferIOStream.this.m_writePosition != 4096) return;
|
||||
ByteBufferIOStream.this.m_writePosition = 0;
|
||||
byteBufferIOStream = ByteBufferIOStream.this;
|
||||
++byteBufferIOStream.m_availableSegment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(byte[] byArray) throws IOException {
|
||||
this.write(byArray, 0, byArray.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(byte[] object, int n2, int n3) throws IOException {
|
||||
int n4;
|
||||
if (n2 < 0) throw new IndexOutOfBoundsException("The writing range is out of buffer boundary.");
|
||||
if (n3 < 0) throw new IndexOutOfBoundsException("The writing range is out of buffer boundary.");
|
||||
if (n2 + n3 > ((byte[])object).length) {
|
||||
throw new IndexOutOfBoundsException("The writing range is out of buffer boundary.");
|
||||
}
|
||||
if (ByteBufferIOStream.this.m_closed) {
|
||||
throw new IOException("ByteBufferIOStream is closed");
|
||||
}
|
||||
int n5 = 4096 - ByteBufferIOStream.this.m_writePosition;
|
||||
Iterator iterator = ByteBufferIOStream.this.m_buffer.iterator();
|
||||
for (n4 = 0; n4 < ByteBufferIOStream.this.m_availableSegment; ++n4) {
|
||||
iterator.next();
|
||||
}
|
||||
if (n3 < n5) {
|
||||
System.arraycopy(object, n2, iterator.next(), ByteBufferIOStream.this.m_writePosition, n3);
|
||||
ByteBufferIOStream byteBufferIOStream = ByteBufferIOStream.this;
|
||||
byteBufferIOStream.m_writePosition += n3;
|
||||
return;
|
||||
}
|
||||
System.arraycopy(object, n2, iterator.next(), ByteBufferIOStream.this.m_writePosition, n5);
|
||||
n4 = n2 + n5;
|
||||
Object object2 = ByteBufferIOStream.this;
|
||||
++((ByteBufferIOStream)object2).m_availableSegment;
|
||||
ByteBufferIOStream.this.m_writePosition = 0;
|
||||
n2 = n3 -= n5;
|
||||
n3 = n4;
|
||||
while (n2 > 0) {
|
||||
if (iterator.hasNext()) {
|
||||
object2 = (byte[])iterator.next();
|
||||
} else {
|
||||
object2 = new byte[4096];
|
||||
ByteBufferIOStream.this.m_buffer.add((byte[])object2);
|
||||
}
|
||||
if (n2 < 4096) {
|
||||
System.arraycopy(object, n3, object2, 0, n2);
|
||||
ByteBufferIOStream.this.m_writePosition = n2;
|
||||
n2 = 0;
|
||||
continue;
|
||||
}
|
||||
System.arraycopy(object, n3, object2, 0, 4096);
|
||||
n2 -= 4096;
|
||||
n3 += 4096;
|
||||
object2 = ByteBufferIOStream.this;
|
||||
++((ByteBufferIOStream)object2).m_availableSegment;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user