2022-06-19 22:05:52 +02:00
|
|
|
using System.IO;
|
2015-12-30 11:19:42 +00:00
|
|
|
using SharpCompress.Common.Zip.Headers;
|
2016-09-26 11:49:49 +01:00
|
|
|
using SharpCompress.Compressors.Deflate;
|
2015-12-30 11:19:42 +00:00
|
|
|
using SharpCompress.IO;
|
|
|
|
|
|
2022-12-20 15:06:44 +00:00
|
|
|
namespace SharpCompress.Common.Zip;
|
|
|
|
|
|
|
|
|
|
internal sealed class StreamingZipFilePart : ZipFilePart
|
2015-12-30 11:19:42 +00:00
|
|
|
{
|
2022-12-20 15:06:44 +00:00
|
|
|
private Stream? _decompressionStream;
|
2015-12-30 11:19:42 +00:00
|
|
|
|
2023-03-21 13:14:08 +00:00
|
|
|
internal StreamingZipFilePart(ZipFileEntry header, Stream stream)
|
|
|
|
|
: base(header, stream) { }
|
2022-12-20 15:06:44 +00:00
|
|
|
|
2024-04-18 14:25:10 +01:00
|
|
|
protected override Stream CreateBaseStream() => Header.PackedStream.NotNull();
|
2015-12-30 11:19:42 +00:00
|
|
|
|
2022-12-20 15:06:44 +00:00
|
|
|
internal override Stream GetCompressedStream()
|
|
|
|
|
{
|
|
|
|
|
if (!Header.HasData)
|
2015-12-30 11:19:42 +00:00
|
|
|
{
|
2022-12-20 15:06:44 +00:00
|
|
|
return Stream.Null;
|
2015-12-30 11:19:42 +00:00
|
|
|
}
|
2022-12-20 15:06:44 +00:00
|
|
|
_decompressionStream = CreateDecompressionStream(
|
|
|
|
|
GetCryptoStream(CreateBaseStream()),
|
|
|
|
|
Header.CompressionMethod
|
|
|
|
|
);
|
|
|
|
|
if (LeaveStreamOpen)
|
2015-12-30 11:19:42 +00:00
|
|
|
{
|
2025-07-20 17:35:22 +01:00
|
|
|
return SharpCompressStream.Create(_decompressionStream, leaveOpen: true);
|
2015-12-30 11:19:42 +00:00
|
|
|
}
|
2022-12-20 15:06:44 +00:00
|
|
|
return _decompressionStream;
|
|
|
|
|
}
|
2015-12-30 11:19:42 +00:00
|
|
|
|
2025-07-20 17:35:22 +01:00
|
|
|
internal BinaryReader FixStreamedFileLocation(ref SharpCompressStream rewindableStream)
|
2022-12-20 15:06:44 +00:00
|
|
|
{
|
|
|
|
|
if (Header.IsDirectory)
|
|
|
|
|
{
|
|
|
|
|
return new BinaryReader(rewindableStream);
|
|
|
|
|
}
|
2023-02-19 01:33:22 +01:00
|
|
|
|
2022-12-20 15:06:44 +00:00
|
|
|
if (Header.HasData && !Skipped)
|
2015-12-30 11:19:42 +00:00
|
|
|
{
|
2022-12-20 15:06:44 +00:00
|
|
|
_decompressionStream ??= GetCompressedStream();
|
|
|
|
|
|
2023-02-19 01:33:22 +01:00
|
|
|
_decompressionStream.Skip();
|
2022-12-20 15:06:44 +00:00
|
|
|
|
2023-02-19 01:33:22 +01:00
|
|
|
// If we had TotalIn / TotalOut we could have used them
|
|
|
|
|
Header.CompressedSize = _decompressionStream.Position;
|
2022-12-20 15:06:44 +00:00
|
|
|
|
2023-02-19 01:33:22 +01:00
|
|
|
if (_decompressionStream is DeflateStream deflateStream)
|
2015-12-30 11:19:42 +00:00
|
|
|
{
|
2025-07-20 17:35:22 +01:00
|
|
|
((IStreamStack)rewindableStream).StackSeek(0);
|
2015-12-30 11:19:42 +00:00
|
|
|
}
|
2022-12-20 15:06:44 +00:00
|
|
|
|
|
|
|
|
Skipped = true;
|
2015-12-30 11:19:42 +00:00
|
|
|
}
|
2022-12-20 15:06:44 +00:00
|
|
|
var reader = new BinaryReader(rewindableStream);
|
|
|
|
|
_decompressionStream = null;
|
|
|
|
|
return reader;
|
2015-12-30 11:19:42 +00:00
|
|
|
}
|
2022-06-19 22:05:52 +02:00
|
|
|
}
|