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 "qgis.h" // GEO_EPSG_CRS_ID
23 #include "qgsdatasourceuri.h"
24 #include "qgslogger.h"
25 #include "qgsproject.h"
26 #include "qgsproviderregistry.h"
27 #include "qgsowsconnection.h"
28 #include "qgssettings.h"
29 
30 #include <QPicture>
31 #include <QUrl>
32 #include <QNetworkRequest>
33 #include <QNetworkReply>
34 
QgsOwsConnection(const QString & service,const QString & connName)35 QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connName )
36   : mConnName( connName )
37   , mService( service )
38 {
39   QgsDebugMsgLevel( "theConnName = " + connName, 4 );
40 
41   const QgsSettings settings;
42 
43   const QString key = "qgis/connections-" + mService.toLower() + '/' + mConnName;
44   const QString credentialsKey = "qgis/" + mService + '/' + mConnName;
45 
46   mConnectionInfo = settings.value( key + "/url" ).toString();
47   mUri.setParam( QStringLiteral( "url" ), settings.value( key + "/url" ).toString() );
48 
49   // Check for credentials and prepend to the connection info
50   const QString username = settings.value( credentialsKey + "/username" ).toString();
51   const QString password = settings.value( credentialsKey + "/password" ).toString();
52   if ( !username.isEmpty() )
53   {
54     // check for a password, if none prompt to get it
55     mUri.setUsername( username );
56     mUri.setPassword( password );
57   }
58 
59   const QString authcfg = settings.value( credentialsKey + "/authcfg" ).toString();
60   if ( !authcfg.isEmpty() )
61   {
62     mUri.setAuthConfigId( authcfg );
63   }
64   mConnectionInfo.append( ",authcfg=" + authcfg );
65 
66   const QString referer = settings.value( key + "/referer" ).toString();
67   if ( !referer.isEmpty() )
68   {
69     mUri.setParam( QStringLiteral( "referer" ), referer );
70     mConnectionInfo.append( ",referer=" + referer );
71   }
72 
73   if ( mService.compare( QLatin1String( "WMS" ), Qt::CaseInsensitive ) == 0
74        || mService.compare( QLatin1String( "WCS" ), Qt::CaseInsensitive ) == 0 )
75   {
76     addWmsWcsConnectionSettings( mUri, key );
77   }
78   else if ( mService.compare( QLatin1String( "WFS" ), Qt::CaseInsensitive ) == 0 )
79   {
80     addWfsConnectionSettings( mUri, key );
81   }
82 
83   QgsDebugMsgLevel( QStringLiteral( "encoded uri: '%1'." ).arg( QString( mUri.encodedUri() ) ), 4 );
84 }
85 
connectionName() const86 QString QgsOwsConnection::connectionName() const
87 {
88   return mConnName;
89 }
90 
connectionInfo() const91 QString QgsOwsConnection::connectionInfo() const
92 {
93   return mConnectionInfo;
94 }
95 
service() const96 QString QgsOwsConnection::service() const
97 {
98   return mService;
99 }
100 
uri() const101 QgsDataSourceUri QgsOwsConnection::uri() const
102 {
103   return mUri;
104 }
105 
addWmsWcsConnectionSettings(QgsDataSourceUri & uri,const QString & settingsKey)106 QgsDataSourceUri &QgsOwsConnection::addWmsWcsConnectionSettings( QgsDataSourceUri &uri, const QString &settingsKey )
107 {
108   addCommonConnectionSettings( uri, settingsKey );
109 
110   const QgsSettings settings;
111   const QString referer = settings.value( settingsKey + "/referer" ).toString();
112   if ( !referer.isEmpty() )
113   {
114     uri.setParam( QStringLiteral( "referer" ), referer );
115   }
116   if ( settings.value( settingsKey + QStringLiteral( "/ignoreGetMapURI" ), false ).toBool() )
117   {
118     uri.setParam( QStringLiteral( "IgnoreGetMapUrl" ), QStringLiteral( "1" ) );
119   }
120   if ( settings.value( settingsKey + QStringLiteral( "/ignoreGetFeatureInfoURI" ), false ).toBool() )
121   {
122     uri.setParam( QStringLiteral( "IgnoreGetFeatureInfoUrl" ), QStringLiteral( "1" ) );
123   }
124   if ( settings.value( settingsKey + QStringLiteral( "/smoothPixmapTransform" ), false ).toBool() )
125   {
126     uri.setParam( QStringLiteral( "SmoothPixmapTransform" ), QStringLiteral( "1" ) );
127   }
128   if ( settings.value( settingsKey + QStringLiteral( "/ignoreReportedLayerExtents" ), false ).toBool() )
129   {
130     uri.setParam( QStringLiteral( "IgnoreReportedLayerExtents" ), QStringLiteral( "1" ) );
131   }
132   const QString dpiMode = settings.value( settingsKey + QStringLiteral( "/dpiMode" ), QStringLiteral( "all" ) ).toString();
133   if ( !dpiMode.isEmpty() )
134   {
135     uri.setParam( QStringLiteral( "dpiMode" ), dpiMode );
136   }
137 
138   return uri;
139 }
140 
addWfsConnectionSettings(QgsDataSourceUri & uri,const QString & settingsKey)141 QgsDataSourceUri &QgsOwsConnection::addWfsConnectionSettings( QgsDataSourceUri &uri, const QString &settingsKey )
142 {
143   addCommonConnectionSettings( uri, settingsKey );
144 
145   const QgsSettings settings;
146   const QString version = settings.value( settingsKey + "/version" ).toString();
147   if ( !version.isEmpty() )
148   {
149     uri.setParam( QStringLiteral( "version" ), version );
150   }
151 
152   const QString maxnumfeatures = settings.value( settingsKey + QStringLiteral( "/maxnumfeatures" ) ).toString();
153   if ( !maxnumfeatures.isEmpty() )
154   {
155     uri.setParam( QStringLiteral( "maxNumFeatures" ), maxnumfeatures );
156   }
157 
158   return uri;
159 }
160 
connectionList(const QString & service)161 QStringList QgsOwsConnection::connectionList( const QString &service )
162 {
163   QgsSettings settings;
164   settings.beginGroup( "qgis/connections-" + service.toLower() );
165   return settings.childGroups();
166 }
167 
selectedConnection(const QString & service)168 QString QgsOwsConnection::selectedConnection( const QString &service )
169 {
170   const QgsSettings settings;
171   return settings.value( "qgis/connections-" + service.toLower() + "/selected" ).toString();
172 }
173 
setSelectedConnection(const QString & service,const QString & name)174 void QgsOwsConnection::setSelectedConnection( const QString &service, const QString &name )
175 {
176   QgsSettings settings;
177   settings.setValue( "qgis/connections-" + service.toLower() + "/selected", name );
178 }
179 
addCommonConnectionSettings(QgsDataSourceUri & uri,const QString & key)180 void QgsOwsConnection::addCommonConnectionSettings( QgsDataSourceUri &uri, const QString &key )
181 {
182   const QgsSettings settings;
183 
184   if ( settings.value( key + QStringLiteral( "/ignoreAxisOrientation" ), false ).toBool() )
185   {
186     uri.setParam( QStringLiteral( "IgnoreAxisOrientation" ), QStringLiteral( "1" ) );
187   }
188   if ( settings.value( key + QStringLiteral( "/invertAxisOrientation" ), false ).toBool() )
189   {
190     uri.setParam( QStringLiteral( "InvertAxisOrientation" ), QStringLiteral( "1" ) );
191   }
192 }
193 
deleteConnection(const QString & service,const QString & name)194 void QgsOwsConnection::deleteConnection( const QString &service, const QString &name )
195 {
196   QgsSettings settings;
197   settings.remove( "qgis/connections-" + service.toLower() + '/' + name );
198   settings.remove( "qgis/" + service + '/' + name );
199 }
200