get the piece length and store it as piecestate
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Fri, 24 Jul 2015 11:00:24 +0000 (16:30 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Fri, 24 Jul 2015 11:00:27 +0000 (16:30 +0530)
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

index 33d72a384047bc9c1b0a37a0875a416a8e1fc5f4..bd44076a813258eabf0388933d5e43a66b6dbbb4 100644 (file)
@@ -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