From 9fb554fde0348c3a78aad6070c6c83986e5470ab Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 29 Jan 2021 10:17:42 +1000 Subject: [PATCH] [arcgisrest] Hardcode a list of supported image formats for ImageServer services, to ensure that we always have a valid list of available formats when layers from a ImageServer are selected in data source manager/browser This also ensures that we select the default JPGPNG format when an ImageServer layer is added via browser Fixes #41126 --- .../providers/arcgis/qgsarcgisrestquery.cpp | 13 +++++-------- src/core/providers/arcgis/qgsarcgisrestquery.h | 4 ++-- .../arcgisrest/qgsarcgisrestdataitems.cpp | 17 ++++++++++------- .../arcgisrest/qgsarcgisrestdataitems.h | 3 ++- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/core/providers/arcgis/qgsarcgisrestquery.cpp b/src/core/providers/arcgis/qgsarcgisrestquery.cpp index 648bc1145f22..04c54fead44c 100644 --- a/src/core/providers/arcgis/qgsarcgisrestquery.cpp +++ b/src/core/providers/arcgis/qgsarcgisrestquery.cpp @@ -285,7 +285,7 @@ void QgsArcGisRestQueryUtils::visitFolderItems( const std::function< void( const } } -void QgsArcGisRestQueryUtils::visitServiceItems( const std::function &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter ) +void QgsArcGisRestQueryUtils::visitServiceItems( const std::function &visitor, const QVariantMap &serviceData, const QString &baseUrl ) { QString base( baseUrl ); bool baseChecked = false; @@ -300,10 +300,7 @@ void QgsArcGisRestQueryUtils::visitServiceItems( const std::function &visitor, const QVariantMap &serviceData, const QString &parentUrl, const ServiceTypeFilter filter ) +void QgsArcGisRestQueryUtils::addLayerItems( const std::function &visitor, const QVariantMap &serviceData, const QString &parentUrl, const QString &parentSupportedFormats, const ServiceTypeFilter filter ) { const QString authid = QgsArcGisRestUtils::convertSpatialReference( serviceData.value( QStringLiteral( "spatialReference" ) ).toMap() ).authid(); - QString format = QStringLiteral( "jpg" ); bool found = false; const QList supportedFormats = QImageReader::supportedImageFormats(); - const QStringList supportedImageFormatTypes = serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString().split( ',' ); + const QStringList supportedImageFormatTypes = serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString().isEmpty() ? parentSupportedFormats.split( ',' ) : serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString().split( ',' ); + QString format = supportedImageFormatTypes.value( 0 ); for ( const QString &encoding : supportedImageFormatTypes ) { for ( const QByteArray &fmt : supportedFormats ) diff --git a/src/core/providers/arcgis/qgsarcgisrestquery.h b/src/core/providers/arcgis/qgsarcgisrestquery.h index a068d56acad2..a7ed39f0d51a 100644 --- a/src/core/providers/arcgis/qgsarcgisrestquery.h +++ b/src/core/providers/arcgis/qgsarcgisrestquery.h @@ -93,12 +93,12 @@ class CORE_EXPORT QgsArcGisRestQueryUtils /** * Calls the specified \a visitor function on all service items found within the given service data. */ - static void visitServiceItems( const std::function &visitor, const QVariantMap &serviceData, const QString &baseUrl, const ServiceTypeFilter filter = AllTypes ); + static void visitServiceItems( const std::function &visitor, const QVariantMap &serviceData, const QString &baseUrl ); /** * Calls the specified \a visitor function on all layer items found within the given service data. */ - static void addLayerItems( const std::function &visitor, const QVariantMap &serviceData, const QString &parentUrl, const ServiceTypeFilter filter = AllTypes ); + static void addLayerItems( const std::function &visitor, const QVariantMap &serviceData, const QString &parentUrl, const QString &parentSupportedFormats, const ServiceTypeFilter filter = AllTypes ); private: diff --git a/src/providers/arcgisrest/qgsarcgisrestdataitems.cpp b/src/providers/arcgisrest/qgsarcgisrestdataitems.cpp index 36940208d447..29f88e25f972 100644 --- a/src/providers/arcgisrest/qgsarcgisrestdataitems.cpp +++ b/src/providers/arcgisrest/qgsarcgisrestdataitems.cpp @@ -87,13 +87,13 @@ void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &servic const QString &supportedFormats ) { QgsArcGisRestQueryUtils::visitServiceItems( - [&items, parent, authcfg, headers, supportedFormats]( const QString & name, const QString & url, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceType ) + [&items, parent, authcfg, headers, supportedFormats]( const QString & name, const QString & url, const QString & service, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceType ) { switch ( serviceType ) { case QgsArcGisRestQueryUtils::Raster: { - std::unique_ptr< QgsArcGisMapServiceItem > serviceItem = qgis::make_unique< QgsArcGisMapServiceItem >( parent, name, url, url, authcfg, headers ); + std::unique_ptr< QgsArcGisMapServiceItem > serviceItem = qgis::make_unique< QgsArcGisMapServiceItem >( parent, name, url, url, authcfg, headers, service ); items.append( serviceItem.release() ); break; } @@ -109,7 +109,7 @@ void addServiceItems( QVector< QgsDataItem * > &items, const QVariantMap &servic case QgsArcGisRestQueryUtils::AllTypes: break; } - }, serviceData, baseUrl, QgsArcGisRestQueryUtils::AllTypes ); + }, serviceData, baseUrl ); } void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceData, const QString &parentUrl, const QString &authcfg, const QgsStringMap &headers, QgsDataItem *parent, QgsArcGisRestQueryUtils::ServiceTypeFilter serviceTypeFilter, @@ -156,7 +156,7 @@ void addLayerItems( QVector< QgsDataItem * > &items, const QVariantMap &serviceD layerItems.insert( id, layerItem.release() ); } - }, serviceData, parentUrl, serviceTypeFilter ); + }, serviceData, parentUrl, supportedFormats, serviceTypeFilter ); // create groups for ( auto it = layerItems.constBegin(); it != layerItems.constEnd(); ++it ) @@ -349,7 +349,7 @@ QVector QgsArcGisPortalGroupItem::createChildren() { items << new QgsArcGisMapServiceItem( this, itemData.value( QStringLiteral( "title" ) ).toString(), itemData.value( QStringLiteral( "url" ) ).toString(), - itemData.value( QStringLiteral( "url" ) ).toString(), mAuthCfg, mHeaders ); + itemData.value( QStringLiteral( "url" ) ).toString(), mAuthCfg, mHeaders, itemData.value( QStringLiteral( "type" ) ).toString().compare( QStringLiteral( "Map Service" ), Qt::CaseInsensitive ) == 0 ? QStringLiteral( "MapServer" ) : QStringLiteral( "ImageServer" ) ); } } @@ -514,11 +514,12 @@ bool QgsArcGisFeatureServiceItem::equal( const QgsDataItem *other ) // QgsArcGisMapServiceItem // -QgsArcGisMapServiceItem::QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers ) +QgsArcGisMapServiceItem::QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers, const QString &serviceType ) : QgsDataCollectionItem( parent, name, path, QStringLiteral( "AMS" ) ) , mBaseUrl( baseUrl ) , mAuthCfg( authcfg ) , mHeaders( headers ) + , mServiceType( serviceType ) { mIconName = QStringLiteral( "mIconDbSchema.svg" ); mCapabilities |= Collapse; @@ -544,7 +545,9 @@ QVector QgsArcGisMapServiceItem::createChildren() return items; } - const QString supportedFormats = serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString(); + const QString supportedFormats = mServiceType == QLatin1String( "ImageServer" ) ? + QStringLiteral( "JPGPNG,PNG,PNG8,PNG24,JPG,BMP,GIF,TIFF,PNG32,BIP,BSQ,LERC" ) // ImageServer supported formats + : serviceData.value( QStringLiteral( "supportedImageFormatTypes" ) ).toString(); addFolderItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this, supportedFormats ); addServiceItems( items, serviceData, mBaseUrl, mAuthCfg, mHeaders, this, supportedFormats ); diff --git a/src/providers/arcgisrest/qgsarcgisrestdataitems.h b/src/providers/arcgisrest/qgsarcgisrestdataitems.h index c86873943e72..71375a2a7e2c 100644 --- a/src/providers/arcgisrest/qgsarcgisrestdataitems.h +++ b/src/providers/arcgisrest/qgsarcgisrestdataitems.h @@ -190,7 +190,7 @@ class QgsArcGisMapServiceItem : public QgsDataCollectionItem { Q_OBJECT public: - QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers ); + QgsArcGisMapServiceItem( QgsDataItem *parent, const QString &name, const QString &path, const QString &baseUrl, const QString &authcfg, const QgsStringMap &headers, const QString &serviceType ); QVector createChildren() override; bool equal( const QgsDataItem *other ) override; @@ -199,6 +199,7 @@ class QgsArcGisMapServiceItem : public QgsDataCollectionItem QString mBaseUrl; QString mAuthCfg; QgsStringMap mHeaders; + QString mServiceType; }; /**