mirror of
https://github.com/corda/corda.git
synced 2025-01-08 14:03:06 +00:00
111 lines
2.2 KiB
Java
111 lines
2.2 KiB
Java
package java.util.zip;
|
|
|
|
public class Inflater {
|
|
private static final int Z_OK = 0;
|
|
private static final int Z_STREAM_END = 1;
|
|
private static final int Z_NEED_DICT = 2;
|
|
|
|
static {
|
|
System.loadLibrary("natives");
|
|
}
|
|
|
|
private long peer;
|
|
private byte[] input;
|
|
private int offset;
|
|
private int length;
|
|
private boolean needDictionary;
|
|
private boolean finished;
|
|
|
|
public Inflater(boolean nowrap) {
|
|
peer = make(nowrap);
|
|
}
|
|
|
|
public Inflater() {
|
|
this(false);
|
|
}
|
|
|
|
private void check() {
|
|
if (peer == 0) {
|
|
throw new IllegalStateException();
|
|
}
|
|
}
|
|
|
|
private static native long make(boolean nowrap);
|
|
|
|
public boolean finished() {
|
|
return finished;
|
|
}
|
|
|
|
public boolean needsDictionary() {
|
|
return needDictionary;
|
|
}
|
|
|
|
public boolean needsInput() {
|
|
return getRemaining() == 0;
|
|
}
|
|
|
|
public int getRemaining() {
|
|
return length;
|
|
}
|
|
|
|
public void setInput(byte[] input, int offset, int length) {
|
|
this.input = input;
|
|
this.offset = offset;
|
|
this.length = length;
|
|
}
|
|
|
|
public int inflate(byte[] output, int offset, int length)
|
|
throws DataFormatException
|
|
{
|
|
final int zlibResult = 0;
|
|
final int inputCount = 1;
|
|
final int outputCount = 2;
|
|
|
|
if (peer == 0) {
|
|
throw new IllegalStateException();
|
|
}
|
|
|
|
if (input == null || output == null) {
|
|
throw new NullPointerException();
|
|
}
|
|
|
|
int[] results = new int[3];
|
|
inflate(peer, input, this.offset, this.length,
|
|
output, offset, length, results);
|
|
|
|
if (results[zlibResult] < 0) {
|
|
throw new DataFormatException();
|
|
}
|
|
|
|
switch (results[zlibResult]) {
|
|
case Z_NEED_DICT:
|
|
needDictionary = true;
|
|
break;
|
|
|
|
case Z_STREAM_END:
|
|
finished = true;
|
|
break;
|
|
}
|
|
|
|
this.offset += results[inputCount];
|
|
this.length -= results[inputCount];
|
|
|
|
return results[outputCount];
|
|
}
|
|
|
|
private static native void inflate
|
|
(long peer,
|
|
byte[] input, int inputOffset, int inputLength,
|
|
byte[] output, int outputOffset, int outputLength,
|
|
int[] results);
|
|
|
|
public void dispose() {
|
|
if (peer != 0) {
|
|
dispose(peer);
|
|
peer = 0;
|
|
}
|
|
}
|
|
|
|
private static native void dispose(long peer);
|
|
}
|