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

📄 plghand2.cpp

📁 symbian 下的helix player源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        loadResult = LoadDLL( pszDllName, pMountPoint );

        if (loadResult!= NO_ERRORS)
        {
        // The DLL had one of the following problems:
        // (1) the DLL was unloadable
        // (2) the DLL did not have an HXCreateInstance
        // (3) an instance could not be created.
        // (4) It did not implement the PLUGIN interface

        // if it was case 2,3,4 then we can safely never attempt to
        // load the DLL again. However if it was (1) then we must attempt
        // to load the DLL ever time through since it was possibly unloadable due
        // to an imp-lib that will be satisfied lated (without modifing the
        // dll). Jeeze. That comment is UNREADABLE. I have to take effective written
        // english again!

        if (loadResult!=CANT_OPEN_DLL)
        {
            Plugin2Handler::OtherDLL* pDLLData = new Plugin2Handler::OtherDLL;
            pDLLData->m_filename = pszDllName;
            pDLLData->m_pMountPoint = pMountPoint;

            pNewChecksum            = ChecksumFile(pszDllName, pPathBuffer);
            if (pNewChecksum)
            {
            pDLLData->m_fileChecksum    = (char*)pNewChecksum->GetBuffer();
            HX_RELEASE(pNewChecksum);
            bRegIsDirty=TRUE;
            m_MiscDLLList.AddTail(pDLLData);
            }
            else
            {
            HX_DELETE(pDLLData);
            }
        }
        }
        else
        {
            bRegIsDirty = TRUE;
        }
    }
    pszDllName = pFileFinder->FindNext();

    }
    // now get the bandwidth data on all renderer plugins
    IHXValues* pVal = new CHXHeader();
    pVal->AddRef();
    IHXBuffer* pBuffer = new CHXBuffer();
    pBuffer->AddRef();

    pBuffer->Set((const UCHAR*)PLUGIN_RENDERER_TYPE, strlen(PLUGIN_RENDERER_TYPE)+1);
    pVal->SetPropertyCString(PLUGIN_CLASS, pBuffer);
    HX_RELEASE(pBuffer);

    for(CHXSimpleList::Iterator i = m_PluginList.Begin(); i!=m_PluginList.End(); ++i)
    {
    Plugin2Handler::Plugin* pPlug = (Plugin2Handler::Plugin*)*i;
    if (pPlug->DoesInfoNeedsRefresh() && pPlug->DoesMatch(pVal))
    {
        pPlug->GetBandwidthInfo();
    }
    }

    HX_RELEASE(pVal);

    if (bRegIsDirty)
    {
    // Pass the MountPoint to this so it can write the
    // specific plugins to the correct place
    WritePluginInfo( pMountPoint );
    }

    HX_RELEASE(pPathBuffer);
    HX_DELETE(pFileFinder);
    return HXR_OK;
}

STDMETHODIMP Plugin2Handler::FindIndexUsingValues	(IHXValues* pValues,
							REF(UINT32) unIndex)
{
    CHXSimpleList   PossibleValues;
    CHXSimpleList   PossibleIndexes;
    UINT32	    j = 0;
    IHXValues*	    pPluginValues = NULL;
    IHXBuffer*	    pBuffer = NULL;
    CHXSimpleList::Iterator i = m_PluginList.Begin();

    for(; i!= m_PluginList.End(); ++i, j++)
    {
	Plugin2Handler::Plugin* pPlugin = (Plugin2Handler::Plugin*) *i;
	if (pPlugin->DoesMatch(pValues))
	{
	    PossibleValues.AddTail(pPlugin);
	    PossibleIndexes.AddTail((void*)j);
	}
    }

    if (PossibleValues.Begin() == PossibleValues.End())
    {
	unIndex = 0;
	return HXR_FAIL;
    }

    /****************************************************************
    ** Presently when we arrive at this spot with more than one
    ** plugin which matches the search criteria, we simply take
    ** the first one found. If this is not satisfactory then
    ** some method can be added which will process the list based
    ** upon some criteria.
    ****************************************************************/

    // if there are multiple plugins found, we will pick the one whose
    // plugin description contains "RealNetworks"
    if (PossibleValues.GetCount() > 1)
    {
	j = 0;
	for(i = PossibleValues.Begin(); i!= PossibleValues.End(); ++i, j++)
	{
	    Plugin2Handler::Plugin* pPlugin = (Plugin2Handler::Plugin*) *i;
	    if (HXR_OK == pPlugin->GetPluginInfo(pPluginValues) && pPluginValues)
	    {
		if (HXR_OK == pPluginValues->GetPropertyCString(PLUGIN_DESCRIPTION2, pBuffer) &&
		    pBuffer)
		{
		    if (strstr((const char*)pBuffer->GetBuffer(), "RealNetworks"))
		    {
			LISTPOSITION pos = PossibleIndexes.FindIndex(j);
			unIndex = (UINT32)(PTR_INT)PossibleIndexes.GetAt(pos);
			HX_RELEASE(pBuffer);
			return HXR_OK;
		    }
		}
		HX_RELEASE(pBuffer);
	    }
	}
    }

    i = PossibleIndexes.Begin();
    unIndex = (UINT32)(PTR_INT)*i;

    return HXR_OK;
}

