-
Notifications
You must be signed in to change notification settings - Fork 1
/
BonjourDiscovery.swift
105 lines (79 loc) · 2.56 KB
/
BonjourDiscovery.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//
// BonjourDiscovery.swift
// Bonjour
//
// Created by Steven on 19/7/14.
// Copyright (c) 2014 Magical Bits. All rights reserved.
//
import Foundation
class BonjoourDiscovery: NSObject, NSNetServiceBrowserDelegate, NSNetServiceDelegate {
var browser: NSNetServiceBrowser
var services: Array<NSNetService>
var connectedService: NSNetService?
var connected: Bool
var serviceType: NSString
var serviceDomain: NSString
init() {
browser = NSNetServiceBrowser()
services = []
connected = false
serviceType = "_wirelessdrive._tcp."
serviceDomain = "local."
}
// Make a singleton
class var sharedInstance : BonjoourDiscovery {
struct Static {
static var onceToken : dispatch_once_t = 0
static var instance : BonjoourDiscovery? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = BonjoourDiscovery()
}
return Static.instance!
}
func setServiceType(type: NSString) {
serviceType = type
}
func setServiceDomain(domain: NSString) {
serviceDomain = domain
}
func startDiscovery() {
browser.delegate = self
browser.searchForServicesOfType(serviceType, inDomain: serviceDomain)
}
func stopDiscovery() {
browser.stop()
}
// NSNetService
func connectToService(aService: NSNetService!) {
if (connected) {
self.disconnect()
}
aService.delegate = self
aService .resolveWithTimeout(30)
}
func disconnect() {
connectedService = nil
connected = false
}
// NSNetServiceBrowser delegate
func netServiceBrowser(aNetServiceBrowser: NSNetServiceBrowser!, didFindService aNetService: NSNetService!, moreComing: Bool) {
services += aNetService
}
func netServiceBrowser(aNetServiceBrowser: NSNetServiceBrowser!, didRemoveService aNetService: NSNetService!, moreComing: Bool) {
if aNetService == connectedService {
self.disconnect()
}
if let index = services.indexOf(aNetService) {
services.removeAtIndex(index)
}
}
// NSNetServiceDelegate
func netServiceDidResolveAddress(netservice: NSNetService!) {
NSLog("Resolved service \(netservice.description)")
}
func netService(netservice: NSNetService!,
didNotResolve errorDict: [NSObject : AnyObject]!) {
NSLog("Failed to resolve service")
}
}