]> git.rkrishnan.org Git - functorrent.git/blob - src/FuncTorrent/Metainfo.hs
remove unnecessary parenthesis (hlint suggestion)
[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      getTrackers
11     ) where
12
13 import Prelude hiding (lookup)
14 import Data.ByteString.Char8 (ByteString, unpack)
15 import Data.Map as M ((!), lookup)
16
17 import FuncTorrent.Bencode (BVal(..))
18
19 -- only single file mode supported for the time being.
20 data Info = Info { pieceLength :: !Integer
21                  , pieces :: !ByteString
22                  , private :: !(Maybe Integer)
23                  , name :: !String
24                  , lengthInBytes :: !Integer
25                  , md5sum :: !(Maybe String)
26                  } deriving (Eq, Show)
27
28 data Metainfo = Metainfo { info :: !Info
29                          , announce :: !(Maybe String)
30                          , announceList :: ![String]
31                          , creationDate :: !(Maybe String)
32                          , comment :: !(Maybe String)
33                          , createdBy :: !(Maybe String)
34                          , encoding :: !(Maybe String)
35                          } deriving (Eq, Show)
36
37 mkInfo :: BVal -> Maybe Info
38 mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
39                        (Bstr pieces') = m ! "pieces"
40                        private' = Nothing
41                        (Bstr name') = m ! "name"
42                        (Bint length') = m ! "length"
43                        md5sum' = Nothing
44                    in Just Info { pieceLength = pieceLength'
45                                 , pieces = pieces'
46                                 , private = private'
47                                 , name = unpack name'
48                                 , lengthInBytes = length'
49                                 , md5sum = md5sum'}
50 mkInfo _ = Nothing
51
52 maybeBstrToString :: Maybe BVal -> Maybe String
53 maybeBstrToString Nothing = Nothing
54 maybeBstrToString (Just s) = let (Bstr bs) = s
55                              in Just (unpack bs)
56
57 mkMetaInfo :: BVal -> Maybe Metainfo
58 mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info"
59                            announce' = lookup "announce" m
60                            announceList' = lookup "announce-list" m
61                            -- creationDate = lookup (Bstr (pack "creation date")) m
62                            creationDate' = Nothing
63                            comment' = lookup "comment" m
64                            createdBy' = lookup "created by" m
65                            encoding' = lookup "encoding" m
66                        in Just Metainfo { info = info'
67                                         , announce = announce'
68                                                      >>= (\(Bstr a) ->
69                                                            Just (unpack a))
70                                         , announceList = getAnnounceList announceList'
71                                         , creationDate = creationDate'
72                                         , comment = maybeBstrToString comment'
73                                         , createdBy = maybeBstrToString createdBy'
74                                         , encoding = maybeBstrToString encoding'
75                                         }
76 mkMetaInfo _ = Nothing
77
78 getAnnounceList :: Maybe BVal -> [String]
79 getAnnounceList Nothing = []
80 getAnnounceList (Just (Bint _)) = []
81 getAnnounceList (Just (Bstr _)) = []
82 getAnnounceList (Just (Blist l)) = map (\s -> case s of
83                                                (Bstr s') ->  unpack s'
84                                                (Blist s') -> case s' of
85                                                               [Bstr s''] -> unpack s''
86                                                               _ -> ""
87                                                _ -> "") l
88
89 getAnnounceList (Just (Bdict _)) = []
90
91 getTrackers :: Metainfo -> [String]
92 getTrackers m = case announce m of
93                  Nothing -> announceList m
94                  Just a -> a : announceList m