/* * Copyright 2009 Ben Boeckel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // Header include #include "PluginLoader.h" #include "PluginLoader_p.h" // Sigencore plugin includes #include #include #include // KDE includes #include #include using namespace Sigscript; using namespace Sigencore; using namespace Sigencore::Plugins; using namespace Sigtools; K_GLOBAL_STATIC(PluginLoader::Private, loader) QStringList PluginLoader::availablePlugins(const QString& type, const bool forceLookup) { if (forceLookup || !loader->m_available.contains(type)) loader->refresh(type); return loader->m_available[type].keys(); } KService::Ptr PluginLoader::service(const QString& type, const QString& name) { return loader->service(type, name); } PluginBase* PluginLoader::plugin(const QString& type, const QString& name) { return loader->factory(type, name); } ArenaPlugin* PluginLoader::pluginForArena(const QString& arena) { return qobject_cast(loader->factory("Arena", arena)); } CanvasPlugin* PluginLoader::pluginForCanvas(const QString& canvas) { return qobject_cast(loader->factory("Canvas", canvas)); } Arena* PluginLoader::loadArena(const QString& name, GameWrapper* game, Config* parent) { ArenaPlugin* plugin = pluginForArena(name); if (plugin) return plugin->getArena(name, game, parent); return NULL; } Canvas* PluginLoader::loadCanvas(const QString& name, GameWrapper* game, Config* parent) { CanvasPlugin* plugin = pluginForCanvas(name); if (plugin) return plugin->getCanvas(name, game, parent); return NULL; } void PluginLoader::Private::refresh(const QString& type) { QList curServices = m_available[type].values(); foreach (const Service& service, curServices) delete service.second; m_available[type].clear(); KService::List services = KServiceTypeTrader::self()->query(QString("Sigen/%1").arg(type), "[X-Sigen-MinVersion] <= 000101"); foreach (KService::Ptr service, services) { KPluginLoader loader(service->library()); KPluginFactory *factory = loader.factory(); if (factory) { PluginBase* plugin = NULL; if (type == "Arena") plugin = factory->create(this); else if (type == "Canvas") plugin = factory->create(this); else KMessageBox::information(NULL, QString("The plugin type \"Sigen/%1\" is not supported.").arg(type), "Unsupported plugin type"); if (plugin) { QStringList classes = plugin->classList(); foreach (const QString& className, classes) m_available[type][className] = Service(service, plugin); } } else KMessageBox::error(NULL, QString("The plugin of type \"Sigen/%1\" with name \"%2\" is not a valid Sigen plugin. The error was:\n%3").arg(type).arg(service->name()).arg(loader.errorString()), "Plugin loading error"); } } KService::Ptr PluginLoader::Private::service(const QString& type, const QString& name) { if (!m_available.contains(type)) refresh(type); if (m_available[type].contains(name)) return m_available[type][name].first; return KService::Ptr(); } PluginBase* PluginLoader::Private::factory(const QString& type, const QString& name) { if (!m_available.contains(type)) refresh(type); if (m_available[type].contains(name)) return m_available[type][name].second; return NULL; }