Skip to content

Commit 45105de

Browse files
committed
Try LayoutKind.Explicit
1 parent 73ee3e1 commit 45105de

File tree

4 files changed

+32
-3
lines changed

4 files changed

+32
-3
lines changed

CompressionMethod.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,26 @@ public enum CompressionMethod : short
121121
/// </summary>
122122
LZ77 = 19,
123123

124+
/// <summary>
125+
/// LZMA2 Compressed data
126+
/// </summary>
127+
LZMA2 = 33,
128+
129+
/// <summary>
130+
/// Zstandard compressed data
131+
/// </summary>
132+
ZSTD = 93,
133+
134+
/// <summary>
135+
/// XZ compressed data
136+
/// </summary>
137+
XZ = 95,
138+
139+
/// <summary>
140+
/// Compressed Jpeg data
141+
/// </summary>
142+
JPEG = 96,
143+
124144
/// <summary>
125145
/// WavPack compressed data
126146
/// </summary>

LibZipSharp.UnitTest/ZipTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ public void UpdateEntryCompressionMethod ()
216216
}
217217

218218
[Test]
219-
[Repeat (100)]
220219
public void CheckForUnknownCompressionMethods ()
221220
{
222221
string filePath = Path.GetFullPath ("packaged_resources");

Native.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,28 @@ public struct zip_source_args_seek_t
4747
public int whence;
4848
};
4949

50+
[StructLayout(LayoutKind.Explicit)]
5051
public struct zip_stat_t
5152
{
53+
[FieldOffset (0)]
5254
public UInt64 valid; /* which fields have valid values */
55+
[FieldOffset (8)]
5356
public IntPtr name; /* name of the file (char *) */
57+
[FieldOffset (16)]
5458
public UInt64 index; /* index within archive */
59+
[FieldOffset (24)]
5560
public UInt64 size; /* size of file (uncompressed) */
61+
[FieldOffset (32)]
5662
public UInt64 comp_size; /* size of file (compressed) */
63+
[FieldOffset (40)]
5764
public IntPtr mtime; /* modification time (time_t) */
65+
[FieldOffset (48)]
5866
public UInt32 crc; /* crc of file data */
67+
[FieldOffset (52)]
5968
public Int16 comp_method; /* compression method used */
69+
[FieldOffset (56)]
6070
public UInt16 encryption_method; /* encryption method used */
71+
[FieldOffset (60)]
6172
public UInt32 flags; /* reserved for future use */
6273
};
6374

ZipEntry.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ internal void Init ()
139139
{
140140
valid = (StatFlags)stat.valid;
141141

142+
142143
// We mustn't free stat.name, it's handled by libzip and freeing it here would cause a crash.
143144
FullName = Utilities.SanitizeFilePath (GetStatField (StatFlags.Name, () => Utilities.GetStringFromNativeAnsi (stat.name), String.Empty));
144145
Index = GetStatField (StatFlags.Index, () => stat.index);
@@ -151,7 +152,6 @@ internal void Init ()
151152
CompressionMethod = GetStatField (StatFlags.CompMethod, () => {
152153
if (Enum.IsDefined (typeof (CompressionMethod), stat.comp_method))
153154
return (CompressionMethod)stat.comp_method;
154-
Console.WriteLine ($"CompressionMethod for {FullName} was Unknown. value = {stat.comp_method}.");
155155
return CompressionMethod.Unknown;
156156
});
157157
EncryptionMethod = GetStatField (StatFlags.EncryptionMethod, () => {
@@ -160,7 +160,6 @@ internal void Init ()
160160
return EncryptionMethod.Unknown;
161161
});
162162
IsDirectory = Size == 0 && FullName.EndsWith ("/", StringComparison.Ordinal);
163-
164163
byte opsys;
165164
uint xattr;
166165
if (Native.zip_file_get_external_attributes (archive.ArchivePointer, Index, OperationFlags.None, out opsys, out xattr) == 0) {

0 commit comments

Comments
 (0)