private void ParseExternalId(Token idTokenType, Token declType, out string publicId, out string systemId)
{
LineInfo keywordLineInfo = new LineInfo(LineNo, LinePos - 6);
publicId = null;
systemId = null;
if (GetToken(true) != Token.Literal)
{
ThrowUnexpectedToken(_curPos, "\"", "'");
}
if (idTokenType == Token.SYSTEM)
{
systemId = GetValue();
if (systemId.IndexOf('#') >= 0)
{
Throw(_curPos - systemId.Length - 1, SR.Xml_FragmentId, new string[] { systemId.Substring(systemId.IndexOf('#')), systemId });
}
if (declType == Token.DOCTYPE && !_freeFloatingDtd)
{
_literalLineInfo.linePos++;
_readerAdapter.OnSystemId(systemId, keywordLineInfo, _literalLineInfo);
}
}
else
{
Debug.Assert(idTokenType == Token.PUBLIC);
publicId = GetValue();
// verify if it contains chars valid for public ids
int i;
if ((i = _xmlCharType.IsPublicId(publicId)) >= 0)
{
ThrowInvalidChar(_curPos - 1 - publicId.Length + i, publicId, i);
}
if (declType == Token.DOCTYPE && !_freeFloatingDtd)
{
_literalLineInfo.linePos++;
_readerAdapter.OnPublicId(publicId, keywordLineInfo, _literalLineInfo);
if (GetToken(false) == Token.Literal)
{
if (!_whitespaceSeen)
{
Throw(SR.Xml_ExpectingWhiteSpace, new string(_literalQuoteChar, 1), (int)_literalLineInfo.lineNo, (int)_literalLineInfo.linePos);
}
systemId = GetValue();
_literalLineInfo.linePos++;
_readerAdapter.OnSystemId(systemId, keywordLineInfo, _literalLineInfo);
}
else
{
ThrowUnexpectedToken(_curPos, "\"", "'");
}
}
else
{
if (GetToken(false) == Token.Literal)
{
if (!_whitespaceSeen)
{
Throw(SR.Xml_ExpectingWhiteSpace, new string(_literalQuoteChar, 1), (int)_literalLineInfo.lineNo, (int)_literalLineInfo.linePos);
}
systemId = GetValue();
}
else if (declType != Token.NOTATION)
{
ThrowUnexpectedToken(_curPos, "\"", "'");
}
}
}
}
//