rpparser.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,582 行 · 第 1/5 页

CPP
1,582
字号

STDMETHODIMP PXRealPixParser::HandleUnparsedDoctypeDecl(const char* pDoctype,
                                                        const char* pSystemID,
                                                        const char* pPublicID,
                                                        UINT32      ulLineNumber,
                                                        UINT32      ulColumnNumber)
{
    HX_RESULT retVal = HXR_OK;

    return retVal;
}

STDMETHODIMP PXRealPixParser::HandleDefault(IHXBuffer* pBuffer,
                                            UINT32      ulLineNumber,
                                            UINT32      ulColumnNumber)
{
    HX_RESULT retVal = HXR_OK;

    return retVal;
}

HX_RESULT PXRealPixParser::SetError(UINT32 ulErrorID, UINT32 ulLine, UINT32 ulCol,
                                    const char* pszArg1, const char* pszArg2,
                                    REF(IHXBuffer*) rpErrStr)
{
    HX_RESULT retVal = HXR_OK;

    const char* pszFileName = NULL;
    if (m_pRealPixFile)
    {
        pszFileName = m_pRealPixFile->GetFileName();
    }

    PXError cErr(m_pContext);
    if (pszFileName)
    {
        retVal = cErr.SetError(pszFileName, ulErrorID, ulLine, ulCol, pszArg1, pszArg2, rpErrStr);
    }
    else
    {
        retVal = cErr.SetError(ulErrorID, ulLine, ulCol, pszArg1, pszArg2, rpErrStr);
    }

    return retVal;
}

