public override int Read()

in src/Microsoft.ServiceFabric.Services.Remoting/V2/Messaging/SegmentedReadMemoryStream.cs [94:147]


        public override int Read(byte[] buffer, int offset, int count)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }

            if ((offset + count) > buffer.Length)
            {
                throw new ArgumentException("buffer too small", "buffer");
            }

            if (offset < 0)
            {
                throw new ArgumentException("offset must be >= 0", "offset");
            }

            if (count < 0)
            {
                throw new ArgumentException("count must be >= 0", "count");
            }

            if (this.Position >= this.Length || count == 0)
            {
                return 0;
            }

            var bytesToRead = Math.Min(count, (int)(this.Length - this.Position));
            var bytesRead = 0;
            var bytesLeft = bytesToRead - bytesRead;

            while (bytesLeft > 0)
            {
                var buf = this.readbuffers.ElementAt((this.bufferNum));
                var bufferSize = buf.Count;
                var bytesToCopy = (this.bufferOffset + bytesLeft) < bufferSize
                    ? bytesLeft
                    : bufferSize - this.bufferOffset;

                Buffer.BlockCopy(buf.Array, buf.Offset + this.bufferOffset, buffer, offset, bytesToCopy);
                this.Position += bytesToCopy;
                offset += bytesToCopy;
                bytesLeft -= bytesToCopy;
                bytesRead += bytesToCopy;
                this.bufferOffset += bytesToCopy;
                if (this.bufferOffset == bufferSize)
                {
                    this.bufferNum++;
                    this.bufferOffset = 0;
                }
            }

            return bytesToRead;
        }