void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id) { if (id) { *id = 0; } if (!iface) { return NULL; } //first check ours... we get first chance! if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) { if (_ret) { *_ret = META_IFACE_OK; } return static_cast<void *>(static_cast<SourceHook::ISourceHook *>(&g_SourceHook)); } else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) { if (_ret) { *_ret = META_IFACE_OK; } return static_cast<void *>(static_cast<ISmmPluginManager *>(&g_PluginMngr)); } CPluginManager::CPlugin *pl; SourceHook::List<CPluginEventHandler>::iterator event; IMetamodListener *api; int ret = 0; void *val = NULL; for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { pl = (*iter); for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { api = (*event).event; ret = META_IFACE_FAILED; if ( (val=api->OnMetamodQuery(iface, &ret)) != NULL ) { if (_ret) *_ret = ret; if (id) *id = pl->m_Id; return val; } } } if (_ret) *_ret = META_IFACE_FAILED; return NULL; }
void *MetamodSource::MetaFactory(const char *iface, int *ret, PluginId *id) { if (id) { *id = 0; } if (!iface) { return NULL; } /* First check ours... we get first chance! */ if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) { if (ret) { *ret = META_IFACE_OK; } return static_cast<void *>(static_cast<SourceHook::ISourceHook *>(&g_SourceHook)); } else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) { if (ret) { *ret = META_IFACE_OK; } return static_cast<void *>(static_cast<ISmmPluginManager *>(&g_PluginMngr)); } else if (strcmp(iface, MMIFACE_SH_HOOKMANAUTOGEN) == 0) { #if defined( _WIN64 ) || defined( __amd64__ ) if (ret) { *ret = META_IFACE_FAILED; } return nullptr; #else if (ret) { *ret = META_IFACE_OK; } return static_cast<void *>(static_cast<SourceHook::IHookManagerAutoGen *>(&g_SH_HookManagerAutoGen)); #endif } CPluginManager::CPlugin *pl; List<IMetamodListener *>::iterator event; IMetamodListener *api; void *value; int subret = 0; for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { pl = (*iter); for (event = pl->m_Events.begin(); event != pl->m_Events.end(); event++) { api = (*event); subret = META_IFACE_FAILED; if ((value = api->OnMetamodQuery(iface, &subret)) != NULL) { if (ret) { *ret = subret; } if (id) { *id = pl->m_Id; } return value; } } } if (ret) { *ret = META_IFACE_FAILED; } return NULL; }