Skip to content
Closed
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
4 changes: 2 additions & 2 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageVersion Include="Mono.Posix.NETStandard" Version="1.0.0" />
<PackageVersion Include="SimpleExec" Version="12.0.0" />
<PackageVersion Include="System.Buffers" Version="4.6.0" />
<PackageVersion Include="System.Memory" Version="4.6.0" />
<PackageVersion Include="System.Buffers" Version="4.6.1" />
<PackageVersion Include="System.Memory" Version="4.6.3" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="8.0.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
Expand Down
2 changes: 1 addition & 1 deletion src/SharpCompress/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Runtime.CompilerServices;

[assembly: CLSCompliant(true)]
[assembly: CLSCompliant(false)]
[assembly: InternalsVisibleTo(
"SharpCompress.Test,PublicKey=0024000004800000940000000602000000240000525341310004000001000100158bebf1433f76dffc356733c138babea7a47536c65ed8009b16372c6f4edbb20554db74a62687f56b97c20a6ce8c4b123280279e33c894e7b3aa93ab3c573656fde4db576cfe07dba09619ead26375b25d2c4a8e43f7be257d712b0dd2eb546f67adb09281338618a58ac834fc038dd7e2740a7ab3591826252e4f4516306dc"
)]
59 changes: 29 additions & 30 deletions src/SharpCompress/Common/Arc/ArcEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,54 +7,53 @@
using SharpCompress.Common.GZip;
using SharpCompress.Common.Tar;

namespace SharpCompress.Common.Arc
namespace SharpCompress.Common.Arc;

public class ArcEntry : Entry
{
public class ArcEntry : Entry
{
private readonly ArcFilePart? _filePart;
private readonly ArcFilePart? _filePart;

internal ArcEntry(ArcFilePart? filePart)
{
_filePart = filePart;
}
internal ArcEntry(ArcFilePart? filePart)
{
_filePart = filePart;
}

public override long Crc
public override long Crc
{
get
{
get
if (_filePart == null)
{
if (_filePart == null)
{
return 0;
}
return _filePart.Header.Crc16;
return 0;
}
return _filePart.Header.Crc16;
}
}

public override string? Key => _filePart?.Header.Name;
public override string? Key => _filePart?.Header.Name;

public override string? LinkTarget => null;
public override string? LinkTarget => null;

public override long CompressedSize => _filePart?.Header.CompressedSize ?? 0;
public override long CompressedSize => _filePart?.Header.CompressedSize ?? 0;

public override CompressionType CompressionType =>
_filePart?.Header.CompressionMethod ?? CompressionType.Unknown;
public override CompressionType CompressionType =>
_filePart?.Header.CompressionMethod ?? CompressionType.Unknown;

public override long Size => throw new NotImplementedException();
public override long Size => throw new NotImplementedException();

public override DateTime? LastModifiedTime => null;
public override DateTime? LastModifiedTime => null;

public override DateTime? CreatedTime => null;
public override DateTime? CreatedTime => null;

public override DateTime? LastAccessedTime => null;
public override DateTime? LastAccessedTime => null;

public override DateTime? ArchivedTime => null;
public override DateTime? ArchivedTime => null;

public override bool IsEncrypted => false;
public override bool IsEncrypted => false;

public override bool IsDirectory => false;
public override bool IsDirectory => false;

public override bool IsSplitAfter => false;
public override bool IsSplitAfter => false;

internal override IEnumerable<FilePart> Parts => _filePart.Empty();
}
internal override IEnumerable<FilePart> Parts => _filePart.Empty();
}
115 changes: 57 additions & 58 deletions src/SharpCompress/Common/Arc/ArcEntryHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,74 +3,73 @@
using System.Linq;
using System.Text;

namespace SharpCompress.Common.Arc
namespace SharpCompress.Common.Arc;

public class ArcEntryHeader
{
public class ArcEntryHeader
{
public ArchiveEncoding ArchiveEncoding { get; }
public CompressionType CompressionMethod { get; private set; }
public string? Name { get; private set; }
public long CompressedSize { get; private set; }
public DateTime DateTime { get; private set; }
public int Crc16 { get; private set; }
public long OriginalSize { get; private set; }
public long DataStartPosition { get; private set; }
public ArchiveEncoding ArchiveEncoding { get; }
public CompressionType CompressionMethod { get; private set; }
public string? Name { get; private set; }
public long CompressedSize { get; private set; }
public DateTime DateTime { get; private set; }
public int Crc16 { get; private set; }
public long OriginalSize { get; private set; }
public long DataStartPosition { get; private set; }

public ArcEntryHeader(ArchiveEncoding archiveEncoding)
{
this.ArchiveEncoding = archiveEncoding;
}
public ArcEntryHeader(ArchiveEncoding archiveEncoding)
{
this.ArchiveEncoding = archiveEncoding;
}

public ArcEntryHeader? ReadHeader(Stream stream)
public ArcEntryHeader? ReadHeader(Stream stream)
{
byte[] headerBytes = new byte[29];
if (stream.Read(headerBytes, 0, headerBytes.Length) != headerBytes.Length)
{
byte[] headerBytes = new byte[29];
if (stream.Read(headerBytes, 0, headerBytes.Length) != headerBytes.Length)
{
return null;
}
DataStartPosition = stream.Position;
return LoadFrom(headerBytes);
return null;
}
DataStartPosition = stream.Position;
return LoadFrom(headerBytes);
}

public ArcEntryHeader LoadFrom(byte[] headerBytes)
{
CompressionMethod = GetCompressionType(headerBytes[1]);
public ArcEntryHeader LoadFrom(byte[] headerBytes)
{
CompressionMethod = GetCompressionType(headerBytes[1]);

// Read name
int nameEnd = Array.IndexOf(headerBytes, (byte)0, 1); // Find null terminator
Name = Encoding.UTF8.GetString(headerBytes, 2, nameEnd > 0 ? nameEnd - 2 : 12);
// Read name
int nameEnd = Array.IndexOf(headerBytes, (byte)0, 1); // Find null terminator
Name = Encoding.UTF8.GetString(headerBytes, 2, nameEnd > 0 ? nameEnd - 2 : 12);

int offset = 15;
CompressedSize = BitConverter.ToUInt32(headerBytes, offset);
offset += 4;
uint rawDateTime = BitConverter.ToUInt32(headerBytes, offset);
DateTime = ConvertToDateTime(rawDateTime);
offset += 4;
Crc16 = BitConverter.ToUInt16(headerBytes, offset);
offset += 2;
OriginalSize = BitConverter.ToUInt32(headerBytes, offset);
return this;
}
int offset = 15;
CompressedSize = BitConverter.ToUInt32(headerBytes, offset);
offset += 4;
uint rawDateTime = BitConverter.ToUInt32(headerBytes, offset);
DateTime = ConvertToDateTime(rawDateTime);
offset += 4;
Crc16 = BitConverter.ToUInt16(headerBytes, offset);
offset += 2;
OriginalSize = BitConverter.ToUInt32(headerBytes, offset);
return this;
}

private CompressionType GetCompressionType(byte value)
private CompressionType GetCompressionType(byte value)
{
return value switch
{
return value switch
{
1 or 2 => CompressionType.None,
3 => CompressionType.RLE90,
4 => CompressionType.Squeezed,
5 or 6 or 7 or 8 => CompressionType.Crunched,
9 => CompressionType.Squashed,
10 => CompressionType.Crushed,
11 => CompressionType.Distilled,
_ => CompressionType.Unknown,
};
}
1 or 2 => CompressionType.None,
3 => CompressionType.RLE90,
4 => CompressionType.Squeezed,
5 or 6 or 7 or 8 => CompressionType.Crunched,
9 => CompressionType.Squashed,
10 => CompressionType.Crushed,
11 => CompressionType.Distilled,
_ => CompressionType.Unknown,
};
}

public static DateTime ConvertToDateTime(long rawDateTime)
{
// Convert Unix timestamp to DateTime (UTC)
return DateTimeOffset.FromUnixTimeSeconds(rawDateTime).UtcDateTime;
}
public static DateTime ConvertToDateTime(long rawDateTime)
{
// Convert Unix timestamp to DateTime (UTC)
return DateTimeOffset.FromUnixTimeSeconds(rawDateTime).UtcDateTime;
}
}
90 changes: 41 additions & 49 deletions src/SharpCompress/Common/Arc/ArcFilePart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,63 +13,55 @@
using SharpCompress.Compressors.Squeezed;
using SharpCompress.IO;

