QGIS API Documentation  3.24.2-Tisler (13c1a02865)
qgsvectortileconnection.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectortileconnection.cpp
3  ---------------------
4  begin : March 2020
5  copyright : (C) 2020 by Martin Dobias
6  email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
17 
18 #include "qgslogger.h"
19 #include "qgsdatasourceuri.h"
20 #include "qgssettings.h"
21 #include "qgshttpheaders.h"
22 
23 #include <QFileInfo>
24 
26 
27 QString QgsVectorTileProviderConnection::encodedUri( const QgsVectorTileProviderConnection::Data &conn )
28 {
29  QgsDataSourceUri uri;
30 
31  const QFileInfo info( conn.url );
32  QString suffix = info.suffix().toLower();
33  if ( suffix.startsWith( QLatin1String( "mbtiles" ) ) )
34  {
35  uri.setParam( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
36  }
37  else
38  {
39  uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
40  }
41 
42  uri.setParam( QStringLiteral( "url" ), conn.url );
43  if ( conn.zMin != -1 )
44  uri.setParam( QStringLiteral( "zmin" ), QString::number( conn.zMin ) );
45  if ( conn.zMax != -1 )
46  uri.setParam( QStringLiteral( "zmax" ), QString::number( conn.zMax ) );
47  if ( !conn.authCfg.isEmpty() )
48  uri.setAuthConfigId( conn.authCfg );
49  if ( !conn.username.isEmpty() )
50  uri.setUsername( conn.username );
51  if ( !conn.password.isEmpty() )
52  uri.setPassword( conn.password );
53  if ( !conn.referer.isEmpty() )
54  uri.setParam( QStringLiteral( "referer" ), conn.referer );
55  if ( !conn.styleUrl.isEmpty() )
56  uri.setParam( QStringLiteral( "styleUrl" ), conn.styleUrl );
57 
58  switch ( conn.serviceType )
59  {
60  case Generic:
61  break;
62 
63  case ArcgisVectorTileService:
64  uri.setParam( QStringLiteral( "serviceType" ), QStringLiteral( "arcgis" ) );
65  break;
66  }
67 
68  return uri.encodedUri();
69 }
70 
71 QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::decodedUri( const QString &uri )
72 {
73  QgsDataSourceUri dsUri;
74  dsUri.setEncodedUri( uri );
75 
76  QgsVectorTileProviderConnection::Data conn;
77  conn.url = dsUri.param( QStringLiteral( "url" ) );
78  conn.zMin = dsUri.hasParam( QStringLiteral( "zmin" ) ) ? dsUri.param( QStringLiteral( "zmin" ) ).toInt() : -1;
79  conn.zMax = dsUri.hasParam( QStringLiteral( "zmax" ) ) ? dsUri.param( QStringLiteral( "zmax" ) ).toInt() : -1;
80  conn.authCfg = dsUri.authConfigId();
81  conn.username = dsUri.username();
82  conn.password = dsUri.password();
83  conn.referer = dsUri.param( QStringLiteral( "referer" ) );
84  conn.styleUrl = dsUri.param( QStringLiteral( "styleUrl" ) );
85 
86  if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
87  {
88  if ( dsUri.param( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
89  conn.serviceType = ArcgisVectorTileService;
90  }
91  return conn;
92 }
93 
94 QString QgsVectorTileProviderConnection::encodedLayerUri( const QgsVectorTileProviderConnection::Data &conn )
95 {
96  // compared to encodedUri() this one also adds type=xyz to the URI
97  QgsDataSourceUri uri;
98 
99  const QFileInfo info( conn.url );
100  QString suffix = info.suffix().toLower();
101  if ( suffix.startsWith( QLatin1String( "mbtiles" ) ) )
102  {
103  uri.setParam( QStringLiteral( "type" ), QStringLiteral( "mbtiles" ) );
104  }
105  else
106  {
107  uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
108  }
109 
110  uri.setParam( QStringLiteral( "url" ), conn.url );
111  if ( conn.zMin != -1 )
112  uri.setParam( QStringLiteral( "zmin" ), QString::number( conn.zMin ) );
113  if ( conn.zMax != -1 )
114  uri.setParam( QStringLiteral( "zmax" ), QString::number( conn.zMax ) );
115  if ( !conn.authCfg.isEmpty() )
116  uri.setAuthConfigId( conn.authCfg );
117  if ( !conn.username.isEmpty() )
118  uri.setUsername( conn.username );
119  if ( !conn.password.isEmpty() )
120  uri.setPassword( conn.password );
121  if ( !conn.referer.isEmpty() )
122  uri.setParam( QStringLiteral( "referer" ), conn.referer );
123  if ( !conn.styleUrl.isEmpty() )
124  uri.setParam( QStringLiteral( "styleUrl" ), conn.styleUrl );
125 
126  switch ( conn.serviceType )
127  {
128  case Generic:
129  break;
130 
131  case ArcgisVectorTileService:
132  uri.setParam( QStringLiteral( "serviceType" ), QStringLiteral( "arcgis" ) );
133  break;
134  }
135 
136  return uri.encodedUri();
137 }
138 
139 QStringList QgsVectorTileProviderConnection::connectionList()
140 {
141  QgsSettings settings;
142  settings.beginGroup( QStringLiteral( "qgis/connections-vector-tile" ) );
143  QStringList connList = settings.childGroups();
144 
145  return connList;
146 }
147 
148 QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::connection( const QString &name )
149 {
150  QgsSettings settings;
151  settings.beginGroup( "qgis/connections-vector-tile/" + name );
152 
153  if ( settings.value( "url" ).toString().isEmpty() )
154  return QgsVectorTileProviderConnection::Data();
155 
156  QgsVectorTileProviderConnection::Data conn;
157  conn.url = settings.value( QStringLiteral( "url" ) ).toString();
158  conn.zMin = settings.value( QStringLiteral( "zmin" ), -1 ).toInt();
159  conn.zMax = settings.value( QStringLiteral( "zmax" ), -1 ).toInt();
160  conn.authCfg = settings.value( QStringLiteral( "authcfg" ) ).toString();
161  conn.username = settings.value( QStringLiteral( "username" ) ).toString();
162  conn.password = settings.value( QStringLiteral( "password" ) ).toString();
163  conn.referer = QgsHttpHeaders( settings )[ QStringLiteral( "referer" ) ].toString();
164  conn.styleUrl = settings.value( QStringLiteral( "styleUrl" ) ).toString();
165 
166  if ( settings.contains( QStringLiteral( "serviceType" ) ) )
167  {
168  if ( settings.value( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
169  conn.serviceType = ArcgisVectorTileService;
170  }
171 
172  return conn;
173 }
174 
175 void QgsVectorTileProviderConnection::deleteConnection( const QString &name )
176 {
177  QgsSettings settings;
178  settings.remove( "qgis/connections-vector-tile/" + name );
179 }
180 
181 void QgsVectorTileProviderConnection::addConnection( const QString &name, QgsVectorTileProviderConnection::Data conn )
182 {
183  QgsSettings settings;
184 
185  settings.beginGroup( "qgis/connections-vector-tile/" + name );
186  settings.setValue( QStringLiteral( "url" ), conn.url );
187  settings.setValue( QStringLiteral( "zmin" ), conn.zMin );
188  settings.setValue( QStringLiteral( "zmax" ), conn.zMax );
189  settings.setValue( QStringLiteral( "authcfg" ), conn.authCfg );
190  settings.setValue( QStringLiteral( "username" ), conn.username );
191  settings.setValue( QStringLiteral( "password" ), conn.password );
192  QgsHttpHeaders( QVariantMap( { {QStringLiteral( "referer" ), conn.referer}} ) ).updateSettings( settings );
193  settings.setValue( QStringLiteral( "styleUrl" ), conn.styleUrl );
194 
195  switch ( conn.serviceType )
196  {
197  case Generic:
198  break;
199 
200  case ArcgisVectorTileService:
201  settings.setValue( QStringLiteral( "serviceType" ), QStringLiteral( "arcgis" ) );
202  break;
203  }
204 }
205 
206 QString QgsVectorTileProviderConnection::selectedConnection()
207 {
208  const QgsSettings settings;
209  return settings.value( QStringLiteral( "qgis/connections-vector-tile/selected" ) ).toString();
210 }
211 
212 void QgsVectorTileProviderConnection::setSelectedConnection( const QString &name )
213 {
214  QgsSettings settings;
215  return settings.setValue( QStringLiteral( "qgis/connections-vector-tile/selected" ), name );
216 }
217 
218 //
219 
220 QgsVectorTileProviderConnection::QgsVectorTileProviderConnection( const QString &name )
222 {
223  setUri( encodedUri( connection( name ) ) );
224 }
225 
226 QgsVectorTileProviderConnection::QgsVectorTileProviderConnection( const QString &uri, const QVariantMap &configuration )
227  : QgsAbstractProviderConnection( uri, configuration )
228 {
229 }
230 
231 void QgsVectorTileProviderConnection::store( const QString &name ) const
232 {
233  addConnection( name, decodedUri( uri() ) );
234 }
235 
236 void QgsVectorTileProviderConnection::remove( const QString &name ) const
237 {
238  deleteConnection( name );
239 }
240 
The QgsAbstractProviderConnection provides an interface for data provider connections.
Class for storing the component parts of a RDBMS data source URI (e.g.
QByteArray encodedUri() const
Returns the complete encoded URI as a byte array.
bool hasParam(const QString &key) const
Returns true if a parameter with the specified key exists.
void setEncodedUri(const QByteArray &uri)
Sets the complete encoded uri.
void setAuthConfigId(const QString &authcfg)
Sets the authentication configuration ID for the URI.
void setUsername(const QString &username)
Sets the username for the URI.
QString param(const QString &key) const
Returns a generic parameter value corresponding to the specified key.
QString username() const
Returns the username stored in the URI.
void setParam(const QString &key, const QString &value)
Sets a generic parameter value on the URI.
QString password() const
Returns the password stored in the URI.
QString authConfigId() const
Returns any associated authentication configuration ID stored in the URI.
void setPassword(const QString &password)
Sets the password for the URI.
This class implements simple http header management.
void updateSettings(QgsSettings &settings, const QString &key=QString()) const
Updates the settings by adding all the http headers in the path "key/KEY_PREFIX/".
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QStringList childGroups() const
Returns a list of all key top-level groups that contain keys that can be read using the QSettings obj...
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
bool contains(const QString &key, QgsSettings::Section section=QgsSettings::NoSection) const
Returns true if there exists a setting called key; returns false otherwise.
void beginGroup(const QString &prefix, QgsSettings::Section section=QgsSettings::NoSection)
Appends prefix to the current group.
Definition: qgssettings.cpp:89
void remove(const QString &key, QgsSettings::Section section=QgsSettings::NoSection)
Removes the setting key and any sub-settings of key in a section.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.