ICSharpCode.SharpZipLib.Zip.ZipInputStream.BodyRead C# (CSharp) Method

BodyRead() private method

Reads a block of bytes from the current zip entry.
/// An i/o error occured. /// /// The deflated stream is corrupted. /// /// The stream is not open. ///
private BodyRead ( byte buffer, int offset, int count ) : int
buffer byte
offset int
count int
return int
        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;
        }