convert bitfield from a peer into piece list
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sat, 16 May 2015 16:41:22 +0000 (22:11 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sat, 16 May 2015 16:41:22 +0000 (22:11 +0530)
src/FuncTorrent/Peer.hs
src/Main.hs

index 8007ab057432be2b793a49c440b6777619322dfc..93e4a1510bd841be2ae43f96fadb3d7b64fc98c4 100644 (file)
@@ -5,18 +5,20 @@ module FuncTorrent.Peer
      msgLoop
     ) where
 
-import Prelude hiding (lookup, concat, replicate, splitAt)
+import Prelude hiding (lookup, concat, replicate, splitAt, empty)
 
 import System.IO
 import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton)
 import Data.ByteString.Lazy (fromStrict, fromChunks)
-import qualified Data.ByteString.Char8 as BC (replicate, pack)
+import qualified Data.ByteString.Char8 as BC (replicate, pack, length)
 import Network (connectTo, PortID(..))
 import Data.Binary (Binary(..), decode)
 import Data.Binary.Put (putWord32be, putWord16be, putWord8)
 import Data.Binary.Get (getWord32be, getWord16be, getWord8, runGet)
 import Control.Monad (replicateM, liftM, forever)
 import Control.Applicative ((<$>), liftA3)
+import Data.Bits
+import Data.Word (Word8)
 
 type ID = String
 type IP = String
@@ -146,10 +148,26 @@ getMsg h = do
 bsToInt :: ByteString -> Int
 bsToInt x = fromIntegral (runGet getWord32be (fromChunks (return x)))
 
+bitfieldToList :: [Word8] -> Integer -> [Integer]
+bitfieldToList [] pos = []
+bitfieldToList (b:bs) pos =
+  let setBits = [pos*8 + (toInteger i) | i <- [0..8], testBit b i]
+  in
+   setBits ++ (bitfieldToList bs (pos + 1))
+
 -- loop1 :: shake hands with all peers, find out the pieces they have, form PieceData.
 -- recvMsg :: Peer -> Handle -> Msg
 
-msgLoop :: Handle -> IO ()
-msgLoop h = forever $ do
-  msg <- getMsg h
-  putStrLn $ "got a " ++ show msg
+msgLoop :: Handle -> ByteString -> IO ()
+msgLoop h pieceHash =
+  let numPieces = (toInteger . (`quot` 20) . BC.length) pieceHash
+  in
+   forever $ do
+     msg <- getMsg h
+     putStrLn $ "got a " ++ show msg
+     case msg of
+      BitFieldMsg bss -> do
+                         let pieceList = bitfieldToList (unpack bss) 0
+                         putStrLn (show pieceList)
+                         -- doenload each of the piece
+      _ -> putStrLn (show msg)
index afa0bd329d9f0edaa5f9af6274087193cc741120..d92b9d1fcc42b526c0939292ab4e7e38a2594cea 100644 (file)
@@ -66,7 +66,7 @@ main = do
                           let p1 = head (peers peerResp)
                           h <- handShake p1 (infoHash m) peerId
                           log $ "handshake"
-                          msgLoop h
+                          msgLoop h (pieces (info m))
                       Left e -> log $ "Error" ++ unpack e
                 Left e -> logError e log