[Marble-commits] KDE/kdeedu/marble/src/plugins/runner

Dennis Nienhüser earthwings at gentoo.org
Sat Nov 20 00:28:41 CET 2010


SVN commit 1198843 by nienhueser:

It's not possible to use QNetworkAccessManager in a thread on Maemo with Qt 4.7. This affects all online runners. Work around it by creating the instance and requests in the main thread. Should be reverted once the issue is fixed on the Qt side. See https://bugs.kde.org/show_bug.cgi?id=257376 for details.
CCBUG: 257376

 M  +3 -1      hostip/HostipPlugin.cpp  
 M  +33 -30    nominatim/OsmNominatimRunner.cpp  
 M  +11 -0     nominatim/OsmNominatimRunner.h  
 M  +14 -12    openrouteservice/OpenRouteServiceRunner.cpp  
 M  +6 -0      openrouteservice/OpenRouteServiceRunner.h  
 M  +14 -14    yours/YoursRunner.cpp  
 M  +4 -0      yours/YoursRunner.h  


--- trunk/KDE/kdeedu/marble/src/plugins/runner/hostip/HostipPlugin.cpp #1198842:1198843
@@ -16,7 +16,9 @@
 
 HostipPlugin::HostipPlugin( QObject *parent ) : RunnerPlugin( parent )
 {
-    setCapabilities( Search );
+    bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
+    // Disabled on small screen devices to save resources
+    setCapabilities( smallScreen ? None : Search );
     setSupportedCelestialBodies( QStringList() << "earth" );
     setCanWorkOffline( false );
     setName( tr( "Hostip.info" ) );
--- trunk/KDE/kdeedu/marble/src/plugins/runner/nominatim/OsmNominatimRunner.cpp #1198842:1198843
@@ -21,6 +21,7 @@
 #include <QtCore/QString>
 #include <QtCore/QVector>
 #include <QtCore/QUrl>
+#include <QtCore/QTimer>
 #include <QtNetwork/QNetworkAccessManager>
 #include <QtNetwork/QNetworkReply>
 #include <QtXml/QDomDocument>
@@ -29,23 +30,20 @@
 {
 
 OsmNominatimRunner::OsmNominatimRunner( QObject *parent ) :
-    MarbleAbstractRunner( parent ), m_searchManager( 0 ),
-    m_reverseGeocodingManager( 0 )
+    MarbleAbstractRunner( parent ), m_searchManager( new QNetworkAccessManager (this ) ),
+    m_reverseGeocodingManager( new QNetworkAccessManager ( this ) )
 {
-    // nothing to do
+    connect(m_searchManager, SIGNAL(finished(QNetworkReply*)),
+            this, SLOT(handleSearchResult(QNetworkReply*)));
+    connect(m_reverseGeocodingManager, SIGNAL(finished(QNetworkReply*)),
+            this, SLOT(handleReverseGeocodingResult(QNetworkReply*)));
 }
 
 OsmNominatimRunner::~OsmNominatimRunner()
 {
-    if ( m_searchManager ) {
-        m_searchManager->deleteLater();
+    // nothing to do
     }
 
-    if ( m_reverseGeocodingManager ) {
-        m_reverseGeocodingManager->deleteLater();
-    }
-}
-
 GeoDataFeature::GeoDataVisualCategory OsmNominatimRunner::category() const
 {
     return GeoDataFeature::OsmSite;
@@ -56,6 +54,11 @@
     emit searchFinished( QVector<GeoDataPlacemark*>() );
 }
 
+void OsmNominatimRunner::returnNoReverseGeocodingResult()
+{
+    emit reverseGeocodingFinished( m_coordinates, GeoDataPlacemark() );
+}
+
 void OsmNominatimRunner::search( const QString &searchTerm )
 {    
     QString base = "http://nominatim.openstreetmap.org/search?q=%1&format=xml";
@@ -63,19 +66,11 @@
     QString query = "q=%1&format=xml&addressdetails=0&accept-language=%2";
     QString url = QString(base + query).arg(searchTerm).arg(MarbleLocale::languageCode());
 
-    if ( !m_searchManager ) {
-        m_searchManager = new QNetworkAccessManager;
-        connect(m_searchManager, SIGNAL(finished(QNetworkReply*)),
-                this, SLOT(handleSearchResult(QNetworkReply*)), Qt::DirectConnection);
-    }
+    m_searchRequest.setUrl(QUrl(url));
+    m_searchRequest.setRawHeader("User-Agent", TinyWebBrowser::userAgent("Browser", "OsmNominatimRunner") );
 
-    QNetworkRequest request;
-    request.setUrl(QUrl(url));
-    request.setRawHeader("User-Agent", TinyWebBrowser::userAgent("Browser", "OsmNominatimRunner") );
-
-    QNetworkReply *reply = m_searchManager->get(request);
-    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
-            this, SLOT(returnNoResults()), Qt::DirectConnection);
+    // @todo FIXME Must currently be done in the main thread, see bug 257376
+    QTimer::singleShot( 0, this, SLOT( startSearch() ) );
 }
 
 void OsmNominatimRunner::reverseGeocoding( const GeoDataCoordinates &coordinates )
@@ -88,17 +83,25 @@
     double lat = coordinates.latitude( GeoDataCoordinates::Degree );
     QString url = QString( base + query ).arg( lon ).arg( lat ).arg( MarbleLocale::languageCode() );
 
-    if ( !m_reverseGeocodingManager ) {
-        m_reverseGeocodingManager = new QNetworkAccessManager;
-        connect(m_reverseGeocodingManager, SIGNAL(finished(QNetworkReply*)),
-                this, SLOT(handleReverseGeocodingResult(QNetworkReply*)), Qt::DirectConnection);
+    m_reverseGeocodingRequest.setUrl(QUrl(url));
+    m_reverseGeocodingRequest.setRawHeader("User-Agent", TinyWebBrowser::userAgent("Browser", "OsmNominatimRunner") );
+
+    // @todo FIXME Must currently be done in the main thread, see bug 257376
+    QTimer::singleShot( 0, this, SLOT( startReverseGeocoding() ) );
     }
 
-    QNetworkRequest request;
-    request.setUrl(QUrl(url));
-    request.setRawHeader("User-Agent", TinyWebBrowser::userAgent("Browser", "OsmNominatimRunner") );
+void OsmNominatimRunner::startSearch()
+{
+    QNetworkReply *reply = m_searchManager->get(m_searchRequest);
+    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
+            this, SLOT(returnNoResults()));
+}
 
-    m_reverseGeocodingManager->get(request);
+void OsmNominatimRunner::startReverseGeocoding()
+{
+    QNetworkReply *reply = m_reverseGeocodingManager->get( m_reverseGeocodingRequest );
+    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
+            this, SLOT(returnNoReverseGeocodingResult()));
 }
 
 void OsmNominatimRunner::handleSearchResult( QNetworkReply* reply )
--- trunk/KDE/kdeedu/marble/src/plugins/runner/nominatim/OsmNominatimRunner.h #1198842:1198843
@@ -16,6 +16,7 @@
 
 #include <QtCore/QString>
 #include <QtNetwork/QHostInfo>
+#include <QtNetwork/QNetworkRequest>
 
 class QNetworkReply;
 class QNetworkAccessManager;
@@ -50,6 +51,12 @@
     // No results (or an error)
     void returnNoResults();
 
+    void returnNoReverseGeocodingResult();
+
+    void startSearch();
+
+    void startReverseGeocoding();
+
 private:
     void addData( const QDomNodeList &node, const QString &key, GeoDataExtendedData *extendedData );
 
@@ -57,6 +64,10 @@
 
     QNetworkAccessManager* m_reverseGeocodingManager;
 
+    QNetworkRequest m_reverseGeocodingRequest;
+
+    QNetworkRequest m_searchRequest;
+
     GeoDataCoordinates m_coordinates;
 };
 
--- trunk/KDE/kdeedu/marble/src/plugins/runner/openrouteservice/OpenRouteServiceRunner.cpp #1198842:1198843
@@ -21,6 +21,7 @@
 #include <QtCore/QVector>
 #include <QtCore/QUrl>
 #include <QtCore/QTime>
+#include <QtCore/QTimer>
 #include <QtNetwork/QNetworkAccessManager>
 #include <QtNetwork/QNetworkReply>
 #include <QtXml/QDomDocument>
@@ -30,17 +31,16 @@
 
 OpenRouteServiceRunner::OpenRouteServiceRunner( QObject *parent ) :
         MarbleAbstractRunner( parent ),
-        m_networkAccessManager( 0 )
+        m_networkAccessManager( new QNetworkAccessManager( this ) )
 {
-    // nothing to do
+    connect( m_networkAccessManager, SIGNAL( finished( QNetworkReply * ) ),
+             this, SLOT( retrieveData( QNetworkReply * ) ) );
 }
 
 OpenRouteServiceRunner::~OpenRouteServiceRunner()
 {
-    if (m_networkAccessManager) {
-        m_networkAccessManager->deleteLater();
+    // nothing to do
     }
-}
 
 GeoDataFeature::GeoDataVisualCategory OpenRouteServiceRunner::category() const
 {
@@ -53,12 +53,6 @@
         return;
     }
 
