3 import qualified Bencode as Benc
4 import qualified Data.ByteString.Char8 as BC
5 import qualified Data.Map as M
8 -- only single file mode supported for the time being.
9 data Info = Info { pieceLength :: Integer
10 , pieces :: BC.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 :: Benc.BVal -> Maybe Info
27 mkInfo (Benc.Bdict m) = let (Benc.Bint pieceLength') = m M.! (Benc.Bstr (BC.pack "piece length"))
28 (Benc.Bstr pieces') = m M.! (Benc.Bstr (BC.pack "pieces"))
30 (Benc.Bstr name') = m M.! (Benc.Bstr (BC.pack "name"))
31 (Benc.Bint length') = m M.! (Benc.Bstr (BC.pack "length"))
33 in Just Info { pieceLength = pieceLength'
36 , name = BC.unpack name'
37 , 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' }
63 mkMetaInfo _ = Nothing