private int InternalRead(byte[] buffer, int offset, int count, int fromPosition)
{
if (this.length - fromPosition <= 0)
{
return 0;
}
if (this.largeBuffer == null)
{
var blockAndOffset = this.GetBlockAndRelativeOffset(fromPosition);
int bytesWritten = 0;
int bytesRemaining = Math.Min(count, this.length - fromPosition);
while (bytesRemaining > 0)
{
int amountToCopy = Math.Min(this.blocks[blockAndOffset.Block].Length - blockAndOffset.Offset, bytesRemaining);
Buffer.BlockCopy(this.blocks[blockAndOffset.Block], blockAndOffset.Offset, buffer, bytesWritten + offset, amountToCopy);
bytesWritten += amountToCopy;
bytesRemaining -= amountToCopy;
++blockAndOffset.Block;
blockAndOffset.Offset = 0;
}
return bytesWritten;
}
else
{
int amountToCopy = Math.Min(count, this.length - fromPosition);
Buffer.BlockCopy(this.largeBuffer, fromPosition, buffer, offset, amountToCopy);
return amountToCopy;
}
}