-    if ( !m_networkAccessManager ) {
-        m_networkAccessManager = new QNetworkAccessManager;
-        connect( m_networkAccessManager, SIGNAL( finished( QNetworkReply * ) ),
-                 this, SLOT( retrieveData( QNetworkReply * ) ), Qt::DirectConnection );
-    }
-
     GeoDataCoordinates source = route->source();
     GeoDataCoordinates destination = route->destination();
 
@@ -91,8 +85,16 @@
     // Please refrain from making this URI public. To use it outside the scope
     // of marble you need permission from the openrouteservice.org team.
     QUrl url = QUrl( "http://openls.geog.uni-heidelberg.de/osm/eu/routing" );
+    m_request = QNetworkRequest( url );
+    m_requestData = request.toLatin1();
 
-    QNetworkReply *reply = m_networkAccessManager->post( QNetworkRequest( url ), request.toLatin1() );
+    // @todo FIXME Must currently be done in the main thread, see bug 257376
+    QTimer::singleShot( 0, this, SLOT( get() ) );
+}
+
+void OpenRouteServiceRunner::get()
+{
+    QNetworkReply *reply = m_networkAccessManager->post( m_request, m_requestData );
     connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ),
              this, SLOT( handleError( QNetworkReply::NetworkError ) ), Qt::DirectConnection );
 }
--- trunk/KDE/kdeedu/marble/src/plugins/runner/openrouteservice/OpenRouteServiceRunner.h #1198842:1198843
@@ -52,6 +52,8 @@
     /** A network error occurred */
     void handleError( QNetworkReply::NetworkError );
 
+    void get();
+
 private:
     /** Builds the xml request header. */
     QString xmlHeader() const;
@@ -71,6 +73,10 @@
     GeoDataDocument* parse( const QByteArray &input ) const;
 
     QNetworkAccessManager *m_networkAccessManager;
+
+    QNetworkRequest m_request;
+
+    QByteArray m_requestData;
 };
 
 }
--- trunk/KDE/kdeedu/marble/src/plugins/runner/yours/YoursRunner.cpp #1198842:1198843
@@ -27,23 +27,23 @@
 #include <QtNetwork/QNetworkReply>
 #include <QtXml/QDomDocument>
 #include <QtCore/QBuffer>
+#include <QtCore/QTimer>
 
 namespace Marble
 {
 
 YoursRunner::YoursRunner( QObject *parent ) :
         MarbleAbstractRunner( parent ),
-        m_networkAccessManager( 0 )
+        m_networkAccessManager( new QNetworkAccessManager( this ) )
 {
-    // nothing to do
+    connect( m_networkAccessManager, SIGNAL( finished( QNetworkReply* ) ),
+             this, SLOT( retrieveData( QNetworkReply* ) ) );
 }
 
 YoursRunner::~YoursRunner()
 {
-    if ( m_networkAccessManager ) {
-        m_networkAccessManager->deleteLater();
+    // nothing to do
     }
-}
 
 GeoDataFeature::GeoDataVisualCategory YoursRunner::category() const
 {
@@ -56,13 +56,6 @@
         return;
     }
 
-    if ( !m_networkAccessManager )
-    {
-        m_networkAccessManager = new QNetworkAccessManager;
-        connect( m_networkAccessManager, SIGNAL( finished( QNetworkReply* ) ),
-                 this, SLOT( retrieveData( QNetworkReply* ) ), Qt::DirectConnection );
-    }
-
     GeoDataCoordinates source = route->source();
     GeoDataCoordinates destination = route->destination();
 
@@ -80,9 +73,16 @@
     QString request = base + args + preferences;
     // mDebug() << "GET: " << request;
 
-    QNetworkReply *reply = m_networkAccessManager->get( QNetworkRequest( QUrl( request ) ) );
+    m_request = QNetworkRequest( QUrl( request ) );
+    // @todo FIXME Must currently be done in the main thread, see bug 257376
+    QTimer::singleShot( 0, this, SLOT( get() ) );
+}
+
+void YoursRunner::get()
+{
+    QNetworkReply *reply = m_networkAccessManager->get( m_request );
     connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ),
-             this, SLOT( handleError( QNetworkReply::NetworkError ) ), Qt::DirectConnection );
+             this, SLOT( handleError( QNetworkReply::NetworkError ) ) );
 }
 
 void YoursRunner::retrieveData( QNetworkReply *reply )
--- trunk/KDE/kdeedu/marble/src/plugins/runner/yours/YoursRunner.h #1198842:1198843
@@ -44,12 +44,16 @@
     /** A network error occurred */
     void handleError( QNetworkReply::NetworkError );
 
+    void get();
+
 private:
     GeoDataDocument* parse( const QByteArray &input ) const;
 
     qreal distance( const GeoDataDocument* document ) const;
 
     QNetworkAccessManager *m_networkAccessManager;
+
+    QNetworkRequest m_request;
 };
 
 }


More information about the Marble-commits mailing list