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)); } }
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); } }
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; } }
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); }
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; } } }