|
@@ -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 {
|
|
usbManagerQueue.async {
|
|
let event = DispatchSemaphore(value: 0)
|
|
let event = DispatchSemaphore(value: 0)
|
|
Task.detached { [self] in
|
|
Task.detached { [self] in
|
|
await MainActor.run {
|
|
await MainActor.run {
|
|
isUsbBusy = true
|
|
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()
|
|
event.signal()
|
|
}
|
|
}
|
|
@@ -323,7 +330,7 @@ extension VMSessionState: CSUSBManagerDelegate {
|
|
logger.debug("found device: \(name ?? "(unknown)")")
|
|
logger.debug("found device: \(name ?? "(unknown)")")
|
|
}
|
|
}
|
|
return devices
|
|
return devices
|
|
- } onComplete: { devices in
|
|
|
|
|
|
+ } onSuccess: { devices in
|
|
self.allUsbDevices = devices
|
|
self.allUsbDevices = devices
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -338,13 +345,11 @@ extension VMSessionState: CSUSBManagerDelegate {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
withUsbManagerSerialized {
|
|
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
|
|
return
|
|
}
|
|
}
|
|
withUsbManagerSerialized {
|
|
withUsbManagerSerialized {
|
|
- await usbManager.disconnectUsbDevice(usbDevice)
|
|
|
|
- } onComplete: { success, message in
|
|
|
|
- if !success {
|
|
|
|
- self.nonfatalError = message
|
|
|
|
- }
|
|
|
|
self.connectedUsbDevices.removeAll(where: { $0 == usbDevice })
|
|
self.connectedUsbDevices.removeAll(where: { $0 == usbDevice })
|
|
|
|
+ try await usbManager.disconnectUsbDevice(usbDevice)
|
|
|
|
+ } onError: { error in
|
|
|
|
+ self.nonfatalError = error.localizedDescription
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|