QWidget *QgsAuthMethodRegistry::editWidget( const QString &authMethodKey, QWidget *parent ) { editFactoryFunction_t * editFactory = reinterpret_cast< editFactoryFunction_t * >( cast_to_fptr( function( authMethodKey, "editWidget" ) ) ); if ( !editFactory ) return nullptr; return editFactory( parent ); }
QWidget *QgsAuthMethodRegistry::editWidget( const QString &authMethodKey, QWidget *parent ) { editFactoryFunction_t * editFactory = ( editFactoryFunction_t * ) cast_to_fptr( function( authMethodKey, "editWidget" ) ); if ( !editFactory ) return 0; return editFactory( parent ); }
QWidget* QgsProviderRegistry::selectWidget( const QString & providerKey, QWidget * parent, Qt::WFlags fl ) { selectFactoryFunction_t * selectFactory = ( selectFactoryFunction_t * ) cast_to_fptr( function( providerKey, "selectWidget" ) ); if ( !selectFactory ) return 0; return selectFactory( parent, fl ); }
QWidget *QgsProviderRegistry::createSelectionWidget( const QString &providerKey, QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode widgetMode ) { selectFactoryFunction_t *selectFactory = reinterpret_cast< selectFactoryFunction_t * >( cast_to_fptr( function( providerKey, "selectWidget" ) ) ); if ( !selectFactory ) return nullptr; return selectFactory( parent, fl, widgetMode ); }
/** 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
void QgsProviderRegistry::registerGuis( QWidget *parent ) { typedef void registerGui_function( QWidget * parent ); foreach ( const QString &provider, providerList() ) { registerGui_function *registerGui = ( registerGui_function * ) cast_to_fptr( function( provider, "registerGui" ) ); if ( !registerGui ) continue; registerGui( parent ); }
void QgsProviderRegistry::registerGuis( QWidget *parent ) { typedef void registerGui_function( QWidget * parent ); Q_FOREACH ( const QString &provider, providerList() ) { registerGui_function *registerGui = reinterpret_cast< registerGui_function * >( cast_to_fptr( function( provider, "registerGui" ) ) ); if ( !registerGui ) continue; registerGui( parent ); }
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; }
QgsTransaction* QgsTransaction::create( const QString& connString, const QString& providerKey ) { std::unique_ptr< QLibrary > lib( QgsProviderRegistry::instance()->providerLibrary( providerKey ) ); if ( !lib ) return nullptr; createTransaction_t* createTransaction = reinterpret_cast< createTransaction_t* >( cast_to_fptr( lib->resolve( "createTransaction" ) ) ); if ( !createTransaction ) return nullptr; QgsTransaction* ts = createTransaction( connString ); return ts; }
int GRASS_LIB_EXPORT G_parser( int argc, char **argv ) { QgsDebugMsg( "Entered" ); G_parser_type* fn = ( G_parser_type* ) cast_to_fptr( QgsGrassGisLib::instance()->resolve( "G_parser" ) ); int ret = fn( argc, argv ); if ( ret == 0 ) // parsed OK { // It would be useful to determine the region from input raster layers if // no one is given by environment variable but there seems to be no way to // get access to module options. Everything is in static variables in // parser.c and there are no access functions to them. } return ret; }
int QgsProviderRegistry::providerCapabilities( const QString &providerKey ) const { std::unique_ptr< QLibrary > library( createProviderLibrary( providerKey ) ); if ( !library ) { return QgsDataProvider::NoDataCapabilities; } dataCapabilities_t *dataCapabilities = reinterpret_cast< dataCapabilities_t *>( cast_to_fptr( library->resolve( "dataCapabilities" ) ) ); if ( !dataCapabilities ) { return QgsDataProvider::NoDataCapabilities; } return dataCapabilities(); }
int QgsProviderRegistry::providerCapabilities( const QString &providerKey ) const { QLibrary *library = providerLibrary( providerKey ); if ( !library ) { return QgsDataProvider::NoDataCapabilities; } dataCapabilities_t * dataCapabilities = ( dataCapabilities_t * ) cast_to_fptr( library->resolve( "dataCapabilities" ) ); if ( !dataCapabilities ) { return QgsDataProvider::NoDataCapabilities; } return dataCapabilities(); }
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; } }
QgsRasterDataProvider *QgsRasterDataProvider::create( const QString &providerKey, const QString &uri, const QString &format, int nBands, Qgis::DataType type, int width, int height, double *geoTransform, const QgsCoordinateReferenceSystem &crs, const QStringList &createOptions ) { createFunction_t *createFn = reinterpret_cast< createFunction_t * >( cast_to_fptr( QgsProviderRegistry::instance()->function( providerKey, "create" ) ) ); if ( !createFn ) { QgsDebugMsg( "Cannot resolve 'create' function in " + providerKey + " provider" ); // TODO: it would be good to return invalid QgsRasterDataProvider // with QgsError set, but QgsRasterDataProvider has pure virtual methods return nullptr; } return createFn( uri, format, nBands, type, width, height, geoTransform, crs, createOptions ); }
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; } }
QgsTransaction* QgsTransaction::create( const QString& connString, const QString& providerKey ) { QLibrary* lib = QgsProviderRegistry::instance()->providerLibrary( providerKey ); if ( !lib ) { return 0; } createTransaction_t* createTransaction = ( createTransaction_t* ) cast_to_fptr( lib->resolve( "createTransaction" ) ); if ( !createTransaction ) { return 0; } QgsTransaction* ts = createTransaction( connString ); delete lib; return ts; }
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; } }
int GRASS_LIB_EXPORT G_lookup_key_value_from_file( const char *file, const char *key, char value[], int n ) { G_lookup_key_value_from_file_type *fn = ( G_lookup_key_value_from_file_type* ) cast_to_fptr( QgsGrassGisLib::instance()->resolve( "G_lookup_key_value_from_file" ) ); return fn( file, key, value, n ); }
QList<QPair<QString, QString> > QgsRasterDataProvider::pyramidResamplingMethods( const QString &providerKey ) { pyramidResamplingMethods_t *pPyramidResamplingMethods = reinterpret_cast< pyramidResamplingMethods_t * >( cast_to_fptr( QgsProviderRegistry::instance()->function( providerKey, "pyramidResamplingMethods" ) ) ); if ( pPyramidResamplingMethods ) { QList<QPair<QString, QString> > *methods = pPyramidResamplingMethods(); if ( !methods ) { QgsDebugMsg( "provider pyramidResamplingMethods returned no methods" ); } else { return *methods; } } else { QgsDebugMsg( "Could not resolve pyramidResamplingMethods provider library" ); } return QList<QPair<QString, QString> >(); }
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
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 QgsGeometryCheckerResultTab::exportErrorsDo( const QString &file ) { QList< QPair<QString, QString> > attributes; attributes.append( qMakePair( QStringLiteral( "Layer" ), QStringLiteral( "String;30;" ) ) ); attributes.append( qMakePair( QStringLiteral( "FeatureID" ), QStringLiteral( "String;10;" ) ) ); attributes.append( qMakePair( QStringLiteral( "ErrorDesc" ), QStringLiteral( "String;80;" ) ) ); QFileInfo fi( file ); QString ext = fi.suffix(); QString driver = QgsVectorFileWriter::driverForExtension( ext ); QLibrary ogrLib( QgsProviderRegistry::instance()->library( QStringLiteral( "ogr" ) ) ); if ( !ogrLib.load() ) { return false; } typedef bool ( *createEmptyDataSourceProc )( const QString &, const QString &, const QString &, QgsWkbTypes::Type, const QList< QPair<QString, QString> > &, const QgsCoordinateReferenceSystem & ); createEmptyDataSourceProc createEmptyDataSource = ( createEmptyDataSourceProc ) cast_to_fptr( ogrLib.resolve( "createEmptyDataSource" ) ); if ( !createEmptyDataSource ) { return false; } if ( !createEmptyDataSource( file, driver, "UTF-8", QgsWkbTypes::Point, attributes, QgsProject::instance()->crs() ) ) { return false; } QgsVectorLayer *layer = new QgsVectorLayer( file, QFileInfo( file ).baseName(), QStringLiteral( "ogr" ) ); if ( !layer->isValid() ) { delete layer; return false; } int fieldLayer = layer->fields().lookupField( QStringLiteral( "Layer" ) ); int fieldFeatureId = layer->fields().lookupField( QStringLiteral( "FeatureID" ) ); int fieldErrDesc = layer->fields().lookupField( QStringLiteral( "ErrorDesc" ) ); for ( int row = 0, nRows = ui.tableWidgetErrors->rowCount(); row < nRows; ++row ) { QgsGeometryCheckError *error = ui.tableWidgetErrors->item( row, 0 )->data( Qt::UserRole ).value<QgsGeometryCheckError *>(); QgsVectorLayer *srcLayer = mChecker->featurePools()[error->layerId()]->layer(); QgsFeature f( layer->fields() ); f.setAttribute( fieldLayer, srcLayer->name() ); f.setAttribute( fieldFeatureId, error->featureId() ); f.setAttribute( fieldErrDesc, error->description() ); QgsGeometry geom( new QgsPoint( error->location() ) ); f.setGeometry( geom ); layer->dataProvider()->addFeatures( QgsFeatureList() << f ); } // Remove existing layer with same uri QStringList toRemove; for ( QgsMapLayer *maplayer : QgsProject::instance()->mapLayers() ) { if ( dynamic_cast<QgsVectorLayer *>( maplayer ) && static_cast<QgsVectorLayer *>( maplayer )->dataProvider()->dataSourceUri() == layer->dataProvider()->dataSourceUri() ) { toRemove.append( maplayer->id() ); } } if ( !toRemove.isEmpty() ) { QgsProject::instance()->removeMapLayers( toRemove ); } QgsProject::instance()->addMapLayers( QList<QgsMapLayer *>() << layer ); return true; }
bool QgsNewSpatialiteLayerDialog::createDb() { QString dbPath = mDatabaseComboBox->currentText(); if ( dbPath.isEmpty() ) return false; QFile newDb( dbPath ); if ( newDb.exists() ) { QMessageBox msgBox; msgBox.setIcon( QMessageBox::Question ); msgBox.setWindowTitle( tr( "The File Already Exists." ) ); msgBox.setText( tr( "Do you want to overwrite the existing file with a new database or add a new layer to it?" ) ); QPushButton *overwriteButton = msgBox.addButton( tr( "Overwrite" ), QMessageBox::ActionRole ); QPushButton *addNewLayerButton = msgBox.addButton( tr( "Add new layer" ), QMessageBox::ActionRole ); msgBox.setStandardButtons( QMessageBox::Cancel ); msgBox.setDefaultButton( addNewLayerButton ); int ret = msgBox.exec(); if ( ret == QMessageBox::Cancel ) { return false; } if ( msgBox.clickedButton() == overwriteButton ) { newDb.remove(); } } if ( !newDb.exists() ) { QString errCause; bool res = false; QString spatialite_lib = QgsProviderRegistry::instance()->library( QStringLiteral( "spatialite" ) ); QLibrary *myLib = new QLibrary( spatialite_lib ); bool loaded = myLib->load(); if ( loaded ) { QgsDebugMsg( "SpatiaLite provider loaded" ); typedef bool ( *createDbProc )( const QString &, QString & ); createDbProc createDbPtr = ( createDbProc ) cast_to_fptr( myLib->resolve( "createDb" ) ); if ( createDbPtr ) { res = createDbPtr( dbPath, errCause ); } else { errCause = QStringLiteral( "Resolving createDb(...) failed" ); } } delete myLib; if ( !res ) { QMessageBox::warning( nullptr, tr( "SpatiaLite Database" ), errCause ); pbnFindSRID->setEnabled( false ); } } QFileInfo fi( newDb ); if ( !fi.exists() ) { pbnFindSRID->setEnabled( false ); return false; } QString key = "/SpatiaLite/connections/" + fi.fileName() + "/sqlitepath"; QgsSettings settings; if ( !settings.contains( key ) ) { settings.setValue( QStringLiteral( "SpatiaLite/connections/selected" ), fi.fileName() + tr( "@" ) + fi.canonicalFilePath() ); settings.setValue( key, fi.canonicalFilePath() ); QMessageBox::information( nullptr, tr( "SpatiaLite Database" ), tr( "Registered new database!" ) ); } pbnFindSRID->setEnabled( true ); return true; }
QgsVectorLayerImport::QgsVectorLayerImport( const QString &uri, const QString &providerKey, const QgsFields& fields, QGis::WkbType geometryType, const QgsCoordinateReferenceSystem* crs, bool overwrite, const QMap<QString, QVariant> *options, QProgressDialog *progress ) : mErrorCount( 0 ) , mAttributeCount( -1 ) , mProgress( progress ) { mProvider = nullptr; QgsProviderRegistry * pReg = QgsProviderRegistry::instance(); QLibrary *myLib = pReg->providerLibrary( 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 ) { delete myLib; mError = ErrProviderUnsupportedFeature; mErrorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( providerKey, "createEmptyLayer" ); return; } delete myLib; // create an empty layer QString errMsg; mError = pCreateEmpty( uri, fields, geometryType, crs, overwrite, &mOldToNewAttrIdx, &errMsg, options ); if ( hasError() ) { mErrorMessage = errMsg; return; } Q_FOREACH ( int idx, mOldToNewAttrIdx.values() ) { if ( idx > mAttributeCount ) mAttributeCount = idx; } mAttributeCount++; QgsDebugMsg( "Created empty layer" ); QgsVectorDataProvider *vectorProvider = dynamic_cast< QgsVectorDataProvider* >( pReg->provider( providerKey, uri ) ); if ( !vectorProvider || !vectorProvider->isValid() || ( vectorProvider->capabilities() & QgsVectorDataProvider::AddFeatures ) == 0 ) { mError = ErrInvalidLayer; mErrorMessage = QObject::tr( "Loading of layer failed" ); if ( vectorProvider ) delete vectorProvider; return; } mProvider = vectorProvider; mError = NoError; }
// this is static QString QgsNewVectorLayerDialog::runAndCreateLayer( QWidget* parent, QString* pEnc ) { QgsNewVectorLayerDialog geomDialog( parent ); if ( geomDialog.exec() == QDialog::Rejected ) { return QLatin1String( "" ); } QgsWkbTypes::Type geometrytype = geomDialog.selectedType(); QString fileformat = geomDialog.selectedFileFormat(); QString enc = geomDialog.selectedFileEncoding(); int crsId = geomDialog.selectedCrsId(); QgsDebugMsg( QString( "New file format will be: %1" ).arg( fileformat ) ); QList< QPair<QString, QString> > attributes; geomDialog.attributes( attributes ); QSettings settings; QString lastUsedDir = settings.value( QStringLiteral( "/UI/lastVectorFileFilterDir" ), QDir::homePath() ).toString(); QString filterString = QgsVectorFileWriter::filterForDriver( fileformat ); QString fileName = QFileDialog::getSaveFileName( nullptr, tr( "Save layer as..." ), lastUsedDir, filterString ); if ( fileName.isNull() ) { return QLatin1String( "" ); } if ( fileformat == QLatin1String( "ESRI Shapefile" ) && !fileName.endsWith( QLatin1String( ".shp" ), Qt::CaseInsensitive ) ) fileName += QLatin1String( ".shp" ); settings.setValue( QStringLiteral( "/UI/lastVectorFileFilterDir" ), QFileInfo( fileName ).absolutePath() ); settings.setValue( QStringLiteral( "/UI/encoding" ), enc ); //try to create the new layer with OGRProvider instead of QgsVectorFileWriter QgsProviderRegistry * pReg = QgsProviderRegistry::instance(); QString ogrlib = pReg->library( QStringLiteral( "ogr" ) ); // load the data provider QLibrary* myLib = new QLibrary( ogrlib ); bool loaded = myLib->load(); if ( loaded ) { QgsDebugMsg( "ogr provider loaded" ); typedef bool ( *createEmptyDataSourceProc )( const QString&, const QString&, const QString&, QgsWkbTypes::Type, const QList< QPair<QString, QString> >&, const QgsCoordinateReferenceSystem & ); createEmptyDataSourceProc createEmptyDataSource = ( createEmptyDataSourceProc ) cast_to_fptr( myLib->resolve( "createEmptyDataSource" ) ); if ( createEmptyDataSource ) { if ( geometrytype != QgsWkbTypes::Unknown ) { QgsCoordinateReferenceSystem srs = QgsCoordinateReferenceSystem::fromSrsId( crsId ); if ( !createEmptyDataSource( fileName, fileformat, enc, geometrytype, attributes, srs ) ) { return QString::null; } } else { QgsDebugMsg( "geometry type not recognised" ); return QString::null; } } else { QgsDebugMsg( "Resolving newEmptyDataSource(...) failed" ); return QString::null; } } if ( pEnc ) *pEnc = enc; return fileName; }
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() ); } }
bool QgsNewSpatialiteLayerDialog::createDb() { QString dbPath = mDatabaseComboBox->currentText(); if ( dbPath.isEmpty() ) return false; QFile newDb( dbPath ); if ( !newDb.exists() ) { QString errCause; bool res = false; QString spatialite_lib = QgsProviderRegistry::instance()->library( "spatialite" ); QLibrary* myLib = new QLibrary( spatialite_lib ); bool loaded = myLib->load(); if ( loaded ) { QgsDebugMsg( "spatialite provider loaded" ); typedef bool ( *createDbProc )( const QString&, QString& ); createDbProc createDbPtr = ( createDbProc ) cast_to_fptr( myLib->resolve( "createDb" ) ); if ( createDbPtr ) { res = createDbPtr( dbPath, errCause ); } else { errCause = "Resolving createDb(...) failed"; } } delete myLib; if ( !res ) { QMessageBox::warning( 0, tr( "SpatiaLite Database" ), errCause ); pbnFindSRID->setEnabled( false ); } } QFileInfo fi( newDb ); if ( !fi.exists() ) { pbnFindSRID->setEnabled( false ); return false; } QString key = "/SpatiaLite/connections/" + fi.fileName() + "/sqlitepath"; QSettings settings; if ( !settings.contains( key ) ) { settings.setValue( "/SpatiaLite/connections/selected", fi.fileName() + tr( "@" ) + fi.canonicalFilePath() ); settings.setValue( key, fi.canonicalFilePath() ); QMessageBox::information( 0, tr( "SpatiaLite Database" ), tr( "Registered new database!" ) ); } pbnFindSRID->setEnabled( true ); return true; }
int GRASS_LIB_EXPORT G_set_error_routine( int ( *error_routine )( const char *, int ) ) { //QgsDebugMsg( "Entered" ); G_set_error_routine_type* fn = ( G_set_error_routine_type* ) cast_to_fptr( QgsGrassGisLib::instance()->resolve( "G_set_error_routine" ) ); return fn( error_routine ); }
int GRASS_LIB_EXPORT G_cell_stats_histo_eq( struct Cell_stats *statf, CELL min1, CELL max1, CELL min2, CELL max2, int zero, void ( *func )( CELL, CELL, CELL ) ) { G_cell_stats_histo_eq_type *fn = ( G_cell_stats_histo_eq_type* ) cast_to_fptr( QgsGrassGisLib::instance()->resolve( "G_cell_stats_histo_eq_type" ) ); return fn( statf, min1, max1, min2, max2, zero, func ); }
int G_vasprintf( char **out, const char *fmt, va_list ap ) { G_vasprintf_type* fn = ( G_vasprintf_type* ) cast_to_fptr( QgsGrassGisLib::instance()->resolve( "G_vasprintf" ) ); return fn( out, fmt, ap ); }