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

📄 basehand.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}


BaseHandler::Errors
BaseHandler::PluginDLL::Load(IUnknown* pContext)
{
    HX_LOG_BLOCK( "BaseHandler::PluginDLL::Load()" );

    Errors	result	    = NO_ERRORS;

    IUnknown*	pInstance   = NULL;
    IHXPlugin* pPlugin = NULL;
    IHXPluginFactory* pIFactory = NULL;


    if (m_bLoaded)
    {
	return PLUGIN_ALREADY_HAS_MOUNT_POINT; //XXXAH Huh?
    }

    if( m_pFileName->GetSize() <= 1 )
    {
	return PLUGIN_NOT_FOUND;
    }

    // Build complete path for DLL
    CHXString fileNameWithPath;

#if !defined(_STATICALLY_LINKED) || defined(HELIX_CONFIG_CONSOLIDATED_CORE)
    // we're not statically linked so we must use the mount point path
    IHXBuffer* pBuffer = m_pMountPoint->Path();
    if (pBuffer)
    {
	fileNameWithPath = (char*)pBuffer->GetBuffer();
	UINT32 len = fileNameWithPath.GetLength();
	if (len && fileNameWithPath.GetAt(len - 1) != BaseHandler::zm_cDirectorySeperator)
	{
	    fileNameWithPath += BaseHandler::zm_pszDirectorySeperator;
	}
	HX_RELEASE(pBuffer);
    }
#endif

    fileNameWithPath += (char*) m_pFileName->GetBuffer();

    // 1st load the DLL into memory
    HX_PRIME_ACCUMULATOR( 'pdll', "Total DLL Load Time" );
    int dllLoadResult = m_pDLLAccess->open(fileNameWithPath);
    HX_UPDATE_ACCUMULATOR( 'pdll' );

    if( dllLoadResult != DLLAccess::DLL_OK )
    {
	m_pBaseHandler->ReportError( HXLOG_DEBUG, (char *) m_pFileName->GetBuffer(), m_pDLLAccess->getErrorString() );
	return CANT_OPEN_DLL;
    }

    HX_LOG_CHECKPOINT( "DLL Loaded" );

    // Now look for the HXCreateInstance exported function
    m_fpCreateInstance = (FPCREATEINSTANCE) m_pDLLAccess->getSymbol(HXCREATEINSTANCESTR);
    if (NULL == m_fpCreateInstance)
    {
	m_pBaseHandler->ReportError( HXLOG_DEBUG, "NO HXCreateInstance", NULL );
	return NO_HX_CREATE_INSTANCE;
    }

    // And look for HXShutdown exported function... not required.
    m_fpShutdown    = (FPSHUTDOWN) m_pDLLAccess->getSymbol(HXSHUTDOWNSTR);

    // and look for CanUnload2 exported function
    //JE 3/26/01: look for CanUnload2 instead of CanUnload. This way we will
    //not try and unload any DLLs that may have incorrectly implemented the old
    // CanUnload. If you implement CanUnload2, you better get it right ;)
    m_fCanUnload    = (FPSHUTDOWN) m_pDLLAccess->getSymbol("CanUnload2");

    HX_LOG_CHECKPOINT( "Exported symbols found" );

    // Does this thing support the IHXPlugin Interface
    // Now we will test to see if the DLL contains multiple Plugins.
    HX_PRIME_ACCUMULATOR( 'plmk', "Total Plugin Allocation time" );
    HX_RESULT createResult = m_fpCreateInstance( &pInstance );
    HX_UPDATE_ACCUMULATOR( 'plmk' );

    if( HXR_OK != createResult )
    {
	m_pBaseHandler->ReportError( HXLOG_DEBUG, "HXCreateInstance Failure", NULL );
	result = CREATE_INSTANCHXR_FAILURE;
	goto cleanup;
    }


    HX_LOG_CHECKPOINT( "Plugin instance created" );

    // To be a valid plugin a DLL must support IHXPlugin
    // In addition, it may support IHXPluginFactory
    if( SUCCEEDED( pInstance->QueryInterface( IID_IHXPluginFactory, (void**) &pIFactory ) ) )
    {
	m_bHas_factory = TRUE;
	m_NumOfPlugins = pIFactory->GetNumPlugins();

	HX_RELEASE( pIFactory );
    }
    else if( SUCCEEDED( pInstance->QueryInterface( IID_IHXPlugin, (void**) &pPlugin ) ) )
    {
	m_bHas_factory = FALSE;
	m_NumOfPlugins = 1;

	IHXComponentPlugin* pIPackage = NULL;
	if (SUCCEEDED (pInstance->QueryInterface (IID_IHXComponentPlugin, (void**) &pIPackage)))
	{
#ifndef _WINDOWS // XXXHP TEMPORARY - viper team has requested that this shouldn't assert for now on windows.
	    HX_ASSERT (m_fpShutdown);
#endif
	    pPlugin->InitPlugin (pContext);
	    m_packageName = pIPackage->GetPackageName ();
	    HX_RELEASE (pIPackage);
	}

	HX_RELEASE( pPlugin );
    }
    else
    {
	result = BAD_PLUGIN;
	goto cleanup;
    }

    // We are now loaded.
    HX_RELEASE(pInstance);
    m_bLoaded = TRUE;

cleanup:

    HX_LOG_CHECKPOINT( "BaseHandler::PluginDLL::Load() exiting" );

    return result;
}


