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