STDMETHODIMP Plugin2Handler::GetInstance (UINT32 index, REF(IUnknown*) pUnknown)
{
    pUnknown = NULL;
    LISTPOSITION pPos = m_PluginList.FindIndex(index);
    if (pPos)
    {
	Plugin2Handler::Plugin* pPlugin = (Plugin2Handler::Plugin*) m_PluginList.GetAt(pPos);
	if (pPlugin)
	{
	    Errors retVal = pPlugin->GetInstance(pUnknown);
	    if (retVal== NO_ERRORS)
	    {
		return HXR_OK;
	    }
	}
    }
    return HXR_FAIL;
}

STDMETHODIMP Plugin2Handler::FindIndexUsingStrings (char* PropName1,
						    char* PropVal1,
						    char* PropName2,
						    char* PropVal2,
						    char* PropName3,
						    char* PropVal3,
						    REF(UINT32) unIndex)
{
    unIndex = 0;

    // PropName and PropVal have to to valid tuple
    if ((PropName1 && !PropVal1)    ||
	(PropName2 && !PropVal2)    ||
	(PropName3 && !PropVal3)    ||
	(!PropName1 && PropVal1)    ||
	(!PropName2 && PropVal2)    ||
	(!PropName3 && PropVal3))
	return HXR_FAIL;

    IHXValues* pValues;
    HX_RESULT   retVal = HXR_FAIL;

    CHXHeader* pHeader = new CHXHeader;
    pHeader->QueryInterface(IID_IHXValues,  (void**)&pValues);
    AddToValues(pValues, PropName1, PropVal1, eString);
    AddToValues(pValues, PropName2, PropVal2, eString);
    AddToValues(pValues, PropName3, PropVal3, eString);
    retVal = FindIndexUsingValues(pValues, unIndex);
    pValues->Release();
    return retVal;
}


STDMETHODIMP Plugin2Handler::FindPluginUsingValues	(IHXValues* pValues,
							REF(IUnknown*) pUnk)
{
    return FindPluginUsingValues( pValues, pUnk, NULL );
}

HX_RESULT Plugin2Handler::FindGroupOfPluginsUsingStrings(char* PropName1,
						    char* PropVal1,
						    char* PropName2,
						    char* PropVal2,
						    char* PropName3,
						    char* PropVal3,
						    REF(CPluginEnumerator*) pEnumerator)
{
    // PropName and PropVal have to to valid tuple
    if ((PropName1 && !PropVal1)    ||
	(PropName2 && !PropVal2)    ||
	(PropName3 && !PropVal3)    ||
	(!PropName1 && PropVal1)    ||
	(!PropName2 && PropVal2)    ||
	(!PropName3 && PropVal3))
	return HXR_FAIL;

    IHXValues* pValues;
    HX_RESULT   retVal = HXR_FAIL;

    CHXHeader* pHeader = new CHXHeader;
    pHeader->QueryInterface(IID_IHXValues,  (void**)&pValues);
    AddToValues(pValues, PropName1, PropVal1, eString);
    AddToValues(pValues, PropName2, PropVal2, eString);
    AddToValues(pValues, PropName3, PropVal3, eString);
    retVal = FindGroupOfPluginsUsingValues(pValues, pEnumerator);
    pValues->Release();
    return retVal;
}

