Пример #1
0
        public override void Write(System.Byte[] buffer, int offset, int count)
        {
            // workitem 7159
            // calculate the CRC on the unccompressed data  (before writing)
            if (crc != null)
            {
                crc.SlurpBlock(buffer, offset, count);
            }

            if (_streamMode == StreamMode.Undefined)
            {
                _streamMode = StreamMode.Writer;
            }
            else if (_streamMode != StreamMode.Writer)
            {
                throw new ZlibException("Cannot Write after Reading.");
            }

            if (count == 0)
            {
                return;
            }

            // first reference of z property will initialize the private var _z
            z.InputBuffer       = buffer;
            _z.NextIn           = offset;
            _z.AvailableBytesIn = count;
            bool done = false;

            do
            {
                _z.OutputBuffer      = workingBuffer;
                _z.NextOut           = 0;
                _z.AvailableBytesOut = _workingBuffer.Length;
                int rc = (_wantCompress)
                    ? _z.Deflate(_flushMode)
                    : _z.Inflate(_flushMode);
                if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END)
                {
                    throw new ZlibException((_wantCompress ? "de" : "in") + "flating: " + _z.Message);
                }

                //if (_workingBuffer.Length - _z.AvailableBytesOut > 0)
                _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut);

                done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0;

                // If GZIP and de-compress, we're done when 8 bytes remain.
                if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress)
                {
                    done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0);
                }
            }while (!done);
        }
Пример #2
0
        public override void Write(byte[] buffer, int offset, int count)
        {
            if (crc != null)
            {
                crc.SlurpBlock(buffer, offset, count);
            }
            if (_streamMode == StreamMode.Undefined)
            {
                _streamMode = StreamMode.Writer;
            }
            else if (_streamMode != 0)
            {
                throw new ZlibException("Cannot Write after Reading.");
            }
            if (count == 0)
            {
                return;
            }
            z.InputBuffer       = buffer;
            _z.NextIn           = offset;
            _z.AvailableBytesIn = count;
            bool flag = false;

            while (true)
            {
                _z.OutputBuffer      = workingBuffer;
                _z.NextOut           = 0;
                _z.AvailableBytesOut = _workingBuffer.Length;
                int num = (!_wantCompress) ? _z.Inflate(_flushMode) : _z.Deflate(_flushMode);
                if (num != 0 && num != 1)
                {
                    break;
                }
                _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut);
                flag = (_z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0);
                if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress)
                {
                    flag = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0);
                }
                if (flag)
                {
                    return;
                }
            }
            throw new ZlibException(((!_wantCompress) ? "in" : "de") + "flating: " + _z.Message);
        }
        internal int SetParams(CompressionLevel level, CompressionStrategy strategy)
        {
            int result = 0;

            if (compressionLevel != level)
            {
                Config config = Config.Lookup(level);
                if (config.Flavor != this.config.Flavor && _codec.TotalBytesIn != 0L)
                {
                    result = _codec.Deflate(FlushType.Partial);
                }
                compressionLevel = level;
                this.config      = config;
                SetDeflater();
            }
            compressionStrategy = strategy;
            return(result);
        }