Skip to content

Commit 231bbd7

Browse files
committed
Merge develop into master
2 parents 1f6c0d9 + 9c082d2 commit 231bbd7

20 files changed

Lines changed: 362 additions & 662 deletions

.travis.yml

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
language: swift
22
xcode_project: Rocc.xcodeproj # path to your xcodeproj folder
33
xcode_scheme: Rocc
4-
osx_image: xcode10.2
4+
osx_image: xcode11.3
55
env:
66
global:
77
- LC_CTYPE=en_US.UTF-8
88
- LANG=en_US.UTF-8
99
- IOS_FRAMEWORK_SCHEME="Rocc"
1010
- TVOS_FRAMEWORK_SCHEME=""
11-
- OSX_FRAMEWORK_SCHEME="RoccMac"
12-
- IOS_SDK=iphonesimulator12.2
13-
- TVOS_SDK=appletvsimulator12.2
14-
- OSX_SDK=macosx10.14
11+
- OSX_FRAMEWORK_SCHEME="Rocc"
12+
- IOS_SDK=iphonesimulator13.2
13+
- TVOS_SDK=appletvsimulator13.2
14+
- OSX_SDK=macosx10.15
1515
matrix:
16-
- DESTINATION="OS=11.0.1,name=iPhone 5s" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
17-
- DESTINATION="OS=11.0.1,name=iPhone 8 Plus" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
18-
- DESTINATION="OS=11.1,name=iPhone 8" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
19-
- DESTINATION="OS=11.2,name=iPhone 8" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
20-
- DESTINATION="OS=11.1,name=iPhone 8 Plus" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
21-
- DESTINATION="OS=11.2,name=iPhone 8 Plus" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
22-
- DESTINATION="OS=12.0,name=iPhone 8 Plus" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
23-
- DESTINATION="OS=12.0,name=iPhone X" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
24-
- DESTINATION="OS=12.2,name=iPhone Xʀ" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
25-
- DESTINATION="OS=12.2,name=iPhone XS Max" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
26-
- DESTINATION="arch=x86_64" SCHEME="$OSX_FRAMEWORK_SCHEME" SDK="$OSX_SDK" RUN_TESTS="NO" BUILD_EXAMPLE="NO" POD_LINT="NO"
16+
- DESTINATION="OS=13.3,name=iPhone 11 Pro Max" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO"
2717
script:
2818
- set -o pipefail
2919
- xcodebuild -version

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<a href="https://travis-ci.org/simonmitchell/rocc">
66
<img alt="Build Status" src="https://travis-ci.org/simonmitchell/rocc.svg">
77
</a>
8-
<a href="https://swift.org/blog/swift-4-2-released/">
9-
<img alt="Swift 5.0" src="http://img.shields.io/badge/swift-5.0-brightgreen.svg">
8+
<a href="https://swift.org/blog/swift-5-1-released/">
9+
<img alt="Swift 5.0" src="http://img.shields.io/badge/swift-5.1-brightgreen.svg">
1010
</a>
1111
<a href="https://github.com/simonmitchell/rocc/blob/master/README.md">
1212
<img alt="MIT" src="https://img.shields.io/badge/license-MIT-brightgreen.svg">

Rocc.xcodeproj/project.pbxproj

Lines changed: 30 additions & 384 deletions
Large diffs are not rendered by default.

Rocc/Device Discovery/DeviceDiscovery.swift

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
//
88

99
import Foundation
10-
#if os(iOS)
1110
import ThunderRequest
12-
#elseif os(macOS)
13-
import ThunderRequestMac
14-
#endif
1511

1612
import SystemConfiguration
1713
import 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

134134
extension 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
}

Rocc/Device Discovery/UDPDeviceDiscoverer.swift

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@
88

99
import Foundation
1010
import os
11-
#if os(macOS)
12-
import ThunderRequestMac
13-
#else
1411
import ThunderRequest
15-
#endif
1612
import SystemConfiguration
1713

