summaryrefslogtreecommitdiff
path: root/src/Network/Tox/Crypto/Transport.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/Tox/Crypto/Transport.hs')
-rw-r--r--src/Network/Tox/Crypto/Transport.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Network/Tox/Crypto/Transport.hs b/src/Network/Tox/Crypto/Transport.hs
index 634a7a43..7bc6e67f 100644
--- a/src/Network/Tox/Crypto/Transport.hs
+++ b/src/Network/Tox/Crypto/Transport.hs
@@ -43,6 +43,8 @@ module Network.Tox.Crypto.Transport
43 , sizedN 43 , sizedN
44 , sizedAtLeastN 44 , sizedAtLeastN
45 , isIndirectGrpChat 45 , isIndirectGrpChat
46 , LossyOrLossless(..)
47 , lossyness
46 ) where 48 ) where
47 49
48import Crypto.Tox 50import Crypto.Tox
@@ -148,6 +150,10 @@ data CryptoData = CryptoData
148 , bufferData :: CryptoMessage 150 , bufferData :: CryptoMessage
149 } 151 }
150 152
153instance Serialize CryptoData where
154 get = CryptoData <$> get <*> get <*> get
155 put (CryptoData start end dta) = put start >> put end >> put dta
156
151-- The 'UserStatus' equivalent in Presence is: 157-- The 'UserStatus' equivalent in Presence is:
152-- 158--
153-- data JabberShow = Offline 159-- data JabberShow = Offline
@@ -176,6 +182,25 @@ instance Sized CryptoMessage where
176 TwoByte {} -> 2 182 TwoByte {} -> 2
177 UpToN { msgBytes = bs } -> 1 + B.length bs 183 UpToN { msgBytes = bs } -> 1 + B.length bs
178 184
185instance Serialize CryptoMessage where
186 get = do
187 i <- get :: Get MessageID
188 n <- remaining
189 case msgSizeParam i of
190 Just (True,1) -> return $ OneByte i
191 Just (True,2) -> TwoByte i <$> get
192 _ -> UpToN i <$> getByteString n
193
194 put (OneByte i) = putWord8 (fromIntegral . fromEnum $ i)
195 put (TwoByte i b) = do putWord8 (fromIntegral . fromEnum $ i)
196 putWord8 b
197 put (UpToN i x) = do putWord8 (fromIntegral . fromEnum $ i)
198 putByteString x
199
200instance Serialize MessageID where
201 get = toEnum . fromIntegral <$> getWord8
202 put x = putWord8 (fromIntegral . fromEnum $ x)
203
179erCompat :: String -> a 204erCompat :: String -> a
180erCompat lens = error $ "Use of '" ++ lens ++ "' lens on incompatible CryptoMessage type" 205erCompat lens = error $ "Use of '" ++ lens ++ "' lens on incompatible CryptoMessage type"
181 206
@@ -381,6 +406,12 @@ data MessageType = Msg MessageID
381 | GrpMsg MessageName 406 | GrpMsg MessageName
382 deriving (Eq,Show) 407 deriving (Eq,Show)
383 408
409instance Ord MessageType where
410 compare (Msg x) (Msg y) = compare x y
411 compare (GrpMsg x) (GrpMsg y) = compare x y
412 compare (Msg _) (GrpMsg _) = LT
413 compare (GrpMsg _) (Msg _) = GT
414
384class HasMessageType x where 415class HasMessageType x where
385 getMessageType :: x -> MessageType 416 getMessageType :: x -> MessageType
386 setMessageType :: x -> MessageType -> x 417 setMessageType :: x -> MessageType -> x
@@ -564,6 +595,16 @@ isIndirectGrpChat MESSAGE_GROUPCHAT = True
564isIndirectGrpChat LOSSY_GROUPCHAT = True 595isIndirectGrpChat LOSSY_GROUPCHAT = True
565isIndirectGrpChat _ = False 596isIndirectGrpChat _ = False
566 597
598data LossyOrLossless = UnknownLossyness | Lossless | Lossy
599 deriving (Eq,Ord,Enum,Show,Bounded)
600
601lossyness :: MessageID -> LossyOrLossless
602lossyness (fromEnum -> x) | x < 3 = Lossy
603lossyness (fromEnum -> x) | x >= 16, x < 192 = Lossless
604lossyness (fromEnum -> x) | x >= 192, x < 255 = Lossy
605lossyness (fromEnum -> 255) = Lossless
606lossyness _ = UnknownLossyness
607
567-- TODO: Flesh this out. 608-- TODO: Flesh this out.
568data MessageID -- First byte indicates data 609data MessageID -- First byte indicates data
569 = Padding -- ^ 0 padding (skipped until we hit a non zero (data id) byte) 610 = Padding -- ^ 0 padding (skipped until we hit a non zero (data id) byte)