PluginEffectLoader doesn't use KPluginTrader any more

Requires that plugins change to new KPlugin json metadata.
icc-effect-5.14.5
Martin Gräßlin 2015-07-07 09:36:15 +02:00
parent b01b03aa84
commit 93ef184356
5 changed files with 47 additions and 35 deletions

View File

@ -1,4 +1,8 @@
{ {
"KPlugin": {
"Id": "fakeeffectplugin",
"ServiceTypes": ["KWin/Effect"]
},
"Type": "Service", "Type": "Service",
"X-KDE-Library": "fakeeffectplugin", "X-KDE-Library": "fakeeffectplugin",
"X-KDE-PluginInfo-EnabledByDefault": true, "X-KDE-PluginInfo-EnabledByDefault": true,

View File

@ -1,4 +1,8 @@
{ {
"KPlugin": {
"Id": "effectversion",
"ServiceTypes": ["KWin/Effect"]
},
"Type": "Service", "Type": "Service",
"X-KDE-Library": "effectversionplugin", "X-KDE-Library": "effectversionplugin",
"X-KDE-PluginInfo-EnabledByDefault": true, "X-KDE-PluginInfo-EnabledByDefault": true,

View File

@ -23,7 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// KDE // KDE
#include <KConfig> #include <KConfig>
#include <KConfigGroup> #include <KConfigGroup>
#include <KPluginTrader> #include <KPluginLoader>
// Qt // Qt
#include <QtTest/QtTest> #include <QtTest/QtTest>
#include <QStringList> #include <QStringList>
@ -286,9 +286,11 @@ void TestPluginEffectLoader::testLoadPluginEffect()
KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig); KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
loader.setConfig(config); loader.setConfig(config);
const auto plugins = KPluginTrader::self()->query(QString(), const auto plugins = KPluginLoader::findPlugins(QString(),
QStringLiteral("KWin/Effect"), [name] (const KPluginMetaData &data) {
QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(name)); return data.pluginId().compare(name, Qt::CaseInsensitive) == 0 && data.serviceTypes().contains(QStringLiteral("KWin/Effect"));
}
);
QCOMPARE(plugins.size(), 1); QCOMPARE(plugins.size(), 1);
qRegisterMetaType<KWin::Effect*>(); qRegisterMetaType<KWin::Effect*>();

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "utils.h" #include "utils.h"
// KDE // KDE
#include <KConfigGroup> #include <KConfigGroup>
#include <KPluginTrader> #include <KPluginLoader>
#include <KPackage/Package> #include <KPackage/Package>
#include <KPackage/PackageLoader> #include <KPackage/PackageLoader>
// Qt // Qt
@ -291,7 +291,7 @@ KPluginMetaData ScriptedEffectLoader::findEffect(const QString &name) const
PluginEffectLoader::PluginEffectLoader(QObject *parent) PluginEffectLoader::PluginEffectLoader(QObject *parent)
: AbstractEffectLoader(parent) : AbstractEffectLoader(parent)
, m_queue(new EffectLoadQueue< PluginEffectLoader, KPluginInfo>(this)) , m_queue(new EffectLoadQueue< PluginEffectLoader, KPluginMetaData>(this))
, m_pluginSubDirectory(QStringLiteral("kwin/effects/plugins/")) , m_pluginSubDirectory(QStringLiteral("kwin/effects/plugins/"))
{ {
} }
@ -302,16 +302,19 @@ PluginEffectLoader::~PluginEffectLoader()
bool PluginEffectLoader::hasEffect(const QString &name) const bool PluginEffectLoader::hasEffect(const QString &name) const
{ {
KPluginInfo info = findEffect(name); const auto info = findEffect(name);
return info.isValid(); return info.isValid();
} }
KPluginInfo PluginEffectLoader::findEffect(const QString &name) const KPluginMetaData PluginEffectLoader::findEffect(const QString &name) const
{ {
const QString constraint = QStringLiteral("[%1] == '%2'").arg(s_nameProperty).arg(name.toLower()); const auto plugins = KPluginLoader::findPlugins(m_pluginSubDirectory,
KPluginInfo::List plugins = KPluginTrader::self()->query(m_pluginSubDirectory, s_serviceType, constraint); [name] (const KPluginMetaData &data) {
return data.pluginId().compare(name, Qt::CaseInsensitive) == 0 && data.serviceTypes().contains(s_serviceType);
}
);
if (plugins.isEmpty()) { if (plugins.isEmpty()) {
return KPluginInfo(); return KPluginMetaData();
} }
return plugins.first(); return plugins.first();
} }
@ -324,19 +327,19 @@ bool PluginEffectLoader::isEffectSupported(const QString &name) const
return false; return false;
} }
EffectPluginFactory *PluginEffectLoader::factory(const KPluginInfo &info) const EffectPluginFactory *PluginEffectLoader::factory(const KPluginMetaData &info) const
{ {
if (!info.isValid()) { if (!info.isValid()) {
return nullptr; return nullptr;
} }
KPluginLoader loader(info.libraryPath()); KPluginLoader loader(info.fileName());
if (loader.pluginVersion() != KWIN_EFFECT_API_VERSION) { if (loader.pluginVersion() != KWIN_EFFECT_API_VERSION) {
qCDebug(KWIN_CORE) << info.pluginName() << " has not matching plugin version, expected " << KWIN_EFFECT_API_VERSION << "got " << loader.pluginVersion(); qCDebug(KWIN_CORE) << info.pluginId() << " has not matching plugin version, expected " << KWIN_EFFECT_API_VERSION << "got " << loader.pluginVersion();
return nullptr; return nullptr;
} }
KPluginFactory *factory = loader.factory(); KPluginFactory *factory = loader.factory();
if (!factory) { if (!factory) {
qCDebug(KWIN_CORE) << "Did not get KPluginFactory for " << info.pluginName(); qCDebug(KWIN_CORE) << "Did not get KPluginFactory for " << info.pluginId();
return nullptr; return nullptr;
} }
return dynamic_cast< EffectPluginFactory* >(factory); return dynamic_cast< EffectPluginFactory* >(factory);
@ -344,30 +347,31 @@ EffectPluginFactory *PluginEffectLoader::factory(const KPluginInfo &info) const
QStringList PluginEffectLoader::listOfKnownEffects() const QStringList PluginEffectLoader::listOfKnownEffects() const
{ {
const KPluginInfo::List plugins = findAllEffects(); const auto plugins = findAllEffects();
QStringList result; QStringList result;
for (const KPluginInfo &plugin : plugins) { for (const auto &plugin : plugins) {
result << plugin.pluginName(); result << plugin.pluginId();
} }
qDebug() << result;
return result; return result;
} }
bool PluginEffectLoader::loadEffect(const QString &name) bool PluginEffectLoader::loadEffect(const QString &name)
{ {
KPluginInfo info = findEffect(name); const auto info = findEffect(name);
if (!info.isValid()) { if (!info.isValid()) {
return false; return false;
} }
return loadEffect(info, LoadEffectFlag::Load); return loadEffect(info, LoadEffectFlag::Load);
} }
bool PluginEffectLoader::loadEffect(const KPluginInfo &info, LoadEffectFlags flags) bool PluginEffectLoader::loadEffect(const KPluginMetaData &info, LoadEffectFlags flags)
{ {
if (!info.isValid()) { if (!info.isValid()) {
qCDebug(KWIN_CORE) << "Plugin info is not valid"; qCDebug(KWIN_CORE) << "Plugin info is not valid";
return false; return false;
} }
const QString name = info.pluginName(); const QString name = info.pluginId();
if (!flags.testFlag(LoadEffectFlag::Load)) { if (!flags.testFlag(LoadEffectFlag::Load)) {
qCDebug(KWIN_CORE) << "Loading flags disable effect: " << name; qCDebug(KWIN_CORE) << "Loading flags disable effect: " << name;
return false; return false;
@ -418,12 +422,12 @@ bool PluginEffectLoader::loadEffect(const KPluginInfo &info, LoadEffectFlags fla
void PluginEffectLoader::queryAndLoadAll() void PluginEffectLoader::queryAndLoadAll()
{ {
// perform querying for the services in a thread // perform querying for the services in a thread
QFutureWatcher<KPluginInfo::List> *watcher = new QFutureWatcher<KPluginInfo::List>(this); QFutureWatcher<QVector<KPluginMetaData>> *watcher = new QFutureWatcher<QVector<KPluginMetaData>>(this);
connect(watcher, &QFutureWatcher<KPluginInfo::List>::finished, this, connect(watcher, &QFutureWatcher<QVector<KPluginMetaData>>::finished, this,
[this, watcher]() { [this, watcher]() {
const KPluginInfo::List effects = watcher->result(); const auto effects = watcher->result();
for (const KPluginInfo &effect : effects) { for (const auto &effect : effects) {
const LoadEffectFlags flags = readConfig(effect.pluginName(), effect.isPluginEnabledByDefault()); const LoadEffectFlags flags = readConfig(effect.pluginId(), effect.isEnabledByDefault());
if (flags.testFlag(LoadEffectFlag::Load)) { if (flags.testFlag(LoadEffectFlag::Load)) {
m_queue->enqueue(qMakePair(effect, flags)); m_queue->enqueue(qMakePair(effect, flags));
} }
@ -434,9 +438,9 @@ void PluginEffectLoader::queryAndLoadAll()
watcher->setFuture(QtConcurrent::run(this, &PluginEffectLoader::findAllEffects)); watcher->setFuture(QtConcurrent::run(this, &PluginEffectLoader::findAllEffects));
} }
KPluginInfo::List PluginEffectLoader::findAllEffects() const QVector<KPluginMetaData> PluginEffectLoader::findAllEffects() const
{ {
return KPluginTrader::self()->query(m_pluginSubDirectory, s_serviceType); return KPluginLoader::findPlugins(m_pluginSubDirectory, [] (const KPluginMetaData &data) { return data.serviceTypes().contains(s_serviceType); });
} }
void PluginEffectLoader::setPluginSubDirectory(const QString &directory) void PluginEffectLoader::setPluginSubDirectory(const QString &directory)

View File

@ -29,8 +29,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QPair> #include <QPair>
#include <QQueue> #include <QQueue>
class KPluginInfo;
namespace KWin namespace KWin
{ {
class Effect; class Effect;
@ -326,16 +324,16 @@ public:
void queryAndLoadAll() override; void queryAndLoadAll() override;
bool loadEffect(const QString &name) override; bool loadEffect(const QString &name) override;
bool loadEffect(const KPluginInfo &info, LoadEffectFlags flags); bool loadEffect(const KPluginMetaData &info, LoadEffectFlags flags);
void setPluginSubDirectory(const QString &directory); void setPluginSubDirectory(const QString &directory);
private: private:
QList<KPluginInfo> findAllEffects() const; QVector<KPluginMetaData> findAllEffects() const;
KPluginInfo findEffect(const QString &name) const; KPluginMetaData findEffect(const QString &name) const;
EffectPluginFactory *factory(const KPluginInfo &info) const; EffectPluginFactory *factory(const KPluginMetaData &info) const;
QStringList m_loadedEffects; QStringList m_loadedEffects;
EffectLoadQueue< PluginEffectLoader, KPluginInfo> *m_queue; EffectLoadQueue< PluginEffectLoader, KPluginMetaData> *m_queue;
QString m_pluginSubDirectory; QString m_pluginSubDirectory;
}; };