You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

207 lines
7.8 KiB

using com.hitrust.util.Zip.Compression;
namespace com.hitrust.util.GZip
{
using com.hitrust.util.Checksums;
using com.hitrust.util.Zip.Compression.Streams;
using System;
using System.IO;
public class GZipInputStream : InflaterInputStream
{
protected Crc32 crc;
protected bool eos;
private bool readGZIPHeader;
public GZipInputStream(Stream baseInputStream) : this(baseInputStream, 0x1000)
{
}
public GZipInputStream(Stream baseInputStream, int size) : base(baseInputStream, new Inflater(true), size)
{
this.crc = new Crc32();
}
public override int Read(byte[] buf, int offset, int len)
{
if (!this.readGZIPHeader)
{
this.ReadHeader();
}
if (this.eos)
{
return 0;
}
int num = base.Read(buf, offset, len);
if (num > 0)
{
this.crc.Update(buf, offset, num);
}
if (base.inf.IsFinished)
{
this.ReadFooter();
}
return num;
}
private void ReadFooter()
{
int num3;
byte[] destinationArray = new byte[8];
int remainingInput = base.inf.RemainingInput;
if (remainingInput > 8)
{
remainingInput = 8;
}
Array.Copy(base.buf, base.len - base.inf.RemainingInput, destinationArray, 0, remainingInput);
for (int i = 8 - remainingInput; i > 0; i -= num3)
{
num3 = base.baseInputStream.Read(destinationArray, 8 - i, i);
if (num3 <= 0)
{
throw new GZipException("Early EOF baseInputStream GZIP footer");
}
}
int num4 = (((destinationArray[0] & 0xff) | ((destinationArray[1] & 0xff) << 8)) | ((destinationArray[2] & 0xff) << 0x10)) | (destinationArray[3] << 0x18);
if (num4 != ((int) this.crc.Value))
{
throw new GZipException(string.Concat(new object[] { "GZIP crc sum mismatch, theirs \"", num4, "\" and ours \"", (int) this.crc.Value }));
}
int num5 = (((destinationArray[4] & 0xff) | ((destinationArray[5] & 0xff) << 8)) | ((destinationArray[6] & 0xff) << 0x10)) | (destinationArray[7] << 0x18);
if (num5 != base.inf.TotalOut)
{
throw new GZipException("Number of bytes mismatch");
}
this.eos = true;
}
private void ReadHeader()
{
Crc32 crc = new Crc32();
int bval = base.baseInputStream.ReadByte();
if (bval < 0)
{
this.eos = true;
}
else
{
crc.Update(bval);
if (bval != (GZipConstants.GZIP_MAGIC >> 8))
{
throw new GZipException("Error baseInputStream GZIP header, first byte doesn't match");
}
bval = base.baseInputStream.ReadByte();
if (bval != (GZipConstants.GZIP_MAGIC & 0xff))
{
throw new GZipException("Error baseInputStream GZIP header, second byte doesn't match");
}
crc.Update(bval);
int num2 = base.baseInputStream.ReadByte();
if (num2 != 8)
{
throw new GZipException("Error baseInputStream GZIP header, data not baseInputStream deflate format");
}
crc.Update(num2);
int num3 = base.baseInputStream.ReadByte();
if (num3 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
crc.Update(num3);
if ((num3 & 0xd0) != 0)
{
throw new GZipException("Reserved flag bits baseInputStream GZIP header != 0");
}
for (int i = 0; i < 6; i++)
{
int num5 = base.baseInputStream.ReadByte();
if (num5 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
crc.Update(num5);
}
if ((num3 & 4) != 0)
{
for (int j = 0; j < 2; j++)
{
int num7 = base.baseInputStream.ReadByte();
if (num7 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
crc.Update(num7);
}
if ((base.baseInputStream.ReadByte() < 0) || (base.baseInputStream.ReadByte() < 0))
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
int num8 = base.baseInputStream.ReadByte();
int num9 = base.baseInputStream.ReadByte();
if ((num8 < 0) || (num9 < 0))
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
crc.Update(num8);
crc.Update(num9);
int num10 = (num8 << 8) | num9;
for (int k = 0; k < num10; k++)
{
int num12 = base.baseInputStream.ReadByte();
if (num12 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
crc.Update(num12);
}
}
if ((num3 & 8) != 0)
{
int num13;
while ((num13 = base.baseInputStream.ReadByte()) > 0)
{
crc.Update(num13);
}
if (num13 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP file name");
}
crc.Update(num13);
}
if ((num3 & 0x10) != 0)
{
int num14;
while ((num14 = base.baseInputStream.ReadByte()) > 0)
{
crc.Update(num14);
}
if (num14 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP comment");
}
crc.Update(num14);
}
if ((num3 & 2) != 0)
{
int num16 = base.baseInputStream.ReadByte();
if (num16 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
int num15 = base.baseInputStream.ReadByte();
if (num15 < 0)
{
throw new GZipException("Early EOF baseInputStream GZIP header");
}
num16 = (num16 << 8) | num15;
if (num16 != (((int) crc.Value) & 0xffff))
{
throw new GZipException("Header CRC value mismatch");
}
}
this.readGZIPHeader = true;
}
}
}
}