summaryrefslogtreecommitdiff
path: root/examples/dhtd.hs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/dhtd.hs')
-rw-r--r--examples/dhtd.hs30
1 files changed, 23 insertions, 7 deletions
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 89b747be..088e0c67 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -21,6 +21,7 @@ module Main where
21import Control.Arrow 21import Control.Arrow
22import Control.Applicative 22import Control.Applicative
23import Control.Concurrent.STM 23import Control.Concurrent.STM
24import Control.Concurrent.STM.TMChan
24import Control.Exception 25import Control.Exception
25import Control.Monad 26import Control.Monad
26import Control.Monad.IO.Class (liftIO) 27import Control.Monad.IO.Class (liftIO)
@@ -88,7 +89,7 @@ import qualified Network.Tox.DHT.Transport as Tox
88import qualified Network.Tox.DHT.Handlers as Tox 89import qualified Network.Tox.DHT.Handlers as Tox
89import qualified Network.Tox.Onion.Transport as Tox 90import qualified Network.Tox.Onion.Transport as Tox
90import qualified Network.Tox.Onion.Handlers as Tox 91import qualified Network.Tox.Onion.Handlers as Tox
91import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage) 92import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage(..),CryptoData(..), isOFFLINE, isKillPacket)
92import qualified Network.Tox.Crypto.Handlers as Tox 93import qualified Network.Tox.Crypto.Handlers as Tox
93import Data.Typeable 94import Data.Typeable
94import Network.Tox.ContactInfo as Tox 95import Network.Tox.ContactInfo as Tox
@@ -1000,13 +1001,14 @@ noArgPing :: (x -> IO (Maybe r)) -> [String] -> x -> IO (Maybe r)
1000noArgPing f [] x = f x 1001noArgPing f [] x = f x
1001noArgPing _ _ _ = return Nothing 1002noArgPing _ _ _ = return Nothing
1002 1003
1003newXmmpSource :: Tox.NetCryptoSession -> C.Source IO Tox.CryptoMessage 1004-- todo: session parameter obsolete?
1004newXmmpSource session = do 1005newXmmpSource :: (IO (Maybe Tox.CryptoMessage)) -> Tox.NetCryptoSession -> C.Source IO Tox.CryptoMessage
1005 v <- liftIO $ Tox.receiveCrypto session 1006newXmmpSource receiveCrypto session = do
1007 v <- liftIO receiveCrypto
1006 case v of 1008 case v of
1007 Nothing -> return () -- Nothing indicates EOF. 1009 Nothing -> return () -- Nothing indicates EOF.
1008 Just cryptomessage -> do C.yield cryptomessage 1010 Just cryptomessage -> do C.yield cryptomessage
1009 newXmmpSource session 1011 newXmmpSource receiveCrypto session
1010 1012
1011newXmmpSink :: Tox.NetCryptoSession -> C.Sink (Flush Tox.CryptoMessage) IO () 1013newXmmpSink :: Tox.NetCryptoSession -> C.Sink (Flush Tox.CryptoMessage) IO ()
1012newXmmpSink session@(Tox.NCrypto { ncOutgoingQueue, ncPacketQueue }) = C.awaitForever $ \flush_cyptomessage -> do 1014newXmmpSink session@(Tox.NCrypto { ncOutgoingQueue, ncPacketQueue }) = C.awaitForever $ \flush_cyptomessage -> do
@@ -1046,6 +1048,7 @@ toxman tox = ToxManager
1046 _ -> return () -- Remove contact. 1048 _ -> return () -- Remove contact.
1047 } 1049 }
1048 1050
1051#ifdef XMPP
1049 1052
1050announceToxXMPPClients :: TChan ((ConnectionKey,SockAddr), Tcp.ConnectionEvent XML.Event) 1053announceToxXMPPClients :: TChan ((ConnectionKey,SockAddr), Tcp.ConnectionEvent XML.Event)
1051 -> SockAddr 1054 -> SockAddr
@@ -1064,7 +1067,7 @@ announceToxXMPPClients echan laddr saddr pingflag tsrc tsnk
1064 xsrc = tsrc =$= toxToXmpp 1067 xsrc = tsrc =$= toxToXmpp
1065 xsnk = flushPassThrough xmppToTox =$= tsnk 1068 xsnk = flushPassThrough xmppToTox =$= tsnk
1066 1069
1067 1070#endif
1068 1071
1069main :: IO () 1072main :: IO ()
1070main = runResourceT $ liftBaseWith $ \resT -> do 1073main = runResourceT $ liftBaseWith $ \resT -> do
@@ -1379,11 +1382,24 @@ main = runResourceT $ liftBaseWith $ \resT -> do
1379 1382
1380 forM_ (take 1 taddrs) $ \addrTox -> do 1383 forM_ (take 1 taddrs) $ \addrTox -> do
1381 atomically $ Tox.addNewSessionHook netCryptoSessionsState $ \mbNoSpam netcrypto -> do 1384 atomically $ Tox.addNewSessionHook netCryptoSessionsState $ \mbNoSpam netcrypto -> do
1385 tmchan <- atomically newTMChan
1382 let Just pingMachine = Tox.ncPingMachine netcrypto 1386 let Just pingMachine = Tox.ncPingMachine netcrypto
1383 pingflag = readTVar (pingFlag pingMachine) 1387 pingflag = readTVar (pingFlag pingMachine)
1384 xmppSrc = newXmmpSource netcrypto 1388 receiveCrypto = atomically $ readTMChan tmchan
1389 handleIncoming typ session cd | any ($ typ) [Tox.isKillPacket, Tox.isOFFLINE] = atomically $ do
1390 closeTMChan tmchan
1391 Tox.forgetCrypto crypto netCryptoSessionsState netcrypto
1392 return Nothing
1393 handleIncoming mTyp session cd = do
1394 atomically $ writeTMChan tmchan (Tox.bufferData cd)
1395 return Nothing
1396#ifdef XMPP
1397 xmppSrc = newXmmpSource receiveCrypto netcrypto
1385 xmppSink = newXmmpSink netcrypto 1398 xmppSink = newXmmpSink netcrypto
1386 announceToxXMPPClients (xmppEventChannel sv) addrTox (Tox.ncSockAddr netcrypto) pingflag xmppSrc xmppSink 1399 announceToxXMPPClients (xmppEventChannel sv) addrTox (Tox.ncSockAddr netcrypto) pingflag xmppSrc xmppSink
1400#endif
1401 atomically $ writeTVar (Tox.ncUnrecognizedHook netcrypto) handleIncoming
1402 return Nothing
1387 1403
1388 let dhts = Map.union btdhts toxdhts 1404 let dhts = Map.union btdhts toxdhts
1389 1405