QGIS API Documentation 4.3.0-Master (16eddb2670e)
Loading...
Searching...
No Matches
qgsowsconnection.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsowsconnection.cpp - selector for WMS servers, etc.
3 -------------------
4 begin : 3 April 2005
5 copyright :
6 original : (C) 2005 by Brendan Morley email : morb at ozemail dot com dot au
7 wms search : (C) 2009 Mathias Walker <mwa at sourcepole.ch>, Sourcepole AG
8 wms-c support : (C) 2010 Juergen E. Fischer < jef at norbit dot de >, norBIT GmbH
9 generalized : (C) 2012 Radim Blazek, based on qgswmsconnection.cpp
10
11 ***************************************************************************/
12
13/***************************************************************************
14 * *
15 * This program is free software; you can redistribute it and/or modify *
16 * it under the terms of the GNU General Public License as published by *
17 * the Free Software Foundation; either version 2 of the License, or *
18 * (at your option) any later version. *
19 * *
20 ***************************************************************************/
21
22#include "qgsowsconnection.h"
23
24#include "qgis.h"
25#include "qgsdatasourceuri.h"
26#include "qgshttpheaders.h"
27#include "qgslogger.h"
28#include "qgssettings.h"
31
32#include <QNetworkReply>
33#include <QNetworkRequest>
34#include <QPicture>
35#include <QString>
36#include <QUrl>
37
38#include "moc_qgsowsconnection.cpp"
39
40using namespace Qt::StringLiterals;
41
42const QgsSettingsEntryString *QgsXyzConnectionSettings::settingsUrl = new QgsSettingsEntryString( u"url"_s, sTreeXyzConnections, QString() );
44const QgsSettingsEntryInteger *QgsXyzConnectionSettings::settingsZmin = new QgsSettingsEntryInteger( u"zmin"_s, sTreeXyzConnections, -1 );
45const QgsSettingsEntryInteger *QgsXyzConnectionSettings::settingsZmax = new QgsSettingsEntryInteger( u"zmax"_s, sTreeXyzConnections, -1 );
47 = new QgsSettingsEntryDouble( u"tile-pixel-ratio"_s, sTreeXyzConnections, 0, u"0 = unknown (not scaled), 1.0 = 256x256, 2.0 = 512x512"_s );
48const QgsSettingsEntryBool *QgsXyzConnectionSettings::settingsHidden = new QgsSettingsEntryBool( u"hidden"_s, sTreeXyzConnections, false );
49const QgsSettingsEntryString *QgsXyzConnectionSettings::settingsInterpretation = new QgsSettingsEntryString( u"interpretation"_s, sTreeXyzConnections, QString() );
53
54
60const QgsSettingsEntryString *QgsArcGisConnectionSettings::settingsUrlPrefix = new QgsSettingsEntryString( u"urlprefix"_s, sTreeConnectionArcgis );
61const QgsSettingsEntryString *QgsArcGisConnectionSettings::settingsContentEndpoint = new QgsSettingsEntryString( u"content-endpoint"_s, sTreeConnectionArcgis );
62const QgsSettingsEntryString *QgsArcGisConnectionSettings::settingsCommunityEndpoint = new QgsSettingsEntryString( u"community-endpoint"_s, sTreeConnectionArcgis );
63
64
65const QgsSettingsEntryString *QgsOwsConnection::settingsUrl = new QgsSettingsEntryString( u"url"_s, sTreeOwsConnections, QString() );
66const QgsSettingsEntryVariantMap *QgsOwsConnection::settingsHeaders = new QgsSettingsEntryVariantMap( u"http-header"_s, sTreeOwsConnections );
67const QgsSettingsEntryString *QgsOwsConnection::settingsVersion = new QgsSettingsEntryString( u"version"_s, sTreeOwsConnections, QString() );
68const QgsSettingsEntryBool *QgsOwsConnection::settingsIgnoreGetMapURI = new QgsSettingsEntryBool( u"ignore-get-map-uri"_s, sTreeOwsConnections, false );
69const QgsSettingsEntryBool *QgsOwsConnection::settingsIgnoreGetFeatureInfoURI = new QgsSettingsEntryBool( u"ignore-get-feature-info-uri"_s, sTreeOwsConnections, false );
70const QgsSettingsEntryBool *QgsOwsConnection::settingsSmoothPixmapTransform = new QgsSettingsEntryBool( u"smooth-pixmap-transform"_s, sTreeOwsConnections, false );
71const QgsSettingsEntryBool *QgsOwsConnection::settingsReportedLayerExtents = new QgsSettingsEntryBool( u"reported-layer-extents"_s, sTreeOwsConnections, false );
73 = new QgsSettingsEntryEnumFlag<Qgis::DpiMode>( u"dpi-mode"_s, sTreeOwsConnections, Qgis::DpiMode::All, QString(), Qgis::SettingsOption::SaveEnumFlagAsInt );
76const QgsSettingsEntryString *QgsOwsConnection::settingsMaxNumFeatures = new QgsSettingsEntryString( u"max-num-features"_s, sTreeOwsConnections );
77const QgsSettingsEntryString *QgsOwsConnection::settingsPagesize = new QgsSettingsEntryString( u"page-size"_s, sTreeOwsConnections );
78const QgsSettingsEntryString *QgsOwsConnection::settingsPagingEnabled = new QgsSettingsEntryString( u"paging-enabled"_s, sTreeOwsConnections, QString( "default" ) );
79const QgsSettingsEntryString *QgsOwsConnection::settingsDefaultFeatureFormat = new QgsSettingsEntryString( u"default-feature-format"_s, sTreeOwsConnections, QString() );
80const QgsSettingsEntryStringList *QgsOwsConnection::settingsAvailableFeatureFormats = new QgsSettingsEntryStringList( u"available-feature-formats"_s, sTreeOwsConnections, {} );
81const QgsSettingsEntryString *QgsOwsConnection::settingsWfsFeatureMode = new QgsSettingsEntryString( u"feature-mode"_s, sTreeOwsConnections, QString( "default" ) );
82const QgsSettingsEntryBool *QgsOwsConnection::settingsPreferCoordinatesForWfsT11 = new QgsSettingsEntryBool( u"prefer-coordinates-for-wfs-T11"_s, sTreeOwsConnections, false );
83const QgsSettingsEntryBool *QgsOwsConnection::settingsWfsForceInitialGetFeature = new QgsSettingsEntryBool( u"force-initial-get-feature"_s, sTreeOwsConnections, false );
84const QgsSettingsEntryString *QgsOwsConnection::settingsDefaultImageFormat = new QgsSettingsEntryString( u"default-image-format"_s, sTreeOwsConnections, QString() );
85const QgsSettingsEntryStringList *QgsOwsConnection::settingsAvailableImageFormats = new QgsSettingsEntryStringList( u"available-image-formats"_s, sTreeOwsConnections, {} );
86const QgsSettingsEntryBool *QgsOwsConnection::settingsIgnoreAxisOrientation = new QgsSettingsEntryBool( u"ignore-axis-orientation"_s, sTreeOwsConnections, false );
87const QgsSettingsEntryBool *QgsOwsConnection::settingsInvertAxisOrientation = new QgsSettingsEntryBool( u"invert-axis-orientation"_s, sTreeOwsConnections, false );
88const QgsSettingsEntryBool *QgsOwsConnection::settingsDisableDecompressedSafetyCheckThreshold = new QgsSettingsEntryBool( u"disable-decompressed-safety-check-threshold"_s, sTreeOwsConnections, false );
89const QgsSettingsEntryString *QgsOwsConnection::settingsUsername = new QgsSettingsEntryString( u"username"_s, sTreeOwsConnections );
90const QgsSettingsEntryString *QgsOwsConnection::settingsPassword = new QgsSettingsEntryString( u"password"_s, sTreeOwsConnections );
91const QgsSettingsEntryString *QgsOwsConnection::settingsAuthCfg = new QgsSettingsEntryString( u"authcfg"_s, sTreeOwsConnections );
92const QgsSettingsEntryInteger *QgsOwsConnection::settingsFeatureCount = new QgsSettingsEntryInteger( u"feature-count"_s, sTreeOwsConnections, 10 );
94 = new QgsSettingsEntryEnumFlag<Qgis::HttpMethod>( u"http-method"_s, sTreeOwsConnections, Qgis::HttpMethod::Get, QString() );
95
96QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connName )
97 : mConnName( connName )
98 , mService( service )
99{
100 QgsDebugMsgLevel( "theConnName = " + connName, 4 );
101
102 const QString url = settingsUrl->value( { mService.toLower(), mConnName } );
103 mConnectionInfo = url;
104 mUri.setParam( u"url"_s, url );
105
106 // Check for credentials and prepend to the connection info
107 const QString username = settingsUsername->value( { mService.toLower(), mConnName } );
108 const QString password = settingsPassword->value( { mService.toLower(), mConnName } );
109 if ( !username.isEmpty() )
110 {
111 // check for a password, if none prompt to get it
112 mUri.setUsername( username );
113 mUri.setPassword( password );
114 }
115
116 const QString authcfg = settingsAuthCfg->value( { mService.toLower(), mConnName } );
117 if ( !authcfg.isEmpty() )
118 {
119 mUri.setAuthConfigId( authcfg );
120 }
121 mConnectionInfo.append( ",authcfg=" + authcfg );
122
123 QgsHttpHeaders httpHeaders( settingsHeaders->value( { mService.toLower(), mConnName } ) );
124 mUri.setHttpHeaders( httpHeaders );
125 const QString referer = httpHeaders[QgsHttpHeaders::KEY_REFERER].toString();
126 if ( !referer.isEmpty() )
127 {
128 mConnectionInfo.append( ",referer=" + referer );
129 }
130
131 if ( mService.compare( "WMS"_L1, Qt::CaseInsensitive ) == 0 || mService.compare( "WCS"_L1, Qt::CaseInsensitive ) == 0 )
132 {
134 }
135 else if ( mService.compare( "WFS"_L1, Qt::CaseInsensitive ) == 0 )
136 {
138 }
139
140 QgsDebugMsgLevel( u"encoded uri: '%1'."_s.arg( QString( mUri.encodedUri() ) ), 4 );
141}
142
144{
145 return mConnName;
146}
147
149{
150 return mConnectionInfo;
151}
152
154{
155 return mService;
156}
157
159{
160 return mUri;
161}
162
164{
166 addCommonConnectionSettings( uri, settingsKey );
168
169 const QgsSettings settings;
170 uri.httpHeaders().setFromSettings( settings, settingsKey );
171
172 if ( settings.value( settingsKey + u"/ignoreGetMapURI"_s, false ).toBool() )
173 {
174 uri.setParam( u"IgnoreGetMapUrl"_s, u"1"_s );
175 }
176 if ( settings.value( settingsKey + u"/ignoreGetFeatureInfoURI"_s, false ).toBool() )
177 {
178 uri.setParam( u"IgnoreGetFeatureInfoUrl"_s, u"1"_s );
179 }
180 if ( settings.value( settingsKey + u"/smoothPixmapTransform"_s, false ).toBool() )
181 {
182 uri.setParam( u"SmoothPixmapTransform"_s, u"1"_s );
183 }
184 if ( settings.value( settingsKey + u"/ignoreReportedLayerExtents"_s, false ).toBool() )
185 {
186 uri.setParam( u"IgnoreReportedLayerExtents"_s, u"1"_s );
187 }
188 const QString dpiMode = settings.value( settingsKey + u"/dpiMode"_s, u"all"_s ).toString();
189 if ( !dpiMode.isEmpty() )
190 {
191 uri.setParam( u"dpiMode"_s, dpiMode );
192 }
193 const QString tilePixelRatio = settings.value( settingsKey + u"/tilePixelRatio"_s, "0" ).toString();
194 if ( tilePixelRatio != "0"_L1 )
195 {
196 uri.setParam( u"tilePixelRatio"_s, tilePixelRatio );
197 }
198
199 return uri;
200}
201
203{
204 addCommonConnectionSettings( uri, service, connName );
205
206 uri.setHttpHeaders( QgsHttpHeaders( settingsHeaders->value( { service.toLower(), connName } ) ) );
207
208 if ( settingsIgnoreGetMapURI->value( { service.toLower(), connName } ) )
209 {
210 uri.setParam( u"IgnoreGetMapUrl"_s, u"1"_s );
211 }
212 if ( settingsIgnoreGetFeatureInfoURI->value( { service.toLower(), connName } ) )
213 {
214 uri.setParam( u"IgnoreGetFeatureInfoUrl"_s, u"1"_s );
215 }
216 if ( settingsSmoothPixmapTransform->value( { service.toLower(), connName } ) )
217 {
218 uri.setParam( u"SmoothPixmapTransform"_s, u"1"_s );
219 }
220 if ( settingsReportedLayerExtents->value( { service.toLower(), connName } ) )
221 {
222 uri.setParam( u"IgnoreReportedLayerExtents"_s, u"1"_s );
223 }
224 if ( settingsDpiMode->exists( { service.toLower(), connName } ) )
225 {
226 uri.setParam( u"dpiMode"_s, QString::number( static_cast<int>( settingsDpiMode->value( { service.toLower(), connName } ) ) ) );
227 }
228 if ( settingsTilePixelRatio->exists( { service.toLower(), connName } ) )
229 {
230 uri.setParam( u"tilePixelRatio"_s, QString::number( static_cast<int>( settingsTilePixelRatio->value( { service.toLower(), connName } ) ) ) );
231 }
232 if ( settingsFeatureCount->exists( { service.toLower(), connName } ) )
233 {
234 uri.setParam( u"featureCount"_s, QString::number( settingsFeatureCount->value( { service.toLower(), connName } ) ) );
235 }
236 // Note: settingsDefaultImageFormat is not part of the connection URI because it's an individual layer setting
237 return uri;
238}
239
241{
243 addCommonConnectionSettings( uri, settingsKey );
245
246 const QgsSettings settings;
247 const QString version = settings.value( settingsKey + "/version" ).toString();
248 if ( !version.isEmpty() )
249 {
250 uri.setParam( u"version"_s, version );
251 }
252
253 const QString maxnumfeatures = settings.value( settingsKey + u"/maxnumfeatures"_s ).toString();
254 if ( !maxnumfeatures.isEmpty() )
255 {
256 uri.setParam( u"maxNumFeatures"_s, maxnumfeatures );
257 }
258
259 return uri;
260}
261
263{
264 addCommonConnectionSettings( uri, service, connName );
265
266 const QString version = settingsVersion->value( { service.toLower(), connName } );
267 if ( !version.isEmpty() )
268 {
269 uri.setParam( u"version"_s, version );
270 }
271
272 const QString maxnumFeatures = settingsMaxNumFeatures->value( { service.toLower(), connName } );
273 if ( !maxnumFeatures.isEmpty() )
274 {
275 uri.setParam( u"maxNumFeatures"_s, maxnumFeatures );
276 }
277
278 const Qgis::HttpMethod httpMethod = settingsPreferredHttpMethod->value( { service.toLower(), connName } );
279 switch ( httpMethod )
280 {
282 // default, we don't set to explicitly set
283 break;
284
286 uri.setParam( u"httpMethod"_s, u"post"_s );
287 break;
288
292 // not supported
293 break;
294 }
295
296 return uri;
297}
298
299QStringList QgsOwsConnection::connectionList( const QString &service )
300{
301 return QgsOwsConnection::sTreeOwsConnections->items( { service.toLower() } );
302}
303
305{
306 return QgsOwsConnection::sTreeOwsConnections->selectedItem( { service.toLower() } );
307}
308
309void QgsOwsConnection::setSelectedConnection( const QString &service, const QString &name )
310{
311 QgsOwsConnection::sTreeOwsConnections->setSelectedItem( name, { service.toLower() } );
312}
313
314void QgsOwsConnection::addCommonConnectionSettings( QgsDataSourceUri &uri, const QString &key )
315{
316 const QgsSettings settings;
317
318 if ( settings.value( key + u"/ignoreAxisOrientation"_s, false ).toBool() )
319 {
320 uri.setParam( u"IgnoreAxisOrientation"_s, u"1"_s );
321 }
322 if ( settings.value( key + u"/invertAxisOrientation"_s, false ).toBool() )
323 {
324 uri.setParam( u"InvertAxisOrientation"_s, u"1"_s );
325 }
326 if ( settings.value( key + u"/disableDecompressedSafetyCheckThreshold"_s, false ).toBool() )
327 {
328 uri.setParam( u"DisableDecompressedSafetyCheckThreshold"_s, u"1"_s );
329 }
330}
331
332void QgsOwsConnection::addCommonConnectionSettings( QgsDataSourceUri &uri, const QString &service, const QString &connectionName )
333{
334 if ( settingsIgnoreAxisOrientation->value( { service.toLower(), connectionName } ) )
335 {
336 uri.setParam( u"IgnoreAxisOrientation"_s, u"1"_s );
337 }
338 if ( settingsInvertAxisOrientation->value( { service.toLower(), connectionName } ) )
339 {
340 uri.setParam( u"InvertAxisOrientation"_s, u"1"_s );
341 }
342 if ( settingsDisableDecompressedSafetyCheckThreshold->value( { service.toLower(), connectionName } ) )
343 {
344 uri.setParam( u"DisableDecompressedSafetyCheckThreshold"_s, u"1"_s );
345 }
346}
347
348void QgsOwsConnection::deleteConnection( const QString &service, const QString &name )
349{
350 sTreeOwsConnections->deleteItem( name, { service.toLower() } );
351}
@ SaveEnumFlagAsInt
The enum/flag will be saved as an integer value instead of text.
Definition qgis.h:787
@ Undefined
Undefined (not scale).
Definition qgis.h:3611
@ All
All.
Definition qgis.h:3597
HttpMethod
Different methods of HTTP requests.
Definition qgis.h:1138
@ Post
POST method.
Definition qgis.h:1140
@ Head
HEAD method.
Definition qgis.h:1141
@ Get
GET method.
Definition qgis.h:1139
@ Put
PUT method.
Definition qgis.h:1142
@ Delete
DELETE method.
Definition qgis.h:1143
static const QgsSettingsEntryString * settingsUsername
static const QgsSettingsEntryString * settingsUrl
static const QgsSettingsEntryString * settingsPassword
static const QgsSettingsEntryVariantMap * settingsHeaders
static const QgsSettingsEntryString * settingsContentEndpoint
static const QgsSettingsEntryString * settingsUrlPrefix
static const QgsSettingsEntryString * settingsAuthcfg
static const QgsSettingsEntryString * settingsCommunityEndpoint
Stores the component parts of a data source URI (e.g.
void setParam(const QString &key, const QString &value)
Sets a generic parameter value on the URI.
Implements simple HTTP header management.
static const QString KEY_REFERER
Used in settings as the referer key.
static const QgsSettingsEntryInteger * settingsFeatureCount
static const QgsSettingsEntryStringList * settingsAvailableImageFormats
static const QgsSettingsEntryBool * settingsPreferCoordinatesForWfsT11
static const QgsSettingsEntryEnumFlag< Qgis::HttpMethod > * settingsPreferredHttpMethod
static Q_DECL_DEPRECATED QgsDataSourceUri & addWmsWcsConnectionSettings(QgsDataSourceUri &uri, const QString &settingsKey)
Adds uri parameters relating to the settings for a WMS or WCS connection to a QgsDataSourceUri uri.
static QStringList connectionList(const QString &service)
Returns the list of connections for the specified service.
static const QgsSettingsEntryString * settingsPagingEnabled
static const QgsSettingsEntryString * settingsDefaultImageFormat
static const QgsSettingsEntryString * settingsMaxNumFeatures
static QgsSettingsTreeNamedListNode * sTreeOwsConnections
QgsDataSourceUri mUri
static const QgsSettingsEntryBool * settingsIgnoreGetFeatureInfoURI
static const QgsSettingsEntryString * settingsPassword
static const QgsSettingsEntryBool * settingsReportedLayerExtents
static void setSelectedConnection(const QString &service, const QString &name)
Marks the specified connection for the specified service as selected.
static const QgsSettingsEntryString * settingsWfsFeatureMode
static const QgsSettingsEntryEnumFlag< Qgis::DpiMode > * settingsDpiMode
static const QgsSettingsEntryBool * settingsWfsForceInitialGetFeature
static const QgsSettingsEntryBool * settingsIgnoreAxisOrientation
static const QgsSettingsEntryString * settingsDefaultFeatureFormat
static const QgsSettingsEntryBool * settingsInvertAxisOrientation
static const QgsSettingsEntryString * settingsVersion
QString connectionInfo() const
Returns connection info string.
static void deleteConnection(const QString &service, const QString &name)
Deletes the connection for the specified service with the specified name.
static const QgsSettingsEntryString * settingsPagesize
static const QgsSettingsEntryString * settingsAuthCfg
static const QgsSettingsEntryEnumFlag< Qgis::TilePixelRatio > * settingsTilePixelRatio
static const QgsSettingsEntryVariantMap * settingsHeaders
static Q_DECL_DEPRECATED QgsDataSourceUri & addWfsConnectionSettings(QgsDataSourceUri &uri, const QString &settingsKey)
Adds uri parameters relating to the settings for a WFS connection to a QgsDataSourceUri uri.
QString connectionName() const
Returns the connection name.
static const QgsSettingsEntryString * settingsUsername
static const QgsSettingsEntryBool * settingsSmoothPixmapTransform
static const QgsSettingsEntryString * settingsUrl
static const QgsSettingsEntryBool * settingsDisableDecompressedSafetyCheckThreshold
static QString selectedConnection(const QString &service)
Retrieves the selected connection for the specified service.
static const QgsSettingsEntryBool * settingsIgnoreGetMapURI
QgsOwsConnection(const QString &service, const QString &connName)
Constructor.
static const QgsSettingsEntryStringList * settingsAvailableFeatureFormats
QgsDataSourceUri uri() const
Returns the connection uri.
QString service() const
Returns a string representing the service type, e.g.
A boolean settings entry.
A double settings entry.
A template class for enum and flag settings entry.
An integer settings entry.
A string list settings entry.
A string settings entry.
A string list settings entry.
Stores settings for use within QGIS.
Definition qgssettings.h:68
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
static const QgsSettingsEntryString * settingsPassword
static const QgsSettingsEntryDouble * settingsTilePixelRatio
static const QgsSettingsEntryString * settingsInterpretation
static const QgsSettingsEntryString * settingsUsername
static const QgsSettingsEntryString * settingsAuthcfg
static const QgsSettingsEntryInteger * settingsZmin
static const QgsSettingsEntryBool * settingsHidden
static const QgsSettingsEntryInteger * settingsZmax
static const QgsSettingsEntryString * settingsUrl
static const QgsSettingsEntryVariantMap * settingsHeaders
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:8379
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:8378
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:80