From c2bae8c4d218efeec0a92a12ffa52386abe9b8c1 Mon Sep 17 00:00:00 2001 From: "Brodski, David" Date: Tue, 28 Feb 2023 21:41:46 -0500 Subject: [PATCH] Added support for MsLz, added tests for cab, updated net version to 6, added nullable types --- Benchmark/Benchmark.csproj | 3 +- Example/Example.csproj | 3 +- Example/Program.cs | 2 +- SevenZipExtractor.Tests/Crc32.cs | 2 +- SevenZipExtractor.Tests/Resources/cab.cab | Bin 0 -> 46368 bytes SevenZipExtractor.Tests/Resources/mslz.dl_ | Bin 0 -> 51768 bytes .../SevenZipExtractor.Tests.csproj | 13 ++- SevenZipExtractor.Tests/TestBase.cs | 13 ++- SevenZipExtractor.Tests/TestCab.cs | 17 ++++ SevenZipExtractor.Tests/TestFiles.Designer.cs | 22 ++++- SevenZipExtractor.Tests/TestFiles.resx | 6 ++ SevenZipExtractor.Tests/TestMSCF.cs | 29 ++++++ SevenZipExtractor.Tests/TestZip.cs | 14 ++- SevenZipExtractor/ArchiveFile.cs | 89 +++++++++++++----- SevenZipExtractor/ArchiveFileCallback.cs | 8 +- SevenZipExtractor/ArchiveStreamCallback.cs | 2 +- SevenZipExtractor/ArchiveStreamsCallback.cs | 8 +- SevenZipExtractor/Entry.cs | 10 +- SevenZipExtractor/Formats.cs | 3 +- SevenZipExtractor/IArchiveExtractCallback.cs | 2 +- SevenZipExtractor/SafeLibraryHandle.cs | 1 - SevenZipExtractor/SevenZipExtractor.csproj | 3 +- SevenZipExtractor/SevenZipHandle.cs | 4 +- SevenZipExtractor/SevenZipInterface.cs | 29 +++--- 24 files changed, 208 insertions(+), 75 deletions(-) create mode 100644 SevenZipExtractor.Tests/Resources/cab.cab create mode 100644 SevenZipExtractor.Tests/Resources/mslz.dl_ create mode 100644 SevenZipExtractor.Tests/TestCab.cs create mode 100644 SevenZipExtractor.Tests/TestMSCF.cs diff --git a/Benchmark/Benchmark.csproj b/Benchmark/Benchmark.csproj index cf76311..a261d2e 100644 --- a/Benchmark/Benchmark.csproj +++ b/Benchmark/Benchmark.csproj @@ -1,12 +1,13 @@  Exe - netcoreapp3.1;net47 + net6.0 true Benchmark Benchmark Copyright © 2020 bin\$(Configuration)\ + enable diff --git a/Example/Example.csproj b/Example/Example.csproj index 0861735..050a953 100644 --- a/Example/Example.csproj +++ b/Example/Example.csproj @@ -3,11 +3,12 @@ Exe ConsoleApplication86 ConsoleApplication86 - net45 + net6.0 ConsoleApplication86 ConsoleApplication86 Copyright © 2016 bin\$(Configuration)\ + enable diff --git a/Example/Program.cs b/Example/Program.cs index 3c7f052..f572adf 100644 --- a/Example/Program.cs +++ b/Example/Program.cs @@ -22,7 +22,7 @@ static void Main(string[] args) Console.WriteLine(entry.FileName); // extract to file - entry.Extract(entry.FileName); + entry.Extract(entry.FileName ?? "NoFileName"); // extract to stream MemoryStream memoryStream = new MemoryStream(); diff --git a/SevenZipExtractor.Tests/Crc32.cs b/SevenZipExtractor.Tests/Crc32.cs index 055830b..eaf2eb5 100644 --- a/SevenZipExtractor.Tests/Crc32.cs +++ b/SevenZipExtractor.Tests/Crc32.cs @@ -15,7 +15,7 @@ public sealed class Crc32 : HashAlgorithm public const UInt32 DefaultPolynomial = 0xedb88320u; public const UInt32 DefaultSeed = 0xffffffffu; - static UInt32[] defaultTable; + static UInt32[]? defaultTable; readonly UInt32 seed; readonly UInt32[] table; diff --git a/SevenZipExtractor.Tests/Resources/cab.cab b/SevenZipExtractor.Tests/Resources/cab.cab new file mode 100644 index 0000000000000000000000000000000000000000..67869fe9a780bb7460ea1cfd503d0984d3683a6c GIT binary patch literal 46368 zcmV(yUWJi3GNWw-95NFY+Qo7vvGHKw?Fsu-p~7er|Lg->dZ{7nZ2fGb+7K8YkF!= zt&hczO#rf#n4}os(S3=A^-oKK6(Hs zFrRKe-9mgK1$;*N1cCDDqYpsvSIEC&{Uh&x(-$a6=uZ$ZpTGX?#{JvzxAXt%1$_Dp z0r>^$V;KMs@pmXP1oGco6TxXUTZ7dZhG#|V_VF8?Zj}NaE^^};PYJB^x(>8C0>46% zQ%^y5tYgjfzc!v&~{RXg4hxhMUsh;k8O6_&2$J=>j+YX$i zLwGjxiyWy{v>n^Gs6%wO$&CH((5a5ju<1Ch8*mp#S7LMP#bXSm@w4w(!yvJPdjclx zTfo$V$@y(W=NivUNW-0}n>A8Sb;el-8{+#Et4$aJD}01;h?$l%BVSy*6T|Zr8^2)T zJ;MOsK_@%HX~OUGalCIfvxQAkUK`C$_iL050$10@;^k~Q2`Ce7qz;{Z9s})rsu=!|6oDxJHf7Ms?Lkh{dwhn~hTK!itjcJg z&(&p48^!(yK+Jv8d&BKb^pH_d+Mrj~eW0=7REMa&G)gVQx!CbCgfoX(zk2YQaDTAv z=>xzk`|`ZA>u^xN+R$E=@vJ_H;{25L0YIo|g_~Hs9?wi^F>iZ1L=x!k?Xx*+J18jy z^(V|so8P@BR;Y}h)bTyQX1}Eru}mM*3n2mdA&h7AzE-W=o$CoA<UEP zb$bV+oHz^spoRuO2kYNmLI+y}ZC3N|=+BMJtU^H*9Eq6=@lK7sP;C@aYerkOb(7g6 zqvcjV_G?~(*Q!t2N7VjgMX_U?T%11@>Df=;_mmqXkL{13LGQzr>ty8|NC#c7c-c?j zBTAO24hrhAGVroc$uO2OjGkd9%0A&a|H}+99bId*#BR>3s3VE$%k1pz*j-%%_zBZe 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 E10w)yV*mgE literal 0 HcmV?d00001 diff --git a/SevenZipExtractor.Tests/Resources/mslz.dl_ b/SevenZipExtractor.Tests/Resources/mslz.dl_ new file mode 100644 index 0000000000000000000000000000000000000000..e0c42b16e68610e3170512a72e96abd296521dcb GIT binary patch literal 51768 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 literal 0 HcmV?d00001 diff --git a/SevenZipExtractor.Tests/SevenZipExtractor.Tests.csproj b/SevenZipExtractor.Tests/SevenZipExtractor.Tests.csproj index 0015c42..461d7d7 100644 --- a/SevenZipExtractor.Tests/SevenZipExtractor.Tests.csproj +++ b/SevenZipExtractor.Tests/SevenZipExtractor.Tests.csproj @@ -1,6 +1,6 @@  - net45 + net6.0 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages @@ -11,15 +11,14 @@ Copyright © 2019 bin\$(Configuration)\ AnyCPU;x64;x86 - x64 + AnyCPU + enable - - - - - + + + diff --git a/SevenZipExtractor.Tests/TestBase.cs b/SevenZipExtractor.Tests/TestBase.cs index 00bb63c..be4f3d8 100644 --- a/SevenZipExtractor.Tests/TestBase.cs +++ b/SevenZipExtractor.Tests/TestBase.cs @@ -23,15 +23,20 @@ public abstract class TestBase new TestFileEntry { Name = "testFolder\\image3.jpg", IsFolder = false, MD5 = "24ffd227340432596fe61ef6300098ad"}, }; - protected void TestExtractToStream(byte[] archiveBytes, IList expected, SevenZipFormat? sevenZipFormat = null) + protected IList TestSingleFile = new List() +{ + new TestFileEntry { Name = "image1.jpg", IsFolder = false, MD5 = "b3144b66569ab0052b4019a2b4c07a31"}, + }; + + protected void TestExtractToStream(byte[] archiveBytes, IList expected, SevenZipFormat? sevenZipFormat = null, string? fileName = null) { MemoryStream memoryStream = new MemoryStream(archiveBytes); - using (ArchiveFile archiveFile = new ArchiveFile(memoryStream, sevenZipFormat)) + using (ArchiveFile archiveFile = new ArchiveFile(memoryStream, sevenZipFormat, null, fileName)) { foreach (TestFileEntry testEntry in expected) { - Entry entry = archiveFile.Entries.FirstOrDefault(e => e.FileName == testEntry.Name && e.IsFolder == testEntry.IsFolder); + Entry? entry = archiveFile.Entries.FirstOrDefault(e => e.FileName == testEntry.Name && e.IsFolder == testEntry.IsFolder); Assert.IsNotNull(entry, "Entry not found: " + testEntry.Name); @@ -42,7 +47,7 @@ protected void TestExtractToStream(byte[] archiveBytes, IList exp using (MemoryStream entryMemoryStream = new MemoryStream()) { - entry.Extract(entryMemoryStream); + entry!.Extract(entryMemoryStream); if (testEntry.MD5 != null) { diff --git a/SevenZipExtractor.Tests/TestCab.cs b/SevenZipExtractor.Tests/TestCab.cs new file mode 100644 index 0000000..8b1cadf --- /dev/null +++ b/SevenZipExtractor.Tests/TestCab.cs @@ -0,0 +1,17 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SevenZipExtractor; + +namespace SevenZipExtractor.Tests { + [TestClass] + public class TestCab : TestBase { + [TestMethod] + public void TestGuessAndExtractToStream_OK() { + this.TestExtractToStream(Resources.TestFiles.cab, this.TestSingleFile); + } + + [TestMethod] + public void TestKnownFormatAndExtractToStream_OK() { + this.TestExtractToStream(Resources.TestFiles.cab, this.TestSingleFile, SevenZipFormat.Cab); + } + } +} diff --git a/SevenZipExtractor.Tests/TestFiles.Designer.cs b/SevenZipExtractor.Tests/TestFiles.Designer.cs index 4933327..a9e531a 100644 --- a/SevenZipExtractor.Tests/TestFiles.Designer.cs +++ b/SevenZipExtractor.Tests/TestFiles.Designer.cs @@ -19,7 +19,7 @@ namespace Resources { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class TestFiles { @@ -70,6 +70,16 @@ internal static byte[] ansimate_arj { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] cab { + get { + object obj = ResourceManager.GetObject("cab", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -80,6 +90,16 @@ internal static byte[] lzh { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] mslz { + get { + object obj = ResourceManager.GetObject("mslz", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// diff --git a/SevenZipExtractor.Tests/TestFiles.resx b/SevenZipExtractor.Tests/TestFiles.resx index e6558c1..4f55c10 100644 --- a/SevenZipExtractor.Tests/TestFiles.resx +++ b/SevenZipExtractor.Tests/TestFiles.resx @@ -121,9 +121,15 @@ Resources\ansimate-arj.arj;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + resources\cab.cab;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Resources\lzh.lzh;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + resources\mslz.dl_;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Resources\rar.rar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/SevenZipExtractor.Tests/TestMSCF.cs b/SevenZipExtractor.Tests/TestMSCF.cs new file mode 100644 index 0000000..00538b1 --- /dev/null +++ b/SevenZipExtractor.Tests/TestMSCF.cs @@ -0,0 +1,29 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SevenZipExtractor; +using SevenZipExtractor.Tests; +using System.Collections.Generic; +using System.Linq; + +namespace SevenZipExtractor.Tests +{ + [TestClass] + public class TestMSCF : TestBase { + + protected IList TestSingleDllFile = new List() + { + new TestFileEntry { Name = "mslz.dll", IsFolder = false, MD5 = "b3144b66569ab0052b4019a2b4c07a31"}, + }; + + [TestMethod] + public void TestGuessAndExtractToStream_OK() + { + this.TestExtractToStream(Resources.TestFiles.mslz, TestSingleDllFile, null, "mslz.dl_"); + } + + [TestMethod] + public void TestKnownFormatAndExtractToStream_OK() + { + this.TestExtractToStream(Resources.TestFiles.mslz, TestSingleDllFile, SevenZipFormat.Mslz, "mslz.dl_"); + } + } +} \ No newline at end of file diff --git a/SevenZipExtractor.Tests/TestZip.cs b/SevenZipExtractor.Tests/TestZip.cs index de71bf3..7763841 100644 --- a/SevenZipExtractor.Tests/TestZip.cs +++ b/SevenZipExtractor.Tests/TestZip.cs @@ -3,7 +3,7 @@ namespace SevenZipExtractor.Tests { [TestClass] - public class TestZip : TestBase + public class TestZip : TestBase { [TestMethod] public void TestGuessAndExtractToStream_OK() @@ -16,5 +16,17 @@ public void TestKnownFormatAndExtractToStream_OK() { this.TestExtractToStream(Resources.TestFiles.zip, this.TestEntriesWithFolder, SevenZipFormat.Zip); } + + [TestMethod] + public void TestGuessAndExtractToStreamWithFileName_OK() + { + this.TestExtractToStream(Resources.TestFiles.zip, this.TestEntriesWithFolder, null, "zip.zip"); + } + + [TestMethod] + public void TestKnownFormatAndExtractToStreamWithFileName_OK() + { + this.TestExtractToStream(Resources.TestFiles.zip, this.TestEntriesWithFolder, SevenZipFormat.Zip, "zip.zip"); + } } } \ No newline at end of file diff --git a/SevenZipExtractor/ArchiveFile.cs b/SevenZipExtractor/ArchiveFile.cs index 8ccf66b..d9604b1 100644 --- a/SevenZipExtractor/ArchiveFile.cs +++ b/SevenZipExtractor/ArchiveFile.cs @@ -6,16 +6,20 @@ namespace SevenZipExtractor { - public class ArchiveFile : IDisposable + public class ArchiveFile : IDisposable, IArchiveOpenVolumeCallback, IArchiveOpenCallback { private SevenZipHandle sevenZipHandle; private readonly IInArchive archive; private readonly InStreamWrapper archiveStream; - private IList entries; + private IList? entries; - private string libraryFilePath; + private string? libraryFilePath; + /// + /// The current archive name, can change for multi volume archives + /// + public string? CurrentArchiveName { get; set; } - public ArchiveFile(string archiveFilePath, string libraryFilePath = null) + public ArchiveFile(string archiveFilePath, string? libraryFilePath = null) { this.libraryFilePath = libraryFilePath; @@ -25,6 +29,7 @@ public ArchiveFile(string archiveFilePath, string libraryFilePath = null) { throw new SevenZipException("Archive file not found"); } + CurrentArchiveName = Path.GetFileName(archiveFilePath); SevenZipFormat format; string extension = Path.GetExtension(archiveFilePath); @@ -42,11 +47,16 @@ public ArchiveFile(string archiveFilePath, string libraryFilePath = null) throw new SevenZipException(Path.GetFileName(archiveFilePath) + " is not a known archive type"); } - this.archive = this.sevenZipHandle.CreateInArchive(Formats.FormatGuidMapping[format]); + var newArchiver = this.sevenZipHandle!.CreateInArchive(Formats.FormatGuidMapping[format]); + if (newArchiver == null) { + throw new SevenZipException("Could not create archiv instance"); + } + this.archive = newArchiver; + this.archiveStream = new InStreamWrapper(File.OpenRead(archiveFilePath)); } - public ArchiveFile(Stream archiveStream, SevenZipFormat? format = null, string libraryFilePath = null) + public ArchiveFile(Stream archiveStream, SevenZipFormat? format = null, string? libraryFilePath = null, string? fileName = null) { this.libraryFilePath = libraryFilePath; @@ -56,6 +66,7 @@ public ArchiveFile(Stream archiveStream, SevenZipFormat? format = null, string l { throw new SevenZipException("archiveStream is null"); } + CurrentArchiveName = fileName; if (format == null) { @@ -71,7 +82,17 @@ public ArchiveFile(Stream archiveStream, SevenZipFormat? format = null, string l } } - this.archive = this.sevenZipHandle.CreateInArchive(Formats.FormatGuidMapping[format.Value]); + if (format == null) + { + throw new SevenZipException("Unable to guess format automatically"); + } + + var newArchiver = this.sevenZipHandle!.CreateInArchive(Formats.FormatGuidMapping[(SevenZipFormat) format]); + if (newArchiver == null) + { + throw new SevenZipException("Could not create archiv instance"); + } + this.archive = newArchiver; this.archiveStream = new InStreamWrapper(archiveStream); } @@ -95,15 +116,15 @@ public void Extract(string outputFolder, bool overwrite = false) }); } - public void Extract(Func getOutputPath) + public void Extract(Func getOutputPath) { - IList fileStreams = new List(); + IList fileStreams = new List(); try { foreach (Entry entry in Entries) { - string outputPath = getOutputPath(entry); + string? outputPath = getOutputPath(entry); if (outputPath == null) // getOutputPath = null means SKIP { @@ -118,7 +139,7 @@ public void Extract(Func getOutputPath) continue; } - string directoryName = Path.GetDirectoryName(outputPath); + string? directoryName = Path.GetDirectoryName(outputPath); if (!string.IsNullOrWhiteSpace(directoryName)) { @@ -132,7 +153,7 @@ public void Extract(Func getOutputPath) } finally { - foreach (Stream stream in fileStreams) + foreach (Stream? stream in fileStreams) { if (stream != null) { @@ -152,7 +173,7 @@ public IList Entries } ulong checkPos = 32 * 1024; - int open = this.archive.Open(this.archiveStream, ref checkPos, null); + int open = this.archive.Open(this.archiveStream, ref checkPos, CurrentArchiveName != null ? this : null); if (open != 0) { @@ -165,7 +186,7 @@ public IList Entries for (uint fileIndex = 0; fileIndex < itemsCount; fileIndex++) { - string fileName = this.GetProperty(fileIndex, ItemPropId.kpidPath); + string? fileName = this.GetProperty(fileIndex, ItemPropId.kpidPath); bool isFolder = this.GetProperty(fileIndex, ItemPropId.kpidIsFolder); bool isEncrypted = this.GetProperty(fileIndex, ItemPropId.kpidEncrypted); ulong size = this.GetProperty(fileIndex, ItemPropId.kpidSize); @@ -175,9 +196,9 @@ public IList Entries DateTime lastAccessTime = this.GetPropertySafe(fileIndex, ItemPropId.kpidLastAccessTime); uint crc = this.GetPropertySafe(fileIndex, ItemPropId.kpidCRC); uint attributes = this.GetPropertySafe(fileIndex, ItemPropId.kpidAttributes); - string comment = this.GetPropertySafe(fileIndex, ItemPropId.kpidComment); - string hostOS = this.GetPropertySafe(fileIndex, ItemPropId.kpidHostOS); - string method = this.GetPropertySafe(fileIndex, ItemPropId.kpidMethod); + string? comment = this.GetPropertySafe(fileIndex, ItemPropId.kpidComment); + string? hostOS = this.GetPropertySafe(fileIndex, ItemPropId.kpidHostOS); + string? method = this.GetPropertySafe(fileIndex, ItemPropId.kpidMethod); bool isSplitBefore = this.GetPropertySafe(fileIndex, ItemPropId.kpidSplitBefore); bool isSplitAfter = this.GetPropertySafe(fileIndex, ItemPropId.kpidSplitAfter); @@ -206,7 +227,7 @@ public IList Entries } } - private T GetPropertySafe(uint fileIndex, ItemPropId name) + private T? GetPropertySafe(uint fileIndex, ItemPropId name) { try { @@ -214,34 +235,34 @@ private T GetPropertySafe(uint fileIndex, ItemPropId name) } catch (InvalidCastException) { - return default(T); + return default; } } - private T GetProperty(uint fileIndex, ItemPropId name) + private T? GetProperty(uint fileIndex, ItemPropId name) { PropVariant propVariant = new PropVariant(); this.archive.GetProperty(fileIndex, name, ref propVariant); - object value = propVariant.GetObject(); + object? value = propVariant.GetObject(); if (propVariant.VarType == VarEnum.VT_EMPTY) { propVariant.Clear(); - return default(T); + return default; } propVariant.Clear(); if (value == null) { - return default(T); + return default; } Type type = typeof(T); bool isNullable = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); - Type underlyingType = isNullable ? Nullable.GetUnderlyingType(type) : type; + Type? underlyingType = isNullable ? Nullable.GetUnderlyingType(type) : type; - T result = (T)Convert.ChangeType(value.ToString(), underlyingType); + T? result = (T?)Convert.ChangeType(value.ToString(), underlyingType); return result; } @@ -362,6 +383,24 @@ private bool GuessFormatFromSignature(Stream stream, out SevenZipFormat format) format = SevenZipFormat.Undefined; return false; } + public void GetProperty(ItemPropId propID, ref PropVariant value) { + if (propID == ItemPropId.kpidName && CurrentArchiveName != null) { + value.Clear(); + value.VarType = VarEnum.VT_BSTR; + value.pointerValue = Marshal.StringToBSTR(CurrentArchiveName); + } + } + public int GetStream(string name, out IInStream? inStream) { + // not supported + inStream = null; + return -2147467259; // E_FAIL + } + + public void SetTotal(IntPtr files, IntPtr bytes) { + } + + public void SetCompleted(IntPtr files, IntPtr bytes) { + } ~ArchiveFile() { diff --git a/SevenZipExtractor/ArchiveFileCallback.cs b/SevenZipExtractor/ArchiveFileCallback.cs index 4f82230..0a2a6c9 100644 --- a/SevenZipExtractor/ArchiveFileCallback.cs +++ b/SevenZipExtractor/ArchiveFileCallback.cs @@ -7,7 +7,7 @@ internal class ArchiveFileCallback : IArchiveExtractCallback { private readonly string fileName; private readonly uint fileNumber; - private OutStreamWrapper fileStream; // to be removed + private OutStreamWrapper? fileStream; // to be removed public ArchiveFileCallback(uint fileNumber, string fileName) { @@ -23,7 +23,7 @@ public void SetCompleted(ref ulong completeValue) { } - public int GetStream(uint index, out ISequentialOutStream outStream, AskMode askExtractMode) + public int GetStream(uint index, out ISequentialOutStream? outStream, AskMode askExtractMode) { if ((index != this.fileNumber) || (askExtractMode != AskMode.kExtract)) { @@ -31,7 +31,7 @@ public int GetStream(uint index, out ISequentialOutStream outStream, AskMode ask return 0; } - string fileDir = Path.GetDirectoryName(this.fileName); + string? fileDir = Path.GetDirectoryName(this.fileName); if (!string.IsNullOrEmpty(fileDir)) { @@ -51,7 +51,7 @@ public void PrepareOperation(AskMode askExtractMode) public void SetOperationResult(OperationResult resultEOperationResult) { - this.fileStream.Dispose(); + this.fileStream?.Dispose(); } } } \ No newline at end of file diff --git a/SevenZipExtractor/ArchiveStreamCallback.cs b/SevenZipExtractor/ArchiveStreamCallback.cs index e71e225..2dbae97 100644 --- a/SevenZipExtractor/ArchiveStreamCallback.cs +++ b/SevenZipExtractor/ArchiveStreamCallback.cs @@ -21,7 +21,7 @@ public void SetCompleted(ref ulong completeValue) { } - public int GetStream(uint index, out ISequentialOutStream outStream, AskMode askExtractMode) + public int GetStream(uint index, out ISequentialOutStream? outStream, AskMode askExtractMode) { if ((index != this.fileNumber) || (askExtractMode != AskMode.kExtract)) { diff --git a/SevenZipExtractor/ArchiveStreamsCallback.cs b/SevenZipExtractor/ArchiveStreamsCallback.cs index b8f1fca..d4fa266 100644 --- a/SevenZipExtractor/ArchiveStreamsCallback.cs +++ b/SevenZipExtractor/ArchiveStreamsCallback.cs @@ -5,9 +5,9 @@ namespace SevenZipExtractor { internal class ArchiveStreamsCallback : IArchiveExtractCallback { - private readonly IList streams; + private readonly IList streams; - public ArchiveStreamsCallback(IList streams) + public ArchiveStreamsCallback(IList streams) { this.streams = streams; } @@ -20,7 +20,7 @@ public void SetCompleted(ref ulong completeValue) { } - public int GetStream(uint index, out ISequentialOutStream outStream, AskMode askExtractMode) + public int GetStream(uint index, out ISequentialOutStream? outStream, AskMode askExtractMode) { if (askExtractMode != AskMode.kExtract) { @@ -34,7 +34,7 @@ public int GetStream(uint index, out ISequentialOutStream outStream, AskMode ask return 0; } - Stream stream = this.streams[(int) index]; + Stream? stream = this.streams[(int) index]; if (stream == null) { diff --git a/SevenZipExtractor/Entry.cs b/SevenZipExtractor/Entry.cs index 13220b0..c0238a5 100644 --- a/SevenZipExtractor/Entry.cs +++ b/SevenZipExtractor/Entry.cs @@ -17,7 +17,7 @@ internal Entry(IInArchive archive, uint index) /// /// Name of the file with its relative path within the archive /// - public string FileName { get; internal set; } + public string? FileName { get; internal set; } /// /// True if entry is a folder, false if it is a file /// @@ -64,17 +64,17 @@ internal Entry(IInArchive archive, uint index) /// /// Comment of the entry /// - public string Comment { get; internal set; } + public string? Comment { get; internal set; } /// /// Compression method of the entry /// - public string Method { get; internal set; } + public string? Method { get; internal set; } /// /// Host operating system of the entry /// - public string HostOS { get; internal set; } + public string? HostOS { get; internal set; } /// /// True if there are parts of this file in previous split archive parts @@ -94,7 +94,7 @@ public void Extract(string fileName, bool preserveTimestamp = true) return; } - string directoryName = Path.GetDirectoryName(fileName); + string? directoryName = Path.GetDirectoryName(fileName); if (!string.IsNullOrWhiteSpace(directoryName)) { diff --git a/SevenZipExtractor/Formats.cs b/SevenZipExtractor/Formats.cs index 994b54e..623b6c7 100644 --- a/SevenZipExtractor/Formats.cs +++ b/SevenZipExtractor/Formats.cs @@ -107,7 +107,8 @@ public class Formats {SevenZipFormat.Zip, new byte[] { 0x50, 0x4b }}, {SevenZipFormat.Arj, new byte[] { 0x60, 0xEA }}, {SevenZipFormat.Lzh, new byte[] { 0x2D, 0x6C, 0x68 }}, - {SevenZipFormat.SquashFS, new byte[] {0x68, 0x73, 0x71, 0x73}} + {SevenZipFormat.SquashFS, new byte[] {0x68, 0x73, 0x71, 0x73}}, + {SevenZipFormat.Mslz, new byte[] { 0x53, 0x5a, 0x44, 0x44 } }, }; } } diff --git a/SevenZipExtractor/IArchiveExtractCallback.cs b/SevenZipExtractor/IArchiveExtractCallback.cs index 085841c..f89f2f2 100644 --- a/SevenZipExtractor/IArchiveExtractCallback.cs +++ b/SevenZipExtractor/IArchiveExtractCallback.cs @@ -13,7 +13,7 @@ internal interface IArchiveExtractCallback //: IProgress [PreserveSig] int GetStream( uint index, - [MarshalAs(UnmanagedType.Interface)] out ISequentialOutStream outStream, + [MarshalAs(UnmanagedType.Interface)] out ISequentialOutStream? outStream, AskMode askExtractMode); // GetStream OUT: S_OK - OK, S_FALSE - skeep this file diff --git a/SevenZipExtractor/SafeLibraryHandle.cs b/SevenZipExtractor/SafeLibraryHandle.cs index 74185a8..0bfd570 100644 --- a/SevenZipExtractor/SafeLibraryHandle.cs +++ b/SevenZipExtractor/SafeLibraryHandle.cs @@ -12,7 +12,6 @@ public SafeLibraryHandle() : base(true) /// Release library handle /// true if the handle was released - [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] protected override bool ReleaseHandle() { return Kernel32Dll.FreeLibrary(this.handle); diff --git a/SevenZipExtractor/SevenZipExtractor.csproj b/SevenZipExtractor/SevenZipExtractor.csproj index 9b632f2..f42d491 100644 --- a/SevenZipExtractor/SevenZipExtractor.csproj +++ b/SevenZipExtractor/SevenZipExtractor.csproj @@ -1,6 +1,6 @@  - net45;netstandard2.0 + net6.0 SevenZipWrapper SevenZipWrapper C# wrapper for 7z.dll (included) @@ -12,6 +12,7 @@ https://github.com/adoconnection/SevenZipExtractor 7Zip APM Arj BZip2 Cab Chm Compound Cpio CramFS Deb Dll Dmg Exe Fat Flv GZip Hfs Iso Lzh Lzma Lzma86 Mach-O Mbr Mub Nsis Ntfs Ppmd Rar Rar5 Rpm Split SquashFS Swf Swfc Tar TE Udf UEFIc UEFIs Vhd Wim Xar XZ Z Zip 1.0.17 + enable diff --git a/SevenZipExtractor/SevenZipHandle.cs b/SevenZipExtractor/SevenZipHandle.cs index bf9a02d..d38ed84 100644 --- a/SevenZipExtractor/SevenZipHandle.cs +++ b/SevenZipExtractor/SevenZipHandle.cs @@ -6,7 +6,7 @@ namespace SevenZipExtractor { internal class SevenZipHandle : IDisposable { - private SafeLibraryHandle sevenZipSafeHandle; + private SafeLibraryHandle? sevenZipSafeHandle; public SevenZipHandle(string sevenZipLibPath) { @@ -48,7 +48,7 @@ public void Dispose() GC.SuppressFinalize(this); } - public IInArchive CreateInArchive(Guid classId) + public IInArchive? CreateInArchive(Guid classId) { if (this.sevenZipSafeHandle == null) { diff --git a/SevenZipExtractor/SevenZipInterface.cs b/SevenZipExtractor/SevenZipInterface.cs index 710e1cd..a37ec70 100644 --- a/SevenZipExtractor/SevenZipInterface.cs +++ b/SevenZipExtractor/SevenZipInterface.cs @@ -10,14 +10,14 @@ namespace SevenZipExtractor { [StructLayout(LayoutKind.Sequential)] - internal struct PropArray + public struct PropArray { uint length; IntPtr pointerValues; } [StructLayout(LayoutKind.Explicit)] - internal struct PropVariant + public struct PropVariant { [DllImport("ole32.dll")] private static extern int PropVariantClear(ref PropVariant pvar); @@ -35,6 +35,9 @@ public VarEnum VarType { return (VarEnum) this.vt; } + set { + this.vt = (ushort) value; + } } public void Clear() @@ -73,7 +76,7 @@ public void Clear() } } - public object GetObject() + public object? GetObject() { switch (this.VarType) { @@ -115,12 +118,12 @@ internal interface IArchiveOpenCallback // ref ulong replaced with IntPtr because handlers ofter pass null value // read actual value with Marshal.ReadInt64 void SetTotal( - IntPtr files, // [In] ref ulong files, can use 'ulong* files' but it is unsafe - IntPtr bytes); // [In] ref ulong bytes + [In] IntPtr files, // [In] ref ulong files, can use 'ulong* files' but it is unsafe + [In] IntPtr bytes); // [In] ref ulong bytes void SetCompleted( - IntPtr files, // [In] ref ulong files - IntPtr bytes); // [In] ref ulong bytes + [In] IntPtr files, // [In] ref ulong files + [In] IntPtr bytes); // [In] ref ulong bytes } [ComImport] @@ -158,12 +161,12 @@ internal interface IArchiveOpenVolumeCallback { void GetProperty( ItemPropId propID, // PROPID - IntPtr value); // PROPVARIANT + [In] ref PropVariant value); // PROPVARIANT [PreserveSig] int GetStream( [MarshalAs(UnmanagedType.LPWStr)] string name, - [MarshalAs(UnmanagedType.Interface)] out IInStream inStream); + [MarshalAs(UnmanagedType.Interface)] out IInStream? inStream); } [ComImport] @@ -220,7 +223,7 @@ This function is allowed to write less than "size". [ComImport] [Guid("23170F69-40C1-278A-0000-000300030000")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IInStream //: ISequentialInStream + public interface IInStream //: ISequentialInStream { //[PreserveSig] //int Read( @@ -260,7 +263,7 @@ void Seek( int SetSize(long newSize); } - internal enum ItemPropId : uint + public enum ItemPropId : uint { kpidNoProperty = 0, @@ -316,7 +319,7 @@ internal interface IInArchive int Open( IInStream stream, /*[MarshalAs(UnmanagedType.U8)]*/ [In] ref ulong maxCheckStartPosition, - [MarshalAs(UnmanagedType.Interface)] IArchiveOpenCallback openArchiveCallback); + [MarshalAs(UnmanagedType.Interface)] IArchiveOpenCallback? openArchiveCallback); void Close(); //void GetNumberOfItems([In] ref uint numItem); @@ -329,7 +332,7 @@ void GetProperty( [PreserveSig] int Extract( - [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] uint[] indices, //[In] ref uint indices, + [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] uint[]? indices, //[In] ref uint indices, uint numItems, int testMode, [MarshalAs(UnmanagedType.Interface)] IArchiveExtractCallback extractCallback);