Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions src/SharpCompress/Compressors/BZip2/BZip2Stream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,38 @@ void IStreamStack.SetPosition(long position) { }

private readonly Stream stream;
private bool isDisposed;
private readonly bool leaveOpen;

/// <summary>
/// Create a BZip2Stream
/// </summary>
/// <param name="stream">The stream to read from</param>
/// <param name="compressionMode">Compression Mode</param>
/// <param name="decompressConcatenated">Decompress Concatenated</param>
public BZip2Stream(Stream stream, CompressionMode compressionMode, bool decompressConcatenated)
/// <param name="leaveOpen">Leave the stream open after disposing</param>
public BZip2Stream(
Stream stream,
CompressionMode compressionMode,
bool decompressConcatenated,
bool leaveOpen = false
)
{
#if DEBUG_STREAMS
this.DebugConstruct(typeof(BZip2Stream));
#endif
this.leaveOpen = leaveOpen;
Mode = compressionMode;
if (Mode == CompressionMode.Compress)
{
this.stream = new CBZip2OutputStream(stream);
this.stream = new CBZip2OutputStream(stream, 9, leaveOpen);
}
else
{
this.stream = new CBZip2InputStream(stream, decompressConcatenated);
this.stream = new CBZip2InputStream(
stream,
decompressConcatenated,
leaveOpen: leaveOpen
);
}
}

Expand Down
14 changes: 11 additions & 3 deletions src/SharpCompress/Compressors/BZip2/CBZip2InputStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ during decompression.
private int computedBlockCRC,
computedCombinedCRC;
private readonly bool decompressConcatenated;
private readonly bool leaveOpen;

private int i2,
count,
Expand All @@ -181,9 +182,10 @@ during decompression.
private char z;
private bool isDisposed;

public CBZip2InputStream(Stream zStream, bool decompressConcatenated)
public CBZip2InputStream(Stream zStream, bool decompressConcatenated, bool leaveOpen = false)
{
this.decompressConcatenated = decompressConcatenated;
this.leaveOpen = leaveOpen;
ll8 = null;
tt = null;
BsSetStream(zStream);
Expand All @@ -207,7 +209,10 @@ protected override void Dispose(bool disposing)
this.DebugDispose(typeof(CBZip2InputStream));
#endif
base.Dispose(disposing);
bsStream?.Dispose();
if (!leaveOpen)
{
bsStream?.Dispose();
}
}

internal static int[][] InitIntArray(int n1, int n2)
Expand Down Expand Up @@ -398,7 +403,10 @@ private bool Complete()

private void BsFinishedWithStream()
{
bsStream?.Dispose();
if (!leaveOpen)
{
bsStream?.Dispose();
}
bsStream = null;
}

Expand Down
13 changes: 9 additions & 4 deletions src/SharpCompress/Compressors/BZip2/CBZip2OutputStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -341,12 +341,14 @@ The current block size is 100000 * this number.

private int currentChar = -1;
private int runLength;
private readonly bool leaveOpen;

public CBZip2OutputStream(Stream inStream)
: this(inStream, 9) { }
public CBZip2OutputStream(Stream inStream, bool leaveOpen = false)
: this(inStream, 9, leaveOpen) { }

public CBZip2OutputStream(Stream inStream, int inBlockSize)
public CBZip2OutputStream(Stream inStream, int inBlockSize, bool leaveOpen = false)
{
this.leaveOpen = leaveOpen;
block = null;
quadrant = null;
zptr = null;
Expand Down Expand Up @@ -481,7 +483,10 @@ protected override void Dispose(bool disposing)
this.DebugDispose(typeof(CBZip2OutputStream));
#endif
Dispose();
bsStream?.Dispose();
if (!leaveOpen)
{
bsStream?.Dispose();
}
bsStream = null;
}
}
Expand Down
8 changes: 5 additions & 3 deletions src/SharpCompress/Compressors/LZMA/LZipStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ void IStreamStack.SetPosition(long position) { }

private long _writeCount;
private readonly Stream? _originalStream;
private readonly bool _leaveOpen;

