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); } } }
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()); }
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()); }
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()); }