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

📄 hxxmlprs.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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_RESULTHXStrictXMLParser::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_RESULTHXStrictXMLParser::InitErrorNotifier(ErrorNotifier* /*OUT*/ pNotifier){    m_pErrorNotifier = pNotifier;     if (m_pParser)    {	m_pParser->StoreErrors();    }    return HXR_OK; }HX_RESULTHXStrictXMLParser::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_RESULTHXStrictXMLParser::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_RESULTHXStrictXMLParser::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_RESULTHXStrictXMLParser::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_RESULTHXStrictXMLParser::GetCurrentLineNumber(REF(ULONG32) ulLineNumber){    HX_RESULT rc = HXR_OK;    ulLineNumber = (UINT32)m_pParser->GetCurrentLineNumber();    return rc;}HX_RESULTHXStrictXMLParser::GetCurrentColumnNumber(REF(ULONG32) ulColumnNumber){    HX_RESULT rc = HXR_OK;    ulColumnNumber = (UINT32)m_pParser->GetCurrentColumnNumber();    return rc;}HX_RESULTHXStrictXMLParser::GetCurrentByteIndex(REF(ULONG32) ulByteIndex){    HX_RESULT rc = HXR_NOTIMPL;    return rc;}HX_RESULTHXStrictXMLParser::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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -