[Marble-commits] branches/KDE/4.5/kdeedu/marble/src/lib/routing

Dennis Nienhüser earthwings at gentoo.org
Fri Aug 13 22:49:00 CEST 2010


SVN commit 1163352 by nienhueser:

The language code to generate instructions for is taken from the system locale in Marble. ORS does not handle all locales and reports an error if it does not know one. Currently Marble informs the user about the problem with an error dialog. The patch changes this to catch the error early and generate a new request with english as the fallback language code. This way routes are retrieved, although not localized.
RB: 4987
BUG: 247339



 M  +32 -10    OrsRoutingProvider.cpp  
 M  +6 -0      OrsRoutingProvider.h  


--- branches/KDE/4.5/kdeedu/marble/src/lib/routing/OrsRoutingProvider.cpp #1163351:1163352
@@ -23,7 +23,8 @@
 
 OrsRoutingProvider::OrsRoutingProvider( QObject *parent ) :
         AbstractRoutingProvider( parent ),
-        m_networkAccessManager( new QNetworkAccessManager( this ) )
+        m_networkAccessManager( new QNetworkAccessManager( this ) ),
+        m_route( 0 )
 {
     connect( m_networkAccessManager, SIGNAL( finished( QNetworkReply * ) ),
              this, SLOT( retrieveData( QNetworkReply * ) ) );
@@ -31,18 +32,28 @@
 
 void OrsRoutingProvider::retrieveDirections( RouteSkeleton *route )
 {
-    if ( route->size() < 2 ) {
+    m_route = route;
+    if ( m_languageCode.isEmpty() ) {
+        m_languageCode = MarbleLocale::languageCode();
+    }
+    retrieveDirections();
+}
+
+void OrsRoutingProvider::retrieveDirections()
+{
+    Q_ASSERT( m_route );
+    if ( m_route->size() < 2 ) {
         return;
     }
 
-    GeoDataCoordinates source = route->source();
-    GeoDataCoordinates destination = route->destination();
+    GeoDataCoordinates source = m_route->source();
+    GeoDataCoordinates destination = m_route->destination();
 
     QString request = xmlHeader();
     QString unit = "KM";
     QString preference = "Fastest";
 
-    switch ( route->routePreference() ) {
+    switch ( m_route->routePreference() ) {
     case RouteSkeleton::CarFastest:
         unit = "KM";
         preference = "Fastest";
@@ -64,14 +75,14 @@
     request += requestHeader( unit, preference );
     request += requestPoint( StartPoint, source );
 
-    if ( route->size() > 2 ) {
-        for ( int i = 1; i < route->size() - 1; ++i ) {
-            request += requestPoint( ViaPoint, route->at( i ) );
+    if ( m_route->size() > 2 ) {
+        for ( int i = 1; i < m_route->size() - 1; ++i ) {
+            request += requestPoint( ViaPoint, m_route->at( i ) );
         }
     }
 
     request += requestPoint( EndPoint, destination );
-    request += requestFooter( route->avoidFeatures() );
+    request += requestFooter( m_route->avoidFeatures() );
     request += xmlFooter();
     //mDebug() << "POST: " << request;
 
@@ -89,8 +100,18 @@
     QByteArray data = reply->readAll();
     reply->deleteLater();
     //mDebug() << "Download completed: " << data;
+
+    QByteArray languageError = "xls:Error errorCode=\"NotSupported\" severity=\"Error\" locationPath=\"Language\"";
+    if ( data.contains( languageError ) && m_languageCode != "en" ) {
+        Q_ASSERT( m_route );
+        mDebug() << "ORS routing instructions not available for language code" << m_languageCode << ", falling back to english.";
+        m_languageCode = "en";
+        retrieveDirections();
+    }
+    else {
     emit routeRetrieved( AbstractRoutingProvider::OpenGIS, data );
 }
+}
 
 void OrsRoutingProvider::handleError( QNetworkReply::NetworkError error )
 {
@@ -106,7 +127,8 @@
     result += "xsi:schemaLocation=\"http://www.opengis.net/xls ";
     result += "http://schemas.opengis.net/ols/1.1.0/RouteService.xsd\" version=\"1.1\" xls:lang=\"%1\">\n";
     result += "<xls:RequestHeader/>\n";
-    return result.arg( MarbleLocale::languageCode() );
+    Q_ASSERT( !m_languageCode.isEmpty() );
+    return result.arg( m_languageCode );
 }
 
 QString OrsRoutingProvider::requestHeader( const QString &unit, const QString &routePreference ) const
--- branches/KDE/4.5/kdeedu/marble/src/lib/routing/OrsRoutingProvider.h #1163351:1163352
@@ -50,6 +50,8 @@
     void handleError( QNetworkReply::NetworkError );
 
 private:
+    void retrieveDirections();
+
     /** Builds the xml request header. */
     QString xmlHeader() const;
 
@@ -66,6 +68,10 @@
     QString xmlFooter() const;
 
     QNetworkAccessManager *m_networkAccessManager;
+    
+    RouteSkeleton *m_route;
+
+    QString m_languageCode;
 };
 
 } // namespace Marble


More information about the Marble-commits mailing list