Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't offer non-vector layer providers as options for virtual layer source layers #48988

Merged
merged 7 commits into from
Jun 15, 2022
41 changes: 41 additions & 0 deletions python/core/auto_generated/providers/qgsprovidermetadata.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,47 @@ Returns the provider's capabilities.
.. versionadded:: 3.18.1
%End

SIP_PYOBJECT supportedLayerTypes() const /TypeHint="List[QgsMapLayerType]"/;
%Docstring
Returns a list of the map layer types supported by the provider.

.. versionadded:: 3.26
%End
%MethodCode
// adapted from the qpymultimedia_qlist.sip file from the PyQt6 sources

const QList< QgsMapLayerType > cppRes = sipCpp->supportedLayerTypes();

PyObject *l = PyList_New( cppRes.size() );

if ( !l )
sipIsErr = 1;
else
{
for ( int i = 0; i < cppRes.size(); ++i )
{
PyObject *eobj = sipConvertFromEnum( static_cast<int>( cppRes.at( i ) ),
sipType_QgsMapLayerType );

if ( !eobj )
{
sipIsErr = 1;
}

PyList_SetItem( l, i, eobj );
}

if ( !sipIsErr )
{
sipRes = l;
}
else
{
Py_DECREF( l );
}
}
%End

QString library() const /Deprecated/;
%Docstring
This returns the library file name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,14 @@ Returns list of available providers by their keys
QgsProviderMetadata *providerMetadata( const QString &providerKey ) const;
%Docstring
Returns metadata of the provider or ``None`` if not found
%End

QSet< QString > providersForLayerType( QgsMapLayerType type ) const;
%Docstring
Returns a list of the provider keys for available providers which handle the specified
layer ``type``.

.. versionadded:: 3.26
%End

class ProviderCandidateDetails
Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/copc/qgscopcprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ QgsProviderMetadata::ProviderCapabilities QgsCopcProviderMetadata::providerCapab
return FileBasedUris;
}

QList<QgsMapLayerType> QgsCopcProviderMetadata::supportedLayerTypes() const
{
return { QgsMapLayerType::PointCloudLayer };
}

QString QgsCopcProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
const QString path = parts.value( QStringLiteral( "path" ) ).toString();
Expand Down
1 change: 1 addition & 0 deletions src/core/providers/copc/qgscopcprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class QgsCopcProviderMetadata : public QgsProviderMetadata
QVariantMap decodeUri( const QString &uri ) const override;
QString filters( FilterType type ) override;
ProviderCapabilities providerCapabilities() const override;
QList< QgsMapLayerType > supportedLayerTypes() const override;
};

///@endcond
Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/ept/qgseptprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,11 @@ QgsProviderMetadata::ProviderCapabilities QgsEptProviderMetadata::providerCapabi
return FileBasedUris;
}

QList<QgsMapLayerType> QgsEptProviderMetadata::supportedLayerTypes() const
{
return { QgsMapLayerType::PointCloudLayer };
}

QString QgsEptProviderMetadata::encodeUri( const QVariantMap &parts ) const
{
const QString path = parts.value( QStringLiteral( "path" ) ).toString();
Expand Down
1 change: 1 addition & 0 deletions src/core/providers/ept/qgseptprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class QgsEptProviderMetadata : public QgsProviderMetadata
QVariantMap decodeUri( const QString &uri ) const override;
QString filters( FilterType type ) override;
ProviderCapabilities providerCapabilities() const override;
QList< QgsMapLayerType > supportedLayerTypes() const override;
};

///@endcond
Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/gdal/qgsgdalprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3962,6 +3962,11 @@ QStringList QgsGdalProviderMetadata::sidecarFilesForUri( const QString &uri ) co
return res;
}

QList<QgsMapLayerType> QgsGdalProviderMetadata::supportedLayerTypes() const
{
return { QgsMapLayerType::RasterLayer };
}

QgsGdalProviderMetadata::QgsGdalProviderMetadata():
QgsProviderMetadata( PROVIDER_KEY, PROVIDER_DESCRIPTION )
{
Expand Down
1 change: 1 addition & 0 deletions src/core/providers/gdal/qgsgdalprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ class QgsGdalProviderMetadata final: public QgsProviderMetadata
ProviderCapabilities providerCapabilities() const override;
QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const override;
QStringList sidecarFilesForUri( const QString &uri ) const override;
QList< QgsMapLayerType > supportedLayerTypes() const override;
};

///@endcond
Expand Down
23 changes: 16 additions & 7 deletions src/core/providers/memory/qgsmemoryprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,13 +243,6 @@ QString QgsMemoryProvider::providerDescription()
return TEXT_PROVIDER_DESCRIPTION;
}

QgsMemoryProvider *QgsMemoryProvider::createProvider( const QString &uri,
const ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
{
return new QgsMemoryProvider( uri, options, flags );
}

QgsAbstractFeatureSource *QgsMemoryProvider::featureSource() const
{
return new QgsMemoryFeatureSource( this );
Expand Down Expand Up @@ -814,4 +807,20 @@ QString QgsMemoryProvider::description() const
return TEXT_PROVIDER_DESCRIPTION;
}


QgsMemoryProviderMetadata::QgsMemoryProviderMetadata()
: QgsProviderMetadata( QgsMemoryProvider::providerKey(), QgsMemoryProvider::providerDescription() )
{
}

QgsDataProvider *QgsMemoryProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
{
return new QgsMemoryProvider( uri, options, flags );
}

QList<QgsMapLayerType> QgsMemoryProviderMetadata::supportedLayerTypes() const
{
return { QgsMapLayerType::VectorLayer };
}

///@endcond
17 changes: 10 additions & 7 deletions src/core/providers/memory/qgsmemoryprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "qgsvectordataprovider.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsfields.h"
#include "qgsprovidermetadata.h"

///@cond PRIVATE
typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap;
Expand All @@ -41,13 +42,6 @@ class QgsMemoryProvider final: public QgsVectorDataProvider
//! Returns the memory provider description
static QString providerDescription();

/**
* Creates a new memory provider, with provider properties embedded within the given \a uri and \a options
* argument.
*/
static QgsMemoryProvider *createProvider( const QString &uri, const QgsVectorDataProvider::ProviderOptions &coordinateTransformContext,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

/* Implementation of functions from QgsVectorDataProvider */

QgsAbstractFeatureSource *featureSource() const override;
Expand Down Expand Up @@ -104,4 +98,13 @@ class QgsMemoryProvider final: public QgsVectorDataProvider
friend class QgsMemoryFeatureSource;
};


class QgsMemoryProviderMetadata final: public QgsProviderMetadata
{
public:
QgsMemoryProviderMetadata();
QgsDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QList< QgsMapLayerType > supportedLayerTypes() const override;
};

///@endcond
22 changes: 15 additions & 7 deletions src/core/providers/meshmemory/qgsmeshmemorydataprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,6 @@ QString QgsMeshMemoryDataProvider::providerDescription()
return TEXT_PROVIDER_DESCRIPTION;
}

QgsMeshMemoryDataProvider *QgsMeshMemoryDataProvider::createProvider( const QString &uri,
const ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
{
return new QgsMeshMemoryDataProvider( uri, options, flags );
}

bool QgsMeshMemoryDataProvider::splitMeshSections( const QString &uri )
{
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
Expand Down Expand Up @@ -658,5 +651,20 @@ QgsRectangle QgsMeshMemoryDataProvider::calculateExtent() const
}


QgsMeshMemoryProviderMetadata::QgsMeshMemoryProviderMetadata()
: QgsProviderMetadata( QgsMeshMemoryDataProvider::providerKey(), QgsMeshMemoryDataProvider::providerDescription() )
{

}

QgsDataProvider *QgsMeshMemoryProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
{
return new QgsMeshMemoryDataProvider( uri, options, flags );
}

QList<QgsMapLayerType> QgsMeshMemoryProviderMetadata::supportedLayerTypes() const
{
return { QgsMapLayerType::MeshLayer };
}

///@endcond
12 changes: 8 additions & 4 deletions src/core/providers/meshmemory/qgsmeshmemorydataprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,6 @@ class CORE_EXPORT QgsMeshMemoryDataProvider final: public QgsMeshDataProvider
static QString providerKey();
//! Returns the memory provider description
static QString providerDescription();
//! Provider factory
static QgsMeshMemoryDataProvider *createProvider( const QString &uri,
const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

private:
QgsRectangle calculateExtent( ) const;
Expand All @@ -191,6 +187,14 @@ class CORE_EXPORT QgsMeshMemoryDataProvider final: public QgsMeshDataProvider
QStringList mExtraDatasetUris;
};

class QgsMeshMemoryProviderMetadata final: public QgsProviderMetadata
{
public:
QgsMeshMemoryProviderMetadata();
QgsDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QList< QgsMapLayerType > supportedLayerTypes() const override;
};

///@endcond

#endif // QGSMESHMEMORYDATAPROVIDER_H
5 changes: 5 additions & 0 deletions src/core/providers/ogr/qgsogrprovidermetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1505,6 +1505,11 @@ QStringList QgsOgrProviderMetadata::sidecarFilesForUri( const QString &uri ) con
return res;
}

QList<QgsMapLayerType> QgsOgrProviderMetadata::supportedLayerTypes() const
{
return { QgsMapLayerType::VectorLayer };
}

QMap<QString, QgsAbstractProviderConnection *> QgsOgrProviderMetadata::connections( bool cached )
{
return connectionsProtected<QgsGeoPackageProviderConnection, QgsOgrDbConnection>( cached );
Expand Down
1 change: 1 addition & 0 deletions src/core/providers/ogr/qgsogrprovidermetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class QgsOgrProviderMetadata final: public QgsProviderMetadata
bool uriIsBlocklisted( const QString &uri ) const override;
QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const override;
QStringList sidecarFilesForUri( const QString &uri ) const override;
QList< QgsMapLayerType > supportedLayerTypes() const override;
Qgis::VectorExportResult createEmptyLayer(
const QString &uri,
const QgsFields &fields,
Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/qgsprovidermetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ QgsProviderMetadata::ProviderCapabilities QgsProviderMetadata::providerCapabilit
return QgsProviderMetadata::ProviderCapabilities();
}

QList<QgsMapLayerType> QgsProviderMetadata::supportedLayerTypes() const
{
return {};
}

QString QgsProviderMetadata::library() const
{
return mLibrary;
Expand Down
45 changes: 45 additions & 0 deletions src/core/providers/qgsprovidermetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,51 @@ class CORE_EXPORT QgsProviderMetadata : public QObject
*/
virtual QgsProviderMetadata::ProviderCapabilities providerCapabilities() const;

/**
* Returns a list of the map layer types supported by the provider.
*
* \since QGIS 3.26
*/
#ifndef SIP_RUN
virtual QList< QgsMapLayerType > supportedLayerTypes() const;
#else
SIP_PYOBJECT supportedLayerTypes() const SIP_TYPEHINT( List[QgsMapLayerType] );
% MethodCode
// adapted from the qpymultimedia_qlist.sip file from the PyQt6 sources

const QList< QgsMapLayerType > cppRes = sipCpp->supportedLayerTypes();

PyObject *l = PyList_New( cppRes.size() );

if ( !l )
sipIsErr = 1;
else
{
for ( int i = 0; i < cppRes.size(); ++i )
{
PyObject *eobj = sipConvertFromEnum( static_cast<int>( cppRes.at( i ) ),
sipType_QgsMapLayerType );

if ( !eobj )
{
sipIsErr = 1;
}

PyList_SetItem( l, i, eobj );
}

if ( !sipIsErr )
{
sipRes = l;
}
else
{
Py_DECREF( l );
}
}
% End
#endif

/**
* This returns the library file name
*
Expand Down
17 changes: 13 additions & 4 deletions src/core/providers/qgsproviderregistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,16 +171,14 @@ class PdalUnusableUriHandlerInterface : public QgsProviderRegistry::UnusableUriH
void QgsProviderRegistry::init()
{
// add static providers
Q_NOWARN_DEPRECATED_PUSH
{
const QgsScopedRuntimeProfile profile( QObject::tr( "Create memory layer provider" ) );
mProviders[ QgsMemoryProvider::providerKey() ] = new QgsProviderMetadata( QgsMemoryProvider::providerKey(), QgsMemoryProvider::providerDescription(), &QgsMemoryProvider::createProvider );
mProviders[ QgsMemoryProvider::providerKey() ] = new QgsMemoryProviderMetadata();
}
{
const QgsScopedRuntimeProfile profile( QObject::tr( "Create mesh memory layer provider" ) );
mProviders[ QgsMeshMemoryDataProvider::providerKey() ] = new QgsProviderMetadata( QgsMeshMemoryDataProvider::providerKey(), QgsMeshMemoryDataProvider::providerDescription(), &QgsMeshMemoryDataProvider::createProvider );
mProviders[ QgsMeshMemoryDataProvider::providerKey() ] = new QgsMeshMemoryProviderMetadata();
}
Q_NOWARN_DEPRECATED_POP
{
const QgsScopedRuntimeProfile profile( QObject::tr( "Create GDAL provider" ) );
mProviders[ QgsGdalProvider::providerKey() ] = new QgsGdalProviderMetadata();
Expand Down Expand Up @@ -877,6 +875,17 @@ QgsProviderMetadata *QgsProviderRegistry::providerMetadata( const QString &provi
return findMetadata_( mProviders, providerKey );
}

QSet<QString> QgsProviderRegistry::providersForLayerType( QgsMapLayerType type ) const
{
QSet<QString> lst;
for ( Providers::const_iterator it = mProviders.begin(); it != mProviders.end(); ++it )
{
if ( it->second->supportedLayerTypes().contains( type ) )
lst.insert( it->first );
}
return lst;
}

QList<QgsProviderRegistry::ProviderCandidateDetails> QgsProviderRegistry::preferredProvidersForUri( const QString &uri ) const
{
QList< QgsProviderRegistry::ProviderCandidateDetails > res;
Expand Down
8 changes: 8 additions & 0 deletions src/core/providers/qgsproviderregistry.h
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,14 @@ class CORE_EXPORT QgsProviderRegistry
//! Returns metadata of the provider or NULLPTR if not found
QgsProviderMetadata *providerMetadata( const QString &providerKey ) const;

/**
* Returns a list of the provider keys for available providers which handle the specified
* layer \a type.
*
* \since QGIS 3.26
*/
QSet< QString > providersForLayerType( QgsMapLayerType type ) const;

/**
* \ingroup core
*
Expand Down
Loading