QGIS API Documentation 3.99.0-Master (7d2ca374f2d)
Loading...
Searching...
No Matches
qgsprovidermetadata.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprovidermetadata.cpp - Metadata class for
3 describing a data provider.
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#include "qgsprovidermetadata.h"
20
22#include "qgsdataprovider.h"
23#include "qgsexception.h"
24#include "qgsmaplayer.h"
26
27#include <QString>
28
29#include "moc_qgsprovidermetadata.cpp"
30
31using namespace Qt::StringLiterals;
32
34 QString const &description,
35 QString const &library )
36 : mKey( key )
37 , mDescription( description )
38 , mLibrary( library )
39{}
40
41QgsProviderMetadata::QgsProviderMetadata( const QString &key, const QString &description, const CreateDataProviderFunction &createFunc )
42 : mKey( key )
43 , mDescription( description )
44 , mCreateFunction( createFunc )
45{}
46
48{
49 qDeleteAll( mProviderConnections );
50}
51
53{
54 return mKey;
55}
56
58{
59 return mDescription;
60}
61
63{
64 return QIcon();
65}
66
71
76
77QList<Qgis::LayerType> QgsProviderMetadata::supportedLayerTypes() const
78{
79 return {};
80}
81
83{
84 return mLibrary;
85}
86
87QString QgsProviderMetadata::suggestGroupNameForUri( const QString & /*uri*/ ) const
88{
89 return QString();
90}
91
96
101
106
108{
109 return QString();
110}
111
112QList<QgsMeshDriverMetadata> QgsProviderMetadata::meshDriversMetadata()
113{
114 return QList<QgsMeshDriverMetadata>();
115}
116
117int QgsProviderMetadata::priorityForUri( const QString & ) const
118{
119 return 0;
120}
121
122QList<Qgis::LayerType> QgsProviderMetadata::validLayerTypesForUri( const QString & ) const
123{
124 return QList<Qgis::LayerType>();
125}
126
127bool QgsProviderMetadata::uriIsBlocklisted( const QString & ) const
128{
129 return false;
130}
131
132QStringList QgsProviderMetadata::sidecarFilesForUri( const QString & ) const
133{
134 return QStringList();
135}
136
137QList<QgsProviderSublayerDetails> QgsProviderMetadata::querySublayers( const QString &, Qgis::SublayerQueryFlags, QgsFeedback * ) const
138{
139 return QList<QgsProviderSublayerDetails>();
140}
141
145{
146 if ( mCreateFunction )
147 {
148 return mCreateFunction( uri, options, flags );
149 }
150 return nullptr;
151}
152
153void QgsProviderMetadata::setBoolParameter( QVariantMap &uri, const QString &parameter, const QVariant &value )
154{
155 if ( value.toString().compare( u"yes"_s, Qt::CaseInsensitive ) == 0 ||
156 value.toString().compare( u"1"_s, Qt::CaseInsensitive ) == 0 ||
157 value.toString().compare( u"true"_s, Qt::CaseInsensitive ) == 0 )
158 {
159 uri[ parameter ] = true;
160 }
161 else if ( value.toString().compare( u"no"_s, Qt::CaseInsensitive ) == 0 ||
162 value.toString().compare( u"0"_s, Qt::CaseInsensitive ) == 0 ||
163 value.toString().compare( u"false"_s, Qt::CaseInsensitive ) == 0 )
164 {
165 uri[ parameter ] = false;
166 }
167}
168
169bool QgsProviderMetadata::boolParameter( const QVariantMap &uri, const QString &parameter, bool defaultValue )
170{
171 if ( uri.value( parameter, QString() ).toString().compare( u"yes"_s, Qt::CaseInsensitive ) == 0 ||
172 uri.value( parameter, QString() ).toString().compare( u"1"_s, Qt::CaseInsensitive ) == 0 ||
173 uri.value( parameter, QString() ).toString().compare( u"true"_s, Qt::CaseInsensitive ) == 0 )
174 {
175 return true;
176 }
177 else if ( uri.value( parameter, QString() ).toString().compare( u"no"_s, Qt::CaseInsensitive ) == 0 ||
178 uri.value( parameter, QString() ).toString().compare( u"0"_s, Qt::CaseInsensitive ) == 0 ||
179 uri.value( parameter, QString() ).toString().compare( u"false"_s, Qt::CaseInsensitive ) == 0 )
180 {
181 return false;
182 }
183
184 return defaultValue;
185}
186
187QVariantMap QgsProviderMetadata::decodeUri( const QString & ) const
188{
189 return QVariantMap();
190}
191
192QString QgsProviderMetadata::encodeUri( const QVariantMap & ) const
193{
194 return QString();
195}
196
197QString QgsProviderMetadata::absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const
198{
199 return context.pathResolver().writePath( uri );
200}
201
202QString QgsProviderMetadata::relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const
203{
204 return context.pathResolver().readPath( uri );
205}
206
207QString QgsProviderMetadata::cleanUri( const QString &uri, Qgis::UriCleaningFlags flags ) const
208{
209 if ( flags.testFlag( Qgis::UriCleaningFlag::RemoveCredentials ) )
211 else if ( flags.testFlag( Qgis::UriCleaningFlag::RedactCredentials ) )
212 return QgsDataSourceUri::removePassword( uri, true );
213 return uri;
214}
215
216bool QgsProviderMetadata::urisReferToSame( const QString &, const QString &, Qgis::SourceHierarchyLevel ) const
217{
218 return false;
219}
220
223 bool, QMap<int, int> &,
224 QString &errorMessage, const QMap<QString, QVariant> *,
225 QString & )
226{
227 errorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"createEmptyLayer"_s );
229}
230
231bool QgsProviderMetadata::createDatabase( const QString &, QString &errorMessage )
232{
233 errorMessage = QObject::tr( "The %1 provider does not support database creation" ).arg( key() );
234 return false;
235}
236
238 const QString &, const QString &,
239 int, Qgis::DataType, int,
240 int, double *,
242 const QStringList & )
243{
244 return nullptr;
245}
246
248 const QString &,
249 const QString &,
251 const QMap<QString, QString> & ) const
252{
253 return false;
254}
255
257 const QString &,
259 const QMap<QString, QString> & ) const
260{
261 return false;
262}
263
264QList<QPair<QString, QString> > QgsProviderMetadata::pyramidResamplingMethods()
265{
266 return QList<QPair<QString, QString> >();
267}
268
269QList<QgsDataItemProvider *> QgsProviderMetadata::dataItemProviders() const
270{
271 return QList<QgsDataItemProvider *>();
272}
273
274int QgsProviderMetadata::listStyles( const QString &, QStringList &, QStringList &,
275 QStringList &, QString &errCause )
276{
277 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"listStyles"_s );
278 return -1;
279}
280
281
282bool QgsProviderMetadata::styleExists( const QString &, const QString &, QString &errorCause )
283{
284 errorCause.clear();
285 return false;
286}
287
288QString QgsProviderMetadata::getStyleById( const QString &, const QString &, QString &errCause )
289{
290 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"getStyleById"_s );
291 return QString();
292}
293
294bool QgsProviderMetadata::deleteStyleById( const QString &, const QString &, QString &errCause )
295{
296 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"deleteStyleById"_s );
297 return false;
298}
299
300bool QgsProviderMetadata::saveStyle( const QString &, const QString &, const QString &, const QString &,
301 const QString &, const QString &, bool, QString &errCause )
302{
303 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"saveStyle"_s );
304 return false;
305}
306
307QString QgsProviderMetadata::loadStyle( const QString &, QString &errCause )
308{
309 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"loadStyle"_s );
310 return QString();
311}
312
313QString QgsProviderMetadata::loadStoredStyle( const QString &, QString &, QString &errCause )
314{
315 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"loadStoredStyle"_s );
316 return QString();
317}
318
319bool QgsProviderMetadata::saveLayerMetadata( const QString &, const QgsLayerMetadata &, QString & )
320{
321 throw QgsNotSupportedException( QObject::tr( "Provider %1 does not support writing layer metadata" ).arg( key() ) );
322}
323
324bool QgsProviderMetadata::createDb( const QString &, QString &errCause )
325{
326 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"createDb"_s );
327 return false;
328}
329
331{
332 return nullptr;
333}
334
335QMap<QString, QgsAbstractProviderConnection *> QgsProviderMetadata::connections( bool cached )
336{
337 Q_UNUSED( cached );
338 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"connections"_s ) );
339}
340
341QMap<QString, QgsAbstractDatabaseProviderConnection *> QgsProviderMetadata::dbConnections( bool cached )
342{
344}
345
347{
348 const QMap<QString, QgsAbstractProviderConnection *> constConns { connections( cached ) };
349 const QStringList constKeys { constConns.keys( ) };
350 for ( const QString &key : constKeys )
351 {
352 if ( key == name )
353 {
354 return constConns.value( key );
355 }
356 }
357 return nullptr;
358}
359
361{
362 Q_UNUSED( name );
363 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"createConnection"_s ) );
364}
365
366
367QgsAbstractProviderConnection *QgsProviderMetadata::createConnection( const QString &uri, const QVariantMap &configuration )
368{
369 Q_UNUSED( configuration );
370 Q_UNUSED( uri );
371 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"createConnection"_s ) );
372}
373
374void QgsProviderMetadata::deleteConnection( const QString &name )
375{
376 Q_UNUSED( name );
377 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"deleteConnection"_s ) );
378}
379
380void QgsProviderMetadata::saveConnection( const QgsAbstractProviderConnection *connection, const QString &name )
381{
382 Q_UNUSED( connection )
383 Q_UNUSED( name )
384 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), u"saveConnection"_s ) );
385}
386
388void QgsProviderMetadata::saveConnectionProtected( const QgsAbstractProviderConnection *conn, const QString &name )
389{
390 const bool isNewConnection = !connections().contains( name );
391 conn->store( name );
392 mProviderConnections.clear();
393
394 if ( !isNewConnection )
395 emit connectionChanged( name );
396 else
397 emit connectionCreated( name );
398}
400
401template<typename T>
402QMap<QString, T *> QgsProviderMetadata::connections( bool cached )
403{
404 QMap<QString, T *> result;
405 const auto constConns { connections( cached ) };
406 const QStringList constConnKeys { constConns.keys() };
407 for ( const auto &c : constConnKeys )
408 {
409 T *casted { static_cast<T *>( constConns.value( c ) ) };
410 if ( casted )
411 {
412 result.insert( c, casted );
413 }
414 }
415 return result;
416}
417
419
421 const QString &description,
423 const QString &writeDatasetOnfileSuffix )
424 : mName( name )
425 , mDescription( description )
426 , mCapabilities( capabilities )
427 , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
428{
429}
430
432 const QString &description,
434 const QString &writeDatasetOnfileSuffix,
435 const QString &writeMeshFrameOnFileSuffix,
436 int maxVerticesPerface )
437 : mName( name )
438 , mDescription( description )
439 , mCapabilities( capabilities )
440 , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
441 , mWriteMeshFrameOnFileSuffix( ( writeMeshFrameOnFileSuffix ) )
442 , mMaxVerticesPerFace( maxVerticesPerface )
443{
444}
445
450
452{
453 return mName;
454}
455
457{
458 return mDescription;
459}
460
462{
463 return mWriteDatasetOnFileSuffix;
464}
465
467{
468 return mWriteMeshFrameOnFileSuffix;
469}
470
472{
473 return mMaxVerticesPerFace;
474}
QFlags< UriCleaningFlag > UriCleaningFlags
Flags for cleaning layer URIs.
Definition qgis.h:1442
FileFilterType
Type of file filters.
Definition qgis.h:1414
VectorExportResult
Vector layer export result codes.
Definition qgis.h:1073
@ ErrorProviderUnsupportedFeature
Provider does not support creation of empty layers.
Definition qgis.h:1083
@ RemoveCredentials
Completely remove credentials (eg passwords) from the URI. This flag is not compatible with the Redac...
Definition qgis.h:1432
@ RedactCredentials
Replace the value of credentials (eg passwords) with 'xxxxxxxx'. This flag is not compatible with the...
Definition qgis.h:1433
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
Definition qgis.h:507
DataType
Raster data types.
Definition qgis.h:390
QFlags< SublayerQueryFlag > SublayerQueryFlags
Sublayer query flags.
Definition qgis.h:1472
SourceHierarchyLevel
Defines the structural levels within a data source hierarchy.
Definition qgis.h:1451
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:291
An interface for data provider connections.
virtual void store(const QString &name) const =0
Stores the connection in the settings.
Represents a coordinate reference system (CRS).
Abstract base class for spatial data provider implementations.
static QString removePassword(const QString &aUri, bool hide=false)
Removes the password element from a URI.
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.
int maximumVerticesCountPerFace() const
Returns the maximum number of vertices per face supported by the driver.
QString writeDatasetOnFileSuffix() const
Returns the suffix used to write datasets on file.
MeshDriverCapabilities capabilities() const
Returns the capabilities for this driver.
QFlags< MeshDriverCapability > MeshDriverCapabilities
QString writeMeshFrameOnFileSuffix() const
Returns the suffix used to write mesh on file.
QString description() const
Returns the description for this driver.
QgsMeshDriverMetadata()
Constructs default metadata without any capabilities.
QString name() const
Returns the name (key) for this driver.
Custom exception class which is raised when an operation is not supported.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
Custom exception class for provider connection related exceptions.
QFlags< ProviderMetadataCapability > ProviderMetadataCapabilities
virtual bool uriIsBlocklisted(const QString &uri) const
Returns true if the specified uri is known by this provider to be something which should be blocklist...
QgsAbstractProviderConnection * findConnection(const QString &name, bool cached=true)
Searches and returns a (possibly nullptr) connection from the stored provider connections.
virtual QgsProviderMetadata::ProviderCapabilities providerCapabilities() const
Returns the provider's capabilities.
static void setBoolParameter(QVariantMap &uri, const QString &parameter, const QVariant &value)
Sets the value into the uri parameter as a bool.
virtual void deleteConnection(const QString &name)
Removes the connection with the given name from the settings.
virtual QgsRasterDataProvider * createRasterDataProvider(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 a new instance of the raster data provider.
Q_DECL_DEPRECATED CreateDataProviderFunction createFunction() const
Returns a pointer to the direct provider creation function, if supported by the provider.
QFlags< ProviderCapability > ProviderCapabilities
virtual QgsDataProvider * createProvider(const QString &uri, const QgsDataProvider::ProviderOptions &options, Qgis::DataProviderReadFlags flags=Qgis::DataProviderReadFlags())
Class factory to return a pointer to a newly created QgsDataProvider object.
virtual QIcon icon() const
Returns an icon representing the provider.
virtual int priorityForUri(const QString &uri) const
Returns an integer representing the priority which this provider should have when opening a dataset w...
QMap< QString, QgsAbstractDatabaseProviderConnection * > dbConnections(bool cached=true)
Returns a dictionary of database provider connections, the dictionary key is the connection identifie...
static bool boolParameter(const QVariantMap &uri, const QString &parameter, bool defaultValue=false)
Returns the parameter value in the uri as a bool.
virtual bool deleteStyleById(const QString &uri, const QString &styleId, QString &errCause)
Deletes a layer style defined by styleId.
virtual bool saveStyle(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.
virtual QString suggestGroupNameForUri(const QString &uri) const
Returns a name that can be used as a group name for sublayers retrieved from the specified uri.
std::function< QgsDataProvider *(const QString &, const QgsDataProvider::ProviderOptions &, Qgis::DataProviderReadFlags &) > CreateDataProviderFunction
Typedef for data provider creation function.
virtual QString encodeUri(const QVariantMap &parts) const
Reassembles a provider data source URI from its component paths (e.g.
virtual QString cleanUri(const QString &uri, Qgis::UriCleaningFlags flags=Qgis::UriCleaningFlag::RemoveCredentials) const
Cleans a layer uri, e.g.
virtual QList< Qgis::LayerType > validLayerTypesForUri(const QString &uri) const
Returns a list of valid layer types which the provider can be used with when opening the specified ur...
virtual QString absoluteToRelativeUri(const QString &uri, const QgsReadWriteContext &context) const
Converts absolute path(s) to relative path(s) in the given provider-specific URI.
QString description() const
This returns descriptive text for the provider.
virtual bool urisReferToSame(const QString &uri1, const QString &uri2, Qgis::SourceHierarchyLevel level=Qgis::SourceHierarchyLevel::Object) const
Returns true if the URI uri1 and uri2 point to the same resource at the specified hierarchy level.
virtual bool createMeshData(const QgsMesh &mesh, const QString &fileName, const QString &driverName, const QgsCoordinateReferenceSystem &crs, const QMap< QString, QString > &metadata=QMap< QString, QString >()) const
Creates mesh data source from a file name fileName and a driver driverName, that is the mesh frame st...
virtual bool styleExists(const QString &uri, const QString &styleId, QString &errorCause)
Returns true if a layer style with the specified styleId exists in the provider defined by uri.
virtual bool saveLayerMetadata(const QString &uri, const QgsLayerMetadata &metadata, QString &errorMessage)
Saves metadata to the layer corresponding to the specified uri.
void connectionChanged(const QString &name)
Emitted when the connection with the specified name is changed, e.g.
virtual QgsAbstractProviderConnection * createConnection(const QString &uri, const QVariantMap &configuration)
Creates a new connection from uri and configuration, the newly created connection is not automaticall...
virtual QStringList sidecarFilesForUri(const QString &uri) const
Given a uri, returns any sidecar files which are associated with the URI and this provider.
void connectionCreated(const QString &name)
Emitted when a connection with the specified name is created.
virtual QString filters(Qgis::FileFilterType type)
Builds the list of file filter strings (supported formats).
virtual void saveConnection(const QgsAbstractProviderConnection *connection, const QString &name)
Stores the connection in the settings.
QString key() const
This returns the unique key associated with the provider.
virtual QgsTransaction * createTransaction(const QString &connString)
Returns new instance of transaction.
virtual void initProvider()
Initialize the provider.
virtual QString getStyleById(const QString &uri, const QString &styleId, QString &errCause)
Gets a layer style defined by uri.
virtual QMap< QString, QgsAbstractProviderConnection * > connections(bool cached=true)
Returns a dictionary of stored provider connections, the dictionary key is the connection identifier.
virtual QString loadStoredStyle(const QString &uri, QString &styleName, QString &errCause)
Loads a layer style from the provider storage, reporting its name.
virtual QList< Qgis::LayerType > supportedLayerTypes() const
Returns a list of the map layer types supported by the provider.
virtual Qgis::VectorExportResult createEmptyLayer(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 &createdLayerUri)
Creates new empty vector layer.
QgsProviderMetadata(const QString &key, const QString &description, const QString &library=QString())
Constructor for provider metadata.
virtual bool createDatabase(const QString &uri, QString &errorMessage)
Creates a new empty database at the specified uri.
virtual QList< QgsProviderSublayerDetails > querySublayers(const QString &uri, Qgis::SublayerQueryFlags flags=Qgis::SublayerQueryFlags(), QgsFeedback *feedback=nullptr) const
Queries the specified uri and returns a list of any valid sublayers found in the dataset which can be...
virtual QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const
Returns the provider metadata capabilities.
virtual QString relativeToAbsoluteUri(const QString &uri, const QgsReadWriteContext &context) const
Converts relative path(s) to absolute path(s) in the given provider-specific URI.
virtual void cleanupProvider()
Cleanup the provider.
virtual QString loadStyle(const QString &uri, QString &errCause)
Loads a layer style defined by uri.
virtual int listStyles(const QString &uri, QStringList &ids, QStringList &names, QStringList &descriptions, QString &errCause)
Lists stored layer styles in the provider defined by uri.
virtual QList< QPair< QString, QString > > pyramidResamplingMethods()
Returns pyramid resampling methods available for provider.
virtual QList< QgsDataItemProvider * > dataItemProviders() const
Returns data item providers.
virtual QList< QgsMeshDriverMetadata > meshDriversMetadata()
Builds the list of available mesh drivers metadata.
virtual QVariantMap decodeUri(const QString &uri) const
Breaks a provider data source URI into its component paths (e.g.
Q_DECL_DEPRECATED QString library() const
This returns the library file name.
virtual bool createDb(const QString &dbPath, QString &errCause)
Creates database by the provider on the path.
Base class for raster data providers.
A container for the context for various read/write operations on objects.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
Allows creation of a multi-layer database-side transaction.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Setting options for creating vector data providers.
Mesh - vertices, edges and faces.