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 &parameter, 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 &parameter, 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