1 module FuncTorrent.Metainfo
12 import Prelude hiding (lookup)
13 import Data.ByteString.Char8 (ByteString, pack, unpack)
14 import Data.Map as M ((!), lookup)
16 import FuncTorrent.Bencode (BVal(..))
18 -- only single file mode supported for the time being.
19 data Info = Info { pieceLength :: !Integer
20 , pieces :: !ByteString
21 , private :: !(Maybe Integer)
23 , lengthInBytes :: !Integer
24 , md5sum :: !(Maybe String)
27 data Metainfo = Metainfo { info :: !Info
29 , announceList :: !(Maybe [[String]])
30 , creationDate :: !(Maybe String)
31 , comment :: !(Maybe String)
32 , createdBy :: !(Maybe String)
33 , encoding :: !(Maybe String)
36 mkInfo :: BVal -> Maybe Info
37 mkInfo (Bdict m) = let (Bint pieceLength') = m ! Bstr (pack "piece length")
38 (Bstr pieces') = m ! Bstr (pack "pieces")
40 (Bstr name') = m ! Bstr (pack "name")
41 (Bint length') = m ! Bstr (pack "length")
43 in Just Info { pieceLength = pieceLength'
47 , lengthInBytes = length'
51 maybeBstrToString :: Maybe BVal -> Maybe String
52 maybeBstrToString Nothing = Nothing
53 maybeBstrToString (Just s) = let (Bstr bs) = s
56 mkMetaInfo :: BVal -> Maybe Metainfo
57 mkMetaInfo (Bdict m) = let (Just info') = mkInfo (m ! Bstr (pack "info"))
58 (Bstr announce') = m ! Bstr (pack "announce")
59 -- announceList = lookup (Bstr (pack "announce list"))
60 announceList' = Nothing
61 -- creationDate = lookup (Bstr (pack "creation date")) m
62 creationDate' = Nothing
63 comment' = lookup (Bstr (pack "comment")) m
64 createdBy' = lookup (Bstr (pack "created by")) m
65 encoding' = lookup (Bstr (pack "encoding")) m
66 in Just Metainfo { info = info'
67 , announce = unpack announce'
68 , announceList = announceList'
69 , creationDate = creationDate'
70 , comment = maybeBstrToString comment'
71 , createdBy = maybeBstrToString createdBy'
72 , encoding = maybeBstrToString encoding'
74 mkMetaInfo _ = Nothing