From b9e89ca64b109c6f358bd8aa2eec1cd9a8701182 Mon Sep 17 00:00:00 2001 From: coderb Date: Sun, 17 Dec 2017 10:40:41 -0500 Subject: [PATCH] rar5: wip --- .../Archives/Rar/FileInfoRarArchiveVolume.cs | 2 +- src/SharpCompress/Archives/Rar/RarArchive.cs | 1 - .../Archives/Rar/StreamRarArchiveVolume.cs | 2 +- src/SharpCompress/Common/Rar/Headers/Flags.cs | 2 +- .../Common/Rar/Headers/RarHeader.cs | 6 ++++ .../Common/Rar/Headers/RarHeaderFactory.cs | 4 +-- src/SharpCompress/Common/Rar/RarVolume.cs | 29 +++++++++---------- .../Readers/Rar/RarReaderVolume.cs | 2 +- .../SharpCompress.Test/Rar/RarArchiveTests.cs | 5 ---- 9 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/SharpCompress/Archives/Rar/FileInfoRarArchiveVolume.cs b/src/SharpCompress/Archives/Rar/FileInfoRarArchiveVolume.cs index 9555735f..7932caad 100644 --- a/src/SharpCompress/Archives/Rar/FileInfoRarArchiveVolume.cs +++ b/src/SharpCompress/Archives/Rar/FileInfoRarArchiveVolume.cs @@ -32,7 +32,7 @@ namespace SharpCompress.Archives.Rar internal FileInfo FileInfo { get; } - internal override RarFilePart CreateFilePart(FileHeader fileHeader, MarkHeader markHeader) + internal override RarFilePart CreateFilePart(MarkHeader markHeader, FileHeader fileHeader) { return new FileInfoRarFilePart(this, ReaderOptions.Password, markHeader, fileHeader, FileInfo); } diff --git a/src/SharpCompress/Archives/Rar/RarArchive.cs b/src/SharpCompress/Archives/Rar/RarArchive.cs index adb9117c..3d61dd0a 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.cs @@ -5,7 +5,6 @@ using SharpCompress.Common; using SharpCompress.Common.Rar; using SharpCompress.Common.Rar.Headers; using SharpCompress.Compressors.Rar; -using SharpCompress.IO; using SharpCompress.Readers; using SharpCompress.Readers.Rar; diff --git a/src/SharpCompress/Archives/Rar/StreamRarArchiveVolume.cs b/src/SharpCompress/Archives/Rar/StreamRarArchiveVolume.cs index 3da1a531..92602ae9 100644 --- a/src/SharpCompress/Archives/Rar/StreamRarArchiveVolume.cs +++ b/src/SharpCompress/Archives/Rar/StreamRarArchiveVolume.cs @@ -19,7 +19,7 @@ namespace SharpCompress.Archives.Rar return GetVolumeFileParts(); } - internal override RarFilePart CreateFilePart(FileHeader fileHeader, MarkHeader markHeader) + internal override RarFilePart CreateFilePart(MarkHeader markHeader, FileHeader fileHeader) { return new SeekableFilePart(markHeader, fileHeader, Stream, ReaderOptions.Password); } diff --git a/src/SharpCompress/Common/Rar/Headers/Flags.cs b/src/SharpCompress/Common/Rar/Headers/Flags.cs index e9048b37..a3811740 100644 --- a/src/SharpCompress/Common/Rar/Headers/Flags.cs +++ b/src/SharpCompress/Common/Rar/Headers/Flags.cs @@ -44,7 +44,7 @@ namespace SharpCompress.Common.Rar.Headers { public const ushort HasExtra = 0x0001; public const ushort HasData = 0x0002; - public const ushort Lock = 0x0004; // block must be kept during an update + public const ushort Keep = 0x0004; // block must be kept during an update public const ushort VolumeContinuation = 0x0008; public const ushort VolumeIncomplete = 0x0010; public const ushort Solid = 0x0020; // ??? diff --git a/src/SharpCompress/Common/Rar/Headers/RarHeader.cs b/src/SharpCompress/Common/Rar/Headers/RarHeader.cs index 4713b3ef..8abf8670 100644 --- a/src/SharpCompress/Common/Rar/Headers/RarHeader.cs +++ b/src/SharpCompress/Common/Rar/Headers/RarHeader.cs @@ -34,6 +34,12 @@ namespace SharpCompress.Common.Rar.Headers reader.Mark(); HeaderCode = reader.ReadRarVIntByte(); HeaderFlags = reader.ReadRarVIntUInt16(2); + +// if (HasHeaderFlag(HeaderFlagsV5.VolumeContinuation)) throw new NotImplementedException(); +// if (HasHeaderFlag(HeaderFlagsV5.VolumeIncomplete)) throw new NotImplementedException(); +// if (HasHeaderFlag(HeaderFlagsV5.Solid)) throw new NotImplementedException(); +// if (HasHeaderFlag(HeaderFlagsV5.PreserveChild)) throw new NotImplementedException(); + if (HasHeaderFlag(HeaderFlagsV5.HasExtra)) { ExtraSize = reader.ReadRarVIntUInt32(); diff --git a/src/SharpCompress/Common/Rar/Headers/RarHeaderFactory.cs b/src/SharpCompress/Common/Rar/Headers/RarHeaderFactory.cs index d4ce8cd2..05660583 100644 --- a/src/SharpCompress/Common/Rar/Headers/RarHeaderFactory.cs +++ b/src/SharpCompress/Common/Rar/Headers/RarHeaderFactory.cs @@ -27,7 +27,7 @@ namespace SharpCompress.Common.Rar.Headers yield return markHeader; RarHeader header; - while ((header = ReadNextHeader(stream)) != null) + while ((header = TryReadNextHeader(stream)) != null) { yield return header; if (header.HeaderType == HeaderType.EndArchive) @@ -39,7 +39,7 @@ namespace SharpCompress.Common.Rar.Headers } } - private RarHeader ReadNextHeader(Stream stream) + private RarHeader TryReadNextHeader(Stream stream) { RarCrcBinaryReader reader; if (!IsEncrypted) diff --git a/src/SharpCompress/Common/Rar/RarVolume.cs b/src/SharpCompress/Common/Rar/RarVolume.cs index 201ced3b..31bc7636 100644 --- a/src/SharpCompress/Common/Rar/RarVolume.cs +++ b/src/SharpCompress/Common/Rar/RarVolume.cs @@ -21,42 +21,41 @@ namespace SharpCompress.Common.Rar headerFactory = new RarHeaderFactory(mode, options); } - internal StreamingMode Mode => headerFactory.StreamingMode; + internal ArchiveHeader ArchiveHeader { get; private set; } + + internal StreamingMode Mode => this.headerFactory.StreamingMode; internal abstract IEnumerable ReadFileParts(); - internal abstract RarFilePart CreateFilePart(FileHeader fileHeader, MarkHeader markHeader); + internal abstract RarFilePart CreateFilePart(MarkHeader markHeader, FileHeader fileHeader); internal IEnumerable GetVolumeFileParts() { - MarkHeader previousMarkHeader = null; - foreach (var header in headerFactory.ReadHeaders(Stream)) + MarkHeader lastMarkHeader = null; + foreach (var header in this.headerFactory.ReadHeaders(Stream)) { switch (header.HeaderType) { + case HeaderType.Mark: + { + lastMarkHeader = header as MarkHeader; + } + break; case HeaderType.Archive: { ArchiveHeader = header as ArchiveHeader; } break; - case HeaderType.Mark: - { - previousMarkHeader = header as MarkHeader; - } - break; case HeaderType.File: { - FileHeader fh = header as FileHeader; - RarFilePart fp = CreateFilePart(fh, previousMarkHeader); - yield return fp; + var fh = header as FileHeader; + yield return CreateFilePart(lastMarkHeader, fh); } break; } } } - internal ArchiveHeader ArchiveHeader { get; private set; } - private void EnsureArchiveHeaderLoaded() { if (ArchiveHeader == null) @@ -66,7 +65,7 @@ namespace SharpCompress.Common.Rar throw new InvalidOperationException("ArchiveHeader should never been null in a streaming read."); } - //we only want to load the archive header to avoid overhead but have to do the nasty thing and reset the stream + // we only want to load the archive header to avoid overhead but have to do the nasty thing and reset the stream GetVolumeFileParts().First(); Stream.Position = 0; } diff --git a/src/SharpCompress/Readers/Rar/RarReaderVolume.cs b/src/SharpCompress/Readers/Rar/RarReaderVolume.cs index bf68043f..98a8c5c0 100644 --- a/src/SharpCompress/Readers/Rar/RarReaderVolume.cs +++ b/src/SharpCompress/Readers/Rar/RarReaderVolume.cs @@ -13,7 +13,7 @@ namespace SharpCompress.Readers.Rar { } - internal override RarFilePart CreateFilePart(FileHeader fileHeader, MarkHeader markHeader) + internal override RarFilePart CreateFilePart(MarkHeader markHeader, FileHeader fileHeader) { return new NonSeekableStreamFilePart(markHeader, fileHeader); } diff --git a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs index 54619c92..d320f782 100644 --- a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs +++ b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs @@ -135,11 +135,6 @@ namespace SharpCompress.Test.Rar DoRar_test_invalid_exttime_ArchiveStreamRead("Rar.test_invalid_exttime.rar"); } - [Fact] - public void Rar5_test_invalid_exttime_ArchiveStreamRead() { - DoRar_test_invalid_exttime_ArchiveStreamRead("Rar5.test_invalid_exttime.rar"); - } - private void DoRar_test_invalid_exttime_ArchiveStreamRead(string filename) { ResetScratch();