QGIS API Documentation 3.30.0-'s-Hertogenbosch (f186b8efe0)
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
32#include <vector>
33#include <memory>
34
36class QgsVectorLayer;
39class QgsDataItem;
41class QgsTransaction;
42class QgsFields;
44class QgsFeedback;
45
60class CORE_EXPORT QgsProviderRegistry
61{
62
63 public:
64
65 // TODO QGIS 4 - either move to QgsAbstractDataSourceWidget or remove altogether
66
71 {
72
79
85
92 };
93
95 static QgsProviderRegistry *instance( const QString &pluginPath = QString() );
96
98
107 Q_DECL_DEPRECATED QString library( const QString &providerKey ) const SIP_DEPRECATED;
108
110 QString pluginList( bool asHtml = false ) const;
111
115 QDir libraryDirectory() const;
116
118 void setLibraryDirectory( const QDir &path );
119
120 /*
121 * IMPORTANT: While it seems like /Factory/ would be the correct annotation here, that's not
122 * the case.
123 * Paraphrasing Phil Thomson's advice on https://www.riverbankcomputing.com/pipermail/pyqt/2017-July/039450.html:
124 *
125 * "
126 * /Factory/ is used when the instance returned is guaranteed to be new to Python.
127 * In this case it isn't because it has already been seen when being returned by by the python function
128 * creating the provider subclass.
129 *
130 * (However for a different sub-class implemented in C++ then it would be the first time it was seen
131 * by Python so the /Factory/ on create() would be correct.)
132 *
133 * You might try using /TransferBack/ on createProvider() instead - that might be the best compromise.
134 * "
135 */
136
147 QgsDataProvider *createProvider( const QString &providerKey,
148 const QString &dataSource,
150 QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) SIP_TRANSFERBACK;
151
158 Q_DECL_DEPRECATED int providerCapabilities( const QString &providerKey ) const SIP_DEPRECATED;
159
165 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 );
166
173 QgsRasterDataProvider *createRasterDataProvider(
174 const QString &providerKey,
175 const QString &uri,
176 const QString &format,
177 int nBands,
178 Qgis::DataType type,
179 int width, int height,
180 double *geoTransform,
182 const QStringList &createOptions = QStringList() ) SIP_FACTORY;
183
189 QList<QPair<QString, QString> > pyramidResamplingMethods( const QString &providerKey );
190
199 QVariantMap decodeUri( const QString &providerKey, const QString &uri );
200
210 QString encodeUri( const QString &providerKey, const QVariantMap &parts );
211
223 QString absoluteToRelativeUri( const QString &providerKey, const QString &uri, const QgsReadWriteContext &context ) const;
224
236 QString relativeToAbsoluteUri( const QString &providerKey, const QString &uri, const QgsReadWriteContext &context ) const;
237
244 Q_DECL_DEPRECATED QWidget *createSelectionWidget( const QString &providerKey, QWidget *parent = nullptr, Qt::WindowFlags fl = Qt::WindowFlags(), QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::None ) SIP_DEPRECATED;
245
251 QList< QgsDataItemProvider * > dataItemProviders( const QString &providerKey ) const SIP_FACTORY;
252
258 int listStyles( const QString &providerKey,
259 const QString &uri,
260 QStringList &ids,
261 QStringList &names,
262 QStringList &descriptions,
263 QString &errCause );
264
277 bool styleExists( const QString &providerKey, const QString &uri, const QString &styleId, QString &errorCause SIP_OUT );
278
286 QString getStyleById( const QString &providerKey, const QString &uri, const QString &styleId, QString &errCause );
287
292 bool deleteStyleById( const QString &providerKey, const QString &uri, const QString &styleId, QString &errCause );
293
299 bool saveStyle( const QString &providerKey, const QString &uri, const QString &qmlStyle, const QString &sldStyle,
300 const QString &styleName, const QString &styleDescription,
301 const QString &uiFileContent, bool useAsDefault, QString &errCause );
302
308 QString loadStyle( const QString &providerKey, const QString &uri, QString &errCause );
309
319 QString loadStoredStyle( const QString &providerKey, const QString &uri, QString &styleName, QString &errCause );
320
336 bool saveLayerMetadata( const QString &providerKey, const QString &uri, const QgsLayerMetadata &metadata, QString &errorMessage SIP_OUT ) SIP_THROW( QgsNotSupportedException );
337
342 bool createDb( const QString &providerKey, const QString &dbPath, QString &errCause );
343
348 QgsTransaction *createTransaction( const QString &providerKey, const QString &connString ) SIP_FACTORY;
349
360 Q_DECL_DEPRECATED QFunctionPointer function( const QString &providerKey, const QString &functionName ) const SIP_DEPRECATED;
361
371 Q_DECL_DEPRECATED QLibrary *createProviderLibrary( const QString &providerKey ) const SIP_FACTORY SIP_DEPRECATED;
372
374 QStringList providerList() const;
375
377 QgsProviderMetadata *providerMetadata( const QString &providerKey ) const;
378
385 QSet< QString > providersForLayerType( Qgis::LayerType type ) const;
386
394 class CORE_EXPORT ProviderCandidateDetails
395 {
396
397 public:
398
402 ProviderCandidateDetails( QgsProviderMetadata *metadata, const QList< Qgis::LayerType > &layerTypes )
403 : mMetadata( metadata )
404 , mLayerTypes( layerTypes )
405 {}
406
410 QgsProviderMetadata *metadata() const { return mMetadata; }
411
416 QList<Qgis::LayerType> layerTypes() const { return mLayerTypes; }
417
418#ifdef SIP_RUN
419 SIP_PYOBJECT __repr__();
420 % MethodCode
421 QString str = QStringLiteral( "<QgsProviderRegistry.ProviderCandidateDetails: %1>" ).arg( sipCpp->metadata()->key() );
422 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
423 % End
424#endif
425
426 private:
427 QgsProviderMetadata *mMetadata = nullptr;
428
429 QList< Qgis::LayerType > mLayerTypes;
430
431 };
432
449 QList< QgsProviderRegistry::ProviderCandidateDetails > preferredProvidersForUri( const QString &uri ) const;
450
462 class CORE_EXPORT UnusableUriDetails
463 {
464 public:
465
472 UnusableUriDetails( const QString &uri = QString(), const QString &warning = QString(), const QList< Qgis::LayerType > &layerTypes = QList< Qgis::LayerType >() )
473 : uri( uri )
474 , warning( warning )
475 , layerTypes( layerTypes )
476 {}
477
481 QString uri;
482
486 QString warning;
487
492
497 QList<Qgis::LayerType> layerTypes;
498
499#ifdef SIP_RUN
500 SIP_PYOBJECT __repr__();
501 % MethodCode
502 QString str = QStringLiteral( "<QgsProviderRegistry.UnusableUriDetails: %1>" ).arg( sipCpp->warning );
503 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
504 % End
505#endif
506
507 };
508
522 {
523
524 public:
525
526 virtual ~UnusableUriHandlerInterface() = default;
527
531 virtual bool matchesUri( const QString &uri ) const = 0;
532
536 virtual UnusableUriDetails details( const QString &uri ) const = 0;
537
538 };
539
550 bool registerUnusableUriHandler( UnusableUriHandlerInterface *handler SIP_TRANSFER );
551
575 bool handleUnusableUri( const QString &uri, UnusableUriDetails &details SIP_OUT ) const;
576
593 bool shouldDeferUriForOtherProviders( const QString &uri, const QString &providerKey ) const;
594
608 bool uriIsBlocklisted( const QString &uri ) const;
609
621 QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const;
622
633 QString fileVectorFilters() const;
634
647 QString fileRasterFilters() const;
648
662 QString fileMeshFilters() const;
663
674 QString fileMeshDatasetFilters() const;
675
688 QString filePointCloudFilters() const;
689
691 QString databaseDrivers() const;
693 QString directoryDrivers() const;
695 QString protocolDrivers() const;
696
700 Q_DECL_DEPRECATED void registerGuis( QWidget *widget ) SIP_DEPRECATED;
701
708 bool registerProvider( QgsProviderMetadata *providerMetadata SIP_TRANSFER );
709
711 SIP_SKIP typedef std::map<QString, QgsProviderMetadata *> Providers;
712
713 private:
715 QgsProviderRegistry( const QString &pluginPath );
716
717#ifdef SIP_RUN
718 QgsProviderRegistry( const QString &pluginPath );
719#endif
720
721 void init();
722 void clean();
723
725 Providers mProviders;
726
728 QDir mLibraryDirectory;
729
739 QString mVectorFileFilters;
740
744 QString mRasterFileFilters;
745
749 QString mMeshFileFilters;
750
754 QString mMeshDatasetFileFilters;
755
759 QString mPointCloudFileFilters;
760
767 QString mDatabaseDrivers;
768
774 QString mDirectoryDrivers;
775
782 QString mProtocolDrivers;
783
784 QList< UnusableUriHandlerInterface * > mUnusableUriHandlers;
785
789 static bool exists();
790
791 friend class QgsApplication;
792
793}; // class QgsProviderRegistry
794
795#endif //QGSPROVIDERREGISTRY_H
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:55
Extends QApplication to provide access to QGIS specific resources such as theme paths,...
This class represents a coordinate reference system (CRS).
This is the interface for those who want to 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:45
Container of fields for a vector layer.
Definition: qgsfields.h:45
A structured metadata store for a map layer.
Custom exception class which is raised when an operation is not supported.
Definition: qgsexception.h:118
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.
@ Embedded
Used for the data source manager dialog where the widget is embedded as the main content for a partic...
@ None
Basic mode when the widget is used as a standalone dialog.
@ Manager
Used by data items for QgsDataItem::paramWidget().
Contains details about a sub layer available from a dataset.
Base class for raster data providers.
The class is used as a container of context for various read/write operations on other objects.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
Represents a vector layer which manages a vector based data sets.
#define str(x)
Definition: qgis.cpp:37
#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:198
const QgsCoordinateReferenceSystem & crs
Setting options for creating vector data providers.