📄 hxplugin.cpp
字号:
HX_RELEASE( pCLSID );
}
else
{
// component plugins must have CLSID
HX_ASSERT(false);
}
HX_RELEASE( pComponentPlugin );
HX_RELEASE( pUnkPlugin );
}
else
{
if( !pIUnkOuter )
{
pUnknown = pUnkPlugin;
pUnknown->AddRef();
hr = HXR_OK;
}
else
{
// we can't aggregate anything because this is not a component plugin
HX_ASSERT(false);
}
HX_RELEASE( pUnkPlugin );
}
}
return hr;
}
HX_RESULT HXPlugin::GetPluginInfo(IHXValues*& pVals)
{
if (m_pValues)
{
pVals = m_pValues;
pVals->AddRef();
return HXR_OK;
}
pVals = NULL;
return HXR_FAIL;
}
HX_RESULT
HXPlugin::GetBasicValues(IHXPlugin* pHXPlugin)
{
DPRINTF(D_INFO, ("HXPlugin()::GetBasicValues(): returning nothing\n"));
return HXR_OK;
#if(0)
const char* pszDescription = NULL;
const char* pszCopyright = NULL;
const char* pszMoreInfoUrl = NULL;
ULONG32 ulVersionNumber = 0;
BOOL nload_multiple = 0;
if (HXR_OK != pHXPlugin->GetPluginInfo(nload_multiple, pszDescription,
pszCopyright, pszMoreInfoUrl, ulVersionNumber))
{
return HXR_FAIL;
}
IHXBuffer* pBuffer = NULL;
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pBuffer);
if (pszDescription)
{
pBuffer->Set((UCHAR*)pszDescription, strlen(pszDescription)+1);
}
m_pValues->SetPropertyCString(PLUGIN_DESCRIPTION2, pBuffer);
pBuffer->Release();
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pBuffer);
if (pszCopyright)
{
pBuffer->Set((UCHAR*)pszCopyright, strlen(pszCopyright)+1);
}
m_pValues->SetPropertyCString(PLUGIN_COPYRIGHT2, pBuffer);
pBuffer->Release();
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pBuffer);
if (pszMoreInfoUrl)
{
pBuffer->Set((UCHAR*)pszMoreInfoUrl, strlen(pszMoreInfoUrl)+1);
}
m_pValues->SetPropertyCString(PLUGIN_COPYRIGHT, pBuffer);
pBuffer->Release();
m_pValues->SetPropertyULONG32(PLUGIN_LOADMULTIPLE, nload_multiple);
m_pValues->SetPropertyULONG32(PLUGIN_VERSION, ulVersionNumber);
return HXR_OK;
#endif
}
HX_RESULT
HXPlugin::GetExtendedValues(IHXPlugin* pHXPlugin)
{
IHXFileFormatObject* pFileFormat = NULL;
IHXFileWriter* pFileWriter = NULL;
IHXFileSystemObject* pFileSystem = NULL;
IHXRenderer* pRenderer = NULL;
IHXDataRevert* pDataRevert = NULL;
IHXStreamDescription* pStreamDescription = NULL;
IHXCommonClassFactory* pClassFactory = NULL;
IHXPluginProperties* pIHXPluginPropertiesThis = NULL;
UINT32 nCountInterfaces = 0;
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues():\n"));
// file system
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXFileSystemObject, (void**) &pFileSystem))
{
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): file system object...\n"));
const char* pszShortName;
const char* pszProtocol;
if (HXR_OK != pFileSystem->GetFileSystemInfo(pszShortName, pszProtocol))
{
HX_RELEASE (pFileSystem);
return HXR_FAIL;
}
SetPluginProperty(PLUGIN_FILESYSTEM_TYPE);
IHXBuffer* pBuffer = NULL;
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pBuffer);
if (pszShortName)
{
pBuffer->Set((UCHAR*)pszShortName, strlen(pszShortName)+1);
}
m_pValues->SetPropertyCString(PLUGIN_FILESYSTEMSHORT, pBuffer);
pBuffer->Release();
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pBuffer);
if (pszProtocol)
{
pBuffer->Set((UCHAR*)pszProtocol, strlen(pszProtocol)+1);
}
m_pValues->SetPropertyCString(PLUGIN_FILESYSTEMPROTOCOL, pBuffer);
pBuffer->Release();
pFileSystem->Release();
nCountInterfaces++;
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): fs proto = '%s'\n", pszProtocol));
}
// file format
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXFileFormatObject, (void**)&pFileFormat) ||
HXR_OK == pHXPlugin->QueryInterface(IID_IHXMetaFileFormatObject, (void**)&pFileFormat) ||
HXR_OK == pHXPlugin->QueryInterface(IID_IHXFileWriter, (void**)&pFileWriter))
{
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): file format...\n"));
// fine we are in now we will get the correct type.
if (pFileFormat)
{
pFileFormat->Release();
}
else
{
pFileWriter->Release();
}
IHXMetaFileFormatObject* pMetaFileFormat;
const char** ppszMimeTypes = NULL;
const char** ppszExtensions = NULL;
const char** ppszOpenNames = NULL;
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXFileFormatObject, (void**)&pFileFormat))
{
pFileFormat->GetFileFormatInfo( ppszMimeTypes,
ppszExtensions,
ppszOpenNames);
pFileFormat->Release();
SetPluginProperty(PLUGIN_FILEFORMAT_TYPE);
}
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXMetaFileFormatObject, (void**)&pMetaFileFormat))
{
pMetaFileFormat->GetMetaFileFormatInfo( ppszMimeTypes,
ppszExtensions,
ppszOpenNames);
pMetaFileFormat->Release();
SetPluginProperty(PLUGIN_METAFILEFORMAT_TYPE);
}
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXFileWriter, (void**)&pFileWriter))
{
pFileWriter->GetFileFormatInfo( ppszMimeTypes,
ppszExtensions,
ppszOpenNames);
pFileWriter->Release();
SetPluginProperty(PLUGIN_FILEWRITER_TYPE);
}
IHXBuffer* pBuffer = NULL;
if (ppszMimeTypes)
{
CatStrings((char**)ppszMimeTypes, pBuffer); //XXXAH this had better be const in reality!
m_pValues->SetPropertyCString(PLUGIN_FILEMIMETYPES, pBuffer);
pBuffer->Release();
}
if (ppszExtensions)
{
CatStrings((char**)ppszExtensions, pBuffer); //XXXAH this had better be const in reality!
m_pValues->SetPropertyCString(PLUGIN_FILEEXTENSIONS, pBuffer);
pBuffer->Release();
}
if (ppszOpenNames)
{
CatStrings((char**)ppszOpenNames, pBuffer); //XXXAH this had better be const in reality!
m_pValues->SetPropertyCString(PLUGIN_FILEOPENNAMES, pBuffer);
pBuffer->Release();
}
nCountInterfaces++;
}
// renderer
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXRenderer, (void**)&pRenderer))
{
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): renderer...\n"));
char** ppszMimeTypes;
UINT32 initial_granularity = 0;
// get the basic info
if (HXR_OK == pRenderer->GetRendererInfo((const char**&)ppszMimeTypes, initial_granularity))
{
IHXBuffer* pBuffer;
if (ppszMimeTypes)
{
CatStrings(ppszMimeTypes, pBuffer);
}
m_pValues->SetPropertyCString(PLUGIN_RENDERER_MIME, pBuffer);
pBuffer->Release();
m_pValues->SetPropertyULONG32(PLUGIN_RENDERER_GRANULARITY, initial_granularity);
SetPluginProperty(PLUGIN_RENDERER_TYPE);
}
HX_RELEASE(pRenderer);
nCountInterfaces++;
}
// stream description
if (HXR_OK == pHXPlugin->QueryInterface(IID_IHXStreamDescription, (void**)&pStreamDescription))
{
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): stream description...\n"));
const char* pszMimeType;
IHXBuffer* pBuffer;
if (HXR_OK != pStreamDescription->GetStreamDescriptionInfo(pszMimeType))
{
HX_RELEASE (pStreamDescription);
return HXR_FAIL;
}
pStreamDescription->Release();
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pBuffer);
if (pszMimeType)
{
pBuffer->Set((UCHAR*)pszMimeType, strlen(pszMimeType)+1);
}
m_pValues->SetPropertyCString(PLUGIN_STREAMDESCRIPTION, pBuffer);
pBuffer->Release();
SetPluginProperty(PLUGIN_STREAM_DESC_TYPE);
nCountInterfaces++;
}
// common class factory
if(HXR_OK == pHXPlugin->QueryInterface(IID_IHXCommonClassFactory,
(void**)&pClassFactory))
{
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): class factory plugin...\n"));
SetPluginProperty(PLUGIN_CLASS_FACTORY_TYPE);
HX_RELEASE (pClassFactory);
nCountInterfaces++;
}
if( SUCCEEDED( pHXPlugin->QueryInterface( IID_IHXPluginProperties, (void**)&pIHXPluginPropertiesThis ) ) )
{
DPRINTF(D_INFO, ("HXPlugin()::GetExtendedValues(): plugin properties interface...\n"));
IHXValues* pIHXValuesProperties = NULL;
pHXPlugin->InitPlugin(m_pContext);
if( SUCCEEDED( pIHXPluginPropertiesThis->GetProperties( pIHXValuesProperties ) ) && pIHXValuesProperties )
{
CHXHeader::mergeHeaders( m_pValues, pIHXValuesProperties );
}
HX_RELEASE(pIHXValuesProperties);
}
HX_RELEASE(pIHXPluginPropertiesThis);
HX_ASSERT(nCountInterfaces<2);
return HXR_OK;
}
HX_RESULT HXPlugin::AddComponentInfo( IHXValues* pVal )
{
CHXHeader::mergeHeaders(m_pValues, pVal);
return HXR_OK; // no way to know if above succeeded or not
}
HX_RESULT HXPlugin::CatStrings(char** pInStrings,
IHXBuffer*& pOutBuffer)
{
ULONG32 nAllocedSpace = 100;
char* ptemp = new char[nAllocedSpace];
char* ptemp2 = NULL;
ULONG32 nStrLen = 0;
ULONG32 nNewStrLen = 0;
*ptemp = 0;
pOutBuffer = 0;
for(; *pInStrings; pInStrings++)
{
nNewStrLen = strlen(*pInStrings);
if (nNewStrLen+ nStrLen >= nAllocedSpace)
{
// double if the new string is less than the new space
// or add double what it required.
if (nNewStrLen< nAllocedSpace)
{
nAllocedSpace*=2;
}
else
{
nAllocedSpace+=nNewStrLen*2;
}
ptemp2 = new char[nAllocedSpace];
memcpy(ptemp2, ptemp, nStrLen+1); /* Flawfinder: ignore */
delete [] ptemp;
ptemp = ptemp2;
}
// XXXAH I must trim the strings before I add them to this string.
// the find function DEPENDS UPON THIS.
SafeStrCat(ptemp, *pInStrings, nAllocedSpace);
if (*(pInStrings+1))
{
SafeStrCat(ptemp, k_pszValueSeperator, nAllocedSpace); // XXXAH Perhaps a define?
}
nStrLen+=nNewStrLen+1;
}
m_pClassFactory->CreateInstance(CLSID_IHXBuffer,(void**)&pOutBuffer);
pOutBuffer->Set((UCHAR*)ptemp, strlen(ptemp)+1);
delete[] ptemp;
return HXR_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -