-module FuncTorrent.Utils where
+module FuncTorrent.Utils
+ (createDummyFile,
+ writeFileAtOffset,
+ readFileAtOffset,
+ splitNum,
+ splitN,
+ verifyHash
+ )
+ where
+import Prelude hiding (writeFile, take)
+
+import qualified Crypto.Hash.SHA1 as SHA1 (hash)
+import Control.Monad (unless)
+import Data.ByteString (ByteString, writeFile, hPut, hGet, take)
import qualified Data.ByteString.Char8 as BC
+import System.IO (withFile, hSeek, IOMode(..), SeekMode(..))
+import System.Directory (doesFileExist)
splitN :: Int -> BC.ByteString -> [BC.ByteString]
splitN n bs | BC.null bs = []
| otherwise = BC.take n bs : splitN n (BC.drop n bs)
+
+splitNum :: Integer -> Integer -> [Integer]
+splitNum n d | n == 0 = []
+ | n < d = [n]
+ | otherwise = d : splitNum (n - d) d
+
+createDummyFile :: FilePath -> Int -> IO ()
+createDummyFile path size = do
+ dfe <- doesFileExist path
+ unless dfe $
+ writeFile path (BC.replicate size '\0')
+
+-- write into a file at a specific offet
+writeFileAtOffset :: FilePath -> Integer -> ByteString -> IO ()
+writeFileAtOffset path offset block =
+ withFile path ReadWriteMode (\h -> do
+ hSeek h AbsoluteSeek offset
+ hPut h block)
+readFileAtOffset :: FilePath -> Integer -> Integer -> IO ByteString
+readFileAtOffset path offset len =
+ withFile path ReadWriteMode (\h -> do
+ hSeek h AbsoluteSeek offset
+ hGet h (fromInteger len))
+
+verifyHash :: ByteString -> ByteString -> Bool
+verifyHash bs pieceHash =
+ take 20 (SHA1.hash bs) == pieceHash