]> git.rkrishnan.org Git - functorrent.git/blob - src/FuncTorrent/Metainfo.hs
Merge pull request #12 from jaseemabid/master
[functorrent.git] / src / FuncTorrent / Metainfo.hs
1 module FuncTorrent.Metainfo
2     (Info,
3      Metainfo,
4      mkMetaInfo,
5      mkInfo,
6      announce,
7      lengthInBytes,
8      info,
9      name
10     ) where
11
12 import Prelude hiding (lookup)
13 import Data.ByteString.Char8 (ByteString, pack, unpack)
14 import Data.Map as M ((!), lookup)
15
16 import FuncTorrent.Bencode (BVal(..))
17
18 -- only single file mode supported for the time being.
19 data Info = Info { pieceLength :: !Integer
20                  , pieces :: !ByteString
21                  , private :: !(Maybe Integer)
22                  , name :: !String
23                  , lengthInBytes :: !Integer
24                  , md5sum :: !(Maybe String)
25                  } deriving (Eq, Show)
26
27 data Metainfo = Metainfo { info :: !Info
28                          , announce :: !String
29                          , announceList :: !(Maybe [[String]])
30                          , creationDate :: !(Maybe String)
31                          , comment :: !(Maybe String)
32                          , createdBy :: !(Maybe String)
33                          , encoding :: !(Maybe String)
34                          } deriving (Eq, Show)
35
36 mkInfo :: BVal -> Maybe Info
37 mkInfo (Bdict m) = let (Bint pieceLength') = m ! Bstr (pack "piece length")
38                        (Bstr pieces') = m ! Bstr (pack "pieces")
39                        private' = Nothing
40                        (Bstr name') = m ! Bstr (pack "name")
41                        (Bint length') = m ! Bstr (pack "length")
42                        md5sum' = Nothing
43                    in Just Info { pieceLength = pieceLength'
44                                 , pieces = pieces'
45                                 , private = private'
46                                 , name = unpack name'
47                                 , lengthInBytes = length'
48                                 , md5sum = md5sum'}
49 mkInfo _ = Nothing
50
51 maybeBstrToString :: Maybe BVal -> Maybe String
52 maybeBstrToString Nothing = Nothing
53 maybeBstrToString (Just s) = let (Bstr bs) = s
54                              in Just (unpack bs)
55
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'
73                                         }
74 mkMetaInfo _ = Nothing