summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/Exchange/Extension.hs
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2013-11-28 19:50:00 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2013-11-28 19:50:00 +0400
commit2f3b01abced907c47059c73e0b1e56998a3a24f7 (patch)
treea5e942735e39f6a4fc426cab603908f28b22fca2 /src/Network/BitTorrent/Exchange/Extension.hs
parent38343d54ba1c61aebd11efb09a64fafbd3c2d875 (diff)
Move extension module
Diffstat (limited to 'src/Network/BitTorrent/Exchange/Extension.hs')
-rw-r--r--src/Network/BitTorrent/Exchange/Extension.hs65
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--
13module 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
25import Data.Bits
26import Data.Word
27import Text.PrettyPrint
28
29
30type Capabilities = Word64
31
32ppCaps :: Capabilities -> Doc
33ppCaps = hcat . punctuate ", " . map ppExtension . decodeExts
34
35defaultCaps :: Capabilities
36defaultCaps = 0
37
38enabledCaps :: Capabilities -- ^ of the client.
39 -> Capabilities -- ^ of the peer.
40 -> Capabilities -- ^ should be considered as enabled.
41enabledCaps = (.&.)
42
43
44data Extension = ExtDHT -- ^ BEP 5
45 | ExtFast -- ^ BEP 6
46 deriving (Show, Eq, Ord, Enum, Bounded)
47
48ppExtension :: Extension -> Doc
49ppExtension ExtDHT = "DHT"
50ppExtension ExtFast = "Fast Extension"
51
52extensionMask :: Extension -> Word64
53extensionMask ExtDHT = 0x01
54extensionMask ExtFast = 0x04
55
56defaultExtensions :: [Extension]
57defaultExtensions = []
58
59encodeExts :: [Extension] -> Capabilities
60encodeExts = foldr (.&.) 0 . map extensionMask
61
62decodeExts :: Capabilities -> [Extension]
63decodeExts rb = filter (testMask rb . extensionMask) [minBound..maxBound]
64 where
65 testMask bits x = bits .&. x > 0