internal void BeginGetHash(TorrentManager manager, int pieceIndex, MainLoopResult callback)
{
var count = 0;
var offset = (long) manager.Torrent.PieceLength * pieceIndex;
var endOffset = Math.Min(offset + manager.Torrent.PieceLength, manager.Torrent.Size);
var hashBuffer = BufferManager.EmptyBuffer;
ClientEngine.BufferManager.GetBuffer(ref hashBuffer, Piece.BlockSize);
var hasher = HashAlgoFactory.Create<SHA1>();
hasher.Initialize();
DiskIOCallback readCallback = null;
readCallback = successful =>
{
if (successful)
hasher.TransformBlock(hashBuffer, 0, count, hashBuffer, 0);
offset += count;
if (!successful || offset == endOffset)
{
object hash = null;
if (successful)
{
hasher.TransformFinalBlock(hashBuffer, 0, 0);
hash = hasher.Hash;
}
((IDisposable) hasher).Dispose();
ClientEngine.BufferManager.FreeBuffer(ref hashBuffer);
ClientEngine.MainLoop.Queue(() => callback(hash));
}
else
{
count = (int) Math.Min(Piece.BlockSize, endOffset - offset);
QueueRead(manager, offset, hashBuffer, count, readCallback);
}
};
count = (int)Math.Min(Piece.BlockSize, endOffset - offset);
QueueRead(manager, offset, hashBuffer, count, readCallback);
}