HX_RESULT Plugin2Handler::FindGroupOfPluginsUsingValues(IHXValues* pValues,
							REF(CPluginEnumerator*) pEnumerator)
{
    CHXSimpleList::Iterator i = m_PluginList.Begin();
    pEnumerator = NULL;

    for(; i!= m_PluginList.End(); ++i)
    {
	Plugin2Handler::Plugin* pPlugin = (Plugin2Handler::Plugin*) *i;
	if (pPlugin->DoesMatch(pValues))
	{
	    if (!pEnumerator)
	    {
		pEnumerator = new CPluginEnumerator();
	    }
	    pEnumerator->Add(pPlugin);
	}
    }

    if (!pEnumerator)
    {
	return HXR_FAIL;
    }

    return HXR_OK;
}

STDMETHODIMP Plugin2Handler::GetNumPluginsSupporting(REFIID iid, REF(UINT32) nNumPlugins)
{
    CHXString	    sGUID;
    CHXSimpleList*  pSupportList;

    CHXuuid::HXUuidToString( (uuid_tt*) &iid, &sGUID);

    if (!m_GUIDtoSupportList.Lookup(sGUID, (void*&)pSupportList))
    {
	return HXR_FAIL;
    }

    nNumPlugins = pSupportList->GetCount();
    return HXR_OK;
}

STDMETHODIMP Plugin2Handler::GetPluginIndexSupportingIID(REFIID iid, UINT32 nPluginIndex, REF(UINT32) nIndexOut)
{
    CHXString	    sGUID;
    CHXSimpleList*  pSupportList;

    CHXuuid::HXUuidToString( (uuid_tt*) &iid, &sGUID);

    if (m_GUIDtoSupportList.Lookup(sGUID, (void*&)pSupportList))
    {
	if (nPluginIndex < (UINT32)pSupportList->GetCount())
	{
	    LISTPOSITION pPos = pSupportList->FindIndex(nPluginIndex);
	    PluginSupportingGUID* pSupportItem = (PluginSupportingGUID*) pSupportList->GetAt(pPos);
	    if (FindPlugin(pSupportItem ->m_filename, pSupportItem->m_nIndexInDLL, nIndexOut))
	    {
		return HXR_OK;
	    }
	}
    }
    return HXR_FAIL;
}

