]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Peer.hs
misc formatting
[functorrent.git] / src / FuncTorrent / Peer.hs
index 7b263a52f46da173bd7e722873177b7f46d020cb..d04d886e7de7f429275809117bf0eacee6da8c32 100644 (file)
@@ -5,19 +5,20 @@ module FuncTorrent.Peer
      msgLoop
     ) where
 
-import Prelude hiding (lookup, concat, replicate, splitAt)
+import Prelude hiding (lookup, concat, replicate, splitAt, empty, writeFile)
 
-import System.IO
-import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton, append)
+import System.IO (Handle, BufferMode(..), hSetBuffering)
+import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton, writeFile)
 import Data.ByteString.Lazy (fromStrict, fromChunks)
-import qualified Data.ByteString.Char8 as BC (replicate, pack, readInt, putStrLn)
+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 Control.Concurrent (threadDelay)
+import Data.Bits
+import Data.Word (Word8)
 
 type ID = String
 type IP = String
@@ -72,9 +73,8 @@ handShake (Peer _ ip port) infoHash peerid = do
   h <- connectTo ip (PortNumber (fromIntegral port))
   hSetBuffering h LineBuffering
   hPut h hs
-  rlenBS <- hGet h 1
-  let rlen = fromIntegral $ (unpack rlenBS) !! 0
-  hGet h rlen
+  rlenBS <- hGet h (length (unpack hs))
+  putStrLn $ "got handshake from peer: " ++ show rlenBS
   return h
 
 instance Binary PeerMsg where
@@ -142,19 +142,39 @@ getMsg h = do
   if l == 0
     then return KeepAliveMsg
     else do
-    putStrLn $ "len: " ++ show l
-    msgType <- hGet h 1
-    putStrLn $ "msg Type: " ++ show msgType
-    msg <- hGet h (l - 1)
-    return $ decode $ fromStrict $ concat [lBS, msgType, msg]
+    msg <- hGet h l
+    return $ decode $ fromStrict $ concat [lBS, msg]
+
 
 bsToInt :: ByteString -> Int
 bsToInt x = fromIntegral (runGet getWord32be (fromChunks (return x)))
 
+bitfieldToList :: [Word8] -> [Integer]
+bitfieldToList bs = go bs 0
+  where go [] _ = []
+        go (b:bs') pos =
+          let setBits = [pos*8 + (toInteger i) | i <- [0..8], testBit b i]
+          in
+           setBits ++ (go bs' (pos + 1))
+
+-- downloadPiece :: Integer -> Handle -> IO ()
+
+createDummyFile :: FilePath -> Int -> IO ()
+createDummyFile path size = do
+  writeFile path (BC.replicate size '\0')
+
 -- 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)
+        putStrLn (show pieceList)
+        -- download each of the piece in order
+      _ -> putStrLn (show msg)