Ejemplo n.º 1
0
 private void PerformRead(BufferedIO io)
 {
     try
     {
         io.ActualCount = _writer.Read(io.Files, io.Offset, io.buffer, 0, io.Count,
                                       io.PieceLength,
                                       io.Manager.Torrent.Size)
                              ? io.Count
                              : 0;
         _readMonitor.AddDelta(io.ActualCount);
     }
     finally {
         io.Complete = true;
         if (io.Callback != null)
         {
             io.Callback(io.ActualCount == io.Count);
         }
     }
 }
Ejemplo n.º 2
0
        byte [] CalcPiecesHash(List <TorrentFile> files, PieceWriter writer)
        {
            byte []     buffer        = null;
            int         bufferRead    = 0;
            long        fileRead      = 0;
            long        overallRead   = 0;
            long        overallTotal  = 0;
            MD5         md5Hasher     = null;
            SHA1        shaHasher     = null;
            List <byte> torrentHashes = null;

            shaHasher     = HashAlgoFactory.Create <SHA1> ();
            torrentHashes = new List <byte> ();
            overallTotal  = Toolbox.Accumulate <TorrentFile> (files, delegate(TorrentFile m) { return(m.Length); });

            long pieceLength = PieceLength;

            buffer = new byte [pieceLength];

            if (StoreMD5)
            {
                md5Hasher = HashAlgoFactory.Create <MD5> ();
            }

            try {
                foreach (TorrentFile file in files)
                {
                    fileRead = 0;
                    if (md5Hasher != null)
                    {
                        md5Hasher.Initialize();
                    }

                    while (fileRead < file.Length)
                    {
                        int toRead = (int)Math.Min(buffer.Length - bufferRead, file.Length - fileRead);
                        int read   = writer.Read(file, fileRead, buffer, bufferRead, toRead);
                        cts?.Cancel();

                        if (md5Hasher != null)
                        {
                            md5Hasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);
                        }
                        shaHasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);

                        bufferRead  += read;
                        fileRead    += read;
                        overallRead += read;

                        if (bufferRead == buffer.Length)
                        {
                            bufferRead = 0;
                            shaHasher.TransformFinalBlock(buffer, 0, 0);
                            torrentHashes.AddRange(shaHasher.Hash);
                            shaHasher.Initialize();
                        }
                        RaiseHashed(new TorrentCreatorEventArgs(file.Path, fileRead, file.Length, overallRead, overallTotal));
                    }
                    if (md5Hasher != null)
                    {
                        md5Hasher.TransformFinalBlock(buffer, 0, 0);
                        md5Hasher.Initialize();
                        file.MD5 = md5Hasher.Hash;
                    }
                }
                if (bufferRead > 0)
                {
                    shaHasher.TransformFinalBlock(buffer, 0, 0);
                    torrentHashes.AddRange(shaHasher.Hash);
                }
            } finally {
                if (shaHasher != null)
                {
                    shaHasher.Clear();
                }
                if (md5Hasher != null)
                {
                    md5Hasher.Clear();
                }
            }
            return(torrentHashes.ToArray());
        }
Ejemplo n.º 3
0
        byte [] CalcPiecesHash(List <TorrentFile> files, PieceWriter writer, CancellationToken token)
        {
            int  bufferRead  = 0;
            long fileRead    = 0;
            long overallRead = 0;
            MD5  md5Hasher   = null;

            var shaHasher     = HashAlgoFactory.Create <SHA1> ();
            var torrentHashes = new List <byte> ();
            var overallTotal  = files.Sum(t => t.Length);
            var buffer        = new byte [PieceLength];

            if (StoreMD5)
            {
                md5Hasher = HashAlgoFactory.Create <MD5> ();
            }

            try {
                foreach (TorrentFile file in files)
                {
                    fileRead = 0;
                    md5Hasher?.Initialize();

                    while (fileRead < file.Length)
                    {
                        int toRead = (int)Math.Min(buffer.Length - bufferRead, file.Length - fileRead);
                        int read   = writer.Read(file, fileRead, buffer, bufferRead, toRead);
                        token.ThrowIfCancellationRequested();

                        md5Hasher?.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);
                        shaHasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);

                        bufferRead  += read;
                        fileRead    += read;
                        overallRead += read;

                        if (bufferRead == buffer.Length)
                        {
                            bufferRead = 0;
                            shaHasher.TransformFinalBlock(buffer, 0, 0);
                            torrentHashes.AddRange(shaHasher.Hash);
                            shaHasher.Initialize();
                        }
                        RaiseHashed(new TorrentCreatorEventArgs(file.Path, fileRead, file.Length, overallRead, overallTotal));
                    }

                    md5Hasher?.TransformFinalBlock(buffer, 0, 0);
                    md5Hasher?.Initialize();
                    file.MD5 = md5Hasher?.Hash;
                }
                if (bufferRead > 0)
                {
                    shaHasher.TransformFinalBlock(buffer, 0, 0);
                    torrentHashes.AddRange(shaHasher.Hash);
                }
            } finally {
                shaHasher.Dispose();
                md5Hasher?.Dispose();
            }
            return(torrentHashes.ToArray());
        }
