X-Git-Url: https://git.rkrishnan.org/?a=blobdiff_plain;f=src%2FFuncTorrent%2FMetainfo.hs;h=898cc54a037b7e009a60a172b9fdf31fc814b98b;hb=647f3acf1310f35762879733d1564f026269c779;hp=822a40511b35d819f55acf10b2e59183e925697b;hpb=ca6948b18ecf506d2959216b98cec9e85a6c463d;p=functorrent.git diff --git a/src/FuncTorrent/Metainfo.hs b/src/FuncTorrent/Metainfo.hs index 822a405..898cc54 100644 --- a/src/FuncTorrent/Metainfo.hs +++ b/src/FuncTorrent/Metainfo.hs @@ -1,19 +1,35 @@ +{- + - Copyright (C) 2015-2016 Ramakrishnan Muthukrishnan + - + - This file is part of FuncTorrent. + - + - FuncTorrent is free software; you can redistribute it and/or modify + - it under the terms of the GNU General Public License as published by + - the Free Software Foundation; either version 3 of the License, or + - (at your option) any later version. + - + - FuncTorrent is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU General Public License for more details. + - + - You should have received a copy of the GNU General Public License + - along with FuncTorrent; if not, see + -} + module FuncTorrent.Metainfo - (Info, - Metainfo, - mkMetaInfo, - mkInfo, - announce, - lengthInBytes, - info, - name + (Info(..), + Metainfo(..), + torrentToMetainfo ) 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, decode, bstrToString, bValToInteger) -- only single file mode supported for the time being. data Info = Info { pieceLength :: !Integer @@ -25,12 +41,12 @@ data Info = Info { pieceLength :: !Integer } deriving (Eq, Show) data Metainfo = Metainfo { info :: !Info - , announce :: !String - , announceList :: !(Maybe [[String]]) - , creationDate :: !(Maybe String) + , announceList :: ![String] + , creationDate :: !(Maybe Integer) , comment :: !(Maybe String) , createdBy :: !(Maybe String) , encoding :: !(Maybe String) + , infoHash :: !ByteString } deriving (Eq, Show) mkInfo :: BVal -> Maybe Info @@ -48,27 +64,41 @@ 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 -> Either String 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 Right 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 _ = Left "mkMetaInfo: expect an input dict" + +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 _)) = [] -mkMetaInfo :: BVal -> Maybe Metainfo -mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info" - (Bstr announce') = m ! "announce" - -- announceList = lookup (Bstr (pack "announce list")) - announceList' = Nothing - -- 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 = unpack announce' - , announceList = announceList' - , creationDate = creationDate' - , comment = maybeBstrToString comment' - , createdBy = maybeBstrToString createdBy' - , encoding = maybeBstrToString encoding' - } -mkMetaInfo _ = Nothing +torrentToMetainfo :: ByteString -> Either String Metainfo +torrentToMetainfo s = + case decode s of + Right d -> mkMetaInfo d + Left e -> Left $ show e