internal static bool CopyStream(Stream source, Stream target, int bufferSize, long sourceSeekOffset, SeekOrigin sourceSeekOrigin, long targetSetLength, long targetSeekOffset, SeekOrigin targetSeekOrigin, Operation <int, bool> shouldCancel) { SharedUtil.ThrowIfEmpty(source, "source"); SharedUtil.ThrowIfEmpty(target, "target"); if (!source.CanRead || !target.CanWrite) { throw new IOException(); } byte[] buffer = new byte[bufferSize = (bufferSize <= 0) ? 0x1000 : bufferSize]; if (((sourceSeekOffset > 0L) || ((sourceSeekOffset == 0L) && (sourceSeekOrigin != SeekOrigin.Current))) && source.CanSeek) { source.Seek(sourceSeekOffset, sourceSeekOrigin); } if (target.CanSeek) { if (targetSetLength > 0L) { target.SetLength(targetSetLength); } target.Seek(targetSeekOffset, targetSeekOrigin); } while (source.Position < source.Length) { long num; if ((num = source.Length - source.Position) < bufferSize) { bufferSize = (int)num; buffer = new byte[bufferSize]; } source.Read(buffer, 0, bufferSize); target.Write(buffer, 0, bufferSize); target.Flush(); if ((shouldCancel != null) && shouldCancel(SharedUtil.Percent(source.Position, source.Length))) { return(false); } } return(true); }