fd3b022e6f6bb548ca52cc5eb2c5c89d530b38b3
[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_len = UInt8(MemoryLayout.size(ofValue: addressObject))
35         addressObject.sin_family = sa_family_t(AF_INET)
36         addressObject.sin_port = CFSwapInt16HostToBig(port)
37
38         addressObject.sin_addr.s_addr = inet_addr(address)
39         
40         let sin_length = addressObject.sin_len
41
42         let result = withUnsafePointer(to: &addressObject, { addressPointer in
43             
44             addressPointer.withMemoryRebound(to: sockaddr.self, capacity: 1) { addressSecondPointer -> Int32 in
45                 let addressMutablePointer = UnsafeMutablePointer(mutating: addressSecondPointer)
46                 let result = socket_bind(self.socketHandler, addressMutablePointer, socklen_t(sin_length))
47                 return result
48             }
49         })
50         if result != 0 {
51             // something failed
52             self.isBound = false
53             return false
54         }
55         return true
56         
57     }
58     
59     public func connect(address: String, port: UInt16, theirNodeId: [UInt8]) -> Bool {
60         
61         var addressObject = sockaddr_in()
62         addressObject.sin_len = UInt8(MemoryLayout.size(ofValue: addressObject))
63         addressObject.sin_family = sa_family_t(AF_INET)
64         addressObject.sin_port = CFSwapInt16HostToBig(port)
65
66         addressObject.sin_addr.s_addr = inet_addr(address)
67         
68         let sin_length = addressObject.sin_len
69         let publicKey = Bindings.new_LDKPublicKey(array: theirNodeId)
70
71         let result = withUnsafePointer(to: &addressObject, { addressPointer in
72             
73             addressPointer.withMemoryRebound(to: sockaddr.self, capacity: 1) { addressSecondPointer -> Int32 in
74                 let addressMutablePointer = UnsafeMutablePointer(mutating: addressSecondPointer)
75                 let result = socket_connect(self.socketHandler, publicKey, addressMutablePointer, Int(socklen_t(sin_length)))
76                 return result
77             }
78         })
79         
80         if result != 0 {
81             // something failed
82             return false
83         }
84         return true
85         
86     }
87     
88     public func interrupt() {
89         interrupt_socket_handling(self.socketHandler)
90     }
91     
92 }