88
99 wms-c/wmts support : Jürgen E. Fischer < jef at norbit dot de >, norBIT GmbH
1010
11+ tile retry support : Luigi Pirelli < luipir at gmail dot com >
12+ (funded by Regione Toscana-SITA)
13+
1114 ***************************************************************************/
1215
1316/* **************************************************************************
@@ -159,6 +162,8 @@ bool QgsWmsProvider::parseUri( QString uriString )
159162 mInvertAxisOrientation = uri.hasParam ( " InvertAxisOrientation" ); // must be before parsing!
160163 mSmoothPixmapTransform = uri.hasParam ( " SmoothPixmapTransform" );
161164
165+ mDpiMode = uri.hasParam ( " dpiMode" ) ? ( QgsWmsDpiMode ) uri.param ( " dpiMode" ).toInt () : dpiAll;
166+
162167 mUserName = uri.param ( " username" );
163168 QgsDebugMsg ( " set username to " + mUserName );
164169
@@ -645,15 +650,14 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
645650 setQueryItem ( url, " STYLES" , styles );
646651 setQueryItem ( url, " FORMAT" , mImageMimeType );
647652
648- // DPI parameter is accepted by QGIS mapserver (and ignored by the other WMS servers)
649- // map_resolution parameter works for UMN mapserver
650-
651- // Different WMS servers have DPI parameters:
652653 if ( mDpi != -1 )
653654 {
654- setQueryItem ( url, " DPI" , QString::number ( mDpi ) ); // QGIS server
655- setQueryItem ( url, " MAP_RESOLUTION" , QString::number ( mDpi ) ); // UMN mapserver
656- setQueryItem ( url, " FORMAT_OPTIONS" , QString ( " dpi:%1" ).arg ( mDpi ) ); // geoserver
655+ if ( mDpiMode & dpiQGIS )
656+ setQueryItem ( url, " DPI" , QString::number ( mDpi ) );
657+ if ( mDpiMode & dpiUMN )
658+ setQueryItem ( url, " MAP_RESOLUTION" , QString::number ( mDpi ) );
659+ if ( mDpiMode & dpiGeoServer )
660+ setQueryItem ( url, " FORMAT_OPTIONS" , QString ( " dpi:%1" ).arg ( mDpi ) );
657661 }
658662
659663 // MH: jpeg does not support transparency and some servers complain if jpg and transparent=true
@@ -830,9 +834,12 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
830834
831835 if ( mDpi != -1 )
832836 {
833- setQueryItem ( url, " DPI" , QString::number ( mDpi ) ); // QGIS server
834- setQueryItem ( url, " MAP_RESOLUTION" , QString::number ( mDpi ) ); // UMN mapserver
835- setQueryItem ( url, " FORMAT_OPTIONS" , QString ( " dpi:%1" ).arg ( mDpi ) ); // geoserver
837+ if ( mDpiMode & dpiQGIS )
838+ setQueryItem ( url, " DPI" , QString::number ( mDpi ) );
839+ if ( mDpiMode & dpiUMN )
840+ setQueryItem ( url, " MAP_RESOLUTION" , QString::number ( mDpi ) );
841+ if ( mDpiMode & dpiGeoServer )
842+ setQueryItem ( url, " FORMAT_OPTIONS" , QString ( " dpi:%1" ).arg ( mDpi ) );
836843 }
837844
838845 if ( mImageMimeType == " image/x-jpegorpng" ||
@@ -860,12 +867,11 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
860867 QgsDebugMsg ( QString ( " tileRequest %1 %2/%3 (%4,%5): %6" ).arg ( mTileReqNo ).arg ( i++ ).arg ( n ).arg ( row ).arg ( col ).arg ( turl ) );
861868 request.setAttribute ( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
862869 request.setAttribute ( QNetworkRequest::CacheSaveControlAttribute, true );
863- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ), mTileReqNo );
864- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), i );
865- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ),
870+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileReqNo ), mTileReqNo );
871+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileIndex ), i );
872+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRect ),
866873 QRectF ( tm->topLeft .x () + col * twMap, tm->topLeft .y () - ( row + 1 ) * thMap, twMap, thMap ) );
867- int retry = 0 ; // just for readability
868- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
874+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ), 0 );
869875
870876 QgsDebugMsg ( QString ( " gettile: %1" ).arg ( turl ) );
871877 QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
@@ -915,12 +921,11 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
915921 QgsDebugMsg ( QString ( " tileRequest %1 %2/%3 (%4,%5): %6" ).arg ( mTileReqNo ).arg ( i++ ).arg ( n ).arg ( row ).arg ( col ).arg ( turl ) );
916922 request.setAttribute ( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
917923 request.setAttribute ( QNetworkRequest::CacheSaveControlAttribute, true );
918- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ), mTileReqNo );
919- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), i );
920- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ),
924+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileReqNo ), mTileReqNo );
925+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileIndex ), i );
926+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRect ),
921927 QRectF ( tm->topLeft .x () + col * twMap, tm->topLeft .y () - ( row + 1 ) * thMap, twMap, thMap ) );
922- int retry = 0 ; // just for readability
923- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
928+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ), 0 );
924929
925930 QgsDebugMsg ( QString ( " gettile: %1" ).arg ( turl ) );
926931 QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
@@ -957,12 +962,11 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
957962 QgsDebugMsg ( QString ( " tileRequest %1 %2/%3 (%4,%5): %6" ).arg ( mTileReqNo ).arg ( i++ ).arg ( n ).arg ( row ).arg ( col ).arg ( turl ) );
958963 request.setAttribute ( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
959964 request.setAttribute ( QNetworkRequest::CacheSaveControlAttribute, true );
960- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ), mTileReqNo );
961- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), i );
962- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ),
965+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileReqNo ), mTileReqNo );
966+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileIndex ), i );
967+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRect ),
963968 QRectF ( tm->topLeft .x () + col * twMap, tm->topLeft .y () - ( row + 1 ) * thMap, twMap, thMap ) );
964- int retry = 0 ; // just for readability
965- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
969+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ), 0 );
966970
967971 QgsDebugMsg ( QString ( " gettile: %1" ).arg ( turl ) );
968972 QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
@@ -1039,7 +1043,6 @@ void QgsWmsProvider::readBlock( int bandNo, QgsRectangle const & viewExtent, in
10391043 // delete image;
10401044}
10411045
1042- // tile retry management developed with funding from Regione Toscana-SITA
10431046void QgsWmsProvider::repeatTileRequest ( QNetworkRequest const &oldRequest )
10441047{
10451048 if ( mErrors == 100 )
@@ -1050,9 +1053,9 @@ void QgsWmsProvider::repeatTileRequest( QNetworkRequest const &oldRequest )
10501053 QNetworkRequest request ( oldRequest );
10511054
10521055 QString url = request.url ().toString ();
1053- int tileReqNo = request.attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ) ).toInt ();
1054- int tileNo = request.attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ) ).toInt ();
1055- int retry = request.attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ) ).toInt ();
1056+ int tileReqNo = request.attribute ( static_cast <QNetworkRequest::Attribute>( TileReqNo ) ).toInt ();
1057+ int tileNo = request.attribute ( static_cast <QNetworkRequest::Attribute>( TileIndex ) ).toInt ();
1058+ int retry = request.attribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ) ).toInt ();
10561059 retry++;
10571060
10581061 QSettings s;
@@ -1074,7 +1077,7 @@ void QgsWmsProvider::repeatTileRequest( QNetworkRequest const &oldRequest )
10741077 .arg ( tileReqNo ).arg ( tileNo ).arg ( retry ), tr ( " WMS" ), QgsMessageLog::INFO );
10751078 }
10761079 QgsDebugMsg ( QString ( " repeat tileRequest %1 %2(retry %3) for url: %4" ).arg ( tileReqNo ).arg ( tileNo ).arg ( retry ).arg ( url ) );
1077- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
1080+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ), retry );
10781081
10791082 QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
10801083 mTileReplies << reply;
@@ -1124,10 +1127,10 @@ void QgsWmsProvider::tileReplyFinished()
11241127 QgsNetworkAccessManager::instance ()->cache ()->updateMetaData ( cmd );
11251128 }
11261129
1127- int tileReqNo = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ) ).toInt ();
1128- int tileNo = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ) ).toInt ();
1129- QRectF r = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ) ).toRectF ();
1130- int retry = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ) ).toInt ();
1130+ int tileReqNo = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( TileReqNo ) ).toInt ();
1131+ int tileNo = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( TileIndex ) ).toInt ();
1132+ QRectF r = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( TileRect ) ).toRectF ();
1133+ int retry = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ) ).toInt ();
11311134
11321135#if QT_VERSION >= 0x40500
11331136 QgsDebugMsg ( QString ( " tile reply %1 (%2) tile:%3(retry %4) rect:%5,%6 %7,%8) fromcache:%9 error:%10 url:%11" )
@@ -1155,10 +1158,10 @@ void QgsWmsProvider::tileReplyFinished()
11551158 setAuthorization ( request );
11561159 request.setAttribute ( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache );
11571160 request.setAttribute ( QNetworkRequest::CacheSaveControlAttribute, true );
1158- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ), tileReqNo );
1159- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), tileNo );
1160- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ), r );
1161- request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
1161+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileReqNo ), tileReqNo );
1162+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileIndex ), tileNo );
1163+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRect ), r );
1164+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( TileRetry ), 0 );
11621165
11631166 mTileReplies .removeOne ( reply );
11641167 reply->deleteLater ();
@@ -1496,7 +1499,7 @@ bool QgsWmsProvider::retrieveServerCapabilities( bool forceRefresh )
14961499
14971500 QgsDebugMsg ( " exiting." );
14981501
1499- return true ;
1502+ return mError . isEmpty () ;
15001503}
15011504
15021505void QgsWmsProvider::capabilitiesReplyFinished ()
0 commit comments