diff options
Diffstat (limited to 'dht/src/Network/Tox.hs')
-rw-r--r-- | dht/src/Network/Tox.hs | 32 |
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 | |||
72 | import Network.Tox.RelayPinger | 73 | import Network.Tox.RelayPinger |
73 | import System.Global6 | 74 | import System.Global6 |
74 | import Network.Tox.Transport | 75 | import Network.Tox.Transport |
75 | import Network.Tox.TCP (tcpClient) | 76 | import Network.Tox.TCP (tcpClient, ViaRelay(..)) |
76 | import Network.Tox.Onion.Routes | 77 | import Network.Tox.Onion.Routes |
77 | import Network.Tox.ContactInfo | 78 | import Network.Tox.ContactInfo |
78 | import Text.XXD | 79 | import 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 | ||
134 | newClient :: (DRG g, Show addr, Show meth) => | 135 | newClient :: 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 |