3 import Prelude hiding (lookup)
4 import Bencode (BVal(..))
5 import Data.ByteString.Char8 (ByteString, pack, unpack)
6 import Data.Map as M ((!), lookup)
8 -- only single file mode supported for the time being.
9 data Info = Info { pieceLength :: !Integer
10 , pieces :: !ByteString
11 , private :: !(Maybe Integer)
13 , lengthInBytes :: !Integer
14 , md5sum :: !(Maybe String)
17 data Metainfo = Metainfo { info :: !Info
19 , announceList :: !(Maybe [[String]])
20 , creationDate :: !(Maybe String)
21 , comment :: !(Maybe String)
22 , createdBy :: !(Maybe String)
23 , encoding :: !(Maybe String)
26 mkInfo :: BVal -> Maybe Info
27 mkInfo (Bdict m) = let (Bint pieceLength') = m ! Bstr (pack "piece length")
28 (Bstr pieces') = m ! Bstr (pack "pieces")
30 (Bstr name') = m ! Bstr (pack "name")
31 (Bint length') = m ! Bstr (pack "length")
33 in Just Info { pieceLength = pieceLength'
37 , lengthInBytes = length'
41 maybeBstrToString :: Maybe BVal -> Maybe String
42 maybeBstrToString Nothing = Nothing
43 maybeBstrToString (Just s) = let (Bstr bs) = s
46 mkMetaInfo :: BVal -> Maybe Metainfo
47 mkMetaInfo (Bdict m) = let (Just info') = mkInfo (m ! Bstr (pack "info"))
48 (Bstr announce') = m ! Bstr (pack "announce")
49 -- announceList = lookup (Bstr (pack "announce list"))
50 announceList' = Nothing
51 -- creationDate = lookup (Bstr (pack "creation date")) m
52 creationDate' = Nothing
53 comment' = lookup (Bstr (pack "comment")) m
54 createdBy' = lookup (Bstr (pack "created by")) m
55 encoding' = lookup (Bstr (pack "encoding")) m
56 in Just Metainfo { info = info'
57 , announce = unpack announce'
58 , announceList = announceList'
59 , creationDate = creationDate'
60 , comment = maybeBstrToString comment'
61 , createdBy = maybeBstrToString createdBy'
62 , encoding = maybeBstrToString encoding'
64 mkMetaInfo _ = Nothing