Skip to content

Commit 8866b0c

Browse files
committedJan 3, 2023
QgsProviderSublayerTask: make it possible to restrict it to a particular provider
Avoids the 'ERROR: Status 2: File pagingEnabled='false' preferCoordinatesForWfsT11='false' restrictToRequestBBOX='1' srsname='EPSG:25832' typename='dvg:nw_dvg1_bld' url='https://www.wfs.nrw.de/geobasis/wfs_nw_dvg' version='auto' could not be found' type of message in the scenario described by #51144 (comment)
1 parent 494e636 commit 8866b0c

File tree

8 files changed

+45
-9
lines changed

8 files changed

+45
-9
lines changed
 

‎python/core/auto_generated/providers/qgsprovidermetadata.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ The optional ``feedback`` argument can be used to provide cancellation support f
398398

399399
virtual QString suggestGroupNameForUri( const QString &uri ) const;
400400
%Docstring
401-
Returns a name that can be used as a group name for sublayers got from
401+
Returns a name that can be used as a group name for sublayers retrieved from
402402
the specified ``uri``.
403403

404404
The default implementation returns an empty string.

‎python/core/auto_generated/providers/qgsprovidersublayertask.sip.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ possible, regardless of how expensive this may be.
3939
%Docstring
4040
Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
4141
specified ``uri``.
42+
%End
43+
44+
QgsProviderSublayerTask( const QString &uri, const QString &providerKey, bool includeSystemTables = false );
45+
%Docstring
46+
Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
47+
specified ``uri``, restricted to a particular provider.
48+
49+
.. versionadded:: 3.30
4250
%End
4351

4452
~QgsProviderSublayerTask();

