Messagelib

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

KDE's Doxygen guidelines are available online.