private int ReadContentAsBinary(byte[] buffer, int index, int count)
{
Debug.Assert(decoder != null);
if (isEnd)
{
Reset();
return(0);
}
decoder.SetNextOutputBuffer(buffer, index, count);
for (;;)
{
// use streaming ReadValueChunk if the reader supports it
if (canReadValueChunk)
{
for (;;)
{
if (valueOffset < valueChunkLength)
{
int decodedCharsCount = decoder.Decode(valueChunk, valueOffset, valueChunkLength - valueOffset);
valueOffset += decodedCharsCount;
}
if (decoder.IsFull)
{
return(decoder.DecodedCount);
}
Debug.Assert(valueOffset == valueChunkLength);
if ((valueChunkLength = reader.ReadValueChunk(valueChunk, 0, ChunkSize)) == 0)
{
break;
}
valueOffset = 0;
}
}
else
{
// read what is reader.Value
string value = reader.Value;
int decodedCharsCount = decoder.Decode(value, valueOffset, value.Length - valueOffset);
valueOffset += decodedCharsCount;
if (decoder.IsFull)
{
return(decoder.DecodedCount);
}
}
valueOffset = 0;
// move to next textual node in the element content; throw on sub elements
if (!MoveToNextContentNode(true))
{
isEnd = true;
return(decoder.DecodedCount);
}
}
}