HX_RESULT BaseHandler::PluginDLL::Unload(BOOL safe)
{
    if (m_bLoaded)
    {
	if (!safe || ( m_fCanUnload && m_fCanUnload()==HXR_OK ) )
	{
	    if (m_fpShutdown)
	    {
		if (FAILED (m_fpShutdown ())) return HXR_FAIL;
		m_fpShutdown = NULL;
	    }

            if (DLLAccess::DLL_OK == m_pDLLAccess->close())
	    {
		m_bLoaded = FALSE;
		return HXR_OK;
	    }
	}
    }
    return HXR_FAIL;
}

BOOL BaseHandler::PluginDLL::IsLoaded()
{
    return m_bLoaded;
}

BaseHandler::Errors	BaseHandler::PluginDLL::CreateInstance(IUnknown** ppUnk,
								 UINT32 uIndex)
{
    if (!m_bLoaded)
	return PLUGIN_NOT_FOUND;

    if (!m_bHas_factory)
    {
	if (HXR_OK != m_fpCreateInstance(ppUnk))
	{
	    return CREATE_INSTANCHXR_FAILURE;
	}
    }
    else
    {
	if (uIndex > (ULONG32)(m_NumOfPlugins-1) && m_NumOfPlugins)
	{
	    return CANT_LOAD_INTERFACE;
	}
	IUnknown*		pUnk;
	IHXPluginFactory*	pPluginFactory;

	m_fpCreateInstance(&pUnk);
	if (HXR_OK != pUnk->QueryInterface
	(IID_IHXPluginFactory, (void**) &pPluginFactory))
	{
	    HX_RELEASE(pUnk);
	    return CREATE_INSTANCHXR_FAILURE;
	}
	else
	{
	    HX_RELEASE(pUnk);
	    if (HXR_OK != pPluginFactory->GetPlugin((UINT16)uIndex, ppUnk))
	    {
		HX_RELEASE(pPluginFactory);
		return CREATE_INSTANCHXR_FAILURE;
	    }
	    HX_RELEASE(pPluginFactory);
	}
    }
    //m_pPlugin2Handler->AddtoLRU(this);
    //m_pPlugin2Handler->UpdateCache();
    return NO_ERRORS;
}

IHXBuffer* BaseHandler::PluginDLL::GetFileName()
{
    m_pFileName->AddRef();
    return m_pFileName;
}

IHXBuffer* BaseHandler::PluginDLL::GetNamespace()
{
    if (m_pNamespace)
    {
	m_pNamespace->AddRef();
    }

    return m_pNamespace;
}

void BaseHandler::PluginDLL::SetNamespace(IHXBuffer* pNamespace)
{
    m_pNamespace = pNamespace;

    if (m_pNamespace)
    {
	m_pNamespace->AddRef();
    }
}

UINT32 BaseHandler::PluginDLL::AddDLLReference()
{
    return ++m_nActiveReferences;
}


UINT32 BaseHandler::PluginDLL::ReleaseDLLReference()
{
    --m_nActiveReferences;
    Unload();	    //XXXAH this should only happen if we have set DLL unloading to true.

    return 0;
}


/////////////////////////////////////////////////////////////////////////
//  Method:
//      BaseHandler::PluginDLL::QueryInterface
//  Purpose:
//      Implement this to export the interfaces supported by your
//      object.
//
STDMETHODIMP
BaseHandler::PluginDLL::QueryInterface(REFIID riid, void** ppvObj)
{
    if (IsEqualIID(riid, IID_IUnknown))
    {
        AddRef();
        *ppvObj = (IUnknown*)this;
        return HXR_OK;
    }

    *ppvObj = NULL;
    return HXR_NOINTERFACE;
}

/////////////////////////////////////////////////////////////////////////
//  Method:
//      BaseHandler::PluginDLL::AddRef
//  Purpose:
//      Everyone usually implements this the same... feel free to use
//      this implementation.
//
STDMETHODIMP_(ULONG32)
BaseHandler::PluginDLL::AddRef()
{
    return InterlockedIncrement(&m_lRefCount);
}

/////////////////////////////////////////////////////////////////////////
//  Method:
//      BaseHandler::PluginDLL::Release
//  Purpose:
//      Everyone usually implements this the same... feel free to use
//      this implementation.
//
STDMETHODIMP_(ULONG32)
BaseHandler::PluginDLL::Release()
{
    if (InterlockedDecrement(&m_lRefCount) > 0)
    {
        return m_lRefCount;
    }

    delete this;
    return 0;
}


/**********************************************************************************
***		    BaseHandler::PluginMountPoint				***
***********************************************************************************/

