mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-09-22 23:15:20 +00:00
rar5: wip
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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; // ???
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user