public HashingMode(TorrentManager manager, bool autostart) : base(manager) { CanAcceptConnections = false; this.hashingWaitHandle = new ManualResetEvent(false); this.autostart = autostart; this.filesExist = Manager.HasMetadata && manager.Engine.DiskManager.CheckAnyFilesExist(Manager); this.pieceCompleteCallback = PieceComplete; }
public HashingMode(TorrentManager manager, bool autostart) : base(manager) { CanAcceptConnections = false; hashingWaitHandle = new ManualResetEvent(false); this.autostart = autostart; filesExist = Manager.HasMetadata && manager.Engine.DiskManager.CheckAnyFilesExist(Manager); pieceCompleteCallback = PieceComplete; }
internal void BeginGetHash(TorrentManager manager, int pieceIndex, MainLoopResult callback) { int count = 0; long offset = (long)manager.Torrent.PieceLength * pieceIndex; long endOffset = Math.Min(offset + manager.Torrent.PieceLength, manager.Torrent.Size); byte[] hashBuffer = BufferManager.EmptyBuffer; ClientEngine.BufferManager.GetBuffer(ref hashBuffer, Piece.BlockSize); #if NETSTANDARD1_5 SHA1 hasher = SHA1.Create(); #else SHA1 hasher = HashAlgoFactory.Create <SHA1>(); #endif hasher.Initialize(); DiskIOCallback readCallback = null; readCallback = delegate(bool successful) { if (successful) { #if NETSTANDARD1_5 var h = hasher.ComputeHash(hashBuffer, 0, count); h.CopyTo(hashBuffer, 0); #else hasher.TransformBlock(hashBuffer, 0, count, hashBuffer, 0); #endif } offset += count; if (!successful || offset == endOffset) { object hash = null; if (successful) { #if NETSTANDARD1_5 hash = hasher.ComputeHash(hashBuffer, 0, 0); #else hasher.TransformFinalBlock(hashBuffer, 0, 0); hash = hasher.Hash; #endif } ((IDisposable)hasher).Dispose(); ClientEngine.BufferManager.FreeBuffer(ref hashBuffer); ClientEngine.MainLoop.Queue(delegate { 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); }
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); }
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 hashProvider = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha1); var hasher = hashProvider.CreateHash(); DiskIOCallback readCallback = null; readCallback = delegate(bool successful) { // TODO [uwp]: make sure this works if (successful) { hasher.Append(hashBuffer.AsBuffer(0, count)); } offset += count; if (!successful || offset == endOffset) { object hash = null; if (successful) { hash = hasher.GetValueAndReset().ToArray(); } ClientEngine.BufferManager.FreeBuffer(ref hashBuffer); ClientEngine.MainLoop.Queue(delegate { 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); }
internal void BeginGetHash(TorrentManager manager, int pieceIndex, MainLoopResult callback) { int count = 0; long offset = (long) manager.Torrent.PieceLength * pieceIndex; long endOffset = Math.Min(offset + manager.Torrent.PieceLength, manager.Torrent.Size); byte[] hashBuffer = BufferManager.EmptyBuffer; ClientEngine.BufferManager.GetBuffer(ref hashBuffer, Piece.BlockSize); SHA1 hasher = HashAlgoFactory.Create<SHA1>(); hasher.Initialize(); DiskIOCallback readCallback = null; readCallback = delegate(bool 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(delegate { 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); }
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 hashProvider = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha1); var hasher = hashProvider.CreateHash(); DiskIOCallback readCallback = null; readCallback = delegate(bool successful) { // TODO [uwp]: make sure this works if (successful) hasher.Append(hashBuffer.AsBuffer(0, count)); offset += count; if (!successful || offset == endOffset) { object hash = null; if (successful) { hash = hasher.GetValueAndReset().ToArray(); } ClientEngine.BufferManager.FreeBuffer(ref hashBuffer); ClientEngine.MainLoop.Queue(delegate { 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); }