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

Bernhard Beschow bbeschow at cs.tu-berlin.de
Sat May 1 13:17:56 CEST 2010


SVN commit 1121481 by beschow:

Introduce a ServerLayout class to produce download URLs from a TileId.

GeoSceneTexture uses ServerLayout to produces complete download URLs based on a TileId.
The relativeTileFileName() and themeStr() methods are moved from TileLoaderHelper to GeoSceneTexture for convenience.

REVIEW: 3588
(http://reviewboard.kde.org/r/3588/)

 M  +1 -0      lib/CMakeLists.txt  
 A             lib/ServerLayout.cpp   [License: LGPL]
 A             lib/ServerLayout.h   [License: LGPL]
 M  +3 -3      lib/StackedTileLoader.cpp  
 M  +3 -6      lib/TileLoader.cpp  
 M  +0 -80     lib/TileLoaderHelper.cpp  
 M  +0 -23     lib/TileLoaderHelper.h  
 M  +18 -17    lib/geodata/handlers/dgml/DgmlStorageLayoutTagHandler.cpp  
 M  +48 -18    lib/geodata/scene/GeoSceneTexture.cpp  
 M  +13 -8     lib/geodata/scene/GeoSceneTexture.h  
 M  +1 -0      tilecreator/CMakeLists.txt  


--- trunk/KDE/kdeedu/marble/src/lib/CMakeLists.txt #1121480:1121481
@@ -126,6 +126,7 @@
     EquirectScanlineTextureMapper.cpp
     MercatorScanlineTextureMapper.cpp
     DiscCache.cpp
+    ServerLayout.cpp
     StoragePolicy.cpp
     CacheStoragePolicy.cpp
     FileStoragePolicy.cpp
--- trunk/KDE/kdeedu/marble/src/lib/StackedTileLoader.cpp #1121480:1121481
@@ -316,7 +316,7 @@
         return texture->maximumTileLevel();
 
     int maximumTileLevel = -1;
-    QString tilepath = MarbleDirs::path( TileLoaderHelper::themeStr( texture ) );
+    QString tilepath = MarbleDirs::path( texture->themeStr() );
     //    mDebug() << "StackedTileLoader::maxPartialTileLevel tilepath" << tilepath;
     QStringList leveldirs = QDir( tilepath ).entryList( QDir::AllDirs | QDir::NoSymLinks
                                                         | QDir::NoDotAndDotDot );
@@ -352,8 +352,8 @@
     for ( int column = 0; noerr && column < levelZeroColumns; ++column ) {
         for ( int row = 0; noerr && row < levelZeroRows; ++row ) {
 
-            const QString tilepath = MarbleDirs::path( TileLoaderHelper::relativeTileFileName(
-                texture, 0, column, row ));
+            const QString tilepath = MarbleDirs::path( texture->relativeTileFileName(
+                TileId( texture->sourceDir(), 0, column, row )));
             noerr = QFile::exists( tilepath );
         }
     }
--- trunk/KDE/kdeedu/marble/src/lib/TileLoader.cpp #1121480:1121481
@@ -179,17 +179,14 @@
 QString TileLoader::tileFileName( TileId const & tileId ) const
 {
     GeoSceneTexture const * const textureLayer = findTextureLayer( tileId );
-    return MarbleDirs::path( TileLoaderHelper::relativeTileFileName
-                             ( textureLayer, tileId.zoomLevel(), tileId.x(), tileId.y() ));
+    return MarbleDirs::path( textureLayer->relativeTileFileName( tileId ));
 }
 
 void TileLoader::triggerDownload( TileId const & id, DownloadUsage const usage )
 {
     GeoSceneTexture * const textureLayer = findTextureLayer( id );
-    QUrl const sourceUrl = TileLoaderHelper::downloadUrl( textureLayer, id.zoomLevel(), id.x(),
-                                                          id.y() );
-    QString const destFileName = TileLoaderHelper::relativeTileFileName( textureLayer, id.zoomLevel(),
-                                                                         id.x(), id.y() );
+    QUrl const sourceUrl = textureLayer->downloadUrl( id );
+    QString const destFileName = textureLayer->relativeTileFileName( id );
     emit downloadTile( sourceUrl, destFileName, id.toString(), usage );
 }
 
--- trunk/KDE/kdeedu/marble/src/lib/TileLoaderHelper.cpp #1121480:1121481
@@ -28,7 +28,6 @@
 
 #include "MarbleDebug.h"
 
-#include "GeoSceneTexture.h"
 #include "global.h"
 
 namespace Marble
@@ -74,83 +73,4 @@
     return (int)( std::log( (qreal)(column / levelZeroColumns) ) / std::log( (qreal)2.0 ) );
 }
 