HX_RESULT PXRealPixParser::ParseTag(UINT32 ulTagID, IHXValues* pAttr, UINT32 ulLine,
                                    UINT32 ulCol, REF(IHXBuffer*) rpError)
{
    HX_RESULT retVal = HXR_OK;

    // Clear out any present error string
    HX_RELEASE(rpError);

    switch(ulTagID)
    {
        case kTagRoot:
            {
                if (m_ulState == kStateInitialized)
                {
                    m_ulState = kStateSawRootStart;
                }
                else
                {
                    SetError(IDS_ERR_PIX_ROOTNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
            }
            break;
        case kTagHead:
            {
                if (m_ulState == kStateInitialized)
                {
                    SetError(IDS_ERR_PIX_ROOTNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
                else if (m_ulState == kStateSawRootStart)
                {
                    // Process head here
                    retVal = ParseHeadTag(pAttr, ulLine, ulCol, rpError);
                    if (SUCCEEDED(retVal))
                    {
                        // Set the next state
                        m_ulState = kStateSawHead;
                    }
                }
                else
                {
                    SetError(IDS_ERR_PIX_HEADNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
            }
            break;
        case kTagImage:
            {
                if (m_ulState == kStateInitialized)
                {
                    SetError(IDS_ERR_PIX_ROOTNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
                else if (m_ulState == kStateSawRootStart)
                {
                    SetError(IDS_ERR_PIX_HEADNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
                else if (m_ulState == kStateSawHead)
                {
                    retVal = ParseImageTag(pAttr, ulLine, ulCol, rpError);
                }
            }
            break;
        case kTagFill:
        case kTagFadein:
        case kTagCrossfade:
        case kTagFadeout:
        case kTagWipe:
        case kTagAnimate:
        case kTagViewchange:
        case kTagEffect:
            {
                if (m_ulState == kStateInitialized)
                {
                    SetError(IDS_ERR_PIX_ROOTNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
                else if (m_ulState == kStateSawRootStart)
                {
                    SetError(IDS_ERR_PIX_HEADNOTFIRST, ulLine, ulCol, NULL, NULL, rpError);
                    retVal = HXR_FAIL;
                }
                else if (m_ulState == kStateSawHead)
                {
                    retVal = ParseEffectTag(ulTagID, pAttr, ulLine, ulCol, rpError);
                }
            }
            break;
    }

    return retVal;
}

HX_RESULT PXRealPixParser::ParseHeadTag(IHXValues* pAttr, UINT32 ulLine, UINT32 ulCol,
                                        REF(IHXBuffer*) rpError)
{
    HX_RESULT retVal = HXR_OK;

    if (pAttr)
    {
        // First we check the content version attribute
        const char* pszAttr = NULL;
        IHXBuffer* pValue  = NULL;
        GetAttributeNameFromID(kAttrVersion, pszAttr);
        HX_RESULT rv        = pAttr->GetPropertyCString(pszAttr, pValue);
        if (SUCCEEDED(rv))
        {
            UINT32 ulTmp = 0;
            retVal       = ConvertVersionValue(pValue, ulTmp);
            if (SUCCEEDED(retVal))
            {
                if (ulTmp <= m_ulHighestSupportedContentVersion)
                {
                    m_pRealPixFile->SetContentVersion(ulTmp);
                    m_bVersionSpecified = TRUE;
                }
                else
                {
                    SetError(IDS_ERR_PIX_FUTUREVERSION, ulLine, ulCol, (const char*) pValue->GetBuffer(), NULL, rpError);
                    retVal = HXR_FAIL;
                }
            }
            else
            {
                SetError(IDS_ERR_PIX_NULLVERSION, ulLine, ulCol, NULL, NULL, rpError);
            }
        }
        else
        {
            // Set the default to 0.0.0.0
            m_pRealPixFile->SetContentVersion(0);
            m_bVersionSpecified = FALSE;
        }
        HX_RELEASE(pValue);

        // Next we get the timeformat property in order to be able to
        // correctly interpret time values
        if (SUCCEEDED(retVal))
        {
            GetAttributeNameFromID(kAttrTimeformat, pszAttr);
            rv = pAttr->GetPropertyCString(pszAttr, pValue);
            if (SUCCEEDED(rv))
            {
                if (!strcmp((const char*) pValue->GetBuffer(), "dd:hh:mm:ss.xyz"))
                {
                    // Set timeformat to days/hours/minutes/seconds
                    m_pRealPixFile->SetTimeFormat(PXRealPixFile::kTimeFormatDHMS);
                }
                else if (!strcmp((const char*) pValue->GetBuffer(), "milliseconds"))
                {
                    // default is milliseconds
                    m_pRealPixFile->SetTimeFormat(PXRealPixFile::kTimeFormatMilliseconds);
                }
                else
                {
                    // Unknown time format
                    SetError(IDS_ERR_PIX_BADTIMEFORMAT, ulLine, ulCol, (const char*) pValue->GetBuffer(), NULL, rpError);
                    retVal = HXR_FAIL;
                }
            }
            else
            {
                // No timeformat specified, so set to default of milliseconds
                m_pRealPixFile->SetTimeFormat(PXRealPixFile::kTimeFormatMilliseconds);
            }
            HX_RELEASE(pValue);

            // Now loop through the attributes of the head tag
            const char* pszName = NULL;
            rv                  = pAttr->GetFirstPropertyCString(pszName, pValue);
            while (SUCCEEDED(rv) && SUCCEEDED(retVal))
            {
                // Get the attribute ID
                UINT32 ulAttrID = kNumAttr;
                GetAttributeIDFromName(pszName, ulAttrID);

                UINT32 ulMinVer = BASE_VERSION;
                switch (ulAttrID)
                {
                    case kAttrTitle:
                        {
                            retVal = CheckStringContents(pValue);
                            if (SUCCEEDED(retVal))
                            {
                                retVal = m_pRealPixFile->SetTitle(pValue);
                            }

                            if (FAILED(retVal))
                            {
                                SetError(IDS_ERR_PIX_NULLTITLE, ulLine, ulCol, NULL, NULL, rpError);
                            }
                        }
                        break;
                    case kAttrAuthor:
                        {
                            retVal = CheckStringContents(pValue);
                            if (SUCCEEDED(retVal))
                            {
                                retVal = m_pRealPixFile->SetAuthor(pValue);
                            }

                            if (FAILED(retVal))
                            {
                                SetError(IDS_ERR_PIX_NULLAUTHOR, ulLine, ulCol, NULL, NULL, rpError);
                            }
                        }
                        break;
                    case kAttrCopyright:
                        {
                            retVal = CheckStringContents(pValue);
                            if (SUCCEEDED(retVal))
                            {
                                retVal = m_pRealPixFile->SetCopyright(pValue);
                            }

                            if (FAILED(retVal))
                            {
                                SetError(IDS_ERR_PIX_NULLCOPYRIGHT, ulLine, ulCol, NULL, NULL, rpError);
                            }
                        }
                        break;
                    case kAttrStart:
                        {
                            UINT32 ulTmp = 0;
                            retVal       = ConvertTimeValue(pValue, m_pRealPixFile->GetTimeFormat(), ulTmp);
                            if (SUCCEEDED(retVal))
                            {
                                m_pRealPixFile->SetStart(ulTmp);
                            }
                            else
                            {
                                SetError(IDS_ERR_PIX_BADSTARTTIME, ulLine, ulCol, NULL, NULL, rpError);
                            }
                        }
                        break;
                    case kAttrDuration:
                        {
                            UINT32 ulTmp = 0;
                            retVal       = ConvertTimeValue(pValue, m_pRealPixFile->GetTimeFormat(), ulTmp);
                            if (SUCCEEDED(retVal))
                            {
                                m_pRealPixFile->SetDuration(ulTmp);
                            }
                            else
                            {
                                SetError(IDS_ERR_PIX_BADDURATION, ulLine, ulCol, NULL, NULL, rpError);
                            }
                        }
                        break;
                    case kAttrPreroll:
                        {
                            UINT32 ulTmp = 0;
                            retVal       = ConvertTimeValue(pValue, m_pRealPixFile->GetTimeFormat(), ulTmp);
                            if (SUCCEEDED(retVal))
                            {
                                m_pRealPixFile->SetPreroll(ulTmp);
                            }
                            else
                            {
                                SetError(IDS_ERR_PIX_BADPREROLL, ulLine, ulCol, NULL, NULL, rpError);
                            }
                        }
                        break;
                    case kAttrBitrate:
                        {
                            UINT32 ulTmp = strtoul((const char*) pValue->GetBuffer(), NULL, 10);
                            m_pRealPixFile->SetBitrate(ulTmp);
                        }
                        break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?