From f4dc7e5d85492d257c5b7e8e0e01eefa7a6da47d Mon Sep 17 00:00:00 2001 From: joe Date: Sun, 29 Oct 2017 17:36:52 -0400 Subject: Serlialize instance for PeerInfo. --- src/Network/Tox/Crypto/Transport.hs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/Network') diff --git a/src/Network/Tox/Crypto/Transport.hs b/src/Network/Tox/Crypto/Transport.hs index 09c492ef..20b0abae 100644 --- a/src/Network/Tox/Crypto/Transport.hs +++ b/src/Network/Tox/Crypto/Transport.hs @@ -141,6 +141,7 @@ instance Sized CryptoMessage where TwoByte {} -> 2 UpToN { msgBytes = bs } -> 1 + B.length bs +erCompat :: String -> a erCompat lens = error $ "Use of '" ++ lens ++ "' lens on incompatible CryptoMessage type" typingStatus :: Functor f => (UserStatus -> f UserStatus)-> (CryptoMessage -> f CryptoMessage) @@ -198,9 +199,11 @@ class HasGroupChatID x where getGroupChatID :: x -> GroupChatId setGroupChatID :: x -> GroupChatId -> x +sizedN :: Int -> ByteString -> ByteString sizedN n bs = if B.length bs < n then B.append bs (B.replicate (n - B.length bs) 0) else B.take n bs +sizedAtLeastN :: Int -> ByteString -> ByteString sizedAtLeastN n bs = if B.length bs < n then B.append bs (B.replicate (n - B.length bs) 0) else bs @@ -372,17 +375,40 @@ data PeerInfo , piName :: ByteString -- byte-prefix for length } deriving (Eq,Show) +instance Serialize PeerInfo where + get = do + w16 <- get + ukey <- id2key <$> get + dkey <- id2key <$> get + w8 <- get :: Get Word8 + PeerInfo w16 ukey dkey <$> getBytes (fromIntegral w8) + + put (PeerInfo w16 ukey dkey bs) = do + put w16 + put $ key2id ukey + put $ key2id dkey + let sz :: Word8 + sz = case B.length bs of + n | n <= 255 -> fromIntegral n + | otherwise -> 255 + put sz + putByteString $ B.take (fromIntegral sz) bs + -- | -- default constructor, handy for formations such as: -- -- > userStatus .~ Busy $ msg USERSTATUS -- +msg :: MessageID -> CryptoMessage msg mid | Just (True,0) <- msgSizeParam mid = OneByte mid msg mid | Just (True,1) <- msgSizeParam mid = TwoByte mid 0 msg mid | Just (False,_) <- msgSizeParam mid = UpToN mid B.empty +leaveMsg :: Serialize a => a -> CryptoMessage leaveMsg groupnum = UpToN DIRECT_GROUPCHAT (B.snoc (S.encode groupnum) 0x01) + +peerQueryMsg :: Serialize a => a -> CryptoMessage peerQueryMsg groupnum = UpToN DIRECT_GROUPCHAT (B.snoc (S.encode groupnum) 0x08) -- cgit v1.2.3