77//
88
99import Foundation
10- #if os(iOS)
1110import ThunderRequest
12- #elseif os(macOS)
13- import ThunderRequestMac
14- #endif
1511
1612import SystemConfiguration
1713import os
@@ -33,7 +29,8 @@ protocol DeviceDiscovererDelegate {
3329 /// - Parameters:
3430 /// - discoverer: The discoverer object that discovered a device.
3531 /// - discovered: The device that it discovered.
36- func deviceDiscoverer< T: DeviceDiscoverer > ( _ discoverer: T , discovered device: Camera )
32+ /// - isCached: Whether the device was loaded from a cached xml discovery file.
33+ func deviceDiscoverer< T: DeviceDiscoverer > ( _ discoverer: T , discovered device: Camera , isCached: Bool )
3734}
3835
3936/// A protocol to be implemented by device discovery implementations
@@ -73,10 +70,13 @@ public protocol CameraDiscovererDelegate {
7370
7471 /// Called when a camera device is discovered
7572 ///
73+ /// - Note: if `isCached == true` you should be cautious auto-connecting to the camera (Especially if it's a transfer device) as cameras in transfer mode can advertise multiple connectivity methods and the correct one may not be returned until it's passed to you with `isCached == false`.
74+ ///
7675 /// - Parameters:
7776 /// - discoverer: The discoverer object that discovered a device.
7877 /// - discovered: The device that it discovered.
79- func cameraDiscoverer( _ discoverer: CameraDiscoverer , discovered device: Camera )
78+ /// - isCached: Whether the camera was loaded from a cached xml file url.
79+ func cameraDiscoverer( _ discoverer: CameraDiscoverer , discovered device: Camera , isCached: Bool )
8080}
8181
8282/// A class which enables the discovery of cameras
@@ -85,10 +85,10 @@ public final class CameraDiscoverer {
8585 /// A delegate which will have methods called on it when cameras are discovered or an error occurs.
8686 public var delegate : CameraDiscovererDelegate ?
8787
88- private var discoveredCameras : [ Camera ] = [ ]
88+ private var discoveredCameras : [ ( camera : Camera , isCached : Bool ) ] = [ ]
8989
9090 /// A map of cameras by the SSID the local device was connected to when they were discovered
91- public var camerasBySSID : [ String ? : [ Camera ] ] = [ : ]
91+ public var camerasBySSID : [ String ? : [ ( camera : Camera , isCached : Bool ) ] ] = [ : ]
9292
9393 var discoverers : [ DeviceDiscoverer ] = [ ]
9494
@@ -133,20 +133,30 @@ public final class CameraDiscoverer {
133133
134134extension CameraDiscoverer : DeviceDiscovererDelegate {
135135
136- func deviceDiscoverer< T> ( _ discoverer: T , didError error: Error ) where T : DeviceDiscoverer {
137- delegate? . cameraDiscoverer ( self , didError: error)
138- }
139-
140- func deviceDiscoverer< T> ( _ discoverer: T , discovered device: Camera ) where T : DeviceDiscoverer {
136+ func deviceDiscoverer< T> ( _ discoverer: T , discovered device: Camera , isCached: Bool ) where T : DeviceDiscoverer {
141137
142- guard !discoveredCameras. contains ( where: {
143- $0. identifier == device. identifier
144- } ) else {
138+ if let previouslyDiscoveredCamera = discoveredCameras. enumerated ( ) . first ( where: {
139+ $0. element. camera. identifier == device. identifier
140+ } ) {
141+ // If we went from non-cached, to cached, let the delegate know!
142+ if previouslyDiscoveredCamera. element. isCached && !isCached {
143+ discoveredCameras [ previouslyDiscoveredCamera. offset] = ( device, isCached)
144+ if var camerasForSSID = camerasBySSID [ Reachability . currentWiFiSSID] , let indexInCamerasForSSID = camerasForSSID. firstIndex ( where: { $0. camera. identifier == device. identifier } ) {
145+ camerasForSSID [ indexInCamerasForSSID] = ( device, isCached)
146+ camerasBySSID [ Reachability . currentWiFiSSID] = camerasForSSID
147+ }
148+ delegate? . cameraDiscoverer ( self , discovered: device, isCached: false )
149+ }
145150 return
146151 }
147152
148- camerasBySSID [ Reachability . currentWiFiSSID, default: [ ] ] . append ( device)
149- discoveredCameras. append ( device)
150- delegate? . cameraDiscoverer ( self , discovered: device)
153+ camerasBySSID [ Reachability . currentWiFiSSID, default: [ ] ] . append ( ( device, isCached) )
154+ discoveredCameras. append ( ( device, isCached) )
155+ delegate? . cameraDiscoverer ( self , discovered: device, isCached: isCached)
156+ }
157+
158+
159+ func deviceDiscoverer< T> ( _ discoverer: T , didError error: Error ) where T : DeviceDiscoverer {
160+ delegate? . cameraDiscoverer ( self , didError: error)
151161 }
152162}
0 commit comments