[Marble-commits] KDE/kdeedu/marble

Jens-Michael Hoffmann jensmh at gmx.de
Mon Jan 11 22:06:11 CET 2010


SVN commit 1073244 by jmhoffmann:

In the marble DGML files it is now possible to define download policies
for different groups of hosts (in practice per map theme) and usage types.
Only usage type for now is "Browse" when browsing the map. For the planned
"download region" feature we need however to distinguish between "Browse"
and "Bulk" download as this affects the number of allowing concurrent
connections.

As download policies for openstreetmap.org this patch also adds these policies

    <downloadPolicy usage="Browse" maximumConnections="20" />
    <downloadPolicy usage="Bulk" maximumConnections="2" />

to openstreetmap.dgml.

Key points:
- In MarbleModel::setMapTheme the HttpDownloadManager is made aware of download
  policies. This was the best place I could find.
- HttpDownloadManager checks if a download policy which is about to be added
  is in place already.
- GeoSceneTexture is no longer copiable which apparently does no harm.
- If a parser error occurs within a download policy element it is ignored.
  In such a case the default download policy will be used.
- HttpDownloadManager::addJob has got a DownloadUsage parameter which is not yet
  used also because the default of DownloadBrowse is sufficient for now.



 M  +2 -0      data/maps/earth/openstreetmap/openstreetmap.dgml  
 M  +13 -0     src/lib/DownloadPolicy.h  
 M  +19 -2     src/lib/HttpDownloadManager.cpp  
 M  +4 -1      src/lib/HttpDownloadManager.h  
 M  +28 -1     src/lib/MarbleModel.cpp  
 M  +4 -2      src/lib/MarbleModel.h  
 M  +2 -0      src/lib/geodata/handlers/dgml/DgmlAttributeDictionary.cpp  
 M  +2 -0      src/lib/geodata/handlers/dgml/DgmlAttributeDictionary.h  
 A             src/lib/geodata/handlers/dgml/DgmlDownloadPolicyTagHandler.cpp   [License: LGPL (v2.1+)]
 A             src/lib/geodata/handlers/dgml/DgmlDownloadPolicyTagHandler.h   [License: LGPL (v2.1+)]
 M  +1 -0      src/lib/geodata/handlers/dgml/DgmlElementDictionary.cpp  
 M  +1 -0      src/lib/geodata/handlers/dgml/DgmlElementDictionary.h  
 M  +30 -1     src/lib/geodata/scene/GeoSceneTexture.cpp  
 M  +12 -0     src/lib/geodata/scene/GeoSceneTexture.h  
 M  +1 -0      src/tilecreator/CMakeLists.txt  


--- trunk/KDE/kdeedu/marble/data/maps/earth/openstreetmap/openstreetmap.dgml #1073243:1073244
@@ -29,6 +29,8 @@
                     <downloadUrl protocol="http" host="a.tile.openstreetmap.org" path="/" />
                     <downloadUrl protocol="http" host="b.tile.openstreetmap.org" path="/" />
                     <downloadUrl protocol="http" host="c.tile.openstreetmap.org" path="/" />
+                    <downloadPolicy usage="Browse" maximumConnections="20" />
+                    <downloadPolicy usage="Bulk" maximumConnections="2" />
                 </texture>
             </layer>
             <layer name="standardplaces" backend="geodata">
--- trunk/KDE/kdeedu/marble/src/lib/DownloadPolicy.h #1073243:1073244
@@ -27,6 +27,7 @@
 class DownloadPolicyKey
 {
     friend bool operator<( DownloadPolicyKey const & lhs, DownloadPolicyKey const & rhs );
+    friend bool operator==( DownloadPolicyKey const & lhs, DownloadPolicyKey const & rhs );
 
  public:
     DownloadPolicyKey();
@@ -46,9 +47,16 @@
     DownloadUsage m_usage;
 };
 
+inline bool operator==( const DownloadPolicyKey & lhs, const DownloadPolicyKey & rhs )
+{
+    return lhs.m_hostNames == rhs.m_hostNames && lhs.m_usage == rhs.m_usage;
+}
 
+
 class DownloadPolicy
 {
+    friend bool operator==( const DownloadPolicy & lhs, const DownloadPolicy & rhs );
+
  public:
     DownloadPolicy();
     explicit DownloadPolicy( const DownloadPolicyKey & key );
@@ -63,6 +71,11 @@
     int m_maximumConnections;
 };
 
