@@ -12,14 +12,14 @@ import CHeaders
12
12
13
13
class BroadcastServerSocketConnection : NSObject {
14
14
private let streamDelegate : StreamDelegate
15
-
15
+
16
16
private let filePath : String
17
17
private var socketHandle : Int32 = - 1
18
18
private var address : sockaddr_un ?
19
19
20
20
private var inputStream : InputStream ?
21
21
private var outputStream : OutputStream ?
22
-
22
+
23
23
private var listeningSource : DispatchSourceRead ?
24
24
private var networkQueue : DispatchQueue ?
25
25
private var shouldKeepRunning = false
@@ -37,17 +37,17 @@ class BroadcastServerSocketConnection: NSObject {
37
37
38
38
func open( ) -> Bool {
39
39
logger. log ( level: . debug, " open socket connection " )
40
-
40
+
41
41
guard setupAddress ( ) == true else {
42
42
logger. log ( level: . debug, " failed setting up address " )
43
-
43
+
44
44
return false
45
45
}
46
-
46
+
47
47
guard bindSocket ( ) == true else {
48
48
return false
49
49
}
50
-
50
+
51
51
guard FileManager . default. fileExists ( atPath: filePath) else {
52
52
logger. log ( level: . debug, " failure: socket file missing " )
53
53
return false
@@ -56,24 +56,24 @@ class BroadcastServerSocketConnection: NSObject {
56
56
logger. log ( level: . debug, " failure: socket failed listening connection " )
57
57
return false
58
58
}
59
-
59
+
60
60
let listeningSource = DispatchSource . makeReadSource ( fileDescriptor: socketHandle)
61
61
listeningSource. setEventHandler {
62
62
let clientSocket = Darwin . accept ( self . socketHandle, nil , nil )
63
-
63
+
64
64
guard clientSocket >= 0 else {
65
65
logger. log ( level: . debug, " failure: socket failed accepting connection " )
66
66
return
67
67
}
68
-
68
+
69
69
self . setupStreams ( clientSocket: clientSocket)
70
-
70
+
71
71
self . inputStream? . open ( )
72
72
self . outputStream? . open ( )
73
-
73
+
74
74
logger. log ( level: . debug, " streams open " )
75
75
}
76
-
76
+
77
77
self . listeningSource = listeningSource
78
78
listeningSource. resume ( )
79
79
return true
@@ -87,10 +87,10 @@ class BroadcastServerSocketConnection: NSObject {
87
87
88
88
inputStream? . close ( )
89
89
outputStream? . close ( )
90
-
90
+
91
91
inputStream = nil
92
92
outputStream = nil
93
-
93
+
94
94
logger. log ( level: . debug, " closing server socket " )
95
95
listeningSource? . cancel ( )
96
96
Darwin . close ( socketHandle)
@@ -99,25 +99,25 @@ class BroadcastServerSocketConnection: NSObject {
99
99
func writeToStream( buffer: UnsafePointer < UInt8 > , maxLength length: Int ) -> Int {
100
100
outputStream? . write ( buffer, maxLength: length) ?? 0
101
101
}
102
-
102
+
103
103
private func setupAddress( ) -> Bool {
104
104
var addr = sockaddr_un ( )
105
- addr. sun_family = sa_family_t ( AF_UNIX) ;
105
+ addr. sun_family = sa_family_t ( AF_UNIX)
106
106
guard filePath. count < MemoryLayout . size ( ofValue: addr. sun_path) else {
107
107
logger. log ( level: . debug, " failure: fd path is too long " )
108
108
return false
109
109
}
110
-
110
+
111
111
_ = filePath. withCString {
112
112
unlink ( $0)
113
113
}
114
-
114
+
115
115
_ = withUnsafeMutablePointer ( to: & addr. sun_path. 0 ) { ptr in
116
116
filePath. withCString {
117
117
strncpy ( ptr, $0, filePath. count)
118
118
}
119
119
}
120
-
120
+
121
121
address = addr
122
122
return true
123
123
}
@@ -127,7 +127,7 @@ class BroadcastServerSocketConnection: NSObject {
127
127
logger. log ( level: . debug, " failure: no address? " )
128
128
return false
129
129
}
130
-
130
+
131
131
let status = withUnsafePointer ( to: & addr) { ptr in
132
132
ptr. withMemoryRebound ( to: sockaddr. self, capacity: 1 ) {
133
133
Darwin . bind ( socketHandle, $0, socklen_t ( MemoryLayout< sockaddr_un> . size) )
@@ -138,7 +138,7 @@ class BroadcastServerSocketConnection: NSObject {
138
138
logger. log ( level: . debug, " failure: \( status) " )
139
139
return false
140
140
}
141
-
141
+
142
142
return true
143
143
}
144
144
@@ -157,33 +157,33 @@ class BroadcastServerSocketConnection: NSObject {
157
157
158
158
scheduleStreams ( )
159
159
}
160
-
160
+
161
161
private func scheduleStreams( ) {
162
162
shouldKeepRunning = true
163
-
163
+
164
164
networkQueue = DispatchQueue . global ( qos: . userInitiated)
165
165
networkQueue? . async { [ weak self] in
166
166
self ? . inputStream? . schedule ( in: . current, forMode: . default)
167
167
self ? . outputStream? . schedule ( in: . current, forMode: . default)
168
-
168
+
169
169
logger. log ( level: . debug, " streams scheduled " )
170
170
var isRunning = false
171
-
171
+
172
172
repeat {
173
173
isRunning = self ? . shouldKeepRunning ?? false && RunLoop . current. run ( mode: . default, before: . distantFuture)
174
174
} while ( isRunning)
175
-
175
+
176
176
logger. log ( level: . debug, " streams stopped " )
177
177
}
178
178
}
179
-
179
+
180
180
private func unscheduleStreams( ) {
181
181
logger. log ( level: . debug, " unscheduleStreams " )
182
182
networkQueue? . sync { [ weak self] in
183
183
self ? . inputStream? . remove ( from: . current, forMode: . common)
184
184
self ? . outputStream? . remove ( from: . current, forMode: . common)
185
185
}
186
-
186
+
187
187
shouldKeepRunning = false
188
188
}
189
189
}
0 commit comments