diff options
Diffstat (limited to 'examples/dhtd.hs')
-rw-r--r-- | examples/dhtd.hs | 30 |
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 | |||
21 | import Control.Arrow | 21 | import Control.Arrow |
22 | import Control.Applicative | 22 | import Control.Applicative |
23 | import Control.Concurrent.STM | 23 | import Control.Concurrent.STM |
24 | import Control.Concurrent.STM.TMChan | ||
24 | import Control.Exception | 25 | import Control.Exception |
25 | import Control.Monad | 26 | import Control.Monad |
26 | import Control.Monad.IO.Class (liftIO) | 27 | import Control.Monad.IO.Class (liftIO) |
@@ -88,7 +89,7 @@ import qualified Network.Tox.DHT.Transport as Tox | |||
88 | import qualified Network.Tox.DHT.Handlers as Tox | 89 | import qualified Network.Tox.DHT.Handlers as Tox |
89 | import qualified Network.Tox.Onion.Transport as Tox | 90 | import qualified Network.Tox.Onion.Transport as Tox |
90 | import qualified Network.Tox.Onion.Handlers as Tox | 91 | import qualified Network.Tox.Onion.Handlers as Tox |
91 | import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage) | 92 | import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage(..),CryptoData(..), isOFFLINE, isKillPacket) |
92 | import qualified Network.Tox.Crypto.Handlers as Tox | 93 | import qualified Network.Tox.Crypto.Handlers as Tox |
93 | import Data.Typeable | 94 | import Data.Typeable |
94 | import Network.Tox.ContactInfo as Tox | 95 | import Network.Tox.ContactInfo as Tox |
@@ -1000,13 +1001,14 @@ noArgPing :: (x -> IO (Maybe r)) -> [String] -> x -> IO (Maybe r) | |||
1000 | noArgPing f [] x = f x | 1001 | noArgPing f [] x = f x |
1001 | noArgPing _ _ _ = return Nothing | 1002 | noArgPing _ _ _ = return Nothing |
1002 | 1003 | ||
1003 | newXmmpSource :: Tox.NetCryptoSession -> C.Source IO Tox.CryptoMessage | 1004 | -- todo: session parameter obsolete? |
1004 | newXmmpSource session = do | 1005 | newXmmpSource :: (IO (Maybe Tox.CryptoMessage)) -> Tox.NetCryptoSession -> C.Source IO Tox.CryptoMessage |
1005 | v <- liftIO $ Tox.receiveCrypto session | 1006 | newXmmpSource 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 | ||
1011 | newXmmpSink :: Tox.NetCryptoSession -> C.Sink (Flush Tox.CryptoMessage) IO () | 1013 | newXmmpSink :: Tox.NetCryptoSession -> C.Sink (Flush Tox.CryptoMessage) IO () |
1012 | newXmmpSink session@(Tox.NCrypto { ncOutgoingQueue, ncPacketQueue }) = C.awaitForever $ \flush_cyptomessage -> do | 1014 | newXmmpSink 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 | ||
1050 | announceToxXMPPClients :: TChan ((ConnectionKey,SockAddr), Tcp.ConnectionEvent XML.Event) | 1053 | announceToxXMPPClients :: 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 | ||
1069 | main :: IO () | 1072 | main :: IO () |
1070 | main = runResourceT $ liftBaseWith $ \resT -> do | 1073 | main = 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 | ||