]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Metainfo.hs
metainfo: refactoring
[functorrent.git] / src / FuncTorrent / Metainfo.hs
index ec65294d852fca3125d0f1ec5db08e27ddbfcc01..9a7d7a869fd7bd4dac5b6bd6bcc5d38e71adcfdb 100644 (file)
@@ -22,7 +22,6 @@
 module FuncTorrent.Metainfo
     (Info(..)
     , Metainfo(..)
-    , DynamicInfo(..)
     , FileInfo(..)
     , torrentToMetainfo
     ) where
@@ -40,15 +39,9 @@ import FuncTorrent.Bencode (BVal(..), encode, decode, bstrToString, bValToIntege
 data Info = Info { pieceLength :: !Integer
                  , pieces :: !ByteString
                  , private :: !(Maybe Integer)
-                 , dyninfo :: !DynamicInfo
+                 , files :: ![FileInfo]
                  } deriving (Eq, Show)
 
-data DynamicInfo = SingleFileInfo { file :: FileInfo }
-                 | MultiFileInfo { dname :: String
-                                 , files :: [FileInfo]
-                                 }
-                 deriving (Eq, Show)
-
 data FileInfo = FileInfo { lengthInBytes :: Integer
                          , md5sum :: Maybe String
                          , path :: String
@@ -63,8 +56,8 @@ data Metainfo = Metainfo { info :: !Info
                          , infoHash :: !ByteString
                          } deriving (Eq, Show)
 
-mkPath :: [BVal] -> String
-mkPath xs = intercalate "/" $ map (\b -> let (Just s) = bstrToString b in s) xs
+mkPath :: String -> [BVal] -> String
+mkPath base xs = base ++ "/" ++ (intercalate "/" $ map (\b -> let (Just s) = bstrToString b in s) xs)
 
 mkInfo :: BVal -> Maybe Info
 mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
@@ -75,24 +68,22 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                      case bdictfiles of
                        Just fs -> let (Blist files') = fs
                                       (Bstr name') = m ! "name"
+                                      dname' = unpack name'
                                   in
                                     Just Info { pieceLength = pieceLength'
                                               , pieces = pieces'
                                               , private = private'
-                                              , dyninfo = MultiFileInfo {
-                                                  dname = unpack name',
-                                                  files =
-                                                      map (\(Bdict f) ->
-                                                            let (Just len') = bValToInteger (f ! "length")
-                                                                (Blist ds) = f ! "path"
-                                                                path' = mkPath ds
-                                                            in
-                                                              FileInfo { lengthInBytes = len',
-                                                                         md5sum = Nothing,
-                                                                         path = path'
-                                                                     })
-                                                      files' }
-                                              }
+                                              , files =
+                                                  map (\(Bdict f) ->
+                                                        let (Just len') = bValToInteger (f ! "length")
+                                                            (Blist ds) = f ! "path"
+                                                            path' = mkPath dname' ds
+                                                        in
+                                                          FileInfo { lengthInBytes = len',
+                                                                     md5sum = Nothing,
+                                                                     path = path'
+                                                                   })
+                                                  files' }
                        Nothing -> let (Bstr name') = m ! "name"
                                       (Bint length') = m ! "length"
                                       md5sum' = Nothing
@@ -100,13 +91,12 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                                     Just Info { pieceLength = pieceLength'
                                               , pieces = pieces'
                                               , private = private'
-                                              , dyninfo = SingleFileInfo {
-                                                  file = FileInfo {
-                                                      path = unpack name',
-                                                      lengthInBytes = length',
-                                                      md5sum = md5sum'
-                                                      }
-                                                  }
+                                              , files = [ FileInfo {
+                                                            path = unpack name',
+                                                            lengthInBytes = length',
+                                                            md5sum = md5sum'
+                                                            }
+                                                        ]
                                               }
 
 mkInfo _ = Nothing