From 08bb2b2c3c7695e62b7476a005e8566b7ba2802d Mon Sep 17 00:00:00 2001
From: Ramakrishnan Muthukrishnan <ram@rkrishnan.org>
Date: Fri, 24 Jul 2015 16:30:24 +0530
Subject: [PATCH] get the piece length and store it as piecestate

This needs to be revisited. Piece Length is the same for all pieces
but we are storing it for every piece number, which is a waste.
---
 src/FuncTorrent/Peer.hs | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/FuncTorrent/Peer.hs b/src/FuncTorrent/Peer.hs
index 33d72a3..bd44076 100644
--- a/src/FuncTorrent/Peer.hs
+++ b/src/FuncTorrent/Peer.hs
@@ -47,7 +47,8 @@ data PieceDlState = Pending
 -- todo - map with index to a new data structure (peers who have that piece amd state)
 data PieceData = PieceData { peers :: [Peer]        -- ^ list of peers who have this piece
                            , state :: PieceDlState  -- ^ state of the piece from download perspective.
-                           , hash  :: ByteString }      -- ^ piece hash
+                           , hash  :: ByteString    -- ^ piece hash
+                           , len :: Integer }       -- ^ piece length
 
 -- which piece is with which peers
 type PieceMap = Map Integer PieceData
@@ -71,11 +72,13 @@ data PeerMsg = KeepAliveMsg
 
 -- Make the initial Piece map, with the assumption that no peer has the
 -- piece and that every piece is pending download.
-mkPieceMap :: Integer -> ByteString -> PieceMap
-mkPieceMap numPieces pieceHash = fromList kvs
+mkPieceMap :: Integer -> ByteString -> Integer -> PieceMap
+mkPieceMap numPieces pieceHash pLen = fromList kvs
   where kvs = [(i, PieceData { peers = []
                              , state = Pending
-                             , hash = h }) | (i, h) <- zip [0..numPieces] hashes]
+                             , hash = h
+                             , len = pLen })
+              | (i, h) <- zip [0..numPieces] hashes]
         hashes = splitN (fromIntegral numPieces) pieceHash
 
 havePiece :: PieceMap -> Integer -> Bool
@@ -207,7 +210,8 @@ msgLoop state pieceStatus | meInterested state == False &&
                               case pickPiece pieceStatus of
                                Nothing -> putStrLn "Nothing to download"
                                Just workPiece -> do
-                                 sendMsg (handle state) (RequestMsg workPiece 0 16384)
+                                 let pLen = len (pieceStatus ! workPiece)
+                                 sendMsg (handle state) (RequestMsg workPiece 0 pLen)
                                  putStrLn $ "--> RequestMsg for Piece " ++ (show workPiece) ++ "to peer: " ++ show (peer state)
                                  msg <- getMsg (handle state)
                                  putStrLn $ "<-- " ++ show msg ++ "from peer: " ++ show (peer state)
@@ -260,8 +264,9 @@ handlePeerMsgs p m peerId logFn = do
                         , heChoking = True
                         , meInterested = False
                         , meChoking = True }
-      pieceHash = (pieces (info m))
+      pieceHash = pieces (info m)
       numPieces = (toInteger . (`quot` 20) . BC.length) pieceHash
-      pieceStatus = mkPieceMap numPieces pieceHash
+      pLen = pieceLength (info m) :: Integer
+      pieceStatus = mkPieceMap numPieces pieceHash pLen
   msgLoop state pieceStatus
   
-- 
2.45.2