]> git.rkrishnan.org Git - functorrent.git/blob - src/FuncTorrent/Utils.hs
fix copyright notice
[functorrent.git] / src / FuncTorrent / Utils.hs
1 {-
2  - Copyright (C) 2015-2016 Ramakrishnan Muthukrishnan <ram@rkrishnan.org>
3  -
4  - This file is part of FuncTorrent.
5  -
6  - FuncTorrent is free software; you can redistribute it and/or modify
7  - it under the terms of the GNU General Public License as published by
8  - the Free Software Foundation; either version 3 of the License, or
9  - (at your option) any later version.
10  -
11  - FuncTorrent is distributed in the hope that it will be useful,
12  - but WITHOUT ANY WARRANTY; without even the implied warranty of
13  - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  - GNU General Public License for more details.
15  -
16  - You should have received a copy of the GNU General Public License
17  - along with FuncTorrent; if not,  see <http://www.gnu.org/licenses/>
18  -}
19
20 module FuncTorrent.Utils
21        (createDummyFile,
22         writeFileAtOffset,
23         readFileAtOffset,
24         splitNum,
25         splitN,
26         verifyHash
27        )
28        where
29
30 import Prelude hiding (writeFile, take)
31
32 import qualified Crypto.Hash.SHA1 as SHA1 (hash)
33 import Control.Exception.Base (IOException, try)
34 import Data.ByteString (ByteString, writeFile, hPut, hGet, take)
35 import qualified Data.ByteString.Char8 as BC
36 import System.IO (Handle, hSeek, SeekMode(..))
37 import System.Directory (doesFileExist)
38
39 splitN :: Int -> BC.ByteString -> [BC.ByteString]
40 splitN n bs | BC.null bs = []
41             | otherwise = BC.take n bs : splitN n (BC.drop n bs)
42
43 splitNum :: Integer -> Integer -> [Integer]
44 splitNum n d | n == 0 = []
45              | n < d = [n]
46              | otherwise = d : splitNum (n - d) d
47
48 createDummyFile :: FilePath -> Int -> IO (Either IOException ())
49 createDummyFile path size = do
50   dfe <- doesFileExist path
51   if not dfe
52     then do
53     try $ writeFile path (BC.replicate size '\0')
54     else
55     return $ Right ()
56
57 -- write into a file at a specific offet
58 writeFileAtOffset :: Handle -> Integer -> ByteString -> IO ()
59 writeFileAtOffset h offset block = do
60   hSeek h AbsoluteSeek offset
61   hPut h block
62
63 readFileAtOffset :: Handle -> Integer -> Integer -> IO ByteString
64 readFileAtOffset h offset len = do
65   hSeek h AbsoluteSeek offset
66   hGet h (fromInteger len)
67
68 verifyHash :: ByteString -> ByteString -> Bool
69 verifyHash bs pieceHash =
70   take 20 (SHA1.hash bs) == pieceHash