void QgsProviderRegistry::clean() { QgsProject::instance()->removeAllMapLayers(); Providers::const_iterator it = mProviders.begin(); while ( it != mProviders.end() ) { QgsDebugMsgLevel( QString( "cleanup:%1" ).arg( it->first ), 5 ); QString lib = it->second->library(); if ( !lib.isEmpty() ) { QLibrary myLib( lib ); if ( myLib.isLoaded() ) { cleanupProviderFunction_t *cleanupFunc = reinterpret_cast< cleanupProviderFunction_t * >( cast_to_fptr( myLib.resolve( "cleanupProvider" ) ) ); if ( cleanupFunc ) cleanupFunc(); } } delete it->second; ++it; } mProviders.clear(); }
void MainWindow::wOpenClicked() { QLibrary myLib("..//..//lib//module"); typedef void (*MyPrototype)(QWidget *); MyPrototype myFunction = (MyPrototype) myLib.resolve("RNEXPORT"); if (myFunction) myFunction(this); }
/** 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; }
void *QgsProviderRegistry::function( QString const & providerKey, QString const & functionName ) { QLibrary myLib( library( providerKey ) ); QgsDebugMsg( "Library name is " + myLib.fileName() ); if ( myLib.load() ) { return myLib.resolve( functionName.toAscii().data() ); } else { QgsDebugMsg( "Cannot load library: " + myLib.errorString() ); return 0; } }
QgsProviderRegistry::~QgsProviderRegistry() { Providers::const_iterator it = mProviders.begin(); while ( it != mProviders.end() ) { QString lib = it->second->library(); QLibrary myLib( lib ); if ( myLib.isLoaded() ) { cleanupProviderFunction_t* cleanupFunc = ( cleanupProviderFunction_t* ) cast_to_fptr( myLib.resolve( "cleanupProvider" ) ); if ( cleanupFunc ) cleanupFunc(); } ++it; } }
QFunctionPointer QgsAuthMethodRegistry::function( QString const & authMethodKey, QString const & functionName ) { QLibrary myLib( library( authMethodKey ) ); QgsDebugMsg( "Library name is " + myLib.fileName() ); if ( myLib.load() ) { return myLib.resolve( functionName.toAscii().data() ); } else { QgsDebugMsg( "Cannot load library: " + myLib.errorString() ); return 0; } }
QLibrary *QgsProviderRegistry::createProviderLibrary( QString const &providerKey ) const { QString lib = library( providerKey ); if ( lib.isEmpty() ) return nullptr; std::unique_ptr< QLibrary > myLib( new QLibrary( lib ) ); QgsDebugMsg( "Library name is " + myLib->fileName() ); if ( myLib->load() ) return myLib.release(); QgsDebugMsg( "Cannot load library: " + myLib->errorString() ); return nullptr; }
QgsAuthMethodRegistry::~QgsAuthMethodRegistry() { AuthMethods::const_iterator it = mAuthMethods.begin(); while ( it != mAuthMethods.end() ) { QgsDebugMsg( QString( "cleanup: %1" ).arg( it->first ) ); QString lib = it->second->library(); QLibrary myLib( lib ); if ( myLib.isLoaded() ) { cleanupAuthMethod_t* cleanupFunc = ( cleanupAuthMethod_t* ) cast_to_fptr( myLib.resolve( "cleanupAuthMethod" ) ); if ( cleanupFunc ) cleanupFunc(); } // clear cached QgsAuthMethodMetadata * delete it->second; ++it; } }
QFunctionPointer QgsProviderRegistry::function( QString const &providerKey, QString const &functionName ) { QString lib = library( providerKey ); if ( lib.isEmpty() ) return nullptr; QLibrary myLib( library( providerKey ) ); QgsDebugMsg( "Library name is " + myLib.fileName() ); if ( myLib.load() ) { return myLib.resolve( functionName.toLatin1().data() ); } else { QgsDebugMsg( "Cannot load library: " + myLib.errorString() ); return nullptr; } }
QgsProviderRegistry::~QgsProviderRegistry() { QgsMapLayerRegistry::instance()->removeAllMapLayers(); Providers::const_iterator it = mProviders.begin(); while ( it != mProviders.end() ) { QgsDebugMsg( QString( "cleanup:%1" ).arg( it->first ) ); QString lib = it->second->library(); QLibrary myLib( lib ); if ( myLib.isLoaded() ) { cleanupProviderFunction_t* cleanupFunc = ( cleanupProviderFunction_t* ) cast_to_fptr( myLib.resolve( "cleanupProvider" ) ); if ( cleanupFunc ) cleanupFunc(); } delete it->second; ++it; } }
QgsProviderRegistry::QgsProviderRegistry( QString pluginPath ) { // At startup, examine the libs in the qgis/lib dir and store those that // are a provider shared lib // check all libs in the current plugin directory and get name and descriptions //TODO figure out how to register and identify data source plugin for a specific //TODO layer type #if 0 char **argv = qApp->argv(); QString appDir = argv[0]; int bin = appDir.findRev( "/bin", -1, false ); QString baseDir = appDir.left( bin ); QString mLibraryDirectory = baseDir + "/lib"; #endif mLibraryDirectory = pluginPath; mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase ); mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks ); #if defined(WIN32) || defined(__CYGWIN__) mLibraryDirectory.setNameFilters( QStringList( "*.dll" ) ); #elif ANDROID mLibraryDirectory.setNameFilters( QStringList( "*provider.so" ) ); #else mLibraryDirectory.setNameFilters( QStringList( "*.so" ) ); #endif QgsDebugMsg( QString( "Checking %1 for provider plugins" ).arg( mLibraryDirectory.path() ) ); if ( mLibraryDirectory.count() == 0 ) { QString msg = QObject::tr( "No QGIS data provider plugins found in:\n%1\n" ).arg( mLibraryDirectory.path() ); msg += QObject::tr( "No vector layers can be loaded. Check your QGIS installation" ); QgsMessageOutput* output = QgsMessageOutput::createMessageOutput(); output->setTitle( QObject::tr( "No Data Providers" ) ); output->setMessage( msg, QgsMessageOutput::MessageText ); output->showMessage(); return; } QListIterator<QFileInfo> it( mLibraryDirectory.entryInfoList() ); while ( it.hasNext() ) { QFileInfo fi( it.next() ); QLibrary myLib( fi.filePath() ); if ( !myLib.load() ) { QgsDebugMsg( QString( "Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName() ).arg( myLib.errorString() ) ); continue; } //MH: Added a further test to detect non-provider plugins linked to provider plugins. //Only pure provider plugins have 'type' not defined isprovider_t *hasType = ( isprovider_t * ) cast_to_fptr( myLib.resolve( "type" ) ); if ( hasType ) { QgsDebugMsg( QString( "Checking %1: ...invalid (has type method)" ).arg( myLib.fileName() ) ); continue; } // get the description and the key for the provider plugin isprovider_t *isProvider = ( isprovider_t * ) cast_to_fptr( myLib.resolve( "isProvider" ) ); if ( !isProvider ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no isProvider method)" ).arg( myLib.fileName() ) ); continue; } // check to see if this is a provider plugin if ( !isProvider() ) { QgsDebugMsg( QString( "Checking %1: ...invalid (not a provider)" ).arg( myLib.fileName() ) ); continue; } // looks like a provider. get the key and description description_t *pDesc = ( description_t * ) cast_to_fptr( myLib.resolve( "description" ) ); if ( !pDesc ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no description method)" ).arg( myLib.fileName() ) ); continue; } providerkey_t *pKey = ( providerkey_t * ) cast_to_fptr( myLib.resolve( "providerKey" ) ); if ( !pKey ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no providerKey method)" ).arg( myLib.fileName() ) ); continue; } // add this provider to the provider map mProviders[pKey()] = new QgsProviderMetadata( pKey(), pDesc(), myLib.fileName() ); // load database drivers databaseDrivers_t *pDatabaseDrivers = ( databaseDrivers_t * ) cast_to_fptr( myLib.resolve( "databaseDrivers" ) ); if ( pDatabaseDrivers ) { mDatabaseDrivers = pDatabaseDrivers(); } // load directory drivers directoryDrivers_t *pDirectoryDrivers = ( directoryDrivers_t * ) cast_to_fptr( myLib.resolve( "directoryDrivers" ) ); if ( pDirectoryDrivers ) { mDirectoryDrivers = pDirectoryDrivers(); } // load protocol drivers protocolDrivers_t *pProtocolDrivers = ( protocolDrivers_t * ) cast_to_fptr( myLib.resolve( "protocolDrivers" ) ); if ( pProtocolDrivers ) { mProtocolDrivers = pProtocolDrivers(); } // now get vector file filters, if any fileVectorFilters_t *pFileVectorFilters = ( fileVectorFilters_t * ) cast_to_fptr( myLib.resolve( "fileVectorFilters" ) ); if ( pFileVectorFilters ) { QString fileVectorFilters = pFileVectorFilters(); if ( !fileVectorFilters.isEmpty() ) mVectorFileFilters += fileVectorFilters; QgsDebugMsg( QString( "Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileVectorFilters.split( ";;" ).count() ) ); } // now get raster file filters, if any // this replaces deprecated QgsRasterLayer::buildSupportedRasterFileFilter buildsupportedrasterfilefilter_t *pBuild = ( buildsupportedrasterfilefilter_t * ) cast_to_fptr( myLib.resolve( "buildSupportedRasterFileFilter" ) ); if ( pBuild ) { QString fileRasterFilters; pBuild( fileRasterFilters ); QgsDebugMsg( "raster filters: " + fileRasterFilters ); if ( !fileRasterFilters.isEmpty() ) mRasterFileFilters += fileRasterFilters; QgsDebugMsg( QString( "Checking %1: ...loaded ok (%2 file filters)" ).arg( myLib.fileName() ).arg( fileRasterFilters.split( ";;" ).count() ) ); } } } // QgsProviderRegistry ctor
QgsAuthMethodRegistry::QgsAuthMethodRegistry( const QString& pluginPath ) { // At startup, examine the libs in the qgis/lib dir and store those that // are an auth method shared lib // check all libs in the current plugin directory and get name and descriptions #if 0 char **argv = qApp->argv(); QString appDir = argv[0]; int bin = appDir.findRev( "/bin", -1, false ); QString baseDir = appDir.left( bin ); QString mLibraryDirectory = baseDir + "/lib"; #endif mLibraryDirectory = pluginPath; mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase ); mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks ); #if defined(Q_OS_WIN) || defined(__CYGWIN__) mLibraryDirectory.setNameFilters( QStringList( "*authmethod.dll" ) ); #else mLibraryDirectory.setNameFilters( QStringList( "*authmethod.so" ) ); #endif QgsDebugMsg( QString( "Checking for auth method plugins in: %1" ).arg( mLibraryDirectory.path() ) ); if ( mLibraryDirectory.count() == 0 ) { QString msg = QObject::tr( "No QGIS auth method plugins found in:\n%1\n" ).arg( mLibraryDirectory.path() ); msg += QObject::tr( "No authentication methods can be used. Check your QGIS installation" ); QgsMessageOutput* output = QgsMessageOutput::createMessageOutput(); output->setTitle( QObject::tr( "No Authentication Methods" ) ); output->setMessage( msg, QgsMessageOutput::MessageText ); output->showMessage(); return; } // auth method file regex pattern, only files matching the pattern are loaded if the variable is defined QString filePattern = getenv( "QGIS_AUTHMETHOD_FILE" ); QRegExp fileRegexp; if ( !filePattern.isEmpty() ) { fileRegexp.setPattern( filePattern ); } QListIterator<QFileInfo> it( mLibraryDirectory.entryInfoList() ); while ( it.hasNext() ) { QFileInfo fi( it.next() ); if ( !fileRegexp.isEmpty() ) { if ( fileRegexp.indexIn( fi.fileName() ) == -1 ) { QgsDebugMsg( "auth method " + fi.fileName() + " skipped because doesn't match pattern " + filePattern ); continue; } } QLibrary myLib( fi.filePath() ); if ( !myLib.load() ) { QgsDebugMsg( QString( "Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName(), myLib.errorString() ) ); continue; } // get the description and the key for the auth method plugin isauthmethod_t *isAuthMethod = ( isauthmethod_t * ) cast_to_fptr( myLib.resolve( "isAuthMethod" ) ); if ( !isAuthMethod ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no isAuthMethod method)" ).arg( myLib.fileName() ) ); continue; } // check to see if this is an auth method plugin if ( !isAuthMethod() ) { QgsDebugMsg( QString( "Checking %1: ...invalid (not an auth method)" ).arg( myLib.fileName() ) ); continue; } // looks like an auth method plugin. get the key and description description_t *pDesc = ( description_t * ) cast_to_fptr( myLib.resolve( "description" ) ); if ( !pDesc ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no description method)" ).arg( myLib.fileName() ) ); continue; } methodkey_t *pKey = ( methodkey_t * ) cast_to_fptr( myLib.resolve( "authMethodKey" ) ); if ( !pKey ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no authMethodKey method)" ).arg( myLib.fileName() ) ); continue; } // add this auth method to the method map mAuthMethods[pKey()] = new QgsAuthMethodMetadata( pKey(), pDesc(), myLib.fileName() ); } }
void QgsProviderRegistry::init() { // add standard providers mProviders[ QgsMemoryProvider::providerKey() ] = new QgsProviderMetadata( QgsMemoryProvider::providerKey(), QgsMemoryProvider::providerDescription(), &QgsMemoryProvider::createProvider ); mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase ); mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks ); #if defined(Q_OS_WIN) || defined(__CYGWIN__) mLibraryDirectory.setNameFilters( QStringList( "*.dll" ) ); #elif defined(ANDROID) mLibraryDirectory.setNameFilters( QStringList( "*provider.so" ) ); #else mLibraryDirectory.setNameFilters( QStringList( QStringLiteral( "*.so" ) ) ); #endif QgsDebugMsg( QString( "Checking %1 for provider plugins" ).arg( mLibraryDirectory.path() ) ); if ( mLibraryDirectory.count() == 0 ) { QString msg = QObject::tr( "No QGIS data provider plugins found in:\n%1\n" ).arg( mLibraryDirectory.path() ); msg += QObject::tr( "No vector layers can be loaded. Check your QGIS installation" ); QgsMessageOutput *output = QgsMessageOutput::createMessageOutput(); output->setTitle( QObject::tr( "No Data Providers" ) ); output->setMessage( msg, QgsMessageOutput::MessageText ); output->showMessage(); return; } // provider file regex pattern, only files matching the pattern are loaded if the variable is defined QString filePattern = getenv( "QGIS_PROVIDER_FILE" ); QRegExp fileRegexp; if ( !filePattern.isEmpty() ) { fileRegexp.setPattern( filePattern ); } Q_FOREACH ( const QFileInfo &fi, mLibraryDirectory.entryInfoList() ) { if ( !fileRegexp.isEmpty() ) { if ( fileRegexp.indexIn( fi.fileName() ) == -1 ) { QgsDebugMsg( "provider " + fi.fileName() + " skipped because doesn't match pattern " + filePattern ); continue; } } QLibrary myLib( fi.filePath() ); if ( !myLib.load() ) { QgsDebugMsg( QString( "Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName(), myLib.errorString() ) ); continue; } //MH: Added a further test to detect non-provider plugins linked to provider plugins. //Only pure provider plugins have 'type' not defined isprovider_t *hasType = reinterpret_cast< isprovider_t * >( cast_to_fptr( myLib.resolve( "type" ) ) ); if ( hasType ) { QgsDebugMsg( QString( "Checking %1: ...invalid (has type method)" ).arg( myLib.fileName() ) ); continue; } // get the description and the key for the provider plugin isprovider_t *isProvider = reinterpret_cast< isprovider_t * >( cast_to_fptr( myLib.resolve( "isProvider" ) ) ); if ( !isProvider ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no isProvider method)" ).arg( myLib.fileName() ) ); continue; } // check to see if this is a provider plugin if ( !isProvider() ) { QgsDebugMsg( QString( "Checking %1: ...invalid (not a provider)" ).arg( myLib.fileName() ) ); continue; } // looks like a provider. get the key and description description_t *pDesc = reinterpret_cast< description_t * >( cast_to_fptr( myLib.resolve( "description" ) ) ); if ( !pDesc ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no description method)" ).arg( myLib.fileName() ) ); continue; } providerkey_t *pKey = reinterpret_cast< providerkey_t * >( cast_to_fptr( myLib.resolve( "providerKey" ) ) ); if ( !pKey ) { QgsDebugMsg( QString( "Checking %1: ...invalid (no providerKey method)" ).arg( myLib.fileName() ) ); continue; } // add this provider to the provider map mProviders[pKey()] = new QgsProviderMetadata( pKey(), pDesc(), myLib.fileName() ); // load database drivers databaseDrivers_t *pDatabaseDrivers = reinterpret_cast< databaseDrivers_t * >( cast_to_fptr( myLib.resolve( "databaseDrivers" ) ) ); if ( pDatabaseDrivers ) { mDatabaseDrivers = pDatabaseDrivers(); } // load directory drivers directoryDrivers_t *pDirectoryDrivers = reinterpret_cast< directoryDrivers_t * >( cast_to_fptr( myLib.resolve( "directoryDrivers" ) ) ); if ( pDirectoryDrivers ) { mDirectoryDrivers = pDirectoryDrivers(); } // load protocol drivers protocolDrivers_t *pProtocolDrivers = reinterpret_cast< protocolDrivers_t * >( cast_to_fptr( myLib.resolve( "protocolDrivers" ) ) ); if ( pProtocolDrivers ) { mProtocolDrivers = pProtocolDrivers(); } // now get vector file filters, if any fileVectorFilters_t *pFileVectorFilters = reinterpret_cast< fileVectorFilters_t * >( cast_to_fptr( myLib.resolve( "fileVectorFilters" ) ) ); if ( pFileVectorFilters ) { QString fileVectorFilters = pFileVectorFilters(); if ( !fileVectorFilters.isEmpty() ) mVectorFileFilters += fileVectorFilters; QgsDebugMsg( QString( "Checking %1: ...loaded OK (%2 file filters)" ).arg( myLib.fileName() ).arg( fileVectorFilters.split( ";;" ).count() ) ); } // now get raster file filters, if any // this replaces deprecated QgsRasterLayer::buildSupportedRasterFileFilter buildsupportedrasterfilefilter_t *pBuild = reinterpret_cast< buildsupportedrasterfilefilter_t * >( cast_to_fptr( myLib.resolve( "buildSupportedRasterFileFilter" ) ) ); if ( pBuild ) { QString fileRasterFilters; pBuild( fileRasterFilters ); QgsDebugMsg( "raster filters: " + fileRasterFilters ); if ( !fileRasterFilters.isEmpty() ) mRasterFileFilters += fileRasterFilters; QgsDebugMsg( QString( "Checking %1: ...loaded OK (%2 file filters)" ).arg( myLib.fileName() ).arg( fileRasterFilters.split( ";;" ).count() ) ); } } } // QgsProviderRegistry ctor
bool StADLsdk::init() { // reset state close(); if(!myLib.load(LIB_NAME)) { #if(defined(_WIN32) || defined(__WIN32__)) \ && !defined(WIN64) && !defined(_WIN64) && !defined(__WIN64__) // library in WOW64, only for 32-bit application under 64-bit Windows if(!myLib.load(LIB_NAME_Y)) { return false; } #elif(defined(__linux__) || defined(__linux)) return false; #endif } myLib("ADL_Main_Control_Create", myFunctions.ADL_Main_Control_Create); myLib("ADL_Main_Control_Destroy", myFunctions.ADL_Main_Control_Destroy); // The second parameter is 0, which means: // retrieve adapter information only for adapters that are physically present and enabled in the system if(myFunctions.ADL_Main_Control_Create == NULL || myFunctions.ADL_Main_Control_Create(ADL_Main_Memory_Alloc, 0) != ADL_OK) { ST_DEBUG_LOG("StADLsdk, library Initialization error!"); close(); return false; } myLib("ADL_Adapter_NumberOfAdapters_Get", myFunctions.ADL_Adapter_NumberOfAdapters_Get); myLib("ADL_Display_DisplayInfo_Get", myFunctions.ADL_Display_DisplayInfo_Get); myLib("ADL_Adapter_AdapterInfo_Get", myFunctions.ADL_Adapter_AdapterInfo_Get); myLib("ADL_Adapter_Active_Get", myFunctions.ADL_Adapter_Active_Get); myLib("ADL_Display_ColorCaps_Get", myFunctions.ADL_Display_ColorCaps_Get); myLib("ADL_Display_Color_Get", myFunctions.ADL_Display_Color_Get); myLib("ADL_Display_Color_Set", myFunctions.ADL_Display_Color_Set); myLib("ADL_Display_Position_Get", myFunctions.ADL_Display_Position_Get); myLib("ADL_Display_Position_Set", myFunctions.ADL_Display_Position_Set); myLib("ADL_Display_ModeTimingOverride_Get", myFunctions.ADL_Display_ModeTimingOverride_Get); myLib("ADL_Display_EdidData_Get", myFunctions.ADL_Display_EdidData_Get); myLib("ADL_Display_WriteAndReadI2C", myFunctions.ADL_Display_WriteAndReadI2C); myLib("ADL_Display_DDCInfo_Get", myFunctions.ADL_Display_DDCInfo_Get); #if(defined(__linux__) || defined(__linux)) myLib("ADL_DesktopConfig_Get", myFunctions.ADL_DesktopConfig_Get); myLib("ADL_DesktopConfig_Set", myFunctions.ADL_DesktopConfig_Set); #endif if(!countAdapters() || myFunctions.ADL_Adapter_NumberOfAdapters_Get == NULL || myFunctions.ADL_Adapter_AdapterInfo_Get == NULL || myFunctions.ADL_Display_DisplayInfo_Get == NULL || myFunctions.ADL_Adapter_Active_Get == NULL) { // no AMD adapters... close(); return false; } return true; }
QgsVectorLayerExporter::QgsVectorLayerExporter( const QString &uri, const QString &providerKey, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, bool overwrite, const QMap<QString, QVariant> &options, QgsFeatureSink::SinkFlags sinkFlags ) : mErrorCount( 0 ) , mAttributeCount( -1 ) { mProvider = nullptr; QgsProviderRegistry *pReg = QgsProviderRegistry::instance(); std::unique_ptr< QLibrary > myLib( pReg->createProviderLibrary( providerKey ) ); if ( !myLib ) { mError = ErrInvalidProvider; mErrorMessage = QObject::tr( "Unable to load %1 provider" ).arg( providerKey ); return; } createEmptyLayer_t *pCreateEmpty = reinterpret_cast< createEmptyLayer_t * >( cast_to_fptr( myLib->resolve( "createEmptyLayer" ) ) ); if ( !pCreateEmpty ) { mError = ErrProviderUnsupportedFeature; mErrorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( providerKey, QStringLiteral( "createEmptyLayer" ) ); return; } // create an empty layer QString errMsg; mError = pCreateEmpty( uri, fields, geometryType, crs, overwrite, &mOldToNewAttrIdx, &errMsg, !options.isEmpty() ? &options : nullptr ); if ( errorCode() ) { mErrorMessage = errMsg; return; } Q_FOREACH ( int idx, mOldToNewAttrIdx ) { if ( idx > mAttributeCount ) mAttributeCount = idx; } mAttributeCount++; QgsDebugMsg( QStringLiteral( "Created empty layer" ) ); QString uriUpdated( uri ); // HACK sorry... if ( providerKey == QLatin1String( "ogr" ) ) { QString layerName; if ( options.contains( QStringLiteral( "layerName" ) ) ) layerName = options.value( QStringLiteral( "layerName" ) ).toString(); if ( !layerName.isEmpty() ) { uriUpdated += QLatin1String( "|layername=" ); uriUpdated += layerName; } } QgsDataProvider::ProviderOptions providerOptions; QgsVectorDataProvider *vectorProvider = dynamic_cast< QgsVectorDataProvider * >( pReg->createProvider( providerKey, uriUpdated, providerOptions ) ); if ( !vectorProvider || !vectorProvider->isValid() || ( vectorProvider->capabilities() & QgsVectorDataProvider::AddFeatures ) == 0 ) { mError = ErrInvalidLayer; mErrorMessage = QObject::tr( "Loading of layer failed" ); delete vectorProvider; return; } // If the result is a geopackage layer and there is already a field name FID requested which // might contain duplicates, make sure to generate a new field with a unique name instead // that will be filled by ogr with unique values. // HACK sorry const QString path = QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "ogr" ), uri ).value( QStringLiteral( "path" ) ).toString(); if ( sinkFlags.testFlag( QgsFeatureSink::SinkFlag::RegeneratePrimaryKey ) && path.endsWith( QLatin1String( ".gpkg" ), Qt::CaseInsensitive ) ) { QString fidName = options.value( QStringLiteral( "FID" ), QStringLiteral( "FID" ) ).toString(); int fidIdx = vectorProvider->fields().lookupField( fidName ); if ( fidIdx != -1 ) { mOldToNewAttrIdx.remove( fidIdx ); } } mProvider = vectorProvider; mError = NoError; }