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); }