diff options
Diffstat (limited to 'src/Network/BitTorrent/Exchange/Extension.hs')
-rw-r--r-- | src/Network/BitTorrent/Exchange/Extension.hs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/Network/BitTorrent/Exchange/Extension.hs b/src/Network/BitTorrent/Exchange/Extension.hs new file mode 100644 index 00000000..a4d72f96 --- /dev/null +++ b/src/Network/BitTorrent/Exchange/Extension.hs | |||
@@ -0,0 +1,65 @@ | |||
1 | -- | | ||
2 | -- Copyright : (c) Sam Truzjan 2013 | ||
3 | -- License : BSD3 | ||
4 | -- Maintainer : pxqr.sta@gmail.com | ||
5 | -- Stability : experimental | ||
6 | -- Portability : portable | ||
7 | -- | ||
8 | -- This module provides peer capabilities detection. | ||
9 | -- | ||
10 | -- See <http://www.bittorrent.org/beps/bep_0004.html> for more | ||
11 | -- information. | ||
12 | -- | ||
13 | module Network.BitTorrent.Exchange.Extension | ||
14 | ( -- * Capabilities | ||
15 | Capabilities | ||
16 | , ppCaps, defaultCaps | ||
17 | , enabledCaps | ||
18 | |||
19 | -- * Extensions | ||
20 | , Extension(..) | ||
21 | , defaultExtensions, ppExtension | ||
22 | , encodeExts, decodeExts | ||
23 | ) where | ||
24 | |||
25 | import Data.Bits | ||
26 | import Data.Word | ||
27 | import Text.PrettyPrint | ||
28 | |||
29 | |||
30 | type Capabilities = Word64 | ||
31 | |||
32 | ppCaps :: Capabilities -> Doc | ||
33 | ppCaps = hcat . punctuate ", " . map ppExtension . decodeExts | ||
34 | |||
35 | defaultCaps :: Capabilities | ||
36 | defaultCaps = 0 | ||
37 | |||
38 | enabledCaps :: Capabilities -- ^ of the client. | ||
39 | -> Capabilities -- ^ of the peer. | ||
40 | -> Capabilities -- ^ should be considered as enabled. | ||
41 | enabledCaps = (.&.) | ||
42 | |||
43 | |||
44 | data Extension = ExtDHT -- ^ BEP 5 | ||
45 | | ExtFast -- ^ BEP 6 | ||
46 | deriving (Show, Eq, Ord, Enum, Bounded) | ||
47 | |||
48 | ppExtension :: Extension -> Doc | ||
49 | ppExtension ExtDHT = "DHT" | ||
50 | ppExtension ExtFast = "Fast Extension" | ||
51 | |||
52 | extensionMask :: Extension -> Word64 | ||
53 | extensionMask ExtDHT = 0x01 | ||
54 | extensionMask ExtFast = 0x04 | ||
55 | |||
56 | defaultExtensions :: [Extension] | ||
57 | defaultExtensions = [] | ||
58 | |||
59 | encodeExts :: [Extension] -> Capabilities | ||
60 | encodeExts = foldr (.&.) 0 . map extensionMask | ||
61 | |||
62 | decodeExts :: Capabilities -> [Extension] | ||
63 | decodeExts rb = filter (testMask rb . extensionMask) [minBound..maxBound] | ||
64 | where | ||
65 | testMask bits x = bits .&. x > 0 | ||