/// <summary> /// Initializes a new instance of the <see cref="LzmaStream" /> class. /// </summary> /// <param name="stream">The stream.</param> /// <param name="compressionMode">The compression mode.</param> /// <param name="compressionParameters">The compression parameters.</param> /// <param name="ownsStream">if set to <c>true</c> [owns stream].</param> /// <param name="bufferSize">Size of the buffer.</param> /// <exception cref="ArgumentOutOfRangeException">compressionMode - null</exception> /// <exception cref="System.ArgumentOutOfRangeException">compressionMode - null</exception> private LzmaStream(Stream stream, CompressionMode compressionMode, LzmaCompressionParameters compressionParameters = null, bool ownsStream = true, int bufferSize = 1 << 20) { _innerStream = stream; _ownsStream = ownsStream; _pipeStream = new PipeStream(bufferSize); switch (compressionMode) { case CompressionMode.Compress: CanWrite = true; _coderThread = StartThread(() => CreateEncoder(_innerStream, compressionParameters).Code(_pipeStream, _innerStream, -1, -1, null), "LZMA compress"); break; case CompressionMode.Decompress: CanRead = true; _coderThread = StartThread(() => { var decoder = CreateDecoder(_innerStream, out var length); var inputLength = _innerStream.CanSeek ? _innerStream.Length : -1; decoder.Code(_innerStream, _pipeStream, inputLength, length, null); _pipeStream.Dispose(); }, "LZMA decompress"); break; default: throw new ArgumentOutOfRangeException(nameof(compressionMode), compressionMode, null); } }
private static ICoder CreateEncoder(Stream innerStream, LzmaCompressionParameters compressionParameters) { var encoder = new Encoder(); compressionParameters.SetEncoderProperties(encoder); encoder.WriteCoderProperties(innerStream); innerStream.WriteLong(-1); return(encoder); }
public LzmaStream(Stream stream, LzmaCompressionParameters compressionParameters, bool ownsStream = true, int bufferSize = 1 << 20) : this(stream, CompressionMode.Compress, compressionParameters, ownsStream, bufferSize) { }