]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
TunnelsManager: Support for removing multiple tunnels at a time
authorRoopesh Chander <roop@roopc.net>
Sun, 10 Mar 2019 14:13:27 +0000 (19:43 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 10 Mar 2019 14:13:27 +0000 (19:43 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/Tunnel/TunnelsManager.swift

index a94d63d77a42f71bff71bc481c65313d2f8fa0fb..3f7d9f5f238e44327eb15121a919c875f684d4c5 100644 (file)
@@ -240,8 +240,7 @@ class TunnelsManager {
                 completionHandler(TunnelsManagerError.systemErrorOnRemoveTunnel(systemError: error!))
                 return
             }
-            if let self = self {
-                let index = self.tunnels.firstIndex(of: tunnel)!
+            if let self = self, let index = self.tunnels.firstIndex(of: tunnel) {
                 self.tunnels.remove(at: index)
                 self.tunnelsListDelegate?.tunnelRemoved(at: index, tunnel: tunnel)
             }
@@ -249,6 +248,27 @@ class TunnelsManager {
         }
     }
 
+    func removeMultiple(tunnels: [TunnelContainer], completionHandler: @escaping (TunnelsManagerError?) -> Void) {
+        removeMultiple(tunnels: ArraySlice(tunnels), completionHandler: completionHandler)
+    }
+
+    private func removeMultiple(tunnels: ArraySlice<TunnelContainer>, completionHandler: @escaping (TunnelsManagerError?) -> Void) {
+        guard let head = tunnels.first else {
+            completionHandler(nil)
+            return
+        }
+        let tail = tunnels.dropFirst()
+        remove(tunnel: head) { [weak self, tail] error in
+            DispatchQueue.main.async {
+                if let error = error {
+                    completionHandler(error)
+                } else {
+                    self?.removeMultiple(tunnels: tail, completionHandler: completionHandler)
+                }
+            }
+        }
+    }
+
     func numberOfTunnels() -> Int {
         return tunnels.count
     }