Messagelib

networkurlinterceptorpluginmanager.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 "networkurlinterceptorpluginmanager.h"
8 #include "networkpluginurlinterceptor.h"
9 #include "webengineviewer_debug.h"
10 
11 #include <KPluginFactory>
12 #include <KPluginMetaData>
13 #include <QFileInfo>
14 #include <QVariant>
15 
16 using namespace WebEngineViewer;
17 
18 class MailNetworkUrlInterceptorPluginInfo
19 {
20 public:
21  MailNetworkUrlInterceptorPluginInfo() = default;
22 
23  KPluginMetaData data;
24  QString metaDataFileNameBaseName;
25  QString metaDataFileName;
26  PimCommon::PluginUtilData pluginData;
28  bool isEnabled = false;
29 };
30 
31 namespace
32 {
33 QString pluginVersion()
34 {
35  return QStringLiteral("1.0");
36 }
37 }
38 
39 class WebEngineViewer::NetworkUrlInterceptorPluginManagerPrivate
40 {
41 public:
42  explicit NetworkUrlInterceptorPluginManagerPrivate(NetworkUrlInterceptorPluginManager *qq)
43  : q(qq)
44  {
45  }
46 
47  void initializePluginList();
48 
49  void loadPlugin(MailNetworkUrlInterceptorPluginInfo *item);
50  Q_REQUIRED_RESULT QVector<WebEngineViewer::NetworkPluginUrlInterceptor *> pluginsList() const;
51  Q_REQUIRED_RESULT QString configGroupName() const;
52  Q_REQUIRED_RESULT QString configPrefixSettingKey() const;
53  Q_REQUIRED_RESULT QVector<PimCommon::PluginUtilData> pluginDataList() const;
54  Q_REQUIRED_RESULT NetworkPluginUrlInterceptor *pluginFromIdentifier(const QString &id);
55 
56 private:
58  QVector<PimCommon::PluginUtilData> mPluginDataList;
60 };
61 
62 QString NetworkUrlInterceptorPluginManagerPrivate::configGroupName() const
63 {
64  return QStringLiteral("NetworkUrlInterceptorPlugins");
65 }
66 
67 QString NetworkUrlInterceptorPluginManagerPrivate::configPrefixSettingKey() const
68 {
69  return QStringLiteral("PluginsNetworkUrlInterceptor");
70 }
71 
72 QVector<PimCommon::PluginUtilData> NetworkUrlInterceptorPluginManagerPrivate::pluginDataList() const
73 {
74  return mPluginDataList;
75 }
76 
77 void NetworkUrlInterceptorPluginManagerPrivate::initializePluginList()
78 {
79  const QVector<KPluginMetaData> plugins =
80  KPluginMetaData::findPlugins(QStringLiteral("pim" QT_STRINGIFY(QT_VERSION_MAJOR)) + QStringLiteral("/webengineviewer/urlinterceptor"));
81 
82 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
84 #else
86 #endif
87  i.toBack();
88  const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey());
89 
90  while (i.hasPrevious()) {
91  MailNetworkUrlInterceptorPluginInfo info;
92 
93  const KPluginMetaData data = i.previous();
94 
95  // 1) get plugin data => name/description etc.
96  info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data);
97  // 2) look at if plugin is activated
98  const bool isPluginActivated =
99  PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier);
100  info.isEnabled = isPluginActivated;
101  info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
102  info.metaDataFileName = data.fileName();
103  info.data = data;
104 
105  if (pluginVersion() == data.version()) {
106  info.plugin = nullptr;
107  mPluginList.push_back(info);
108  } else {
109  qCWarning(WEBENGINEVIEWER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded.";
110  }
111  }
113  for (QVector<MailNetworkUrlInterceptorPluginInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
114  loadPlugin(&(*it));
115  }
116 }
117 
118 QVector<WebEngineViewer::NetworkPluginUrlInterceptor *> NetworkUrlInterceptorPluginManagerPrivate::pluginsList() const
119 {
122  for (QVector<MailNetworkUrlInterceptorPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
123  if (auto plugin = (*it).plugin) {
124  lst << plugin;
125  }
126  }
127  return lst;
128 }
129 
130 void NetworkUrlInterceptorPluginManagerPrivate::loadPlugin(MailNetworkUrlInterceptorPluginInfo *item)
131 {
132  if (auto plugin =
133  KPluginFactory::instantiatePlugin<WebEngineViewer::NetworkPluginUrlInterceptor>(item->data, q, QVariantList() << item->metaDataFileName).plugin) {
134  item->plugin = plugin;
135  item->plugin->setIsEnabled(item->isEnabled);
136  item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog();
137  mPluginDataList.append(item->pluginData);
138  }
139 }
140 
141 WebEngineViewer::NetworkPluginUrlInterceptor *NetworkUrlInterceptorPluginManagerPrivate::pluginFromIdentifier(const QString &id)
142 {
144  for (QVector<MailNetworkUrlInterceptorPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
145  if ((*it).pluginData.mIdentifier == id) {
146  return (*it).plugin;
147  }
148  }
149  return {};
150 }
151 
152 NetworkUrlInterceptorPluginManager *NetworkUrlInterceptorPluginManager::self()
153 {
155  return &s_self;
156 }
157 
158 NetworkUrlInterceptorPluginManager::NetworkUrlInterceptorPluginManager(QObject *parent)
159  : QObject(parent)
160  , d(new NetworkUrlInterceptorPluginManagerPrivate(this))
161 {
162  d->initializePluginList();
163 }
164 
165 NetworkUrlInterceptorPluginManager::~NetworkUrlInterceptorPluginManager() = default;
166 
167 QVector<WebEngineViewer::NetworkPluginUrlInterceptor *> NetworkUrlInterceptorPluginManager::pluginsList() const
168 {
169  return d->pluginsList();
170 }
171 
172 QString NetworkUrlInterceptorPluginManager::configGroupName() const
173 {
174  return d->configGroupName();
175 }
176 
177 QString NetworkUrlInterceptorPluginManager::configPrefixSettingKey() const
178 {
179  return d->configPrefixSettingKey();
180 }
181 
182 QVector<PimCommon::PluginUtilData> NetworkUrlInterceptorPluginManager::pluginsDataList() const
183 {
184  return d->pluginDataList();
185 }
186 
187 WebEngineViewer::NetworkPluginUrlInterceptor *NetworkUrlInterceptorPluginManager::pluginFromIdentifier(const QString &id)
188 {
189  return d->pluginFromIdentifier(id);
190 }
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 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.