Fix minor build issues, resulting in the tests now running
[ldk-swift-linux] / LDKSwift / Sources / LDKSwift / batteries / TCPPeerHandler.swift
1 //
2 //  TCPPeerHandler.swift
3 //  LDKSwiftARC
4 //
5 //  Created by Arik Sosman on 7/8/21.
6 //
7
8 import Foundation
9 import LDKCHeaders
10
11 public class TCPPeerHandler {
12     
13     private let peerManager: PeerManager
14     private let socketHandler: UnsafeMutableRawPointer?
15     private var isBound = false
16     
17     public init(peerManager: PeerManager) {
18         self.peerManager = peerManager
19         let socketHandler = withUnsafePointer(to: self.peerManager.cOpaqueStruct!) { (pointer: UnsafePointer<LDKPeerManager>) -> UnsafeMutableRawPointer? in
20             let socketHandler = init_socket_handling(pointer)
21             return socketHandler
22         }
23         self.socketHandler = socketHandler
24         print("TCPPeerHandler self address: \(Unmanaged<TCPPeerHandler>.passUnretained(self).toOpaque())")
25     }
26     
27     public func bind(address: String, port: UInt16) -> Bool {
28         if(self.isBound){
29             // already bound
30             return false
31         }
32         self.isBound = true
33         var addressObject = sockaddr_in()
34         addressObject.sin_family = sa_family_t(AF_INET)
35         addressObject.sin_port = port.bigEndian
36
37         addressObject.sin_addr.s_addr = inet_addr(address)
38         
39         let sin_length = UInt8(MemoryLayout.size(ofValue: addressObject))
40
41         let result = withUnsafePointer(to: &addressObject, { addressPointer in
42             
43             addressPointer.withMemoryRebound(to: sockaddr.self, capacity: 1) { addressSecondPointer -> Int32 in
44                 let addressMutablePointer = UnsafeMutablePointer(mutating: addressSecondPointer)
45                 let result = socket_bind(self.socketHandler, addressMutablePointer, socklen_t(sin_length))
46                 return result
47             }
48         })
49         if result != 0 {
50             // something failed
51             self.isBound = false
52             return false
53         }
54         return true
55         
56     }
57     
58     public func connect(address: String, port: UInt16, theirNodeId: [UInt8]) -> Bool {
59         
60         var addressObject = sockaddr_in()
61         addressObject.sin_family = sa_family_t(AF_INET)
62         addressObject.sin_port = port.bigEndian
63
64         addressObject.sin_addr.s_addr = inet_addr(address)
65         
66         let sin_length = UInt8(MemoryLayout.size(ofValue: addressObject))
67         let publicKey = Bindings.new_LDKPublicKey(array: theirNodeId)
68
69         let result = withUnsafePointer(to: &addressObject, { addressPointer in
70             
71             addressPointer.withMemoryRebound(to: sockaddr.self, capacity: 1) { addressSecondPointer -> Int32 in
72                 let addressMutablePointer = UnsafeMutablePointer(mutating: addressSecondPointer)
73                 let result = socket_connect(self.socketHandler, publicKey, addressMutablePointer, Int(socklen_t(sin_length)))
74                 return result
75             }
76         })
77         
78         if result != 0 {
79             // something failed
80             return false
81         }
82         return true
83         
84     }
85     
86     public func interrupt() {
87         interrupt_socket_handling(self.socketHandler)
88     }
89     
90 }