From 15f954cd46aa2d81f76ff0364875aafd372f5bc4 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 28 Oct 2017 17:45:01 +0300 Subject: [PATCH] Use new compression method enum in ZIP --- SWCompression.xcodeproj/project.pbxproj | 20 ++++++++++++++++++ Sources/ZIP/CompressionMethod+Zip.swift | 27 +++++++++++++++++++++++++ Sources/ZIP/ZipContainer.swift | 10 ++++----- Sources/ZIP/ZipEntryInfo.swift | 5 +++++ 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 Sources/ZIP/CompressionMethod+Zip.swift diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index bee06d55..853fb167 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -7,6 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + 06092A1A1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A191FA4CB0300DE9FD5 /* CompressionMethod.swift */; }; + 06092A1B1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A191FA4CB0300DE9FD5 /* CompressionMethod.swift */; }; + 06092A1C1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A191FA4CB0300DE9FD5 /* CompressionMethod.swift */; }; + 06092A1D1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A191FA4CB0300DE9FD5 /* CompressionMethod.swift */; }; + 06092A241FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A231FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift */; }; + 06092A251FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A231FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift */; }; + 06092A261FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A231FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift */; }; + 06092A271FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06092A231FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift */; }; 061358FB1F274E080065BCEB /* test2.7z in Resources */ = {isa = PBXBuildFile; fileRef = 061358F91F274E080065BCEB /* test2.7z */; }; 061358FC1F274E080065BCEB /* test3.7z in Resources */ = {isa = PBXBuildFile; fileRef = 061358FA1F274E080065BCEB /* test3.7z */; }; 061C06211F0E89D900832F0C /* XZError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061C06201F0E89D900832F0C /* XZError.swift */; }; @@ -447,6 +455,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 06092A191FA4CB0300DE9FD5 /* CompressionMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompressionMethod.swift; sourceTree = ""; }; + 06092A231FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CompressionMethod+Zip.swift"; sourceTree = ""; }; 061358F91F274E080065BCEB /* test2.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test2.7z; sourceTree = ""; }; 061358FA1F274E080065BCEB /* test3.7z */ = {isa = PBXFileReference; lastKnownFileType = file; path = test3.7z; sourceTree = ""; }; 061C06201F0E89D900832F0C /* XZError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XZError.swift; sourceTree = ""; }; @@ -732,6 +742,7 @@ 0620F4C71F8E24BF001C9B7A /* DecompressionAlgorithm.swift */, 06E234811E06A6C200F18798 /* CheckSums.swift */, 063DF1061DE1F07800F38082 /* Extensions.swift */, + 06092A191FA4CB0300DE9FD5 /* CompressionMethod.swift */, 0686A63A1FA4C07D00E89C9E /* FileSystemType.swift */, 063DF1051DE1F07800F38082 /* DataWithPointer.swift */, 06CDFCB61F111E6900292758 /* BitReader.swift */, @@ -972,6 +983,7 @@ 061C064C1F0E901C00832F0C /* ZipLocalHeader.swift */, 061C06471F0E8FF500832F0C /* ZipCentralDirectoryEntry.swift */, 061C06511F0E904600832F0C /* ZipEndOfCentralDirectory.swift */, + 06092A231FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift */, 0686A6441FA4C47300E89C9E /* FileSystemType+Zip.swift */, ); path = ZIP; @@ -1443,11 +1455,13 @@ 0694A74E1F7C0DF00023BC99 /* BurrowsWheeler.swift in Sources */, 06CC3FDE1F8AAE8B00BD576D /* BitReader+7z.swift in Sources */, 06FED40D1DD7717E0013DFB2 /* BZip2.swift in Sources */, + 06092A1B1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */, 06A960611F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062C1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF61E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 065569681DC65C2A00A47E66 /* GzipArchive.swift in Sources */, 061C06221F0E89D900832F0C /* XZError.swift in Sources */, + 06092A251FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */, 06A960661F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2DA1EBCEFA60053A188 /* TarContainer.swift in Sources */, 0620F4C91F8E24BF001C9B7A /* DecompressionAlgorithm.swift in Sources */, @@ -1531,11 +1545,13 @@ 0694A74F1F7C0DF00023BC99 /* BurrowsWheeler.swift in Sources */, 06CC3FDF1F8AAE8B00BD576D /* BitReader+7z.swift in Sources */, 065569711DC65C2B00A47E66 /* Deflate.swift in Sources */, + 06092A1C1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */, 06A960621F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062D1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF71E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 06FED40E1DD7717E0013DFB2 /* BZip2.swift in Sources */, 061C06231F0E89D900832F0C /* XZError.swift in Sources */, + 06092A261FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */, 06A960671F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2DB1EBCEFA60053A188 /* TarContainer.swift in Sources */, 0620F4CA1F8E24BF001C9B7A /* DecompressionAlgorithm.swift in Sources */, @@ -1619,11 +1635,13 @@ 0694A7501F7C0DF00023BC99 /* BurrowsWheeler.swift in Sources */, 06CC3FE01F8AAE8B00BD576D /* BitReader+7z.swift in Sources */, 06FED40F1DD7717E0013DFB2 /* BZip2.swift in Sources */, + 06092A1D1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */, 06A960631F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062E1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF81E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 065569761DC65C2B00A47E66 /* GzipArchive.swift in Sources */, 061C06241F0E89D900832F0C /* XZError.swift in Sources */, + 06092A271FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */, 06A960681F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2DC1EBCEFA60053A188 /* TarContainer.swift in Sources */, 0620F4CB1F8E24BF001C9B7A /* DecompressionAlgorithm.swift in Sources */, @@ -1707,11 +1725,13 @@ 0694A74D1F7C0DF00023BC99 /* BurrowsWheeler.swift in Sources */, 06CC3FDD1F8AAE8B00BD576D /* BitReader+7z.swift in Sources */, 06A3933B1DE0709300182E12 /* Deflate.swift in Sources */, + 06092A1A1FA4CB0300DE9FD5 /* CompressionMethod.swift in Sources */, 06A960601F1E7DE20078E6D1 /* 7zFileInfo.swift in Sources */, 061C062B1F0E8A1D00832F0C /* GzipHeader.swift in Sources */, 069D0FF51E0D6CD000D8AA87 /* LZMABitTreeDecoder.swift in Sources */, 06A3933C1DE0709300182E12 /* BZip2.swift in Sources */, 061C06211F0E89D900832F0C /* XZError.swift in Sources */, + 06092A241FA4CC3D00DE9FD5 /* CompressionMethod+Zip.swift in Sources */, 06A960651F1E7DF60078E6D1 /* 7zCoderInfo.swift in Sources */, 06ADB2D91EBCEFA60053A188 /* TarContainer.swift in Sources */, 0620F4C81F8E24BF001C9B7A /* DecompressionAlgorithm.swift in Sources */, diff --git a/Sources/ZIP/CompressionMethod+Zip.swift b/Sources/ZIP/CompressionMethod+Zip.swift new file mode 100644 index 00000000..3639d387 --- /dev/null +++ b/Sources/ZIP/CompressionMethod+Zip.swift @@ -0,0 +1,27 @@ +// Copyright (c) 2017 Timofey Solomko +// Licensed under MIT License +// +// See LICENSE for license information + +import Foundation + +extension CompressionMethod { + + init(_ compression: UInt16) { + switch compression { + case 0: + self = .copy + case 8: + self = .deflate + case 12: + self = .bzip2 + case 14: + self = .lzma + default: + self = .other + } + } + +} + + diff --git a/Sources/ZIP/ZipContainer.swift b/Sources/ZIP/ZipContainer.swift index 3a54389c..1b9503f8 100644 --- a/Sources/ZIP/ZipContainer.swift +++ b/Sources/ZIP/ZipContainer.swift @@ -57,10 +57,10 @@ public class ZipContainer: Container { let fileBytes: [UInt8] let pointerData = DataWithPointer(data: data) pointerData.index = info.localHeader.dataOffset - switch info.localHeader.compressionMethod { - case 0: + switch info.compressionMethod { + case .copy: fileBytes = pointerData.bytes(count: uncompSize) - case 8: + case .deflate: let bitReader = BitReader(data: pointerData.data, bitOrder: .reversed) bitReader.index = pointerData.index fileBytes = try Deflate.decompress(bitReader) @@ -68,7 +68,7 @@ public class ZipContainer: Container { // Following line ensures that this is not the case. bitReader.align() pointerData.index = bitReader.index - case 12: + case .bzip2: #if (!SWCOMPRESSION_POD_ZIP) || (SWCOMPRESSION_POD_ZIP && SWCOMPRESSION_POD_BZ2) // BZip2 algorithm considers bits in a byte in a different order. let bitReader = BitReader(data: pointerData.data, bitOrder: .straight) @@ -79,7 +79,7 @@ public class ZipContainer: Container { #else throw ZipError.compressionNotSupported #endif - case 14: + case .lzma: #if (!SWCOMPRESSION_POD_ZIP) || (SWCOMPRESSION_POD_ZIP && SWCOMPRESSION_POD_LZMA) pointerData.index += 4 // Skipping LZMA SDK version and size of properties. let lzmaDecoder = try LZMADecoder(pointerData) diff --git a/Sources/ZIP/ZipEntryInfo.swift b/Sources/ZIP/ZipEntryInfo.swift index ce01721e..1cf13ac4 100644 --- a/Sources/ZIP/ZipEntryInfo.swift +++ b/Sources/ZIP/ZipEntryInfo.swift @@ -41,6 +41,8 @@ public struct ZipEntryInfo: ContainerEntryInfo { public let isTextFile: Bool public let fileSystemType: FileSystemType? + + public let compressionMethod: CompressionMethod // We don't use `DataWithPointer` as argument, because it doesn't work well in asynchronous environment. init(_ data: Data, _ offset: Int, _ currentDiskNumber: UInt32) throws { @@ -135,6 +137,9 @@ public struct ZipEntryInfo: ContainerEntryInfo { // File system type of machine where this container was created. self.fileSystemType = FileSystemType(cdEntry.versionMadeBy) + + // Compression method. + self.compressionMethod = CompressionMethod(localHeader.compressionMethod) } }