Messagelib

messageviewercheckbeforedeletingpluginmanager.cpp
1 /*
2  SPDX-FileCopyrightText: 2021-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "messageviewercheckbeforedeletingpluginmanager.h"
8 #include "messageviewer_debug.h"
9 #include "messageviewercheckbeforedeletingplugin.h"
10 #include <KPluginFactory>
11 #include <KPluginMetaData>
12 #include <QFileInfo>
13 
14 using namespace MessageViewer;
15 
16 class CheckBeforeDeletingPluginInfo
17 {
18 public:
19  CheckBeforeDeletingPluginInfo() = default;
20 
21  KPluginMetaData data;
22  PimCommon::PluginUtilData pluginData;
23  QString metaDataFileNameBaseName;
24  QString metaDataFileName;
25  bool isEnabled = true;
27 };
28 
29 class MessageViewer::MessageViewerCheckBeforeDeletingPluginManagerPrivate
30 {
31 public:
32  explicit MessageViewerCheckBeforeDeletingPluginManagerPrivate(MessageViewerCheckBeforeDeletingPluginManager *qq)
33  : q(qq)
34  {
35  }
36 
37  Q_REQUIRED_RESULT QVector<MessageViewer::MessageViewerCheckBeforeDeletingPlugin *> pluginsList() const;
38  Q_REQUIRED_RESULT QVector<PimCommon::PluginUtilData> pluginDataList() const;
39  void initializePluginList();
40  void loadPlugin(CheckBeforeDeletingPluginInfo *item);
41  Q_REQUIRED_RESULT QString configGroupName() const;
42  Q_REQUIRED_RESULT QString configPrefixSettingKey() const;
43  Q_REQUIRED_RESULT MessageViewerCheckBeforeDeletingPlugin *pluginFromIdentifier(const QString &id);
44 
45 private:
46  QVector<PimCommon::PluginUtilData> mPluginDataList;
49 };
50 
51 namespace
52 {
53 QString pluginVersion()
54 {
55  return QStringLiteral("1.0");
56 }
57 }
58 
59 QVector<PimCommon::PluginUtilData> MessageViewerCheckBeforeDeletingPluginManagerPrivate::pluginDataList() const
60 {
61  return mPluginDataList;
62 }
63 
64 QString MessageViewerCheckBeforeDeletingPluginManagerPrivate::configGroupName() const
65 {
66  return QStringLiteral("MessageViewerCheckBeforeDeletingPlugins");
67 }
68 
69 QString MessageViewerCheckBeforeDeletingPluginManagerPrivate::configPrefixSettingKey() const
70 {
71  return QStringLiteral("MessageViewerCheckBeforeDeletingPlugin");
72 }
73 
74 void MessageViewerCheckBeforeDeletingPluginManagerPrivate::initializePluginList()
75 {
76  const QVector<KPluginMetaData> plugins =
77  KPluginMetaData::findPlugins(QStringLiteral("pim" QT_STRINGIFY(QT_VERSION_MAJOR)) + QStringLiteral("/messageviewer/checkbeforedeleting"));
78 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
80 #else
82 #endif
83  i.toBack();
84  const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey());
85  QVector<int> listOrder;
86  while (i.hasPrevious()) {
87  CheckBeforeDeletingPluginInfo info;
88 
89  const KPluginMetaData data = i.previous();
90 
91  // 1) get plugin data => name/description etc.
92  info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data);
93  // 2) look at if plugin is activated
94  const bool isPluginActivated =
95  PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier);
96  info.isEnabled = isPluginActivated;
97  info.data = data;
98 
99  info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
100  info.metaDataFileName = data.fileName();
101  const QString version = data.version();
102  if (pluginVersion() == version) {
103  const QVariant p = data.rawData().value(QStringLiteral("X-KDE-MessageViewer-Configure-Order")).toVariant();
104  int order = -1;
105  if (p.isValid()) {
106  order = p.toInt();
107  }
108  int pos = 0;
109  for (; pos < listOrder.count(); ++pos) {
110  if (listOrder.at(pos) > order) {
111  pos--;
112  break;
113  }
114  }
115  pos = qMax(0, pos);
116  listOrder.insert(pos, order);
117  info.plugin = nullptr;
118  mPluginList.insert(pos, info);
119  } else {
120  qCWarning(MESSAGEVIEWER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded.";
121  }
122  }
124  for (QVector<CheckBeforeDeletingPluginInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
125  loadPlugin(&(*it));
126  }
127 }
128 
129 QVector<MessageViewer::MessageViewerCheckBeforeDeletingPlugin *> MessageViewerCheckBeforeDeletingPluginManagerPrivate::pluginsList() const
130 {
133  for (QVector<CheckBeforeDeletingPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
134  if (auto plugin = (*it).plugin) {
135  lst << plugin;
136  }
137  }
138  return lst;
139 }
140 
141 void MessageViewerCheckBeforeDeletingPluginManagerPrivate::loadPlugin(CheckBeforeDeletingPluginInfo *item)
142 {
143  if (auto plugin =
144  KPluginFactory::instantiatePlugin<MessageViewer::MessageViewerCheckBeforeDeletingPlugin>(item->data, q, QVariantList() << item->metaDataFileName)
145  .plugin) {
146  item->plugin = plugin;
147  // By default it's true
148  item->pluginData.mHasConfigureDialog = true;
149  item->plugin->setIsEnabled(item->isEnabled);
150  mPluginDataList.append(item->pluginData);
151  }
152 }
153 
154 MessageViewerCheckBeforeDeletingPlugin *MessageViewerCheckBeforeDeletingPluginManagerPrivate::pluginFromIdentifier(const QString &id)
155 {
157  for (QVector<CheckBeforeDeletingPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
158  if ((*it).pluginData.mIdentifier == id) {
159  return (*it).plugin;
160  }
161  }
162  return {};
163 }
164 
165 MessageViewerCheckBeforeDeletingPluginManager *MessageViewerCheckBeforeDeletingPluginManager::self()
166 {
168  return &s_self;
169 }
170 
171 MessageViewerCheckBeforeDeletingPluginManager::MessageViewerCheckBeforeDeletingPluginManager(QObject *parent)
172  : QObject(parent)
173  , d(new MessageViewer::MessageViewerCheckBeforeDeletingPluginManagerPrivate(this))
174 {
175  d->initializePluginList();
176 }
177 
178 MessageViewerCheckBeforeDeletingPluginManager::~MessageViewerCheckBeforeDeletingPluginManager() = default;
179 
180 QVector<MessageViewer::MessageViewerCheckBeforeDeletingPlugin *> MessageViewerCheckBeforeDeletingPluginManager::pluginsList() const
181 {
182  return d->pluginsList();
183 }
184 
185 QString MessageViewerCheckBeforeDeletingPluginManager::configGroupName() const
186 {
187  return d->configGroupName();
188 }
189 
190 QString MessageViewerCheckBeforeDeletingPluginManager::configPrefixSettingKey() const
191 {
192  return d->configPrefixSettingKey();
193 }
194 
195 QVector<PimCommon::PluginUtilData> MessageViewerCheckBeforeDeletingPluginManager::pluginsDataList() const
196 {
197  return d->pluginDataList();
198 }
199 
200 MessageViewerCheckBeforeDeletingPlugin *MessageViewerCheckBeforeDeletingPluginManager::pluginFromIdentifier(const QString &id)
201 {
202  return d->pluginFromIdentifier(id);
203 }
QJsonObject rawData() const
bool isValid() const const
QVector::iterator begin()
void insert(int i, T &&value)
QString fileName() const
QString version() const
const T & at(int i) const 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)
unsigned int version()
int count(const T &value) const const
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 Sun Mar 26 2023 04:08:11 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.