-QUrl TileLoaderHelper::downloadUrl( GeoSceneTexture *textureLayer, int zoomLevel, int x,
-                                    int y )
-{
-    QUrl tileUrl;
-    if ( textureLayer ) {
-        tileUrl = textureLayer->downloadUrl();
-	QString path = tileUrl.path();
-        const QString suffix = textureLayer->fileFormat().toLower();
-
-        switch ( textureLayer->storageLayoutMode() ) {
-        case GeoSceneTexture::Marble:
-            path += relativeTileFileName( textureLayer, zoomLevel, x, y );
-            break;
-
-        case GeoSceneTexture::OpenStreetMap:
-            path += QString( "%1/%2/%3.%4" ).arg( zoomLevel ).arg( x ).arg( y ).arg( suffix );
-            break;
-
-        case GeoSceneTexture::Custom:
-            path += textureLayer->customStorageLayout();
-            path.replace( "{zoomLevel}", QString::number( zoomLevel ) );
-            path.replace( "{suffix}", suffix );
-            path.replace( "{x}", QString::number( x ) );
-            path.replace( "{y}", QString::number( y ) );
-            break;
         }
-        tileUrl.setPath( path );
-    }
-    return tileUrl;
-}
-
-QString TileLoaderHelper::relativeTileFileName( GeoSceneTexture const * const textureLayer,
-                                                int level, int x, int y )
-{
-    QString relFileName;
-    if ( textureLayer ) {
-        const QString suffix = textureLayer->fileFormat().toLower();
-        switch ( textureLayer->storageLayoutMode() ) {
-        case GeoSceneTexture::Marble:
-            relFileName = QString( "%1/%2/%3/%3_%4.%5" )
-                .arg( themeStr( textureLayer ) )
-                .arg( level )
-                .arg( y, tileDigits, 10, QChar('0') )
-                .arg( x, tileDigits, 10, QChar('0') )
-                .arg( suffix );
-            break;
-        case GeoSceneTexture::OpenStreetMap:
-            relFileName = QString( "%1/%2/%3/%4.%5" )
-                .arg( themeStr( textureLayer ) )
-                .arg( level )
-                .arg( x )
-                .arg( y )
-                .arg( suffix );
-            break;
-
-        case GeoSceneTexture::Custom:
-            relFileName = QString( "%1/%2/%3/%4.%5" )
-                .arg( themeStr( textureLayer ) )
-                .arg( level )
-                .arg( x )
-                .arg( y )
-                .arg( suffix );
-            break;
-        }
-    }
-    return relFileName;
-}
-
-QString TileLoaderHelper::themeStr( GeoSceneTexture const * const textureLayer )
-{
-    QString oldThemeStr;
-
-    if ( textureLayer ) {
-         oldThemeStr = "maps/" + textureLayer->sourceDir();
-    }
-
-    return oldThemeStr;
-}
-
-}
--- trunk/KDE/kdeedu/marble/src/lib/TileLoaderHelper.h #1121480:1121481
@@ -25,14 +25,9 @@
 #ifndef MARBLE_TILELOADERHELPER_H
 #define MARBLE_TILELOADERHELPER_H
 
-#include <QtCore/QString>
-#include <QtCore/QUrl>
-
 namespace Marble
 {
 
-class GeoSceneTexture;
-
 namespace TileLoaderHelper
 {
     /**
@@ -78,24 +73,6 @@
      *               by the code which makes use of it.
      */
     int columnToLevel( int levelZeroColumns, int column );
-
-    /**
-     * @brief Get the url for download of a tile.
-     */
-    QUrl downloadUrl( GeoSceneTexture *textureLayer, int zoomLevel, int x, int y );
-
-    /**
-     * @brief Get the relative file name of a tile.
-     */
-    QString relativeTileFileName( GeoSceneTexture const * const textureLayer, int zoomLevel, int x, int y );
-
-    /**
-     * @brief Get the theme string
-     * @param theme points to the GeoSceneDocument which represents a .dgml file.
-     * @return the old style theme string which used to be the argument for many methods,
-     *         for example "maps/earth/srtm".
-     */
-    QString themeStr( GeoSceneTexture const * const textureLayer );
 }
 
 }
--- trunk/KDE/kdeedu/marble/src/lib/geodata/handlers/dgml/DgmlStorageLayoutTagHandler.cpp #1121480:1121481
@@ -27,6 +27,7 @@
 #include "DgmlElementDictionary.h"
 #include "GeoParser.h"
 #include "GeoSceneTexture.h"
+#include "ServerLayout.h"
 
 namespace Marble
 {
@@ -60,29 +61,29 @@
         maximumTileLevel = maximumTileLevelStr.toInt();
     }
 
