Messagelib

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

KDE's Doxygen guidelines are available online.