HRESULT WebKitCreateInstance(REFCLSID rclsid, IUnknown* pUnkOuter, REFIID riid, void** ppvObject) { COMPtr<IClassFactory> factory = classFactory(rclsid); if (!factory) return REGDB_E_CLASSNOTREG; return factory->CreateInstance(pUnkOuter, riid, ppvObject); }
/** Copied from QgsVectorLayer::setDataProvider * TODO: Make it work in the generic environment * * TODO: Is this class really the best place to put a data provider loader? * It seems more sensible to provide the code in one place rather than * in qgsrasterlayer, qgsvectorlayer, serversourceselect, etc. */ QgsDataProvider *QgsProviderRegistry::provider( QString const & providerKey, QString const & dataSource ) { // XXX should I check for and possibly delete any pre-existing providers? // XXX How often will that scenario occur? // load the plugin QString lib = library( providerKey ); #ifdef TESTPROVIDERLIB const char *cLib = lib.toUtf8(); // test code to help debug provider loading problems // void *handle = dlopen(cLib, RTLD_LAZY); void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL ); if ( !handle ) { QgsLogger::warning( "Error in dlopen" ); } else { QgsDebugMsg( "dlopen suceeded" ); dlclose( handle ); } #endif // load the data provider QLibrary myLib( lib ); QgsDebugMsg( "Library name is " + myLib.fileName() ); if ( !myLib.load() ) { QgsMessageLog::logMessage( QObject::tr( "Failed to load %1: %2" ).arg( lib ).arg( myLib.errorString() ) ); return 0; } classFactoryFunction_t *classFactory = ( classFactoryFunction_t * ) cast_to_fptr( myLib.resolve( "classFactory" ) ); if ( !classFactory ) { QgsDebugMsg( QString( "Failed to load %1: no classFactory method" ).arg( lib ) ); return 0; } QgsDataProvider *dataProvider = classFactory( &dataSource ); if ( !dataProvider ) { QgsMessageLog::logMessage( QObject::tr( "Unable to instantiate the data provider plugin %1" ).arg( lib ) ); myLib.unload(); return 0; } QgsDebugMsg( QString( "Instantiated the data provider plugin: %1" ).arg( dataProvider->name() ) ); return dataProvider; } // QgsProviderRegistry::setDataProvider
QgsAuthMethod *QgsAuthMethodRegistry::authMethod( const QString &authMethodKey ) { // load the plugin QString lib = library( authMethodKey ); #ifdef TESTAUTHMETHODLIB const char *cLib = lib.toUtf8(); // test code to help debug auth method plugin loading problems // void *handle = dlopen(cLib, RTLD_LAZY); void *handle = dlopen( cOgrLib, RTLD_LAZY | RTLD_GLOBAL ); if ( !handle ) { QgsLogger::warning( "Error in dlopen" ); } else { QgsDebugMsg( "dlopen suceeded" ); dlclose( handle ); } #endif // load the auth method QLibrary myLib( lib ); QgsDebugMsg( "Auth method library name is " + myLib.fileName() ); if ( !myLib.load() ) { QgsMessageLog::logMessage( QObject::tr( "Failed to load %1: %2" ).arg( lib, myLib.errorString() ) ); return 0; } classFactoryFunction_t *classFactory = ( classFactoryFunction_t * ) cast_to_fptr( myLib.resolve( "classFactory" ) ); if ( !classFactory ) { QgsDebugMsg( QString( "Failed to load %1: no classFactory method" ).arg( lib ) ); return 0; } QgsAuthMethod *authMethod = classFactory(); if ( !authMethod ) { QgsMessageLog::logMessage( QObject::tr( "Unable to instantiate the auth method plugin %1" ).arg( lib ) ); myLib.unload(); return 0; } QgsDebugMsg( QString( "Instantiated the auth method plugin: %1" ).arg( authMethod->key() ) ); return authMethod; }
//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ static Zen::Engine::Client::I_GameClientFactory::pGameClient_type getGameClient(const std::string& _name) { // First, load the plugin. Zen::Plugins::I_PluginManager::getSingleton().installPlugin(_name); Zen::Plugins::I_ExtensionRegistry& extensionRegistry = Zen::Plugins::I_ExtensionRegistry::getSingleton(); const Zen::Plugins::I_ExtensionRegistry::pExtensionQuery_type pQuery = extensionRegistry.createQuery(); pQuery->setNamespace("Zen::Engine::Client"); pQuery->setExtensionPoint("GameClient"); pQuery->setType(_name); // Get the extensions // Note that the result set takes ownership of pQuery Zen::Plugins::I_ExtensionRegistry::extension_result_set_ptr_type pExtensions = extensionRegistry.findExtensions(pQuery); // Grab the first extension; if there are more installed then eventually we can // deal with that but for now just grab one. Zen::Plugins::I_ExtensionRegistry::extension_result_set_type::iterator pExtensionIter = pExtensions->begin(); if (pExtensionIter != pExtensions->end()) { Zen::Plugins::I_ExtensionRegistry::class_factory_ref_type classFactory(extensionRegistry.getClassFactory(*pExtensionIter)); Zen::Engine::Client::I_GameClientFactory* pFactory(dynamic_cast<Zen::Engine::Client::I_GameClientFactory*>(&classFactory)); Zen::Engine::Client::I_GameClientFactory::config_type config; Zen::Engine::Client::I_GameClientFactory::pGameClient_type pGameClient = pFactory->create(_name, NULL, config); pGameClient->setSelfReference(pGameClient.getWeak()); return pGameClient; } else { // TODO Throw an exception / Log an error std::cout << "getGameClient(): Error finding game client " << _name << std::endl; } // TODO Throw an exception throw Zen::Utility::runtime_exception("Error"); }