• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
RoutingRunnerManager.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2008 Henry de Valence <hdevalence@gmail.com>
9 // Copyright 2010 Dennis Nienhüser <earthwings@gentoo.org>
10 // Copyright 2010-2013 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
11 // Copyright 2011 Thibaut Gridel <tgridel@free.fr>
12 
13 #include "RoutingRunnerManager.h"
14 
15 #include "MarblePlacemarkModel.h"
16 #include "MarbleDebug.h"
17 #include "MarbleModel.h"
18 #include "MarbleMath.h"
19 #include "Planet.h"
20 #include "GeoDataDocument.h"
21 #include "GeoDataPlacemark.h"
22 #include "PluginManager.h"
23 #include "RoutingRunnerPlugin.h"
24 #include "RunnerTask.h"
25 #include "routing/RouteRequest.h"
26 #include "routing/RoutingProfilesModel.h"
27 
28 #include <QThreadPool>
29 #include <QTimer>
30 
31 namespace Marble
32 {
33 
34 class MarbleModel;
35 
36 class RoutingRunnerManager::Private
37 {
38 public:
39  Private( RoutingRunnerManager *parent, const MarbleModel *marbleModel );
40 
41  ~Private();
42 
43  template<typename T>
44  QList<T*> plugins( const QList<T*> &plugins ) const;
45 
46  void addRoutingResult( GeoDataDocument *route );
47  void cleanupRoutingTask( RoutingTask *task );
48 
49  RoutingRunnerManager *const q;
50  const MarbleModel *const m_marbleModel;
51  const PluginManager *const m_pluginManager;
52  QList<RoutingTask*> m_routingTasks;
53  QVector<GeoDataDocument*> m_routingResult;
54 };
55 
56 RoutingRunnerManager::Private::Private( RoutingRunnerManager *parent, const MarbleModel *marbleModel ) :
57  q( parent ),
58  m_marbleModel( marbleModel ),
59  m_pluginManager( marbleModel->pluginManager() )
60 {
61  qRegisterMetaType<GeoDataDocument*>( "GeoDataDocument*" );
62 }
63 
64 RoutingRunnerManager::Private::~Private()
65 {
66  // nothing to do
67 }
68 
69 template<typename T>
70 QList<T*> RoutingRunnerManager::Private::plugins( const QList<T*> &plugins ) const
71 {
72  QList<T*> result;
73  foreach( T* plugin, plugins ) {
74  if ( ( m_marbleModel && m_marbleModel->workOffline() && !plugin->canWorkOffline() ) ) {
75  continue;
76  }
77 
78  if ( !plugin->canWork() ) {
79  continue;
80  }
81 
82  if ( m_marbleModel && !plugin->supportsCelestialBody( m_marbleModel->planet()->id() ) )
83  {
84  continue;
85  }
86 
87  result << plugin;
88  }
89 
90  return result;
91 }
92 
93 void RoutingRunnerManager::Private::addRoutingResult( GeoDataDocument *route )
94 {
95  if ( route ) {
96  mDebug() << "route retrieved";
97  m_routingResult.push_back( route );
98  emit q->routeRetrieved( route );
99  }
100 }
101 
102 void RoutingRunnerManager::Private::cleanupRoutingTask( RoutingTask *task )
103 {
104  m_routingTasks.removeAll( task );
105  mDebug() << "removing task" << m_routingTasks.size() << " " << (quintptr)task;
106  if ( m_routingTasks.isEmpty() ) {
107  if ( m_routingResult.isEmpty() ) {
108  emit q->routeRetrieved( 0 );
109  }
110 
111  emit q->routingFinished();
112  }
113 }
114 
115 RoutingRunnerManager::RoutingRunnerManager( const MarbleModel *marbleModel, QObject *parent )
116  : QObject( parent ),
117  d( new Private( this, marbleModel ) )
118 {
119  if ( QThreadPool::globalInstance()->maxThreadCount() < 4 ) {
120  QThreadPool::globalInstance()->setMaxThreadCount( 4 );
121  }
122 }
123 
124 RoutingRunnerManager::~RoutingRunnerManager()
125 {
126  delete d;
127 }
128 
129 void RoutingRunnerManager::retrieveRoute( const RouteRequest *request )
130 {
131  RoutingProfile profile = request->routingProfile();
132 
133  d->m_routingTasks.clear();
134  d->m_routingResult.clear();
135 
136  QList<RoutingRunnerPlugin*> plugins = d->plugins( d->m_pluginManager->routingRunnerPlugins() );
137  foreach( RoutingRunnerPlugin* plugin, plugins ) {
138  if ( !profile.name().isEmpty() && !profile.pluginSettings().contains( plugin->nameId() ) ) {
139  continue;
140  }
141 
142  RoutingTask* task = new RoutingTask( plugin->newRunner(), this, d->m_marbleModel, request );
143  connect( task, SIGNAL(finished(RoutingTask*)), this, SLOT(cleanupRoutingTask(RoutingTask*)) );
144  mDebug() << "route task" << plugin->nameId() << " " << (quintptr)task;
145  d->m_routingTasks << task;
146  }
147 
148  foreach( RoutingTask* task, d->m_routingTasks ) {
149  QThreadPool::globalInstance()->start( task );
150  }
151 
152  if ( d->m_routingTasks.isEmpty() ) {
153  mDebug() << "No suitable routing plugins found, cannot retrieve a route";
154  d->cleanupRoutingTask( 0 );
155  }
156 }
157 
158 QVector<GeoDataDocument*> RoutingRunnerManager::searchRoute( const RouteRequest *request, int timeout ) {
159  QEventLoop localEventLoop;
160  QTimer watchdog;
161  watchdog.setSingleShot(true);
162  connect( &watchdog, SIGNAL(timeout()),
163  &localEventLoop, SLOT(quit()));
164  connect(this, SIGNAL(routingFinished()),
165  &localEventLoop, SLOT(quit()), Qt::QueuedConnection );
166 
167  watchdog.start( timeout );
168  retrieveRoute( request );
169  localEventLoop.exec();
170  return d->m_routingResult;
171 }
172 
173 }
174 
175 #include "RoutingRunnerManager.moc"
GeoDataDocument.h
Marble::RoutingRunnerPlugin::newRunner
virtual RoutingRunner * newRunner() const =0
Plugin factory method to create a new runner instance.
RoutingRunnerManager.h
QEventLoop
MarbleMath.h
RunnerTask.h
Marble::RoutingTask
A RunnerTask that executes a route calculation.
Definition: RunnerTask.h:80
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::RoutingRunnerManager::routingFinished
void routingFinished()
Emitted whenever all runners are finished for the query.
QThreadPool::globalInstance
QThreadPool * globalInstance()
Planet.h
Marble::RoutingProfile
Definition: RoutingProfile.h:24
MarbleDebug.h
Marble::RoutingRunnerManager::Private
friend class Private
Definition: RoutingRunnerManager.h:68
Marble::RouteRequest
Points to be included in a route.
Definition: RouteRequest.h:31
Marble::RouteRequest::routingProfile
RoutingProfile routingProfile() const
Definition: RouteRequest.cpp:321
QTimer
QThreadPool::setMaxThreadCount
void setMaxThreadCount(int maxThreadCount)
RoutingRunnerPlugin.h
QEventLoop::exec
int exec(QFlags< QEventLoop::ProcessEventsFlag > flags)
QObject
QString::isEmpty
bool isEmpty() const
QList
MarblePlacemarkModel.h
Marble::RoutingRunnerManager::~RoutingRunnerManager
~RoutingRunnerManager()
Definition: RoutingRunnerManager.cpp:124
GeoDataPlacemark.h
Marble::PluginInterface::nameId
virtual QString nameId() const =0
Returns the unique name of the plugin.
Marble::RoutingProfile::name
QString name
Definition: RoutingProfile.h:25
Marble::RoutingProfile::pluginSettings
const QHash< QString, QHash< QString, QVariant > > & pluginSettings() const
Definition: RoutingProfile.cpp:33
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:97
QVector
PluginManager.h
Marble::RoutingRunnerPlugin
A plugin for Marble to execute a routing task.
Definition: RoutingRunnerPlugin.h:33
Marble::RoutingRunnerManager::retrieveRoute
void retrieveRoute(const RouteRequest *request)
Download routes traversing the stopover points in the given route request.
Definition: RoutingRunnerManager.cpp:129
QTimer::start
void start(int msec)
RouteRequest.h
QHash::contains
bool contains(const Key &key) const
Marble::RoutingRunnerManager::searchRoute
QVector< GeoDataDocument * > searchRoute(const RouteRequest *request, int timeout=30000)
Definition: RoutingRunnerManager.cpp:158
Marble::RoutingRunnerManager::RoutingRunnerManager
RoutingRunnerManager(const MarbleModel *marbleModel, QObject *parent=0)
Constructor.
Definition: RoutingRunnerManager.cpp:115
QThreadPool::start
void start(QRunnable *runnable, int priority)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
RoutingProfilesModel.h
QTimer::setSingleShot
void setSingleShot(bool singleShot)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal