225 lines
4.4 KiB
C#
225 lines
4.4 KiB
C#
|
using System;
|
||
|
|
||
|
namespace ComponentAce.Compression.Libs.zlib
|
||
|
{
|
||
|
public sealed class ZStream
|
||
|
{
|
||
|
private const int MAX_WBITS = 15;
|
||
|
|
||
|
private static readonly int DEF_WBITS = 15;
|
||
|
|
||
|
private const int Z_NO_FLUSH = 0;
|
||
|
|
||
|
private const int Z_PARTIAL_FLUSH = 1;
|
||
|
|
||
|
private const int Z_SYNC_FLUSH = 2;
|
||
|
|
||
|
private const int Z_FULL_FLUSH = 3;
|
||
|
|
||
|
private const int Z_FINISH = 4;
|
||
|
|
||
|
private const int MAX_MEM_LEVEL = 9;
|
||
|
|
||
|
private const int Z_OK = 0;
|
||
|
|
||
|
private const int Z_STREAM_END = 1;
|
||
|
|
||
|
private const int Z_NEED_DICT = 2;
|
||
|
|
||
|
private const int Z_ERRNO = -1;
|
||
|
|
||
|
private const int Z_STREAM_ERROR = -2;
|
||
|
|
||
|
private const int Z_DATA_ERROR = -3;
|
||
|
|
||
|
private const int Z_MEM_ERROR = -4;
|
||
|
|
||
|
private const int Z_BUF_ERROR = -5;
|
||
|
|
||
|
private const int Z_VERSION_ERROR = -6;
|
||
|
|
||
|
public byte[] next_in;
|
||
|
|
||
|
public int next_in_index;
|
||
|
|
||
|
public int avail_in;
|
||
|
|
||
|
public long total_in;
|
||
|
|
||
|
public byte[] next_out;
|
||
|
|
||
|
public int next_out_index;
|
||
|
|
||
|
public int avail_out;
|
||
|
|
||
|
public long total_out;
|
||
|
|
||
|
public string msg;
|
||
|
|
||
|
internal Deflate dstate;
|
||
|
|
||
|
internal Inflate istate;
|
||
|
|
||
|
internal int data_type;
|
||
|
|
||
|
public long adler;
|
||
|
|
||
|
internal Adler32 _adler = new Adler32();
|
||
|
|
||
|
public int inflateInit()
|
||
|
{
|
||
|
return inflateInit(DEF_WBITS);
|
||
|
}
|
||
|
|
||
|
public int inflateInit(int w)
|
||
|
{
|
||
|
istate = new Inflate();
|
||
|
return istate.inflateInit(this, w);
|
||
|
}
|
||
|
|
||
|
public int inflate(int f)
|
||
|
{
|
||
|
if (istate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
return istate.inflate(this, f);
|
||
|
}
|
||
|
|
||
|
public int inflateEnd()
|
||
|
{
|
||
|
if (istate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
int result = istate.inflateEnd(this);
|
||
|
istate = null;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
public int inflateSync()
|
||
|
{
|
||
|
if (istate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
return istate.inflateSync(this);
|
||
|
}
|
||
|
|
||
|
public int inflateSetDictionary(byte[] dictionary, int dictLength)
|
||
|
{
|
||
|
if (istate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
return istate.inflateSetDictionary(this, dictionary, dictLength);
|
||
|
}
|
||
|
|
||
|
public int deflateInit(int level)
|
||
|
{
|
||
|
return deflateInit(level, 15);
|
||
|
}
|
||
|
|
||
|
public int deflateInit(int level, int bits)
|
||
|
{
|
||
|
dstate = new Deflate();
|
||
|
return dstate.deflateInit(this, level, bits);
|
||
|
}
|
||
|
|
||
|
public int deflate(int flush)
|
||
|
{
|
||
|
if (dstate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
return dstate.deflate(this, flush);
|
||
|
}
|
||
|
|
||
|
public int deflateEnd()
|
||
|
{
|
||
|
if (dstate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
int result = dstate.deflateEnd();
|
||
|
dstate = null;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
public int deflateParams(int level, int strategy)
|
||
|
{
|
||
|
if (dstate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
return dstate.deflateParams(this, level, strategy);
|
||
|
}
|
||
|
|
||
|
public int deflateSetDictionary(byte[] dictionary, int dictLength)
|
||
|
{
|
||
|
if (dstate == null)
|
||
|
{
|
||
|
return -2;
|
||
|
}
|
||
|
return dstate.deflateSetDictionary(this, dictionary, dictLength);
|
||
|
}
|
||
|
|
||
|
internal void flush_pending()
|
||
|
{
|
||
|
int pending = dstate.pending;
|
||
|
if (pending > avail_out)
|
||
|
{
|
||
|
pending = avail_out;
|
||
|
}
|
||
|
if (pending != 0)
|
||
|
{
|
||
|
if (dstate.pending_buf.Length > dstate.pending_out && next_out.Length > next_out_index && dstate.pending_buf.Length >= dstate.pending_out + pending)
|
||
|
{
|
||
|
_ = next_out.Length;
|
||
|
_ = next_out_index + pending;
|
||
|
}
|
||
|
Array.Copy(dstate.pending_buf, dstate.pending_out, next_out, next_out_index, pending);
|
||
|
next_out_index += pending;
|
||
|
dstate.pending_out += pending;
|
||
|
total_out += pending;
|
||
|
avail_out -= pending;
|
||
|
dstate.pending -= pending;
|
||
|
if (dstate.pending == 0)
|
||
|
{
|
||
|
dstate.pending_out = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal int read_buf(byte[] buf, int start, int size)
|
||
|
{
|
||
|
int num = avail_in;
|
||
|
if (num > size)
|
||
|
{
|
||
|
num = size;
|
||
|
}
|
||
|
if (num == 0)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
avail_in -= num;
|
||
|
if (dstate.noheader == 0)
|
||
|
{
|
||
|
adler = _adler.adler32(adler, next_in, next_in_index, num);
|
||
|
}
|
||
|
Array.Copy(next_in, next_in_index, buf, start, num);
|
||
|
next_in_index += num;
|
||
|
total_in += num;
|
||
|
return num;
|
||
|
}
|
||
|
|
||
|
public void free()
|
||
|
{
|
||
|
next_in = null;
|
||
|
next_out = null;
|
||
|
msg = null;
|
||
|
_adler = null;
|
||
|
}
|
||
|
}
|
||
|
}
|