rpparser.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,582 行 · 第 1/5 页
CPP
1,582 行
pParser->AddRef();
HX_RELEASE(m_pParser);
retVal = pParser->QueryInterface(IID_IHXXMLParser, (void**) &m_pParser);
if (SUCCEEDED(retVal))
{
BOOL bXMLStrictness = (m_ulStrictnessLevel >= REALPIX_STRICTNESS_MEDIUM ? TRUE : FALSE);
// Init the parser interface
retVal = m_pParser->Init(this, // this class holds the response interface
NULL, // no special encoding
bXMLStrictness); // strict XML parsing or not
if (SUCCEEDED(retVal))
{
retVal = SetupLegalAttrLUT();
if (SUCCEEDED(retVal))
{
retVal = SetupIDMaps();
if (SUCCEEDED(retVal))
{
// Clear the RealPix error flag
m_bRealPixError = FALSE;
// Set the state
m_ulState = kStateInitialized;
}
}
}
}
}
else
{
retVal = HXR_OUTOFMEMORY;
}
HX_RELEASE(pParser);
}
}
else
{
retVal = HXR_INVALID_PARAMETER;
}
return retVal;
}
STDMETHODIMP PXRealPixParser::Parse(IHXBuffer* pFileBuffer, BOOL bIsFinal, REF(IHXBuffer*) rpErrorText)
{
HX_RESULT retVal = HXR_OK;
if (pFileBuffer)
{
if (m_pParser && m_pTagToIDMap &&
m_pAttrToIDMap && m_pLegalAttrLUT)
{
// Parse the buffer
retVal = m_pParser->Parse(pFileBuffer, bIsFinal);
if (FAILED(retVal))
{
// If the m_bRealPixError flag is set, then this error
// was a RealPix error as opposed to an XML error. If
// it was a RealPix error, then m_pErrorText should already
// contain an error string. If it was an XML error, then we
// need to get the error string from the XML parser.
HX_RELEASE(rpErrorText);
if (m_bRealPixError && m_pErrorText)
{
// We just need to assign m_pErrorText to the output buffer
rpErrorText = m_pErrorText;
rpErrorText->AddRef();
}
else
{
// This was an error detected by the XML parser,
// so we need to get the error string from the parser
m_pParser->GetCurrentErrorText(rpErrorText);
}
}
else
{
// Check to make sure we have some effects.
if (m_pRealPixFile->GetNumEffects())
{
// We parsed ok, so now we need to do a lot of post-parse initialization.
retVal = m_pRealPixFile->PostParseInit();
}
else
{
HX_RELEASE(rpErrorText);
SetError(IDS_ERR_PIX_NOEFFECTS, 0, 0, NULL, NULL, rpErrorText);
retVal = HXR_FAIL;
}
}
// if (bIsFinal)
// {
// m_pParser->Close();
// }
}
else
{
retVal = HXR_UNEXPECTED;
}
}
else
{
retVal = HXR_INVALID_PARAMETER;
}
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleStartElement(const char* pName,
IHXValues* pAttributes,
UINT32 ulLineNumber,
UINT32 ulColumnNumber)
{
HX_RESULT retVal = HXR_OK;
// Check the input
if (pName && pAttributes)
{
if (m_ulState >= kStateInitialized)
{
// First look up the tag ID
UINT32 ulTagID = 0;
retVal = GetTagIDFromName(pName, ulTagID);
if (SUCCEEDED(retVal))
{
// Loop through the attributes, checking to make sure each one
// is a legal attribute of this tag
const char* pszAttr = NULL;
IHXBuffer* pValue = NULL;
HX_RESULT rv = pAttributes->GetFirstPropertyCString(pszAttr, pValue);
while (SUCCEEDED(rv))
{
if (!IsLegalAttr(ulTagID, pszAttr))
{
if (m_ulStrictnessLevel == REALPIX_STRICTNESS_HIGH)
{
retVal = HXR_FAIL;
break;
}
else if (m_ulStrictnessLevel == REALPIX_STRICTNESS_MEDIUM)
{
IHXBuffer* pErr = NULL;
SetError(IDS_ERR_PIX_ILLEGALATTR, ulLineNumber, ulColumnNumber, pszAttr, pName, pErr);
ReportError(HXLOG_WARNING, HXR_OK, pErr);
HX_RELEASE(pErr);
}
}
HX_RELEASE(pValue);
rv = pAttributes->GetNextPropertyCString(pszAttr, pValue);
}
HX_RELEASE(pValue);
if (SUCCEEDED(retVal))
{
// Now check to see if all the REQUIRED attributes for this
// tag are present.
const char* pszReqAttr = NULL;
rv = GetFirstRequiredAttribute(ulTagID, pszReqAttr);
while (SUCCEEDED(rv))
{
// Check if this attribute is present
IHXBuffer* pTmp = NULL;
retVal = pAttributes->GetPropertyCString(pszReqAttr, pTmp);
HX_RELEASE(pTmp);
if (FAILED(retVal))
{
break;
}
// Get the next required attribute ID
rv = GetNextRequiredAttribute(ulTagID, pszReqAttr);
}
if (SUCCEEDED(retVal))
{
// All of the attributes were legal, and all the required
// attributes were present, so process the tag
retVal = ParseTag(ulTagID, pAttributes, ulLineNumber, ulColumnNumber, m_pErrorText);
if (FAILED(retVal))
{
m_bRealPixError = TRUE;
}
}
else
{
// We are missing a required attribute
m_bRealPixError = TRUE;
HX_RELEASE(m_pErrorText);
SetError(IDS_ERR_PIX_MISSREQATTR, ulLineNumber, ulColumnNumber,
pszReqAttr, pName, m_pErrorText);
}
}
else
{
// One of the attributes of this tag wasn't legal
m_bRealPixError = TRUE;
HX_RELEASE(m_pErrorText);
SetError(IDS_ERR_PIX_ILLEGALATTR, ulLineNumber, ulColumnNumber,
pszAttr, pName, m_pErrorText);
}
}
else
{
// This is not a legal tag name
m_bRealPixError = TRUE;
HX_RELEASE(m_pErrorText);
SetError(IDS_ERR_PIX_UNKNOWNTAG, ulLineNumber, ulColumnNumber,
pName, NULL, m_pErrorText);
}
}
else
{
retVal = HXR_UNEXPECTED;
}
}
else
{
retVal = HXR_INVALID_PARAMETER;
}
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleEndElement(const char* pName,
UINT32 ulLineNumber,
UINT32 ulColumnNumber)
{
HX_RESULT retVal = HXR_OK;
if (pName)
{
// Get the tag ID
UINT32 ulTagID = 0;
retVal = GetTagIDFromName(pName, ulTagID);
if (SUCCEEDED(retVal))
{
if (ulTagID == kTagRoot)
{
if (m_ulState == kStateSawHead)
{
m_ulState = kStateSawRootEnd;
}
else
{
m_bRealPixError = TRUE;
retVal = HXR_FAIL;
HX_RELEASE(m_pErrorText);
SetError(IDS_ERR_PIX_INVALIDHEAD, ulLineNumber, ulColumnNumber, NULL, NULL, m_pErrorText);
}
}
}
else
{
// This not a known tag
m_bRealPixError = TRUE;
HX_RELEASE(m_pErrorText);
SetError(IDS_ERR_PIX_UNKNOWNTAG, ulLineNumber, ulColumnNumber,
pName, NULL, m_pErrorText);
}
}
else
{
retVal = HXR_INVALID_PARAMETER;
}
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleCharacterData(IHXBuffer* pBuffer,
UINT32 ulLineNumber,
UINT32 ulColumnNumber)
{
HX_RESULT retVal = HXR_OK;
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleProcessingInstruction(const char* pTarget,
IHXValues* pAttributes,
UINT32 ulLineNumber,
UINT32 ulColumnNumber)
{
HX_RESULT retVal = HXR_OK;
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleUnparsedEntityDecl(const char* pEntityName,
const char* pSystemID,
const char* pPublicID,
const char* pNotationName,
UINT32 ulLineNumber,
UINT32 ulColumnNumber)
{
HX_RESULT retVal = HXR_OK;
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleNotationDecl(const char* pNotationName,
const char* pSystemID,
const char* pPublicID,
UINT32 ulLineNumber,
UINT32 ulColumNumber)
{
HX_RESULT retVal = HXR_OK;
return retVal;
}
STDMETHODIMP PXRealPixParser::HandleComment(const char* pComment,
UINT32 ulLineNumber,
UINT32 ulColumnNumber)
{
HX_RESULT retVal = HXR_OK;
return retVal;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?