namespace SharpCompress.Common.Arc
namespace SharpCompress.Common.Arc;

public class ArcFilePart : FilePart
{
public class ArcFilePart : FilePart
{
private readonly Stream? _stream;
private readonly Stream? _stream;

internal ArcFilePart(ArcEntryHeader localArcHeader, Stream? seekableStream)
: base(localArcHeader.ArchiveEncoding)
{
_stream = seekableStream;
Header = localArcHeader;
}
internal ArcFilePart(ArcEntryHeader localArcHeader, Stream? seekableStream)
: base(localArcHeader.ArchiveEncoding)
{
_stream = seekableStream;
Header = localArcHeader;
}

internal ArcEntryHeader Header { get; set; }
internal ArcEntryHeader Header { get; set; }

internal override string? FilePartName => Header.Name;
internal override string? FilePartName => Header.Name;

internal override Stream GetCompressedStream()
internal override Stream GetCompressedStream()
{
if (_stream != null)
{
if (_stream != null)
Stream compressedStream;
switch (Header.CompressionMethod)
{
Stream compressedStream;
switch (Header.CompressionMethod)
{
case CompressionType.None:
compressedStream = new ReadOnlySubStream(
_stream,
Header.DataStartPosition,
Header.CompressedSize
);
break;
case CompressionType.RLE90:
compressedStream = new RunLength90Stream(
_stream,
(int)Header.CompressedSize
);
break;
case CompressionType.Squeezed:
compressedStream = new SqueezeStream(_stream, (int)Header.CompressedSize);
break;
case CompressionType.Crunched:
compressedStream = new ArcLzwStream(
_stream,
(int)Header.CompressedSize,
true
);
break;
default:
throw new NotSupportedException(
"CompressionMethod: " + Header.CompressionMethod
);
}
return compressedStream;
case CompressionType.None:
compressedStream = new ReadOnlySubStream(
_stream,
Header.DataStartPosition,
Header.CompressedSize
);
break;
case CompressionType.RLE90:
compressedStream = new RunLength90Stream(_stream, (int)Header.CompressedSize);
break;
case CompressionType.Squeezed:
compressedStream = new SqueezeStream(_stream, (int)Header.CompressedSize);
break;
case CompressionType.Crunched:
compressedStream = new ArcLzwStream(_stream, (int)Header.CompressedSize, true);
break;
default:
throw new NotSupportedException(
"CompressionMethod: " + Header.CompressionMethod
);
}
return _stream.NotNull();
return compressedStream;
}

internal override Stream? GetRawStream() => _stream;
return _stream.NotNull();
}

internal override Stream? GetRawStream() => _stream;
}
11 changes: 5 additions & 6 deletions src/SharpCompress/Common/Arc/ArcVolume.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@
using System.Threading.Tasks;
using SharpCompress.Readers;

namespace SharpCompress.Common.Arc
namespace SharpCompress.Common.Arc;

public class ArcVolume : Volume
{
public class ArcVolume : Volume
{
public ArcVolume(Stream stream, ReaderOptions readerOptions, int index = 0)
: base(stream, readerOptions, index) { }
}
public ArcVolume(Stream stream, ReaderOptions readerOptions, int index = 0)
: base(stream, readerOptions, index) { }
}
2 changes: 1 addition & 1 deletion src/SharpCompress/Common/Zip/ZipFilePart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
using SharpCompress.Compressors.Reduce;
using SharpCompress.Compressors.Shrink;
using SharpCompress.Compressors.Xz;
using SharpCompress.Compressors.ZStandard;
using SharpCompress.IO;
using ZstdSharp;

namespace SharpCompress.Common.Zip;

Expand Down
Loading