summaryrefslogtreecommitdiffstats
path: root/sigtools
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2009-03-27 16:53:04 -0400
committerBen Boeckel <MathStuf@gmail.com>2009-03-27 16:53:04 -0400
commitf3123368e4d16e5cfd817a506a23bec335f46447 (patch)
tree3a8fc8895e33e21c55dc0c8da560d364d6f78a82 /sigtools
parent663248cd1e0ea17f5da772d35cc1a851005101fd (diff)
downloadsigen-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.cpp53
-rw-r--r--sigtools/PluginLoader.h5
-rw-r--r--sigtools/PluginLoader_p.h3
-rw-r--r--sigtools/PluginTreeModel.cpp5
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);