rar5: wip

This commit is contained in:
coderb
2017-12-17 10:40:41 -05:00
parent f802b41665
commit b9e89ca64b
9 changed files with 26 additions and 27 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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; // ???

View File

@@ -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();

View File

@@ -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)

View File

@@ -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<RarFilePart> ReadFileParts();
internal abstract RarFilePart CreateFilePart(FileHeader fileHeader, MarkHeader markHeader);
internal abstract RarFilePart CreateFilePart(MarkHeader markHeader, FileHeader fileHeader);
internal IEnumerable<RarFilePart> 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;
}

View File

@@ -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);
}

View File

@@ -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();