]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Metainfo.hs
multi-file torrent metainfo tests
[functorrent.git] / src / FuncTorrent / Metainfo.hs
index 596ad68def10b461ee04f52b78152fb2ed9bf694..ec65294d852fca3125d0f1ec5db08e27ddbfcc01 100644 (file)
@@ -23,12 +23,14 @@ module FuncTorrent.Metainfo
     (Info(..)
     , Metainfo(..)
     , DynamicInfo(..)
+    , FileInfo(..)
     , torrentToMetainfo
     ) where
 
 import Prelude hiding (lookup)
 import Data.ByteString.Char8 (ByteString, unpack)
 import Data.Map as M ((!), lookup)
+import Data.List (intercalate)
 import Crypto.Hash.SHA1 (hash)
 import Data.Maybe (maybeToList)
 
@@ -41,10 +43,7 @@ data Info = Info { pieceLength :: !Integer
                  , dyninfo :: !DynamicInfo
                  } deriving (Eq, Show)
 
-data DynamicInfo = SingleFileInfo { name :: String
-                                  , lengthInBytes :: Integer
-                                  , md5sum :: Maybe String
-                                  }
+data DynamicInfo = SingleFileInfo { file :: FileInfo }
                  | MultiFileInfo { dname :: String
                                  , files :: [FileInfo]
                                  }
@@ -64,6 +63,9 @@ 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
+
 mkInfo :: BVal -> Maybe Info
 mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                        (Bstr pieces') = m ! "pieces"
@@ -82,11 +84,12 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                                                   files =
                                                       map (\(Bdict f) ->
                                                             let (Just len') = bValToInteger (f ! "length")
-                                                                (Bstr s') = f ! "path"
+                                                                (Blist ds) = f ! "path"
+                                                                path' = mkPath ds
                                                             in
                                                               FileInfo { lengthInBytes = len',
                                                                          md5sum = Nothing,
-                                                                         path = unpack s'
+                                                                         path = path'
                                                                      })
                                                       files' }
                                               }
@@ -98,9 +101,12 @@ mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
                                               , pieces = pieces'
                                               , private = private'
                                               , dyninfo = SingleFileInfo {
-                                                  name = unpack name',
-                                                  lengthInBytes = length',
-                                                  md5sum = md5sum'}
+                                                  file = FileInfo {
+                                                      path = unpack name',
+                                                      lengthInBytes = length',
+                                                      md5sum = md5sum'
+                                                      }
+                                                  }
                                               }
 
 mkInfo _ = Nothing