int BodyRead(byte[] buffer, int offset, int count)
{
if (crc == null) {
throw new InvalidOperationException("Closed");
}
if ((entry == null) || (count <= 0)) {
return 0;
}
if (offset + count > buffer.Length) {
throw new ArgumentException("Offset + count exceeds buffer size");
}
bool finished = false;
switch (method) {
case (int)CompressionMethod.Deflated:
count = base.Read(buffer, offset, count);
if (count <= 0) {
if (!inf.IsFinished) {
throw new ZipException("Inflater not finished!");
}
inputBuffer.Available = inf.RemainingInput;
// A csize of -1 is from an unpatched local header
if ((flags & 8) == 0 &&
(inf.TotalIn != csize && csize != 0xFFFFFFFF && csize != -1 || inf.TotalOut != size)) {
throw new ZipException("Size mismatch: " + csize + ";" + size + " <-> " + inf.TotalIn + ";" + inf.TotalOut);
}
inf.Reset();
finished = true;
}
break;
case (int)CompressionMethod.Stored:
if ((count > csize) && (csize >= 0)) {
count = (int)csize;
}
if (count > 0) {
count = inputBuffer.ReadClearTextBuffer(buffer, offset, count);
if (count > 0) {
csize -= count;
size -= count;
}
}
if (csize == 0) {
finished = true;
} else {
if (count < 0) {
throw new ZipException("EOF in stored block");
}
}
break;
}
if (count > 0) {
crc.Update(buffer, offset, count);
}
if (finished) {
CompleteCloseEntry(true);
}
return count;
}