20#include "pluginloader_p.h"
22#include <kconfiggroup.h>
26#include <klocalizedstring.h>
27#include <kstandarddirs.h>
28#include <KPluginLoader>
30#include <QtCore/QDebug>
34PluginMetaData::PluginMetaData()
38PluginMetaData::PluginMetaData(
const QString &lib,
const QString &name,
const QString &comment,
const QString &cname)
41 , descriptionLabel(comment)
47PluginLoader *PluginLoader::mSelf = 0;
49PluginLoader::PluginLoader()
54PluginLoader::~PluginLoader()
56 qDeleteAll(mPluginLoaders);
57 mPluginLoaders.clear();
60PluginLoader *PluginLoader::self()
63 mSelf =
new PluginLoader();
69QStringList PluginLoader::names()
const
71 return mPluginInfos.keys();
74QObject *PluginLoader::createForName(
const QString &name)
76 if (!mPluginInfos.contains(name)) {
77 kWarning(5300) <<
"plugin name \"" << name <<
"\" is unknown to the plugin loader." << endl;
81 PluginMetaData &info = mPluginInfos[name];
84 foreach (QObject *plugin, QPluginLoader::staticInstances()) {
85 if (QLatin1String(plugin->metaObject()->className()) == info.className) {
93 KPluginLoader *loader =
new KPluginLoader(info.library);
94 if (loader->fileName().isEmpty()) {
95 kWarning(5300) << loader->errorString();
100 mPluginLoaders.insert(name, loader);
104 QPluginLoader *loader = mPluginLoaders.value(name);
107 QObject *
object = loader->instance();
109 kWarning(5300) <<
"unable to load plugin for plugin name \"" << name <<
"\"." << endl;
110 kWarning(5300) <<
"Error was:\"" << loader->errorString() <<
"\"." << endl;
117PluginMetaData PluginLoader::infoForName(
const QString &name)
const
119 if (!mPluginInfos.contains(name)) {
120 return PluginMetaData();
123 return mPluginInfos.value(name);
126void PluginLoader::scan()
128 const QStringList list = KGlobal::dirs()->findAllResources(
"data", QLatin1String(
"akonadi/plugins/serializer/*.desktop"),
129 KStandardDirs::Recursive | KStandardDirs::NoDuplicates);
130 for (
int i = 0; i < list.count(); ++i) {
131 const QString entry = list.at(i);
133 KConfig config(entry, KConfig::SimpleConfig);
134 if (config.hasGroup(
"Misc") && config.hasGroup(
"Plugin")) {
135 KConfigGroup group(&config,
"Plugin");
137 const QString type = group.readEntry(
"Type").toLower();
138 if (type.isEmpty()) {
139 kWarning(5300) <<
"missing or empty [Plugin]Type value in \"" << entry <<
"\" - skipping" << endl;
146 const QStringList classes = group.readXdgListEntry(
"X-Akonadi-Class");
147 if (classes.isEmpty()) {
148 kWarning(5300) <<
"missing or empty [Plugin]X-Akonadi-Class value in \"" << entry <<
"\" - skipping" << endl;
152 const QString library = group.readEntry(
"X-KDE-Library");
153 if (library.isEmpty()) {
154 kWarning(5300) <<
"missing or empty [Plugin]X-KDE-Library value in \"" << entry <<
"\" - skipping" << endl;
158 KConfigGroup group2(&config,
"Misc");
160 QString name = group2.readEntry(
"Name");
161 if (name.isEmpty()) {
162 kWarning(5300) <<
"missing or empty [Misc]Name value in \"" << entry <<
"\" - inserting default name" << endl;
163 name = i18n(
"Unnamed plugin");
166 QString comment = group2.readEntry(
"Comment");
167 if (comment.isEmpty()) {
168 kWarning(5300) <<
"missing or empty [Misc]Comment value in \"" << entry <<
"\" - inserting default name" << endl;
169 comment = i18n(
"No description available");
172 QString cname = group.readEntry(
"X-KDE-ClassName");
173 if (cname.isEmpty()) {
174 kWarning(5300) <<
"missing or empty X-KDE-ClassName value in \"" << entry <<
"\"" << endl;
177 const QStringList mimeTypes = type.split(QLatin1Char(
','), QString::SkipEmptyParts);
179 kDebug(5300) <<
"registering Desktop file" << entry <<
"for" << mimeTypes <<
'@' << classes;
180 Q_FOREACH (
const QString &mimeType, mimeTypes) {
181 Q_FOREACH (
const QString &classType, classes) {
182 mPluginInfos.insert(mimeType + QLatin1Char(
'@') + classType, PluginMetaData(library, name, comment, cname));
187 kWarning(5300) <<
"Desktop file \"" << entry <<
"\" doesn't seem to describe a plugin " <<
"(misses Misc and/or Plugin group)" << endl;
FreeBusyManager::Singleton.