Messagelib

plugineditormanager.cpp
1/*
2 SPDX-FileCopyrightText: 2015-2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "plugineditormanager.h"
8#include "messagecomposer_debug.h"
9#include "plugineditor.h"
10#include <KPluginFactory>
11#include <KPluginMetaData>
12#include <QFileInfo>
13using namespace MessageComposer;
14
15class PluginEditorInfo
16{
17public:
18 PluginEditorInfo() = default;
19
20 KPluginMetaData data;
21 PimCommon::PluginUtilData pluginData;
22 QString metaDataFileNameBaseName;
23 QString metaDataFileName;
24 PluginEditor *plugin = nullptr;
25 int order = 0;
26 bool isEnabled = true;
27};
28
29namespace
30{
31QString pluginEditorVersion()
32{
33 return QStringLiteral("1.0");
34}
35}
36
37class MessageComposer::PluginEditorManagerPrivate
38{
39public:
40 PluginEditorManagerPrivate(PluginEditorManager *qq)
41 : q(qq)
42 {
43 initializePlugins();
44 }
45
46 void loadPlugin(PluginEditorInfo *item);
47 [[nodiscard]] QList<PluginEditor *> pluginsList() const;
48 [[nodiscard]] QList<PimCommon::PluginUtilData> pluginDataList() const;
49 void initializePlugins();
50
51 [[nodiscard]] QString configGroupName() const;
52 [[nodiscard]] QString configPrefixSettingKey() const;
53 PluginEditor *pluginFromIdentifier(const QString &id);
54
55private:
56 QList<PluginEditorInfo> mPluginList;
57 QList<PimCommon::PluginUtilData> mPluginDataList;
58 PluginEditorManager *const q;
59};
60
61void PluginEditorManagerPrivate::initializePlugins()
62{
63 const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/kmail/plugineditor"));
64
65 const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey());
66
67 QListIterator<KPluginMetaData> i(plugins);
68 i.toBack();
69 while (i.hasPrevious()) {
70 PluginEditorInfo info;
71 const KPluginMetaData data = i.previous();
72
73 // 1) get plugin data => name/description etc.
74 info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data);
75 // 2) look at if plugin is activated
76 const bool isPluginActivated =
77 PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier);
78 info.isEnabled = isPluginActivated;
79 info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
80 info.metaDataFileName = data.fileName();
81 info.data = data;
82 const QVariant p = data.rawData().value(QStringLiteral("X-KDE-KMailEditor-Order")).toVariant();
83 int order = -1;
84 if (p.isValid()) {
85 order = p.toInt();
86 }
87 info.order = order;
88 if (pluginEditorVersion() == data.version()) {
89 info.plugin = nullptr;
90 mPluginList.push_back(info);
91 } else {
92 qCWarning(MESSAGECOMPOSER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded.";
93 }
94 }
95 QList<PluginEditorInfo>::iterator end(mPluginList.end());
96 for (QList<PluginEditorInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
97 loadPlugin(&(*it));
98 }
99}
100
101void PluginEditorManagerPrivate::loadPlugin(PluginEditorInfo *item)
102{
103 if (auto plugin = KPluginFactory::instantiatePlugin<PluginEditor>(item->data, q, QVariantList() << item->metaDataFileName).plugin) {
104 item->plugin = plugin;
105 item->plugin->setIsEnabled(item->isEnabled);
106 item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog();
107 item->plugin->setOrder(item->order);
108 mPluginDataList.append(item->pluginData);
109 }
110}
111
112QList<PluginEditor *> PluginEditorManagerPrivate::pluginsList() const
113{
114 QList<PluginEditor *> lst;
115 QList<PluginEditorInfo>::ConstIterator end(mPluginList.constEnd());
116 for (QList<PluginEditorInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
117 if (auto plugin = (*it).plugin) {
118 lst << plugin;
119 }
120 }
121 return lst;
122}
123
124QList<PimCommon::PluginUtilData> PluginEditorManagerPrivate::pluginDataList() const
125{
126 return mPluginDataList;
127}
128
129QString PluginEditorManagerPrivate::configGroupName() const
130{
131 return QStringLiteral("KMailPluginEditor");
132}
133
134QString PluginEditorManagerPrivate::configPrefixSettingKey() const
135{
136 return QStringLiteral("KMailEditorPlugin");
137}
138
139PluginEditor *PluginEditorManagerPrivate::pluginFromIdentifier(const QString &id)
140{
141 QList<PluginEditorInfo>::ConstIterator end(mPluginList.constEnd());
142 for (QList<PluginEditorInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
143 if ((*it).pluginData.mIdentifier == id) {
144 return (*it).plugin;
145 }
146 }
147 return {};
148}
149
150PluginEditorManager::PluginEditorManager(QObject *parent)
151 : QObject(parent)
152 , d(new MessageComposer::PluginEditorManagerPrivate(this))
153{
154}
155
156PluginEditorManager::~PluginEditorManager() = default;
157
158PluginEditorManager *PluginEditorManager::self()
159{
160 static PluginEditorManager s_self;
161 return &s_self;
162}
163
164QList<PluginEditor *> PluginEditorManager::pluginsList() const
165{
166 return d->pluginsList();
167}
168
169QList<PimCommon::PluginUtilData> PluginEditorManager::pluginsDataList() const
170{
171 return d->pluginDataList();
172}
173
174QString PluginEditorManager::configGroupName() const
175{
176 return d->configGroupName();
177}
178
179QString PluginEditorManager::configPrefixSettingKey() const
180{
181 return d->configPrefixSettingKey();
182}
183
184PluginEditor *PluginEditorManager::pluginFromIdentifier(const QString &id)
185{
186 return d->pluginFromIdentifier(id);
187}
188
189#include "moc_plugineditormanager.cpp"
QJsonObject rawData() const
QString fileName() const
static QList< KPluginMetaData > findPlugins(const QString &directory, std::function< bool(const KPluginMetaData &)> filter={}, KPluginMetaDataOptions options={})
QString name() const
QString version() const
The PluginEditorManager class.
The PluginEditor class.
const QList< QKeySequence > & end()
Simple interface that both EncryptJob and SignEncryptJob implement so the composer can extract some e...
QJsonValue value(QLatin1StringView key) const const
QVariant toVariant() const const
typedef ConstIterator
bool isValid() const const
int toInt(bool *ok) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 31 2025 12:05:40 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.