+inline bool operator==( const DownloadPolicy & lhs, const DownloadPolicy & rhs )
+{
+    return lhs.m_key == rhs.m_key && lhs.m_maximumConnections == rhs.m_maximumConnections;
 }
 
+}
+
 #endif
--- trunk/KDE/kdeedu/marble/src/lib/HttpDownloadManager.cpp #1073243:1073244
@@ -148,6 +148,8 @@
 
 void HttpDownloadManager::addDownloadPolicy( const DownloadPolicy& policy )
 {
+    if ( hasDownloadPolicy( policy ))
+        return;
     DownloadQueueSet * const queueSet = new DownloadQueueSet( policy, this );
     connectQueueSet( queueSet );
     d->m_queueSets.append( QPair<DownloadPolicyKey, DownloadQueueSet *>
@@ -160,15 +162,16 @@
 }
 
 void HttpDownloadManager::addJob( const QUrl& sourceUrl, const QString& destFileName,
-                                  const QString &id )
+                                  const QString &id, const DownloadUsage usage )
 {
     if ( !d->m_downloadEnabled )
         return;
 
-    DownloadQueueSet * const queueSet = d->findQueues( sourceUrl.host(), DownloadBrowse );
+    DownloadQueueSet * const queueSet = d->findQueues( sourceUrl.host(), usage );
     if ( queueSet->canAcceptJob( sourceUrl, destFileName )) {
         HttpJob * const job = d->createJob( sourceUrl, destFileName, id );
         if ( job ) {
+            job->setDownloadUsage( usage );
             queueSet->addJob( job );
         }
     }
@@ -219,4 +222,18 @@
     connect( queueSet, SIGNAL( jobRemoved() ), SIGNAL( jobRemoved() ));
 }
 
+bool HttpDownloadManager::hasDownloadPolicy( const DownloadPolicy& policy ) const
+{
+    bool found = false;
+    QList<QPair<DownloadPolicyKey, DownloadQueueSet*> >::iterator pos = d->m_queueSets.begin();
+    QList<QPair<DownloadPolicyKey, DownloadQueueSet*> >::iterator const end = d->m_queueSets.end();
+    for (; pos != end; ++pos ) {
+        if ( (*pos).second->downloadPolicy() == policy ) {
+            found = true;
+            break;
+        }
+    }
+    return found;
+}
+
 #include "HttpDownloadManager.moc"
--- trunk/KDE/kdeedu/marble/src/lib/HttpDownloadManager.h #1073243:1073244
@@ -20,6 +20,7 @@
 #include <QtCore/QString>
 #include <QtCore/QUrl>
 
+#include "global.h"
 #include "marble_export.h"
 
 class QTimer;
@@ -82,7 +83,8 @@
     /**
      * Adds a new job with a sourceUrl, destination file name and given id.
      */
-    void addJob( const QUrl& sourceUrl, const QString& destFilename, const QString &id );
+    void addJob( const QUrl& sourceUrl, const QString& destFilename, const QString &id,
+                 const DownloadUsage usage = DownloadBrowse );
 
 
  Q_SIGNALS:
@@ -118,6 +120,7 @@
     Q_DISABLE_COPY( HttpDownloadManager )
 
     void connectQueueSet( DownloadQueueSet * );
+    bool hasDownloadPolicy( const DownloadPolicy& policy ) const;
     class Private;
     Private * const d;
 };
--- trunk/KDE/kdeedu/marble/src/lib/MarbleModel.cpp #1073243:1073244
@@ -7,7 +7,7 @@
 //
 // Copyright 2006-2007 Torsten Rahn <tackat at kde.org>
 // Copyright 2007      Inge Wallin  <ingwa at kde.org>
-// Copyright 2008,2009 Jens-Michael Hoffmann <jensmh at gmx.de>
+// Copyright 2008, 2009, 2010 Jens-Michael Hoffmann <jmho at c-xx.com>
 // Copyright 2008-2009      Patrick Spendrin <ps_ml at gmx.de>
 //
 
@@ -304,6 +304,7 @@
                                Projection currentProjection )
 {
     d->m_mapTheme = mapTheme;
+    addDownloadPolicies( d->m_mapTheme );
 
     // Some output to show how to use this stuff ...
     mDebug() << "DGML2 Name       : " << d->m_mapTheme->head()->name(); 
@@ -916,6 +917,32 @@
     }
 }
 
