浏览代码

CocoaSpice: update USB manager to support async

osy 1 年之前
父节点
当前提交
d1e547eec1

+ 21 - 18
Platform/iOS/VMSessionState.swift

@@ -293,17 +293,24 @@ extension VMSessionState: CSUSBManagerDelegate {
         }
     }
     
-    private func withUsbManagerSerialized<T>(_ task: @escaping () async -> T, onComplete: @escaping @MainActor (T) -> Void) {
+    private func withUsbManagerSerialized<T>(_ task: @escaping () async throws -> T, onSuccess: @escaping @MainActor (T) -> Void = { _ in }, onError: @escaping @MainActor (Error) -> Void = { _ in }) {
         usbManagerQueue.async {
             let event = DispatchSemaphore(value: 0)
             Task.detached { [self] in
                 await MainActor.run {
                     isUsbBusy = true
                 }
-                let result = await task()
-                await MainActor.run {
-                    isUsbBusy = false
-                    onComplete(result)
+                do {
+                    let result = try await task()
+                    await MainActor.run {
+                        isUsbBusy = false
+                        onSuccess(result)
+                    }
+                } catch {
+                    await MainActor.run {
+                        isUsbBusy = false
+                        onError(error)
+                    }
                 }
                 event.signal()
             }
@@ -323,7 +330,7 @@ extension VMSessionState: CSUSBManagerDelegate {
                 logger.debug("found device: \(name ?? "(unknown)")")
             }
             return devices
-        } onComplete: { devices in
+        } onSuccess: { devices in
             self.allUsbDevices = devices
         }
     }
@@ -338,13 +345,11 @@ extension VMSessionState: CSUSBManagerDelegate {
             return
         }
         withUsbManagerSerialized {
-            await usbManager.connectUsbDevice(usbDevice)
-        } onComplete: { success, message in
-            if success {
-                self.connectedUsbDevices.append(usbDevice)
-            } else {
-                self.nonfatalError = message
-            }
+            try await usbManager.connectUsbDevice(usbDevice)
+        } onSuccess: {
+            self.connectedUsbDevices.append(usbDevice)
+        } onError: { error in
+            self.nonfatalError = error.localizedDescription
         }
     }
     
@@ -358,12 +363,10 @@ extension VMSessionState: CSUSBManagerDelegate {
             return
         }
         withUsbManagerSerialized {
-            await usbManager.disconnectUsbDevice(usbDevice)
-        } onComplete: { success, message in
-            if !success {
-                self.nonfatalError = message
-            }
             self.connectedUsbDevices.removeAll(where: { $0 == usbDevice })
+            try await usbManager.disconnectUsbDevice(usbDevice)
+        } onError: { error in
+            self.nonfatalError = error.localizedDescription
         }
     }
     

+ 25 - 27
Platform/macOS/Display/VMDisplayQemuDisplayController.swift

@@ -352,15 +352,15 @@ extension VMDisplayQemuWindowController: CSUSBManagerDelegate {
             guard response == .alertFirstButtonReturn else {
                 return
             }
-            DispatchQueue.global(qos: .utility).async {
-                usbManager.connectUsbDevice(usbDevice) { (result, message) in
-                    DispatchQueue.main.async {
-                        if let msg = message {
-                            self.showErrorAlert(msg)
-                        }
-                        if result {
-                            self.connectedUsbDevices.append(usbDevice)
-                        }
+            Task.detached {
+                do {
+                    try await usbManager.connectUsbDevice(usbDevice)
+                    await MainActor.run {
+                        self.connectedUsbDevices.append(usbDevice)
+                    }
+                } catch {
+                    await MainActor.run {
+                        self.showErrorAlert(error.localizedDescription)
                     }
                 }
             }
@@ -434,15 +434,15 @@ extension VMDisplayQemuWindowController {
             return
         }
         let device = allUsbDevices[menu.tag]
-        DispatchQueue.global(qos: .utility).async {
-            usbManager.connectUsbDevice(device) { (result, message) in
-                DispatchQueue.main.async {
-                    if let msg = message {
-                        self.showErrorAlert(msg)
-                    }
-                    if result {
-                        self.connectedUsbDevices.append(device)
-                    }
+        Task.detached {
+            do {
+                try await usbManager.connectUsbDevice(device)
+                await MainActor.run {
+                    self.connectedUsbDevices.append(device)
+                }
+            } catch {
+                await MainActor.run {
+                    self.showErrorAlert(error.localizedDescription)
                 }
             }
         }
@@ -458,15 +458,13 @@ extension VMDisplayQemuWindowController {
             return
         }
         let device = allUsbDevices[menu.tag]
-        DispatchQueue.global(qos: .utility).async {
-            usbManager.disconnectUsbDevice(device) { (result, message) in
-                DispatchQueue.main.async {
-                    if let msg = message {
-                        self.showErrorAlert(msg)
-                    }
-                    if result {
-                        self.connectedUsbDevices.removeAll(where: { $0 == device })
-                    }
+        connectedUsbDevices.removeAll(where: { $0 == device })
+        Task.detached {
+            do {
+                try await usbManager.disconnectUsbDevice(device)
+            } catch {
+                await MainActor.run {
+                    self.showErrorAlert(error.localizedDescription)
                 }
             }
         }

+ 1 - 1
UTM.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -15,7 +15,7 @@
       "location" : "https://github.com/utmapp/CocoaSpice.git",
       "state" : {
         "branch" : "visionos",
-        "revision" : "5405e085b9bc45ab13a862ddea350fdf660db86d"
+        "revision" : "4529c9686259e8d1e94d6253ad2e3a563fd1498d"
       }
     },
     {