‎src/app/layers/qgsapplayerhandling.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ QList< QgsMapLayer * > QgsAppLayerHandling::addOgrVectorLayers( const QStringLis
324324
case SublayerHandling::AskUser:
325325
{
326326
// prompt user for sublayers
327-
QgsProviderSublayersDialog dlg( uri, path, sublayers, {QgsMapLayerType::VectorLayer}, QgisApp::instance() );
327+
QgsProviderSublayersDialog dlg( uri, QString(), path, sublayers, {QgsMapLayerType::VectorLayer}, QgisApp::instance() );
328328

329329
if ( dlg.exec() )
330330
sublayers = dlg.selectedLayers();
@@ -534,7 +534,7 @@ bool QgsAppLayerHandling::askUserForZipItemLayers( const QString &path, const QL
534534
case SublayerHandling::AskUser:
535535
{
536536
// prompt user for sublayers
537-
QgsProviderSublayersDialog dlg( path, path, sublayers, acceptableTypes, QgisApp::instance() );
537+
QgsProviderSublayersDialog dlg( path, QString(), path, sublayers, acceptableTypes, QgisApp::instance() );
538538

539539
if ( dlg.exec() )
540540
sublayers = dlg.selectedLayers();
@@ -936,7 +936,7 @@ QList< QgsMapLayer * > QgsAppLayerHandling::openLayer( const QString &fileName,
936936
case SublayerHandling::AskUser:
937937
{
938938
// prompt user for sublayers
939-
QgsProviderSublayersDialog dlg( fileName, fileName, sublayers, {}, QgisApp::instance() );
939+
QgsProviderSublayersDialog dlg( fileName, QString(), fileName, sublayers, {}, QgisApp::instance() );
940940
dlg.setNonLayerItems( nonLayerItems );
941941

942942
if ( dlg.exec() )
@@ -1373,7 +1373,7 @@ T *QgsAppLayerHandling::addLayerPrivate( QgsMapLayerType type, const QString &ur
13731373
{
13741374
case SublayerHandling::AskUser:
13751375
{
1376-
QgsProviderSublayersDialog dlg( updatedUri, path, sublayers, {type}, QgisApp::instance() );
1376+
QgsProviderSublayersDialog dlg( updatedUri, providerKey, path, sublayers, {type}, QgisApp::instance() );
13771377
QString groupName = providerMetadata->suggestGroupNameForUri( uri );
13781378
if ( !groupName.isEmpty() )
13791379
dlg.setGroupName( groupName );

‎src/core/providers/qgsprovidermetadata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ class CORE_EXPORT QgsProviderMetadata : public QObject
458458
virtual QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const;
459459

460460
/**
461-
* Returns a name that can be used as a group name for sublayers got from
461+
* Returns a name that can be used as a group name for sublayers retrieved from
462462
* the specified \a uri.
463463
*
464464
* The default implementation returns an empty string.

‎src/core/providers/qgsprovidersublayertask.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgsprovidersublayertask.h"
1919
#include "qgsfeedback.h"
20+
#include "qgsprovidermetadata.h"
2021
#include "qgsproviderregistry.h"
2122
#include "qgsprovidersublayerdetails.h"
2223
#include "qgsreadwritelocker.h"
@@ -28,6 +29,14 @@ QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri, bool inclu
2829
{
2930
}
3031

32+
QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri, const QString &providerKey, bool includeSystemTables )
33+
: QgsTask( tr( "Retrieving layers" ), QgsTask::CanCancel | QgsTask::CancelWithoutPrompt | QgsTask::Silent )
34+
, mUri( uri )
35+
, mProviderKey( providerKey )
36+
, mIncludeSystemTables( includeSystemTables )
37+
{
38+
}
39+
3140
QList<QgsProviderSublayerDetails> QgsProviderSublayerTask::results() const
3241
{
3342
const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Read );
@@ -44,7 +53,15 @@ bool QgsProviderSublayerTask::run()
4453
if ( mIncludeSystemTables )
4554
flags |= Qgis::SublayerQueryFlag::IncludeSystemTables;
4655

47-
const QList<QgsProviderSublayerDetails> res = QgsProviderRegistry::instance()->querySublayers( mUri, flags, mFeedback.get() );
56+
QList<QgsProviderSublayerDetails> res;
57+
if ( mProviderKey.isEmpty() )
58+
res = QgsProviderRegistry::instance()->querySublayers( mUri, flags, mFeedback.get() );
59+
else
60+
{
61+
QgsProviderMetadata *provider = QgsProviderRegistry::instance()->providerMetadata( mProviderKey );
62+
if ( provider )
63+
res = provider->querySublayers( mUri, flags, mFeedback.get() );
64+
}
4865

4966
const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Write );
5067
mResults = res;

‎src/core/providers/qgsprovidersublayertask.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ class CORE_EXPORT QgsProviderSublayerTask : public QgsTask
5555
*/
5656
QgsProviderSublayerTask( const QString &uri, bool includeSystemTables = false );
5757

58+
/**
59+
* Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
60+
* specified \a uri, restricted to a particular provider.
61+
*
62+
* \since QGIS 3.30
63+
*/
64+
QgsProviderSublayerTask( const QString &uri, const QString &providerKey, bool includeSystemTables = false );
65+
5866
~QgsProviderSublayerTask() override;
5967

6068
/**
@@ -72,6 +80,8 @@ class CORE_EXPORT QgsProviderSublayerTask : public QgsTask
7280

7381
QString mUri;
7482

83+
QString mProviderKey;
84+
7585
bool mIncludeSystemTables = false;
7686

7787
std::unique_ptr< QgsFeedback > mFeedback;

‎src/gui/qgsprovidersublayersdialog.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ void QgsProviderSublayerDialogModel::setGeometryTypesResolved( bool resolved )
111111
emit dataChanged( index( 0, 0 ), index( rowCount( QModelIndex() ), columnCount() ) );
112112
}
113113

114-
QgsProviderSublayersDialog::QgsProviderSublayersDialog( const QString &uri, const QString &filePathIn, const QList<QgsProviderSublayerDetails> initialDetails, const QList<QgsMapLayerType> &acceptableTypes, QWidget *parent, Qt::WindowFlags fl )
114+
QgsProviderSublayersDialog::QgsProviderSublayersDialog( const QString &uri, const QString &providerKey, const QString &filePathIn, const QList<QgsProviderSublayerDetails> initialDetails, const QList<QgsMapLayerType> &acceptableTypes, QWidget *parent, Qt::WindowFlags fl )
115115
: QDialog( parent, fl )
116116
{
117117
setupUi( this );
@@ -177,7 +177,7 @@ QgsProviderSublayersDialog::QgsProviderSublayersDialog( const QString &uri, cons
177177
if ( QgsProviderUtils::sublayerDetailsAreIncomplete( initialDetails ) )
178178
{
179179
// initial details are incomplete, so fire up a task in the background to fully populate the model...
180-
mTask = new QgsProviderSublayerTask( uri, true );
180+
mTask = new QgsProviderSublayerTask( uri, providerKey, true );
181181
connect( mTask.data(), &QgsProviderSublayerTask::taskCompleted, this, [ = ]
182182
{
183183
QList< QgsProviderSublayerDetails > res = mTask->results();

‎src/gui/qgsprovidersublayersdialog.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class GUI_EXPORT QgsProviderSublayersDialog : public QDialog, private Ui::QgsPro
7878
* Constructor.
7979
*/
8080
QgsProviderSublayersDialog( const QString &uri,
81+
const QString &providerKey,
8182
const QString &filePath,
8283
const QList< QgsProviderSublayerDetails> initialDetails = QList< QgsProviderSublayerDetails>(),
8384
const QList< QgsMapLayerType > &acceptableTypes = QList< QgsMapLayerType >(),

0 commit comments

Comments
 (0)
Please sign in to comment.