QGIS API Documentation  3.27.0-Master (597e8eebd4)
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 #include "qgsdataprovider.h"
21 #include "qgsmaplayer.h"
22 #include "qgsexception.h"
25 
27  QString const &description,
28  QString const &library )
29  : mKey( key )
30  , mDescription( description )
31  , mLibrary( library )
32 {}
33 
34 QgsProviderMetadata::QgsProviderMetadata( const QString &key, const QString &description, const CreateDataProviderFunction &createFunc )
35  : mKey( key )
36  , mDescription( description )
37  , mCreateFunction( createFunc )
38 {}
39 
41 {
42  qDeleteAll( mProviderConnections );
43 }
44 
45 QString QgsProviderMetadata::key() const
46 {
47  return mKey;
48 }
49 
51 {
52  return mDescription;
53 }
54 
56 {
57  return QIcon();
58 }
59 
60 QgsProviderMetadata::ProviderMetadataCapabilities QgsProviderMetadata::capabilities() const
61 {
62  return QgsProviderMetadata::ProviderMetadataCapabilities();
63 }
64 
65 QgsProviderMetadata::ProviderCapabilities QgsProviderMetadata::providerCapabilities() const
66 {
67  return QgsProviderMetadata::ProviderCapabilities();
68 }
69 
70 QList<QgsMapLayerType> QgsProviderMetadata::supportedLayerTypes() const
71 {
72  return {};
73 }
74 
76 {
77  return mLibrary;
78 }
79 
81 {
82  return mCreateFunction;
83 }
84 
86 {
87 
88 }
89 
91 {
92 
93 }
94 
96 {
97  return QString();
98 }
99 
100 QList<QgsMeshDriverMetadata> QgsProviderMetadata::meshDriversMetadata()
101 {
102  return QList<QgsMeshDriverMetadata>();
103 }
104 
105 int QgsProviderMetadata::priorityForUri( const QString & ) const
106 {
107  return 0;
108 }
109 
110 QList<QgsMapLayerType> QgsProviderMetadata::validLayerTypesForUri( const QString & ) const
111 {
112  return QList<QgsMapLayerType>();
113 }
114 
115 bool QgsProviderMetadata::uriIsBlocklisted( const QString & ) const
116 {
117  return false;
118 }
119 
120 QStringList QgsProviderMetadata::sidecarFilesForUri( const QString & ) const
121 {
122  return QStringList();
123 }
124 
125 QList<QgsProviderSublayerDetails> QgsProviderMetadata::querySublayers( const QString &, Qgis::SublayerQueryFlags, QgsFeedback * ) const
126 {
127  return QList<QgsProviderSublayerDetails>();
128 }
129 
131  const QgsDataProvider::ProviderOptions &options,
132  QgsDataProvider::ReadFlags flags )
133 {
134  if ( mCreateFunction )
135  {
136  return mCreateFunction( uri, options, flags );
137  }
138  return nullptr;
139 }
140 
141 void QgsProviderMetadata::setBoolParameter( QVariantMap &uri, const QString &parameter, const QVariant &value )
142 {
143  if ( value.toString().compare( QStringLiteral( "yes" ), Qt::CaseInsensitive ) == 0 ||
144  value.toString().compare( QStringLiteral( "1" ), Qt::CaseInsensitive ) == 0 ||
145  value.toString().compare( QStringLiteral( "true" ), Qt::CaseInsensitive ) == 0 )
146  {
147  uri[ parameter ] = true;
148  }
149  else if ( value.toString().compare( QStringLiteral( "no" ), Qt::CaseInsensitive ) == 0 ||
150  value.toString().compare( QStringLiteral( "0" ), Qt::CaseInsensitive ) == 0 ||
151  value.toString().compare( QStringLiteral( "false" ), Qt::CaseInsensitive ) == 0 )
152  {
153  uri[ parameter ] = false;
154  }
155 }
156 
157 bool QgsProviderMetadata::boolParameter( const QVariantMap &uri, const QString &parameter, bool defaultValue )
158 {
159  if ( uri.value( parameter, QString() ).toString().compare( QStringLiteral( "yes" ), Qt::CaseInsensitive ) == 0 ||
160  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "1" ), Qt::CaseInsensitive ) == 0 ||
161  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "true" ), Qt::CaseInsensitive ) == 0 )
162  {
163  return true;
164  }
165  else if ( uri.value( parameter, QString() ).toString().compare( QStringLiteral( "no" ), Qt::CaseInsensitive ) == 0 ||
166  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "0" ), Qt::CaseInsensitive ) == 0 ||
167  uri.value( parameter, QString() ).toString().compare( QStringLiteral( "false" ), Qt::CaseInsensitive ) == 0 )
168  {
169  return false;
170  }
171 
172  return defaultValue;
173 }
174 
175 QVariantMap QgsProviderMetadata::decodeUri( const QString & ) const
176 {
177  return QVariantMap();
178 }
179 
180 QString QgsProviderMetadata::encodeUri( const QVariantMap & ) const
181 {
182  return QString();
183 }
184 
186  const QString &, const QgsFields &,
188  bool, QMap<int, int> &,
189  QString &errorMessage, const QMap<QString, QVariant> * )
190 {
191  errorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "createEmptyLayer" ) );
192  return Qgis::VectorExportResult::ErrorProviderUnsupportedFeature;
193 }
194 
196  const QString &, const QString &,
197  int, Qgis::DataType, int,
198  int, double *,
200  const QStringList & )
201 {
202  return nullptr;
203 }
204 
206  const QString &,
207  const QString &,
208  const QgsCoordinateReferenceSystem & ) const
209 {
210  return false;
211 }
212 
214  const QString &,
215  const QgsCoordinateReferenceSystem & ) const
216 {
217  return false;
218 }
219 
220 QList<QPair<QString, QString> > QgsProviderMetadata::pyramidResamplingMethods()
221 {
222  return QList<QPair<QString, QString> >();
223 }
224 
225 QList<QgsDataItemProvider *> QgsProviderMetadata::dataItemProviders() const
226 {
227  return QList<QgsDataItemProvider *>();
228 }
229 
230 int QgsProviderMetadata::listStyles( const QString &, QStringList &, QStringList &,
231  QStringList &, QString &errCause )
232 {
233  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "listStyles" ) );
234  return -1;
235 }
236 
237 bool QgsProviderMetadata::styleExists( const QString &, const QString &, QString &errorCause )
238 {
239  errorCause.clear();
240  return false;
241 }
242 
243 QString QgsProviderMetadata::getStyleById( const QString &, const QString &, QString &errCause )
244 {
245  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "getStyleById" ) );
246  return QString();
247 }
248 
249 bool QgsProviderMetadata::deleteStyleById( const QString &, const QString &, QString &errCause )
250 {
251  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "deleteStyleById" ) );
252  return false;
253 }
254 
255 bool QgsProviderMetadata::saveStyle( const QString &, const QString &, const QString &, const QString &,
256  const QString &, const QString &, bool, QString &errCause )
257 {
258  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "saveStyle" ) );
259  return false;
260 }
261 
262 QString QgsProviderMetadata::loadStyle( const QString &, QString &errCause )
263 {
264  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "loadStyle" ) );
265  return QString();
266 }
267 
268 bool QgsProviderMetadata::saveLayerMetadata( const QString &, const QgsLayerMetadata &, QString & )
269 {
270  throw QgsNotSupportedException( QObject::tr( "Provider %1 does not support writing layer metadata" ).arg( key() ) );
271 }
272 
273 bool QgsProviderMetadata::createDb( const QString &, QString &errCause )
274 {
275  errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "createDb" ) );
276  return false;
277 }
278 
280 {
281  return nullptr;
282 }
283 
284 QMap<QString, QgsAbstractProviderConnection *> QgsProviderMetadata::connections( bool cached )
285 {
286  Q_UNUSED( cached );
287  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connections" ) ) );
288 }
289 
290 QMap<QString, QgsAbstractDatabaseProviderConnection *> QgsProviderMetadata::dbConnections( bool cached )
291 {
292  return connections<QgsAbstractDatabaseProviderConnection>( cached ) ;
293 }
294 
296 {
297  const QMap<QString, QgsAbstractProviderConnection *> constConns { connections( cached ) };
298  const QStringList constKeys { constConns.keys( ) };
299  for ( const QString &key : constKeys )
300  {
301  if ( key == name )
302  {
303  return constConns.value( key );
304  }
305  }
306  return nullptr;
307 }
308 
310 {
311  Q_UNUSED( name );
312  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connection" ) ) );
313 }
314 
315 
316 QgsAbstractProviderConnection *QgsProviderMetadata::createConnection( const QString &uri, const QVariantMap &configuration )
317 {
318  Q_UNUSED( configuration );
319  Q_UNUSED( uri );
320  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connection" ) ) );
321 }
322 
323 void QgsProviderMetadata::deleteConnection( const QString &name )
324 {
325  Q_UNUSED( name );
326  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "deleteConnection" ) ) );
327 }
328 
329 void QgsProviderMetadata::saveConnection( const QgsAbstractProviderConnection *connection, const QString &name )
330 {
331  Q_UNUSED( connection )
332  Q_UNUSED( name )
333  throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "saveConnection" ) ) );
334 }
335 
337 void QgsProviderMetadata::saveConnectionProtected( const QgsAbstractProviderConnection *conn, const QString &name )
338 {
339  const bool isNewConnection = !connections().contains( name );
340  conn->store( name );
341  mProviderConnections.clear();
342 
343  if ( !isNewConnection )
344  emit connectionChanged( name );
345  else
346  emit connectionCreated( name );
347 }
349 
350 template<typename T>
351 QMap<QString, T *> QgsProviderMetadata::connections( bool cached )
352 {
353  QMap<QString, T *> result;
354  const auto constConns { connections( cached ) };
355  const QStringList constConnKeys { constConns.keys() };
356  for ( const auto &c : constConnKeys )
357  {
358  T *casted { static_cast<T *>( constConns.value( c ) ) };
359  if ( casted )
360  {
361  result.insert( c, casted );
362  }
363  }
364  return result;
365 }
366 
368 
370  const QString &description,
371  const MeshDriverCapabilities &capabilities,
372  const QString &writeDatasetOnfileSuffix )
373  : mName( name )
374  , mDescription( description )
375  , mCapabilities( capabilities )
376  , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
377 {
378 }
379 
381  const QString &description,
382  const MeshDriverCapabilities &capabilities,
383  const QString &writeDatasetOnfileSuffix,
384  const QString &writeMeshFrameOnFileSuffix,
385  int maxVerticesPerface )
386  : mName( name )
387  , mDescription( description )
388  , mCapabilities( capabilities )
389  , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
390  , mWriteMeshFrameOnFileSuffix( ( writeMeshFrameOnFileSuffix ) )
391  , mMaxVerticesPerFace( maxVerticesPerface )
392 {
393 }
394 
395 QgsMeshDriverMetadata::MeshDriverCapabilities QgsMeshDriverMetadata::capabilities() const
396 {
397  return mCapabilities;
398 }
399 
401 {
402  return mName;
403 }
404 
406 {
407  return mDescription;
408 }
409 
411 {
412  return mWriteDatasetOnFileSuffix;
413 }
414 
416 {
417  return mWriteMeshFrameOnFileSuffix;
418 }
419 
421 {
422  return mMaxVerticesPerFace;
423 }
VectorExportResult
Vector layer export result codes.
Definition: qgis.h:450
DataType
Raster data types.
Definition: qgis.h:129
The QgsAbstractProviderConnection provides an interface for data provider connections.
virtual void store(const QString &name) const =0
Stores the connection in the settings.
This class represents a coordinate reference system (CRS).
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.
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.
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.
Definition: qgsexception.h:118
Custom exception class for provider connection related exceptions.
Definition: qgsexception.h:101
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...
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 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.
QgsAbstractProviderConnection * findConnection(const QString &name, bool cached=true) SIP_THROW(QgsProviderConnectionException)
Searches and returns a (possibly NULL) connection from the stored provider connections.
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...
FilterType
Type of file filters.
static bool boolParameter(const QVariantMap &uri, const QString &parameter, bool defaultValue=false)
Returns the parameter value in the uri as a bool.
std::function< QgsDataProvider *(const QString &, const QgsDataProvider::ProviderOptions &, QgsDataProvider::ReadFlags &) > CreateDataProviderFunction
Typedef for data provider creation function.
virtual bool deleteStyleById(const QString &uri, const QString &styleId, QString &errCause)
Deletes a layer style defined by styleId.
virtual ~QgsProviderMetadata()
dtor
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 QgsDataProvider * createProvider(const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags=QgsDataProvider::ReadFlags())
Class factory to return a pointer to a newly created QgsDataProvider object.
virtual QString filters(FilterType type)
Builds the list of file filter strings (supported formats)
virtual bool saveLayerMetadata(const QString &uri, const QgsLayerMetadata &metadata, QString &errorMessage) SIP_THROW(QgsNotSupportedException)
Saves metadata to the layer corresponding to the specified uri.
virtual QString encodeUri(const QVariantMap &parts) const
Reassembles a provider data source URI from its component paths (e.g.
QMap< QString, QgsAbstractDatabaseProviderConnection * > dbConnections(bool cached=true) SIP_THROW(QgsProviderConnectionException)
Returns a dictionary of database provider connections, the dictionary key is the connection identifie...
QString description() const
This returns descriptive text for the provider.
virtual bool createMeshData(const QgsMesh &mesh, const QString &fileName, const QString &driverName, const QgsCoordinateReferenceSystem &crs) 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.
void connectionChanged(const QString &name)
Emitted when the connection with the specified name is changed, e.g.
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 void saveConnection(const QgsAbstractProviderConnection *connection, const QString &name) SIP_THROW(QgsProviderConnectionException)
Stores the connection in the settings.
virtual QgsAbstractProviderConnection * createConnection(const QString &uri, const QVariantMap &configuration) SIP_THROW(QgsProviderConnectionException)
Creates a new connection from uri and configuration, the newly created connection is not automaticall...
virtual Qgis::VectorExportResult createEmptyLayer(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 void deleteConnection(const QString &name) SIP_THROW(QgsProviderConnectionException)
Removes the connection with the given name from 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 QList< QgsMapLayerType > supportedLayerTypes() const
Returns a list of the map layer types supported by the provider.
QgsProviderMetadata(const QString &key, const QString &description, const QString &library=QString())
Constructor for provider metadata.
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 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< QgsMapLayerType > 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 QList< QgsDataItemProvider * > dataItemProviders() const
Returns data item providers.
virtual QMap< QString, QgsAbstractProviderConnection * > connections(bool cached=true) SIP_THROW(QgsProviderConnectionException)
Returns a dictionary of stored provider connections, the dictionary key is the connection identifier.
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.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:70
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.