+void MarbleModel::addDownloadPolicies( GeoSceneDocument *mapTheme )
+{
+    if ( !mapTheme )
+        return;
+    if ( !mapTheme->map()->hasTextureLayers() )
+        return;
+
+    // As long as we don't have an Layer Management Class we just lookup 
+    // the name of the layer that has the same name as the theme ID
+    const QString themeId = d->m_mapTheme->head()->theme();
+    GeoSceneLayer * const layer = static_cast<GeoSceneLayer*>( d->m_mapTheme->map()->layer( themeId ));
+    if ( !layer )
+        return;
+
+    GeoSceneTexture * const texture = static_cast<GeoSceneTexture*>( layer->groundDataset() );
+    if ( !texture )
+        return;
+
+    QList<DownloadPolicy *> policies = texture->downloadPolicies();
+    QList<DownloadPolicy *>::const_iterator pos = policies.constBegin();
+    QList<DownloadPolicy *>::const_iterator const end = policies.constEnd();
+    for (; pos != end; ++pos ) {
+        d->m_downloadManager->addDownloadPolicy( **pos );
+    }
 }
 
+}
+
 #include "MarbleModel.moc"
--- trunk/KDE/kdeedu/marble/src/lib/MarbleModel.h #1073243:1073244
@@ -374,9 +374,11 @@
 
  private:
     Q_DISABLE_COPY( MarbleModel )
+    Q_PRIVATE_SLOT( d, void notifyModelChanged() )
+
+    void addDownloadPolicies( GeoSceneDocument *mapTheme );
+
     MarbleModelPrivate  * const d;
-
-    Q_PRIVATE_SLOT( d, void notifyModelChanged() )
 };
 
 }
--- trunk/KDE/kdeedu/marble/src/lib/geodata/handlers/dgml/DgmlAttributeDictionary.cpp #1073243:1073244
@@ -43,6 +43,7 @@
 const char* dgmlAttr_labelColor       = "labelColor";
 const char* dgmlAttr_levelZeroColumns = "levelZeroColumns";
 const char* dgmlAttr_levelZeroRows    = "levelZeroRows";
+const char* dgmlAttr_maximumConnections = "maximumConnections";
 const char* dgmlAttr_mode             = "mode";
 const char* dgmlAttr_name             = "name";
 const char* dgmlAttr_password         = "password";
@@ -55,6 +56,7 @@
 const char* dgmlAttr_style            = "style";
 const char* dgmlAttr_text             = "text";
 const char* dgmlAttr_type             = "type";
+const char* dgmlAttr_usage            = "usage";
 const char* dgmlAttr_user             = "user";
 const char* dgmlAttr_width            = "width";
 }
--- trunk/KDE/kdeedu/marble/src/lib/geodata/handlers/dgml/DgmlAttributeDictionary.h #1073243:1073244
@@ -45,6 +45,7 @@
     extern const char* dgmlAttr_labelColor;
     extern const char* dgmlAttr_levelZeroColumns;
     extern const char* dgmlAttr_levelZeroRows;
+    extern const char* dgmlAttr_maximumConnections;
     extern const char* dgmlAttr_mode;
     extern const char* dgmlAttr_name;
     extern const char* dgmlAttr_password;
@@ -57,6 +58,7 @@
     extern const char* dgmlAttr_style;
     extern const char* dgmlAttr_text;
     extern const char* dgmlAttr_type;
+    extern const char* dgmlAttr_usage;
     extern const char* dgmlAttr_user;
     extern const char* dgmlAttr_width;
 }
--- trunk/KDE/kdeedu/marble/src/lib/geodata/handlers/dgml/DgmlElementDictionary.cpp #1073243:1073244
@@ -40,6 +40,7 @@
 const char* dgmlTag_Dgml = "dgml";
 const char* dgmlTag_Discrete = "discrete";
 const char* dgmlTag_Document = "document";
+const char* dgmlTag_DownloadPolicy = "downloadPolicy";
 const char* dgmlTag_DownloadUrl = "downloadUrl";
 const char* dgmlTag_Filter = "filter";
 const char* dgmlTag_Geodata = "geodata";
--- trunk/KDE/kdeedu/marble/src/lib/geodata/handlers/dgml/DgmlElementDictionary.h #1073243:1073244
@@ -43,6 +43,7 @@
     extern  const char* dgmlTag_Discrete;
     extern  const char* dgmlTag_Dgml;
     extern  const char* dgmlTag_Document;
