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;
}