-- write into a file at a specific offet
writeFileAtOffset :: FilePath -> Integer -> ByteString -> IO ()
writeFileAtOffset path offset block =
- withFile path ReadWriteMode $ (\h -> do
- _ <- hSeek h AbsoluteSeek offset
- hPut h block)
+ withFile path ReadWriteMode (\h -> do
+ _ <- hSeek h AbsoluteSeek offset
+ hPut h block)
-- recvMsg :: Peer -> Handle -> Msg
msgLoop :: PeerState -> PieceMap -> IO ()
-msgLoop pState pieceStatus | meInterested pState == False &&
- heChoking pState == True = do
- -- if me NOT Interested and she is Choking, tell her that
- -- I am interested.
- let h = handle pState
- sendMsg h InterestedMsg
- putStrLn $ "--> InterestedMsg to peer: " ++ show (peer pState)
- msgLoop (pState { meInterested = True }) pieceStatus
- | meInterested pState == True &&
- heChoking pState == False =
+msgLoop pState pieceStatus | not (meInterested pState) && heChoking pState = do
+ -- if me NOT Interested and she is Choking, tell her that
+ -- I am interested.
+ let h = handle pState
+ sendMsg h InterestedMsg
+ putStrLn $ "--> InterestedMsg to peer: " ++ show (peer pState)
+ msgLoop (pState { meInterested = True }) pieceStatus
+ | meInterested pState && not (heChoking pState) =
-- if me Interested and she not Choking, send her a request
-- for a piece.
case pickPiece pieceStatus of
-- map with pieceIndex as the key and modify the value to add the peer.
-- download each of the piece in order
msgLoop pState pieceStatus'
- UnChokeMsg -> do
+ UnChokeMsg ->
msgLoop (pState { heChoking = False }) pieceStatus
- _ -> do
+ _ ->
msgLoop pState pieceStatus
-- simple algorithm to pick piece.
updatePieceAvailability :: PieceMap -> Peer -> [Integer] -> PieceMap
updatePieceAvailability pieceStatus p pieceList =
mapWithKey (\k pd -> if k `elem` pieceList
- then (pd { peers = p : (peers pd) })
+ then (pd { peers = p : peers pd })
else pd) pieceStatus
handlePeerMsgs :: Peer -> Metainfo -> String -> IO ()
liftM concat $ forM (zip [0..] chunks) (\(i, pLen) -> do
sendMsg h (RequestMsg index (i*pLen) pLen)
putStrLn $ "--> " ++ "RequestMsg for Piece "
- ++ (show index) ++ ", part: " ++ show i ++ " of length: "
+ ++ show index ++ ", part: " ++ show i ++ " of length: "
++ show pLen
msg <- getMsg h
case msg of