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

📄 sm1doc.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
	    m_bShowDependencies = (BOOL)atol((const char*)pBuf->GetBuffer());
	    HX_RELEASE(pBuf);
	}
	pPrefs->Release();
    }
    if(m_bShowDependencies)
    {
	// mark file boundary
	FILE* fp = fopen(SMILDEPFILE, "a");
	if(fp)
	{
    	    fprintf(fp, "===========================\n");
	    fclose(fp);
	}
    }
#endif
}

CSmil1DocumentRenderer::~CSmil1DocumentRenderer()
{
#if defined(_DEBUG) && defined(XXXMEH_CHECK_FOR_LEAKS)
    char szDbgStr[128]; /* Flawfinder: ignore */
    sprintf(szDbgStr, "DES CSmil1DocumentRenderer 0x%08x\n", this); /* Flawfinder: ignore */
    OutputDebugString(szDbgStr);
#endif
    HX_RELEASE(m_pSiteMgr);

#if defined(_UNIX)  &&  (!defined(_BEOS))  &&  defined(USE_XWINDOWS)
    CHXMapPtrToPtr::Iterator i = m_siteToXDataMap.Begin();
    for(; i != m_siteToXDataMap.End(); ++i)
    {
        XData* xData = (XData*)(*i);
	delete xData;
    }

    if (m_pVisualInfo)
    {
	XFree(m_pVisualInfo);
	m_pVisualInfo = NULL;
    }

    if (m_pDisplay && m_hHyperlinkCursor)
    {
	XFreeCursor(m_pDisplay, m_hHyperlinkCursor);
	m_hHyperlinkCursor = 0;
    }
#endif    
#if defined(_MACINTOSH)
    if (m_hHyperlinkCursor)
    {
    	m_pResourceLoader->UnloadResource((Handle)m_hHyperlinkCursor);
    	m_hHyperlinkCursor = NULL;
    	
    	HX_RELEASE(m_pResourceLoader);
    }

    if (m_bResetCursor)
    {
	::InitCursor();
    }
#endif
}

/*
 * IUnknown methods
 */
STDMETHODIMP
CSmil1DocumentRenderer::QueryInterface(REFIID riid, void** ppvObj)
{
    if(IsEqualIID(riid, IID_IUnknown))
    {
	AddRef();
	*ppvObj = this;
	return HXR_OK;
    }
    else if(IsEqualIID(riid, IID_IHXValues))
    {
	AddRef();
	*ppvObj = (IHXValues*)this;
	return HXR_OK;
    }
    else if(IsEqualIID(riid, IID_IHXSiteUser))
    {
	AddRef();
	*ppvObj = (IHXSiteUser*)this;
	return HXR_OK;
    }
    else if(IsEqualIID(riid, IID_IHXRendererAdviseSink))
    {
	AddRef();
	*ppvObj = (IHXRendererAdviseSink*)this;
	return HXR_OK;
    }
    else if(IsEqualIID(riid, IID_IHXGroupSink))
    {
	AddRef();
	*ppvObj = (IHXGroupSink*)this;
	return HXR_OK;
    }
    *ppvObj = NULL;
    return HXR_NOINTERFACE;
}

STDMETHODIMP_(ULONG32)
CSmil1DocumentRenderer::AddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}

STDMETHODIMP_(ULONG32)
CSmil1DocumentRenderer::Release()
{
    if(InterlockedDecrement(&m_lRefCount) > 0)
    {
	return m_lRefCount;
    }

    delete this;
    return 0;
}

