protected override void Dispose(bool disposing) { if (disposing && !_disposed) { if (_lzmaStream != null) { if (_mode == Mode.Compress) { Flush(); FinishWrite(); } else { _workBufPos = ReadDone; } XZInit.Lib.LzmaEnd(_lzmaStream); _lzmaStreamPin.Free(); _lzmaStream = null; } if (BaseStream != null) { if (!_leaveOpen) { BaseStream.Dispose(); } BaseStream = null; } _disposed = true; } }
/// <summary> /// Create multi-threaded compressing XZStream. Requires more memory than single-threaded mode. /// </summary> public unsafe XZStream(Stream baseStream, XZCompressOptions compOpts, XZThreadedCompressOptions threadOpts) { XZInit.Manager.EnsureLoaded(); BaseStream = baseStream ?? throw new ArgumentNullException(nameof(baseStream)); _mode = Mode.Compress; _disposed = false; // Check and set XZStreamOptions _leaveOpen = compOpts.LeaveOpen; _bufferSize = CheckBufferSize(compOpts.BufferSize); _workBuf = new byte[_bufferSize]; // Prepare LzmaStream and buffers _lzmaStream = new LzmaStream(); _lzmaStreamPin = GCHandle.Alloc(_lzmaStream, GCHandleType.Pinned); // Check LzmaMt instance LzmaMt mt = compOpts.ToLzmaMt(threadOpts); CheckPreset(mt.Preset); // Initialize the encoder LzmaRet ret = XZInit.Lib.LzmaStreamEncoderMt(_lzmaStream, mt); XZException.CheckReturnValue(ret); // Set possible max memory usage. MaxMemUsage = XZInit.Lib.LzmaStreamEncoderMtMemUsage(mt); }
/// <summary> /// Create single-threaded compressing XZStream. /// </summary> public unsafe XZStream(Stream baseStream, XZCompressOptions compOpts) { XZInit.Manager.EnsureLoaded(); BaseStream = baseStream ?? throw new ArgumentNullException(nameof(baseStream)); _mode = Mode.Compress; _disposed = false; // Check and set compress options _leaveOpen = compOpts.LeaveOpen; _bufferSize = CheckBufferSize(compOpts.BufferSize); _workBuf = new byte[_bufferSize]; // Prepare LzmaStream _lzmaStream = new LzmaStream(); _lzmaStreamPin = GCHandle.Alloc(_lzmaStream, GCHandleType.Pinned); // Check preset uint preset = compOpts.Preset; CheckPreset(preset); // Initialize the encoder LzmaRet ret = XZInit.Lib.LzmaEasyEncoder(_lzmaStream, preset, compOpts.Check); XZException.CheckReturnValue(ret); // Set possible max memory usage. MaxMemUsage = XZInit.Lib.LzmaEasyEncoderMemUsage(preset); }
/// <summary> /// Create decompressing XZStream /// </summary> public unsafe XZStream(Stream baseStream, XZDecompressOptions decompOpts) { XZInit.Manager.EnsureLoaded(); BaseStream = baseStream ?? throw new ArgumentNullException(nameof(baseStream)); _mode = Mode.Decompress; _disposed = false; // Check and set decompress options _leaveOpen = decompOpts.LeaveOpen; _bufferSize = CheckBufferSize(decompOpts.BufferSize); _workBuf = new byte[_bufferSize]; // Prepare LzmaStream and buffers _lzmaStream = new LzmaStream(); _lzmaStreamPin = GCHandle.Alloc(_lzmaStream, GCHandleType.Pinned); // Initialize the decoder LzmaRet ret = XZInit.Lib.LzmaStreamDecoder(_lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags); XZException.CheckReturnValue(ret); }