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 | |
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')
-rw-r--r-- | sigtools/PluginLoader.cpp | 53 | ||||
-rw-r--r-- | sigtools/PluginLoader.h | 5 | ||||
-rw-r--r-- | sigtools/PluginLoader_p.h | 3 | ||||
-rw-r--r-- | sigtools/PluginTreeModel.cpp | 5 |
4 files changed, 33 insertions, 33 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(); } diff --git a/sigtools/PluginLoader.h b/sigtools/PluginLoader.h index 31d94b51..83c0d171 100644 --- a/sigtools/PluginLoader.h +++ b/sigtools/PluginLoader.h @@ -57,9 +57,8 @@ namespace PluginLoader SIGTOOLS_EXPORT QStringList availablePlugins(const QString& type, const bool forceLookup = false); SIGTOOLS_EXPORT KService::Ptr service(const QString& type, const QString& name); - SIGTOOLS_EXPORT Sigencore::Plugins::PluginBase* plugin(const QString& type, const QString& name); - SIGTOOLS_EXPORT Sigencore::Plugins::ArenaPlugin* pluginForArena(const QString& arena); - SIGTOOLS_EXPORT Sigencore::Plugins::CanvasPlugin* pluginForCanvas(const QString& canvas); + SIGTOOLS_EXPORT QString description(const QString& type, const QString& name); + SIGTOOLS_EXPORT QIcon icon(const QString& type, const QString& name); SIGTOOLS_EXPORT QSharedPointer<Sigmod::Game> game(const QString& name); SIGTOOLS_EXPORT Sigencore::Arena* loadArena(const QString& arena, Sigscript::GameWrapper* game, Sigscript::Config* parent); diff --git a/sigtools/PluginLoader_p.h b/sigtools/PluginLoader_p.h index baa29871..ec2e9750 100644 --- a/sigtools/PluginLoader_p.h +++ b/sigtools/PluginLoader_p.h @@ -60,10 +60,11 @@ class SIGTOOLS_NO_EXPORT Private : public QObject Sigencore::Plugins::PluginBase* factory(const QString& type, const QString& name); QSharedPointer<Sigmod::Game> game(const QString& name); protected: - void clean(const QString& type); + void clean(const QString& type, const bool errorOnExtra = false); typedef QPair<KService::Ptr, Sigencore::Plugins::PluginBase*> Service; typedef QMap<QString, Service> PluginList; + QMap<QString, QList<Sigencore::Plugins::PluginBase*> > m_plugins; QMap<QString, PluginList> m_available; QMap<QString, QSharedPointer<Sigmod::Game> > m_games; }; diff --git a/sigtools/PluginTreeModel.cpp b/sigtools/PluginTreeModel.cpp index bd4f6bef..4b71cc29 100644 --- a/sigtools/PluginTreeModel.cpp +++ b/sigtools/PluginTreeModel.cpp @@ -63,9 +63,8 @@ void PluginTreeModel::setTypes(const QStringList& types) } else { - PluginBase* plugin = PluginLoader::plugin(type, name); - data.m_description = plugin->description(name); - data.m_icon = plugin->icon(name); + data.m_description = PluginLoader::description(type, name); + data.m_icon = PluginLoader::icon(type, name); } beginInsertRows(QModelIndex(), m_entries.size(), m_entries.size()); m_entries.append(data); |