HX_RESULT
CSmil1DocumentRenderer::close(CSmil1Renderer* pParent)
{
    if (m_pProcessElementCallback)
    {
	if (m_pScheduler && m_pProcessElementCallback->m_bIsCallbackPending)
	{
    	    m_pProcessElementCallback->m_bIsCallbackPending = FALSE;
	    m_pScheduler->Remove(m_pProcessElementCallback->m_PendingHandle);
	    m_pProcessElementCallback->m_PendingHandle = 0;
	}
	HX_RELEASE(m_pProcessElementCallback);
    }

    IUnknown* pThisUnk = 0;
    if(HXR_OK == QueryInterface(IID_IUnknown, (void**)&pThisUnk))
    {
	pParent->HandleRemoveLayoutSiteGroup(pThisUnk);
	pThisUnk->Release();
    }

    if(m_pEventList)
    {
	CHXSimpleList::Iterator i = m_pEventList->Begin();
	for(; i != m_pEventList->End(); ++i)
	{
	    CSmil1LayoutEvent* pEvent = (CSmil1LayoutEvent*)(*i);
	    delete pEvent;
	}
    }
    HX_DELETE(m_pEventList);

    removeAllPlayToAssoc();

    if (m_bSitesDetached)
    {
        if(m_pRegionMap)
        {
	    CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();
	    for(; i != m_pRegionMap->End(); ++i)
	    {
	        CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);
	        delete pRegion;
	    }
        }
        HX_DELETE(m_pRegionMap);
    }

    if(m_pGroupInfoMap)
    {
	CHXMapLongToObj::Iterator i = m_pGroupInfoMap->Begin();
	for(; i != m_pGroupInfoMap->End(); ++i)
	{
	    SMIL1GroupInfo* pGroupInfo = (SMIL1GroupInfo*)(*i);
	    delete pGroupInfo;
	}
    }
    HX_DELETE(m_pGroupInfoMap);

    if(m_pDeferredSourceMap)
    {
	CHXMapStringToOb::Iterator i = m_pDeferredSourceMap->Begin();
	for(; i != m_pDeferredSourceMap->End(); ++i)
	{
	    SMIL1DeferredSourceInfo* pInfo = (SMIL1DeferredSourceInfo*)(*i);
	    delete pInfo;
	}
    }
    HX_DELETE(m_pDeferredSourceMap);

    HX_DELETE(m_pRepeatIDMap);

    if (m_bSitesDetached)
    {
        if(m_pSiteInfoList)
        {
	    CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();
	    for(; i != m_pSiteInfoList->End(); ++i)
	    {
	        SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);
	        delete pSiteInfo;
	    }
        }
        HX_DELETE(m_pSiteInfoList);
    }

    if(m_pStatusMessage)
    {
	m_pStatusMessage->SetStatus(NULL);
    }
    HX_RELEASE(m_pStatusMessage);

    if (m_bSitesDetached)
    {
        HX_DELETE(m_pSiteInfoByRendererMap);
    }

    if (m_bSitesDetached)
    {
        if(m_pSiteWatcherMap)
        {
	    CHXMapPtrToPtr::Iterator i= m_pSiteWatcherMap->Begin();
	    for(; i != m_pSiteWatcherMap->End(); ++i)
	    {
	        CSmil1SiteWatcher* pSiteWatcher = (CSmil1SiteWatcher*)(*i);
	        pSiteWatcher->Release();
	    }
	    HX_DELETE(m_pSiteWatcherMap);
        }
    }

    HX_RELEASE(m_pValues);
    HX_DELETE(m_pSmilParser);
    HX_VECTOR_DELETE(m_pFragment);
    HX_RELEASE(m_pScheduler);
    HX_RELEASE(m_pContext);

#ifdef _MACINTOSH
    if (m_bResetCursor)
    {
	m_bResetCursor = FALSE;
	::InitCursor();
    }
#endif

    m_bCloseCalled = TRUE;

    return HXR_OK;
}

HX_RESULT
CSmil1DocumentRenderer::onHeader(IHXValues* pHeader)
{
    m_pValues = new CHXHeader;
    m_pValues->AddRef();
    m_pRegionMap = new CHXMapStringToOb;
    m_pSiteInfoByRendererMap = new CHXMapPtrToPtr;
 
    if (m_pPersistentParentRenderer &&
	HXR_OK == m_pPersistentParentRenderer->GetElementProperties(m_uPersistentGroupID,
								    m_uPersistentTrackID,
								    m_pPersistentProperties))
    {
	m_pPersistentProperties->GetPropertyULONG32("ElementWithinTag", (UINT32&)m_elementWithinTag);
    }
    
    IHXBuffer* pBuffer = 0;
    IHXCommonClassFactory* pFactory = m_pParent->getFactory();
    if(HXR_OK == pFactory->CreateInstance(CLSID_IHXBuffer,
	(void**)&pBuffer))
    {
	pBuffer->Set((const BYTE*)"TopLevelSite", strlen("TopLevelSite")+1);
	SetPropertyCString("name", pBuffer);
	SetPropertyULONG32("GroupIndex", m_uPersistentGroupID);
	SetPropertyULONG32("TrackIndex", m_uPersistentTrackID);
	pBuffer->Release();
    }

    m_pSmilParser = new CSmil1Parser(m_pContext);
    m_pSmilParser->init();
    m_pSmilParser->InitPersistent(m_ulPersistentComponentID, m_elementWithinTag);

    return HXR_OK;
}

HX_RESULT
CSmil1DocumentRenderer::getErrorInfo(REF(UINT32) ulLineNumber,
				    REF(UINT32) ulColumnNumber,
				    REF(IHXBuffer*) pErrorText)
{
    ulLineNumber = m_pSmilParser->m_ulErrorLineNumber;
    ulColumnNumber = m_pSmilParser->m_ulErrorColumnNumber;
    pErrorText = m_pSmilParser->m_pErrorText;
    if(pErrorText)
    {
	pErrorText->AddRef();
    }

    return HXR_OK;
}

