📄 expatprs.cpp
字号:
return HXR_XML_INVALID_COMMENT; default: return HXR_XML_GENERALERROR; } } } else { return HXR_NOT_INITIALIZED; } return HXR_OK;}STDMETHODIMPHXExpatXMLParser::GetCurrentLineNumber(REF(ULONG32) /*OUT*/ ulLineNumber){ if ( m_pParser ) { ulLineNumber = XML_GetCurrentLineNumber(m_pParser); return HXR_OK; } else { return HXR_NOT_INITIALIZED; }}STDMETHODIMPHXExpatXMLParser::GetCurrentColumnNumber(REF(ULONG32) /*OUT*/ ulColumnNumber){ if ( m_pParser ) { ulColumnNumber = XML_GetCurrentLineNumber(m_pParser); return HXR_OK; } else { return HXR_NOT_INITIALIZED; }}STDMETHODIMPHXExpatXMLParser::GetCurrentByteIndex(REF(ULONG32) /*OUT*/ ulByteIndex){ if ( m_pParser ) { ulByteIndex = XML_GetCurrentByteIndex(m_pParser); return HXR_OK; } else { return HXR_NOT_INITIALIZED; }}STDMETHODIMPHXExpatXMLParser::GetCurrentErrorText(REF(IHXBuffer*) /*OUT*/ pBuffer){ XML_Error code = XML_GetErrorCode(m_pParser); /* Returns a string describing the error. */ UINT32 ulByteIndex = XML_GetCurrentByteIndex(m_pParser); UINT32 ulColumnNumber = XML_GetCurrentLineNumber(m_pParser); const UCHAR* pPos = m_pCurrentBuffer->GetBuffer(); if ( SUCCEEDED(m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuffer)) ) { const char p[] = "No error context"; if (m_pCurrentBuffer) { if (ulByteIndex >= m_ulCurrentOffset && ulByteIndex < m_ulCurrentOffset + m_pCurrentBuffer->GetSize()) { int i; int offset = ulByteIndex - m_ulCurrentOffset; int startPos = offset; // first we will back the startPos up to the begining of the // line or 0 for (; startPos > 0 && pPos[startPos-1] != '\n' && pPos[startPos-1] != '\r'; --startPos); // if the beginning of the line number is > 40 characters // ahead, we want to jump ahead so the error text is not too long. if (offset - startPos >= 40) { startPos = offset - 40; } // now we will find the end of the line. for (i=startPos; pPos[i] && pPos[i] != '\n' && pPos[i] != '\r'; ++i); if (SUCCEEDED(pBuffer->Set(&pPos[startPos], i-startPos+1))) { pBuffer->GetBuffer()[i-startPos] = '\0'; return HXR_OK; } else { return HXR_OUTOFMEMORY; } } else { return pBuffer->Set((const UCHAR*)p, sizeof(p)); } } else { return pBuffer->Set((const UCHAR*)p, sizeof(p)); } } else { return HXR_FAIL; }}void HXExpatXMLParser::handleStartElement(const XML_Char *name, const XML_Char **atts){ HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement" ); if (m_pResponse) { IHXValues* pAtt = NULL; { HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::createIHXValues" ); IUnknown* pUnkAtt = NULL; m_pClassFactory->CreateInstance(CLSID_IHXValues, (void**)&pUnkAtt); pUnkAtt->QueryInterface(IID_IHXValues, (void**)&pAtt); HX_RELEASE(pUnkAtt); } if (*atts && **atts) { HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::createIHXBuffer" ); do { IHXBuffer* pBuf = NULL; m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf); pBuf->Set((const UCHAR*)atts[1], strlen(atts[1])+1); pAtt->SetPropertyCString(atts[0], pBuf); HX_RELEASE(pBuf); } while (*(atts+=2)); } { int ulLine; int ulCol; { HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::XML_GetCurrentLineNumber" ); ulLine = XML_GetCurrentLineNumber(m_pParser); } { HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::XML_GetCurrentColumnNumber" ); ulCol = XML_GetCurrentColumnNumber(m_pParser); } m_pResponse->HandleStartElement((const char*)name, pAtt, ulLine,ulCol); } HX_RELEASE(pAtt); }}void HXExpatXMLParser::handleEndElement(const XML_Char *name){ HX_LOG_BLOCK( "HXExpatXMLParser::handleEndElement" ); if (m_pResponse) { int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleEndElement((const char*)name, ulLine,ulCol); }}void HXExpatXMLParser::handleCharacterData(const XML_Char *s, int len){ if (m_pResponse) { IHXBuffer* pBuf = NULL; m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf); pBuf->Set((UCHAR*)s, len); int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleCharacterData(pBuf, ulLine,ulCol); HX_RELEASE(pBuf); }}void HXExpatXMLParser::handleProcessingInstruction( const XML_Char *target, const XML_Char *data){ if (m_pResponse) { IHXValues* pAtt = NULL; IUnknown* pUnkAtt = NULL; m_pClassFactory->CreateInstance(CLSID_IHXValues, (void**)&pUnkAtt); pUnkAtt->QueryInterface(IID_IHXValues, (void**)&pAtt); HX_RELEASE(pUnkAtt); const char* pos = data; const char* pStartName = NULL; const char* pEndName = NULL; const char* pStartAtt = NULL; char cQuote = '"'; const char* pEndAtt = NULL; for (;;) { // eat white space for(;*pos && isspace(*pos); ++pos); // if we've reached the end, break out if (*pos == '\0') break; // get attribute name for(pStartName = pos; *pos && !isspace(*pos) && *pos != '='; ++pos); // eat white space for(pEndName = pos;*pos && isspace(*pos); ++pos); // require equals sign if (*pos++ != '=') break; // eat white space for(;*pos && isspace(*pos); ++pos); // get attribute value if (*pos == '\'' || *pos == '"') { cQuote = *pos++; } else { break; } for(pStartAtt = pos; *pos && *pos != cQuote;++pos); pEndAtt = pos; // Advance past the quote ++pos; // require a single whitespace or termination... if (*pos != '\0' && !isspace(*pos)) { break; } char* name = new char[pEndName-pStartName+1]; if (!name) { break; } strncpy(name, pStartName, pEndName - pStartName); /* Flawfinder: ignore */ name[pEndName-pStartName] = '\0'; IHXBuffer* pBuf = NULL; m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf); if (!pBuf) { HX_VECTOR_DELETE(name); break; } if (FAILED(pBuf->Set((UCHAR*)pStartAtt, pEndAtt-pStartAtt+1))) { HX_VECTOR_DELETE(name); HX_RELEASE(pBuf); break; } pBuf->GetBuffer()[pEndAtt-pStartAtt] = '\0'; if (FAILED(pAtt->SetPropertyCString(name, pBuf))) { HX_VECTOR_DELETE(name); HX_RELEASE(pBuf); break; } HX_RELEASE(pBuf); HX_VECTOR_DELETE(name); } int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleProcessingInstruction(target, pAtt, ulLine,ulCol); HX_RELEASE(pAtt); }}void HXExpatXMLParser::handleComment(const XML_Char *data){ if (m_pResponse) { int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleComment((const char*) data, ulLine, ulCol); }}void HXExpatXMLParser::handleStartCDataSection(){}void HXExpatXMLParser::handleEndCDataSection(){}void HXExpatXMLParser::handleDefault(const XML_Char *s, int len){ if (m_pResponse) { IHXBuffer* pBuf = NULL; m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf); pBuf->Set((UCHAR*)s, len); int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleDefault(pBuf, ulLine, ulCol); HX_RELEASE (pBuf); }}void HXExpatXMLParser::handleUnparsedEntityDecl( const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName){ if (m_pResponse) { // note ... call back interface missing *base int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleUnparsedEntityDecl(entityName,systemId, publicId, notationName, ulLine, ulCol); }}void HXExpatXMLParser::handleNotationDecl( const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId){ if (m_pResponse) { // note ... call back interface missing *base int ulLine = XML_GetCurrentLineNumber(m_pParser); int ulCol = XML_GetCurrentColumnNumber(m_pParser); m_pResponse->HandleNotationDecl(notationName, systemId, publicId, ulLine, ulCol); }}void HXExpatXMLParser::handleStartNamespaceDecl( const XML_Char *prefix, const XML_Char *uri){ if (m_pNSResp) { m_pNSResp->HandleStartNamespaceDecl(prefix, uri); }}void HXExpatXMLParser::handleEndNamespaceDecl(const XML_Char *prefix){ if (m_pNSResp) { m_pNSResp->HandleEndNamespaceDecl(prefix); }}int HXExpatXMLParser::handleNotStandalone(){ /* This is called if the document is not standalone (it has an * external subset or a reference to a parameter entity, but does not * have standalone="yes"). If this handler returns 0, then processing * will not continue, and the parser will return a * XML_ERROR_NOT_STANDALONE error. */ return 1;}void HXExpatXMLParser::handleStartDoctypeDecl(const XML_Char *doctypeName){ // note... no DTD callbacks...}void HXExpatXMLParser::handleEndDoctypeDecl(){ // note... no DTD callbacks...}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -