diff --git a/src/core/providers/gdal/qgsgdalprovider.cpp b/src/core/providers/gdal/qgsgdalprovider.cpp index b0bf866f97d3..5f8726a2ed8a 100644 --- a/src/core/providers/gdal/qgsgdalprovider.cpp +++ b/src/core/providers/gdal/qgsgdalprovider.cpp @@ -3650,7 +3650,9 @@ QList QgsGdalProviderMetadata::querySublayers( const QgsDebugMsgLevel( QStringLiteral( "wildcards: " ) + sWildcards.join( ' ' ), 2 ); } ); - const QString suffix = pathInfo.suffix().toLower(); + const QString suffix = uriParts.value( QStringLiteral( "vsiSuffix" ) ).toString().isEmpty() + ? pathInfo.suffix().toLower() + : QFileInfo( uriParts.value( QStringLiteral( "vsiSuffix" ) ).toString() ).suffix().toLower(); if ( !sExtensions.contains( suffix ) ) { diff --git a/tests/src/core/testqgsgdalprovider.cpp b/tests/src/core/testqgsgdalprovider.cpp index d76ac9b16c33..7efbd63a7155 100644 --- a/tests/src/core/testqgsgdalprovider.cpp +++ b/tests/src/core/testqgsgdalprovider.cpp @@ -606,6 +606,10 @@ void TestQgsGdalProvider::testGdalProviderQuerySublayers() rl.reset( qgis::down_cast< QgsRasterLayer * >( res.at( 0 ).toLayer( options ) ) ); QVERIFY( rl->isValid() ); + // multi-layer archive, format not supported by gdal + res = gdalMetadata->querySublayers( QStringLiteral( "/vsitar/" ) + QStringLiteral( TEST_DATA_DIR ) + "/zip/testtar.tgz/points.qml" ); + QCOMPARE( res.count(), 0 ); + // metadata.xml file next to tdenv?.adf file -- this is a subcomponent of an ESRI tin layer, should not be exposed res = gdalMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + "/esri_tin/metadata.xml" ); QVERIFY( res.empty() ); @@ -685,6 +689,28 @@ void TestQgsGdalProvider::testGdalProviderQuerySublayersFastScan() // metadata.xml file next to tdenv?.adf file -- this is a subcomponent of an ESRI tin layer, should not be exposed res = gdalMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + "/esri_tin/metadata.xml", Qgis::SublayerQueryFlag::FastScan ); QVERIFY( res.empty() ); + + // multi-layer archive, but with specific suffix specified + res = gdalMetadata->querySublayers( QStringLiteral( "/vsitar/" ) + QStringLiteral( TEST_DATA_DIR ) + "/zip/testtar.tgz/folder/folder2/landsat_b2.tif", Qgis::SublayerQueryFlag::FastScan ); + QCOMPARE( res.count(), 1 ); + QCOMPARE( res.at( 0 ).name(), QStringLiteral( "testtar" ) ); // this is wrong, should be landsat_b2.tif + QCOMPARE( res.at( 0 ).description(), QString() ); + QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "/vsitar/%1/zip/testtar.tgz/folder/folder2/landsat_b2.tif" ).arg( QStringLiteral( TEST_DATA_DIR ) ) ); + QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "gdal" ) ); + QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::RasterLayer ); + res = gdalMetadata->querySublayers( QStringLiteral( "/vsitar/" ) + QStringLiteral( TEST_DATA_DIR ) + "/zip/testtar.tgz/landsat_b1.tif" ); + QCOMPARE( res.count(), 1 ); + QCOMPARE( res.at( 0 ).layerNumber(), 1 ); + QCOMPARE( res.at( 0 ).name(), QStringLiteral( "landsat_b1.tif" ) ); + QCOMPARE( res.at( 0 ).description(), QString() ); + QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "/vsitar/%1/zip/testtar.tgz/landsat_b1.tif" ).arg( QStringLiteral( TEST_DATA_DIR ) ) ); + QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "gdal" ) ); + QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::RasterLayer ); + QCOMPARE( res.at( 0 ).driverName(), QStringLiteral( "GTiff" ) ); + + // multi-layer archive, format not supported by gdal + res = gdalMetadata->querySublayers( QStringLiteral( "/vsitar/" ) + QStringLiteral( TEST_DATA_DIR ) + "/zip/testtar.tgz/points.qml", Qgis::SublayerQueryFlag::FastScan ); + QCOMPARE( res.count(), 0 ); } QGSTEST_MAIN( TestQgsGdalProvider )