⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expatprs.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -