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

📄 chxmimemanager.cpp

📁 linux下的一款播放器
💻 CPP
字号:
#include "chxmimemanager.h"#include "ihxmimeassocmanager.h"#include "ihxmimeinfo.h"#include "ihxappinfo.h"/* Plugin handler */#include "hxplugn.h"#include "hxphand.h"/* File format info */#include "hxformt.h"#include "hxassert.h"CHXMimeManager::CHXMimeManager(){}CHXMimeManager::~CHXMimeManager(){    Reset();}voidCHXMimeManager::Reset(){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	IHXMimeAssocManager* pMimeMgr = (IHXMimeAssocManager*)*i;	HX_ASSERT(pMimeMgr != NULL);	pMimeMgr->Reload();	HX_RELEASE(pMimeMgr);    }    for (i = m_mapMimeTypes.Begin(); i != m_mapMimeTypes.End(); ++i)    {	IHXFileFormatObject* pFileFormat = (IHXFileFormatObject*)*i;	HX_ASSERT(pFileFormat != NULL);	HX_RELEASE(pFileFormat);    }}voidCHXMimeManager::Commit(){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	IHXMimeAssocManager* pMimeMgr = (IHXMimeAssocManager*)*i;	HX_ASSERT(pMimeMgr != NULL);	pMimeMgr->Commit();    }}voidCHXMimeManager::Reload(){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	IHXMimeAssocManager* pMimeMgr = (IHXMimeAssocManager*)*i;	HX_ASSERT(pMimeMgr != NULL);	pMimeMgr->Reload();    }}HX_RESULTCHXMimeManager::Init(IUnknown* pContext){    HX_RESULT res = HXR_FAIL;    IHXPlugin2Handler* pPlugin2Handler = NULL;    if (pContext)    {	res = pContext->QueryInterface(IID_IHXPlugin2Handler,				       (void**)&pPlugin2Handler);	if (SUCCEEDED(res))	{	    IHXPluginEnumerator* pPluginEnumerator = NULL;	    res = pPlugin2Handler->QueryInterface(IID_IHXPluginEnumerator,						  (void**)&pPluginEnumerator);	    if (SUCCEEDED(res))	    {		UINT32 uCount = pPluginEnumerator->GetNumOfPlugins();		for (UINT32 i = 0; i != uCount; ++i)		{		    IUnknown* pUnk = NULL;		    if (SUCCEEDED(pPluginEnumerator->GetPlugin(i, pUnk)))		    {			// is this one of our mime assoc manager plugins?			IHXMimeAssocManager* pMimeMgr = NULL;			if (SUCCEEDED(pUnk->QueryInterface(					  IID_IHXMimeAssocManager,					  (void**)&pMimeMgr)))			{			    // what's this mime manager's name?			    const char* pName = NULL;			    const char* pDesc = NULL;			    UINT32 uVer = 0;			    HX_VERIFY(SUCCEEDED(pMimeMgr->GetMimeSystemInfo(						    pName, pDesc, uVer)));			    HX_ASSERT(pName);			    // check for dupes, avoid memory leaks			    void* pIgnore;			    if (m_mapMimeMgrs.Lookup(pName, pIgnore))			    {				HX_ASSERT(FALSE);				HX_RELEASE(pMimeMgr);			    }			    else			    {				// store it in our map				pMimeMgr->Init();				m_mapMimeMgrs.SetAt(pName, pMimeMgr);			    }			}			// is this a file format?			IHXFileFormatObject* pFileFormat = NULL;			if (SUCCEEDED(pUnk->QueryInterface(					  IID_IHXFileFormatObject,					  (void**)&pFileFormat)))			{			    const char** ppMimeTypes = NULL;			    const char** ppExtensions = NULL;			    const char** ppOpenNames = NULL;			    HX_VERIFY(SUCCEEDED(pFileFormat->GetFileFormatInfo(						    ppMimeTypes,						    ppExtensions,						    ppOpenNames)));			    while (*ppMimeTypes)			    {				void* pIgnore = NULL;				if (!m_mapMimeTypes.Lookup(*ppMimeTypes,							  pIgnore))				{				    // XXXNH: uncomment this if you want to				    // dump all the mime types we can handle				    // to stdout				    //fprintf(stdout, "%s\n", *ppMimeTypes);				    pFileFormat->AddRef();				    m_mapMimeTypes.SetAt(*ppMimeTypes,							 pFileFormat);				}				    ++ppMimeTypes;			    }			    HX_RELEASE(pFileFormat);			}			HX_RELEASE(pUnk);		    } // for i...		}		HX_RELEASE(pPluginEnumerator);	    }	    HX_RELEASE(pPlugin2Handler);	}    }    return res;}IHXMimeAssocManager*CHXMimeManager::GetMimeAssocManager(const char* pName){    IHXMimeAssocManager* pMimeMgr = NULL;    if (m_mapMimeMgrs.Lookup(pName, (void*&)pMimeMgr))    {	HX_ASSERT(pMimeMgr);	pMimeMgr->AddRef();    }    return pMimeMgr;}IHXFileFormatObject*CHXMimeManager::GetFileFormat(const char* pMimeType){    IHXFileFormatObject* pFileFormat = NULL;    if (m_mapMimeTypes.Lookup(pMimeType, (void*&)pFileFormat))    {	HX_ASSERT(pFileFormat);	pFileFormat->AddRef();    }    return pFileFormat;}voidCHXMimeManager::SetupMimeType(const char*  pMimeType,			      const char** ppExtensions,			      const char** ppOpenNames,			      const char*  pIconPath,			      BOOL bOverride){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	SetupMimeType((IHXMimeAssocManager*)*i, pMimeType, ppExtensions, 		      ppOpenNames, pIconPath, bOverride);    }}voidCHXMimeManager::SetupApp(const char* pAppId,			 const char* pName,			 const char* pCommand,			 BOOL bCanOpenMultiple,			 BOOL bRequiresTerminal){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	SetupApp((IHXMimeAssocManager*)*i, pAppId, pName, pCommand,		 bCanOpenMultiple, bRequiresTerminal);    }}voidCHXMimeManager::SetAssoc(const char* pMime, const char* pApp, BOOL bOverride){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	SetAssoc((IHXMimeAssocManager*)*i, pMime, pApp, bOverride);    }}voidCHXMimeManager::SetupMimeType(IHXMimeAssocManager* pMimeMgr,			      const char*  pMimeType,			      const char** ppExtensions,			      const char** ppOpenNames,			      const char*  pIconPath,			      BOOL bOverride){    HX_ASSERT(pMimeMgr);    IHXMimeInfo* pMimeInfo = NULL;    if (SUCCEEDED(pMimeMgr->GetMime(pMimeType, pMimeInfo)))    {	if (bOverride || !pMimeInfo->GetIcon())	{	    pMimeInfo->SetIcon(pIconPath);	}/* XXXNH: where do we get the name/desc from? */	if (bOverride || !pMimeInfo->GetName())	{	    pMimeInfo->SetName(pMimeType); //pDescription);	}	// make sure we don't add any duplicate extensions	UINT32 uCount = 0;	const char** ppExistingExts = NULL;	pMimeInfo->GetExts(ppExistingExts, uCount);	if (bOverride)	{	    // clear existing extensions	    for (const char** pCursor = ppExistingExts; 		 pCursor != ppExistingExts + uCount; ++pCursor)	    {		pMimeInfo->RemoveExt(*pCursor);	    }	    uCount = 0;	}	// add our extensions	while (*ppExtensions)	{	    BOOL bFound = FALSE;/*	    if (uCount)	    {		for (const char** pCursor = ppExistingExts; 		     !bFound && pCursor != ppExistingExts + uCount; ++pCursor)		{		    if (strcasecmp(*pCursor, *ppExtensions) == 0)		    {			bFound = TRUE;		    }		}		}*/	    if (!bFound)	    {		pMimeInfo->AddExt(*ppExtensions);	    }	    ++ppExtensions;	}	HX_RELEASE(pMimeInfo);    }}voidCHXMimeManager::SetupApp(IHXMimeAssocManager* pMimeMgr,			 const char* pAppId,			 const char* pName,			 const char* pCommand,			 BOOL bCanOpenMultiple,			 BOOL bRequiresTerminal){    HX_ASSERT(pMimeMgr);    IHXAppInfo* pAppInfo = NULL;    if (SUCCEEDED(pMimeMgr->GetApp(pAppId, pAppInfo)))    {	pAppInfo->SetName(pName);	pAppInfo->SetCommand(pCommand);	pAppInfo->SetCanOpenMultiple(bCanOpenMultiple);	pAppInfo->SetRequiresTerminal(bRequiresTerminal);	HX_RELEASE(pAppInfo);	HX_ASSERT(pMimeMgr->AppExists(pAppId));    }}voidCHXMimeManager::SetAssoc(IHXMimeAssocManager* pMimeMgr,			 const char* pMime,			 const char* pApp,			 BOOL bOverride){    HX_ASSERT(pMimeMgr);    HX_ASSERT(pMimeMgr->AppExists(pApp));    HX_ASSERT(pMimeMgr->MimeExists(pMime));    const char* pOldApp = NULL;    if (bOverride || FAILED(pMimeMgr->GetAssoc(pMime, pOldApp)))    {	pMimeMgr->SetAssoc(pMime, pApp);    }}POSITIONCHXMimeManager::GetFirstMimeAssocManager(REF(const char*) pName, 					 REF(IHXMimeAssocManager*) pMimeMgr){    POSITION p = m_mapMimeMgrs.GetStartPosition();    if (!p)    {	pName = NULL;	pMimeMgr = NULL;	return NULL;    }    return GetNextMimeAssocManager(p, pName, pMimeMgr);}POSITIONCHXMimeManager::GetNextMimeAssocManager(POSITION p,					REF(const char*) pName, 					REF(IHXMimeAssocManager*) pMimeMgr){    HX_ASSERT(p);    if (p)    {	m_mapMimeMgrs.GetNextAssoc(p, pName, (void*&)pMimeMgr);	HX_ASSERT(pMimeMgr);	pMimeMgr->AddRef();    }    return p;}POSITIONCHXMimeManager::GetFirstFileFormat(REF(const char*) pMimeType, 				   REF(IHXFileFormatObject*) pFileFormat){    POSITION p = m_mapMimeTypes.GetStartPosition();    return GetNextFileFormat(p, pMimeType, pFileFormat);}POSITIONCHXMimeManager::GetNextFileFormat(POSITION p,				  REF(const char*) pMimeType, 				  REF(IHXFileFormatObject*) pFileFormat){    HX_ASSERT(p);    if (p)    {	m_mapMimeTypes.GetNextAssoc(p, pMimeType, (void*&)pFileFormat);	HX_ASSERT(pFileFormat);	pFileFormat->AddRef();    }    return p;}voidCHXMimeManager::SetupAllFileFormats(const char* pIconPath, BOOL bOverride){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeTypes.Begin(); i != m_mapMimeTypes.End(); ++i)    {	SetupFileFormat((IHXFileFormatObject*)*i, pIconPath, bOverride);    }}voidCHXMimeManager::SetupFileFormat(IHXFileFormatObject* pFileFormat,				const char* pIconPath,				BOOL bOverride){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	SetupFileFormat((IHXMimeAssocManager*)*i, pFileFormat, pIconPath, 			bOverride);    }}voidCHXMimeManager::SetupFileFormat(IHXMimeAssocManager* pMimeMgr,				IHXFileFormatObject* pFileFormat,				const char* pIconPath,				BOOL bOverride){    const char** ppMimeTypes = NULL;    const char** ppExtensions = NULL;    const char** ppOpenNames = NULL;    if (SUCCEEDED(pFileFormat->GetFileFormatInfo(ppMimeTypes,						 ppExtensions,						 ppOpenNames)))    {	while (*ppMimeTypes)	{	    SetupMimeType(pMimeMgr, *ppMimeTypes, ppExtensions, ppOpenNames,			  pIconPath, bOverride);	    ++ppMimeTypes;	}    }}voidCHXMimeManager::SetMatchingAssocs(const char* pMatch,				  const char* pApp,				  BOOL bOverride){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeTypes.Begin(); i != m_mapMimeTypes.End(); ++i)    {	const char* pMimeType = (const char*)i.get_key();	if (strstr(pMimeType, pMatch))	{	    SetAssoc(pMimeType, pApp, bOverride);	}    }}voidCHXMimeManager::SetupProtocol(const char* pMimeType,			      const char* pProtocol,			      const char* pDescription,			      const char* pIconPath){    CHXMapStringToOb::Iterator i;    for (i = m_mapMimeMgrs.Begin(); i != m_mapMimeMgrs.End(); ++i)    {	SetupProtocol((IHXMimeAssocManager*)*i, pMimeType, pProtocol,		      pDescription, pIconPath);    }}voidCHXMimeManager::SetupProtocol(IHXMimeAssocManager* pMimeMgr,			      const char* pMimeType,			      const char* pProtocol,			      const char* pDescription,			      const char* pIconPath){    HX_ASSERT(pMimeMgr);    IHXMimeInfo* pMimeInfo = NULL;    if (SUCCEEDED(pMimeMgr->GetMime(pMimeType, pMimeInfo)))    {	pMimeInfo->SetName(pDescription);	pMimeInfo->SetProtocol(pProtocol);	pMimeInfo->SetIcon(pIconPath);    }}

⌨️ 快捷键说明

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