refactor PeerState: Add connection handle to be part of peerstate
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Thu, 23 Jul 2015 08:42:06 +0000 (14:12 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Thu, 23 Jul 2015 08:42:06 +0000 (14:12 +0530)
src/FuncTorrent/Peer.hs

index 70e89d8c8f245c9593f32479897a8808721ee360..0d70f9f391b385e241ddc88f1dde16902b4dec34 100644 (file)
@@ -28,7 +28,8 @@ type IP = String
 type Port = Integer
 
 -- PeerState is a misnomer
-data PeerState = PeerState { peer :: Peer
+data PeerState = PeerState { handle :: Handle
+                           , peer :: Peer
                            , meChoking :: Bool
                            , meInterested :: Bool
                            , heChoking :: Bool
@@ -191,13 +192,15 @@ createDummyFile path size =
 
 -- loop1 :: shake hands with all peers, find out the pieces they have, form PieceData.
 -- recvMsg :: Peer -> Handle -> Msg
-msgLoop :: Handle -> ByteString -> PeerState -> IO ()
-msgLoop h pieceHash state =
+msgLoop :: PeerState -> ByteString -> IO ()
+msgLoop state pieceHash =
   let numPieces = (toInteger . (`quot` 20) . BC.length) pieceHash
       pieceStatus = mkPieceMap numPieces pieceHash
   in
    forever $ do
-     msg <- getMsg h
+     -- if meInterested and he NOT Choking, pick a piece to download
+     -- and send a requestmsg.
+     msg <- getMsg (handle state)
      putStrLn $ "got a " ++ show msg
      case msg of
       BitFieldMsg bss -> do
@@ -209,17 +212,18 @@ msgLoop h pieceHash state =
         -- download each of the piece in order
       UnChokeMsg -> do
         print msg
-        msgLoop h pieceHash (state {heChoking = False})
+        msgLoop (state {heChoking = False}) pieceHash
       _ -> print msg
 
 handlePeerMsgs :: Peer -> Metainfo -> String -> (String -> IO ()) -> IO ()
 handlePeerMsgs p m peerId logFn = do
   h <- handShake p (infoHash m) peerId
   logFn "handShake"
-  let state = PeerState { peer = p
+  let state = PeerState { handle = h
+                        , peer = p
                         , heInterested = False
                         , heChoking = True
                         , meInterested = True
                         , meChoking = False }
-  msgLoop h (pieces (info m)) state
+  msgLoop state (pieces (info m))