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
16 #include "qgsvectortileconnection.h"
17
18 #include "qgslogger.h"
19 #include "qgsdatasourceuri.h"
20 #include "qgssettings.h"
21
22 ///@cond PRIVATE
23
encodedUri(const QgsVectorTileProviderConnection::Data & conn)24 QString QgsVectorTileProviderConnection::encodedUri( const QgsVectorTileProviderConnection::Data &conn )
25 {
26 QgsDataSourceUri uri;
27 uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
28 uri.setParam( QStringLiteral( "url" ), conn.url );
29 if ( conn.zMin != -1 )
30 uri.setParam( QStringLiteral( "zmin" ), QString::number( conn.zMin ) );
31 if ( conn.zMax != -1 )
32 uri.setParam( QStringLiteral( "zmax" ), QString::number( conn.zMax ) );
33 if ( !conn.authCfg.isEmpty() )
34 uri.setAuthConfigId( conn.authCfg );
35 if ( !conn.username.isEmpty() )
36 uri.setUsername( conn.username );
37 if ( !conn.password.isEmpty() )
38 uri.setPassword( conn.password );
39 if ( !conn.referer.isEmpty() )
40 uri.setParam( QStringLiteral( "referer" ), conn.referer );
41 if ( !conn.styleUrl.isEmpty() )
42 uri.setParam( QStringLiteral( "styleUrl" ), conn.styleUrl );
43
44 switch ( conn.serviceType )
45 {
46 case Generic:
47 break;
48
49 case ArcgisVectorTileService:
50 uri.setParam( QStringLiteral( "serviceType" ), QStringLiteral( "arcgis" ) );
51 break;
52 }
53
54 return uri.encodedUri();
55 }
56
decodedUri(const QString & uri)57 QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::decodedUri( const QString &uri )
58 {
59 QgsDataSourceUri dsUri;
60 dsUri.setEncodedUri( uri );
61
62 QgsVectorTileProviderConnection::Data conn;
63 conn.url = dsUri.param( QStringLiteral( "url" ) );
64 conn.zMin = dsUri.hasParam( QStringLiteral( "zmin" ) ) ? dsUri.param( QStringLiteral( "zmin" ) ).toInt() : -1;
65 conn.zMax = dsUri.hasParam( QStringLiteral( "zmax" ) ) ? dsUri.param( QStringLiteral( "zmax" ) ).toInt() : -1;
66 conn.authCfg = dsUri.authConfigId();
67 conn.username = dsUri.username();
68 conn.password = dsUri.password();
69 conn.referer = dsUri.param( QStringLiteral( "referer" ) );
70 conn.styleUrl = dsUri.param( QStringLiteral( "styleUrl" ) );
71
72 if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
73 {
74 if ( dsUri.param( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
75 conn.serviceType = ArcgisVectorTileService;
76 }
77 return conn;
78 }
79
encodedLayerUri(const QgsVectorTileProviderConnection::Data & conn)80 QString QgsVectorTileProviderConnection::encodedLayerUri( const QgsVectorTileProviderConnection::Data &conn )
81 {
82 // compared to encodedUri() this one also adds type=xyz to the URI
83 QgsDataSourceUri uri;
84 uri.setParam( QStringLiteral( "type" ), QStringLiteral( "xyz" ) );
85 uri.setParam( QStringLiteral( "url" ), conn.url );
86 if ( conn.zMin != -1 )
87 uri.setParam( QStringLiteral( "zmin" ), QString::number( conn.zMin ) );
88 if ( conn.zMax != -1 )
89 uri.setParam( QStringLiteral( "zmax" ), QString::number( conn.zMax ) );
90 if ( !conn.authCfg.isEmpty() )
91 uri.setAuthConfigId( conn.authCfg );
92 if ( !conn.username.isEmpty() )
93 uri.setUsername( conn.username );
94 if ( !conn.password.isEmpty() )
95 uri.setPassword( conn.password );
96 if ( !conn.referer.isEmpty() )
97 uri.setParam( QStringLiteral( "referer" ), conn.referer );
98 if ( !conn.styleUrl.isEmpty() )
99 uri.setParam( QStringLiteral( "styleUrl" ), conn.styleUrl );
100
101 switch ( conn.serviceType )
102 {
103 case Generic:
104 break;
105
106 case ArcgisVectorTileService:
107 uri.setParam( QStringLiteral( "serviceType" ), QStringLiteral( "arcgis" ) );
108 break;
109 }
110
111 return uri.encodedUri();
112 }
113
connectionList()114 QStringList QgsVectorTileProviderConnection::connectionList()
115 {
116 QgsSettings settings;
117 settings.beginGroup( QStringLiteral( "qgis/connections-vector-tile" ) );
118 QStringList connList = settings.childGroups();
119
120 return connList;
121 }
122
connection(const QString & name)123 QgsVectorTileProviderConnection::Data QgsVectorTileProviderConnection::connection( const QString &name )
124 {
125 QgsSettings settings;
126 settings.beginGroup( "qgis/connections-vector-tile/" + name );
127
128 if ( settings.value( "url" ).toString().isEmpty() )
129 return QgsVectorTileProviderConnection::Data();
130
131 QgsVectorTileProviderConnection::Data conn;
132 conn.url = settings.value( QStringLiteral( "url" ) ).toString();
133 conn.zMin = settings.value( QStringLiteral( "zmin" ), -1 ).toInt();
134 conn.zMax = settings.value( QStringLiteral( "zmax" ), -1 ).toInt();
135 conn.authCfg = settings.value( QStringLiteral( "authcfg" ) ).toString();
136 conn.username = settings.value( QStringLiteral( "username" ) ).toString();
137 conn.password = settings.value( QStringLiteral( "password" ) ).toString();
138 conn.referer = settings.value( QStringLiteral( "referer" ) ).toString();
139 conn.styleUrl = settings.value( QStringLiteral( "styleUrl" ) ).toString();
140
141 if ( settings.contains( QStringLiteral( "serviceType" ) ) )
142 {
143 if ( settings.value( QStringLiteral( "serviceType" ) ) == QLatin1String( "arcgis" ) )
144 conn.serviceType = ArcgisVectorTileService;
145 }
146
147 return conn;
148 }
149
deleteConnection(const QString & name)150 void QgsVectorTileProviderConnection::deleteConnection( const QString &name )
151 {
152 QgsSettings settings;
153 settings.remove( "qgis/connections-vector-tile/" + name );
154 }
155
addConnection(const QString & name,QgsVectorTileProviderConnection::Data conn)156 void QgsVectorTileProviderConnection::addConnection( const QString &name, QgsVectorTileProviderConnection::Data conn )
157 {
158 QgsSettings settings;
159
160 settings.beginGroup( "qgis/connections-vector-tile/" + name );
161 settings.setValue( QStringLiteral( "url" ), conn.url );
162 settings.setValue( QStringLiteral( "zmin" ), conn.zMin );
163 settings.setValue( QStringLiteral( "zmax" ), conn.zMax );
164 settings.setValue( QStringLiteral( "authcfg" ), conn.authCfg );
165 settings.setValue( QStringLiteral( "username" ), conn.username );
166 settings.setValue( QStringLiteral( "password" ), conn.password );
167 settings.setValue( QStringLiteral( "referer" ), conn.referer );
168 settings.setValue( QStringLiteral( "styleUrl" ), conn.styleUrl );
169
170 switch ( conn.serviceType )
171 {
172 case Generic:
173 break;
174
175 case ArcgisVectorTileService:
176 settings.setValue( QStringLiteral( "serviceType" ), QStringLiteral( "arcgis" ) );
177 break;
178 }
179 }
180
selectedConnection()181 QString QgsVectorTileProviderConnection::selectedConnection()
182 {
183 const QgsSettings settings;
184 return settings.value( QStringLiteral( "qgis/connections-vector-tile/selected" ) ).toString();
185 }
186
setSelectedConnection(const QString & name)187 void QgsVectorTileProviderConnection::setSelectedConnection( const QString &name )
188 {
189 QgsSettings settings;
190 return settings.setValue( QStringLiteral( "qgis/connections-vector-tile/selected" ), name );
191 }
192
193 //
194
QgsVectorTileProviderConnection(const QString & name)195 QgsVectorTileProviderConnection::QgsVectorTileProviderConnection( const QString &name )
196 : QgsAbstractProviderConnection( name )
197 {
198 setUri( encodedUri( connection( name ) ) );
199 }
200
QgsVectorTileProviderConnection(const QString & uri,const QVariantMap & configuration)201 QgsVectorTileProviderConnection::QgsVectorTileProviderConnection( const QString &uri, const QVariantMap &configuration )
202 : QgsAbstractProviderConnection( uri, configuration )
203 {
204 }
205
store(const QString & name) const206 void QgsVectorTileProviderConnection::store( const QString &name ) const
207 {
208 addConnection( name, decodedUri( uri() ) );
209 }
210
remove(const QString & name) const211 void QgsVectorTileProviderConnection::remove( const QString &name ) const
212 {
213 deleteConnection( name );
214 }
215
216 ///@endcond
217