public int ReadValueChunk (
char [] buffer, int offset, int length)
{
CommandState backup = state;
if (state == CommandState.None)
CheckState (false, CommandState.None);
if (offset < 0)
throw CreateArgumentOutOfRangeException ("offset", offset, "Offset must be non-negative integer.");
else if (length < 0)
throw CreateArgumentOutOfRangeException ("length", length, "Length must be non-negative integer.");
else if (buffer.Length < offset + length)
throw new ArgumentOutOfRangeException ("buffer length is smaller than the sum of offset and length.");
if (length == 0)
return 0;
if (!hasCache) {
if (reader.IsEmptyElement)
return 0;
}
bool loop = true;
while (loop && textCache.Length < length) {
switch (reader.NodeType) {
case XmlNodeType.Text:
case XmlNodeType.CDATA:
case XmlNodeType.SignificantWhitespace:
case XmlNodeType.Whitespace:
if (hasCache) {
switch (reader.NodeType) {
case XmlNodeType.Text:
case XmlNodeType.CDATA:
case XmlNodeType.SignificantWhitespace:
case XmlNodeType.Whitespace:
Read ();
break;
default:
loop = false;
break;
}
}
textCache.Append (reader.Value);
hasCache = true;
break;
default:
loop = false;
break;
}
}
state = backup;
int min = textCache.Length;
if (min > length)
min = length;
string str = textCache.ToString (0, min);
textCache.Remove (0, str.Length);
str.CopyTo (0, buffer, offset, str.Length);
if (min < length && loop)
return min + ReadValueChunk (buffer, offset + min, length - min);
else
return min;
}