STDMETHODIMP Plugin2Handler::AddSupportedIID(REFIID iid)
{
    //1st scan to see if this GUID is already supported...

    CHXString	    sGUID;
    CHXSimpleList*  pSupportList;

    CHXuuid::HXUuidToString( (uuid_tt*) &iid, &sGUID);

    if (m_GUIDtoSupportList.Lookup(sGUID, (void*&)pSupportList))
    {
#ifdef _MACINTOSH
    // the preferences are getting messed up on the mac.
    // so here we have to validate that the list of plugins we are about to
    // send over is valid.

	void* pGarbage;
	if (!m_GUIDSupportListIsValid.Lookup(sGUID, pGarbage))
	{
	    // to validate we will load all of the plugins within this list and
	    // QI them.
	    BOOL bListIsInvalid = FALSE;

	    for(LISTPOSITION pPos = pSupportList->GetHeadPosition(); pPos!=NULL;)
	    {
		BOOL IsValid = FALSE;
		UINT32 nTestPluginIndex;
		IUnknown* pTestUnk;
		PluginSupportingGUID* pSupportItemToTest =  (PluginSupportingGUID*) pSupportList->GetAt(pPos);
		if (FindPlugin(pSupportItemToTest->m_filename, pSupportItemToTest->m_nIndexInDLL, nTestPluginIndex))
		{
		    if (HXR_OK == GetInstance(nTestPluginIndex, pTestUnk))
		    {
			IUnknown* pTempUnk;
			if (HXR_OK == pTestUnk->QueryInterface(iid, (void**)&pTempUnk))
			{
			    // ohhh we are in trouble now. We HAVE to assume one of the two following
			    // statements:
			    // (1) All interfaces have derive from IUnknown.
			    // (2) All of our interfaces support aggeration correctly.
			    // I guess we'll have to assume (1) since I KNOW (2) is incorrect.
			    HX_RELEASE(pTempUnk);
			    IsValid = TRUE;
			}
			HX_RELEASE (pTestUnk);
		    }
		}
		HX_ASSERT(IsValid);
		if (!IsValid)
		{
		    // Should not be part of this list. Delete this node.
		    pSupportList->RemoveAt(pPos);
		    bListIsInvalid = TRUE;
		}
		else
		{
		    pSupportList->GetNext(pPos);
		}
	    }
	    m_GUIDSupportListIsValid.SetAt(sGUID, NULL);

	    // at this point we should rewrite the prefs file if bListIsInvalid
	    // however, I do not believe that we have an interface for removing
	    // enteries from the preferences. hmmmm...
	}
#endif
	return HXR_FAIL;    // hey! it is already in!
    }

#ifndef _MACINTOSH
    if  (!zm_bFasterPrefs)
    {
	// Write this out for each mount point
	for(CHXMapStringToOb::Iterator mp = m_MountPoints.Begin(); mp!=m_MountPoints.End(); ++mp)
	{
	    PluginMountPoint* pMountPoint = (PluginMountPoint*) *mp;
	    IHXPreferences* pIPrefs = pMountPoint->Prefs();
	    if( pIPrefs )
	    {
		PreferenceEnumerator* pPrefEnum = new PreferenceEnumerator( pIPrefs );

		HX_VERIFY( HXR_OK == pPrefEnum->BeginSubPref(PLUGIN_REGKEY_ROOT));
		HX_VERIFY( HXR_OK == pPrefEnum->BeginSubPref(PLUGIN_GUIDINFO));
		IHXBuffer* pIndexBuffer = new CHXBuffer();
		pIndexBuffer->AddRef();
		pIndexBuffer->Set((UCHAR*)"",1);
		pPrefEnum->WriteSubPref((const char*)sGUID, pIndexBuffer);
		pIndexBuffer->Release();
		pPrefEnum->EndSubPref(); // XXXAH these may not be necessary.
		pPrefEnum->EndSubPref(); // XXXAH these may not be necessary.

		delete pPrefEnum;
		HX_RELEASE( pIPrefs );
	    }
	}
    }
#endif

    // Now create the new structure.
    CHXSimpleList* pSimpleList = new CHXSimpleList();
    m_GUIDtoSupportList.SetAt(sGUID, pSimpleList);

    // now scan all of the Plugins to see if any of them support this interface,

    for(CHXSimpleList::Iterator i = m_PluginList.Begin(); i!=m_PluginList.End(); ++i)
    {
	IUnknown*   pUnk;
	IUnknown*   pQuery;
	Plugin2Handler::Plugin* pPlugin = (Plugin2Handler::Plugin*) *i;

	if (HXR_OK == pPlugin->GetPlugin(pUnk))
	{
	    if(HXR_OK == pUnk->QueryInterface(iid, (void**)&pQuery))
	    {
		PluginSupportingGUID* pSupportItem = new PluginSupportingGUID();

		IHXBuffer* pBuffer = pPlugin->GetFileName();
		pSupportItem->m_filename    = (char*) pBuffer->GetBuffer();
		HX_RELEASE( pBuffer );
		pSupportItem->m_pMountPoint = pPlugin->GetDLL()->GetMountPoint();
		pSupportItem->m_nIndexInDLL = pPlugin->GetIndex();

		pSimpleList->AddTail((void*)pSupportItem);
		// now write this info the registry
		char IndexArray[16]; /* Flawfinder: ignore */
		sprintf(IndexArray, "%d", (int) pSupportItem->m_nIndexInDLL); /* Flawfinder: ignore */
		IHXBuffer* pIndexBuffer = new CHXBuffer();
		pIndexBuffer->AddRef();
		pIndexBuffer->Set((const UCHAR*)IndexArray, strlen(IndexArray)+1);

		if (!zm_bFasterPrefs)
		{
		    IHXPreferences* pIPrefs = pPlugin->GetDLL()->GetMountPoint()->Prefs();
		    if( pIPrefs )
		    {
			PreferenceEnumerator* pPrefEnum = new PreferenceEnumerator( pIPrefs );

			HX_VERIFY(HXR_OK == pPrefEnum->BeginSubPref(PLUGIN_REGKEY_ROOT));
			HX_VERIFY(HXR_OK == pPrefEnum->BeginSubPref(PLUGIN_GUIDINFO));
			HX_VERIFY(HXR_OK == pPrefEnum->BeginSubPref((const char*)sGUID));
			pPrefEnum->WriteSubPref((const char*)pSupportItem->m_filename, pIndexBuffer);
			pPrefEnum->EndSubPref(); // XXXAH these may not be necessary.
			pPrefEnum->EndSubPref(); // XXXAH these may not be necessary.
			pPrefEnum->EndSubPref(); // XXXAH these may not be necessary.

			delete pPrefEnum;
			HX_RELEASE( pIPrefs );
		    }
		}

		HX_RELEASE(pIndexBuffer);
		HX_RELEASE(pQuery);

⌨️ 快捷键说明

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