1 /***************************************************************************
2   qgsvectortileprovidermetadata.cpp
3   --------------------------------------
4   Date                 : 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 "qgsvectortileprovidermetadata.h"
17 
18 #include "qgsvectortileconnection.h"
19 #include "qgsvectortiledataitems.h"
20 
21 ///@cond PRIVATE
22 
23 #define PROVIDER_KEY QStringLiteral( "vectortile" )
24 #define PROVIDER_DESCRIPTION QStringLiteral( "Vector tile provider" )
25 
QgsVectorTileProviderMetadata()26 QgsVectorTileProviderMetadata::QgsVectorTileProviderMetadata()
27   : QgsProviderMetadata( PROVIDER_KEY, PROVIDER_DESCRIPTION )
28 {
29 }
30 
dataItemProviders() const31 QList<QgsDataItemProvider *> QgsVectorTileProviderMetadata::dataItemProviders() const
32 {
33   QList< QgsDataItemProvider * > providers;
34   providers << new QgsVectorTileDataItemProvider;
35   return providers;
36 }
37 
connections(bool cached)38 QMap<QString, QgsAbstractProviderConnection *> QgsVectorTileProviderMetadata::connections( bool cached )
39 {
40   return connectionsProtected<QgsVectorTileProviderConnection, QgsVectorTileProviderConnection>( cached );
41 }
42 
createConnection(const QString & name)43 QgsAbstractProviderConnection *QgsVectorTileProviderMetadata::createConnection( const QString &name )
44 {
45   return new QgsVectorTileProviderConnection( name );
46 }
47 
deleteConnection(const QString & name)48 void QgsVectorTileProviderMetadata::deleteConnection( const QString &name )
49 {
50   deleteConnectionProtected<QgsVectorTileProviderConnection>( name );
51 }
52 
saveConnection(const QgsAbstractProviderConnection * connection,const QString & name)53 void QgsVectorTileProviderMetadata::saveConnection( const QgsAbstractProviderConnection *connection, const QString &name )
54 {
55   saveConnectionProtected( connection, name );
56 }
57 
providerCapabilities() const58 QgsProviderMetadata::ProviderCapabilities QgsVectorTileProviderMetadata::providerCapabilities() const
59 {
60   return FileBasedUris;
61 }
62 
decodeUri(const QString & uri) const63 QVariantMap QgsVectorTileProviderMetadata::decodeUri( const QString &uri ) const
64 {
65   QgsDataSourceUri dsUri;
66   dsUri.setEncodedUri( uri );
67 
68   QVariantMap uriComponents;
69   uriComponents.insert( QStringLiteral( "type" ), dsUri.param( QStringLiteral( "type" ) ) );
70   if ( dsUri.hasParam( QStringLiteral( "serviceType" ) ) )
71     uriComponents.insert( QStringLiteral( "serviceType" ), dsUri.param( QStringLiteral( "serviceType" ) ) );
72 
73   if ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "mbtiles" ) ||
74        ( uriComponents[ QStringLiteral( "type" ) ] == QLatin1String( "xyz" ) &&
75          !dsUri.param( QStringLiteral( "url" ) ).startsWith( QLatin1String( "http" ) ) ) )
76   {
77     uriComponents.insert( QStringLiteral( "path" ), dsUri.param( QStringLiteral( "url" ) ) );
78   }
79   else
80   {
81     uriComponents.insert( QStringLiteral( "url" ), dsUri.param( QStringLiteral( "url" ) ) );
82   }
83 
84   if ( dsUri.hasParam( QStringLiteral( "zmin" ) ) )
85     uriComponents.insert( QStringLiteral( "zmin" ), dsUri.param( QStringLiteral( "zmin" ) ) );
86   if ( dsUri.hasParam( QStringLiteral( "zmax" ) ) )
87     uriComponents.insert( QStringLiteral( "zmax" ), dsUri.param( QStringLiteral( "zmax" ) ) );
88 
89   if ( dsUri.hasParam( QStringLiteral( "referer" ) ) )
90     uriComponents.insert( QStringLiteral( "referer" ), dsUri.param( QStringLiteral( "referer" ) ) );
91   if ( dsUri.hasParam( QStringLiteral( "styleUrl" ) ) )
92     uriComponents.insert( QStringLiteral( "styleUrl" ), dsUri.param( QStringLiteral( "styleUrl" ) ) );
93 
94   const QString authcfg = dsUri.authConfigId();
95   if ( !authcfg.isEmpty() )
96     uriComponents.insert( QStringLiteral( "authcfg" ), authcfg );
97 
98   return uriComponents;
99 }
100 
encodeUri(const QVariantMap & parts) const101 QString QgsVectorTileProviderMetadata::encodeUri( const QVariantMap &parts ) const
102 {
103   QgsDataSourceUri dsUri;
104   dsUri.setParam( QStringLiteral( "type" ), parts.value( QStringLiteral( "type" ) ).toString() );
105   if ( parts.contains( QStringLiteral( "serviceType" ) ) )
106     dsUri.setParam( QStringLiteral( "serviceType" ), parts[ QStringLiteral( "serviceType" ) ].toString() );
107   dsUri.setParam( QStringLiteral( "url" ), parts.value( parts.contains( QStringLiteral( "path" ) ) ? QStringLiteral( "path" ) : QStringLiteral( "url" ) ).toString() );
108 
109   if ( parts.contains( QStringLiteral( "zmin" ) ) )
110     dsUri.setParam( QStringLiteral( "zmin" ), parts[ QStringLiteral( "zmin" ) ].toString() );
111   if ( parts.contains( QStringLiteral( "zmax" ) ) )
112     dsUri.setParam( QStringLiteral( "zmax" ), parts[ QStringLiteral( "zmax" ) ].toString() );
113 
114   if ( parts.contains( QStringLiteral( "referer" ) ) )
115     dsUri.setParam( QStringLiteral( "referer" ), parts[ QStringLiteral( "referer" ) ].toString() );
116   if ( parts.contains( QStringLiteral( "styleUrl" ) ) )
117     dsUri.setParam( QStringLiteral( "styleUrl" ), parts[ QStringLiteral( "styleUrl" ) ].toString() );
118 
119   if ( parts.contains( QStringLiteral( "authcfg" ) ) )
120     dsUri.setAuthConfigId( parts[ QStringLiteral( "authcfg" ) ].toString() );
121 
122   return dsUri.encodedUri();
123 }
124 
125 ///@endcond
126