[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdeedu/marble/src/lib
From: Dennis Nienhüser <earthwings () gentoo ! org>
Date: 2010-09-30 21:43:01
Message-ID: 20100930214301.C8C8DAC891 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1181394 by nienhueser:
Store the original pluginloader to be able to unload plugins correctly before \
termination of Marble. Simply deleting the loaded instances is not safe since the \
same instance may be shared by other MarbleWidgets. Currently runner plugins are \
unloaded, other plugin types tbd.
M +37 -23 PluginManager.cpp
--- trunk/KDE/kdeedu/marble/src/lib/PluginManager.cpp #1181393:1181394
@@ -38,15 +38,28 @@
{
}
+ ~PluginManagerPrivate();
+
void loadPlugins();
bool m_pluginsLoaded;
- QList<RenderPlugin *> m_renderPluginTemplates;
- QList<NetworkPlugin *> m_networkPluginTemplates;
- QList<PositionProviderPlugin *> m_positionProviderPluginTemplates;
- QList<RunnerPlugin *> m_runnerPlugins;
+ QMap<QPluginLoader*, RenderPlugin *> m_renderPluginTemplates;
+ QMap<QPluginLoader*, NetworkPlugin *> m_networkPluginTemplates;
+ QMap<QPluginLoader*, PositionProviderPlugin *> \
m_positionProviderPluginTemplates; + QMap<QPluginLoader*, RunnerPlugin *> \
m_runnerPlugins; };
+PluginManagerPrivate::~PluginManagerPrivate()
+{
+ QMap<QPluginLoader*, RunnerPlugin *>::const_iterator i = \
m_runnerPlugins.constBegin(); + for ( ; i != m_runnerPlugins.constEnd(); ++i ) {
+ i.key()->unload();
+ delete i.key();
+ }
+
+ /** @todo: unload other plugin types as well */
+}
+
PluginManager::PluginManager( QObject *parent )
: QObject(parent),
d( new PluginManagerPrivate() )
@@ -72,8 +85,8 @@
d->loadPlugins();
- QList<RenderPlugin *>::const_iterator i = \
d->m_renderPluginTemplates.constBegin();
- QList<RenderPlugin *>::const_iterator const end = \
d->m_renderPluginTemplates.constEnd(); + QMap<QPluginLoader*, RenderPlugin \
*>::const_iterator i = d->m_renderPluginTemplates.constBegin(); + \
QMap<QPluginLoader*, RenderPlugin *>::const_iterator const end = \
d->m_renderPluginTemplates.constEnd(); for (; i != end; ++i) {
AbstractFloatItem * const floatItem = qobject_cast<AbstractFloatItem *>(*i);
if ( floatItem ) {
@@ -91,8 +104,8 @@
d->loadPlugins();
- QList<RenderPlugin *>::const_iterator i = \
d->m_renderPluginTemplates.constBegin();
- QList<RenderPlugin *>::const_iterator const end = \
d->m_renderPluginTemplates.constEnd(); + QMap<QPluginLoader*, RenderPlugin \
*>::const_iterator i = d->m_renderPluginTemplates.constBegin(); + \
QMap<QPluginLoader*, RenderPlugin *>::const_iterator const end = \
d->m_renderPluginTemplates.constEnd(); for (; i != end; ++i) {
result.append( (*i)->pluginInstance() );
}
@@ -105,8 +118,8 @@
d->loadPlugins();
- QList<NetworkPlugin *>::const_iterator pos = \
d->m_networkPluginTemplates.constBegin();
- QList<NetworkPlugin *>::const_iterator const end = \
d->m_networkPluginTemplates.constEnd(); + QMap<QPluginLoader*, NetworkPlugin \
*>::const_iterator pos = d->m_networkPluginTemplates.constBegin(); + \
QMap<QPluginLoader*, NetworkPlugin *>::const_iterator const end = \
d->m_networkPluginTemplates.constEnd(); for (; pos != end; ++pos ) {
result.append( (*pos)->newInstance() );
}
@@ -119,8 +132,8 @@
d->loadPlugins();
- QList<PositionProviderPlugin *>::const_iterator pos = \
d->m_positionProviderPluginTemplates.constBegin();
- QList<PositionProviderPlugin *>::const_iterator const end = \
d->m_positionProviderPluginTemplates.constEnd(); + QMap<QPluginLoader*, \
PositionProviderPlugin *>::const_iterator pos = \
d->m_positionProviderPluginTemplates.constBegin(); + QMap<QPluginLoader*, \
PositionProviderPlugin *>::const_iterator const end = \
d->m_positionProviderPluginTemplates.constEnd(); for (; pos != end; ++pos ) {
result.append( (*pos)->newInstance() );
}
@@ -130,20 +143,20 @@
QList<RunnerPlugin *> PluginManager::runnerPlugins() const
{
d->loadPlugins();
- return d->m_runnerPlugins;
+ return d->m_runnerPlugins.values();
}
/** Append obj to the given plugins list if it inherits both T and U */
template<class T, class U>
-bool appendPlugin( QObject * obj, const QString &fileName, QList<T*> &plugins )
+bool appendPlugin( QObject * obj, QPluginLoader* &loader, QMap<QPluginLoader*,T*> \
&plugins ) {
if ( qobject_cast<T*>( obj ) && qobject_cast<U*>( obj ) ) {
Q_ASSERT( obj->metaObject()->superClass() ); // all our plugins have a super \
class mDebug() << obj->metaObject()->superClass()->className()
- << "plugin loaded from" << MarbleDirs::pluginPath( fileName );
+ << "plugin loaded from" << loader->fileName();
T* plugin = qobject_cast<T*>( obj );
Q_ASSERT( plugin ); // checked above
- plugins.append( plugin );
+ plugins[loader] = plugin;
return true;
}
@@ -178,26 +191,27 @@
foreach( const QString &fileName, pluginFileNameList ) {
// mDebug() << fileName << " - " << MarbleDirs::pluginPath( fileName );
- QPluginLoader loader( MarbleDirs::pluginPath( fileName ) );
+ QString const path = MarbleDirs::pluginPath( fileName );
+ QPluginLoader* loader = new QPluginLoader( path );
- QObject * obj = loader.instance();
+ QObject * obj = loader->instance();
if ( obj ) {
bool isPlugin = appendPlugin<RenderPlugin, RenderPluginInterface>
- ( obj, fileName, m_renderPluginTemplates );
+ ( obj, loader, m_renderPluginTemplates );
isPlugin = isPlugin || appendPlugin<NetworkPlugin, \
NetworkPluginInterface>
- ( obj, fileName, m_networkPluginTemplates );
+ ( obj, loader, m_networkPluginTemplates );
isPlugin = isPlugin || appendPlugin<PositionProviderPlugin, \
PositionProviderPluginInterface>
- ( obj, fileName, m_positionProviderPluginTemplates );
+ ( obj, loader, m_positionProviderPluginTemplates );
isPlugin = isPlugin || appendPlugin<RunnerPlugin, RunnerPlugin>
- ( obj, fileName, m_runnerPlugins ); // intentionally T==U
+ ( obj, loader, m_runnerPlugins ); // intentionally T==U
if ( !isPlugin ) {
mDebug() << "Plugin failure:" << fileName << "is a plugin, but it \
does not implement the "
<< "right interfaces or it was compiled against an old \
version of Marble. Ignoring it."; }
} else {
mDebug() << "Plugin failure:" << fileName << "is not a valid Marble \
Plugin:"
- << loader.errorString();
+ << loader->errorString();
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic