@@ -37,7 +37,7 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
37
37
fileprivate let keysInterface : KeysInterface !
38
38
public private( set) var payer : InvoicePayer ?
39
39
public let peerManager : PeerManager
40
-
40
+ private var tcpPeerHandler : TCPPeerHandler ?
41
41
42
42
/**
43
43
* A list of ChannelMonitors and the last block they each saw. You should sync the blockchain on each individually
@@ -230,9 +230,14 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
230
230
231
231
}
232
232
233
- public func interrupt( tcpPeerHandler: TCPPeerHandler ? = nil ) {
233
+ public func interrupt( ) {
234
+ if self . shutdown {
235
+ Bindings . print ( " ChannelManagerConstructor previously interrupted, nothing to do. " )
236
+ return
237
+ }
238
+
234
239
self . shutdown = true
235
- if let tcpHandler = tcpPeerHandler {
240
+ if let tcpHandler = self . tcpPeerHandler {
236
241
print ( " stopping TCP peer handler " )
237
242
tcpHandler. interrupt ( )
238
243
print ( " stopped TCP peer handler " )
@@ -252,8 +257,18 @@ public class ChannelManagerConstructor: NativeTypeWrapper {
252
257
print ( " unset background processor " )
253
258
}
254
259
260
+ public func getTCPPeerHandler( ) -> TCPPeerHandler {
261
+ if let handler = self . tcpPeerHandler {
262
+ return handler
263
+ }
264
+ let handler = TCPPeerHandler ( peerManager: self . peerManager)
265
+ self . tcpPeerHandler = handler
266
+ return handler
267
+ }
268
+
255
269
deinit {
256
- print ( " deiniting ChannelManagerConstructor " )
270
+ Bindings . print ( " Freeing and interrupting ChannelManagerConstructor " )
271
+ self . interrupt ( )
257
272
}
258
273
259
274
@@ -295,3 +310,110 @@ fileprivate class CustomEventHandler: EventHandler {
295
310
public protocol ExtendedChannelManagerPersister : Persister {
296
311
func handle_event( event: Event ) -> Void ;
297
312
}
313
+
314
+ public class TCPPeerHandler {
315
+
316
+ private let peerManager : PeerManager
317
+ private let socketHandler : UnsafeMutableRawPointer ?
318
+ private var isBound = false
319
+ private var isInterrupted = false
320
+
321
+ fileprivate init ( peerManager: PeerManager ) {
322
+ self . peerManager = peerManager
323
+
324
+ /*
325
+ let socketHandler = withUnsafePointer(to: self.peerManager.cOpaqueStruct!) { (pointer: UnsafePointer<LDKPeerManager>) -> UnsafeMutableRawPointer? in
326
+ let socketHandler = init_socket_handling(pointer)
327
+ return socketHandler
328
+ }
329
+ self.socketHandler = socketHandler
330
+ */
331
+
332
+
333
+ // self.socketHandler = UnsafeMutableRawPointer(bitPattern: 0)
334
+
335
+
336
+
337
+ let peerManagerPointer : UnsafeRawPointer = UnsafeRawPointer ( & self . peerManager. cOpaqueStruct)
338
+ Bindings . print ( " TCPPeerHandler peer manager pointer address: \( peerManagerPointer) " )
339
+ let memoryReboundPeerManagerPointer : UnsafePointer < LDKPeerManager > = peerManagerPointer. assumingMemoryBound ( to: LDKPeerManager . self)
340
+ Bindings . print ( " TCPPeerHandler peer manager rebound memory address: \( memoryReboundPeerManagerPointer) " )
341
+ self . socketHandler = init_socket_handling ( memoryReboundPeerManagerPointer)
342
+ print ( " TCPPeerHandler self address: \( Unmanaged < TCPPeerHandler > . passUnretained ( self ) . toOpaque ( ) ) " )
343
+ }
344
+
345
+ public func bind( address: String , port: UInt16 ) -> Bool {
346
+ if ( self . isBound) {
347
+ // already bound
348
+ return false
349
+ }
350
+ self . isBound = true
351
+ var addressObject = sockaddr_in ( )
352
+ addressObject. sin_family = sa_family_t ( AF_INET)
353
+ addressObject. sin_port = port. bigEndian
354
+
355
+ addressObject. sin_addr. s_addr = inet_addr ( address)
356
+
357
+ let sin_length = UInt8 ( MemoryLayout . size ( ofValue: addressObject) )
358
+
359
+ let result = withUnsafePointer ( to: & addressObject, { addressPointer in
360
+
361
+ addressPointer. withMemoryRebound ( to: sockaddr. self, capacity: 1 ) { addressSecondPointer -> Int32 in
362
+ let addressMutablePointer = UnsafeMutablePointer ( mutating: addressSecondPointer)
363
+ let result = socket_bind ( self . socketHandler, addressMutablePointer, socklen_t ( sin_length) )
364
+ return result
365
+ }
366
+ } )
367
+ if result != 0 {
368
+ // something failed
369
+ self . isBound = false
370
+ return false
371
+ }
372
+ return true
373
+
374
+ }
375
+
376
+ public func connect( address: String , port: UInt16 , theirNodeId: [ UInt8 ] ) -> Bool {
377
+
378
+ var addressObject = sockaddr_in ( )
379
+ addressObject. sin_family = sa_family_t ( AF_INET)
380
+ addressObject. sin_port = port. bigEndian
381
+
382
+ addressObject. sin_addr. s_addr = inet_addr ( address)
383
+
384
+ let sin_length = UInt8 ( MemoryLayout . size ( ofValue: addressObject) )
385
+ let publicKey = Bindings . new_LDKPublicKey ( array: theirNodeId)
386
+
387
+ let result = withUnsafePointer ( to: & addressObject, { addressPointer in
388
+
389
+ addressPointer. withMemoryRebound ( to: sockaddr. self, capacity: 1 ) { addressSecondPointer -> Int32 in
390
+ let addressMutablePointer = UnsafeMutablePointer ( mutating: addressSecondPointer)
391
+ let result = socket_connect ( self . socketHandler, publicKey, addressMutablePointer, Int ( socklen_t ( sin_length) ) )
392
+ return result
393
+ }
394
+ } )
395
+
396
+ if result != 0 {
397
+ // something failed
398
+ return false
399
+ }
400
+ return true
401
+
402
+ }
403
+
404
+ fileprivate func interrupt( ) {
405
+ if self . isInterrupted {
406
+ Bindings . print ( " TCPPeerHandler previously interrupted, nothing to do. " )
407
+ return
408
+ }
409
+ self . isInterrupted = true
410
+ interrupt_socket_handling ( self . socketHandler)
411
+ Bindings . print ( " TCPPeerHandler successfully interrupted. " )
412
+ }
413
+
414
+ deinit {
415
+ Bindings . print ( " Freeing and interrupting TCPPeerHandler. " )
416
+ self . interrupt ( )
417
+ }
418
+
419
+ }
0 commit comments