1814
extension UserDefaults {
@@ -96,7 +92,7 @@ class UDPDeviceDiscoverer: DeviceDiscoverer {
9692

9793
urls.forEach { (url) in
9894

99-
parseDeviceInfo(at: url) { [weak self] (error) in
95+
parseDeviceInfo(at: url, isCached: true) { [weak self] (error) in
10096
guard let strongSelf = self else {
10197
return
10298
}
@@ -170,7 +166,7 @@ class UDPDeviceDiscoverer: DeviceDiscoverer {
170166
Logger.log(message: "Did find device at \(device.ddURL.absoluteString)", category: "UDPDeviceDiscoverer")
171167
os_log("Did find device at: %{public}@", log: self.log, type: .debug, device.ddURL.absoluteString)
172168

173-
self.parseDeviceInfo(at: device.ddURL)
169+
self.parseDeviceInfo(at: device.ddURL, isCached: false)
174170
}
175171
}
176172

@@ -185,7 +181,7 @@ class UDPDeviceDiscoverer: DeviceDiscoverer {
185181
udpClient.finishSearching(with: callback)
186182
}
187183

188-
private func parseDeviceInfo(at url: URL, callback: ((_ error: Error?) -> Void)? = nil) {
184+
private func parseDeviceInfo(at url: URL, isCached: Bool, callback: ((_ error: Error?) -> Void)? = nil) {
189185

190186
let lastPathComponent = url.lastPathComponent
191187
let baseURL = url.deletingLastPathComponent()
@@ -210,7 +206,7 @@ class UDPDeviceDiscoverer: DeviceDiscoverer {
210206

211207
Logger.log(message: "Parsing device info", category: "UDPDeviceDiscoverer")
212208
os_log("Parsing device info", log: strongSelf.log, type: .debug)
213-
strongSelf.parseDevice(from: stringResponse, baseURL: baseURL, callback: { [weak strongSelf] parsed in
209+
strongSelf.parseDevice(from: stringResponse, isCached: isCached, baseURL: baseURL, callback: { [weak strongSelf] parsed in
214210

215211
// If we parsed a device, cache it's url!
216212
guard parsed else { return }
@@ -247,7 +243,7 @@ class UDPDeviceDiscoverer: DeviceDiscoverer {
247243
}
248244
}
249245

250-
func parseDevice(from stringRepresentation: String, baseURL: URL, callback: @escaping (_ bool: Bool) -> Void) {
246+
func parseDevice(from stringRepresentation: String, isCached: Bool, baseURL: URL, callback: @escaping (_ bool: Bool) -> Void) {
251247

252248

253249
}
@@ -259,10 +255,10 @@ class UDPDeviceDiscoverer: DeviceDiscoverer {
259255
delegate?.deviceDiscoverer(self, didError: error)
260256
}
261257

262-
func sendDeviceToDelegate(_ camera: Camera) {
258+
func sendDeviceToDelegate(_ camera: Camera, isCached: Bool) {
263259

264260
Logger.log(message: "Letting delegate know about discovered device with name: \(camera.name ?? "Unknown")", category: "UDPDeviceDiscoverer")
265261
os_log("Letting delegate know about discovered device with name: %{public}@", log: log, type: .debug, camera.name ?? "Unknown")
266-
delegate?.deviceDiscoverer(self, discovered: camera)
262+
delegate?.deviceDiscoverer(self, discovered: camera, isCached: isCached)
267263
}
268264
}

Rocc/Device Discovery/UPnPParsers.swift

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,7 @@ internal final class UPnPDeviceParser: NSObject, XMLParserDelegate {
199199
guard scope.last == elementName else { return }
200200

201201
foundCharacters = foundCharacters.trimmingCharacters(in: .whitespacesAndNewlines)
202-
203-
os_log("Parser did start element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
204-
202+
205203
defer {
206204
currentElement = scope.removeLast()
207205
foundCharacters = ""
@@ -344,9 +342,7 @@ internal final class UPnPFolderParser: NSObject, XMLParserDelegate {
344342

345343
currentElement = elementName
346344
scope.append(elementName)
347-
348-
os_log("Parser did start element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
349-
345+
350346
switch elementName {
351347
case "container":
352348
currentFolder = attributeDict
@@ -368,7 +364,6 @@ internal final class UPnPFolderParser: NSObject, XMLParserDelegate {
368364
defer {
369365
currentElement = scope.removeLast()
370366
foundCharacters = ""
371-
os_log("Parser did end element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
372367
}
373368

374369
switch elementName {
@@ -592,9 +587,7 @@ internal final class UPnPFileParser: NSObject, XMLParserDelegate {
592587

593588
currentElement = elementName
594589
scope.append(elementName)
595-
596-
os_log("Parser did start element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
597-
590+
598591
switch elementName {
599592
case "item":
600593
currentFile = attributeDict
@@ -619,7 +612,6 @@ internal final class UPnPFileParser: NSObject, XMLParserDelegate {
619612
defer {
620613
currentElement = scope.removeLast()
621614
foundCharacters = ""
622-
os_log("Parser did end element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
623615
}
624616

625617
switch elementName {

Rocc/Helpers/Logging/Logger.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@
88

99
import Foundation
1010
import os.log
11-
#if os(macOS)
12-
import ThunderRequestMac
13-
#elseif os(iOS)
1411
import ThunderRequest
15-
#endif
1612

1713
/// A simple class for logging to a given file url
1814
public final class Logger {
@@ -67,6 +63,10 @@ public final class Logger {
6763

6864
private func log(_ message: String, category: String) {
6965

66+
#if DEBUG
67+
print("[\(category)] \(message)")
68+
#endif
69+
7070
guard let fileURL = fileURL, let logQueue = logQueue else { return }
7171

7272
logQueue.sync {

Rocc/Helpers/Networking/SOAPRequestBody.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@
99
import os.log
1010

1111
import Foundation
12-
#if os(iOS)
1312
import ThunderRequest
14-
#elseif os(macOS)
15-
import ThunderRequestMac
16-
#endif
13+
1714

1815
struct SOAPRequestBody {
1916

@@ -105,8 +102,6 @@ internal final class SOAPResponseParser: NSObject, XMLParserDelegate {
105102

106103
currentElement = elementName
107104
scope.append(elementName)
108-
109-
os_log("Parser did start element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
110105
}
111106

112107
func parser(_ parser: XMLParser, foundCharacters string: String) {
@@ -122,7 +117,6 @@ internal final class SOAPResponseParser: NSObject, XMLParserDelegate {
122117
defer {
123118
currentElement = scope.removeLast()
124119
foundCharacters = ""
125-
os_log("Parser did end element: %@\nCurrent scope:%@", log: log, type: .debug, elementName, scope)
126120
}
127121

128122
// We are inside the device info object

0 commit comments

Comments
 (0)