Messagelib

messageviewerconfiguresettingspluginmanager.cpp
1 /*
2  SPDX-FileCopyrightText: 2018-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "messageviewerconfiguresettingspluginmanager.h"
8 #include "messageviewer_debug.h"
9 #include "messageviewerconfiguresettingsplugin.h"
10 #include <KPluginFactory>
11 #include <KPluginMetaData>
12 #include <QFileInfo>
13 
14 using namespace MessageViewer;
15 
16 class ConfigureSettingsPluginInfo
17 {
18 public:
19  ConfigureSettingsPluginInfo() = default;
20 
21  KPluginMetaData data;
22  PimCommon::PluginUtilData pluginData;
23  QString metaDataFileNameBaseName;
24  QString metaDataFileName;
26 };
27 
28 class MessageViewer::MessageViewerConfigureSettingsPluginManagerPrivate
29 {
30 public:
31  explicit MessageViewerConfigureSettingsPluginManagerPrivate(MessageViewerConfigureSettingsPluginManager *qq)
32  : q(qq)
33  {
34  }
35 
36  Q_REQUIRED_RESULT QVector<MessageViewer::MessageViewerConfigureSettingsPlugin *> pluginsList() const;
37  Q_REQUIRED_RESULT QVector<PimCommon::PluginUtilData> pluginDataList() const;
38  void initializePluginList();
39  void loadPlugin(ConfigureSettingsPluginInfo *item);
40  Q_REQUIRED_RESULT QString configGroupName() const;
41  Q_REQUIRED_RESULT QString configPrefixSettingKey() const;
42  MessageViewerConfigureSettingsPlugin *pluginFromIdentifier(const QString &id);
43 
44 private:
45  QVector<PimCommon::PluginUtilData> mPluginDataList;
48 };
49 
50 namespace
51 {
52 QString configurePluginVersion()
53 {
54  return QStringLiteral("1.0");
55 }
56 }
57 
58 QVector<PimCommon::PluginUtilData> MessageViewerConfigureSettingsPluginManagerPrivate::pluginDataList() const
59 {
60  return mPluginDataList;
61 }
62 
63 QString MessageViewerConfigureSettingsPluginManagerPrivate::configGroupName() const
64 {
65  return QStringLiteral("MessageViewerConfigureSettingsPlugins");
66 }
67 
68 QString MessageViewerConfigureSettingsPluginManagerPrivate::configPrefixSettingKey() const
69 {
70  return QStringLiteral("MessageViewerConfigureSettingsPlugin");
71 }
72 
73 void MessageViewerConfigureSettingsPluginManagerPrivate::initializePluginList()
74 {
75  const QVector<KPluginMetaData> plugins =
76  KPluginMetaData::findPlugins(QStringLiteral("pim" QT_STRINGIFY(QT_VERSION_MAJOR)) + QStringLiteral("/messageviewer/configuresettings"));
77 
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  ConfigureSettingsPluginInfo 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  info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
95  info.metaDataFileName = data.fileName();
96  info.data = data;
97  const QString version = data.version();
98  if (configurePluginVersion() == version) {
99  const QVariant p = data.rawData().value(QStringLiteral("X-KDE-MessageViewer-Configure-Order")).toVariant();
100  int order = -1;
101  if (p.isValid()) {
102  order = p.toInt();
103  }
104  int pos = 0;
105  for (; pos < listOrder.count(); ++pos) {
106  if (listOrder.at(pos) > order) {
107  pos--;
108  break;
109  }
110  }
111  pos = qMax(0, pos);
112  listOrder.insert(pos, order);
113  info.plugin = nullptr;
114  mPluginList.insert(pos, info);
115  } else {
116  qCWarning(MESSAGEVIEWER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded.";
117  }
118  }
120  for (QVector<ConfigureSettingsPluginInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
121  loadPlugin(&(*it));
122  }
123 }
124 
125 QVector<MessageViewer::MessageViewerConfigureSettingsPlugin *> MessageViewerConfigureSettingsPluginManagerPrivate::pluginsList() const
126 {
129  for (QVector<ConfigureSettingsPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
130  if (auto plugin = (*it).plugin) {
131  lst << plugin;
132  }
133  }
134  return lst;
135 }
136 
137 void MessageViewerConfigureSettingsPluginManagerPrivate::loadPlugin(ConfigureSettingsPluginInfo *item)
138 {
139  if (auto plugin =
140  KPluginFactory::instantiatePlugin<MessageViewer::MessageViewerConfigureSettingsPlugin>(item->data, q, QVariantList() << item->metaDataFileName)
141  .plugin) {
142  item->plugin = plugin;
143  // By default it's true
144  item->pluginData.mHasConfigureDialog = true;
145  mPluginDataList.append(item->pluginData);
146  }
147 }
148 
149 MessageViewerConfigureSettingsPlugin *MessageViewerConfigureSettingsPluginManagerPrivate::pluginFromIdentifier(const QString &id)
150 {
152  for (QVector<ConfigureSettingsPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
153  if ((*it).pluginData.mIdentifier == id) {
154  return (*it).plugin;
155  }
156  }
157  return {};
158 }
159 
160 MessageViewerConfigureSettingsPluginManager *MessageViewerConfigureSettingsPluginManager::self()
161 {
163  return &s_self;
164 }
165 
166 MessageViewerConfigureSettingsPluginManager::MessageViewerConfigureSettingsPluginManager(QObject *parent)
167  : QObject(parent)
168  , d(new MessageViewer::MessageViewerConfigureSettingsPluginManagerPrivate(this))
169 {
170  d->initializePluginList();
171 }
172 
173 MessageViewerConfigureSettingsPluginManager::~MessageViewerConfigureSettingsPluginManager() = default;
174 
175 QVector<MessageViewer::MessageViewerConfigureSettingsPlugin *> MessageViewerConfigureSettingsPluginManager::pluginsList() const
176 {
177  return d->pluginsList();
178 }
179 
180 QString MessageViewerConfigureSettingsPluginManager::configGroupName() const
181 {
182  return d->configGroupName();
183 }
184 
185 QString MessageViewerConfigureSettingsPluginManager::configPrefixSettingKey() const
186 {
187  return d->configPrefixSettingKey();
188 }
189 
190 QVector<PimCommon::PluginUtilData> MessageViewerConfigureSettingsPluginManager::pluginsDataList() const
191 {
192  return d->pluginDataList();
193 }
194 
195 MessageViewerConfigureSettingsPlugin *MessageViewerConfigureSettingsPluginManager::pluginFromIdentifier(const QString &id)
196 {
197  return d->pluginFromIdentifier(id);
198 }
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)
KDB_EXPORT KDbVersionInfo 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 Mon Mar 27 2023 04:08:17 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.