+    extern  const char* dgmlTag_DownloadPolicy;
     extern  const char* dgmlTag_DownloadUrl;
     extern  const char* dgmlTag_Filter;
     extern  const char* dgmlTag_Geodata;
--- trunk/KDE/kdeedu/marble/src/lib/geodata/scene/GeoSceneTexture.cpp #1073243:1073244
@@ -22,7 +22,8 @@
 
 #include "GeoSceneTexture.h"
 
-#include "global.h"
+#include "DownloadPolicy.h"
+#include "MarbleDebug.h"
 
 namespace Marble
 {
@@ -41,6 +42,11 @@
 {
 }
 
+GeoSceneTexture::~GeoSceneTexture()
+{
+    qDeleteAll( m_downloadPolicies );
+}
+
 QString GeoSceneTexture::sourceDir() const
 {
     return m_sourceDir;
@@ -132,9 +138,32 @@
     m_nextUrl = m_downloadUrls.constBegin();
 }
 
+QList<DownloadPolicy *> GeoSceneTexture::downloadPolicies() const
+{
+    return m_downloadPolicies;
+}
+
+void GeoSceneTexture::addDownloadPolicy( const DownloadUsage usage, const int maximumConnections )
+{
+    DownloadPolicy * const policy = new DownloadPolicy( DownloadPolicyKey( hostNames(), usage ));
+    policy->setMaximumConnections( maximumConnections );
+    m_downloadPolicies.append( policy );
+    mDebug() << "added download policy" << hostNames() << usage << maximumConnections;
+}
+
 QString GeoSceneTexture::type()
 {
     return "texture";
 }
 
+QStringList GeoSceneTexture::hostNames() const
+{
+    QStringList result;
+    QVector<QUrl>::const_iterator pos = m_downloadUrls.constBegin();
+    QVector<QUrl>::const_iterator const end = m_downloadUrls.constEnd();
+    for (; pos != end; ++pos )
+        result.append( (*pos).host() );
+    return result;
 }
+
+}
--- trunk/KDE/kdeedu/marble/src/lib/geodata/scene/GeoSceneTexture.h #1073243:1073244
@@ -23,10 +23,13 @@
 #ifndef GEOSCENETEXTURE_H
 #define GEOSCENETEXTURE_H
 
+#include <QtCore/QList>
+#include <QtCore/QStringList>
 #include <QtCore/QUrl>
 #include <QtCore/QVector>
 
 #include "GeoSceneLayer.h"
+#include "global.h"
 
 /**
  * @short Texture dataset stored in a layer.
@@ -34,6 +37,7 @@
 
 namespace Marble
 {
+class DownloadPolicy;
 
 class GeoSceneTexture : public GeoSceneAbstractDataset
 {
@@ -42,6 +46,7 @@
     enum Projection { Equirectangular, Mercator };
 
     explicit GeoSceneTexture( const QString& name );
+    ~GeoSceneTexture();
 
     QString sourceDir() const;
     void setSourceDir( const QString& sourceDir );
@@ -70,9 +75,15 @@
     QUrl downloadUrl();
     void addDownloadUrl( const QUrl & );
 
+    QList<DownloadPolicy *> downloadPolicies() const;
+    void addDownloadPolicy( const DownloadUsage usage, const int maximumConnections );
+
     virtual QString type();
 
  private:
+    Q_DISABLE_COPY( GeoSceneTexture )
+    QStringList hostNames() const;
+
     QString m_sourceDir;
     QString m_installMap;
     StorageLayoutMode m_storageLayoutMode;
@@ -86,6 +97,7 @@
 
     /// Points to next Url for the round robin algorithm
     QVector<QUrl>::const_iterator m_nextUrl;
+    QList<DownloadPolicy *> m_downloadPolicies;
 };
 
 }
--- trunk/KDE/kdeedu/marble/src/tilecreator/CMakeLists.txt #1073243:1073244
@@ -8,6 +8,7 @@
 include( ${QT_USE_FILE} )
 
 set( tilecreator_SRCS
+            ../lib/DownloadPolicy.cpp
             ../lib/TileCreator.cpp
             ../lib/TileLoaderHelper.cpp
             ../lib/geodata/parser/GeoDocument.cpp


More information about the Marble-commits mailing list