]> git.rkrishnan.org Git - functorrent.git/blob - src/Metainfo.hs
refactor PeerID and associated functions.
[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
7 -- only single file mode supported for the time being.
8 data Info = Info { pieceLength :: !Integer
9                  , pieces :: !BC.ByteString
10                  , private :: !(Maybe Integer)
11                  , name :: !String
12                  , lengthInBytes :: !Integer
13                  , md5sum :: !(Maybe String)
14                  } deriving (Eq, Show)
15
16 data Metainfo = Metainfo { info :: !Info
17                          , announce :: !String
18                          , announceList :: !(Maybe [[String]])
19                          , creationDate :: !(Maybe String)
20                          , comment :: !(Maybe String)
21                          , createdBy :: !(Maybe String)
22                          , encoding :: !(Maybe String)
23                          } deriving (Eq, Show)
24
25 mkInfo :: Benc.BVal -> Maybe Info
26 mkInfo (Benc.Bdict m) = let (Benc.Bint pieceLength') = m M.! Benc.Bstr (BC.pack "piece length")
27                             (Benc.Bstr pieces') = m M.! Benc.Bstr (BC.pack "pieces")
28                             private' = Nothing
29                             (Benc.Bstr name') = m M.! Benc.Bstr (BC.pack "name")
30                             (Benc.Bint length') = m M.! Benc.Bstr (BC.pack "length")
31                             md5sum' = Nothing
32                         in Just Info { pieceLength = pieceLength'
33                                      , pieces = pieces'
34                                      , private = private'
35                                      , name = BC.unpack name'
36                                      , lengthInBytes = length'
37                                      , md5sum = md5sum'
38                                      }
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                                              }
64 mkMetaInfo _ = Nothing