21
21
22
22
#include < typeinfo>
23
23
24
- // time to wait for an answer without emitting dataChanged()
25
- #define WCS_THRESHOLD 200
26
-
27
24
#include " qgslogger.h"
28
25
#include " qgswcsprovider.h"
29
26
#include " qgscoordinatetransform.h"
@@ -108,6 +105,7 @@ QgsWcsProvider::QgsWcsProvider( QString const &uri )
108
105
, mFixBox( false )
109
106
, mFixRotate( false )
110
107
, mCacheLoadControl( QNetworkRequest::PreferNetwork )
108
+ , mNAM( 0 )
111
109
{
112
110
QgsDebugMsg ( " constructing with uri '" + mHttpUri + " '." );
113
111
@@ -467,6 +465,8 @@ QgsWcsProvider::~QgsWcsProvider()
467
465
mCacheReply ->deleteLater ();
468
466
mCacheReply = 0 ;
469
467
}
468
+
469
+ delete mNAM ;
470
470
}
471
471
472
472
QgsRasterInterface * QgsWcsProvider::clone () const
@@ -538,7 +538,7 @@ void QgsWcsProvider::readBlock( int bandNo, QgsRectangle const & viewExtent, in
538
538
if ( mCacheReply )
539
539
{
540
540
mCacheReply ->abort ();
541
- delete mCacheReply ;
541
+ mCacheReply -> deleteLater () ;
542
542
mCacheReply = 0 ;
543
543
}
544
544
@@ -791,26 +791,18 @@ void QgsWcsProvider::getCache( int bandNo, QgsRectangle const & viewExtent, int
791
791
setAuthorization ( request );
792
792
request.setAttribute ( QNetworkRequest::CacheSaveControlAttribute, true );
793
793
request.setAttribute ( QNetworkRequest::CacheLoadControlAttribute, mCacheLoadControl );
794
- mCacheReply = QgsNetworkAccessManager::instance ()->get ( request );
795
- connect ( mCacheReply , SIGNAL ( finished () ), this , SLOT ( cacheReplyFinished () ) );
796
- connect ( mCacheReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( cacheReplyProgress ( qint64, qint64 ) ) );
797
-
798
- emit statusChanged ( tr ( " Getting map via WCS." ) );
799
-
800
- mWaiting = true ;
801
794
802
- QTime t;
803
- t.start ();
795
+ mCacheReply = nam ()->get ( request );
796
+ connect ( mCacheReply , SIGNAL ( finished () ), this , SLOT ( cacheReplyFinished () ), Qt::DirectConnection );
797
+ connect ( mCacheReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( cacheReplyProgress ( qint64, qint64 ) ), Qt::DirectConnection );
804
798
805
- QSettings s;
806
- bool bkLayerCaching = s.value ( " /qgis/enable_render_caching" , false ).toBool ();
799
+ emit statusChanged ( tr ( " Getting map via WCS." ) );
807
800
808
- while ( mCacheReply && ( !bkLayerCaching || t.elapsed () < WCS_THRESHOLD ) )
809
- {
810
- QCoreApplication::processEvents ( QEventLoop::ExcludeUserInputEvents, WCS_THRESHOLD );
811
- }
812
- mWaiting = false ;
801
+ QEventLoop loop;
802
+ connect ( mCacheReply , SIGNAL ( finished () ), &loop, SLOT ( quit () ) );
803
+ loop.exec ();
813
804
805
+ Q_ASSERT ( mCacheReply == 0 );
814
806
}
815
807
816
808
// For stats only, maybe change QgsRasterDataProvider::bandStatistics() to
@@ -850,9 +842,14 @@ void QgsWcsProvider::cacheReplyFinished()
850
842
mCacheReply ->deleteLater ();
851
843
852
844
QgsDebugMsg ( QString ( " redirected getmap: %1" ).arg ( redirect.toString () ) );
853
- mCacheReply = QgsNetworkAccessManager::instance ()->get ( QNetworkRequest ( redirect.toUrl () ) );
854
- connect ( mCacheReply , SIGNAL ( finished () ), this , SLOT ( cacheReplyFinished () ) );
855
- connect ( mCacheReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( cacheReplyProgress ( qint64, qint64 ) ) );
845
+ mCacheReply = nam ()->get ( QNetworkRequest ( redirect.toUrl () ) );
846
+ connect ( mCacheReply , SIGNAL ( finished () ), this , SLOT ( cacheReplyFinished () ), Qt::DirectConnection );
847
+ connect ( mCacheReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( cacheReplyProgress ( qint64, qint64 ) ), Qt::DirectConnection );
848
+
849
+ QEventLoop loop;
850
+ connect ( mCacheReply , SIGNAL ( finished () ), &loop, SLOT ( quit () ) );
851
+ loop.exec ();
852
+
856
853
return ;
857
854
}
858
855
@@ -1043,12 +1040,6 @@ void QgsWcsProvider::cacheReplyFinished()
1043
1040
1044
1041
mCacheReply ->deleteLater ();
1045
1042
mCacheReply = 0 ;
1046
-
1047
- if ( !mWaiting )
1048
- {
1049
- QgsDebugMsg ( " emit dataChanged()" );
1050
- emit dataChanged ();
1051
- }
1052
1043
}
1053
1044
else
1054
1045
{
@@ -1061,9 +1052,14 @@ void QgsWcsProvider::cacheReplyFinished()
1061
1052
1062
1053
mCacheReply ->deleteLater ();
1063
1054
1064
- mCacheReply = QgsNetworkAccessManager::instance ()->get ( request );
1065
- connect ( mCacheReply , SIGNAL ( finished () ), this , SLOT ( cacheReplyFinished () ) );
1066
- connect ( mCacheReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( cacheReplyProgress ( qint64, qint64 ) ) );
1055
+ mCacheReply = nam ()->get ( request );
1056
+ connect ( mCacheReply , SIGNAL ( finished () ), this , SLOT ( cacheReplyFinished () ), Qt::DirectConnection );
1057
+ connect ( mCacheReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( cacheReplyProgress ( qint64, qint64 ) ), Qt::DirectConnection );
1058
+
1059
+ QEventLoop loop;
1060
+ connect ( mCacheReply , SIGNAL ( finished () ), &loop, SLOT ( quit () ) );
1061
+ loop.exec ();
1062
+
1067
1063
return ;
1068
1064
}
1069
1065
@@ -1872,3 +1868,19 @@ QGISEXTERN bool isProvider()
1872
1868
{
1873
1869
return true ;
1874
1870
}
1871
+
1872
+ #include < QThread>
1873
+ QgsNetworkAccessManager *QgsWcsProvider::nam ()
1874
+ {
1875
+ if ( mNAM && mNAM ->thread () != QThread::currentThread () )
1876
+ {
1877
+ // TODO: check that no network connections are handled by the NAM?
1878
+ mNAM ->deleteLater ();
1879
+ mNAM = 0 ;
1880
+ }
1881
+
1882
+ if ( !mNAM )
1883
+ mNAM = new QgsNetworkAccessManager ();
1884
+
1885
+ return mNAM ;
1886
+ }
0 commit comments