@@ -1859,6 +1859,7 @@ QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload( QObject *parent )
1859
1859
, mCapabilitiesReply( 0 )
1860
1860
, mIsAborted( false )
1861
1861
{
1862
+ connectManager ();
1862
1863
}
1863
1864
1864
1865
QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload ( const QString& baseUrl, const QgsWmsAuthorization& auth, QObject *parent )
@@ -1868,6 +1869,22 @@ QgsWmsCapabilitiesDownload::QgsWmsCapabilitiesDownload( const QString& baseUrl,
1868
1869
, mCapabilitiesReply( 0 )
1869
1870
, mIsAborted( false )
1870
1871
{
1872
+ connectManager ();
1873
+ }
1874
+
1875
+ void QgsWmsCapabilitiesDownload::connectManager ()
1876
+ {
1877
+ // The instance of this class may live on a thread different from QgsNetworkAccessManager instance's thread,
1878
+ // so we cannot call QgsNetworkAccessManager::get() directly and we must send a signal instead.
1879
+ connect ( this , SIGNAL ( sendRequest ( const QNetworkRequest & ) ),
1880
+ QgsNetworkAccessManager::instance (), SLOT ( sendGet ( const QNetworkRequest & ) ) );
1881
+ connect ( this , SIGNAL ( deleteReply ( QNetworkReply * ) ),
1882
+ QgsNetworkAccessManager::instance (), SLOT ( deleteReply ( QNetworkReply * ) ) );
1883
+ }
1884
+
1885
+ QgsWmsCapabilitiesDownload::~QgsWmsCapabilitiesDownload ()
1886
+ {
1887
+ abort ();
1871
1888
}
1872
1889
1873
1890
bool QgsWmsCapabilitiesDownload::downloadCapabilities ( const QString& baseUrl, const QgsWmsAuthorization& auth )
@@ -1880,7 +1897,9 @@ bool QgsWmsCapabilitiesDownload::downloadCapabilities( const QString& baseUrl, c
1880
1897
bool QgsWmsCapabilitiesDownload::downloadCapabilities ()
1881
1898
{
1882
1899
QgsDebugMsg ( " entering." );
1900
+ abort (); // cancel previous
1883
1901
mIsAborted = false ;
1902
+
1884
1903
QString url = mBaseUrl ;
1885
1904
QgsDebugMsg ( " url = " + url );
1886
1905
if ( !url.contains ( " SERVICE=WMTS" ) &&
@@ -1896,17 +1915,9 @@ bool QgsWmsCapabilitiesDownload::downloadCapabilities()
1896
1915
request.setAttribute ( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork );
1897
1916
request.setAttribute ( QNetworkRequest::CacheSaveControlAttribute, true );
1898
1917
1899
- QgsDebugMsg ( QString ( " getcapabilities: %1" ).arg ( url ) );
1900
- // This is causing Qt warning: "Cannot create children for a parent that is in a different thread."
1901
- // but it only means that the reply will have no parent
1902
- if ( mIsAborted )
1903
- {
1904
- return false ;
1905
- }
1906
- mCapabilitiesReply = QgsNetworkAccessManager::instance ()->get ( request );
1907
-
1908
- connect ( mCapabilitiesReply , SIGNAL ( finished () ), this , SLOT ( capabilitiesReplyFinished () ), Qt::DirectConnection );
1909
- connect ( mCapabilitiesReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( capabilitiesReplyProgress ( qint64, qint64 ) ), Qt::DirectConnection );
1918
+ connect ( QgsNetworkAccessManager::instance (), SIGNAL ( requestSent ( QNetworkReply *, QObject * ) ),
1919
+ SLOT ( requestSent ( QNetworkReply *, QObject * ) ) );
1920
+ emit sendRequest ( request );
1910
1921
1911
1922
QEventLoop loop;
1912
1923
connect ( this , SIGNAL ( downloadFinished () ), &loop, SLOT ( quit () ) );
@@ -1915,13 +1926,41 @@ bool QgsWmsCapabilitiesDownload::downloadCapabilities()
1915
1926
return mError .isEmpty ();
1916
1927
}
1917
1928
1929
+ void QgsWmsCapabilitiesDownload::requestSent ( QNetworkReply * reply, QObject *sender )
1930
+ {
1931
+ QgsDebugMsg ( " Entered" );
1932
+ if ( sender != this ) // it is not our reply
1933
+ {
1934
+ return ;
1935
+ }
1936
+ disconnect ( QgsNetworkAccessManager::instance (), SIGNAL ( requestSent ( QNetworkReply *, QObject * ) ),
1937
+ this , SLOT ( requestSent ( QNetworkReply *, QObject * ) ) );
1938
+
1939
+ if ( !reply )
1940
+ {
1941
+ emit downloadFinished ();
1942
+ return ;
1943
+ }
1944
+ if ( mIsAborted )
1945
+ {
1946
+ emit deleteReply ( reply );
1947
+ emit downloadFinished ();
1948
+ return ;
1949
+ }
1950
+ // Note: the reply was created on QgsNetworkAccessManager's thread
1951
+ mCapabilitiesReply = reply;
1952
+ connect ( mCapabilitiesReply , SIGNAL ( finished () ), this , SLOT ( capabilitiesReplyFinished () ), Qt::DirectConnection );
1953
+ connect ( mCapabilitiesReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( capabilitiesReplyProgress ( qint64, qint64 ) ), Qt::DirectConnection );
1954
+ }
1955
+
1918
1956
void QgsWmsCapabilitiesDownload::abort ()
1919
1957
{
1920
1958
QgsDebugMsg ( " Entered" );
1921
1959
mIsAborted = true ;
1922
1960
if ( mCapabilitiesReply )
1923
1961
{
1924
- mCapabilitiesReply ->abort ();
1962
+ emit deleteReply ( mCapabilitiesReply );
1963
+ mCapabilitiesReply = 0 ;
1925
1964
}
1926
1965
}
1927
1966
@@ -1935,7 +1974,7 @@ void QgsWmsCapabilitiesDownload::capabilitiesReplyProgress( qint64 bytesReceived
1935
1974
void QgsWmsCapabilitiesDownload::capabilitiesReplyFinished ()
1936
1975
{
1937
1976
QgsDebugMsg ( " entering." );
1938
- if ( !mIsAborted )
1977
+ if ( !mIsAborted && mCapabilitiesReply )
1939
1978
{
1940
1979
if ( mCapabilitiesReply ->error () == QNetworkReply::NoError )
1941
1980
{
@@ -1962,10 +2001,8 @@ void QgsWmsCapabilitiesDownload::capabilitiesReplyFinished()
1962
2001
1963
2002
mCapabilitiesReply ->deleteLater ();
1964
2003
QgsDebugMsg ( QString ( " redirected getcapabilities: %1" ).arg ( redirect.toString () ) );
1965
- mCapabilitiesReply = QgsNetworkAccessManager::instance ()->get ( request );
1966
-
1967
- connect ( mCapabilitiesReply , SIGNAL ( finished () ), this , SLOT ( capabilitiesReplyFinished () ) );
1968
- connect ( mCapabilitiesReply , SIGNAL ( downloadProgress ( qint64, qint64 ) ), this , SLOT ( capabilitiesReplyProgress ( qint64, qint64 ) ) );
2004
+ // mCapabilitiesReply = QgsNetworkAccessManager::instance()->get( request );
2005
+ emit sendRequest ( request );
1969
2006
return ;
1970
2007
}
1971
2008
}
@@ -1987,8 +2024,11 @@ void QgsWmsCapabilitiesDownload::capabilitiesReplyFinished()
1987
2024
}
1988
2025
}
1989
2026
1990
- mCapabilitiesReply ->deleteLater ();
1991
- mCapabilitiesReply = 0 ;
2027
+ if ( mCapabilitiesReply )
2028
+ {
2029
+ mCapabilitiesReply ->deleteLater ();
2030
+ mCapabilitiesReply = 0 ;
2031
+ }
1992
2032
1993
2033
emit downloadFinished ();
1994
2034
}
0 commit comments