1 /***************************************************************************
2                               qgswmtsparameters.cpp
3                               --------------------
4   begin                : Aug 10, 2018
5   copyright            : (C) 2018 by René-Luc Dhont
6   email                : rldhont at 3liz dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgswmtsparameters.h"
19 #include "qgsmessagelog.h"
20 
21 namespace QgsWmts
22 {
23   //
24   // QgsWmsParameterForWmts
25   //
name(const QgsWmsParameterForWmts::Name name)26   QString QgsWmsParameterForWmts::name( const QgsWmsParameterForWmts::Name name )
27   {
28     const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWmsParameterForWmts::Name>() );
29     return metaEnum.valueToKey( name );
30   }
31 
name(const QString & name)32   QgsWmsParameterForWmts::Name QgsWmsParameterForWmts::name( const QString &name )
33   {
34     const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWmsParameterForWmts::Name>() );
35     return ( QgsWmsParameterForWmts::Name ) metaEnum.keyToValue( name.toUpper().toStdString().c_str() );
36   }
37 
38   //
39   // QgsWmtsParameter
40   //
QgsWmtsParameter(const QgsWmtsParameter::Name name,const QVariant::Type type,const QVariant defaultValue)41   QgsWmtsParameter::QgsWmtsParameter( const QgsWmtsParameter::Name name,
42                                       const QVariant::Type type,
43                                       const QVariant defaultValue )
44     : QgsServerParameterDefinition( type, defaultValue )
45     , mName( name )
46   {
47   }
48 
toInt() const49   int QgsWmtsParameter::toInt() const
50   {
51     bool ok = false;
52     const int val = QgsServerParameterDefinition::toInt( ok );
53 
54     if ( !ok )
55     {
56       raiseError();
57     }
58 
59     return val;
60   }
61 
raiseError() const62   void QgsWmtsParameter::raiseError() const
63   {
64     const QString msg = QString( "%1 ('%2') cannot be converted into %3" ).arg( name( mName ), toString(), typeName() );
65     QgsServerParameterDefinition::raiseError( msg );
66   }
67 
name(const QgsWmtsParameter::Name name)68   QString QgsWmtsParameter::name( const QgsWmtsParameter::Name name )
69   {
70     const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWmtsParameter::Name>() );
71     return metaEnum.valueToKey( name );
72   }
73 
name(const QString & name)74   QgsWmtsParameter::Name QgsWmtsParameter::name( const QString &name )
75   {
76     const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWmtsParameter::Name>() );
77     return ( QgsWmtsParameter::Name ) metaEnum.keyToValue( name.toUpper().toStdString().c_str() );
78   }
79 
80   //
81   // QgsWmtsParameters
82   //
QgsWmtsParameters()83   QgsWmtsParameters::QgsWmtsParameters()
84     : QgsServerParameters()
85   {
86     // Available version number
87     mVersions.append( QgsProjectVersion( 1, 0, 0 ) );
88 
89     const QgsWmtsParameter pLayer = QgsWmtsParameter( QgsWmtsParameter::LAYER );
90     save( pLayer );
91 
92     const QgsWmtsParameter pFormat = QgsWmtsParameter( QgsWmtsParameter::FORMAT );
93     save( pFormat );
94 
95     const QgsWmtsParameter pTileMatrix = QgsWmtsParameter( QgsWmtsParameter::TILEMATRIX,
96                                          QVariant::Int,
97                                          QVariant( -1 ) );
98     save( pTileMatrix );
99 
100     const QgsWmtsParameter pTileRow = QgsWmtsParameter( QgsWmtsParameter::TILEROW,
101                                       QVariant::Int,
102                                       QVariant( -1 ) );
103     save( pTileRow );
104 
105     const QgsWmtsParameter pTileCol = QgsWmtsParameter( QgsWmtsParameter::TILECOL,
106                                       QVariant::Int,
107                                       QVariant( -1 ) );
108     save( pTileCol );
109 
110     const QgsWmtsParameter pInfoFormat( QgsWmtsParameter::INFOFORMAT );
111     save( pInfoFormat );
112 
113     const QgsWmtsParameter pI( QgsWmtsParameter::I,
114                                QVariant::Int,
115                                QVariant( -1 ) );
116     save( pI );
117 
118     const QgsWmtsParameter pJ( QgsWmtsParameter::J,
119                                QVariant::Int,
120                                QVariant( -1 ) );
121     save( pJ );
122   }
123 
QgsWmtsParameters(const QgsServerParameters & parameters)124   QgsWmtsParameters::QgsWmtsParameters( const QgsServerParameters &parameters )
125     : QgsWmtsParameters()
126   {
127     load( parameters.urlQuery() );
128   }
129 
loadParameter(const QString & key,const QString & value)130   bool QgsWmtsParameters::loadParameter( const QString &key, const QString &value )
131   {
132     bool loaded = false;
133 
134     const QgsWmtsParameter::Name name = QgsWmtsParameter::name( key );
135     if ( name >= 0 )
136     {
137       mWmtsParameters[name].mValue = value;
138       if ( ! mWmtsParameters[name].isValid() )
139       {
140         mWmtsParameters[name].raiseError();
141       }
142 
143       loaded = true;
144     }
145 
146     return loaded;
147   }
148 
save(const QgsWmtsParameter & parameter)149   void QgsWmtsParameters::save( const QgsWmtsParameter &parameter )
150   {
151     mWmtsParameters[ parameter.mName ] = parameter;
152   }
153 
dump() const154   void QgsWmtsParameters::dump() const
155   {
156     log( "WMTS Request parameters:" );
157     const auto map = mWmtsParameters.toStdMap();
158     for ( const auto &parameter : map )
159     {
160       const QString value = parameter.second.toString();
161 
162       if ( ! value.isEmpty() )
163       {
164         const QString name = QgsWmtsParameter::name( parameter.first );
165         log( QStringLiteral( " - %1 : %2" ).arg( name, value ) );
166       }
167     }
168 
169     if ( !version().isEmpty() )
170       log( QStringLiteral( " - VERSION : %1" ).arg( version() ) );
171   }
172 
layer() const173   QString QgsWmtsParameters::layer() const
174   {
175     return mWmtsParameters[ QgsWmtsParameter::LAYER ].toString();
176   }
177 
formatAsString() const178   QString QgsWmtsParameters::formatAsString() const
179   {
180     return mWmtsParameters[ QgsWmtsParameter::FORMAT ].toString();
181   }
182 
format() const183   QgsWmtsParameters::Format QgsWmtsParameters::format() const
184   {
185     const QString fStr = formatAsString();
186 
187     if ( fStr.isEmpty() )
188       return Format::NONE;
189 
190     Format f = Format::PNG;
191     if ( fStr.compare( QLatin1String( "jpg" ), Qt::CaseInsensitive ) == 0
192          || fStr.compare( QLatin1String( "jpeg" ), Qt::CaseInsensitive ) == 0
193          || fStr.compare( QLatin1String( "image/jpeg" ), Qt::CaseInsensitive ) == 0 )
194       f = Format::JPG;
195 
196     return f;
197   }
198 
tileMatrixSet() const199   QString QgsWmtsParameters::tileMatrixSet() const
200   {
201     return mWmtsParameters[ QgsWmtsParameter::TILEMATRIXSET ].toString();
202   }
203 
tileMatrix() const204   QString QgsWmtsParameters::tileMatrix() const
205   {
206     return mWmtsParameters[ QgsWmtsParameter::TILEMATRIX ].toString();
207   }
208 
tileMatrixAsInt() const209   int QgsWmtsParameters::tileMatrixAsInt() const
210   {
211     return mWmtsParameters[ QgsWmtsParameter::TILEMATRIX ].toInt();
212   }
213 
tileRow() const214   QString QgsWmtsParameters::tileRow() const
215   {
216     return mWmtsParameters[ QgsWmtsParameter::TILEROW ].toString();
217   }
218 
tileRowAsInt() const219   int QgsWmtsParameters::tileRowAsInt() const
220   {
221     return mWmtsParameters[ QgsWmtsParameter::TILEROW ].toInt();
222   }
223 
tileCol() const224   QString QgsWmtsParameters::tileCol() const
225   {
226     return mWmtsParameters[ QgsWmtsParameter::TILECOL ].toString();
227   }
228 
tileColAsInt() const229   int QgsWmtsParameters::tileColAsInt() const
230   {
231     return mWmtsParameters[ QgsWmtsParameter::TILECOL ].toInt();
232   }
233 
infoFormatAsString() const234   QString QgsWmtsParameters::infoFormatAsString() const
235   {
236     return mWmtsParameters[ QgsWmtsParameter::INFOFORMAT ].toString();
237   }
238 
infoFormat() const239   QgsWmtsParameters::Format QgsWmtsParameters::infoFormat() const
240   {
241     const QString fStr = infoFormatAsString();
242 
243     Format f = Format::TEXT;
244     if ( fStr.isEmpty() )
245       return f;
246 
247     if ( fStr.startsWith( QLatin1String( "text/xml" ), Qt::CaseInsensitive ) )
248       f = Format::XML;
249     else if ( fStr.startsWith( QLatin1String( "text/html" ), Qt::CaseInsensitive ) )
250       f = Format::HTML;
251     else if ( fStr.startsWith( QLatin1String( "text/plain" ), Qt::CaseInsensitive ) )
252       f = Format::TEXT;
253     else if ( fStr.startsWith( QLatin1String( "application/vnd.ogc.gml" ), Qt::CaseInsensitive ) )
254       f = Format::GML;
255     else
256       f = Format::NONE;
257 
258     return f;
259   }
260 
infoFormatVersion() const261   int QgsWmtsParameters::infoFormatVersion() const
262   {
263     if ( infoFormat() != Format::GML )
264       return -1;
265 
266     const QString fStr = infoFormatAsString();
267     if ( fStr.startsWith( QLatin1String( "application/vnd.ogc.gml/3" ), Qt::CaseInsensitive ) )
268       return 3;
269     else
270       return 2;
271   }
272 
i() const273   QString QgsWmtsParameters::i() const
274   {
275     return mWmtsParameters[ QgsWmtsParameter::I ].toString();
276   }
277 
j() const278   QString QgsWmtsParameters::j() const
279   {
280     return mWmtsParameters[ QgsWmtsParameter::J ].toString();
281   }
282 
iAsInt() const283   int QgsWmtsParameters::iAsInt() const
284   {
285     return mWmtsParameters[ QgsWmtsParameter::I ].toInt();
286   }
287 
jAsInt() const288   int QgsWmtsParameters::jAsInt() const
289   {
290     return mWmtsParameters[ QgsWmtsParameter::J ].toInt();
291   }
292 
versionAsNumber() const293   QgsProjectVersion QgsWmtsParameters::versionAsNumber() const
294   {
295     const QString vStr = version();
296     QgsProjectVersion version;
297 
298     if ( vStr.isEmpty() )
299       version = QgsProjectVersion( 1, 0, 0 ); // default value
300     else if ( mVersions.contains( QgsProjectVersion( vStr ) ) )
301       version = QgsProjectVersion( vStr );
302 
303     return version;
304   }
305 
log(const QString & msg) const306   void QgsWmtsParameters::log( const QString &msg ) const
307   {
308     QgsMessageLog::logMessage( msg, "Server", Qgis::MessageLevel::Info );
309   }
310 }
311