QGIS API Documentation 3.43.0-Master (7996e1b587e)
qgsproviderregistry.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsproviderregistry.h - Singleton class for
3 registering data providers.
4 -------------------
5 begin : Sat Jan 10 2004
6 copyright : (C) 2004 by Gary E.Sherman
7 email : sherman at mrcc.com
8 ***************************************************************************/
9
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
19#ifndef QGSPROVIDERREGISTRY_H
20#define QGSPROVIDERREGISTRY_H
21
22#include <map>
23
24#include <QDir>
25#include <QLibrary>
26#include <QString>
27
28#include "qgsdataprovider.h"
29#include "qgis_core.h"
30#include "qgis_sip.h"
31
33class QgsVectorLayer;
36class QgsDataItem;
38class QgsTransaction;
39class QgsFields;
41class QgsFeedback;
42
57class CORE_EXPORT QgsProviderRegistry
58{
59
60 public:
61
62 // TODO QGIS 4 - either move to QgsAbstractDataSourceWidget or remove altogether
63
68 {
69
76
82
89 };
90
92 static QgsProviderRegistry *instance( const QString &pluginPath = QString() );
93
95
104 Q_DECL_DEPRECATED QString library( const QString &providerKey ) const SIP_DEPRECATED;
105
107 QString pluginList( bool asHtml = false ) const;
108
112 QDir libraryDirectory() const;
113
115 void setLibraryDirectory( const QDir &path );
116
117 /*
118 * IMPORTANT: While it seems like /Factory/ would be the correct annotation here, that's not
119 * the case.
120 * Paraphrasing Phil Thomson's advice on https://www.riverbankcomputing.com/pipermail/pyqt/2017-July/039450.html:
121 *
122 * "
123 * /Factory/ is used when the instance returned is guaranteed to be new to Python.
124 * In this case it isn't because it has already been seen when being returned by by the python function
125 * creating the provider subclass.
126 *
127 * (However for a different sub-class implemented in C++ then it would be the first time it was seen
128 * by Python so the /Factory/ on create() would be correct.)
129 *
130 * You might try using /TransferBack/ on createProvider() instead - that might be the best compromise.
131 * "
132 */
133
144 QgsDataProvider *createProvider( const QString &providerKey,
145 const QString &dataSource,
148
154 Q_DECL_DEPRECATED Qgis::DataItemProviderCapabilities providerCapabilities( const QString &providerKey ) const SIP_DEPRECATED;
155
161 SIP_SKIP Qgis::VectorExportResult createEmptyLayer( const QString &providerKey, const QString &uri, const QgsFields &fields, Qgis::WkbType wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, QMap<int, int> &oldToNewAttrIdxMap, QString &errorMessage, const QMap<QString, QVariant> *options, QString &createdLayerName );
162
163 // TODO QGIS 4.0: rename createOptions to creationOptions for consistency with GDAL
164
171 QgsRasterDataProvider *createRasterDataProvider(
172 const QString &providerKey,
173 const QString &uri,
174 const QString &format,
175 int nBands,
176 Qgis::DataType type,
177 int width, int height,
178 double *geoTransform,
180 const QStringList &createOptions = QStringList() ) SIP_FACTORY;
181
187 QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
188
197 QVariantMap decodeUri( const QString &providerKey, const QString &uri );
198
208 QString encodeUri( const QString &providerKey, const QVariantMap &parts );
209
221 QString absoluteToRelativeUri( const QString &providerKey, const QString &uri, const QgsReadWriteContext &context ) const;
222
234 QString relativeToAbsoluteUri( const QString &providerKey, const QString &uri, const QgsReadWriteContext &context ) const;
235
242 Q_DECL_DEPRECATED QWidget *createSelectionWidget( const QString &providerKey, QWidget *parent = nullptr, Qt::WindowFlags fl = Qt::WindowFlags(), QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::Standalone ) SIP_DEPRECATED;
243
249 QList< QgsDataItemProvider * > dataItemProviders( const QString &providerKey ) const SIP_FACTORY;
250
256 int listStyles( const QString &providerKey,
257 const QString &uri,
258 QStringList &ids,
259 QStringList &names,
260 QStringList &descriptions,
261 QString &errCause );
262
275 bool styleExists( const QString &providerKey, const QString &uri, const QString &styleId, QString &errorCause SIP_OUT );
276
284 QString getStyleById( const QString &providerKey, const QString &uri, const QString &styleId, QString &errCause );
285
290 bool deleteStyleById( const QString &providerKey, const QString &uri, const QString &styleId, QString &errCause );
291
297 bool saveStyle( const QString &providerKey, const QString &uri, const QString &qmlStyle, const QString &sldStyle,
298 const QString &styleName, const QString &styleDescription,
299 const QString &uiFileContent, bool useAsDefault, QString &errCause );
300
306 QString loadStyle( const QString &providerKey, const QString &uri, QString &errCause );
307
317 QString loadStoredStyle( const QString &providerKey, const QString &uri, QString &styleName, QString &errCause );
318
334 bool saveLayerMetadata( const QString &providerKey, const QString &uri, const QgsLayerMetadata &metadata, QString &errorMessage SIP_OUT ) SIP_THROW( QgsNotSupportedException );
335
340 bool createDb( const QString &providerKey, const QString &dbPath, QString &errCause );
341
346 QgsTransaction *createTransaction( const QString &providerKey, const QString &connString ) SIP_FACTORY;
347
358 Q_DECL_DEPRECATED QFunctionPointer function( const QString &providerKey, const QString &functionName ) const SIP_DEPRECATED;
359
369 Q_DECL_DEPRECATED QLibrary *createProviderLibrary( const QString &providerKey ) const SIP_FACTORY SIP_DEPRECATED;
370
372 QStringList providerList() const;
373
375 QgsProviderMetadata *providerMetadata( const QString &providerKey ) const;
376
383 QSet< QString > providersForLayerType( Qgis::LayerType type ) const;
384
392 class CORE_EXPORT ProviderCandidateDetails
393 {
394
395 public:
396
400 ProviderCandidateDetails( QgsProviderMetadata *metadata, const QList< Qgis::LayerType > &layerTypes )
401 : mMetadata( metadata )
402 , mLayerTypes( layerTypes )
403 {}
404
408 QgsProviderMetadata *metadata() const { return mMetadata; }
409
414 QList<Qgis::LayerType> layerTypes() const { return mLayerTypes; }
415
416#ifdef SIP_RUN
417 SIP_PYOBJECT __repr__();
418 % MethodCode
419 QString str = QStringLiteral( "<QgsProviderRegistry.ProviderCandidateDetails: %1>" ).arg( sipCpp->metadata()->key() );
420 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
421 % End
422#endif
423
424 private:
425 QgsProviderMetadata *mMetadata = nullptr;
426
427 QList< Qgis::LayerType > mLayerTypes;
428
429 };
430
447 QList< QgsProviderRegistry::ProviderCandidateDetails > preferredProvidersForUri( const QString &uri ) const;
448
460 class CORE_EXPORT UnusableUriDetails
461 {
462 public:
463
470 UnusableUriDetails( const QString &uri = QString(), const QString &warning = QString(), const QList< Qgis::LayerType > &layerTypes = QList< Qgis::LayerType >() )
471 : uri( uri )
472 , warning( warning )
473 , layerTypes( layerTypes )
474 {}
475
479 QString uri;
480
484 QString warning;
485
490
495 QList<Qgis::LayerType> layerTypes;
496
497#ifdef SIP_RUN
498 SIP_PYOBJECT __repr__();
499 % MethodCode
500 QString str = QStringLiteral( "<QgsProviderRegistry.UnusableUriDetails: %1>" ).arg( sipCpp->warning );
501 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
502 % End
503#endif
504
505 };
506
520 {
521
522 public:
523
524 virtual ~UnusableUriHandlerInterface() = default;
525
529 virtual bool matchesUri( const QString &uri ) const = 0;
530
534 virtual UnusableUriDetails details( const QString &uri ) const = 0;
535
536 };
537
548 bool registerUnusableUriHandler( UnusableUriHandlerInterface *handler SIP_TRANSFER );
549
573 bool handleUnusableUri( const QString &uri, UnusableUriDetails &details SIP_OUT ) const;
574
591 bool shouldDeferUriForOtherProviders( const QString &uri, const QString &providerKey ) const;
592
606 bool uriIsBlocklisted( const QString &uri ) const;
607
619 QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const;
620
633 QString fileVectorFilters() const;
634
649 QString fileRasterFilters() const;
650
666 QString fileMeshFilters() const;
667
678 QString fileMeshDatasetFilters() const;
679
694 QString filePointCloudFilters() const;
695
710 QString fileVectorTileFilters() const;
711
726 QString fileTiledSceneFilters() const;
727
729 QString databaseDrivers() const;
731 QString directoryDrivers() const;
733 QString protocolDrivers() const;
734
738 Q_DECL_DEPRECATED void registerGuis( QWidget *widget ) SIP_DEPRECATED;
739
746 bool registerProvider( QgsProviderMetadata *providerMetadata SIP_TRANSFER );
747
749 SIP_SKIP typedef std::map<QString, QgsProviderMetadata *> Providers;
750
751 private:
753 QgsProviderRegistry( const QString &pluginPath );
754
755#ifdef SIP_RUN
756 QgsProviderRegistry( const QString &pluginPath );
757#endif
758
759 void init();
760 void clean();
761
763 Providers mProviders;
764
766 QDir mLibraryDirectory;
767
768 void rebuildFilterStrings();
769
779 QString mVectorFileFilters;
780
784 QString mRasterFileFilters;
785
789 QString mMeshFileFilters;
790
794 QString mMeshDatasetFileFilters;
795
799 QString mPointCloudFileFilters;
800
804 QString mVectorTileFileFilters;
805
809 QString mTiledSceneFileFilters;
810
817 QString mDatabaseDrivers;
818
824 QString mDirectoryDrivers;
825
832 QString mProtocolDrivers;
833
834 QList< UnusableUriHandlerInterface * > mUnusableUriHandlers;
835
839 static bool exists();
840
841 friend class QgsApplication;
842
843}; // class QgsProviderRegistry
844
845#endif //QGSPROVIDERREGISTRY_H
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:54
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
Definition qgis.h:450
QFlags< SublayerQueryFlag > SublayerQueryFlags
Sublayer query flags.
Definition qgis.h:1362
Extends QApplication to provide access to QGIS specific resources such as theme paths,...
Represents a coordinate reference system (CRS).
Interface for providers that add custom data items to the browser tree.
Base class for all items in the model.
Definition qgsdataitem.h:46
Abstract base class for spatial data provider implementations.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
Container of fields for a vector layer.
Definition qgsfields.h:46
A structured metadata store for a map layer.
Custom exception class which is raised when an operation is not supported.
Holds data provider key, description, and associated shared library file or function pointer informat...
Contains information pertaining to a candidate provider.
QList< Qgis::LayerType > layerTypes() const
Returns a list of map layer types which are valid options for opening the target using this candidate...
QgsProviderMetadata * metadata() const
Returns the candidate provider metadata.
ProviderCandidateDetails(QgsProviderMetadata *metadata, const QList< Qgis::LayerType > &layerTypes)
Constructor for ProviderCandidateDetails, with the specified provider metadata and valid candidate la...
Contains information about unusable URIs which aren't handled by any registered providers.
QString warning
Contains a short, user-friendly, translated message advising why the URI is not usable.
QString uri
URI which could not be handled.
QString detailedWarning
Contains a longer, user-friendly, translated message advising why the URI is not usable.
UnusableUriDetails(const QString &uri=QString(), const QString &warning=QString(), const QList< Qgis::LayerType > &layerTypes=QList< Qgis::LayerType >())
Constructor for UnusableUriDetails for the given uri, with the specified user-friendly,...
QList< Qgis::LayerType > layerTypes
Contains a list of map layer types which are usually valid options for opening the target URI.
An interface used to handle unusable URIs which aren't handled by any registered providers,...
virtual UnusableUriDetails details(const QString &uri) const =0
Returns the details for advising the user why the uri is not usable.
virtual bool matchesUri(const QString &uri) const =0
Returns true if the handle is an unusable URI handler for the specified uri.
A registry / canonical manager of data providers.
std::map< QString, QgsProviderMetadata * > Providers
Type for data provider metadata associative container.
WidgetMode
Different ways a source select dialog can be used.
@ Standalone
Basic mode when the widget is used as a standalone dialog.
@ Embedded
Used for the data source manager dialog where the widget is embedded as the main content for a partic...
@ Manager
Used by data items for QgsDataItem::paramWidget().
Contains details about a sub layer available from a dataset.
Base class for raster data providers.
A container for the context for various read/write operations on objects.
Allows creation of a multi-layer database-side transaction.
Represents a vector layer which manages a vector based dataset.
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_TRANSFERBACK
Definition qgis_sip.h:48
#define SIP_FACTORY
Definition qgis_sip.h:76
#define SIP_THROW(name,...)
Definition qgis_sip.h:203
const QgsCoordinateReferenceSystem & crs
Setting options for creating vector data providers.