Listing 6
// Plugin.cxx
#include "Plugin.h"
PluginManager* PluginManager::ms_instance = 0;
PluginManager& PluginManager::instance()
{
if (! ms_instance)
ms_instance = new PluginManager();
return *ms_instance;
}
Plugin& PluginManager::findPlugin(const char* name)
throw (SharedLibraryException)
{
if (m_plugin_map.count(name) > 0)
return *(m_plugin_map[name])->m_plugin;
const char* libname = PluginNameMap::instance().translate(name);
if (libname == 0)
throw SharedLibraryException("Cannot translate libname");
PluginInfo* pi = new PluginInfo;
pi->m_library = SharedLibrary::openSharedLibrary(libname);
plugin_init_func pif =
findSymbol<plugin_init_func>(*pi->m_library,"plugin_init");
pi->m_plugin = (*pif)();
if (!pi->m_plugin)
{
delete pi;
throw SharedLibraryException("plugin_init error");
}
m_plugin_map[name]=pi;
return *(pi->m_plugin);
}