135 lines
2.6 KiB
C#
135 lines
2.6 KiB
C#
using System.IO;
|
|
|
|
namespace ComponentAce.Compression.Libs.zlib
|
|
{
|
|
public class ZInputStream : BinaryReader
|
|
{
|
|
protected ZStream z = new ZStream();
|
|
|
|
protected int bufsize = 512;
|
|
|
|
protected int flush;
|
|
|
|
protected byte[] buf;
|
|
|
|
protected byte[] buf1 = new byte[1];
|
|
|
|
protected bool compress;
|
|
|
|
internal Stream in_Renamed;
|
|
|
|
internal bool nomoreinput;
|
|
|
|
public virtual int FlushMode
|
|
{
|
|
get
|
|
{
|
|
return flush;
|
|
}
|
|
set
|
|
{
|
|
flush = value;
|
|
}
|
|
}
|
|
|
|
public virtual long TotalIn => z.total_in;
|
|
|
|
public virtual long TotalOut => z.total_out;
|
|
|
|
internal void InitBlock()
|
|
{
|
|
flush = 0;
|
|
buf = new byte[bufsize];
|
|
}
|
|
|
|
public ZInputStream(Stream in_Renamed)
|
|
: base(in_Renamed)
|
|
{
|
|
InitBlock();
|
|
this.in_Renamed = in_Renamed;
|
|
z.inflateInit();
|
|
compress = false;
|
|
z.next_in = buf;
|
|
z.next_in_index = 0;
|
|
z.avail_in = 0;
|
|
}
|
|
|
|
public ZInputStream(Stream in_Renamed, int level)
|
|
: base(in_Renamed)
|
|
{
|
|
InitBlock();
|
|
this.in_Renamed = in_Renamed;
|
|
z.deflateInit(level);
|
|
compress = true;
|
|
z.next_in = buf;
|
|
z.next_in_index = 0;
|
|
z.avail_in = 0;
|
|
}
|
|
|
|
public override int Read()
|
|
{
|
|
if (read(buf1, 0, 1) == -1)
|
|
{
|
|
return -1;
|
|
}
|
|
return buf1[0] & 0xFF;
|
|
}
|
|
|
|
public int read(byte[] b, int off, int len)
|
|
{
|
|
if (len == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
z.next_out = b;
|
|
z.next_out_index = off;
|
|
z.avail_out = len;
|
|
int num;
|
|
do
|
|
{
|
|
if (z.avail_in == 0 && !nomoreinput)
|
|
{
|
|
z.next_in_index = 0;
|
|
z.avail_in = SupportClass.ReadInput(in_Renamed, buf, 0, bufsize);
|
|
if (z.avail_in == -1)
|
|
{
|
|
z.avail_in = 0;
|
|
nomoreinput = true;
|
|
}
|
|
}
|
|
num = ((!compress) ? z.inflate(flush) : z.deflate(flush));
|
|
if (nomoreinput && num == -5)
|
|
{
|
|
return -1;
|
|
}
|
|
if (num != 0 && num != 1)
|
|
{
|
|
throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg);
|
|
}
|
|
if (nomoreinput && z.avail_out == len)
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
while (z.avail_out == len && num == 0);
|
|
return len - z.avail_out;
|
|
}
|
|
|
|
public long skip(long n)
|
|
{
|
|
int num = 512;
|
|
if (n < num)
|
|
{
|
|
num = (int)n;
|
|
}
|
|
byte[] array = new byte[num];
|
|
return SupportClass.ReadInput(BaseStream, array, 0, array.Length);
|
|
}
|
|
|
|
public override void Close()
|
|
{
|
|
in_Renamed.Close();
|
|
}
|
|
}
|
|
}
|