]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Importing: Import from zip in a background thread
authorRoopesh Chander <roop@roopc.net>
Wed, 14 Nov 2018 13:33:33 +0000 (19:03 +0530)
committerRoopesh Chander <roop@roopc.net>
Thu, 15 Nov 2018 08:09:56 +0000 (13:39 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/UI/iOS/TunnelsListTableViewController.swift
WireGuard/WireGuard/ZipArchive/ZipImporter.swift

index 796c030d68a92e78d6f3a8d432efc6a26cfa5055..6e774338165974d7d54cff3bb7d9e655b5c2f631 100644 (file)
@@ -160,20 +160,18 @@ class TunnelsListTableViewController: UIViewController {
     func importFromFile(url: URL) {
         guard let tunnelsManager = tunnelsManager else { return }
         if (url.pathExtension == "zip") {
-            let zipImporter = ZipImporter(url: url)
-            let configs: [TunnelConfiguration?]
-            do {
-                configs = try zipImporter.importConfigFiles()
-            } catch (let error) {
-                ErrorPresenter.showErrorAlert(error: error, from: self)
-                return
-            }
-            tunnelsManager.addMultiple(tunnelConfigurations: configs.compactMap { $0 }) { [weak self] (numberSuccessful) in
-                if numberSuccessful == configs.count {
+            ZipImporter.importConfigFiles(from: url) { (configs, error) in
+                if let error = error {
+                    ErrorPresenter.showErrorAlert(error: error, from: self)
                     return
                 }
-                self?.showErrorAlert(title: "Created \(numberSuccessful) tunnels",
-                    message: "Created \(numberSuccessful) of \(configs.count) tunnels from zip archive")
+                tunnelsManager.addMultiple(tunnelConfigurations: configs.compactMap { $0 }) { [weak self] (numberSuccessful) in
+                    if numberSuccessful == configs.count {
+                        return
+                    }
+                    self?.showErrorAlert(title: "Created \(numberSuccessful) tunnels",
+                        message: "Created \(numberSuccessful) of \(configs.count) tunnels from zip archive")
+                }
             }
         } else /* if (url.pathExtension == "conf") -- we assume everything else is a conf */ {
             let fileBaseName = url.deletingPathExtension().lastPathComponent.trimmingCharacters(in: .whitespacesAndNewlines)
index 7ee5c32fa9a9a55c09f06af67875e52fb0bc611e..4c439d46c0144bf503ec1b929934f414693414bf 100644 (file)
@@ -8,41 +8,44 @@ enum ZipImporterError: Error {
 }
 
 class ZipImporter {
-    let url: URL
-    init(url: URL) {
-        self.url = url
-    }
+    static func importConfigFiles(from url: URL, completion: @escaping ([TunnelConfiguration?], Error?) -> Void) {
+        DispatchQueue.global(qos: .userInitiated).async {
+            var unarchivedFiles: [(fileName: String, contents: Data)]
+            do {
+                unarchivedFiles = try ZipArchive.unarchive(url: url, requiredFileExtensions: ["conf"])
 
-    func importConfigFiles() throws -> [TunnelConfiguration?] {
-        var unarchivedFiles: [(fileName: String, contents: Data)] = try ZipArchive.unarchive(url: url, requiredFileExtensions: ["conf"])
+                for (i, unarchivedFile) in unarchivedFiles.enumerated().reversed() {
+                    let fileBaseName = URL(string: unarchivedFile.fileName)?.deletingPathExtension().lastPathComponent
+                    if let trimmedName = fileBaseName?.trimmingCharacters(in: .whitespacesAndNewlines), !trimmedName.isEmpty {
+                        unarchivedFiles[i].fileName = trimmedName
+                    } else {
+                        unarchivedFiles.remove(at: i)
+                    }
+                }
 
-        for (i, unarchivedFile) in unarchivedFiles.enumerated().reversed() {
-            let fileBaseName = URL(string: unarchivedFile.fileName)?.deletingPathExtension().lastPathComponent
-            if let trimmedName = fileBaseName?.trimmingCharacters(in: .whitespacesAndNewlines), !trimmedName.isEmpty {
-                unarchivedFiles[i].fileName = trimmedName
-            } else {
-                unarchivedFiles.remove(at: i)
+                if (unarchivedFiles.isEmpty) {
+                    throw ZipImporterError.noTunnelsInZipArchive
+                }
+            } catch (let error) {
+                DispatchQueue.main.async { completion([], error) }
+                return
             }
-        }
-
-        if (unarchivedFiles.isEmpty) {
-            throw ZipImporterError.noTunnelsInZipArchive
-        }
 
-        unarchivedFiles.sort { $0.fileName < $1.fileName }
-        var configs = Array<TunnelConfiguration?>(repeating: nil, count: unarchivedFiles.count)
-        for (i, file) in unarchivedFiles.enumerated() {
-            if (i > 0 && file == unarchivedFiles[i - 1]) {
-                continue
-            }
-            guard let fileContents = String(data: file.contents, encoding: .utf8) else {
-                continue
-            }
-            guard let tunnelConfig = try? WgQuickConfigFileParser.parse(fileContents, name: file.fileName) else {
-                continue
+            unarchivedFiles.sort { $0.fileName < $1.fileName }
+            var configs = Array<TunnelConfiguration?>(repeating: nil, count: unarchivedFiles.count)
+            for (i, file) in unarchivedFiles.enumerated() {
+                if (i > 0 && file == unarchivedFiles[i - 1]) {
+                    continue
+                }
+                guard let fileContents = String(data: file.contents, encoding: .utf8) else {
+                    continue
+                }
+                guard let tunnelConfig = try? WgQuickConfigFileParser.parse(fileContents, name: file.fileName) else {
+                    continue
+                }
+                configs[i] = tunnelConfig
             }
-            configs[i] = tunnelConfig
+            DispatchQueue.main.async { completion(configs, nil) }
         }
-        return configs
     }
 }