-
Notifications
You must be signed in to change notification settings - Fork 0
/
CompactEncoding.hs
97 lines (84 loc) · 2.2 KB
/
CompactEncoding.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
module CompactEncoding
( module Data.Serialize.Get
, getList
, putList
, getCompactNodeInfo
, putCompactNodeInfo
, getCompactPeer4
, getCompactPeer6
, putCompactPeer
, getIP4
, putIP4
, getPort
, putPort
, getCNI
) where
import Control.Monad
import Data.ByteString.Lazy (ByteString)
import Data.Monoid
import Data.Serialize.Builder
import Data.Serialize.Get
import Network.Socket.Internal
import Numeric
import Types
getList :: ByteString -> Get a -> [a]
getList str g = case runGetLazyState g str of
Left s -> []
Right (p, rem) -> p : getList rem g
putList :: [a] -> (a -> Builder) -> ByteString
putList l p = toLazyByteString $ mconcat $ map p l
getCNI :: ByteString -> [(DHTNodeID, Address)]
getCNI b = getList b getCompactNodeInfo
getCompactNodeInfo :: Get (DHTNodeID, Address)
getCompactNodeInfo = do
id <- getLazyByteString 20
a <- getCompactPeer4
return (id, a)
putCompactNodeInfo :: (DHTNodeID, Address) -> Builder
putCompactNodeInfo (nid, a) = mconcat [fromLazyByteString nid, putCompactPeer a]
getIP4 = getWord32host
getPort = liftM PortNum getWord16host
putIP4 = putWord32host
putPort (PortNum port) = putWord16host port
getCompactPeer4 :: Get Address
getCompactPeer4 = do
--i1 <- getWord8
--i2 <- getWord8
--i3 <- getWord8
--i4 <- getWord8
i <- getIP4
p <- getPort
--return $ ((show i1 ++ "." ++ show i2 ++ "." ++ show i3 ++ "." ++ show i4), toEnum $ fromEnum p)
return $ (IP4 i, p)
putCompactPeer :: Address -> Builder
putCompactPeer (hn, p) = mconcat [putCompactHost hn, putWord16host $ fromIntegral p]
putCompactHost :: Host -> Builder
putCompactHost (StringName n) = undefined
putCompactHost (IP4 ip) = putIP4 ip
putCompactHost (IP6 (i1, i2, i3, i4)) = undefined
getCompactPeer6 :: Get Address
getCompactPeer6 = do
--let s = showHex
--i1 <- getWord16be
--i2 <- getWord16be
--i3 <- getWord16be
--i4 <- getWord16be
--i5 <- getWord16be
--i6 <- getWord16be
--i7 <- getWord16be
--i8 <- getWord16be
i1 <- getWord32be
i2 <- getWord32be
i3 <- getWord32be
i4 <- getWord32be
p <- getPort
--return $ ((
-- s i1 ":" ++
-- s i2 ":" ++
-- s i3 ":" ++
-- s i4 ":" ++
-- s i5 ":" ++
-- s i6 ":" ++
-- s i7 ":" ++
-- s i8 []), toEnum $ fromEnum p)
return (IP6 (i1, i2, i3, i4), p)