summaryrefslogtreecommitdiffstats
path: root/sigtools/PluginLoader.cpp
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/PluginLoader.cpp
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/PluginLoader.cpp')
-rw-r--r--sigtools/PluginLoader.cpp53
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();
}