KLibFactory* KLibLoader::factory( const char* name ) { KLibrary* lib = library( name ); if ( !lib ) return 0; return lib->factory(); }
const TDEInstance *Factory::partInstanceFromLibrary( const TQCString &libraryName ) { KLibrary *library = KLibLoader::self()->library( libraryName ); if ( !library ) return 0; KLibFactory *factory = library->factory(); if ( !factory ) return 0; KParts::Factory *pfactory = tqt_dynamic_cast<KParts::Factory *>( factory ); if ( !pfactory ) return 0; return pfactory->partInstance(); }
Plugin * PluginLoader::loadPlugin(const QString &name) { KLibrary *lib = NULL; KLibFactory *factory = NULL; Plugin *plugin = NULL; PluginMap::iterator it; bool success = true; // if the plugin has already been loaded, increment // its reference and return. if((it = _plugins.find(name)) != _plugins.end()) { plugin = it.data(); plugin->ref(); return plugin; } // use KLibLoader to get a reference to the library lib = KLibLoader::self()->library(name.latin1()); if(!lib) { kdError() << "failed loading plugin library " << name << endl; success = false; } // get the factory from the library if(success) { factory = lib->factory(); if(!factory) { kdError() << "failed to find factory for " << name << endl; success = false; } } // use the factory to create the plugin if(success) { plugin = dynamic_cast<Plugin *>(factory->create((QObject*)0, name.latin1())); if(!plugin) { kdError() << "failed to create a plugin object for " << name << endl; success = false; } else { // we have to register the plugin here, otherwise, we can get // recursive loads _plugins[name] = plugin; _categories[plugin->category()].append(plugin); } } // initialize the plugin if(success && plugin) { success = plugin->init(); if(!success) { // on failure, delete the plugin. this should cause the // library to unload. kdError() << "failure initializing " << name << endl; _categories[plugin->category()].remove(plugin); _plugins.remove(name); delete plugin; } } // finally, finally connect to the destroyed signal and keep a // reference to it if(success) { plugin->ref(); connect(plugin, SIGNAL(destroyed(QObject *)), SLOT(slotDestroyed(QObject *))); } return plugin; }