summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Control/Concurrent/Lifted/Instrument.hs1
-rw-r--r--src/DPut.hs55
-rw-r--r--src/Data/PacketBuffer.hs1
-rw-r--r--src/Network/Address.hs1
-rw-r--r--src/Network/BitTorrent/MainlineDHT.hs1
-rw-r--r--src/Network/Kademlia/Bootstrap.hs1
-rw-r--r--src/Network/Lossless.hs1
-rw-r--r--src/Network/QueryResponse.hs1
-rw-r--r--src/Network/StreamServer.hs1
-rw-r--r--src/Network/Tox.hs1
-rw-r--r--src/Network/Tox/AggregateSession.hs1
-rw-r--r--src/Network/Tox/ContactInfo.hs1
-rw-r--r--src/Network/Tox/Crypto/Handlers.hs1
-rw-r--r--src/Network/Tox/Crypto/Transport.hs1
-rw-r--r--src/Network/Tox/DHT/Handlers.hs1
-rw-r--r--src/Network/Tox/Handshake.hs1
-rw-r--r--src/Network/Tox/Onion/Handlers.hs1
-rw-r--r--src/Network/Tox/Onion/Transport.hs1
-rw-r--r--src/Network/Tox/Session.hs1
-rw-r--r--src/Network/UPNP.hs1
20 files changed, 43 insertions, 31 deletions
diff --git a/src/Control/Concurrent/Lifted/Instrument.hs b/src/Control/Concurrent/Lifted/Instrument.hs
index 680b264f..fc3b6369 100644
--- a/src/Control/Concurrent/Lifted/Instrument.hs
+++ b/src/Control/Concurrent/Lifted/Instrument.hs
@@ -21,6 +21,7 @@ import qualified GHC.Conc as GHC
21import Data.Time() 21import Data.Time()
22import Data.Time.Clock 22import Data.Time.Clock
23import DPut 23import DPut
24import DebugTag
24 25
25 26
26data PerThread = PerThread 27data PerThread = PerThread
diff --git a/src/DPut.hs b/src/DPut.hs
index 6fd69040..38e532d0 100644
--- a/src/DPut.hs
+++ b/src/DPut.hs
@@ -1,3 +1,5 @@
1{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE ScopedTypeVariables #-}
1module DPut where 3module DPut where
2 4
3import Control.Monad.IO.Class 5import Control.Monad.IO.Class
@@ -10,26 +12,10 @@ import qualified Data.ByteString.Char8 as B
10import qualified Data.Text as T 12import qualified Data.Text as T
11import qualified Data.Text.Encoding as T 13import qualified Data.Text.Encoding as T
12import Debug.Trace 14import Debug.Trace
15import Data.Typeable
16import Data.Dynamic
13 17
14-- | Debug Tags, add more as needed, but ensure XAnnounce is always first, XMisc last 18type IsDebugTag t = (Eq t, Ord t, Show t, Read t, Enum t, Bounded t,Typeable t)
15data DebugTag
16 = XAnnounce
17 | XBitTorrent
18 | XDHT
19 | XLan
20 | XMan
21 | XNetCrypto
22 | XNetCryptoOut
23 | XOnion
24 | XRoutes
25 | XPing
26 | XRefresh
27 | XJabber
28 | XMisc
29 | XNodeinfoSearch
30 | XUnexpected -- Used only for special anomalous errors that we didn't expect to happen.
31 | XUnused -- Never commit code that uses XUnused.
32 deriving (Eq, Ord, Show, Read, Enum, Bounded)
33 19
34appName :: String 20appName :: String
35appName = "toxmpp" 21appName = "toxmpp"
@@ -37,43 +23,50 @@ appName = "toxmpp"
37(<.>) :: String -> String -> String 23(<.>) :: String -> String -> String
38a <.> b = a ++ "." ++ b 24a <.> b = a ++ "." ++ b
39 25
40dput :: MonadIO m => DebugTag -> String -> m () 26dput :: (MonadIO m, IsDebugTag tag) => tag -> String -> m ()
41dput tag msg = liftIO $ debugM (appName <.> show tag) msg 27dput tag msg = liftIO $ debugM (appName <.> show tag) msg
42 28
43dputB :: MonadIO m => DebugTag -> B.ByteString -> m () 29dputB :: (MonadIO m, IsDebugTag tag) => tag -> B.ByteString -> m ()
44dputB tag msg = liftIO $ debugM (appName <.> show tag) (T.unpack . T.decodeUtf8 $ msg) 30dputB tag msg = liftIO $ debugM (appName <.> show tag) (T.unpack . T.decodeUtf8 $ msg)
45 31
46{-# NOINLINE verbosityMap #-} 32{-# NOINLINE verbosityMap #-}
47verbosityMap :: IORef (Map.Map DebugTag Bool) 33verbosityMap :: IORef (Map.Map TypeRep Dynamic)
48verbosityMap = unsafePerformIO $ newIORef (Map.empty) 34verbosityMap = unsafePerformIO $ newIORef (Map.empty)
49 35
50-- | Trace version of 'dput' works in arbitrary monad, using unsafePerformIO. 36-- | Trace version of 'dput' works in arbitrary monad, using unsafePerformIO.
51tput :: Applicative m => DebugTag -> String -> m () 37tput :: (Applicative m, IsDebugTag tag) => tag -> String -> m ()
52tput tag msg = 38tput tag msg =
53 let mp = unsafePerformIO $ readIORef verbosityMap 39 let mp = unsafePerformIO $ readIORef verbosityMap
54 in if fromMaybe True (Map.lookup tag mp) 40 in if maybe True (fromMaybe True . Map.lookup tag . flip fromDyn Map.empty) (Map.lookup (typeOf tag) mp)
55 then trace msg (pure ()) 41 then trace msg (pure ())
56 else pure () 42 else pure ()
57 43
58-- | like 'trace' but parameterized with 'DebugTag' 44-- | like 'trace' but parameterized with 'DebugTag'
59dtrace :: DebugTag -> String -> a -> a 45dtrace :: forall a tag. IsDebugTag tag => tag -> String -> a -> a
60dtrace tag msg result = let mp = unsafePerformIO $ readIORef verbosityMap 46dtrace tag msg result = let mp = unsafePerformIO $ readIORef verbosityMap
61 in if fromMaybe True (Map.lookup tag mp) 47 mp' :: Map.Map tag Bool
48 mp' = maybe Map.empty (flip fromDyn Map.empty) (Map.lookup (typeOf tag) mp)
49 in if fromMaybe True (Map.lookup tag mp')
62 then trace msg result 50 then trace msg result
63 else result 51 else result
64 52
65setTagLevel :: Priority -> DebugTag -> IO () 53setTagLevel :: forall tag. IsDebugTag tag => Priority -> tag -> IO ()
66setTagLevel level tag = do 54setTagLevel level tag = do
67 updateGlobalLogger (appName <.> show tag) (setLevel level) 55 updateGlobalLogger (appName <.> show tag) (setLevel level)
68 modifyIORef verbosityMap (Map.insert tag (level <= DEBUG)) 56 modifyIORef verbosityMap $ \mpByType -> do
57 case Map.lookup (typeOf tag) mpByType of
58 Nothing -> Map.insert (typeOf tag) (toDyn $ Map.fromList [(tag,(level <= DEBUG))]) mpByType
59 Just dyn -> let mpByTag :: Map.Map tag Bool
60 mpByTag = fromDyn dyn Map.empty
61 in Map.insert (typeOf tag) (toDyn $ Map.insert tag (level <= DEBUG) mpByTag) mpByType
69 62
70setQuiet :: DebugTag -> IO () 63setQuiet :: forall tag. IsDebugTag tag => tag -> IO ()
71setQuiet = setTagLevel WARNING 64setQuiet = setTagLevel WARNING
72 65
73setVerbose :: DebugTag -> IO () 66setVerbose :: forall tag. IsDebugTag tag => tag -> IO ()
74setVerbose = setTagLevel DEBUG 67setVerbose = setTagLevel DEBUG
75 68
76getVerbose :: DebugTag -> IO Bool 69getVerbose :: forall tag. IsDebugTag tag => tag -> IO Bool
77getVerbose tag = do 70getVerbose tag = do
78 logger <- getLogger (appName <.> show tag) 71 logger <- getLogger (appName <.> show tag)
79 case getLevel logger of 72 case getLevel logger of
diff --git a/src/Data/PacketBuffer.hs b/src/Data/PacketBuffer.hs
index 343cb04e..17745664 100644
--- a/src/Data/PacketBuffer.hs
+++ b/src/Data/PacketBuffer.hs
@@ -19,6 +19,7 @@ module Data.PacketBuffer
19 19
20import Data.PacketQueue as Q 20import Data.PacketQueue as Q
21import DPut 21import DPut
22import DebugTag
22 23
23import Control.Concurrent.STM 24import Control.Concurrent.STM
24import Control.Monad 25import Control.Monad
diff --git a/src/Network/Address.hs b/src/Network/Address.hs
index 3adfdc91..246463c0 100644
--- a/src/Network/Address.hs
+++ b/src/Network/Address.hs
@@ -130,6 +130,7 @@ import System.Locale (defaultTimeLocale)
130#endif 130#endif
131import System.Entropy 131import System.Entropy
132import DPut 132import DPut
133import DebugTag
133 134
134-- import Paths_bittorrent (version) 135-- import Paths_bittorrent (version)
135 136
diff --git a/src/Network/BitTorrent/MainlineDHT.hs b/src/Network/BitTorrent/MainlineDHT.hs
index c5b99234..573efcba 100644
--- a/src/Network/BitTorrent/MainlineDHT.hs
+++ b/src/Network/BitTorrent/MainlineDHT.hs
@@ -83,6 +83,7 @@ import Text.Read
83import System.Global6 83import System.Global6
84import Control.TriadCommittee 84import Control.TriadCommittee
85import DPut 85import DPut
86import DebugTag
86 87
87newtype NodeId = NodeId ByteString 88newtype NodeId = NodeId ByteString
88 deriving (Eq,Ord,ByteArrayAccess, Bits, Hashable) 89 deriving (Eq,Ord,ByteArrayAccess, Bits, Hashable)
diff --git a/src/Network/Kademlia/Bootstrap.hs b/src/Network/Kademlia/Bootstrap.hs
index 1a70a9c5..aad8a81e 100644
--- a/src/Network/Kademlia/Bootstrap.hs
+++ b/src/Network/Kademlia/Bootstrap.hs
@@ -32,6 +32,7 @@ import Data.Ord
32import System.Entropy 32import System.Entropy
33import System.Timeout 33import System.Timeout
34import DPut 34import DPut
35import DebugTag
35 36
36import qualified Data.Wrapper.PSQInt as Int 37import qualified Data.Wrapper.PSQInt as Int
37 ;import Data.Wrapper.PSQInt (pattern (:->)) 38 ;import Data.Wrapper.PSQInt (pattern (:->))
diff --git a/src/Network/Lossless.hs b/src/Network/Lossless.hs
index 4d5521fd..861792ab 100644
--- a/src/Network/Lossless.hs
+++ b/src/Network/Lossless.hs
@@ -18,6 +18,7 @@ import System.IO.Error
18 18
19import Data.PacketBuffer as PB 19import Data.PacketBuffer as PB
20import DPut 20import DPut
21import DebugTag
21import Network.QueryResponse 22import Network.QueryResponse
22 23
23#ifdef THREAD_DEBUG 24#ifdef THREAD_DEBUG
diff --git a/src/Network/QueryResponse.hs b/src/Network/QueryResponse.hs
index fdfbdbae..4e110ec3 100644
--- a/src/Network/QueryResponse.hs
+++ b/src/Network/QueryResponse.hs
@@ -38,6 +38,7 @@ import System.IO
38import System.IO.Error 38import System.IO.Error
39import System.Timeout 39import System.Timeout
40import DPut 40import DPut
41import DebugTag
41 42
42-- | Three methods are required to implement a datagram based query\/response protocol. 43-- | Three methods are required to implement a datagram based query\/response protocol.
43data TransportA err addr x y = Transport 44data TransportA err addr x y = Transport
diff --git a/src/Network/StreamServer.hs b/src/Network/StreamServer.hs
index 2734f0cd..afa35675 100644
--- a/src/Network/StreamServer.hs
+++ b/src/Network/StreamServer.hs
@@ -44,6 +44,7 @@ import Control.Concurrent.MVar (newMVar)
44 44
45import Network.SocketLike 45import Network.SocketLike
46import DPut 46import DPut
47import DebugTag
47 48
48data ServerHandle = ServerHandle Socket (Weak ThreadId) 49data ServerHandle = ServerHandle Socket (Weak ThreadId)
49 50
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs
index 88228c50..ddb22d50 100644
--- a/src/Network/Tox.hs
+++ b/src/Network/Tox.hs
@@ -61,6 +61,7 @@ import OnionRouter
61import Network.Tox.ContactInfo 61import Network.Tox.ContactInfo
62import Text.XXD 62import Text.XXD
63import DPut 63import DPut
64import DebugTag
64import Network.Tox.Avahi 65import Network.Tox.Avahi
65import Network.Tox.Session 66import Network.Tox.Session
66import Network.SessionTransports 67import Network.SessionTransports
diff --git a/src/Network/Tox/AggregateSession.hs b/src/Network/Tox/AggregateSession.hs
index 2323673a..b248c96f 100644
--- a/src/Network/Tox/AggregateSession.hs
+++ b/src/Network/Tox/AggregateSession.hs
@@ -41,6 +41,7 @@ import Connection (Status (..))
41import Crypto.Tox (PublicKey, toPublic) 41import Crypto.Tox (PublicKey, toPublic)
42import Data.Wrapper.PSQInt as PSQ 42import Data.Wrapper.PSQInt as PSQ
43import DPut 43import DPut
44import DebugTag
44import Network.QueryResponse 45import Network.QueryResponse
45import Network.Tox.Crypto.Transport (CryptoMessage (..), pattern KillPacket, 46import Network.Tox.Crypto.Transport (CryptoMessage (..), pattern KillPacket,
46 pattern ONLINE, pattern PING, 47 pattern ONLINE, pattern PING,
diff --git a/src/Network/Tox/ContactInfo.hs b/src/Network/Tox/ContactInfo.hs
index 387a6e47..e7cb48c1 100644
--- a/src/Network/Tox/ContactInfo.hs
+++ b/src/Network/Tox/ContactInfo.hs
@@ -15,6 +15,7 @@ import Network.Tox.DHT.Transport as DHT
15import Network.Tox.NodeId (id2key) 15import Network.Tox.NodeId (id2key)
16import Network.Tox.Onion.Transport as Onion 16import Network.Tox.Onion.Transport as Onion
17import DPut 17import DPut
18import DebugTag
18 19
19newtype ContactInfo extra = ContactInfo 20newtype ContactInfo extra = ContactInfo
20 -- | Map our toxid public key to an Account record. 21 -- | Map our toxid public key to an Account record.
diff --git a/src/Network/Tox/Crypto/Handlers.hs b/src/Network/Tox/Crypto/Handlers.hs
index bf01e1b5..94dde8e3 100644
--- a/src/Network/Tox/Crypto/Handlers.hs
+++ b/src/Network/Tox/Crypto/Handlers.hs
@@ -51,6 +51,7 @@ import qualified Data.IntMap.Strict as IntMap
51import Control.Concurrent.Supply 51import Control.Concurrent.Supply
52import Data.InOrOut 52import Data.InOrOut
53import DPut 53import DPut
54import DebugTag
54import Text.Printf 55import Text.Printf
55import Data.Bool 56import Data.Bool
56import Network.Tox.Handshake 57import Network.Tox.Handshake
diff --git a/src/Network/Tox/Crypto/Transport.hs b/src/Network/Tox/Crypto/Transport.hs
index 84929e63..555164f2 100644
--- a/src/Network/Tox/Crypto/Transport.hs
+++ b/src/Network/Tox/Crypto/Transport.hs
@@ -87,6 +87,7 @@ import Data.Text.Encoding as T
87import Data.Serialize as S 87import Data.Serialize as S
88import Control.Arrow 88import Control.Arrow
89import DPut 89import DPut
90import DebugTag
90import Data.PacketBuffer as PB 91import Data.PacketBuffer as PB
91 92
92showCryptoMsg :: Word32 -> CryptoMessage -> [Char] 93showCryptoMsg :: Word32 -> CryptoMessage -> [Char]
diff --git a/src/Network/Tox/DHT/Handlers.hs b/src/Network/Tox/DHT/Handlers.hs
index b1db9044..d7f05dbc 100644
--- a/src/Network/Tox/DHT/Handlers.hs
+++ b/src/Network/Tox/DHT/Handlers.hs
@@ -40,6 +40,7 @@ import Data.Maybe
40import Data.Serialize (Serialize) 40import Data.Serialize (Serialize)
41import Data.Word 41import Data.Word
42import DPut 42import DPut
43import DebugTag
43 44
44data TransactionId = TransactionId 45data TransactionId = TransactionId
45 { transactionKey :: Nonce8 -- ^ Used to lookup pending query. 46 { transactionKey :: Nonce8 -- ^ Used to lookup pending query.
diff --git a/src/Network/Tox/Handshake.hs b/src/Network/Tox/Handshake.hs
index 0ca99fe2..6df9edab 100644
--- a/src/Network/Tox/Handshake.hs
+++ b/src/Network/Tox/Handshake.hs
@@ -23,6 +23,7 @@ import Control.Concurrent
23import GHC.Conc (labelThread) 23import GHC.Conc (labelThread)
24#endif 24#endif
25import DPut 25import DPut
26import DebugTag
26 27
27 28
28anyRight :: Monad m => a -> [t] -> (t -> m (Either b b1)) -> m (Either a b1) 29anyRight :: Monad m => a -> [t] -> (t -> m (Either b b1)) -> m (Either a b1)
diff --git a/src/Network/Tox/Onion/Handlers.hs b/src/Network/Tox/Onion/Handlers.hs
index 80a6ae3a..0d8a9151 100644
--- a/src/Network/Tox/Onion/Handlers.hs
+++ b/src/Network/Tox/Onion/Handlers.hs
@@ -38,6 +38,7 @@ import Data.IP
38import Data.Maybe 38import Data.Maybe
39import Data.Functor.Identity 39import Data.Functor.Identity
40import DPut 40import DPut
41import DebugTag
41 42
42type Client r = QR.Client String PacketKind TransactionId (OnionDestination r) Message 43type Client r = QR.Client String PacketKind TransactionId (OnionDestination r) Message
43type Message = OnionMessage Identity 44type Message = OnionMessage Identity
diff --git a/src/Network/Tox/Onion/Transport.hs b/src/Network/Tox/Onion/Transport.hs
index 7ed9702a..10bd5a44 100644
--- a/src/Network/Tox/Onion/Transport.hs
+++ b/src/Network/Tox/Onion/Transport.hs
@@ -82,6 +82,7 @@ import Network.Socket
82import qualified Text.ParserCombinators.ReadP as RP 82import qualified Text.ParserCombinators.ReadP as RP
83import Data.Hashable 83import Data.Hashable
84import DPut 84import DPut
85import DebugTag
85 86
86type HandleLo a = Maybe (Either String (ByteString, SockAddr)) -> IO a 87type HandleLo a = Maybe (Either String (ByteString, SockAddr)) -> IO a
87 88
diff --git a/src/Network/Tox/Session.hs b/src/Network/Tox/Session.hs
index 968b3503..18e17fb6 100644
--- a/src/Network/Tox/Session.hs
+++ b/src/Network/Tox/Session.hs
@@ -20,6 +20,7 @@ import Crypto.Tox
20import Data.PacketBuffer (PacketInboundEvent (..)) 20import Data.PacketBuffer (PacketInboundEvent (..))
21import Data.Tox.Message 21import Data.Tox.Message
22import DPut 22import DPut
23import DebugTag
23import Network.Lossless 24import Network.Lossless
24import Network.QueryResponse 25import Network.QueryResponse
25import Network.SessionTransports 26import Network.SessionTransports
diff --git a/src/Network/UPNP.hs b/src/Network/UPNP.hs
index e89471c2..01d222bf 100644
--- a/src/Network/UPNP.hs
+++ b/src/Network/UPNP.hs
@@ -6,6 +6,7 @@ import Network.Socket
6import System.Directory 6import System.Directory
7import System.Process as Process 7import System.Process as Process
8import DPut 8import DPut
9import DebugTag
9 10
10protocols :: SocketType -> [String] 11protocols :: SocketType -> [String]
11protocols Stream = ["tcp"] 12protocols Stream = ["tcp"]