]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Metainfo.hs
Minor refactor maybeBstrToString
[functorrent.git] / src / FuncTorrent / Metainfo.hs
index 92b7b96a6b98a10c7b0d9a357c8ff0d55d0ec9b4..d6f2cf745f56e6e6438eff9a4ee9968a206323f9 100644 (file)
@@ -1,19 +1,20 @@
 module FuncTorrent.Metainfo
     (Info,
      Metainfo,
+     announceList,
      mkMetaInfo,
      mkInfo,
-     announce,
      lengthInBytes,
      info,
-     name
+     name,
     ) where
 
 import Prelude hiding (lookup)
-import Data.ByteString.Char8 (ByteString, pack, unpack)
+import Data.ByteString.Char8 (ByteString, unpack)
 import Data.Map as M ((!), lookup)
+import Data.Maybe (maybeToList)
 
-import FuncTorrent.Bencode (BVal(..))
+import FuncTorrent.Bencode (BVal(..), bstrToString)
 
 -- only single file mode supported for the time being.
 data Info = Info { pieceLength :: !Integer
@@ -25,8 +26,7 @@ data Info = Info { pieceLength :: !Integer
                  } deriving (Eq, Show)
 
 data Metainfo = Metainfo { info :: !Info
-                         , announce :: !String
-                         , announceList :: !(Maybe [[String]])
+                         , announceList :: ![String]
                          , creationDate :: !(Maybe String)
                          , comment :: !(Maybe String)
                          , createdBy :: !(Maybe String)
@@ -34,11 +34,11 @@ data Metainfo = Metainfo { info :: !Info
                          } deriving (Eq, Show)
 
 mkInfo :: BVal -> Maybe Info
-mkInfo (Bdict m) = let (Bint pieceLength') = m ! Bstr (pack "piece length")
-                       (Bstr pieces') = m ! Bstr (pack "pieces")
+mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
+                       (Bstr pieces') = m ! "pieces"
                        private' = Nothing
-                       (Bstr name') = m ! Bstr (pack "name")
-                       (Bint length') = m ! Bstr (pack "length")
+                       (Bstr name') = m ! "name"
+                       (Bint length') = m ! "length"
                        md5sum' = Nothing
                    in Just Info { pieceLength = pieceLength'
                                 , pieces = pieces'
@@ -49,26 +49,37 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! Bstr (pack "piece length")
 mkInfo _ = Nothing
 
 maybeBstrToString :: Maybe BVal -> Maybe String
-maybeBstrToString Nothing = Nothing
-maybeBstrToString (Just s) = let (Bstr bs) = s
-                             in Just (unpack bs)
+maybeBstrToString (Just (Bstr bs)) = Just $ unpack bs
+maybeBstrToString _ = Nothing
 
 mkMetaInfo :: BVal -> Maybe Metainfo
-mkMetaInfo (Bdict m) = let (Just info') = mkInfo (m ! Bstr (pack "info"))
-                           (Bstr announce') = m ! Bstr (pack "announce")
-                           -- announceList = lookup (Bstr (pack "announce list"))
-                           announceList' = Nothing
+mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info"
+                           announce' = lookup "announce" m
+                           announceList' = lookup "announce-list" m
                            -- creationDate = lookup (Bstr (pack "creation date")) m
                            creationDate' = Nothing
-                           comment' = lookup (Bstr (pack "comment")) m
-                           createdBy' = lookup (Bstr (pack "created by")) m
-                           encoding' = lookup (Bstr (pack "encoding")) m
+                           comment' = lookup "comment" m
+                           createdBy' = lookup "created by" m
+                           encoding' = lookup "encoding" m
                        in Just Metainfo { info = info'
-                                        , announce = unpack announce'
-                                        , announceList = announceList'
+                                        , announceList = maybeToList (announce' >>= bstrToString)
+                                                         ++ getAnnounceList announceList'
                                         , creationDate = creationDate'
                                         , comment = maybeBstrToString comment'
                                         , createdBy = maybeBstrToString createdBy'
                                         , encoding = maybeBstrToString encoding'
                                         }
 mkMetaInfo _ = Nothing
+
+getAnnounceList :: Maybe BVal -> [String]
+getAnnounceList Nothing = []
+getAnnounceList (Just (Bint _)) = []
+getAnnounceList (Just (Bstr _)) = []
+getAnnounceList (Just (Blist l)) = map (\s -> case s of
+                                               (Bstr s') ->  unpack s'
+                                               (Blist s') -> case s' of
+                                                              [Bstr s''] -> unpack s''
+                                                              _ -> ""
+                                               _ -> "") l
+
+getAnnounceList (Just (Bdict _)) = []