public LZipStream(Stream stream, CompressionMode mode)
public LZipStream(Stream stream, CompressionMode mode, bool leaveOpen = false)
{
Mode = mode;
_originalStream = stream;
_leaveOpen = leaveOpen;

if (mode == CompressionMode.Decompress)
{
Expand All @@ -60,7 +62,7 @@ public LZipStream(Stream stream, CompressionMode mode)
throw new InvalidFormatException("Not an LZip stream");
}
var properties = GetProperties(dSize);
_stream = new LzmaStream(properties, stream);
_stream = new LzmaStream(properties, stream, leaveOpen: leaveOpen);
}
else
{
Expand Down Expand Up @@ -127,7 +129,7 @@ protected override void Dispose(bool disposing)
{
Finish();
_stream.Dispose();
if (Mode == CompressionMode.Compress)
if (Mode == CompressionMode.Compress && !_leaveOpen)
{
_originalStream?.Dispose();
}
Expand Down
36 changes: 28 additions & 8 deletions src/SharpCompress/Compressors/LZMA/LzmaStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ void IStreamStack.SetPosition(long position) { }
private readonly Stream _inputStream;
private readonly long _inputSize;
private readonly long _outputSize;
private readonly bool _leaveOpen;

private readonly int _dictionarySize;
private readonly OutWindow _outWindow = new();
Expand All @@ -56,28 +57,44 @@ void IStreamStack.SetPosition(long position) { }
private readonly Encoder _encoder;
private bool _isDisposed;

public LzmaStream(byte[] properties, Stream inputStream)
: this(properties, inputStream, -1, -1, null, properties.Length < 5) { }
public LzmaStream(byte[] properties, Stream inputStream, bool leaveOpen = false)
: this(properties, inputStream, -1, -1, null, properties.Length < 5, leaveOpen) { }

public LzmaStream(byte[] properties, Stream inputStream, long inputSize)
: this(properties, inputStream, inputSize, -1, null, properties.Length < 5) { }
public LzmaStream(byte[] properties, Stream inputStream, long inputSize, bool leaveOpen = false)
: this(properties, inputStream, inputSize, -1, null, properties.Length < 5, leaveOpen) { }

public LzmaStream(byte[] properties, Stream inputStream, long inputSize, long outputSize)
: this(properties, inputStream, inputSize, outputSize, null, properties.Length < 5) { }
public LzmaStream(
byte[] properties,
Stream inputStream,
long inputSize,
long outputSize,
bool leaveOpen = false
)
: this(
properties,
inputStream,
inputSize,
outputSize,
null,
properties.Length < 5,
leaveOpen
) { }

public LzmaStream(
byte[] properties,
Stream inputStream,
long inputSize,
long outputSize,
Stream presetDictionary,
bool isLzma2
bool isLzma2,
bool leaveOpen = false
)
{
_inputStream = inputStream;
_inputSize = inputSize;
_outputSize = outputSize;
_isLzma2 = isLzma2;
_leaveOpen = leaveOpen;

#if DEBUG_STREAMS
this.DebugConstruct(typeof(LzmaStream));
Expand Down Expand Up @@ -179,7 +196,10 @@ protected override void Dispose(bool disposing)
{
_position = _encoder.Code(null, true);
}
_inputStream?.Dispose();
if (!_leaveOpen)
{
_inputStream?.Dispose();
}
_outWindow.Dispose();
}
base.Dispose(disposing);
Expand Down
17 changes: 15 additions & 2 deletions tests/SharpCompress.Test/Streams/DisposalTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.IO;
using SharpCompress.Common;
using SharpCompress.Compressors;
using SharpCompress.Compressors.BZip2;
using SharpCompress.Compressors.Deflate;
using SharpCompress.Compressors.LZMA;
using SharpCompress.Compressors.Lzw;
Expand Down Expand Up @@ -152,9 +153,21 @@ public void LzmaStream_Disposal()
[Fact]
public void LZipStream_Disposal()
{
// LZipStream always disposes inner stream
// LZipStream now supports leaveOpen parameter
// Use Compress mode to avoid need for valid input header
VerifyAlwaysDispose(stream => new LZipStream(stream, CompressionMode.Compress));
VerifyStreamDisposal(
(stream, leaveOpen) => new LZipStream(stream, CompressionMode.Compress, leaveOpen)
);
}

[Fact]
public void BZip2Stream_Disposal()
{
// BZip2Stream now supports leaveOpen parameter
VerifyStreamDisposal(
(stream, leaveOpen) =>
new BZip2Stream(stream, CompressionMode.Compress, false, leaveOpen)
);
}

[Fact]
Expand Down
Loading