X-Git-Url: https://git.rkrishnan.org/?a=blobdiff_plain;f=src%2FFuncTorrent%2FPeer.hs;h=c833c061bd4285be88f3754e62e5b83774c1d806;hb=08f3238a8162039a1b77f4fb8825a56a34203c02;hp=05ecc3c961351ddff93b24de9e863f38cb25b749;hpb=d30178161347397d4f736735fec838f984be996a;p=functorrent.git diff --git a/src/FuncTorrent/Peer.hs b/src/FuncTorrent/Peer.hs index 05ecc3c..c833c06 100644 --- a/src/FuncTorrent/Peer.hs +++ b/src/FuncTorrent/Peer.hs @@ -1,7 +1,26 @@ +{- + - 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 + -} + {-# LANGUAGE OverloadedStrings #-} + module FuncTorrent.Peer - (Peer(..), - PieceMap, + (PieceMap, handlePeerMsgs ) where @@ -19,7 +38,7 @@ import FuncTorrent.Metainfo (Metainfo(..)) import FuncTorrent.PeerMsgs (Peer(..), PeerMsg(..), sendMsg, getMsg, genHandshakeMsg) import FuncTorrent.Utils (splitNum, verifyHash) import FuncTorrent.PieceManager (PieceDlState(..), PieceData(..), PieceMap, pickPiece, updatePieceAvailability) -import qualified FuncTorrent.FileSystem as FS (MsgChannel, writePieceToDisk, Piece(..)) +import qualified FuncTorrent.FileSystem as FS (MsgChannel, writePieceToDisk) data PState = PState { handle :: Handle , peer :: Peer @@ -33,7 +52,7 @@ havePiece pm index = dlstate (pm ! index) == Have connectToPeer :: Peer -> IO Handle -connectToPeer (Peer _ ip port) = do +connectToPeer (Peer ip port) = do h <- connectTo ip (PortNumber (fromIntegral port)) hSetBuffering h LineBuffering return h @@ -120,7 +139,7 @@ msgLoop pieceStatus msgchannel = do msgLoop (adjust (\pieceData -> pieceData { dlstate = Have }) workPiece pieceStatus) msgchannel _ -> do msg <- liftIO $ getMsg h - gets peer >>= (\p -> liftIO $ putStrLn $ "<-- " ++ show msg ++ "from peer: " ++ show p) + gets peer >>= (\p -> liftIO $ putStrLn $ "<-- " ++ show msg ++ " from peer: " ++ show p) case msg of KeepAliveMsg -> do liftIO $ sendMsg h KeepAliveMsg @@ -147,12 +166,18 @@ msgLoop pieceStatus msgchannel = do NotInterestedMsg -> do modify (\st' -> st' {heInterested = False}) msgLoop pieceStatus msgchannel - CancelMsg _ _ _ -> -- check if valid index, begin, length + CancelMsg {} -> -- check if valid index, begin, length msgLoop pieceStatus msgchannel PortMsg _ -> msgLoop pieceStatus msgchannel - -- handle RequestMsg, HaveMsg. No need to handle PieceMsg here. - -- also BitFieldMsg + HaveMsg idx -> do + p <- gets peer + let pieceStatus' = updatePieceAvailability pieceStatus p [idx] + msgLoop pieceStatus' msgchannel + _ -> do + liftIO $ putStrLn ".. not doing anything with the msg" + msgLoop pieceStatus msgchannel + -- No need to handle PieceMsg and RequestMsg here. downloadPiece :: Handle -> Integer -> Integer -> IO ByteString