Пример #1
0
        void PreLoad(int count)
        {
            var remainInBuffer = (int)(_mem.Length - _mem.Position);
            var buffer         = _buffer;

            if (remainInBuffer > 0)
            {
                Array.Copy(buffer, _mem.Position, buffer, 0, remainInBuffer);
            }
            _mem.SetLength(remainInBuffer);
            _mem.Seek(remainInBuffer, SeekOrigin.Begin);

            var downloadFrom      = _position + remainInBuffer;
            var availableInStream = _max - downloadFrom;
            var bufferSize        = _buffer.Length;
            var download          = Math.Min(bufferSize - remainInBuffer, availableInStream);

            if (count > (remainInBuffer + download))
            {
                var message = string.Format(
                    "Buffer is too small. Cached {0}, requested {1}, cap {2}",
                    remainInBuffer, count,
                    _buffer.Length);
                throw new InvalidOperationException(message);
            }
            _reader.DownloadRangeToStream(_mem, downloadFrom, (int)download);
            _mem.Seek(0, SeekOrigin.Begin);
        }