private EntityType HandleEntityReference(bool isInAttributeValue, EntityExpandType expandType, out int charRefEndPos)
{
Debug.Assert(_ps.chars[_ps.charPos] == '&');
if (_ps.charPos + 1 == _ps.charsUsed)
{
if (ReadData() == 0)
{
Throw(SR.Xml_UnexpectedEOF1);
}
}
// numeric characters reference
if (_ps.chars[_ps.charPos + 1] == '#')
{
EntityType entityType;
charRefEndPos = ParseNumericCharRef(expandType != EntityExpandType.OnlyGeneral, null, out entityType);
Debug.Assert(entityType == EntityType.CharacterDec || entityType == EntityType.CharacterHex);
return entityType;
}
// named reference
else
{
// named character reference
charRefEndPos = ParseNamedCharRef(expandType != EntityExpandType.OnlyGeneral, null);
if (charRefEndPos >= 0)
{
return EntityType.CharacterNamed;
}
// general entity reference
// NOTE: XmlValidatingReader compatibility mode: expand all entities in attribute values
// general entity reference
if (expandType == EntityExpandType.OnlyCharacter ||
(_entityHandling != EntityHandling.ExpandEntities &&
(!isInAttributeValue || !_validatingReaderCompatFlag)))
{
return EntityType.Unexpanded;
}
int endPos;
_ps.charPos++;
int savedLinePos = _ps.LinePos;
try
{
endPos = ParseName();
}
catch (XmlException)
{
Throw(SR.Xml_ErrorParsingEntityName, _ps.LineNo, savedLinePos);
return EntityType.Skipped;
}
// check ';'
if (_ps.chars[endPos] != ';')
{
ThrowUnexpectedToken(endPos, ";");
}
int entityLinePos = _ps.LinePos;
string entityName = _nameTable.Add(_ps.chars, _ps.charPos, endPos - _ps.charPos);
_ps.charPos = endPos + 1;
charRefEndPos = -1;
EntityType entType = HandleGeneralEntityReference(entityName, isInAttributeValue, false, entityLinePos);
_reportedBaseUri = _ps.baseUriStr;
_reportedEncoding = _ps.encoding;
return entType;
}
}