]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Peer.hs
create a dummy file on the disk for a given path
[functorrent.git] / src / FuncTorrent / Peer.hs
index 8007ab057432be2b793a49c440b6777619322dfc..d9ff9299ebe834ca2c0062d4e4e94ccecb98a0e1 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, writeFile)
 
-import System.IO
-import Data.ByteString (ByteString, pack, unpack, concat, hGet, hPut, singleton)
+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)
+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
@@ -143,13 +145,36 @@ getMsg h = do
     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) 0
+                         putStrLn (show pieceList)
+                         -- doenload each of the piece
+      _ -> putStrLn (show msg)