-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 System.IO
import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton)
import Data.ByteString.Lazy (fromStrict, fromChunks)
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 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)
+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
-- 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)