diff options
Diffstat (limited to 'src/System/Torrent')
-rw-r--r-- | src/System/Torrent/Storage.hs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/System/Torrent/Storage.hs b/src/System/Torrent/Storage.hs index a8b0bdc6..b5092b2e 100644 --- a/src/System/Torrent/Storage.hs +++ b/src/System/Torrent/Storage.hs | |||
@@ -28,6 +28,8 @@ module System.Torrent.Storage | |||
28 | , withStorage | 28 | , withStorage |
29 | 29 | ||
30 | -- * Query | 30 | -- * Query |
31 | , totalPieces | ||
32 | , verifyPiece | ||
31 | , genPieceInfo | 33 | , genPieceInfo |
32 | , getBitfield | 34 | , getBitfield |
33 | 35 | ||
@@ -166,6 +168,10 @@ genPieceInfo s = do | |||
166 | hashes <- sourceStorage s $= C.map hashPiece $$ C.sinkLbs | 168 | hashes <- sourceStorage s $= C.map hashPiece $$ C.sinkLbs |
167 | return $ PieceInfo (pieceLen s) (HashList (BL.toStrict hashes)) | 169 | return $ PieceInfo (pieceLen s) (HashList (BL.toStrict hashes)) |
168 | 170 | ||
171 | -- | Verify specific piece using infodict hash list. | ||
172 | verifyPiece :: Storage -> PieceInfo -> PieceIx -> IO Bool | ||
173 | verifyPiece s pinfo pix = checkPieceLazy pinfo <$> readPiece pix s | ||
174 | |||
169 | -- | Verify storage. | 175 | -- | Verify storage. |
170 | -- | 176 | -- |
171 | -- Throws 'InvalidSize' if piece info size do not match with storage | 177 | -- Throws 'InvalidSize' if piece info size do not match with storage |
@@ -174,11 +180,11 @@ genPieceInfo s = do | |||
174 | getBitfield :: Storage -> PieceInfo -> IO Bitfield | 180 | getBitfield :: Storage -> PieceInfo -> IO Bitfield |
175 | getBitfield s @ Storage {..} pinfo @ PieceInfo {..} | 181 | getBitfield s @ Storage {..} pinfo @ PieceInfo {..} |
176 | | pieceLen /= piPieceLength = throwIO (InvalidSize piPieceLength) | 182 | | pieceLen /= piPieceLength = throwIO (InvalidSize piPieceLength) |
177 | | otherwise = M.foldM verifyPiece (BF.haveNone total) [0..total - 1] | 183 | | otherwise = M.foldM checkPiece (BF.haveNone total) [0..total - 1] |
178 | where | 184 | where |
179 | total = totalPieces s | 185 | total = totalPieces s |
180 | 186 | ||
181 | verifyPiece :: Bitfield -> PieceIx -> IO Bitfield | 187 | checkPiece :: Bitfield -> PieceIx -> IO Bitfield |
182 | verifyPiece bf pix = do | 188 | checkPiece bf pix = do |
183 | valid <- checkPieceLazy pinfo <$> readPiece pix s | 189 | valid <- verifyPiece s pinfo pix |
184 | return $ if valid then BF.insert pix bf else bf | 190 | return $ if valid then BF.insert pix bf else bf |