OctoTorrent.Client.DiskManager.BeginGetHash C# (CSharp) Method

BeginGetHash() private method

private BeginGetHash ( TorrentManager manager, int pieceIndex, MainLoopResult callback ) : void
manager TorrentManager
pieceIndex int
callback MainLoopResult
return void
        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);
        }