Ejemplo n.º 4
0
        private byte[] CalcPiecesHash(List <TorrentFile> files, PieceWriter writer)
        {
            var  bufferRead  = 0;
            long overallRead = 0;
            MD5  md5Hasher   = null;

            var shaHasher     = HashAlgoFactory.Create <SHA1>();
            var torrentHashes = new List <byte>();
            var overallTotal  = files.Sum(x => x.Length);

            var pieceLength = PieceLength;
            var buffer      = new byte[pieceLength];

            if (StoreMD5)
            {
                md5Hasher = HashAlgoFactory.Create <MD5>();
            }

            try
            {
                foreach (var file in files)
                {
                    long fileRead = 0;
                    if (md5Hasher != null)
                    {
                        md5Hasher.Initialize();
                    }

                    while (fileRead < file.Length)
                    {
                        var toRead = (int)Math.Min(buffer.Length - bufferRead, file.Length - fileRead);
                        var read   = writer.Read(file, fileRead, buffer, bufferRead, toRead);

                        if (md5Hasher != null)
                        {
                            md5Hasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);
                        }
                        shaHasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);

                        bufferRead  += read;
                        fileRead    += read;
                        overallRead += read;

                        if (bufferRead == buffer.Length)
                        {
                            bufferRead = 0;
                            shaHasher.TransformFinalBlock(buffer, 0, 0);
                            torrentHashes.AddRange(shaHasher.Hash);
                            shaHasher.Initialize();
                        }
                        RaiseHashed(new TorrentCreatorEventArgs(file.Path, fileRead, file.Length, overallRead,
                                                                overallTotal));
                    }

                    if (md5Hasher == null)
                    {
                        continue;
                    }

                    md5Hasher.TransformFinalBlock(buffer, 0, 0);
                    md5Hasher.Initialize();
                    file.MD5 = md5Hasher.Hash;
                }
                if (bufferRead > 0)
                {
                    shaHasher.TransformFinalBlock(buffer, 0, 0);
                    torrentHashes.AddRange(shaHasher.Hash);
                }
            }
            finally
            {
                if (shaHasher != null)
                {
                    shaHasher.Clear();
                }
                if (md5Hasher != null)
                {
                    md5Hasher.Clear();
                }
            }
            return(torrentHashes.ToArray());
        }
        byte [] CalcPiecesHash(List <TorrentFile> files, PieceWriter writer)
        {
            byte []     buffer        = null;
            int         bufferRead    = 0;
            long        fileRead      = 0;
            long        overallRead   = 0;
            long        overallTotal  = 0;
            MD5         md5Hasher     = null;
            SHA1        shaHasher     = null;
            List <byte> torrentHashes = null;

#if NETSTANDARD1_5
            shaHasher = SHA1.Create();
#else
            shaHasher = HashAlgoFactory.Create <SHA1> ();
#endif
            torrentHashes = new List <byte> ();
            overallTotal  = Toolbox.Accumulate <TorrentFile> (files, delegate(TorrentFile m) { return(m.Length); });

            long pieceLength = PieceLength;
            buffer = new byte [pieceLength];

            if (StoreMD5)
#if NETSTANDARD1_5
            { md5Hasher = MD5.Create();  //HashAlgoFactory.Create<MD5> ();
            }
#else
            { md5Hasher = HashAlgoFactory.Create <MD5> (); }
#endif

            try
            {
                foreach (TorrentFile file in files)
                {
                    fileRead = 0;
                    if (md5Hasher != null)
                    {
                        md5Hasher.Initialize();
                    }

                    while (fileRead < file.Length)
                    {
                        int toRead = (int)Math.Min(buffer.Length - bufferRead, file.Length - fileRead);
                        int read   = writer.Read(file, fileRead, buffer, bufferRead, toRead);

                        if (md5Hasher != null)
                        {
#if NETSTANDARD1_5
                            var hash = md5Hasher.ComputeHash(buffer, bufferRead, read);
                            hash.CopyTo(buffer, bufferRead);
#else
                            md5Hasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);
#endif
                        }
#if NETSTANDARD1_5
                        var shaHash = shaHasher.ComputeHash(buffer, bufferRead, read);
                        shaHash.CopyTo(buffer, bufferRead);
#else
                        shaHasher.TransformBlock(buffer, bufferRead, read, buffer, bufferRead);
#endif

                        bufferRead  += read;
                        fileRead    += read;
                        overallRead += read;

                        if (bufferRead == buffer.Length)
                        {
                            bufferRead = 0;
#if NETSTANDARD1_5
                            var hash = shaHasher.ComputeHash(buffer, 0, 0);
                            torrentHashes.AddRange(hash);
#else
                            shaHasher.TransformFinalBlock(buffer, 0, 0);
                            torrentHashes.AddRange(shaHasher.Hash);
#endif
                            shaHasher.Initialize();
                        }
                        RaiseHashed(new TorrentCreatorEventArgs(file.Path, fileRead, file.Length, overallRead, overallTotal));
                    }
                    if (md5Hasher != null)
                    {
#if NETSTANDARD1_5
                        var hash = md5Hasher.ComputeHash(buffer, 0, 0);
                        md5Hasher.Initialize();
                        file.MD5 = hash;
#else
                        md5Hasher.TransformFinalBlock(buffer, 0, 0);
                        md5Hasher.Initialize();
                        file.MD5 = md5Hasher.Hash;
#endif
                    }
                }
                if (bufferRead > 0)
                {
#if NETSTANDARD1_5
                    var hash = shaHasher.ComputeHash(buffer, 0, 0);
                    torrentHashes.AddRange(hash);
#else
                    shaHasher.TransformFinalBlock(buffer, 0, 0);
                    torrentHashes.AddRange(shaHasher.Hash);
#endif
                }
            } finally {
#if NETSTANDARD1_5
                if (shaHasher != null)
                {
                    shaHasher.Dispose();
                }
                if (md5Hasher != null)
                {
                    md5Hasher.Dispose();
                }
#else
                if (shaHasher != null)
                {
                    shaHasher.Clear();
                }
                if (md5Hasher != null)
                {
                    md5Hasher.Clear();
                }
#endif
            }
            return(torrentHashes.ToArray());
        }