Exemplo n.º 1
0
 public BrotliStream(Stream baseStream, CompressionMode mode, bool leaveOpen, int bufferSize, CompressionLevel quality) : this(baseStream, mode, leaveOpen, bufferSize)
 {
     if (_mode == CompressionMode.Compress)
     {
         _state.SetQuality((uint)Brotli.GetQualityFromCompressionLevel(quality));
     }
 }
Exemplo n.º 2
0
 public BrotliStream(Stream baseStream, CompressionMode mode, bool leaveOpen, int bufferSize, uint windowSize, CompressionLevel quality) : this(baseStream, mode, leaveOpen, bufferSize)
 {
     if (_mode == CompressionMode.Decompress)
     {
         throw new System.IO.IOException(BrotliEx.QualityAndWinSize);
     }
     else
     {
         _encoder.SetQuality((uint)Brotli.GetQualityFromCompressionLevel(quality));
         _encoder.SetWindow(windowSize);
     }
 }
Exemplo n.º 3
0
        public override void Write(byte[] buffer, int offset, int count)
        {
            EnsureCompressionMode();
            ValidateParameters(buffer, offset, count);
            EnsureNotDisposed();
            if (_mode != CompressionMode.Compress)
            {
                totalWrote += count;
            }
            DateTime begin         = DateTime.Now;
            int      bytesRemain   = count;
            int      currentOffset = offset;
            int      copyLen;

            while (bytesRemain > 0)
            {
                TimeSpan ExecutionTime = DateTime.Now - begin;
                if (WriteTimeout > 0 && ExecutionTime.TotalMilliseconds >= WriteTimeout)
                {
                    throw new TimeoutException(BrotliEx.TimeoutWrite);
                }
                copyLen = bytesRemain > _bufferSize ? _bufferSize : bytesRemain;
                Span <byte> bufferInput = new Span <byte>(buffer, currentOffset, copyLen);
                _transformationResult = TransformationStatus.DestinationTooSmall;
                _transformationResult = Brotli.Compress(bufferInput, _buffer, out _availableInput, out _availableOutput, ref _state);
                if (_transformationResult == TransformationStatus.InvalidData)
                {
                    throw new System.Exception(BrotliEx.unableEncode);
                }
                if (_transformationResult == TransformationStatus.DestinationTooSmall)
                {
                    _stream.Write(_buffer, 0, _availableOutput);
                }
                bytesRemain   -= copyLen;
                currentOffset += copyLen;
            }
        }
Exemplo n.º 4
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            EnsureDecompressionMode();
            ValidateParameters(buffer, offset, count);
            EnsureNotDisposed();
            DateTime begin = DateTime.Now;

            _availableOutput = 0;
            TimeSpan ExecutionTime = DateTime.Now - begin;

            if (ReadTimeout > 0 && ExecutionTime.TotalMilliseconds >= ReadTimeout)
            {
                throw new TimeoutException(BrotliEx.TimeoutRead);
            }
            while (true)
            {
                if (_transformationResult == TransformationStatus.NeedMoreSourceData)
                {
                    _availableInput = _stream.Read(_buffer, 0, _bufferSize);
                    if ((int)_availableInput <= 0)
                    {
                        break;
                    }
                }
                else if (_transformationResult != TransformationStatus.DestinationTooSmall)
                {
                    break;
                }
                _transformationResult = Brotli.Decompress(_buffer, buffer, out _availableInput, out _availableOutput, ref _state);
                if (_availableOutput != 0)
                {
                    return(_availableOutput);
                }
            }
            return(0);
        }
Exemplo n.º 5
0
        protected virtual void FlushEncoder(bool finished)
        {
            if (_state.BrotliNativeState == IntPtr.Zero)
            {
                return;
            }
            if (BrotliNative.BrotliEncoderIsFinished(_state.BrotliNativeState))
            {
                return;
            }
            TransformationStatus flushStatus = TransformationStatus.DestinationTooSmall;

            while (flushStatus == TransformationStatus.DestinationTooSmall)
            {
                flushStatus = Brotli.FlushEncoder(Array.Empty <byte>(), _buffer, out _availableInput, out _availableOutput, ref _state, finished);
                _stream.Write(_buffer, 0, _availableOutput);
                _availableOutput = _bufferSize;

                if (BrotliNative.BrotliEncoderIsFinished(_state.BrotliNativeState))
                {
                    break;
                }
            }
        }