summaryrefslogtreecommitdiff
path: root/dht/src/Network/Tox.hs
diff options
context:
space:
mode:
Diffstat (limited to 'dht/src/Network/Tox.hs')
-rw-r--r--dht/src/Network/Tox.hs32
1 files changed, 27 insertions, 5 deletions
diff --git a/dht/src/Network/Tox.hs b/dht/src/Network/Tox.hs
index f136ab96..23dbfe27 100644
--- a/dht/src/Network/Tox.hs
+++ b/dht/src/Network/Tox.hs
@@ -1,12 +1,13 @@
1{-# LANGUAGE CPP #-} 1{-# LANGUAGE CPP #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE DeriveDataTypeable #-} 2{-# LANGUAGE DeriveDataTypeable #-}
4{-# LANGUAGE DeriveFoldable #-} 3{-# LANGUAGE DeriveFoldable #-}
5{-# LANGUAGE DeriveFunctor #-} 4{-# LANGUAGE DeriveFunctor #-}
6{-# LANGUAGE DeriveGeneric #-} 5{-# LANGUAGE DeriveGeneric #-}
7{-# LANGUAGE DeriveTraversable #-} 6{-# LANGUAGE DeriveTraversable #-}
8{-# LANGUAGE ExistentialQuantification #-} 7{-# LANGUAGE ExistentialQuantification #-}
8{-# LANGUAGE FlexibleContexts #-}
9{-# LANGUAGE FlexibleInstances #-} 9{-# LANGUAGE FlexibleInstances #-}
10{-# LANGUAGE GADTs #-}
10{-# LANGUAGE GeneralizedNewtypeDeriving #-} 11{-# LANGUAGE GeneralizedNewtypeDeriving #-}
11{-# LANGUAGE LambdaCase #-} 12{-# LANGUAGE LambdaCase #-}
12{-# LANGUAGE NamedFieldPuns #-} 13{-# LANGUAGE NamedFieldPuns #-}
@@ -72,7 +73,7 @@ import qualified Network.Tox.Onion.Transport as Onion
72import Network.Tox.RelayPinger 73import Network.Tox.RelayPinger
73import System.Global6 74import System.Global6
74import Network.Tox.Transport 75import Network.Tox.Transport
75import Network.Tox.TCP (tcpClient) 76import Network.Tox.TCP (tcpClient, ViaRelay(..))
76import Network.Tox.Onion.Routes 77import Network.Tox.Onion.Routes
77import Network.Tox.ContactInfo 78import Network.Tox.ContactInfo
78import Text.XXD 79import Text.XXD
@@ -131,7 +132,7 @@ myAddr routing4 routing6 maddr = atomically $ do
131 a <- readTVar var 132 a <- readTVar var
132 return $ Multi.UDP ==> R.thisNode a 133 return $ Multi.UDP ==> R.thisNode a
133 134
134newClient :: (DRG g, Show addr, Show meth) => 135newClient :: forall g addr meth x. (DRG g, Show addr, Show meth) =>
135 g -> Transport String addr x 136 g -> Transport String addr x
136 -> (Client String meth DHT.TransactionId addr x 137 -> (Client String meth DHT.TransactionId addr x
137 -> x 138 -> x
@@ -160,12 +161,25 @@ newClient drg net classify selfAddr handlers modifytbl modifynet = do
160 let word64mapT = transactionMethods (contramap w64Key w64MapMethods) gen 161 let word64mapT = transactionMethods (contramap w64Key w64MapMethods) gen
161 map_var <- atomically $ newTVar (drg, Data.Word64Map.empty) 162 map_var <- atomically $ newTVar (drg, Data.Word64Map.empty)
162 return $ Left (word64mapT,map_var) 163 return $ Left (word64mapT,map_var)
163 let dispatch tbl var handlers client = DispatchMethods 164 let dispatch :: TransactionMethods tbl DHT.TransactionId addr x
165 -> p
166 -> (meth
167 -> Maybe (MethodHandlerA String DHT.TransactionId addr x y))
168 -> Client String meth DHT.TransactionId addr x
169 -> DispatchMethodsA tbl String meth DHT.TransactionId addr x y
170 dispatch tbl var handlers client = DispatchMethods
164 { classifyInbound = classify client 171 { classifyInbound = classify client
165 , lookupHandler = handlers -- var 172 , lookupHandler = handlers -- var
166 , tableMethods = modifytbl tbl 173 , tableMethods = modifytbl tbl
167 } 174 }
168 eprinter = logErrors -- printErrors stderr 175 eprinter = logErrors -- printErrors stderr
176 mkclient :: (TransactionMethods
177 (g, pending) DHT.TransactionId addr x,
178 TVar (g, pending))
179 -> (ClientA String meth DHT.TransactionId addr x x
180 -> meth
181 -> Maybe (MethodHandlerA String DHT.TransactionId addr x x))
182 -> ClientA String meth DHT.TransactionId addr x x
169 mkclient (tbl,var) handlers = 183 mkclient (tbl,var) handlers =
170 let client = Client 184 let client = Client
171 { clientNet = addHandler (reportParseError eprinter) (handleMessage client) $ modifynet client net 185 { clientNet = addHandler (reportParseError eprinter) (handleMessage client) $ modifynet client net
@@ -337,7 +351,15 @@ newToxOverTransport keydb addr onNewSession (crypto,roster) udp tcp = do
337 dhtclient <- newClient drg dhtnet0 DHT.classify (myAddr tbl4 tbl6) (DHT.handlers crypto . mkrouting) id 351 dhtclient <- newClient drg dhtnet0 DHT.classify (myAddr tbl4 tbl6) (DHT.handlers crypto . mkrouting) id
338 (\client net -> onInbound (updateOnUDP client) net) 352 (\client net -> onInbound (updateOnUDP client) net)
339 353
340 hscache <- newHandshakeCache crypto (sendMessage handshakes) 354 hscache <- newHandshakeCache crypto $ \saddr hs -> do
355 saddr' <- case saddr of
356 Multi.SessionTCP :=> Identity (ViaRelay Nothing nid relay)
357 -> do let relayclient = relayClient $ tcpRelayPinger orouter
358 msaddr <- Multi.tcpConnectionRequest relayclient (id2key nid) relay
359 return $ maybe saddr Multi.sessionAddr msaddr
360 _ -> return saddr
361 sendMessage handshakes saddr' hs
362 return saddr'
341 let sparams = SessionParams 363 let sparams = SessionParams
342 { spCrypto = crypto 364 { spCrypto = crypto
343 , spSessions = sessions 365 , spSessions = sessions