hxxmlprs.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,053 行 · 第 1/2 页
CPP
1,053 行
strlen(pAttr->value)+1);
pValues->SetPropertyCString(
pAttr->name, pBuf);
pBuf->Release();
}
}
rc = m_pResponse->HandleStartElement(pName, pValues,
m_pParser->GetTagStartLineNumber(),
m_pParser->GetTagStartColumnNumber());
HX_RELEASE(pValues);
if(!pTag->m_need_close && SUCCEEDED(rc))
{
rc = m_pResponse->HandleEndElement(pName,0,0);
}
}
else
{
rc = m_pResponse->HandleEndElement(pName,0,0);
}
}
break;
default:
{
bDone = TRUE;
}
break;
}
}
exit:
HX_DELETE(pTag);
return rc;
}
/*
* HXStrictXMLParser methods
*/
HXStrictXMLParser::HXStrictXMLParser():
m_pParser(NULL),
m_pByteQueue(NULL)
, m_pErrorNotifier(NULL)
{
}
HXStrictXMLParser::~HXStrictXMLParser()
{
HX_DELETE(m_pParser);
HX_DELETE(m_pByteQueue);
}
HX_RESULT
HXStrictXMLParser::Init(IHXXMLParserResponse* pResponse,
const char* pEncoding)
{
m_pResponse = pResponse;
m_pResponse = pResponse;
m_pParser = new XMLParser(TRUE, pEncoding);
if (m_pErrorNotifier)
{
m_pParser->StoreErrors();
}
m_pByteQueue = new CBigByteQueue(BUFSIZE);
return HXR_OK;
}
HX_RESULT
HXStrictXMLParser::InitErrorNotifier(ErrorNotifier* /*OUT*/ pNotifier)
{
m_pErrorNotifier = pNotifier;
if (m_pParser)
{
m_pParser->StoreErrors();
}
return HXR_OK;
}
HX_RESULT
HXStrictXMLParser::Parse(IHXBuffer* pBuffer,
BOOL bIsFinal)
{
HX_RESULT rc = HXR_OK;
// See if we have any encoding info
CheckEncoding(m_pParser, pBuffer);
UINT32 ulBufLen = pBuffer->GetSize();
if(m_pByteQueue->GetAvailableElements() < ulBufLen)
{
m_pByteQueue->Grow(ulBufLen);
}
m_pByteQueue->EnQueue(pBuffer->GetBuffer(), ulBufLen);
rc = DoParse(bIsFinal);
return rc;
}
HX_RESULT
HXStrictXMLParser::HandleErrors(CHXPtrArray* pErrs)
{
if (m_pErrorNotifier && pErrs)
{
int size = pErrs->GetSize();
for(int i=0;i<size;++i)
{
XMLError* pError = (XMLError*) (*pErrs)[i];
HX_RESULT code = ConvertToHX_RESULT(pError->m_errorTag);
m_pErrorNotifier->ErrorInLastTag(code, pError->m_pErrorString,
pError->m_pFrameString, pError->m_lLineNumber,
pError->m_lLinePosition);
}
}
return HXR_OK;
}
HX_RESULT
HXStrictXMLParser::ConvertToHX_RESULT(UINT32 err)
{
HX_RESULT ret = HXR_OK;
switch (err)
{
case XMLUnknownError:
ret = HXR_XML_GENERALERROR;
break;
case XMLErrorNoClose:
ret = HXR_XML_NOCLOSE;
break;
case XMLErrorBadAttribute:
ret = HXR_XML_BADATTRIBUTE;
break;
case XMLErrorNoValue:
ret = HXR_XML_NOVALUE;
break;
case XMLErrorMissingQuote:
ret = HXR_XML_MISSINGQUOTE;
break;
case XMLErrorBadEndTag:
ret = HXR_XML_BADENDTAG;
break;
case XMLErrorNoTagType:
ret = HXR_XML_NOTAGTYPE;
break;
case XMLErrorDupAttribute:
ret = HXR_XML_DUPATTRIBUTE;
break;
case XMLErrorCommentBeforeProcInst:
ret = HXR_XML_COMMENT_B4_PROCINST;
break;
case XMLErrorInvalidName:
ret = HXR_XML_INVALID_NAME;
break;
case XMLErrorInvalidCharInDoc:
ret = HXR_XML_INVALID_CHAR_IN_DOC;
break;
case XMLErrorTwoDashNotAllowed:
ret = HXR_XML_TWO_DASHES_NOT_ALLOWED_IN_COMMENT;
break;
case XMLErrorInvalidDecl:
ret = HXR_XML_INVALID_DECL;
break;
case XMLErrorInvalidPI:
ret = HXR_XML_INVALID_PI;
break;
case XMLErrorInvalidPITarget:
ret = HXR_XML_INVALID_PI_TARGET;
break;
case XMLErrorInvalidCDATA:
ret = HXR_XML_INVALID_CDATA;
break;
case XMLErrorInvalidRef:
ret = HXR_XML_INVALID_REF;
break;
case XMLErrorMissingEquals:
ret = HXR_XML_MISSING_EQUALS;
break;
case XMLErrorMissingReqSpace:
ret = HXR_XML_MISSING_REQ_SPACE;
break;
case XMLErrorLTnotAllowed:
ret = HXR_XML_LT_NOT_ALLOWED;
break;
case XMLErrorInvalidGTafter2RSQB:
ret = HXR_XML_INVALID_GT_AFFT_2_RSQB_IN_CONTENT;
break;
case XMLErrorInvalidComment:
ret = HXR_XML_INVALID_COMMENT;
break;
}
return ret;
}
HX_RESULT
HXStrictXMLParser::DoParse(BOOL bIsFinal)
{
HX_RESULT rc = HXR_OK;
XMLTag* pTag = NULL;
BOOL bDone = FALSE;
while(!bDone &&
HXR_OK == rc)
{
UINT32 bytesUsed;
UINT32 bytesAvail = m_pByteQueue->GetQueuedItemCount();
if(bytesAvail <= 0)
{
break;
}
BYTE* pBuf = new BYTE[bytesAvail];
BYTE* p = pBuf;
m_pByteQueue->DeQueue(pBuf, bytesAvail);
bytesUsed = bytesAvail;
if(pTag)
{
delete pTag;
pTag = 0;
}
XMLParseResult pResult =
m_pParser->Parse((const char*&)p, bytesAvail, pTag, bIsFinal);
m_pByteQueue->EnQueue(p, (UINT32)(bytesAvail - (p - pBuf)));
// pBuf is not used anymore, so delete
HX_VECTOR_DELETE(pBuf);
p = NULL;
UINT32 ulTagStartLine = m_pParser->GetTagStartLineNumber();
UINT32 ulTagStartCol = m_pParser->GetTagStartColumnNumber();
switch(pResult)
{
case XMLPNotDone:
{
goto exit;
}
case XMLPNoClose:
{
rc = HXR_XML_NOCLOSE;
goto exit;
}
case XMLPBadAttribute:
{
rc = HXR_XML_NOTAGTYPE;
goto exit;
}
case XMLPBadEndTag:
{
rc = HXR_XML_BADENDTAG;
goto exit;
}
case XMLPAttributeValueNotQuoted:
{
rc = HXR_XML_MISSINGQUOTE;
goto exit;
}
case XMLPBadDirective:
{
rc = HXR_XML_GENERALERROR;
goto exit;
}
case XMLPDupAttribute:
{
rc = HXR_XML_DUPATTRIBUTE;
goto exit;
}
case XMLPCommentBeforeProcInst:
{
rc = HXR_XML_COMMENT_B4_PROCINST;
goto exit;
}
case XMLPComment:
{
const char* pValue = pTag->m_cur_attribute->value;
rc = m_pResponse->HandleComment(pValue,ulTagStartLine,ulTagStartCol);
HandleErrors(pTag->m_errs);
}
break;
case XMLPPlainText:
{
const char* pValue = pTag->m_cur_attribute->value;
CHXBuffer* pBuffer = new CHXBuffer;
pBuffer->AddRef();
pBuffer->Set((const BYTE*)pValue, strlen(pValue)+1);
rc = m_pResponse->HandleCharacterData(pBuffer,ulTagStartLine,ulTagStartCol);
HandleErrors(pTag->m_errs);
HX_RELEASE(pBuffer);
}
break;
case XMLPDirective:
{
const char* pName = NULL;
const char* pPublicID = NULL;
const char* pSystemID = NULL;
CHXBuffer* pBuffer = NULL;
UINT32 ulNumAttributes = pTag->m_numAttributes;
if(strcmp(pTag->m_name, "DOCTYPE") == 0 &&
ulNumAttributes > 0)
{
UINT32 ulCurAttribute = 0;
while(ulCurAttribute < ulNumAttributes)
{
XMLAttribute* pAttr = NULL;
if(ulCurAttribute == 0)
{
pAttr = pTag->attribute(ulCurAttribute);
if(pAttr)
{
pName = pAttr->value;
}
}
else
{
pAttr = pTag->attribute(ulCurAttribute);
if(strcmp(pAttr->value, "SYSTEM") == 0)
{
ulCurAttribute++;
if(ulCurAttribute < ulNumAttributes)
{
pAttr = pTag->attribute(ulCurAttribute);
if(pAttr)
{
pSystemID = pAttr->value;
}
}
}
else if(strcmp(pAttr->value, "PUBLIC") == 0)
{
ulCurAttribute++;
if(ulCurAttribute < ulNumAttributes)
{
pAttr = pTag->attribute(ulCurAttribute);
if(pAttr)
{
pPublicID = pAttr->value;
ulCurAttribute++;
if(ulCurAttribute < ulNumAttributes)
{
pAttr = pTag->attribute(ulCurAttribute);
if(pAttr)
{
pSystemID = pAttr->value;
}
}
}
}
}
}
ulCurAttribute++;
}
rc = m_pResponse->HandleUnparsedDoctypeDecl(pName, pSystemID,
pPublicID, ulTagStartLine,ulTagStartCol);
HX_RELEASE(pBuffer);
}
}
break;
case XMLPProcInst:
// handle processing instruction
{
const char* pTarget = pTag->m_name;
CHXHeader* pValues = new CHXHeader;
pValues->AddRef();
pValues->PreserveCase(TRUE);
for(UINT32 i=0;i<pTag->m_numAttributes;++i)
{
XMLAttribute* pAttr = pTag->attribute(i);
// the XMLParser class supports what it calls attributes
// without names. It's used to communicate processing
// instructions and things like that. We just ignore attributes
// without names here.
if (pAttr->name != NULL)
{
CHXBuffer* pBuf = new CHXBuffer;
pBuf->AddRef();
pBuf->Set((const BYTE*)pAttr->value,
strlen(pAttr->value)+1);
pValues->SetPropertyCString(
pAttr->name, pBuf);
pBuf->Release();
}
}
rc = m_pResponse->HandleProcessingInstruction(pTarget,
pValues,ulTagStartLine,ulTagStartCol);
HandleErrors(pTag->m_errs);
HX_RELEASE(pValues);
}
break;
case XMLPTag:
{
const char* pName = pTag->m_name;
if(pTag->m_type != XMLEndTag)
{
CHXHeader* pValues = new CHXHeader;
pValues->AddRef();
pValues->PreserveCase(TRUE);
for(UINT32 i=0;i<pTag->m_numAttributes;++i)
{
XMLAttribute* pAttr = pTag->attribute(i);
// the XMLParser class supports what it calls attributes
// without names. It's used to communicate processing
// instructions and things like that. We just ignore attributes
// without names here.
if (pAttr->name != NULL)
{
CHXBuffer* pBuf = new CHXBuffer;
pBuf->AddRef();
pBuf->Set((const BYTE*)pAttr->value,
strlen(pAttr->value)+1);
pValues->SetPropertyCString(
pAttr->name, pBuf);
pBuf->Release();
}
}
if(HXR_OK == rc)
{
rc = m_pResponse->HandleStartElement(pName,
pValues,ulTagStartLine,ulTagStartCol);
HandleErrors(pTag->m_errs);
}
HX_RELEASE(pValues);
if(HXR_OK == rc &&
!pTag->m_need_close)
{
rc = m_pResponse->HandleEndElement(pName,ulTagStartLine,ulTagStartCol);
}
}
else
{
rc = m_pResponse->HandleEndElement(pName,ulTagStartLine,ulTagStartCol);
HandleErrors(pTag->m_errs);
}
}
break;
default:
{
bDone = TRUE;
}
break;
}
}
exit:
HX_DELETE(pTag);
return rc;
}
HX_RESULT
HXStrictXMLParser::GetCurrentLineNumber(REF(ULONG32) ulLineNumber)
{
HX_RESULT rc = HXR_OK;
ulLineNumber = (UINT32)m_pParser->GetCurrentLineNumber();
return rc;
}
HX_RESULT
HXStrictXMLParser::GetCurrentColumnNumber(REF(ULONG32) ulColumnNumber)
{
HX_RESULT rc = HXR_OK;
ulColumnNumber = (UINT32)m_pParser->GetCurrentColumnNumber();
return rc;
}
HX_RESULT
HXStrictXMLParser::GetCurrentByteIndex(REF(ULONG32) ulByteIndex)
{
HX_RESULT rc = HXR_NOTIMPL;
return rc;
}
HX_RESULT
HXStrictXMLParser::GetCurrentErrorText(REF(IHXBuffer*) pBuffer)
{
HX_RESULT rc = HXR_FAIL;
XMLError* pLastError = m_pParser->GetLastError();
if(pLastError &&
pLastError->m_pErrorString)
{
pBuffer = new CHXBuffer;
pBuffer->AddRef();
pBuffer->Set((BYTE*)pLastError->m_pErrorString,
strlen(pLastError->m_pErrorString) + 1);
rc = HXR_OK;
}
return rc;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?