diff --git a/src/QtLocationPlugin/GoogleMapProvider.cpp b/src/QtLocationPlugin/GoogleMapProvider.cpp index bc2e89259b8100f6ca4bf02c783e6190925dabe7..bbbac5e144bdcafd334ccc474795733ebc8fed0f 100644 --- a/src/QtLocationPlugin/GoogleMapProvider.cpp +++ b/src/QtLocationPlugin/GoogleMapProvider.cpp @@ -5,11 +5,10 @@ #endif #include "QGCMapEngine.h" -#define AVERAGE_GOOGLE_STREET_MAP 4913 -GoogleMapProvider::GoogleMapProvider(QObject* parent) +GoogleMapProvider::GoogleMapProvider(quint32 averageSize, QGeoMapType::MapStyle mapType ,QObject* parent) : MapProvider(QString("https://www.google.com/maps/preview"), - QString("png"), quint32(AVERAGE_GOOGLE_STREET_MAP), parent), + QString("png"), averageSize, mapType, parent), _googleVersionRetrieved(false), _googleReply(nullptr) { // Google version strings @@ -127,7 +126,7 @@ void GoogleMapProvider::_tryCorrectGoogleVersions( } } -QString GoogleMapProvider::_getURL(int x, int y, int zoom, +QString GoogleStreetMapProvider::_getURL(int x, int y, int zoom, QNetworkAccessManager* networkManager) { // http://mt1.google.com/vt/lyrs=m QString server = "mt"; diff --git a/src/QtLocationPlugin/GoogleMapProvider.h b/src/QtLocationPlugin/GoogleMapProvider.h index d5af063d52d4c5b723996c37a2167f2d11b653a8..4765b16a371257e4788fa43edbaa458319827882 100644 --- a/src/QtLocationPlugin/GoogleMapProvider.h +++ b/src/QtLocationPlugin/GoogleMapProvider.h @@ -3,16 +3,17 @@ #include "MapProvider.h" #include +#include #include #include -#include #include -#include +#include class GoogleMapProvider : public MapProvider { Q_OBJECT public: - GoogleMapProvider(QObject* parent); + GoogleMapProvider(quint32 averageSize, QGeoMapType::MapStyle mapType, + QObject* parent); ~GoogleMapProvider(); @@ -25,8 +26,8 @@ class GoogleMapProvider : public MapProvider { protected: // Define the url to Request - QString _getURL(int x, int y, int zoom, - QNetworkAccessManager* networkManager) ; + virtual QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) = 0; // Google Specific private methods void _getSecGoogleWords(int x, int y, QString& sec1, QString& sec2); @@ -43,28 +44,78 @@ class GoogleMapProvider : public MapProvider { QString _secGoogleWord; }; +// NoMap = 0, +// StreetMap, +// SatelliteMapDay, +// SatelliteMapNight, +// TerrainMap, +// HybridMap, +// TransitMap, +// GrayStreetMap, +// PedestrianMap, +// CarNavigationMap, +// CycleMap, +// CustomMap = 100 + +const unsigned int AVERAGE_GOOGLE_STREET_MAP = 4913; +const unsigned int AVERAGE_GOOGLE_SAT_MAP = 56887; +const unsigned int AVERAGE_GOOGLE_TERRAIN_MAP = 19391; + +// ----------------------------------------------------------- +// Google Street Map + +class GoogleStreetMapProvider : public GoogleMapProvider { + Q_OBJECT + public: + GoogleStreetMapProvider(QObject* parent) + : GoogleMapProvider(AVERAGE_GOOGLE_STREET_MAP, QGeoMapType::StreetMap, + parent) {} + + protected: + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +// ----------------------------------------------------------- +// Google Street Map + class GoogleSatelliteMapProvider : public GoogleMapProvider { Q_OBJECT public: - GoogleSatelliteMapProvider(QObject* parent):GoogleMapProvider(parent){} + GoogleSatelliteMapProvider(QObject* parent) + : GoogleMapProvider(AVERAGE_GOOGLE_SAT_MAP, + QGeoMapType::SatelliteMapDay, parent) {} + protected: QString _getURL(int x, int y, int zoom, QNetworkAccessManager* networkManager); }; +// ----------------------------------------------------------- +// Google Labels Map + class GoogleLabelsMapProvider : public GoogleMapProvider { Q_OBJECT public: - GoogleLabelsMapProvider(QObject* parent):GoogleMapProvider(parent){} + GoogleLabelsMapProvider(QObject* parent) + : GoogleMapProvider(AVERAGE_TILE_SIZE, QGeoMapType::CustomMap, parent) { + } + protected: QString _getURL(int x, int y, int zoom, QNetworkAccessManager* networkManager); }; +// ----------------------------------------------------------- +// Google Terrain Map + class GoogleTerrainMapProvider : public GoogleMapProvider { Q_OBJECT public: - GoogleTerrainMapProvider(QObject* parent):GoogleMapProvider(parent){} + GoogleTerrainMapProvider(QObject* parent) + : GoogleMapProvider(AVERAGE_GOOGLE_TERRAIN_MAP, QGeoMapType::TerrainMap, + parent) {} + protected: QString _getURL(int x, int y, int zoom, QNetworkAccessManager* networkManager); diff --git a/src/QtLocationPlugin/MapProvider.cpp b/src/QtLocationPlugin/MapProvider.cpp index ba4b81b4fecbfbb90db28d9b7cc749fab579c47e..a6ba45bdaec18b915ebed9e54eb249a26fc7d14f 100644 --- a/src/QtLocationPlugin/MapProvider.cpp +++ b/src/QtLocationPlugin/MapProvider.cpp @@ -1,9 +1,9 @@ #include "MapProvider.h" MapProvider::MapProvider(QString referrer, QString imageFormat, - quint32 averageSize, QObject* parent) + quint32 averageSize, QGeoMapType::MapStyle mapType,QObject* parent) : QObject(parent), _referrer(referrer), _imageFormat(imageFormat), - _averageSize(averageSize) { + _averageSize(averageSize), _mapType(mapType) { QStringList langs = QLocale::system().uiLanguages(); if (langs.length() > 0) { _language = langs[0]; diff --git a/src/QtLocationPlugin/MapProvider.h b/src/QtLocationPlugin/MapProvider.h index b40ad5bd8e08afe65294759db5c37c4904860f46..8bf517b6986216f80af8551c7fee45c43ffb16b7 100644 --- a/src/QtLocationPlugin/MapProvider.h +++ b/src/QtLocationPlugin/MapProvider.h @@ -4,32 +4,45 @@ #include #include #include +#include -static const unsigned char pngSignature[] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00}; -static const unsigned char jpegSignature[] = {0xFF, 0xD8, 0xFF, 0x00}; -static const unsigned char gifSignature[] = {0x47, 0x49, 0x46, 0x38, 0x00}; +static const unsigned char pngSignature[] = {0x89, 0x50, 0x4E, 0x47, 0x0D, + 0x0A, 0x1A, 0x0A, 0x00}; +static const unsigned char jpegSignature[] = {0xFF, 0xD8, 0xFF, 0x00}; +static const unsigned char gifSignature[] = {0x47, 0x49, 0x46, 0x38, 0x00}; + +const unsigned int AVERAGE_BING_STREET_MAP = 1297; +const unsigned int AVERAGE_BING_SAT_MAP = 19597; +const unsigned int AVERAGE_MAPBOX_SAT_MAP = 15739; +const unsigned int AVERAGE_MAPBOX_STREET_MAP = 5648; +const unsigned int AVERAGE_TILE_SIZE = 13652; +const unsigned int AVERAGE_AIRMAP_ELEV_SIZE = 2786; class MapProvider : public QObject { Q_OBJECT public: - MapProvider(QString referrer, QString imageFormat, quint32 averageSize, - QObject* parent = nullptr); + MapProvider( + QString referrer, QString imageFormat, quint32 averageSize, + QGeoMapType::MapStyle _mapType = QGeoMapType::CustomMap, QObject* parent = nullptr); QNetworkRequest getTileURL(int x, int y, int zoom, QNetworkAccessManager* networkManager); QString getImageFormat(const QByteArray& image); + QGeoMapType::MapStyle getMapStyle(){return _mapType;} + protected: - QString _tileXYToQuadKey (int tileX, int tileY, int levelOfDetail); - int _getServerNum (int x, int y, int max); + QString _tileXYToQuadKey(int tileX, int tileY, int levelOfDetail); + int _getServerNum(int x, int y, int max); // Define Referrer for Request RawHeader - QString _referrer; - QString _imageFormat; - quint32 _averageSize; - QByteArray _userAgent; - QString _language; + QString _referrer; + QString _imageFormat; + quint32 _averageSize; + QByteArray _userAgent; + QString _language; + QGeoMapType::MapStyle _mapType; // Define the url to Request virtual QString _getURL(int x, int y, int zoom, diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index 58f528c253ef683a42d1e320d654323b33ae16dc..3b17d437252e54b3f8afc50251bb9d698b10d742 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -29,14 +29,6 @@ #include -#define AVERAGE_GOOGLE_TERRAIN_MAP 19391 -#define AVERAGE_BING_STREET_MAP 1297 -#define AVERAGE_BING_SAT_MAP 19597 -#define AVERAGE_GOOGLE_SAT_MAP 56887 -#define AVERAGE_MAPBOX_SAT_MAP 15739 -#define AVERAGE_MAPBOX_STREET_MAP 5648 -#define AVERAGE_TILE_SIZE 13652 -#define AVERAGE_AIRMAP_ELEV_SIZE 2786 //----------------------------------------------------------------------------- UrlFactory::UrlFactory() @@ -46,7 +38,7 @@ UrlFactory::UrlFactory() // BingMaps //_versionBingMaps = "563"; #ifndef QGC_NO_GOOGLE_MAPS - _providersTable["GoogleStreet"] = new GoogleMapProvider(this); + _providersTable["GoogleStreet"] = new GoogleStreetMapProvider(this); _providersTable["GoogleSatellite"] = new GoogleSatelliteMapProvider(this); #endif _curMapProvider = _providersTable["GoogleStreet"]; diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.h b/src/QtLocationPlugin/QGCMapUrlEngine.h index d86632b3b38305e44da062e8fc0d434b60692951..29aed1162e42a3c0109789732a9d06fedf0d2b1f 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.h +++ b/src/QtLocationPlugin/QGCMapUrlEngine.h @@ -85,18 +85,16 @@ public: static quint32 averageSizeForType (MapType type); - -//private: -// QString _getURL (MapType type, int x, int y, int zoom, QNetworkAccessManager* networkManager); + QHash getProviderTable(){return _providersTable;} private: int _timeout; + QHash _providersTable; // BingMaps //QString _versionBingMaps; MapProvider* _curMapProvider; - QHash _providersTable; }; diff --git a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp index 1b562748facad1362470fc544c37182c0d1bca71..935b3567d2dfbd73e7e477bda27e3e9bb6c6d536 100644 --- a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp +++ b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp @@ -100,71 +100,82 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian * Google and Bing don't seem kosher at all. This was based on original code from OpenPilot and heavily modified to be used in QGC. */ + QList mapList; + QHashIterator i(getQGCMapEngine()->urlFactory()->getProviderTable()); + int id = 0; + + while(i.hasNext()){ + i.next(); + id++; + mapList.append(QGCGEOMAPTYPE(i.value()->getMapStyle(), i.key(), i.key(), false, false, id)); + } + setSupportedMapTypes(mapList); + //-- IMPORTANT // Changes here must reflect those in QGCMapEngine.cpp - setSupportedMapTypes({ -#ifndef QGC_NO_GOOGLE_MAPS - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Google Street Map", "Google street map", false, false, UrlFactory::GoogleMap), - QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Google Satellite Map", "Google satellite map", false, false, UrlFactory::GoogleSatellite), - QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Google Terrain Map", "Google terrain map", false, false, UrlFactory::GoogleTerrain), -#endif - - /* TODO: - * Proper google hybrid maps requires collecting two separate bitmaps and overlaying them. - * - * mapTypes << QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Google Hybrid Map", "Google hybrid map", false, false, UrlFactory::GoogleHybrid), - * - */ - - // Bing - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Bing Street Map", "Bing street map", false, false, UrlFactory::BingMap), - QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Bing Satellite Map", "Bing satellite map", false, false, UrlFactory::BingSatellite), - QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Bing Hybrid Map", "Bing hybrid map", false, false, UrlFactory::BingHybrid), - - // Statkart - QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Statkart Terrain Map", "Statkart Terrain Map", false, false, UrlFactory::StatkartTopo), - // Eniro - QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Eniro Terrain Map", "Eniro Terrain Map", false, false, UrlFactory::EniroTopo), - - // Esri - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Esri Street Map", "ArcGIS Online World Street Map", true, false, UrlFactory::EsriWorldStreet), - QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Esri Satellite Map", "ArcGIS Online World Imagery", true, false, UrlFactory::EsriWorldSatellite), - QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Esri Terrain Map", "World Terrain Base", false, false, UrlFactory::EsriTerrain), - - // VWorld - QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "VWorld Satellite Map", "VWorld Satellite Map", false, false, UrlFactory::VWorldSatellite), - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "VWorld Street Map", "VWorld Street Map", false, false, UrlFactory::VWorldStreet), - - /* See: https://wiki.openstreetmap.org/wiki/Tile_usage_policy - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Open Street Map", "Open Street map", false, false, UrlFactory::OpenStreetMap), - */ - - // MapQuest - /* - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "MapQuest Street Map", "MapQuest street map", false, false, UrlFactory::MapQuestMap), - QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "MapQuest Satellite Map", "MapQuest satellite map", false, false, UrlFactory::MapQuestSat), - */ - - /* - * These are OK as you need your own token for accessing it. Out-of-the box, QGC does not even offer these unless you enter a proper Mapbox token. - */ - - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Street Map", "Mapbox Street Map", false, false, UrlFactory::MapboxStreets), - QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Mapbox Satellite Map", "Mapbox Satellite Map", false, false, UrlFactory::MapboxSatellite), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox High Contrast Map", "Mapbox High Contrast Map", false, false, UrlFactory::MapboxHighContrast), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Light Map", "Mapbox Light Map", false, false, UrlFactory::MapboxLight), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Dark Map", "Mapbox Dark Map", false, false, UrlFactory::MapboxDark), - QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Mapbox Hybrid Map", "Mapbox Hybrid Map", false, false, UrlFactory::MapboxHybrid), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Wheat Paste Map", "Mapbox Wheat Paste Map", false, false, UrlFactory::MapboxWheatPaste), - QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Streets Basic Map", "Mapbox Streets Basic Map", false, false, UrlFactory::MapboxStreetsBasic), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Comic Map", "Mapbox Comic Map", false, false, UrlFactory::MapboxComic), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Outdoors Map", "Mapbox Outdoors Map", false, false, UrlFactory::MapboxOutdoors), - QGCGEOMAPTYPE(QGeoMapType::CycleMap, "Mapbox Run, Byke and Hike Map", "Mapbox Run, Byke and Hike Map", false, false, UrlFactory::MapboxRunBikeHike), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pencil Map", "Mapbox Pencil Map", false, false, UrlFactory::MapboxPencil), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pirates Map", "Mapbox Pirates Map", false, false, UrlFactory::MapboxPirates), - QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Emerald Map", "Mapbox Emerald Map", false, false, UrlFactory::MapboxEmerald), - }); +// setSupportedMapTypes({ +//#ifndef QGC_NO_GOOGLE_MAPS +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Google Street Map", "Google street map", false, false, UrlFactory::GoogleMap), +// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Google Satellite Map", "Google satellite map", false, false, UrlFactory::GoogleSatellite), +// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Google Terrain Map", "Google terrain map", false, false, UrlFactory::GoogleTerrain), +//#endif +// +// /* TODO: +// * Proper google hybrid maps requires collecting two separate bitmaps and overlaying them. +// * +// * mapTypes << QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Google Hybrid Map", "Google hybrid map", false, false, UrlFactory::GoogleHybrid), +// * +// */ +// +// // Bing +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Bing Street Map", "Bing street map", false, false, UrlFactory::BingMap), +// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Bing Satellite Map", "Bing satellite map", false, false, UrlFactory::BingSatellite), +// QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Bing Hybrid Map", "Bing hybrid map", false, false, UrlFactory::BingHybrid), +// +// // Statkart +// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Statkart Terrain Map", "Statkart Terrain Map", false, false, UrlFactory::StatkartTopo), +// // Eniro +// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Eniro Terrain Map", "Eniro Terrain Map", false, false, UrlFactory::EniroTopo), +// +// // Esri +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Esri Street Map", "ArcGIS Online World Street Map", true, false, UrlFactory::EsriWorldStreet), +// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Esri Satellite Map", "ArcGIS Online World Imagery", true, false, UrlFactory::EsriWorldSatellite), +// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Esri Terrain Map", "World Terrain Base", false, false, UrlFactory::EsriTerrain), +// +// // VWorld +// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "VWorld Satellite Map", "VWorld Satellite Map", false, false, UrlFactory::VWorldSatellite), +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "VWorld Street Map", "VWorld Street Map", false, false, UrlFactory::VWorldStreet), +// +// /* See: https://wiki.openstreetmap.org/wiki/Tile_usage_policy +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Open Street Map", "Open Street map", false, false, UrlFactory::OpenStreetMap), +// */ +// +// // MapQuest +// /* +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "MapQuest Street Map", "MapQuest street map", false, false, UrlFactory::MapQuestMap), +// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "MapQuest Satellite Map", "MapQuest satellite map", false, false, UrlFactory::MapQuestSat), +// */ +// +// /* +// * These are OK as you need your own token for accessing it. Out-of-the box, QGC does not even offer these unless you enter a proper Mapbox token. +// */ +// +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Street Map", "Mapbox Street Map", false, false, UrlFactory::MapboxStreets), +// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Mapbox Satellite Map", "Mapbox Satellite Map", false, false, UrlFactory::MapboxSatellite), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox High Contrast Map", "Mapbox High Contrast Map", false, false, UrlFactory::MapboxHighContrast), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Light Map", "Mapbox Light Map", false, false, UrlFactory::MapboxLight), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Dark Map", "Mapbox Dark Map", false, false, UrlFactory::MapboxDark), +// QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Mapbox Hybrid Map", "Mapbox Hybrid Map", false, false, UrlFactory::MapboxHybrid), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Wheat Paste Map", "Mapbox Wheat Paste Map", false, false, UrlFactory::MapboxWheatPaste), +// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Streets Basic Map", "Mapbox Streets Basic Map", false, false, UrlFactory::MapboxStreetsBasic), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Comic Map", "Mapbox Comic Map", false, false, UrlFactory::MapboxComic), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Outdoors Map", "Mapbox Outdoors Map", false, false, UrlFactory::MapboxOutdoors), +// QGCGEOMAPTYPE(QGeoMapType::CycleMap, "Mapbox Run, Byke and Hike Map", "Mapbox Run, Byke and Hike Map", false, false, UrlFactory::MapboxRunBikeHike), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pencil Map", "Mapbox Pencil Map", false, false, UrlFactory::MapboxPencil), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pirates Map", "Mapbox Pirates Map", false, false, UrlFactory::MapboxPirates), +// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Emerald Map", "Mapbox Emerald Map", false, false, UrlFactory::MapboxEmerald), +// }); //-- Users (QML code) can define a different user agent if (parameters.contains(QStringLiteral("useragent"))) {