private int DownloadNextChunk(IDocument remoteDocument, long offset, long remainingBytes, Transmission transmission, Stream outputstream, HashAlgorithm hashAlg) { lock (this.disposeLock) { if (this.disposed) { transmission.Status = TransmissionStatus.ABORTED; throw new ObjectDisposedException(transmission.Path); } IContentStream contentStream = remoteDocument.GetContentStream(remoteDocument.ContentStreamId, offset, remainingBytes); transmission.Length = remoteDocument.ContentStreamLength; transmission.Position = offset; using (var remoteStream = contentStream.Stream) using (var forwardstream = new ForwardReadingStream(remoteStream)) using (var offsetstream = new OffsetStream(forwardstream, offset)) using (var progress = transmission.CreateStream(offsetstream)) { byte[] buffer = new byte[8 * 1024]; int result = 0; int len; while ((len = progress.Read(buffer, 0, buffer.Length)) > 0) { outputstream.Write(buffer, 0, len); hashAlg.TransformBlock(buffer, 0, len, buffer, 0); result += len; outputstream.Flush(); } return(result); } } }
private int DownloadNextChunk(IDocument remoteDocument, long offset, long remainingBytes, FileTransmissionEvent status, Stream outputstream, HashAlgorithm hashAlg) { lock (this.disposeLock) { if (this.disposed) { status.ReportProgress(new TransmissionProgressEventArgs() { Aborted = true }); throw new ObjectDisposedException(status.Path); } IContentStream contentStream = remoteDocument.GetContentStream(remoteDocument.ContentStreamId, offset, remainingBytes); status.ReportProgress(new TransmissionProgressEventArgs { Length = remoteDocument.ContentStreamLength, ActualPosition = offset, Resumed = offset > 0 }); using (Stream remoteStream = contentStream.Stream) using (ForwardReadingStream forwardstream = new ForwardReadingStream(remoteStream)) using (OffsetStream offsetstream = new OffsetStream(forwardstream, offset)) using (ProgressStream progress = new ProgressStream(offsetstream, status)) { byte[] buffer = new byte[8 * 1024]; int result = 0; int len; while ((len = progress.Read(buffer, 0, buffer.Length)) > 0) { outputstream.Write(buffer, 0, len); hashAlg.TransformBlock(buffer, 0, len, buffer, 0); result += len; outputstream.Flush(); } return(result); } } }