BaseHandler::PluginMountPoint::PluginMountPoint( BaseHandler* pContext, const char* pName,
						 UINT32 majorVersion, UINT32 minorVersion, IHXBuffer* pPath ) :
    m_lRefCount( 0 )
{
#if !defined(_STATICALLY_LINKED) || defined(HELIX_CONFIG_CONSOLIDATED_CORE)
    m_pPath = pPath;
    if (m_pPath)
    {
	m_pPath->AddRef();
    }
#endif
}


#if !defined(_STATICALLY_LINKED) || defined(HELIX_CONFIG_CONSOLIDATED_CORE)
IHXBuffer*
BaseHandler::PluginMountPoint::Path()
{
    if (m_pPath)
    {
	m_pPath->AddRef();
    }
    return m_pPath;
}
#endif

BaseHandler::PluginMountPoint::~PluginMountPoint()
{
#if !defined(_STATICALLY_LINKED) || defined(HELIX_CONFIG_CONSOLIDATED_CORE)
    HX_RELEASE(m_pPath);
#endif
}


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


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

    delete this;
    return 0;
}

///////////////////////////////////////////////////////////////////////////////
//
// BaseHandler::CheckDirectory
//
///////////////////////////////////////////////////////////////////////////////

BaseHandler::Errors BaseHandler::Stat(const char* pszFilename, struct stat* pStatBuffer)
{
    CHXString	strFileName;

    memset(pStatBuffer,0,sizeof(*pStatBuffer));
#if !defined(_STATICALLY_LINKED)
    if(stat(pszFilename, pStatBuffer) < 0)
	return CANT_OPEN_DLL;
#endif
    pStatBuffer->st_atime = 0;
    return NO_ERRORS ;
}


IHXBuffer* BaseHandler::ConvertToAsciiString(char* pBuffer, UINT32 nBuffLen)
{
    char* pszOut = new char[nBuffLen*2+1];
    char* pszStartOut = pszOut;
    char Nibble;

    IHXBuffer* pOutBuffer = new CHXBuffer(); // This is the ONLY place where this is done!
    pOutBuffer->AddRef();

    for (int i = 0; i<(int)nBuffLen; i++)
    {
	Nibble = (*pBuffer >> 4) & 15;
	*pszOut= (Nibble > 9 ) ? Nibble+55 : Nibble +48;
	pszOut++;
	Nibble = *pBuffer & 15;
	*pszOut= (Nibble> 9 ) ? Nibble+ 55 : Nibble+48;
	pszOut++;
	pBuffer++;
    }
    *pszOut = 0;
    pOutBuffer->Set((UCHAR*)pszStartOut, strlen(pszStartOut)+1);
    delete[] pszStartOut;
    return pOutBuffer;
}


IHXBuffer* BaseHandler::ChecksumFile(char* pszFileName, IHXBuffer* pPathBuffer)
{
    return ConvertToAsciiString("abc", 3);
}

/********************************************************************
*
*	Plugin Enumeration
*
********************************************************************/

BEGIN_INTERFACE_LIST_NOCREATE( CPluginEnumerator )
    INTERFACE_LIST_ENTRY_SIMPLE( IHXPluginSearchEnumerator )
END_INTERFACE_LIST

CPluginEnumerator::CPluginEnumerator() :
    m_nIndex(0)
{
}

CPluginEnumerator::~CPluginEnumerator()
{
}


STDMETHODIMP_( UINT32 )
CPluginEnumerator::GetNumPlugins()
{
    return m_ListOfPlugins.GetCount();
}

STDMETHODIMP_( void )
CPluginEnumerator::GoHead()
{
    m_nIndex = 0;
}


STDMETHODIMP
CPluginEnumerator::GetNextPlugin( REF(IUnknown*) pIUnkResult, IUnknown* pIUnkOuter )
{
    // Initialize out params
    pIUnkResult = NULL;

    HX_RESULT res = GetPluginAt( m_nIndex, pIUnkResult, pIUnkOuter );
    m_nIndex++;

    return res;
}

STDMETHODIMP
CPluginEnumerator::GetNextPluginInfo( REF(IHXValues*) pRetValues )
{
    // Initialize out params
    pRetValues = NULL;

    HX_RESULT res = GetPluginInfoAt( m_nIndex, pRetValues );
    m_nIndex++;

    return res;
}


STDMETHODIMP
CPluginEnumerator::GetPluginAt( UINT32 index, REF(IUnknown*) pIUnkResult, IUnknown* pIUnkOuter )
{
    // Initialize out params
    pIUnkResult = NULL;

    HX_RESULT res = HXR_FAIL;

    LISTPOSITION pos = m_ListOfPlugins.FindIndex(index);
    if (pos)
    {
	BaseHandler::Plugin* pPlugin = (BaseHandler::Plugin*) m_ListOfPlugins.GetAt(pos);
	if (pPlugin)
	{
	    if (BaseHandler::NO_ERRORS == pPlugin->GetInstance( pIUnkResult, pIUnkOuter ))
	    {
		res = HXR_OK;
	    }
	}
    }
    return res;
}


STDMETHODIMP
CPluginEnumerator::GetPluginInfoAt( UINT32 index, REF(IHXValues*) pRetValues )
{
    // Initialize out params
    pRetValues = NULL;

    HX_RE

⌨️ 快捷键说明

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