diff options
author | James Crayne <jim.crayne@gmail.com> | 2017-10-31 08:57:40 +0000 |
---|---|---|
committer | James Crayne <jim.crayne@gmail.com> | 2017-10-31 08:57:40 +0000 |
commit | 8d21a2251fb1365d68673d880047c528ba3d6331 (patch) | |
tree | 56c2c016c3a17f7b48261bce8584147c0ae63ae1 /src/Network/Tox/Crypto/Transport.hs | |
parent | 4188bfddf8ffb547122f08bb70b11d7f16c56220 (diff) |
NetCrypto wip, compiles
Diffstat (limited to 'src/Network/Tox/Crypto/Transport.hs')
-rw-r--r-- | src/Network/Tox/Crypto/Transport.hs | 41 |
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 | ||
48 | import Crypto.Tox | 50 | import Crypto.Tox |
@@ -148,6 +150,10 @@ data CryptoData = CryptoData | |||
148 | , bufferData :: CryptoMessage | 150 | , bufferData :: CryptoMessage |
149 | } | 151 | } |
150 | 152 | ||
153 | instance 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 | ||
185 | instance 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 | |||
200 | instance Serialize MessageID where | ||
201 | get = toEnum . fromIntegral <$> getWord8 | ||
202 | put x = putWord8 (fromIntegral . fromEnum $ x) | ||
203 | |||
179 | erCompat :: String -> a | 204 | erCompat :: String -> a |
180 | erCompat lens = error $ "Use of '" ++ lens ++ "' lens on incompatible CryptoMessage type" | 205 | erCompat 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 | ||
409 | instance 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 | |||
384 | class HasMessageType x where | 415 | class 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 | |||
564 | isIndirectGrpChat LOSSY_GROUPCHAT = True | 595 | isIndirectGrpChat LOSSY_GROUPCHAT = True |
565 | isIndirectGrpChat _ = False | 596 | isIndirectGrpChat _ = False |
566 | 597 | ||
598 | data LossyOrLossless = UnknownLossyness | Lossless | Lossy | ||
599 | deriving (Eq,Ord,Enum,Show,Bounded) | ||
600 | |||
601 | lossyness :: MessageID -> LossyOrLossless | ||
602 | lossyness (fromEnum -> x) | x < 3 = Lossy | ||
603 | lossyness (fromEnum -> x) | x >= 16, x < 192 = Lossless | ||
604 | lossyness (fromEnum -> x) | x >= 192, x < 255 = Lossy | ||
605 | lossyness (fromEnum -> 255) = Lossless | ||
606 | lossyness _ = UnknownLossyness | ||
607 | |||
567 | -- TODO: Flesh this out. | 608 | -- TODO: Flesh this out. |
568 | data MessageID -- First byte indicates data | 609 | data 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) |