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