summaryrefslogtreecommitdiff
path: root/src/Network/Tox
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/Tox')
-rw-r--r--src/Network/Tox/Crypto/Transport.hs43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/Network/Tox/Crypto/Transport.hs b/src/Network/Tox/Crypto/Transport.hs
index 8739c853..1e9156c6 100644
--- a/src/Network/Tox/Crypto/Transport.hs
+++ b/src/Network/Tox/Crypto/Transport.hs
@@ -403,15 +403,37 @@ instance HasMessageName CryptoMessage where
403messageName :: (Functor f, HasMessageName x) => (MessageName -> f MessageName) -> (x -> f x) 403messageName :: (Functor f, HasMessageName x) => (MessageName -> f MessageName) -> (x -> f x)
404messageName = lens getMessageName setMessageName 404messageName = lens getMessageName setMessageName
405 405
406data KnownLossyness = KnownLossy | KnownLossless
407 deriving (Eq,Ord,Show,Enum)
408
406data MessageType = Msg MessageID 409data MessageType = Msg MessageID
407 | GrpMsg MessageName 410 | GrpMsg KnownLossyness MessageName
408 deriving (Eq,Show) 411 deriving (Eq,Show)
409 412
413class AsWord16 a where
414 toWord16 :: a -> Word16
415 fromWord16 :: Word16 -> a
416
417toEnum8 ::Enum a => Word8 -> a
418toEnum8 = toEnum . fromIntegral
419fromEnum16 :: Enum a => a -> Word16
420fromEnum16 = fromIntegral . fromEnum
421
422instance AsWord16 MessageType where
423 toWord16 (Msg msgID) = fromIntegral (fromIntegral (fromEnum16 msgID) :: Word8)
424 toWord16 (GrpMsg lsy msgName) = 256 * (fromEnum16 lsy + 1) + fromIntegral (fromIntegral (fromEnum msgName) :: Word8)
425 fromWord16 x | x < 256 = Msg (toEnum $ fromIntegral x)
426 fromWord16 x = GrpMsg (toEnum8 ((fromIntegral (x `div` 256)) - 1)) (toEnum8 (fromIntegral x :: Word8))
427
428word16 :: (Functor f, AsWord16 x) => (Word16 -> f Word16) -> (x -> f x)
429word16 = lens toWord16 (\_ x -> fromWord16 x)
430
410instance Ord MessageType where 431instance Ord MessageType where
411 compare (Msg x) (Msg y) = compare x y 432 compare (Msg x) (Msg y) = compare x y
412 compare (GrpMsg x) (GrpMsg y) = compare x y 433 compare (GrpMsg lx x) (GrpMsg ly y) = let r1 = compare lx ly
413 compare (Msg _) (GrpMsg _) = LT 434 in if r1==EQ then compare x y else r1
414 compare (GrpMsg _) (Msg _) = GT 435 compare (Msg _) (GrpMsg _ _) = LT
436 compare (GrpMsg _ _) (Msg _) = GT
415 437
416class HasMessageType x where 438class HasMessageType x where
417 getMessageType :: x -> MessageType 439 getMessageType :: x -> MessageType
@@ -420,13 +442,16 @@ class HasMessageType x where
420instance HasMessageType CryptoMessage where 442instance HasMessageType CryptoMessage where
421 getMessageType (OneByte mid) = Msg mid 443 getMessageType (OneByte mid) = Msg mid
422 getMessageType (TwoByte mid _) = Msg mid 444 getMessageType (TwoByte mid _) = Msg mid
423 getMessageType m@(UpToN mid _) | isIndirectGrpChat mid = GrpMsg (getMessageName m) 445 getMessageType m@(UpToN MESSAGE_GROUPCHAT _) = GrpMsg KnownLossless (getMessageName m)
446 getMessageType m@(UpToN LOSSY_GROUPCHAT _) = GrpMsg KnownLossy (getMessageName m)
424 getMessageType (UpToN mid _) = Msg mid 447 getMessageType (UpToN mid _) = Msg mid
425 448
426 setMessageType m@(UpToN mid _) (GrpMsg mname) | isIndirectGrpChat mid = setMessageName m mname 449 setMessageType (OneByte _ ) (GrpMsg KnownLossless mname) = setMessageName (UpToN MESSAGE_GROUPCHAT B.empty ) mname
427 setMessageType (OneByte _ ) (GrpMsg mname) = setMessageName (UpToN MESSAGE_GROUPCHAT B.empty ) mname 450 setMessageType (TwoByte _ x) (GrpMsg KnownLossless mname) = setMessageName (UpToN MESSAGE_GROUPCHAT (B.singleton x)) mname
428 setMessageType (TwoByte _ x) (GrpMsg mname) = setMessageName (UpToN MESSAGE_GROUPCHAT (B.singleton x)) mname 451 setMessageType (OneByte _ ) (GrpMsg KnownLossy mname) = setMessageName (UpToN LOSSY_GROUPCHAT B.empty ) mname
429 setMessageType (UpToN _ x) (GrpMsg mname) = setMessageName (UpToN MESSAGE_GROUPCHAT x) mname 452 setMessageType (TwoByte _ x) (GrpMsg KnownLossy mname) = setMessageName (UpToN LOSSY_GROUPCHAT (B.singleton x)) mname
453 setMessageType (UpToN _ x) (GrpMsg KnownLossless mname) = setMessageName (UpToN MESSAGE_GROUPCHAT x) mname
454 setMessageType (UpToN _ x) (GrpMsg KnownLossy mname) = setMessageName (UpToN LOSSY_GROUPCHAT x) mname
430 setMessageType m (Msg mid) | Just (True,1) <- msgSizeParam mid = OneByte mid 455 setMessageType m (Msg mid) | Just (True,1) <- msgSizeParam mid = OneByte mid
431 setMessageType (OneByte mid0 ) (Msg mid) | Just (True,2) <- msgSizeParam mid = TwoByte mid 0 456 setMessageType (OneByte mid0 ) (Msg mid) | Just (True,2) <- msgSizeParam mid = TwoByte mid 0
432 setMessageType (TwoByte mid0 x) (Msg mid) | Just (True,2) <- msgSizeParam mid = TwoByte mid x 457 setMessageType (TwoByte mid0 x) (Msg mid) | Just (True,2) <- msgSizeParam mid = TwoByte mid x