summaryrefslogtreecommitdiff
path: root/dht/src/Network/Tox/TCP.hs
diff options
context:
space:
mode:
Diffstat (limited to 'dht/src/Network/Tox/TCP.hs')
-rw-r--r--dht/src/Network/Tox/TCP.hs49
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
223getUDPNodes :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (Maybe ([UDP.NodeInfo], [UDP.NodeInfo], Maybe ())) 223getUDPNodes :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (Maybe ([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()))
224getUDPNodes tcp seeking dst = fmap fst . resultToMaybe <$> getUDPNodes' tcp seeking dst 224getUDPNodes tcp seeking dst = fmap fst . resultToMaybe <$> getUDPNodes' tcp seeking dst
225 225
226
226getUDPNodes' :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (QR.Result (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo)) 227getUDPNodes' :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (QR.Result (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo))
227getUDPNodes' tcp seeking dst0 = do 228getUDPNodes' 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.
238fixmeNonce :: Nonce8
239fixmeNonce = Nonce8 0
240
241asyncUDPNodes :: TCPClient err Nonce8
242 -> NodeId
243 -> UDP.NodeInfo
244 -> (Nonce8
245 -> QR.Result (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo)
246 -> IO ())
247 -> IO Nonce8
248asyncUDPNodes 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
257type Meth x = MethodSerializer
258 Nonce8
259 x -- NodeInfo
260 (Bool, RelayPacket)
261 PacketNumber
262 AnnounceRequest
263 (Either String AnnounceResponse)
264
265goGetUDPNodes :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo
266 -> IO a
267 -> (Meth x -> NodeInfo -> UDP.NodeInfo -> IO a)
268 -> IO a
269goGetUDPNodes 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
276handleOOB :: PublicKey -> ByteString -> NodeInfo -> NodeInfo -> IO (Maybe (x -> x)) 315handleOOB :: PublicKey -> ByteString -> NodeInfo -> NodeInfo -> IO (Maybe (x -> x))