35 #include "providers/gdal/qgsgdalprovider.h" 36 #include "providers/ogr/qgsogrprovider.h" 37 #include "providers/meshmemory/qgsmeshmemorydataprovider.h" 38 #ifdef HAVE_STATIC_PROVIDERS 39 #include "qgswmsprovider.h" 40 #include "qgspostgresprovider.h" 50 QMutexLocker locker( &sMutex );
70 QString
const &providerKey )
72 QgsProviderRegistry::Providers::const_iterator i =
73 metaData.find( providerKey );
75 if ( i != metaData.end() )
83 QgsProviderRegistry::QgsProviderRegistry(
const QString &pluginPath )
91 char **argv = qApp->argv();
92 QString appDir = argv[0];
93 int bin = appDir.findRev(
"/bin", -1,
false );
94 QString baseDir = appDir.left( bin );
95 QString mLibraryDirectory = baseDir +
"/lib";
97 mLibraryDirectory.setPath( pluginPath );
102 void QgsProviderRegistry::init()
106 mProviders[ QgsMemoryProvider::providerKey() ] =
new QgsProviderMetadata( QgsMemoryProvider::providerKey(), QgsMemoryProvider::providerDescription(), &QgsMemoryProvider::createProvider );
107 mProviders[ QgsMeshMemoryDataProvider::providerKey() ] =
new QgsProviderMetadata( QgsMeshMemoryDataProvider::providerKey(), QgsMeshMemoryDataProvider::providerDescription(), &QgsMeshMemoryDataProvider::createProvider );
109 mProviders[ QgsGdalProvider::providerKey() ] =
new QgsGdalProviderMetadata();
110 mProviders[ QgsOgrProvider::providerKey() ] =
new QgsOgrProviderMetadata();
111 #ifdef HAVE_STATIC_PROVIDERS 112 mProviders[ QgsWmsProvider::providerKey() ] =
new QgsWmsProviderMetadata();
113 mProviders[ QgsPostgresProvider::providerKey() ] =
new QgsPostgresProviderMetadata();
117 #ifdef HAVE_STATIC_PROVIDERS 118 QgsDebugMsg( QStringLiteral(
"Forced only static providers" ) );
122 mLibraryDirectory.setSorting( QDir::Name | QDir::IgnoreCase );
123 mLibraryDirectory.setFilter( QDir::Files | QDir::NoSymLinks );
125 #if defined(Q_OS_WIN) || defined(__CYGWIN__) 126 mLibraryDirectory.setNameFilters( QStringList(
"*.dll" ) );
127 #elif defined(ANDROID) 128 mLibraryDirectory.setNameFilters( QStringList(
"*provider.so" ) );
130 mLibraryDirectory.setNameFilters( QStringList( QStringLiteral(
"*.so" ) ) );
133 QgsDebugMsg( QStringLiteral(
"Checking %1 for provider plugins" ).arg( mLibraryDirectory.path() ) );
135 if ( mLibraryDirectory.count() == 0 )
137 QgsDebugMsg( QStringLiteral(
"No dynamic QGIS data provider plugins found in:\n%1\n" ).arg( mLibraryDirectory.path() ) );
141 QString filePattern = getenv(
"QGIS_PROVIDER_FILE" );
143 if ( !filePattern.isEmpty() )
145 fileRegexp.setPattern( filePattern );
148 typedef std::vector<QgsProviderMetadata *> *multiple_factory_function();
150 const auto constEntryInfoList = mLibraryDirectory.entryInfoList();
151 for (
const QFileInfo &fi : constEntryInfoList )
153 if ( !fileRegexp.isEmpty() )
155 if ( fileRegexp.indexIn( fi.fileName() ) == -1 )
157 QgsDebugMsg(
"provider " + fi.fileName() +
" skipped because doesn't match pattern " + filePattern );
162 QLibrary myLib( fi.filePath() );
165 QgsDebugMsg( QStringLiteral(
"Checking %1: ...invalid (lib not loadable): %2" ).arg( myLib.fileName(), myLib.errorString() ) );
169 QFunctionPointer multi_func = myLib.resolve( QStringLiteral(
"multipleProviderMetadataFactory" ).toLatin1().data() );
170 multiple_factory_function *multi_function =
reinterpret_cast< multiple_factory_function *
>(
cast_to_fptr( multi_func ) );
171 if ( multi_function )
173 std::vector<QgsProviderMetadata *> *metadatas = multi_function();
174 for (
const auto meta : *metadatas )
176 if ( findMetadata_( mProviders, meta->key() ) )
178 QgsDebugMsg( QStringLiteral(
"Checking %1: ...invalid (key %2 already registered)" ).arg( myLib.fileName() ).arg( meta->key() ) );
183 mProviders[meta->key()] = meta;
189 QFunctionPointer func = myLib.resolve( QStringLiteral(
"providerMetadataFactory" ).toLatin1().data() );
190 factory_function *
function =
reinterpret_cast< factory_function *
>(
cast_to_fptr( func ) );
193 QgsDebugMsg( QStringLiteral(
"Checking %1: ...invalid (no providerMetadataFactory method)" ).arg( myLib.fileName() ) );
200 QgsDebugMsg( QStringLiteral(
"Checking %1: ...invalid (no metadata returned)" ).arg( myLib.fileName() ) );
204 if ( findMetadata_( mProviders, meta->
key() ) )
206 QgsDebugMsg( QStringLiteral(
"Checking %1: ...invalid (key %2 already registered)" ).arg( myLib.fileName() ).arg( meta->
key() ) );
211 mProviders[meta->
key()] = meta;
215 QgsDebugMsg( QStringLiteral(
"Loaded %1 providers (%2) " ).arg( mProviders.size() ).arg(
providerList().join(
';' ) ) );
218 for ( Providers::const_iterator it = mProviders.begin(); it != mProviders.end(); ++it )
220 const QString &key = it->first;
226 if ( !fileVectorFilters.isEmpty() )
229 QgsDebugMsgLevel( QStringLiteral(
"Checking %1: ...loaded OK (%2 file filters)" ).arg( key ).arg( fileVectorFilters.split(
";;" ).count() ), 2 );
234 if ( !fileRasterFilters.isEmpty() )
238 QgsDebugMsgLevel( QStringLiteral(
"Checking %1: ...loaded OK (%2 file filters)" ).arg( key ).arg( fileRasterFilters.split(
";;" ).count() ), 2 );
243 if ( !fileMeshFilters.isEmpty() )
246 QgsDebugMsgLevel( QStringLiteral(
"Checking %1: ...loaded OK (%2 file mesh filters)" ).arg( key ).arg( mMeshFileFilters.split(
";;" ).count() ), 2 );
251 if ( !fileMeshDatasetFilters.isEmpty() )
254 QgsDebugMsgLevel( QStringLiteral(
"Checking %1: ...loaded OK (%2 file dataset filters)" ).arg( key ).arg( mMeshDatasetFileFilters.split(
";;" ).count() ), 2 );
262 mDatabaseDrivers = QgsOgrProviderUtils::databaseDrivers();
265 mDirectoryDrivers = QgsOgrProviderUtils::directoryDrivers();
268 mProtocolDrivers = QgsOgrProviderUtils::protocolDrivers();
275 void QgsProviderRegistry::clean()
278 if ( QgsProject::sProject )
281 Providers::const_iterator it = mProviders.begin();
283 while ( it != mProviders.end() )
286 it->second->cleanupProvider();
293 bool QgsProviderRegistry::exists()
295 return static_cast< bool >( sInstance );
301 if ( sInstance ==
this )
321 Providers::const_iterator it = mProviders.begin();
323 if ( mProviders.empty() )
324 return QObject::tr(
"No data provider plugins are available. No vector layers can be loaded" );
329 list += QLatin1String(
"<ol>" );
331 while ( it != mProviders.end() )
334 list += QLatin1String(
"<li>" );
336 list += it->second->description();
339 list += QLatin1String(
"<br></li>" );
347 list += QLatin1String(
"</ol>" );
354 mLibraryDirectory = path;
361 return mLibraryDirectory;
389 const QList< QgsDataItemProvider * > itemProviders =
dataItemProviders( providerKey );
394 ret = ret | itemProvider->capabilities();
405 return QVariantMap();
422 bool overwrite, QMap<int, int> &oldToNewAttrIdxMap,
423 QString &errorMessage,
424 const QMap<QString, QVariant> *options )
430 return meta->
createEmptyLayer( uri, fields, wkbType, srs, overwrite, oldToNewAttrIdxMap, errorMessage, options );
434 errorMessage = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
443 const QStringList &createOptions )
447 return meta->
createRasterDataProvider( uri, format, nBands, type, width, height, geoTransform, crs, createOptions );
458 return QList<QPair<QString, QString> >();
467 return QList<QgsDataItemProvider *>();
470 int QgsProviderRegistry::listStyles(
const QString &providerKey,
const QString &uri, QStringList &ids, QStringList &names, QStringList &descriptions, QString &errCause )
476 res = meta->
listStyles( uri, ids, names, descriptions, errCause );
480 errCause = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
495 errCause = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
509 errCause = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
515 const QString &sldStyle,
const QString &styleName,
const QString &styleDescription,
516 const QString &uiFileContent,
bool useAsDefault, QString &errCause )
521 ret = meta->
saveStyle( uri, qmlStyle, sldStyle, styleName, styleDescription,
522 uiFileContent, useAsDefault, errCause );
525 errCause = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
538 errCause = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
547 return meta->
createDb( dbPath, errCause );
550 errCause = QStringLiteral(
"Resolving createDb(...) failed" );
567 Q_UNUSED( providerKey );
570 Q_UNUSED( widgetMode );
571 QgsDebugMsg(
"deprecated call - use QgsGui::providerGuiRegistry()->sourceSelectProviders(providerKey)[0]->createDataSourceWidget() instead" );
576 QString
const &functionName )
579 QString lib =
library( providerKey );
584 QLibrary myLib( lib );
586 QgsDebugMsg(
"Library name is " + myLib.fileName() );
590 return myLib.resolve( functionName.toLatin1().data() );
594 QgsDebugMsg(
"Cannot load library: " + myLib.errorString() );
602 QString lib =
library( providerKey );
607 std::unique_ptr< QLibrary > myLib(
new QLibrary( lib ) );
609 QgsDebugMsg(
"Library name is " + myLib->fileName() );
612 return myLib.release();
614 QgsDebugMsg(
"Cannot load library: " + myLib->errorString() );
621 QgsDebugMsg(
"deprecated - use QgsGui::providerGuiRegistry() instead." );
626 if ( providerMetadata )
628 if ( mProviders.find( providerMetadata->
key() ) == mProviders.end() )
635 QgsDebugMsgLevel( QStringLiteral(
"Cannot register provider metadata: a provider with the same key (%1) was already registered!" ).arg( providerMetadata->
key() ), 2 );
640 QgsDebugMsgLevel( QStringLiteral(
"Trying to register a null metadata provider!" ), 2 );
647 return mVectorFileFilters;
652 return mRasterFileFilters;
657 return mMeshFileFilters;
662 return mMeshDatasetFileFilters;
667 return mDatabaseDrivers;
672 return mDirectoryDrivers;
677 return mProtocolDrivers;
683 for ( Providers::const_iterator it = mProviders.begin(); it != mProviders.end(); ++it )
685 lst.append( it->first );
692 return findMetadata_( mProviders, providerKey );
bool registerProvider(QgsProviderMetadata *providerMetadata)
register a new vector data provider from its providerMetadata
bool saveStyle(const QString &providerKey, const QString &uri, const QString &qmlStyle, const QString &sldStyle, const QString &styleName, const QString &styleDescription, const QString &uiFileContent, bool useAsDefault, QString &errCause)
Saves a layer style to provider.
WidgetMode
Different ways a source select dialog can be used.
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
QList< QgsDataItemProvider *> dataItemProviders(const QString &providerKey) const
Returns list of data item providers of the provider.
void cleanupProviderFunction_t()
virtual QString protocolDrivers() const
Returns a string containing the available protocol drivers.
Q_DECL_DEPRECATED QString library(const QString &providerKey) const
Returns path for the library of the provider.
#define Q_NOWARN_DEPRECATED_PUSH
Q_DECL_DEPRECATED void registerGuis(QWidget *widget)
DataType
Raster data types.
virtual QString databaseDrivers() const
Returns a string containing the available database drivers.
Container of fields for a vector layer.
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
Abstract base class for spatial data provider implementations.
QString getStyleById(const QString &providerKey, const QString &uri, QString styleId, QString &errCause)
Gets a layer style defined by styleId.
virtual ~QgsProviderRegistry()
const QgsCoordinateReferenceSystem & crs
Could not find a matching provider key.
QgsVectorLayerExporter::ExportError createEmptyLayer(const QString &providerKey, const QString &uri, const QgsFields &fields, QgsWkbTypes::Type wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, QMap< int, int > &oldToNewAttrIdxMap, QString &errorMessage, const QMap< QString, QVariant > *options)
Creates new empty vector layer.
virtual QString fileVectorFilters() const
Returns vector file filter string.
QgsDataProvider * createProvider(const QString &providerKey, const QString &dataSource, const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Creates a new instance of a provider.
Q_DECL_DEPRECATED QWidget * createSelectionWidget(const QString &providerKey, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsProviderRegistry::WidgetMode widgetMode=QgsProviderRegistry::WidgetMode::None)
Returns a new widget for selecting layers from a provider.
Type
The WKB type describes the number of dimensions a geometry has.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
#define QgsDebugMsgLevel(str, level)
Q_DECL_DEPRECATED QLibrary * createProviderLibrary(const QString &providerKey) const
Returns a new QLibrary for the specified providerKey.
QgsTransaction * createTransaction(const QString &providerKey, const QString &connString)
Returns new instance of transaction.
QList< QPair< QString, QString > > pyramidResamplingMethods(const QString &providerKey)
Returns list of raster pyramid resampling methods.
int listStyles(const QString &providerKey, const QString &uri, QStringList &ids, QStringList &names, QStringList &descriptions, QString &errCause)
Lists stored layer styles in the provider defined by providerKey and uri.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
void setLibraryDirectory(const QDir &path)
Sets library directory where to search for plugins.
QString loadStyle(const QString &providerKey, const QString &uri, QString &errCause)
Loads a layer style defined by uri.
QString pluginList(bool asHtml=false) const
Returns list of provider plugins found.
void removeAllMapLayers()
Removes all registered layers.
virtual QgsRasterDataProvider * createRasterDataProvider(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=QStringList())
Creates new instance of raster data provider.
virtual QString fileMeshDatasetFilters() const
Returns mesh's dataset file filter string.
A registry / canonical manager of data providers.
Q_DECL_DEPRECATED int providerCapabilities(const QString &providerKey) const
Returns the provider capabilities.
#define Q_NOWARN_DEPRECATED_POP
Setting options for creating vector data providers.
virtual QString fileMeshFilters() const
Returns mesh file filter string.
bool deleteStyleById(const QString &providerKey, const QString &uri, QString styleId, QString &errCause)
Deletes a layer style defined by styleId.
virtual QString directoryDrivers() const
Returns a string containing the available directory drivers.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
std::map< QString, QgsProviderMetadata * > Providers
Type for data provider metadata associative container.
static QgsProject * instance()
Returns the QgsProject singleton instance.
bool createDb(const QString &providerKey, const QString &dbPath, QString &errCause)
Creates database by the provider on the path.
This class represents a coordinate reference system (CRS).
Q_DECL_DEPRECATED QFunctionPointer function(const QString &providerKey, const QString &functionName)
Gets pointer to provider function.
virtual QString fileRasterFilters() const
Returns raster file filter string.
QString encodeUri(const QString &providerKey, const QVariantMap &parts)
Reassembles a provider data source URI from its component paths (e.g.
QStringList providerList() const
Returns list of available providers by their keys.
QDir libraryDirectory() const
Returns the library directory where plugins are found.
This is the interface for those who want to add custom data items to the browser tree.
Base class for raster data providers.