Messagelib

plugineditorcheckbeforesendmanager.cpp
1 /*
2  SPDX-FileCopyrightText: 2016-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "plugineditorcheckbeforesendmanager.h"
8 #include "messagecomposer_debug.h"
9 #include "plugineditorcheckbeforesend.h"
10 #include <KPluginFactory>
11 #include <KPluginMetaData>
12 #include <QFileInfo>
13 
14 using namespace MessageComposer;
15 
16 class PluginEditorCheckBeforeSendInfo
17 {
18 public:
19  PluginEditorCheckBeforeSendInfo() = default;
20 
21  KPluginMetaData data;
22  PimCommon::PluginUtilData pluginData;
23  QString metaDataFileNameBaseName;
24  QString metaDataFileName;
25  PluginEditorCheckBeforeSend *plugin = nullptr;
26  bool isEnabled = true;
27 };
28 
29 namespace
30 {
31 QString pluginVersion()
32 {
33  return QStringLiteral("1.0");
34 }
35 }
36 
37 class MessageComposer::PluginEditorCheckBeforeSendManagerPrivate
38 {
39 public:
40  explicit PluginEditorCheckBeforeSendManagerPrivate(PluginEditorCheckBeforeSendManager *qq)
41  : q(qq)
42  {
43  initializePlugins();
44  }
45 
46  void loadPlugin(PluginEditorCheckBeforeSendInfo *item);
47  Q_REQUIRED_RESULT QVector<PluginEditorCheckBeforeSend *> pluginsList() const;
48  void initializePlugins();
50  Q_REQUIRED_RESULT QString configPrefixSettingKey() const;
51  Q_REQUIRED_RESULT QString configGroupName() const;
52  Q_REQUIRED_RESULT QVector<PimCommon::PluginUtilData> pluginsDataList() const;
53  PluginEditorCheckBeforeSend *pluginFromIdentifier(const QString &id);
54 
55 private:
56  QVector<PimCommon::PluginUtilData> mPluginDataList;
58 };
59 
60 QString PluginEditorCheckBeforeSendManagerPrivate::configGroupName() const
61 {
62  return QStringLiteral("KMailPluginCheckBefore");
63 }
64 
65 QString PluginEditorCheckBeforeSendManagerPrivate::configPrefixSettingKey() const
66 {
67  return QStringLiteral("PluginCheckBefore");
68 }
69 
70 QVector<PimCommon::PluginUtilData> PluginEditorCheckBeforeSendManagerPrivate::pluginsDataList() const
71 {
72  return mPluginDataList;
73 }
74 
75 void PluginEditorCheckBeforeSendManagerPrivate::initializePlugins()
76 {
77  const QVector<KPluginMetaData> plugins =
78  KPluginMetaData::findPlugins(QStringLiteral("pim" QT_STRINGIFY(QT_VERSION_MAJOR)) + QStringLiteral("/kmail/plugincheckbeforesend"));
79 
80  const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey());
81 
82 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
84 #else
86 #endif
87  i.toBack();
88  while (i.hasPrevious()) {
89  PluginEditorCheckBeforeSendInfo info;
90  const KPluginMetaData data = i.previous();
91 
92  // 1) get plugin data => name/description etc.
93  info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data);
94  // 2) look at if plugin is activated
95  const bool isPluginActivated =
96  PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier);
97  info.isEnabled = isPluginActivated;
98  info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
99  info.metaDataFileName = data.fileName();
100  info.data = data;
101  if (pluginVersion() == data.version()) {
102  info.plugin = nullptr;
103  mPluginList.push_back(info);
104  } else {
105  qCWarning(MESSAGECOMPOSER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded.";
106  }
107  }
109  for (QVector<PluginEditorCheckBeforeSendInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
110  loadPlugin(&(*it));
111  }
112 }
113 
114 void PluginEditorCheckBeforeSendManagerPrivate::loadPlugin(PluginEditorCheckBeforeSendInfo *item)
115 {
116  if (auto plugin = KPluginFactory::instantiatePlugin<PluginEditorCheckBeforeSend>(item->data, q, QVariantList() << item->metaDataFileName).plugin) {
117  item->plugin = plugin;
118  item->plugin->setIsEnabled(item->isEnabled);
119  item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog();
120  mPluginDataList.append(item->pluginData);
121  }
122 }
123 
124 QVector<PluginEditorCheckBeforeSend *> PluginEditorCheckBeforeSendManagerPrivate::pluginsList() const
125 {
128  for (QVector<PluginEditorCheckBeforeSendInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
129  if (auto plugin = (*it).plugin) {
130  lst << plugin;
131  }
132  }
133  return lst;
134 }
135 
136 PluginEditorCheckBeforeSend *PluginEditorCheckBeforeSendManagerPrivate::pluginFromIdentifier(const QString &id)
137 {
139  for (QVector<PluginEditorCheckBeforeSendInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
140  if ((*it).pluginData.mIdentifier == id) {
141  return (*it).plugin;
142  }
143  }
144  return {};
145 }
146 
147 PluginEditorCheckBeforeSendManager::PluginEditorCheckBeforeSendManager(QObject *parent)
148  : QObject(parent)
149  , d(new MessageComposer::PluginEditorCheckBeforeSendManagerPrivate(this))
150 {
151 }
152 
153 PluginEditorCheckBeforeSendManager::~PluginEditorCheckBeforeSendManager() = default;
154 
155 PluginEditorCheckBeforeSendManager *PluginEditorCheckBeforeSendManager::self()
156 {
158  return &s_self;
159 }
160 
161 QVector<PluginEditorCheckBeforeSend *> PluginEditorCheckBeforeSendManager::pluginsList() const
162 {
163  return d->pluginsList();
164 }
165 
166 QString PluginEditorCheckBeforeSendManager::configGroupName() const
167 {
168  return d->configGroupName();
169 }
170 
171 QString PluginEditorCheckBeforeSendManager::configPrefixSettingKey() const
172 {
173  return d->configPrefixSettingKey();
174 }
175 
176 QVector<PimCommon::PluginUtilData> PluginEditorCheckBeforeSendManager::pluginsDataList() const
177 {
178  return d->pluginsDataList();
179 }
180 
181 PluginEditorCheckBeforeSend *PluginEditorCheckBeforeSendManager::pluginFromIdentifier(const QString &id)
182 {
183  return d->pluginFromIdentifier(id);
184 }
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
static QVector< KPluginMetaData > findPlugins(const QString &directory, std::function< bool(const KPluginMetaData &)> filter, KPluginMetaDataOption option)
QVector::const_iterator constBegin() const const
const QList< QKeySequence > & end()
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Fri Mar 24 2023 04:08:32 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.