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 ¶meters ) 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 ¶meter ) 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 ¶meter : 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