13#include <QPluginLoader>
20#include <KSharedConfig>
21#include <KConfigGroup>
22#include <KPluginFactory>
28 QJsonObject json = plugin.
metaData().value(
"MetaData").toObject();
29 QVariant version = json.value(
"X-Krita-Version");
30 return version.toString().toInt();
35 QJsonObject json = plugin.
metaData().value(
"MetaData").toObject();
36 return json.value(
"Id").toString();
41 return versionFromPlugin(lhs) < versionFromPlugin(rhs);
46 return idFromPlugin(lhs) == idFromPlugin(rhs);
51 const QString lhsId = idFromPlugin(lhs);
52 const QString rhsId = idFromPlugin(rhs);
53 return lhsId < rhsId ||
54 (lhsId == rhsId && versionCompareLess(rhs, lhs));
80 return pluginLoaderInstance();
86 if (cache &&
d->loadedServiceTypes.contains(serviceType)) {
89 d->loadedServiceTypes << serviceType;
98 std::sort(plugins.begin(), plugins.end(), &sortByIdAndReversedVersion);
99 auto it = plugins.begin();
100 while ((it = std::adjacent_find(it, plugins.end(), &idCompareEqual)) != plugins.end()) {
101 warnPlugins <<
"Skipping duplicated plugin, id:" << idFromPlugin(*it)
102 <<
"version:" << versionFromPlugin(*it) <<
"filename:" << it->fileName();
108 it = std::prev(plugins.erase(std::next(it)));
116 KConfigGroup configGroup(KSharedConfig::openConfig(), config.
group);
119 auto it = plugins.begin();
120 while (it != plugins.end()) {
121 if (blackList.contains(idFromPlugin(*it))) {
122 it = plugins.erase(it);
136 const QString pluginName = idFromPlugin(plugin);
141 KPluginFactory *factory = qobject_cast<KPluginFactory *>(plugin.
instance());
143 object = factory->create<QObject>(owner ? owner :
this, QVariantList());
152 qWarning() <<
"\tLoading plugin" << plugin.
fileName() <<
"failed, " << plugin.
errorString();
161 offers.erase(std::remove_if(offers.begin(),
164 QJsonObject json = plugin.metaData().value(
"MetaData").toObject();
165 Q_FOREACH(const auto &predicate, predicates) {
166 if (json.value(predicate.first).toString() != predicate.second) {
174 auto it = std::max_element(offers.begin(), offers.end(), versionCompareLess);
176 if (it != offers.end()) {
177 KPluginFactory *factory = qobject_cast<KPluginFactory *>(it->instance());
186 return loadSinglePlugin(std::vector<std::pair<QString, QString>>{predicates}, serviceType);
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
PythonPluginManager * instance
static KoJsonTrader * instance()
QList< Plugin > query(const QString &servicetype, const QString &mimetype)
void load(const QString &serviceType, const PluginsConfig &config=PluginsConfig(), QObject *owner=0, bool cache=true)
~KoPluginLoader() override
QStringList loadedServiceTypes
KPluginFactory * loadSinglePlugin(const std::vector< std::pair< QString, QString > > &predicates, const QString &serviceType)
KoPluginLoader()
DO NOT USE! Use instance() instead.
QObject * instance() const
QJsonObject metaData() const
QString errorString() const
const char * blacklist
This contains the variable name for the list of plugins (by library name) that will not be loaded.