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"
23 #include "qgsabstractdatabaseproviderconnection.h"
24 #include "qgsprovidersublayerdetails.h"
25
QgsProviderMetadata(QString const & key,QString const & description,QString const & library)26 QgsProviderMetadata::QgsProviderMetadata( QString const &key,
27 QString const &description,
28 QString const &library )
29 : mKey( key )
30 , mDescription( description )
31 , mLibrary( library )
32 {}
33
QgsProviderMetadata(const QString & key,const QString & description,const CreateDataProviderFunction & createFunc)34 QgsProviderMetadata::QgsProviderMetadata( const QString &key, const QString &description, const CreateDataProviderFunction &createFunc )
35 : mKey( key )
36 , mDescription( description )
37 , mCreateFunction( createFunc )
38 {}
39
~QgsProviderMetadata()40 QgsProviderMetadata::~QgsProviderMetadata()
41 {
42 qDeleteAll( mProviderConnections );
43 }
44
key() const45 QString QgsProviderMetadata::key() const
46 {
47 return mKey;
48 }
49
description() const50 QString QgsProviderMetadata::description() const
51 {
52 return mDescription;
53 }
54
capabilities() const55 QgsProviderMetadata::ProviderMetadataCapabilities QgsProviderMetadata::capabilities() const
56 {
57 return QgsProviderMetadata::ProviderMetadataCapabilities();
58 }
59
providerCapabilities() const60 QgsProviderMetadata::ProviderCapabilities QgsProviderMetadata::providerCapabilities() const
61 {
62 return QgsProviderMetadata::ProviderCapabilities();
63 }
64
library() const65 QString QgsProviderMetadata::library() const
66 {
67 return mLibrary;
68 }
69
createFunction() const70 QgsProviderMetadata::CreateDataProviderFunction QgsProviderMetadata::createFunction() const
71 {
72 return mCreateFunction;
73 }
74
initProvider()75 void QgsProviderMetadata::initProvider()
76 {
77
78 }
79
cleanupProvider()80 void QgsProviderMetadata::cleanupProvider()
81 {
82
83 }
84
filters(FilterType)85 QString QgsProviderMetadata::filters( FilterType )
86 {
87 return QString();
88 }
89
meshDriversMetadata()90 QList<QgsMeshDriverMetadata> QgsProviderMetadata::meshDriversMetadata()
91 {
92 return QList<QgsMeshDriverMetadata>();
93 }
94
priorityForUri(const QString &) const95 int QgsProviderMetadata::priorityForUri( const QString & ) const
96 {
97 return 0;
98 }
99
validLayerTypesForUri(const QString &) const100 QList<QgsMapLayerType> QgsProviderMetadata::validLayerTypesForUri( const QString & ) const
101 {
102 return QList<QgsMapLayerType>();
103 }
104
uriIsBlocklisted(const QString &) const105 bool QgsProviderMetadata::uriIsBlocklisted( const QString & ) const
106 {
107 return false;
108 }
109
sidecarFilesForUri(const QString &) const110 QStringList QgsProviderMetadata::sidecarFilesForUri( const QString & ) const
111 {
112 return QStringList();
113 }
114
querySublayers(const QString &,Qgis::SublayerQueryFlags,QgsFeedback *) const115 QList<QgsProviderSublayerDetails> QgsProviderMetadata::querySublayers( const QString &, Qgis::SublayerQueryFlags, QgsFeedback * ) const
116 {
117 return QList<QgsProviderSublayerDetails>();
118 }
119
createProvider(const QString & uri,const QgsDataProvider::ProviderOptions & options,QgsDataProvider::ReadFlags flags)120 QgsDataProvider *QgsProviderMetadata::createProvider( const QString &uri,
121 const QgsDataProvider::ProviderOptions &options,
122 QgsDataProvider::ReadFlags flags )
123 {
124 if ( mCreateFunction )
125 {
126 return mCreateFunction( uri, options, flags );
127 }
128 return nullptr;
129 }
130
setBoolParameter(QVariantMap & uri,const QString & parameter,const QVariant & value)131 void QgsProviderMetadata::setBoolParameter( QVariantMap &uri, const QString ¶meter, const QVariant &value )
132 {
133 if ( value.toString().compare( QStringLiteral( "yes" ), Qt::CaseInsensitive ) == 0 ||
134 value.toString().compare( QStringLiteral( "1" ), Qt::CaseInsensitive ) == 0 ||
135 value.toString().compare( QStringLiteral( "true" ), Qt::CaseInsensitive ) == 0 )
136 {
137 uri[ parameter ] = true;
138 }
139 else if ( value.toString().compare( QStringLiteral( "no" ), Qt::CaseInsensitive ) == 0 ||
140 value.toString().compare( QStringLiteral( "0" ), Qt::CaseInsensitive ) == 0 ||
141 value.toString().compare( QStringLiteral( "false" ), Qt::CaseInsensitive ) == 0 )
142 {
143 uri[ parameter ] = false;
144 }
145 }
146
boolParameter(const QVariantMap & uri,const QString & parameter,bool defaultValue)147 bool QgsProviderMetadata::boolParameter( const QVariantMap &uri, const QString ¶meter, bool defaultValue )
148 {
149 if ( uri.value( parameter, QString() ).toString().compare( QStringLiteral( "yes" ), Qt::CaseInsensitive ) == 0 ||
150 uri.value( parameter, QString() ).toString().compare( QStringLiteral( "1" ), Qt::CaseInsensitive ) == 0 ||
151 uri.value( parameter, QString() ).toString().compare( QStringLiteral( "true" ), Qt::CaseInsensitive ) == 0 )
152 {
153 return true;
154 }
155 else if ( uri.value( parameter, QString() ).toString().compare( QStringLiteral( "no" ), Qt::CaseInsensitive ) == 0 ||
156 uri.value( parameter, QString() ).toString().compare( QStringLiteral( "0" ), Qt::CaseInsensitive ) == 0 ||
157 uri.value( parameter, QString() ).toString().compare( QStringLiteral( "false" ), Qt::CaseInsensitive ) == 0 )
158 {
159 return false;
160 }
161
162 return defaultValue;
163 }
164
decodeUri(const QString &) const165 QVariantMap QgsProviderMetadata::decodeUri( const QString & ) const
166 {
167 return QVariantMap();
168 }
169
encodeUri(const QVariantMap &) const170 QString QgsProviderMetadata::encodeUri( const QVariantMap & ) const
171 {
172 return QString();
173 }
174
createEmptyLayer(const QString &,const QgsFields &,QgsWkbTypes::Type,const QgsCoordinateReferenceSystem &,bool,QMap<int,int> &,QString & errorMessage,const QMap<QString,QVariant> *)175 Qgis::VectorExportResult QgsProviderMetadata::createEmptyLayer(
176 const QString &, const QgsFields &,
177 QgsWkbTypes::Type, const QgsCoordinateReferenceSystem &,
178 bool, QMap<int, int> &,
179 QString &errorMessage, const QMap<QString, QVariant> * )
180 {
181 errorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "createEmptyLayer" ) );
182 return Qgis::VectorExportResult::ErrorProviderUnsupportedFeature;
183 }
184
createRasterDataProvider(const QString &,const QString &,int,Qgis::DataType,int,int,double *,const QgsCoordinateReferenceSystem &,const QStringList &)185 QgsRasterDataProvider *QgsProviderMetadata::createRasterDataProvider(
186 const QString &, const QString &,
187 int, Qgis::DataType, int,
188 int, double *,
189 const QgsCoordinateReferenceSystem &,
190 const QStringList & )
191 {
192 return nullptr;
193 }
194
createMeshData(const QgsMesh &,const QString &,const QString &,const QgsCoordinateReferenceSystem &) const195 bool QgsProviderMetadata::createMeshData( const QgsMesh &,
196 const QString &,
197 const QString &,
198 const QgsCoordinateReferenceSystem & ) const
199 {
200 return false;
201 }
202
createMeshData(const QgsMesh &,const QString &,const QgsCoordinateReferenceSystem &) const203 bool QgsProviderMetadata::createMeshData( const QgsMesh &,
204 const QString &,
205 const QgsCoordinateReferenceSystem & ) const
206 {
207 return false;
208 }
209
pyramidResamplingMethods()210 QList<QPair<QString, QString> > QgsProviderMetadata::pyramidResamplingMethods()
211 {
212 return QList<QPair<QString, QString> >();
213 }
214
dataItemProviders() const215 QList<QgsDataItemProvider *> QgsProviderMetadata::dataItemProviders() const
216 {
217 return QList<QgsDataItemProvider *>();
218 }
219
listStyles(const QString &,QStringList &,QStringList &,QStringList &,QString & errCause)220 int QgsProviderMetadata::listStyles( const QString &, QStringList &, QStringList &,
221 QStringList &, QString &errCause )
222 {
223 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "listStyles" ) );
224 return -1;
225 }
226
getStyleById(const QString &,QString,QString & errCause)227 QString QgsProviderMetadata::getStyleById( const QString &, QString, QString &errCause )
228 {
229 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "getStyleById" ) );
230 return QString();
231 }
232
deleteStyleById(const QString &,QString,QString & errCause)233 bool QgsProviderMetadata::deleteStyleById( const QString &, QString, QString &errCause )
234 {
235 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "deleteStyleById" ) );
236 return false;
237 }
238
saveStyle(const QString &,const QString &,const QString &,const QString &,const QString &,const QString &,bool,QString & errCause)239 bool QgsProviderMetadata::saveStyle( const QString &, const QString &, const QString &, const QString &,
240 const QString &, const QString &, bool, QString &errCause )
241 {
242 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "saveStyle" ) );
243 return false;
244 }
245
loadStyle(const QString &,QString & errCause)246 QString QgsProviderMetadata::loadStyle( const QString &, QString &errCause )
247 {
248 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "loadStyle" ) );
249 return QString();
250 }
251
saveLayerMetadata(const QString &,const QgsLayerMetadata &,QString &)252 bool QgsProviderMetadata::saveLayerMetadata( const QString &, const QgsLayerMetadata &, QString & )
253 {
254 throw QgsNotSupportedException( QObject::tr( "Provider %1 does not support writing layer metadata" ).arg( key() ) );
255 }
256
createDb(const QString &,QString & errCause)257 bool QgsProviderMetadata::createDb( const QString &, QString &errCause )
258 {
259 errCause = QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "createDb" ) );
260 return false;
261 }
262
createTransaction(const QString &)263 QgsTransaction *QgsProviderMetadata::createTransaction( const QString & )
264 {
265 return nullptr;
266 }
267
connections(bool cached)268 QMap<QString, QgsAbstractProviderConnection *> QgsProviderMetadata::connections( bool cached )
269 {
270 Q_UNUSED( cached );
271 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connections" ) ) );
272 }
273
dbConnections(bool cached)274 QMap<QString, QgsAbstractDatabaseProviderConnection *> QgsProviderMetadata::dbConnections( bool cached )
275 {
276 return connections<QgsAbstractDatabaseProviderConnection>( cached ) ;
277 }
278
findConnection(const QString & name,bool cached)279 QgsAbstractProviderConnection *QgsProviderMetadata::findConnection( const QString &name, bool cached )
280 {
281 const QMap<QString, QgsAbstractProviderConnection *> constConns { connections( cached ) };
282 const QStringList constKeys { constConns.keys( ) };
283 for ( const QString &key : constKeys )
284 {
285 if ( key == name )
286 {
287 return constConns.value( key );
288 }
289 }
290 return nullptr;
291 }
292
createConnection(const QString & name)293 QgsAbstractProviderConnection *QgsProviderMetadata::createConnection( const QString &name )
294 {
295 Q_UNUSED( name );
296 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connection" ) ) );
297 }
298
299
createConnection(const QString & uri,const QVariantMap & configuration)300 QgsAbstractProviderConnection *QgsProviderMetadata::createConnection( const QString &uri, const QVariantMap &configuration )
301 {
302 Q_UNUSED( configuration );
303 Q_UNUSED( uri );
304 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "connection" ) ) );
305 }
306
deleteConnection(const QString & name)307 void QgsProviderMetadata::deleteConnection( const QString &name )
308 {
309 Q_UNUSED( name );
310 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "deleteConnection" ) ) );
311 }
312
saveConnection(const QgsAbstractProviderConnection * connection,const QString & name)313 void QgsProviderMetadata::saveConnection( const QgsAbstractProviderConnection *connection, const QString &name )
314 {
315 Q_UNUSED( connection )
316 Q_UNUSED( name )
317 throw QgsProviderConnectionException( QObject::tr( "Provider %1 has no %2 method" ).arg( key(), QStringLiteral( "saveConnection" ) ) );
318 }
319
320 ///@cond PRIVATE
saveConnectionProtected(const QgsAbstractProviderConnection * conn,const QString & name)321 void QgsProviderMetadata::saveConnectionProtected( const QgsAbstractProviderConnection *conn, const QString &name )
322 {
323 const bool isNewConnection = !connections().contains( name );
324 conn->store( name );
325 mProviderConnections.clear();
326
327 if ( !isNewConnection )
328 emit connectionChanged( name );
329 else
330 emit connectionCreated( name );
331 }
332 ///@endcond
333
334 template<typename T>
connections(bool cached)335 QMap<QString, T *> QgsProviderMetadata::connections( bool cached )
336 {
337 QMap<QString, T *> result;
338 const auto constConns { connections( cached ) };
339 const QStringList constConnKeys { constConns.keys() };
340 for ( const auto &c : constConnKeys )
341 {
342 T *casted { static_cast<T *>( constConns.value( c ) ) };
343 if ( casted )
344 {
345 result.insert( c, casted );
346 }
347 }
348 return result;
349 }
350
351 QgsMeshDriverMetadata::QgsMeshDriverMetadata() = default;
352
QgsMeshDriverMetadata(const QString & name,const QString & description,const MeshDriverCapabilities & capabilities,const QString & writeDatasetOnfileSuffix)353 QgsMeshDriverMetadata::QgsMeshDriverMetadata( const QString &name,
354 const QString &description,
355 const MeshDriverCapabilities &capabilities,
356 const QString &writeDatasetOnfileSuffix )
357 : mName( name )
358 , mDescription( description )
359 , mCapabilities( capabilities )
360 , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
361 {
362 }
363
QgsMeshDriverMetadata(const QString & name,const QString & description,const MeshDriverCapabilities & capabilities,const QString & writeDatasetOnfileSuffix,const QString & writeMeshFrameOnFileSuffix,int maxVerticesPerface)364 QgsMeshDriverMetadata::QgsMeshDriverMetadata( const QString &name,
365 const QString &description,
366 const MeshDriverCapabilities &capabilities,
367 const QString &writeDatasetOnfileSuffix,
368 const QString &writeMeshFrameOnFileSuffix,
369 int maxVerticesPerface )
370 : mName( name )
371 , mDescription( description )
372 , mCapabilities( capabilities )
373 , mWriteDatasetOnFileSuffix( writeDatasetOnfileSuffix )
374 , mWriteMeshFrameOnFileSuffix( ( writeMeshFrameOnFileSuffix ) )
375 , mMaxVerticesPerFace( maxVerticesPerface )
376 {
377 }
378
capabilities() const379 QgsMeshDriverMetadata::MeshDriverCapabilities QgsMeshDriverMetadata::capabilities() const
380 {
381 return mCapabilities;
382 }
383
name() const384 QString QgsMeshDriverMetadata::name() const
385 {
386 return mName;
387 }
388
description() const389 QString QgsMeshDriverMetadata::description() const
390 {
391 return mDescription;
392 }
393
writeDatasetOnFileSuffix() const394 QString QgsMeshDriverMetadata::writeDatasetOnFileSuffix() const
395 {
396 return mWriteDatasetOnFileSuffix;
397 }
398
writeMeshFrameOnFileSuffix() const399 QString QgsMeshDriverMetadata::writeMeshFrameOnFileSuffix() const
400 {
401 return mWriteMeshFrameOnFileSuffix;
402 }
403
maximumVerticesCountPerFace() const404 int QgsMeshDriverMetadata::maximumVerticesCountPerFace() const
405 {
406 return mMaxVerticesPerFace;
407 }
408