+    // Checking for parent item
+    GeoStackItem parentItem = parser.parentElement();
+    if (parentItem.represents(dgmlTag_Texture)) {
+        GeoSceneTexture *texture = parentItem.nodeAs<GeoSceneTexture>();
+
     // Attribute mode
-    GeoSceneTexture::StorageLayoutMode mode = GeoSceneTexture::Marble;
+        GeoSceneTexture::StorageLayout storageLayout = GeoSceneTexture::Other;
+        ServerLayout *serverLayout = 0;
     const QString modeStr = parser.attribute(dgmlAttr_mode).trimmed();
     if ( modeStr == "OpenStreetMap" )
-        mode = GeoSceneTexture::OpenStreetMap;
+            serverLayout = new OsmServerLayout( texture );
     else if ( modeStr == "Custom" )
-        mode = GeoSceneTexture::Custom;
-
-    // custom Layout?
-    QString customLayout;
-    if ( mode == GeoSceneTexture::Custom ) {
-        customLayout = parser.readElementText().trimmed();
+            serverLayout = new CustomServerLayout();
+        else {
+            storageLayout = GeoSceneTexture::Marble;
+            serverLayout = new MarbleServerLayout( texture );
     }
 
-    // Checking for parent item
-    GeoStackItem parentItem = parser.parentElement();
-    if (parentItem.represents(dgmlTag_Texture)) {
-        parentItem.nodeAs<GeoSceneTexture>()->setLevelZeroColumns( levelZeroColumns );
-        parentItem.nodeAs<GeoSceneTexture>()->setLevelZeroRows( levelZeroRows );
-        parentItem.nodeAs<GeoSceneTexture>()->setMaximumTileLevel( maximumTileLevel );
-        parentItem.nodeAs<GeoSceneTexture>()->setStorageLayoutMode( mode );
-	if ( mode == GeoSceneTexture::Custom )
-            parentItem.nodeAs<GeoSceneTexture>()->setCustomStorageLayout( customLayout );
+        texture->setLevelZeroColumns( levelZeroColumns );
+        texture->setLevelZeroRows( levelZeroRows );
+        texture->setMaximumTileLevel( maximumTileLevel );
+        texture->setStorageLayout( storageLayout );
+        texture->setServerLayout( serverLayout );
     }
 
     return 0;
--- trunk/KDE/kdeedu/marble/src/lib/geodata/scene/GeoSceneTexture.cpp #1121480:1121481
@@ -24,6 +24,8 @@
 
 #include "DownloadPolicy.h"
 #include "MarbleDebug.h"
+#include "ServerLayout.h"
+#include "TileId.h"
 
 namespace Marble
 {
@@ -32,8 +34,7 @@
     : GeoSceneAbstractDataset( name ),
       m_sourceDir( "" ),
       m_installMap( "" ),
-      m_storageLayoutMode( Marble ),
-      m_customStorageLayout( "" ),
+      m_serverLayout( new MarbleServerLayout( this ) ),
       m_levelZeroColumns( defaultLevelZeroColumns ),
       m_levelZeroRows( defaultLevelZeroRows ),
       m_maximumTileLevel( -1 ),
@@ -47,6 +48,7 @@
 GeoSceneTexture::~GeoSceneTexture()
 {
     qDeleteAll( m_downloadPolicies );
+    delete m_serverLayout;
 }
 
 QString GeoSceneTexture::sourceDir() const
@@ -69,26 +71,19 @@
     m_installMap = installMap;
 }
 
-GeoSceneTexture::StorageLayoutMode GeoSceneTexture::storageLayoutMode() const
+void GeoSceneTexture::setStorageLayout( const StorageLayout layout )
 {
-    return m_storageLayoutMode;
+    m_storageLayoutMode = layout;
 }
 
-void GeoSceneTexture::setStorageLayoutMode( const StorageLayoutMode mode )
+void GeoSceneTexture::setServerLayout( const ServerLayout *layout )
 {
-    m_storageLayoutMode = mode;
-}
+    if (m_serverLayout != 0)
+        delete m_serverLayout;
 
-QString GeoSceneTexture::customStorageLayout()const
-{
-    return m_customStorageLayout;
+    m_serverLayout = layout;
 }
 
-void GeoSceneTexture::setCustomStorageLayout( const QString& layout )
-{
-    m_customStorageLayout = layout;
-}
-
 int GeoSceneTexture::levelZeroColumns() const
 {
    return m_levelZeroColumns;
@@ -129,17 +124,19 @@
     m_projection = projection;
 }
 
-QUrl GeoSceneTexture::downloadUrl()
+QUrl GeoSceneTexture::downloadUrl( const TileId &id )
 {
     // default download url
     if ( m_downloadUrls.empty() )
-        return QUrl( "http://download.kde.org/apps/marble/" );
+        return m_serverLayout->downloadUrl( QUrl( "http://download.kde.org/apps/marble/" ), id );
 
     if ( m_nextUrl == m_downloadUrls.constEnd() )
         m_nextUrl = m_downloadUrls.constBegin();
 
-    QUrl url = *m_nextUrl;
+    const QUrl url = m_serverLayout->downloadUrl( *m_nextUrl, id );
+
     ++m_nextUrl;
+
     return url;
 }
 
@@ -150,6 +147,39 @@
     m_nextUrl = m_downloadUrls.constBegin();
 }
 
+QString GeoSceneTexture::relativeTileFileName( const TileId &id ) const
+{
+    const QString suffix = fileFormat().toLower();
+
+    QString relFileName;
+
+    switch ( m_storageLayoutMode ) {
+    case GeoSceneTexture::Marble:
+        relFileName = QString( "%1/%2/%3/%3_%4.%5" )
+            .arg( themeStr() )
+            .arg( id.zoomLevel() )
+            .arg( id.y(), tileDigits, 10, QChar('0') )
+            .arg( id.x(), tileDigits, 10, QChar('0') )
+            .arg( suffix );
+        break;
+    case GeoSceneTexture::Other:
+        relFileName = QString( "%1/%2/%3/%4.%5" )
+            .arg( themeStr() )
+            .arg( id.zoomLevel() )
+            .arg( id.x() )
+            .arg( id.y() )
+            .arg( suffix );
+        break;
+    }
+
+    return relFileName;
+}
+
+QString GeoSceneTexture::themeStr() const
+{
+    return "maps/" + sourceDir();
+}
+
 QList<DownloadPolicy *> GeoSceneTexture::downloadPolicies() const
 {
     return m_downloadPolicies;
--- trunk/KDE/kdeedu/marble/src/lib/geodata/scene/GeoSceneTexture.h #1121480:1121481
@@ -35,15 +35,18 @@
  * @short Texture dataset stored in a layer.
  */
 
+class ServerLayout;
+
 namespace Marble
 {
 class Blending;
 class DownloadPolicy;
+class TileId;
 
 class GeoSceneTexture : public GeoSceneAbstractDataset
 {
  public:
-    enum StorageLayoutMode { Marble, OpenStreetMap, Custom };
+    enum StorageLayout { Marble, Other };
     enum Projection { Equirectangular, Mercator };
 
     explicit GeoSceneTexture( const QString& name );
@@ -55,11 +58,9 @@
     QString installMap() const;
     void setInstallMap( const QString& installMap );
 
-    StorageLayoutMode storageLayoutMode() const;
-    void setStorageLayoutMode( StorageLayoutMode const );
+    void setStorageLayout( StorageLayout );
 
-    QString customStorageLayout()const;
-    void setCustomStorageLayout( const QString& );
+    void setServerLayout( const ServerLayout * );
 
     int levelZeroColumns() const;
     void setLevelZeroColumns( const int );
@@ -80,9 +81,13 @@
     // this method is a little more than just a stupid getter,
     // it implements the round robin for the tile servers.
     // on each invocation the next url is returned
-    QUrl downloadUrl();
+    QUrl downloadUrl( const TileId & );
     void addDownloadUrl( const QUrl & );
 
+    QString relativeTileFileName( const TileId & ) const;
+
+    QString themeStr() const;
+
     QList<DownloadPolicy *> downloadPolicies() const;
     void addDownloadPolicy( const DownloadUsage usage, const int maximumConnections );
 
@@ -94,8 +99,8 @@
 
     QString m_sourceDir;
     QString m_installMap;
-    StorageLayoutMode m_storageLayoutMode;
-    QString m_customStorageLayout;
+    StorageLayout m_storageLayoutMode;
+    const ServerLayout *m_serverLayout;
     int m_levelZeroColumns;
     int m_levelZeroRows;
     int m_maximumTileLevel;
--- trunk/KDE/kdeedu/marble/src/tilecreator/CMakeLists.txt #1121480:1121481
@@ -10,6 +10,7 @@
             ../lib/DownloadPolicy.cpp
             ../lib/TileCreator.cpp
             ../lib/TileLoaderHelper.cpp
+            ../lib/ServerLayout.cpp
             ../lib/geodata/parser/GeoDocument.cpp
             ../lib/geodata/scene/GeoSceneTexture.cpp
             ../lib/geodata/scene/GeoSceneLayer.cpp


More information about the Marble-commits mailing list