• 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
PluginManager.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 Torsten Rahn <tackat@kde.org>
9 // Copyright 2009 Jens-Michael Hoffmann <jensmh@gmx.de>
10 //
11 
12 
13 // Own
14 #include "PluginManager.h"
15 
16 // Qt
17 #include <QList>
18 #include <QPluginLoader>
19 #include <QTime>
20 
21 // Local dir
22 #include "MarbleDirs.h"
23 #include "MarbleDebug.h"
24 #include "RenderPlugin.h"
25 #include "PositionProviderPlugin.h"
26 #include "AbstractFloatItem.h"
27 #include "ParseRunnerPlugin.h"
28 #include "ReverseGeocodingRunnerPlugin.h"
29 #include "RoutingRunnerPlugin.h"
30 #include "SearchRunnerPlugin.h"
31 
32 namespace Marble
33 {
34 
35 class PluginManagerPrivate
36 {
37  public:
38  PluginManagerPrivate()
39  : m_pluginsLoaded(false)
40  {
41  }
42 
43  ~PluginManagerPrivate();
44 
45  void loadPlugins();
46 
47  bool m_pluginsLoaded;
48  QList<const RenderPlugin *> m_renderPluginTemplates;
49  QList<const PositionProviderPlugin *> m_positionProviderPluginTemplates;
50  QList<const SearchRunnerPlugin *> m_searchRunnerPlugins;
51  QList<const ReverseGeocodingRunnerPlugin *> m_reverseGeocodingRunnerPlugins;
52  QList<RoutingRunnerPlugin *> m_routingRunnerPlugins;
53  QList<const ParseRunnerPlugin *> m_parsingRunnerPlugins;
54 };
55 
56 PluginManagerPrivate::~PluginManagerPrivate()
57 {
58  // nothing to do
59 }
60 
61 PluginManager::PluginManager( QObject *parent ) : QObject( parent ),
62  d( new PluginManagerPrivate() )
63 {
64 }
65 
66 PluginManager::~PluginManager()
67 {
68  delete d;
69 }
70 
71 QList<const RenderPlugin *> PluginManager::renderPlugins() const
72 {
73  d->loadPlugins();
74  return d->m_renderPluginTemplates;
75 }
76 
77 void PluginManager::addRenderPlugin( const RenderPlugin *plugin )
78 {
79  d->loadPlugins();
80  d->m_renderPluginTemplates << plugin;
81  emit renderPluginsChanged();
82 }
83 
84 QList<const PositionProviderPlugin *> PluginManager::positionProviderPlugins() const
85 {
86  d->loadPlugins();
87  return d->m_positionProviderPluginTemplates;
88 }
89 
90 void PluginManager::addPositionProviderPlugin( const PositionProviderPlugin *plugin )
91 {
92  d->loadPlugins();
93  d->m_positionProviderPluginTemplates << plugin;
94  emit positionProviderPluginsChanged();
95 }
96 
97 QList<const SearchRunnerPlugin *> PluginManager::searchRunnerPlugins() const
98 {
99  d->loadPlugins();
100  return d->m_searchRunnerPlugins;
101 }
102 
103 void PluginManager::addSearchRunnerPlugin( const SearchRunnerPlugin *plugin )
104 {
105  d->loadPlugins();
106  d->m_searchRunnerPlugins << plugin;
107  emit searchRunnerPluginsChanged();
108 }
109 
110 QList<const ReverseGeocodingRunnerPlugin *> PluginManager::reverseGeocodingRunnerPlugins() const
111 {
112  d->loadPlugins();
113  return d->m_reverseGeocodingRunnerPlugins;
114 }
115 
116 void PluginManager::addReverseGeocodingRunnerPlugin( const ReverseGeocodingRunnerPlugin *plugin )
117 {
118  d->loadPlugins();
119  d->m_reverseGeocodingRunnerPlugins << plugin;
120  emit reverseGeocodingRunnerPluginsChanged();
121 }
122 
123 QList<RoutingRunnerPlugin *> PluginManager::routingRunnerPlugins() const
124 {
125  d->loadPlugins();
126  return d->m_routingRunnerPlugins;
127 }
128 
129 void PluginManager::addRoutingRunnerPlugin( RoutingRunnerPlugin *plugin )
130 {
131  d->loadPlugins();
132  d->m_routingRunnerPlugins << plugin;
133  emit routingRunnerPluginsChanged();
134 }
135 
136 QList<const ParseRunnerPlugin *> PluginManager::parsingRunnerPlugins() const
137 {
138  d->loadPlugins();
139  return d->m_parsingRunnerPlugins;
140 }
141 
142 void PluginManager::addParseRunnerPlugin( const ParseRunnerPlugin *plugin )
143 {
144  d->loadPlugins();
145  d->m_parsingRunnerPlugins << plugin;
146  emit parseRunnerPluginsChanged();
147 }
148 
150 template<class T, class U>
151 bool appendPlugin( QObject * obj, QPluginLoader* &loader, QList<T*> &plugins )
152 {
153  if ( qobject_cast<T*>( obj ) && qobject_cast<U*>( obj ) ) {
154  Q_ASSERT( obj->metaObject()->superClass() ); // all our plugins have a super class
155  mDebug() << obj->metaObject()->superClass()->className()
156  << "plugin loaded from" << loader->fileName();
157  T* plugin = qobject_cast<T*>( obj );
158  Q_ASSERT( plugin ); // checked above
159  plugins << plugin;
160  return true;
161  }
162 
163  return false;
164 }
165 
167 template<class T, class U>
168 bool appendPlugin( QObject * obj, QPluginLoader* &loader, QList<const T*> &plugins )
169 {
170  if ( qobject_cast<T*>( obj ) && qobject_cast<U*>( obj ) ) {
171  Q_ASSERT( obj->metaObject()->superClass() ); // all our plugins have a super class
172  mDebug() << obj->metaObject()->superClass()->className()
173  << "plugin loaded from" << loader->fileName();
174  T* plugin = qobject_cast<T*>( obj );
175  Q_ASSERT( plugin ); // checked above
176  plugins << plugin;
177  return true;
178  }
179 
180  return false;
181 }
182 
183 void PluginManagerPrivate::loadPlugins()
184 {
185  if (m_pluginsLoaded)
186  {
187  return;
188  }
189 
190  QTime t;
191  t.start();
192  mDebug() << "Starting to load Plugins.";
193 
194  QStringList pluginFileNameList = MarbleDirs::pluginEntryList( "", QDir::Files );
195 
196  MarbleDirs::debug();
197 
198  Q_ASSERT( m_renderPluginTemplates.isEmpty() );
199  Q_ASSERT( m_positionProviderPluginTemplates.isEmpty() );
200  Q_ASSERT( m_searchRunnerPlugins.isEmpty() );
201  Q_ASSERT( m_reverseGeocodingRunnerPlugins.isEmpty() );
202  Q_ASSERT( m_routingRunnerPlugins.isEmpty() );
203  Q_ASSERT( m_parsingRunnerPlugins.isEmpty() );
204 
205  foreach( const QString &fileName, pluginFileNameList ) {
206  // mDebug() << fileName << " - " << MarbleDirs::pluginPath( fileName );
207  QString const path = MarbleDirs::pluginPath( fileName );
208  QPluginLoader* loader = new QPluginLoader( path );
209 
210  QObject * obj = loader->instance();
211 
212  if ( obj ) {
213  bool isPlugin = appendPlugin<RenderPlugin, RenderPluginInterface>
214  ( obj, loader, m_renderPluginTemplates );
215  isPlugin = isPlugin || appendPlugin<PositionProviderPlugin, PositionProviderPluginInterface>
216  ( obj, loader, m_positionProviderPluginTemplates );
217  isPlugin = isPlugin || appendPlugin<SearchRunnerPlugin, SearchRunnerPlugin>
218  ( obj, loader, m_searchRunnerPlugins ); // intentionally T==U
219  isPlugin = isPlugin || appendPlugin<ReverseGeocodingRunnerPlugin, ReverseGeocodingRunnerPlugin>
220  ( obj, loader, m_reverseGeocodingRunnerPlugins ); // intentionally T==U
221  isPlugin = isPlugin || appendPlugin<RoutingRunnerPlugin, RoutingRunnerPlugin>
222  ( obj, loader, m_routingRunnerPlugins ); // intentionally T==U
223  isPlugin = isPlugin || appendPlugin<ParseRunnerPlugin, ParseRunnerPlugin>
224  ( obj, loader, m_parsingRunnerPlugins ); // intentionally T==U
225  if ( !isPlugin ) {
226  qWarning() << "Ignoring the following plugin since it couldn't be loaded:" << path;
227  mDebug() << "Plugin failure:" << path << "is a plugin, but it does not implement the "
228  << "right interfaces or it was compiled against an old version of Marble. Ignoring it.";
229  delete loader;
230  }
231  } else {
232  qWarning() << "Ignoring to load the following file since it doesn't look like a valid Marble plugin:" << path << endl
233  << "Reason:" << loader->errorString();
234  delete loader;
235  }
236  }
237 
238  m_pluginsLoaded = true;
239 
240  mDebug() << Q_FUNC_INFO << "Time elapsed:" << t.elapsed() << "ms";
241 }
242 
243 }
244 
245 #include "PluginManager.moc"
Marble::PluginManager::PluginManager
PluginManager(QObject *parent=0)
Definition: PluginManager.cpp:61
Marble::PluginManager::addPositionProviderPlugin
void addPositionProviderPlugin(const PositionProviderPlugin *plugin)
Add a PositionProviderPlugin manually to the list of known plugins.
Definition: PluginManager.cpp:90
SearchRunnerPlugin.h
Marble::MarbleDirs::pluginPath
static QString pluginPath(const QString &relativePath)
Definition: MarbleDirs.cpp:73
Marble::PluginManager::parseRunnerPluginsChanged
void parseRunnerPluginsChanged()
PositionProviderPlugin.h
Marble::PluginManager::renderPlugins
QList< const RenderPlugin * > renderPlugins() const
Returns all available RenderPlugins.
Definition: PluginManager.cpp:71
QMetaObject::superClass
const QMetaObject * superClass() const
Marble::PluginManager::positionProviderPlugins
QList< const PositionProviderPlugin * > positionProviderPlugins() const
Returns all available PositionProviderPlugins.
Definition: PluginManager.cpp:84
Marble::PluginManager::addRoutingRunnerPlugin
void addRoutingRunnerPlugin(RoutingRunnerPlugin *plugin)
Add a RoutingRunnerPlugin manually to the list of known plugins.
Definition: PluginManager.cpp:129
AbstractFloatItem.h
Marble::PluginManager::reverseGeocodingRunnerPlugins
QList< const ReverseGeocodingRunnerPlugin * > reverseGeocodingRunnerPlugins() const
Returns all reverse geocoding runner plugins.
Definition: PluginManager.cpp:110
Marble::PluginManager::reverseGeocodingRunnerPluginsChanged
void reverseGeocodingRunnerPluginsChanged()
QObject::metaObject
virtual const QMetaObject * metaObject() const
QPluginLoader::fileName
fileName
QTime
MarbleDebug.h
Marble::PluginManager::routingRunnerPlugins
QList< RoutingRunnerPlugin * > routingRunnerPlugins() const
Returns all routing runner plugins.
Definition: PluginManager.cpp:123
Marble::PluginManager::addParseRunnerPlugin
void addParseRunnerPlugin(const ParseRunnerPlugin *plugin)
Add a ParseRunnerPlugin manually to the list of known plugins.
Definition: PluginManager.cpp:142
Marble::PositionProviderPlugin
The abstract class that provides position information.
Definition: PositionProviderPlugin.h:26
QTime::elapsed
int elapsed() const
Marble::PluginManager::routingRunnerPluginsChanged
void routingRunnerPluginsChanged()
RoutingRunnerPlugin.h
Marble::ReverseGeocodingRunnerPlugin
A plugin for Marble to execute a reverse geocoding task.
Definition: ReverseGeocodingRunnerPlugin.h:27
QObject
MarbleDirs.h
QPluginLoader::instance
QObject * instance()
Marble::PluginManager::parsingRunnerPlugins
QList< const ParseRunnerPlugin * > parsingRunnerPlugins() const
Returns all parse runner plugins.
Definition: PluginManager.cpp:136
Marble::SearchRunnerPlugin
A plugin for Marble to execute a placemark search.
Definition: SearchRunnerPlugin.h:25
QString
QList
Marble::PluginManager::positionProviderPluginsChanged
void positionProviderPluginsChanged()
QStringList
ParseRunnerPlugin.h
Marble::MarbleDirs::debug
static void debug()
Definition: MarbleDirs.cpp:330
QMetaObject::className
const char * className() const
Marble::ParseRunnerPlugin
A plugin for Marble to execute a parsing task.
Definition: ParseRunnerPlugin.h:27
Marble::PluginManager::~PluginManager
~PluginManager()
Definition: PluginManager.cpp:66
Marble::MarbleDirs::pluginEntryList
static QStringList pluginEntryList(const QString &relativePath, QDir::Filters filters=QDir::NoFilter)
Definition: MarbleDirs.cpp:106
RenderPlugin.h
PluginManager.h
Marble::RoutingRunnerPlugin
A plugin for Marble to execute a routing task.
Definition: RoutingRunnerPlugin.h:33
Marble::PluginManager::searchRunnerPluginsChanged
void searchRunnerPluginsChanged()
Marble::PluginManager::searchRunnerPlugins
QList< const SearchRunnerPlugin * > searchRunnerPlugins() const
Returns all search runner plugins.
Definition: PluginManager.cpp:97
Marble::PluginManager::addReverseGeocodingRunnerPlugin
void addReverseGeocodingRunnerPlugin(const ReverseGeocodingRunnerPlugin *plugin)
Add a ReverseGeocodingRunnerPlugin manually to the list of known plugins.
Definition: PluginManager.cpp:116
Marble::PluginManager::addRenderPlugin
void addRenderPlugin(const RenderPlugin *plugin)
Add a RenderPlugin manually to the list of known plugins.
Definition: PluginManager.cpp:77
Marble::appendPlugin
bool appendPlugin(QObject *obj, QPluginLoader *&loader, QList< T * > &plugins)
Append obj to the given plugins list if it inherits both T and U.
Definition: PluginManager.cpp:151
Marble::PluginManager::renderPluginsChanged
void renderPluginsChanged()
QTime::start
void start()
Marble::PluginManager::addSearchRunnerPlugin
void addSearchRunnerPlugin(const SearchRunnerPlugin *plugin)
Add a SearchRunnerPlugin manually to the list of known plugins.
Definition: PluginManager.cpp:103
QPluginLoader
ReverseGeocodingRunnerPlugin.h
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
Marble::RenderPlugin
The abstract class that creates a renderable item.
Definition: RenderPlugin.h:43
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