Beispiel #1
0
 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;
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }