diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2009-03-27 16:53:04 -0400 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2009-03-27 16:53:04 -0400 |
| commit | f3123368e4d16e5cfd817a506a23bec335f46447 (patch) | |
| tree | 3a8fc8895e33e21c55dc0c8da560d364d6f78a82 /sigtools/PluginLoader.cpp | |
| parent | 663248cd1e0ea17f5da772d35cc1a851005101fd (diff) | |
| download | sigen-f3123368e4d16e5cfd817a506a23bec335f46447.tar.gz sigen-f3123368e4d16e5cfd817a506a23bec335f46447.tar.xz sigen-f3123368e4d16e5cfd817a506a23bec335f46447.zip | |
Don't hand out pointers to the plugin factories
Diffstat (limited to 'sigtools/PluginLoader.cpp')
| -rw-r--r-- | sigtools/PluginLoader.cpp | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/sigtools/PluginLoader.cpp b/sigtools/PluginLoader.cpp index 7bdd927b..35e23be2 100644 --- a/sigtools/PluginLoader.cpp +++ b/sigtools/PluginLoader.cpp @@ -33,6 +33,7 @@ #include <KStandardDirs> // Qt includes +#include <QtCore/QtDebug> #include <QtCore/QFile> using namespace Sigmod; @@ -55,19 +56,20 @@ KService::Ptr PluginLoader::service(const QString& type, const QString& name) return loader->service(type, name); } -PluginBase* PluginLoader::plugin(const QString& type, const QString& name) +QString PluginLoader::description(const QString& type, const QString& name) { - return loader->factory(type, name); -} - -ArenaPlugin* PluginLoader::pluginForArena(const QString& arena) -{ - return qobject_cast<ArenaPlugin*>(loader->factory("Arena", arena)); + PluginBase* plugin = loader->factory(type, name); + if (plugin) + return plugin->description(name); + return QString(); } -CanvasPlugin* PluginLoader::pluginForCanvas(const QString& canvas) +QIcon PluginLoader::icon(const QString& type, const QString& name) { - return qobject_cast<CanvasPlugin*>(loader->factory("Canvas", canvas)); + PluginBase* plugin = loader->factory(type, name); + if (plugin) + return plugin->icon(name); + return QIcon(); } QSharedPointer<Game> PluginLoader::game(const QString& name) @@ -77,7 +79,7 @@ QSharedPointer<Game> PluginLoader::game(const QString& name) Arena* PluginLoader::loadArena(const QString& name, GameWrapper* game, Config* parent) { - ArenaPlugin* plugin = pluginForArena(name); + ArenaPlugin* plugin = qobject_cast<ArenaPlugin*>(loader->factory("Arena", name)); if (plugin) return plugin->getArena(name, game, parent); return NULL; @@ -85,7 +87,7 @@ Arena* PluginLoader::loadArena(const QString& name, GameWrapper* game, Config* p Canvas* PluginLoader::loadCanvas(const QString& name, GameWrapper* game, Config* parent) { - CanvasPlugin* plugin = pluginForCanvas(name); + CanvasPlugin* plugin = qobject_cast<CanvasPlugin*>(loader->factory("Canvas", name)); if (plugin) return plugin->getCanvas(name, game, parent); return NULL; @@ -99,20 +101,18 @@ PluginLoader::Private::Private() PluginLoader::Private::~Private() { - QStringList types = m_available.keys(); + QStringList types = m_plugins.keys(); foreach (const QString& type, types) - clean(type); + clean(type, true); } void PluginLoader::Private::refresh(const QString& type) { - QList<Service> curServices = m_available[type].values(); - foreach (const Service& service, curServices) - delete service.second; - m_available[type].clear(); if (type == "Sigmod") m_games.clear(); // TODO: Progress dialog? + m_available[type].clear(); + clean(type); KService::List services = KServiceTypeTrader::self()->query(QString("Sigen/%1").arg(type), "[X-Sigen-MinVersion] <= 000101"); foreach (KService::Ptr service, services) { @@ -172,6 +172,7 @@ void PluginLoader::Private::refresh(const QString& type) KMessageBox::information(NULL, QString("The plugin type \"Sigen/%1\" is not supported.").arg(type), "Unsupported plugin type"); if (plugin) { + m_plugins[type].append(plugin); QStringList classes = plugin->classList(); foreach (const QString& className, classes) m_available[type][className] = Service(service, plugin); @@ -219,18 +220,18 @@ QSharedPointer<Game> PluginLoader::Private::game(const QString& name) return QSharedPointer<Game>(); } -void PluginLoader::Private::clean(const QString& type) +void PluginLoader::Private::clean(const QString& type, const bool errorOnExtra) { - // TODO fix this - QStringList curServices = m_available[type].keys(); - foreach (const QString& service, curServices) + QMutableListIterator<PluginBase*> i(m_plugins[type]); + while (i.hasNext()) { - if (m_available[type][service].second && !m_available[type][service].second->classesUsedCount()) + i.next(); + if (!i.value()->classesUsedCount()) { - delete m_available[type][service].second; - m_available[type].remove(service); + delete i.value(); + i.remove(); } + else if (errorOnExtra) + qCritical() << "There are still" << i.value()->classesUsedCount() << "classes in use by a plugin of type" << type; } - if (type == "Sigmod") - m_games.clear(); } |
