diff options
Diffstat (limited to 'dht/src/Network/Tox/TCP.hs')
-rw-r--r-- | dht/src/Network/Tox/TCP.hs | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/dht/src/Network/Tox/TCP.hs b/dht/src/Network/Tox/TCP.hs index 932b4ab3..a37c0310 100644 --- a/dht/src/Network/Tox/TCP.hs +++ b/dht/src/Network/Tox/TCP.hs | |||
@@ -223,11 +223,53 @@ getTCPNodes tcp seeking dst = do | |||
223 | getUDPNodes :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (Maybe ([UDP.NodeInfo], [UDP.NodeInfo], Maybe ())) | 223 | getUDPNodes :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (Maybe ([UDP.NodeInfo], [UDP.NodeInfo], Maybe ())) |
224 | getUDPNodes tcp seeking dst = fmap fst . resultToMaybe <$> getUDPNodes' tcp seeking dst | 224 | getUDPNodes tcp seeking dst = fmap fst . resultToMaybe <$> getUDPNodes' tcp seeking dst |
225 | 225 | ||
226 | |||
226 | getUDPNodes' :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (QR.Result (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo)) | 227 | getUDPNodes' :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (QR.Result (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo)) |
227 | getUDPNodes' tcp seeking dst0 = do | 228 | getUDPNodes' tcp seeking dst0 = do |
229 | goGetUDPNodes tcp seeking dst0 (return Canceled) $ \meth gateway dst -> do | ||
230 | r <- sendQuery (tcpClient tcp) meth (AnnounceRequest zeros32 seeking UDP.zeroID) gateway | ||
231 | forM r $ \response -> do | ||
232 | let (ns,_,mb) = either (const ([],[],Nothing)) (unwrapAnnounceResponse Nothing dst) $ response | ||
233 | return ( (ns,ns, const () <$> mb), gateway ) | ||
234 | |||
235 | -- Failure case, currently not treated as special. | ||
236 | -- The current searchQuery type demands a valid Nonce8 is returned | ||
237 | -- even if we were unable to send a query. | ||
238 | fixmeNonce :: Nonce8 | ||
239 | fixmeNonce = Nonce8 0 | ||
240 | |||
241 | asyncUDPNodes :: TCPClient err Nonce8 | ||
242 | -> NodeId | ||
243 | -> UDP.NodeInfo | ||
244 | -> (Nonce8 | ||
245 | -> QR.Result (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo) | ||
246 | -> IO ()) | ||
247 | -> IO Nonce8 | ||
248 | asyncUDPNodes tcp seeking dst0 withResult = | ||
249 | goGetUDPNodes tcp seeking dst0 (return fixmeNonce) $ \meth gateway dst -> do | ||
250 | asyncQuery (tcpClient tcp) meth (AnnounceRequest zeros32 seeking UDP.zeroID) gateway $ | ||
251 | \qid response -> do | ||
252 | let wut response = | ||
253 | let (ns,_,mb) = either (const ([],[],Nothing)) (unwrapAnnounceResponse Nothing dst) $ response | ||
254 | in ( (ns,ns, const () <$> mb), gateway ) | ||
255 | withResult qid $ fmap wut response | ||
256 | |||
257 | type Meth x = MethodSerializer | ||
258 | Nonce8 | ||
259 | x -- NodeInfo | ||
260 | (Bool, RelayPacket) | ||
261 | PacketNumber | ||
262 | AnnounceRequest | ||
263 | (Either String AnnounceResponse) | ||
264 | |||
265 | goGetUDPNodes :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo | ||
266 | -> IO a | ||
267 | -> (Meth x -> NodeInfo -> UDP.NodeInfo -> IO a) | ||
268 | -> IO a | ||
269 | goGetUDPNodes tcp seeking dst0 fail go = do | ||
228 | mgateway <- atomically $ tcpGetGateway tcp dst0 | 270 | mgateway <- atomically $ tcpGetGateway tcp dst0 |
229 | case mgateway of | 271 | case mgateway of |
230 | Nothing -> return Canceled | 272 | Nothing -> fail |
231 | Just gateway -> do | 273 | Just gateway -> do |
232 | (b,c,n24) <- atomically $ do | 274 | (b,c,n24) <- atomically $ do |
233 | b <- transportNewKey (tcpCrypto tcp) | 275 | b <- transportNewKey (tcpCrypto tcp) |
@@ -267,10 +309,7 @@ getUDPNodes' tcp seeking dst0 = do | |||
267 | -> decrypt (wrap0 n24') r >>= decodePlain | 309 | -> decrypt (wrap0 n24') r >>= decodePlain |
268 | x -> Left $ "getUDPNodes: unwrapResponse fail " ++ show x | 310 | x -> Left $ "getUDPNodes: unwrapResponse fail " ++ show x |
269 | } | 311 | } |
270 | r <- sendQuery (tcpClient tcp) meth (AnnounceRequest zeros32 seeking UDP.zeroID) gateway | 312 | go meth gateway dst |
271 | forM r $ \response -> do | ||
272 | let (ns,_,mb) = either (const ([],[],Nothing)) (unwrapAnnounceResponse Nothing dst) $ response | ||
273 | return ( (ns,ns, const () <$> mb), gateway ) | ||
274 | 313 | ||
275 | 314 | ||
276 | handleOOB :: PublicKey -> ByteString -> NodeInfo -> NodeInfo -> IO (Maybe (x -> x)) | 315 | handleOOB :: PublicKey -> ByteString -> NodeInfo -> NodeInfo -> IO (Maybe (x -> x)) |