HX_RESULT
CSmil1DocumentRenderer::onPacket(IHXBuffer* pBuffer, BOOL bIsLast)
{
    HX_RESULT rc = HXR_OK;

    BOOL bDumpToFile = FALSE;
    getBooleanPreference(m_pContext,
                         "NonObviousKeyNameVer1",
                         bDumpToFile);
    BOOL bShowPacketBoundaries = FALSE;
    getBooleanPreference(m_pContext,
                         "NonObviousKeyNameVer1Option1",
                         bShowPacketBoundaries);
    if (bDumpToFile)
    {
#ifdef _WINDOWS
        const char* pszFile = "c:\\smil1dump.txt";
#else
        const char* pszFile = "smil1dump.txt";
#endif
        FILE* pFoo = fopen(pszFile, m_ulPktnum > 0L ? "a" : "w");
        if (pFoo)
        {
            char* pBuf = (char*) pBuffer->GetBuffer();
            if(pBuf && strlen(pBuf) > 0)
            {
                if (bShowPacketBoundaries)
                {
                    fprintf(pFoo, "[[[packet # %lu]]]:{{{", m_ulPktnum);
                }
                fwrite(pBuf, 1, pBuffer->GetSize(), pFoo);
                if (bShowPacketBoundaries)
                {
                    fprintf(pFoo, "}}}\n");
                }
            }
            else
            {
                if (bShowPacketBoundaries)
                {
                    fprintf(pFoo, "\n[[[Packet %lu empty in onPacket()]]]\n",
                            m_ulPktnum);
                }
            }
        }
        fclose(pFoo);
        if (bIsLast)
            m_ulPktnum = 0L;
        else
            m_ulPktnum++;
    }
    rc = m_pSmilParser->parse(pBuffer, bIsLast);

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::setDocument(const char* pFragment)
{
    HX_RESULT rc = m_pSmilParser->createElements();
    if(HXR_OK == rc)
    {
	rc = handleElements();
	IHXPlayer* pPlayer = m_pParent->getPlayer();
	IHXGroupManager* pMgr = 0;

	if(HXR_OK == pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pMgr))
	{
	    if(pFragment)
	    {
		m_pFragment = new_string(pFragment);
		m_bSettingFragment = TRUE;
    	    	m_nFragmentTracks = 0;
		UINT16 uFragmentGroup = 
		    m_pSmilParser->getFragmentGroup(m_pFragment);
		pMgr->SetCurrentGroup(uFragmentGroup);
	    }
	    // /Adding the "else" around this fixes PR 75814; without this,
	    // the code was ignoring the uFragmentGroup set already, above,
	    // and thus "foo.smil#fragmentInHighGroup" links stopped working
	    // in the RealOne Player:
	    else
	    {
		if (m_pParent->m_bUseNestedMeta && !m_bLastGroupInRAM20 && m_uCurrentGroupIndex == -1)
		{
		    pMgr->GetCurrentGroup((UINT16&)m_uCurrentGroupIndex);
		}
		else
		{
		    pMgr->SetCurrentGroup(0);
		}
	    }
	    pMgr->Release();
	}
    }

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::handleElements()
{
    HX_RESULT rc = HXR_OK;

    if(m_pSmilParser)
    {
	//if(m_ulParseResult != HXR_STREAM_DONE)
	//{
	    while(HXR_OK == rc)
	    {
		rc = m_pSmilParser->handleNextElement(this);
	    }
	    m_ulParseResult = rc;
	//}
    }

    return HXR_OK;
}

HX_RESULT
CSmil1DocumentRenderer::parseDimension(const char* pDimensionString,
				      REF(UINT32) ulValue,
				      REF(BOOL) bIsPercent)
{
    HX_RESULT rc = HXR_OK;

    if(!pDimensionString || strlen(pDimensionString) == 0)
    {
	ulValue = 0L;
	//[SMIL 1.0 compliance] Helps fix PR 16542.  The caller of this
	// function should look at this return value to determine whether
	// or not the string was empty (and thus 0 is returned in ulValue) or
	// whether "0" or "0%" IS the string (and thus 0 is returned in
	// ulValue along with HXR_OK):
	rc = HXR_FAIL;
    }
    else
    {
	char* pEndPtr = 0;
	ulValue = (UINT32)strtod(pDimensionString, &pEndPtr);
	if(pEndPtr && strcmp(pEndPtr, "%") == 0)
	{
	    bIsPercent = TRUE;
	}
	else
	{
	    bIsPercent = FALSE;
	}
    }
    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::regionToRect(CSmil1Region* pElement, 
    HXxRect* pRect, BOOL& bWidthUnspecified, BOOL& bHeightUnspecified)
{
    HX_RESULT rc = HXR_OK;

    bWidthUnspecified = bHeightUnspecified = FALSE;

    UINT32 ulTop = 0;
    UINT32 ulLeft = 0;
    UINT32 ulWidth = 0;
    UINT32 ulHeight = 0;
    BOOL bTopIsPercent = FALSE;
    BOOL bLeftIsPercent = FALSE;
    BOOL bWidthIsPercent = FALSE;
    BOOL bHeightIsPercent = FALSE;

    parseDimension(pElement->m_left, ulLeft, bLeftIsPercent);
    parseDimension(pElement->m_top, ulTop, bTopIsPercent);
    HX_RESULT rsltW =
	    parseDimension(pElement->m_width, ulWidth, bWidthIsPercent);
    HX_RESULT rsltH =
	    parseDimension(pElement->m_height, ulHeight, bHeightIsPercent);

⌨️ 快捷键说明

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