From 5824faf6742b39706024e3c146874d44e61bbf2c Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 23 Jan 2019 07:34:26 +1000 Subject: [PATCH] Add thread safe QgsNetworkAccessManager::requestTimedOut signal --- .../qgsnetworkaccessmanager.sip.in | 19 +++++++++++++++++++ src/core/qgsnetworkaccessmanager.cpp | 9 ++++++--- src/core/qgsnetworkaccessmanager.h | 15 +++++++++++++++ src/providers/wfs/qgswfsrequest.cpp | 2 +- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/python/core/auto_generated/qgsnetworkaccessmanager.sip.in b/python/core/auto_generated/qgsnetworkaccessmanager.sip.in index 34eaba343c6..1732308c07e 100644 --- a/python/core/auto_generated/qgsnetworkaccessmanager.sip.in +++ b/python/core/auto_generated/qgsnetworkaccessmanager.sip.in @@ -173,6 +173,8 @@ created in any thread. .. seealso:: :py:func:`finished` +.. seealso:: :py:func:`requestTimedOut` + .. versionadded:: 3.6 %End @@ -189,6 +191,23 @@ created in any thread. .. seealso:: :py:func:`requestAboutToBeCreated` +.. seealso:: :py:func:`requestTimedOut` + +.. versionadded:: 3.6 +%End + + void requestTimedOut( QgsNetworkRequestParameters request ); +%Docstring +Emitted when a network request has timed out. + +This signal is propagated to the main thread QgsNetworkAccessManager instance, so it is necessary +only to connect to the main thread's signal in order to receive notifications about requests +created in any thread. + +.. seealso:: :py:func:`requestAboutToBeCreated` + +.. seealso:: :py:func:`finished` + .. versionadded:: 3.6 %End diff --git a/src/core/qgsnetworkaccessmanager.cpp b/src/core/qgsnetworkaccessmanager.cpp index 536da86194f..e3f96e92153 100644 --- a/src/core/qgsnetworkaccessmanager.cpp +++ b/src/core/qgsnetworkaccessmanager.cpp @@ -243,8 +243,8 @@ void QgsNetworkAccessManager::abortRequest() QgsDebugMsgLevel( QStringLiteral( "Abort [reply:%1] %2" ).arg( reinterpret_cast< qint64 >( reply ), 0, 16 ).arg( reply->url().toString() ), 3 ); QgsMessageLog::logMessage( tr( "Network request %1 timed out" ).arg( reply->url().toString() ), tr( "Network" ) ); // Notify the application + emit requestTimedOut( QgsNetworkRequestParameters( reply->operation(), reply->request(), reply->property( "requestId" ).toInt() ) ); emit requestTimedOut( reply ); - } void QgsNetworkAccessManager::onReplyFinished( QNetworkReply *reply ) @@ -308,8 +308,11 @@ void QgsNetworkAccessManager::setupDefaultProxyAndCache( Qt::ConnectionType conn sMainNAM, &QNetworkAccessManager::proxyAuthenticationRequired, connectionType ); - connect( this, &QgsNetworkAccessManager::requestTimedOut, - sMainNAM, &QgsNetworkAccessManager::requestTimedOut ); + connect( this, qgis::overload< QNetworkReply *>::of( &QgsNetworkAccessManager::requestTimedOut ), + sMainNAM, qgis::overload< QNetworkReply *>::of( &QgsNetworkAccessManager::requestTimedOut ) ); + + connect( this, qgis::overload< QgsNetworkRequestParameters >::of( &QgsNetworkAccessManager::requestTimedOut ), + sMainNAM, qgis::overload< QgsNetworkRequestParameters >::of( &QgsNetworkAccessManager::requestTimedOut ) ); connect( this, qgis::overload< QgsNetworkRequestParameters >::of( &QgsNetworkAccessManager::requestAboutToBeCreated ), sMainNAM, qgis::overload< QgsNetworkRequestParameters >::of( &QgsNetworkAccessManager::requestAboutToBeCreated ) ); diff --git a/src/core/qgsnetworkaccessmanager.h b/src/core/qgsnetworkaccessmanager.h index a442f19e018..544b95d4240 100644 --- a/src/core/qgsnetworkaccessmanager.h +++ b/src/core/qgsnetworkaccessmanager.h @@ -174,6 +174,7 @@ class CORE_EXPORT QgsNetworkAccessManager : public QNetworkAccessManager * created in any thread. * * \see finished( QgsNetworkReplyContent ) + * \see requestTimedOut( QgsNetworkRequestParameters ) * \since QGIS 3.6 */ void requestAboutToBeCreated( QgsNetworkRequestParameters request ); @@ -189,10 +190,24 @@ class CORE_EXPORT QgsNetworkAccessManager : public QNetworkAccessManager * created in any thread. * * \see requestAboutToBeCreated( QgsNetworkRequestParameters ) + * \see requestTimedOut( QgsNetworkRequestParameters ) * \since QGIS 3.6 */ void finished( QgsNetworkReplyContent reply ); + /** + * Emitted when a network request has timed out. + * + * This signal is propagated to the main thread QgsNetworkAccessManager instance, so it is necessary + * only to connect to the main thread's signal in order to receive notifications about requests + * created in any thread. + * + * \see requestAboutToBeCreated( QgsNetworkRequestParameters ) + * \see finished( QgsNetworkReplyContent ) + * \since QGIS 3.6 + */ + void requestTimedOut( QgsNetworkRequestParameters request ); + void requestCreated( QNetworkReply * ); void requestTimedOut( QNetworkReply * ); diff --git a/src/providers/wfs/qgswfsrequest.cpp b/src/providers/wfs/qgswfsrequest.cpp index 0856c7c0b69..bc4e53a7b04 100644 --- a/src/providers/wfs/qgswfsrequest.cpp +++ b/src/providers/wfs/qgswfsrequest.cpp @@ -38,7 +38,7 @@ QgsWfsRequest::QgsWfsRequest( const QgsWFSDataSourceURI &uri ) , mGotNonEmptyResponse( false ) { QgsDebugMsgLevel( QStringLiteral( "theUri = " ) + uri.uri( ), 4 ); - connect( QgsNetworkAccessManager::instance(), &QgsNetworkAccessManager::requestTimedOut, this, &QgsWfsRequest::requestTimedOut ); + connect( QgsNetworkAccessManager::instance(), qgis::overload< QNetworkReply *>::of( &QgsNetworkAccessManager::requestTimedOut ), this, &QgsWfsRequest::requestTimedOut ); } QgsWfsRequest::~QgsWfsRequest()