Zip: Add zip file reader
This commit is contained in:
parent
3a58dd9481
commit
2d41591cfd
|
@ -33,6 +33,7 @@
|
||||||
6FDEF7FB21863B6100D8FBF6 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F621863B6100D8FBF6 /* unzip.c */; };
|
6FDEF7FB21863B6100D8FBF6 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F621863B6100D8FBF6 /* unzip.c */; };
|
||||||
6FDEF7FC21863B6100D8FBF6 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F721863B6100D8FBF6 /* zip.c */; };
|
6FDEF7FC21863B6100D8FBF6 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F721863B6100D8FBF6 /* zip.c */; };
|
||||||
6FDEF80021863C0100D8FBF6 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7FF21863C0100D8FBF6 /* ioapi.c */; };
|
6FDEF80021863C0100D8FBF6 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7FF21863C0100D8FBF6 /* ioapi.c */; };
|
||||||
|
6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF801218646B900D8FBF6 /* ZipArchive.swift */; };
|
||||||
6FF4AC1F211EC472002C96EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC1E211EC472002C96EB /* Assets.xcassets */; };
|
6FF4AC1F211EC472002C96EB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC1E211EC472002C96EB /* Assets.xcassets */; };
|
||||||
6FF4AC22211EC472002C96EB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC20211EC472002C96EB /* LaunchScreen.storyboard */; };
|
6FF4AC22211EC472002C96EB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6FF4AC20211EC472002C96EB /* LaunchScreen.storyboard */; };
|
||||||
6FF4AC472120B9E0002C96EB /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FF4AC462120B9E0002C96EB /* NetworkExtension.framework */; };
|
6FF4AC472120B9E0002C96EB /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FF4AC462120B9E0002C96EB /* NetworkExtension.framework */; };
|
||||||
|
@ -103,6 +104,7 @@
|
||||||
6FDEF7FA21863B6100D8FBF6 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
|
6FDEF7FA21863B6100D8FBF6 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
|
||||||
6FDEF7FE21863C0100D8FBF6 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
|
6FDEF7FE21863C0100D8FBF6 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
|
||||||
6FDEF7FF21863C0100D8FBF6 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
|
6FDEF7FF21863C0100D8FBF6 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
|
||||||
|
6FDEF801218646B900D8FBF6 /* ZipArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZipArchive.swift; sourceTree = "<group>"; };
|
||||||
6FF4AC14211EC46F002C96EB /* WireGuard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WireGuard.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
6FF4AC14211EC46F002C96EB /* WireGuard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WireGuard.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
6FF4AC1E211EC472002C96EB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
6FF4AC1E211EC472002C96EB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
6FF4AC21211EC472002C96EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
6FF4AC21211EC472002C96EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
|
@ -216,6 +218,7 @@
|
||||||
6FDEF7E72186320E00D8FBF6 /* ZipArchive */ = {
|
6FDEF7E72186320E00D8FBF6 /* ZipArchive */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
6FDEF801218646B900D8FBF6 /* ZipArchive.swift */,
|
||||||
6FDEF7F421863B6100D8FBF6 /* 3rdparty */,
|
6FDEF7F421863B6100D8FBF6 /* 3rdparty */,
|
||||||
);
|
);
|
||||||
path = ZipArchive;
|
path = ZipArchive;
|
||||||
|
@ -449,6 +452,7 @@
|
||||||
6F628C41217F47DB003482A3 /* TunnelDetailTableViewController.swift in Sources */,
|
6F628C41217F47DB003482A3 /* TunnelDetailTableViewController.swift in Sources */,
|
||||||
6F6899B02181B07B0012E523 /* FilePicker.swift in Sources */,
|
6F6899B02181B07B0012E523 /* FilePicker.swift in Sources */,
|
||||||
6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */,
|
6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */,
|
||||||
|
6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */,
|
||||||
6F7774E1217181B1006A79B3 /* MainViewController.swift in Sources */,
|
6F7774E1217181B1006A79B3 /* MainViewController.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -690,6 +694,7 @@
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
|
"OTHER_CFLAGS[arch=*]" = "-DNOCRYPT";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "WireGuard/WireGuard-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "WireGuard/WireGuard-Bridging-Header.h";
|
||||||
|
@ -713,6 +718,7 @@
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
|
"OTHER_CFLAGS[arch=*]" = "-DNOCRYPT";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(APP_ID)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "WireGuard/WireGuard-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "WireGuard/WireGuard-Bridging-Header.h";
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright © 2018 WireGuard LLC. All rights reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
enum ZipArchiveError: Error {
|
||||||
|
case cantOpenInputZipFile
|
||||||
|
case badArchive
|
||||||
|
}
|
||||||
|
|
||||||
|
class ZipArchive {
|
||||||
|
|
||||||
|
static func unarchive(url: URL, requiredFileExtensions: [String]) throws -> [(fileName: String, contents: Data)] {
|
||||||
|
|
||||||
|
var results: [(fileName: String, contents: Data)] = []
|
||||||
|
|
||||||
|
guard let zipFile = unzOpen64(url.path) else {
|
||||||
|
throw ZipArchiveError.cantOpenInputZipFile
|
||||||
|
}
|
||||||
|
defer {
|
||||||
|
unzClose(zipFile)
|
||||||
|
}
|
||||||
|
guard (unzGoToFirstFile(zipFile) == UNZ_OK) else {
|
||||||
|
throw ZipArchiveError.badArchive
|
||||||
|
}
|
||||||
|
|
||||||
|
var resultOfGoToNextFile: Int32
|
||||||
|
repeat {
|
||||||
|
guard (unzOpenCurrentFile(zipFile) == UNZ_OK) else {
|
||||||
|
throw ZipArchiveError.badArchive
|
||||||
|
}
|
||||||
|
|
||||||
|
let bufferSize = 1024
|
||||||
|
var fileNameBuffer = UnsafeMutablePointer<Int8>.allocate(capacity: bufferSize)
|
||||||
|
var dataBuffer = UnsafeMutablePointer<Int8>.allocate(capacity: bufferSize)
|
||||||
|
|
||||||
|
defer {
|
||||||
|
fileNameBuffer.deallocate()
|
||||||
|
dataBuffer.deallocate()
|
||||||
|
}
|
||||||
|
|
||||||
|
guard (unzGetCurrentFileInfo64(zipFile, nil, fileNameBuffer, UInt(bufferSize), nil, 0, nil, 0) == UNZ_OK) else {
|
||||||
|
throw ZipArchiveError.badArchive
|
||||||
|
}
|
||||||
|
|
||||||
|
let fileName = String(cString: fileNameBuffer)
|
||||||
|
let fileExtension = URL(string: fileName)?.pathExtension ?? ""
|
||||||
|
|
||||||
|
if (requiredFileExtensions.contains(fileExtension)) {
|
||||||
|
var unzippedData = Data()
|
||||||
|
var bytesRead: Int32 = 0
|
||||||
|
repeat {
|
||||||
|
bytesRead = unzReadCurrentFile(zipFile, dataBuffer, UInt32(bufferSize))
|
||||||
|
if (bytesRead > 0) {
|
||||||
|
let dataRead = dataBuffer.withMemoryRebound(to: UInt8.self, capacity: bufferSize) {
|
||||||
|
(buf: UnsafeMutablePointer<UInt8>) -> Data in
|
||||||
|
return Data(bytes: buf, count: Int(bytesRead))
|
||||||
|
}
|
||||||
|
unzippedData.append(dataRead)
|
||||||
|
}
|
||||||
|
} while (bytesRead > 0)
|
||||||
|
results.append((fileName: fileName, contents: unzippedData))
|
||||||
|
}
|
||||||
|
|
||||||
|
guard (unzCloseCurrentFile(zipFile) == UNZ_OK) else {
|
||||||
|
throw ZipArchiveError.badArchive
|
||||||
|
}
|
||||||
|
|
||||||
|
resultOfGoToNextFile = unzGoToNextFile(zipFile)
|
||||||
|
} while (resultOfGoToNextFile == UNZ_OK)
|
||||||
|
|
||||||
|
if (resultOfGoToNextFile == UNZ_END_OF_LIST_OF_FILE) {
|
||||||
|
return results
|
||||||
|
} else {
|
||||||
|
throw ZipArchiveError.badArchive
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue