From e57193d6ef4742dcf0fb9da645edc2271c3d990b Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 23 Jul 2021 10:51:19 +1000 Subject: [PATCH] Ignore blocklisted uris when querying all providers for sublayers --- src/core/providers/qgsproviderregistry.cpp | 4 ++++ tests/src/python/test_qgsproviderregistry.py | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/providers/qgsproviderregistry.cpp b/src/core/providers/qgsproviderregistry.cpp index 8d0552167bc..a894e127318 100644 --- a/src/core/providers/qgsproviderregistry.cpp +++ b/src/core/providers/qgsproviderregistry.cpp @@ -899,6 +899,10 @@ bool QgsProviderRegistry::uriIsBlocklisted( const QString &uri ) const QList QgsProviderRegistry::querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags, QgsFeedback *feedback ) const { + // never query sublayers for blocklisted uris + if ( uriIsBlocklisted( uri ) ) + return {}; + QList res; for ( auto it = mProviders.begin(); it != mProviders.end(); ++it ) { diff --git a/tests/src/python/test_qgsproviderregistry.py b/tests/src/python/test_qgsproviderregistry.py index 1949b04414a..c62677637f1 100644 --- a/tests/src/python/test_qgsproviderregistry.py +++ b/tests/src/python/test_qgsproviderregistry.py @@ -17,9 +17,11 @@ from qgis.core import ( QgsMapLayerType, QgsProviderMetadata, QgsProviderSublayerDetails, - Qgis + Qgis, + QgsProviderUtils ) from qgis.testing import start_app, unittest +from utilities import unitTestDataPath # Convenience instances in case you may need them # to find the srs.db @@ -37,6 +39,8 @@ class TestProviderMetadata(QgsProviderMetadata): def querySublayers(self, uri: str, flags=Qgis.SublayerQueryFlags(), feedback=None): res = QgsProviderSublayerDetails() res.setProviderKey(self.key()) + res.setUri(uri) + res.setName(QgsProviderUtils.suggestLayerNameFromFilePath(uri)) return [res] @@ -138,6 +142,10 @@ class TestQgsProviderRegistry(unittest.TestCase): self.assertCountEqual([p.providerKey() for p in QgsProviderRegistry.instance().querySublayers('test_uri')], ['p1', 'p2']) + if QgsProviderRegistry.instance().providerMetadata('ept'): + # test querying a uri which should be blocklisted + self.assertFalse(QgsProviderRegistry.instance().querySublayers(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept-build.json')) + if __name__ == '__main__': unittest.main()