]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Metainfo.hs
Clean up tracker network code
[functorrent.git] / src / FuncTorrent / Metainfo.hs
index dad0865bfbb4eae1e6bc8d28ed9adb8e2d9cf971..a3313d18cbb5c6338de4a38466719af25ad47258 100644 (file)
@@ -1,20 +1,17 @@
 module FuncTorrent.Metainfo
-    (Info,
-     Metainfo,
-     mkMetaInfo,
+    (Info(..),
+     Metainfo(..),
      mkInfo,
-     announce,
-     lengthInBytes,
-     info,
-     name,
-     getTrackers
+     mkMetaInfo
     ) where
 
 import Prelude hiding (lookup)
 import Data.ByteString.Char8 (ByteString, unpack)
 import Data.Map as M ((!), lookup)
+import Crypto.Hash.SHA1 (hash)
+import Data.Maybe (maybeToList)
 
-import FuncTorrent.Bencode (BVal(..))
+import FuncTorrent.Bencode (BVal(..), encode, bstrToString, bValToInteger)
 
 -- only single file mode supported for the time being.
 data Info = Info { pieceLength :: !Integer
@@ -26,12 +23,12 @@ data Info = Info { pieceLength :: !Integer
                  } deriving (Eq, Show)
 
 data Metainfo = Metainfo { info :: !Info
-                         , announce :: !(Maybe String)
                          , announceList :: ![String]
-                         , creationDate :: !(Maybe String)
+                         , creationDate :: !(Maybe Integer)
                          , comment :: !(Maybe String)
                          , createdBy :: !(Maybe String)
                          , encoding :: !(Maybe String)
+                         , infoHash :: !ByteString
                          } deriving (Eq, Show)
 
 mkInfo :: BVal -> Maybe Info
@@ -49,30 +46,26 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                                 , md5sum = md5sum'}
 mkInfo _ = Nothing
 
-maybeBstrToString :: Maybe BVal -> Maybe String
-maybeBstrToString Nothing = Nothing
-maybeBstrToString (Just s) = let (Bstr bs) = s
-                             in Just (unpack bs)
+mkMetaInfo :: BVal   -> Maybe Metainfo
+mkMetaInfo (Bdict m)  =
+    let (Just info')  = mkInfo $ m ! "info"
+        announce'     = lookup "announce" m
+        announceList' = lookup "announce-list" m
+        creationDate' = lookup "creation date" m
+        comment'      = lookup "comment" m
+        createdBy'    = lookup "created by" m
+        encoding'     = lookup "encoding" m
+    in Just Metainfo {
+             info         = info'
+           , announceList = maybeToList (announce' >>= bstrToString)
+                            ++ getAnnounceList announceList'
+           , creationDate = bValToInteger =<< creationDate'
+           , comment      = bstrToString  =<< comment'
+           , createdBy    = bstrToString  =<< createdBy'
+           , encoding     = bstrToString  =<< encoding'
+           , infoHash     = hash . encode $ (m ! "info")
+        }
 
-mkMetaInfo :: BVal -> Maybe Metainfo
-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 "comment" m
-                           createdBy' = lookup "created by" m
-                           encoding' = lookup "encoding" m
-                       in Just Metainfo { info = info'
-                                        , announce = announce'
-                                                     >>= (\(Bstr a) ->
-                                                           Just (unpack a))
-                                        , announceList = getAnnounceList announceList'
-                                        , creationDate = creationDate'
-                                        , comment = maybeBstrToString comment'
-                                        , createdBy = maybeBstrToString createdBy'
-                                        , encoding = maybeBstrToString encoding'
-                                        }
 mkMetaInfo _ = Nothing
 
 getAnnounceList :: Maybe BVal -> [String]
@@ -87,8 +80,3 @@ getAnnounceList (Just (Blist l)) = map (\s -> case s of
                                                _ -> "") l
 
 getAnnounceList (Just (Bdict _)) = []
-
-getTrackers :: Metainfo -> [String]
-getTrackers m = case (announce m) of
-                 Nothing -> announceList m
-                 Just a -> a : announceList m