summaryrefslogtreecommitdiff
path: root/src/Network/DatagramServer.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/DatagramServer.hs')
-rw-r--r--src/Network/DatagramServer.hs34
1 files changed, 7 insertions, 27 deletions
diff --git a/src/Network/DatagramServer.hs b/src/Network/DatagramServer.hs
index e1bf91c5..5c77fb86 100644
--- a/src/Network/DatagramServer.hs
+++ b/src/Network/DatagramServer.hs
@@ -62,13 +62,9 @@
62{-# LANGUAGE TemplateHaskell #-} 62{-# LANGUAGE TemplateHaskell #-}
63{-# LANGUAGE KindSignatures #-} 63{-# LANGUAGE KindSignatures #-}
64module Network.DatagramServer 64module Network.DatagramServer
65 ( -- * Methods 65 (
66 Method
67 , KRPC (..)
68
69 -- * RPC
70 -- ** Query 66 -- ** Query
71 , QueryFailure (..) 67 QueryFailure (..)
72 , query 68 , query
73 , query' 69 , query'
74 , queryRaw 70 , queryRaw
@@ -97,7 +93,6 @@ module Network.DatagramServer
97 ) where 93 ) where
98 94
99import Data.Default.Class 95import Data.Default.Class
100import Network.DatagramServer.Mainline
101import Network.Socket (SockAddr (..)) 96import Network.Socket (SockAddr (..))
102 97
103import Control.Applicative 98import Control.Applicative
@@ -115,11 +110,8 @@ import Control.Monad.Logger
115import Control.Monad.Reader 110import Control.Monad.Reader
116import Control.Monad.Trans.Control 111import Control.Monad.Trans.Control
117#ifdef VERSION_bencoding 112#ifdef VERSION_bencoding
118import Data.BEncode as BE
119import Data.BEncode.Internal as BE
120import Data.BEncode.Pretty (showBEncode)
121#else 113#else
122import qualified Network.DatagramServer.Tox as Tox 114-- import qualified Network.DatagramServer.Tox as Tox
123#endif 115#endif
124import qualified Data.ByteString.Base16 as Base16 116import qualified Data.ByteString.Base16 as Base16
125import Data.ByteString as BS 117import Data.ByteString as BS
@@ -136,16 +128,10 @@ import Data.Text.Encoding as T
136import Data.Tuple 128import Data.Tuple
137import Data.Typeable 129import Data.Typeable
138import Network.DatagramServer.Types 130import Network.DatagramServer.Types
139import Network.DatagramServer.Mainline
140import Network.KRPC.Method hiding (Envelope)
141import qualified Network.KRPC.Method as KRPC (Envelope)
142import Network.Socket hiding (listen) 131import Network.Socket hiding (listen)
143import Network.Socket.ByteString as BS 132import Network.Socket.ByteString as BS
144import System.IO.Error 133import System.IO.Error
145import System.Timeout 134import System.Timeout
146#ifdef VERSION_bencoding
147import Network.DHT.Mainline
148#endif
149 135
150 136
151{----------------------------------------------------------------------- 137{-----------------------------------------------------------------------
@@ -356,20 +342,20 @@ sendQuery sock addr q = handle sockError $ sendMessage sock addr q
356-- This function should throw 'QueryFailure' exception if quered node 342-- This function should throw 'QueryFailure' exception if quered node
357-- respond with @error@ message or the query timeout expires. 343-- respond with @error@ message or the query timeout expires.
358-- 344--
359query :: forall h m a b raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg, KRPC a b) => QueryMethod msg -> SockAddr -> a -> m b 345query :: forall h m a b raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg) => QueryMethod msg -> SockAddr -> a -> m b
360query meth addr params = queryK meth addr params (\_ x _ -> x) 346query meth addr params = queryK meth addr params (\_ x _ -> x)
361 347
362-- | Like 'query' but possibly returns your externally routable IP address. 348-- | Like 'query' but possibly returns your externally routable IP address.
363query' :: forall h m a b raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg, KRPC a b) => QueryMethod msg -> SockAddr -> a -> m (b, Maybe ReflectedIP) 349query' :: forall h m a b raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg) => QueryMethod msg -> SockAddr -> a -> m (b, Maybe ReflectedIP)
364query' meth addr params = queryK meth addr params (const (,)) 350query' meth addr params = queryK meth addr params (const (,))
365 351
366-- | Enqueue a query, but give us the complete BEncoded content sent by the 352-- | Enqueue a query, but give us the complete BEncoded content sent by the
367-- remote Node. This is useful for handling extensions that this library does 353-- remote Node. This is useful for handling extensions that this library does
368-- not otherwise support. 354-- not otherwise support.
369queryRaw :: forall h m a b raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg, KRPC a b) => QueryMethod msg -> SockAddr -> a -> m (b, raw) 355queryRaw :: forall h m a b raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg) => QueryMethod msg -> SockAddr -> a -> m (b, raw)
370queryRaw meth addr params = queryK meth addr params (\raw x _ -> (x,raw)) 356queryRaw meth addr params = queryK meth addr params (\raw x _ -> (x,raw))
371 357
372queryK :: forall h m a b x raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg, KRPC a b) => 358queryK :: forall h m a b x raw msg. (SerializableTo raw b, Show (QueryMethod msg), Ord (TransactionID msg), Serialize (TransactionID msg), SerializableTo raw a, MonadKRPC h m raw msg, WireFormat raw msg) =>
373 QueryMethod msg -> SockAddr -> a -> (raw -> b -> Maybe ReflectedIP -> x) -> m x 359 QueryMethod msg -> SockAddr -> a -> (raw -> b -> Maybe ReflectedIP -> x) -> m x
374queryK meth addr params kont = do 360queryK meth addr params kont = do
375 Manager {..} <- getManager 361 Manager {..} <- getManager
@@ -537,7 +523,6 @@ handleQuery meth raw q addr = void $ fork $ do
537 myThreadId >>= liftIO . flip labelThread "KRPC.handleQuery" 523 myThreadId >>= liftIO . flip labelThread "KRPC.handleQuery"
538 Manager {..} <- getManager 524 Manager {..} <- getManager
539 res <- dispatchHandler meth q addr 525 res <- dispatchHandler meth q addr
540#ifdef VERSION_bencoding
541 let res' = either buildError Just res 526 let res' = either buildError Just res
542 ctx = error "TODO TOX ToxCipherContext 2 or () for Mainline" 527 ctx = error "TODO TOX ToxCipherContext 2 or () for Mainline"
543 resbs = fmap (encodeHeaders ctx) res' :: Maybe BS.ByteString 528 resbs = fmap (encodeHeaders ctx) res' :: Maybe BS.ByteString
@@ -549,11 +534,6 @@ handleQuery meth raw q addr = void $ fork $ do
549-- , either (const "<unicode-fail>") id $ T.decodeUtf8' (BL.toStrict $ showBEncode resbe) 534-- , either (const "<unicode-fail>") id $ T.decodeUtf8' (BL.toStrict $ showBEncode resbe)
550-- ] 535-- ]
551 maybe (return ()) (sendMessage sock addr) resbs 536 maybe (return ()) (sendMessage sock addr) resbs
552#else
553 -- Errors not sent for Tox.
554 let ctx = error "TODO TOX ToxCipherContext 2"
555 either (const $ return ()) (sendMessage sock addr . encodeHeaders ctx) res
556#endif
557 537
558handleResponse :: ( MonadKRPC h m raw msg 538handleResponse :: ( MonadKRPC h m raw msg
559 , Ord (TransactionID msg) 539 , Ord (TransactionID msg)