]> git.rkrishnan.org Git - functorrent.git/blob - src/Metainfo.hs
parse and print Metainfo
[functorrent.git] / src / Metainfo.hs
1 module Metainfo where
2
3 import qualified Bencode as Benc
4 import qualified Data.ByteString.Char8 as BC
5 import qualified Data.Map as M
6 import Data.Time.Clock
7
8 -- only single file mode supported for the time being.
9 data Info = Info { pieceLength :: Integer
10                  , pieces :: BC.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 :: 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"))
29                             private' = Nothing
30                             (Benc.Bstr name') = m M.! (Benc.Bstr (BC.pack "name"))
31                             (Benc.Bint length') = m M.! (Benc.Bstr (BC.pack "length"))
32                             md5sum' = Nothing
33                         in Just Info { pieceLength = pieceLength'
34                                      , pieces = pieces'
35                                      , private = private'
36                                      , name = BC.unpack name'
37                                      , lengthInBytes = length'
38                                      , md5sum = md5sum' }
39 mkInfo _ = Nothing
40
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)
45
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
64