From 8d832d8aca7b29b67ef274f641a02ac3cc3c87d9 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 1 Sep 2016 21:43:40 +0800 Subject: [PATCH] Make sure we do not miss cancellation request at the beginning --- src/providers/wms/qgswmsprovider.cpp | 33 +++++++++++++++++++++++----- src/providers/wms/qgswmsprovider.h | 2 ++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/providers/wms/qgswmsprovider.cpp b/src/providers/wms/qgswmsprovider.cpp index 35c4665a635..e6d732964c8 100644 --- a/src/providers/wms/qgswmsprovider.cpp +++ b/src/providers/wms/qgswmsprovider.cpp @@ -3337,7 +3337,18 @@ QgsWmsImageDownloadHandler::QgsWmsImageDownloadHandler( const QString& providerU : mProviderUri( providerUri ) , mCachedImage( image ) , mEventLoop( new QEventLoop ) + , mFeedback( feedback ) { + if ( feedback ) + { + connect( feedback, SIGNAL( cancelled() ), this, SLOT( cancelled() ), Qt::QueuedConnection ); + + // rendering could have been cancelled before we started to listen to cancelled() signal + // so let's check before doing the download and maybe quit prematurely + if ( feedback->isCancelled() ) + return; + } + QNetworkRequest request( url ); auth.setAuthorization( request ); request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true ); @@ -3346,9 +3357,6 @@ QgsWmsImageDownloadHandler::QgsWmsImageDownloadHandler( const QString& providerU connect( mCacheReply, SIGNAL( downloadProgress( qint64, qint64 ) ), this, SLOT( cacheReplyProgress( qint64, qint64 ) ) ); Q_ASSERT( mCacheReply->thread() == QThread::currentThread() ); - - if ( feedback ) - connect( feedback, SIGNAL( cancelled() ), this, SLOT( cancelled() ), Qt::QueuedConnection ); } QgsWmsImageDownloadHandler::~QgsWmsImageDownloadHandler() @@ -3358,6 +3366,9 @@ QgsWmsImageDownloadHandler::~QgsWmsImageDownloadHandler() void QgsWmsImageDownloadHandler::downloadBlocking() { + if ( mFeedback && mFeedback->isCancelled() ) + return; // nothing to do + mEventLoop->exec( QEventLoop::ExcludeUserInputEvents ); Q_ASSERT( !mCacheReply ); @@ -3497,6 +3508,16 @@ QgsWmsTiledImageDownloadHandler::QgsWmsTiledImageDownloadHandler( const QString& , mSmoothPixmapTransform( smoothPixmapTransform ) , mFeedback( feedback ) { + if ( feedback ) + { + connect( feedback, SIGNAL( cancelled() ), this, SLOT( cancelled() ), Qt::QueuedConnection ); + + // rendering could have been cancelled before we started to listen to cancelled() signal + // so let's check before doing the download and maybe quit prematurely + if ( feedback->isCancelled() ) + return; + } + Q_FOREACH ( const TileRequest& r, requests ) { QNetworkRequest request( r.url ); @@ -3513,9 +3534,6 @@ QgsWmsTiledImageDownloadHandler::QgsWmsTiledImageDownloadHandler( const QString& mReplies << reply; } - - if ( feedback ) - connect( feedback, SIGNAL( cancelled() ), this, SLOT( cancelled() ), Qt::QueuedConnection ); } QgsWmsTiledImageDownloadHandler::~QgsWmsTiledImageDownloadHandler() @@ -3525,6 +3543,9 @@ QgsWmsTiledImageDownloadHandler::~QgsWmsTiledImageDownloadHandler() void QgsWmsTiledImageDownloadHandler::downloadBlocking() { + if ( mFeedback && mFeedback->isCancelled() ) + return; // nothing to do + mEventLoop->exec( QEventLoop::ExcludeUserInputEvents ); Q_ASSERT( mReplies.isEmpty() ); diff --git a/src/providers/wms/qgswmsprovider.h b/src/providers/wms/qgswmsprovider.h index feb48d802c7..9a137faa260 100644 --- a/src/providers/wms/qgswmsprovider.h +++ b/src/providers/wms/qgswmsprovider.h @@ -571,6 +571,8 @@ class QgsWmsImageDownloadHandler : public QObject QImage* mCachedImage; QEventLoop* mEventLoop; + + QgsRasterBlockFeedback* mFeedback; };