예제 #1
0
        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);
                            }
            }
        }
예제 #2
0
        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);
                            }
            }
        }