File indexing completed on 2024-06-23 05:18:35

0001 /*
0002    SPDX-FileCopyrightText: 2015-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "plugineditormanager.h"
0008 #include "messagecomposer_debug.h"
0009 #include "plugineditor.h"
0010 #include <KPluginFactory>
0011 #include <KPluginMetaData>
0012 #include <QFileInfo>
0013 using namespace MessageComposer;
0014 
0015 class PluginEditorInfo
0016 {
0017 public:
0018     PluginEditorInfo() = default;
0019 
0020     KPluginMetaData data;
0021     PimCommon::PluginUtilData pluginData;
0022     QString metaDataFileNameBaseName;
0023     QString metaDataFileName;
0024     PluginEditor *plugin = nullptr;
0025     int order = 0;
0026     bool isEnabled = true;
0027 };
0028 
0029 namespace
0030 {
0031 QString pluginEditorVersion()
0032 {
0033     return QStringLiteral("1.0");
0034 }
0035 }
0036 
0037 class MessageComposer::PluginEditorManagerPrivate
0038 {
0039 public:
0040     PluginEditorManagerPrivate(PluginEditorManager *qq)
0041         : q(qq)
0042     {
0043         initializePlugins();
0044     }
0045 
0046     void loadPlugin(PluginEditorInfo *item);
0047     [[nodiscard]] QList<PluginEditor *> pluginsList() const;
0048     [[nodiscard]] QList<PimCommon::PluginUtilData> pluginDataList() const;
0049     void initializePlugins();
0050 
0051     [[nodiscard]] QString configGroupName() const;
0052     [[nodiscard]] QString configPrefixSettingKey() const;
0053     PluginEditor *pluginFromIdentifier(const QString &id);
0054 
0055 private:
0056     QList<PluginEditorInfo> mPluginList;
0057     QList<PimCommon::PluginUtilData> mPluginDataList;
0058     PluginEditorManager *const q;
0059 };
0060 
0061 void PluginEditorManagerPrivate::initializePlugins()
0062 {
0063     const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/kmail/plugineditor"));
0064 
0065     const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey());
0066 
0067     QListIterator<KPluginMetaData> i(plugins);
0068     i.toBack();
0069     while (i.hasPrevious()) {
0070         PluginEditorInfo info;
0071         const KPluginMetaData data = i.previous();
0072 
0073         // 1) get plugin data => name/description etc.
0074         info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data);
0075         // 2) look at if plugin is activated
0076         const bool isPluginActivated =
0077             PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier);
0078         info.isEnabled = isPluginActivated;
0079         info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
0080         info.metaDataFileName = data.fileName();
0081         info.data = data;
0082         const QVariant p = data.rawData().value(QStringLiteral("X-KDE-KMailEditor-Order")).toVariant();
0083         int order = -1;
0084         if (p.isValid()) {
0085             order = p.toInt();
0086         }
0087         info.order = order;
0088         if (pluginEditorVersion() == data.version()) {
0089             info.plugin = nullptr;
0090             mPluginList.push_back(info);
0091         } else {
0092             qCWarning(MESSAGECOMPOSER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded.";
0093         }
0094     }
0095     QList<PluginEditorInfo>::iterator end(mPluginList.end());
0096     for (QList<PluginEditorInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
0097         loadPlugin(&(*it));
0098     }
0099 }
0100 
0101 void PluginEditorManagerPrivate::loadPlugin(PluginEditorInfo *item)
0102 {
0103     if (auto plugin = KPluginFactory::instantiatePlugin<PluginEditor>(item->data, q, QVariantList() << item->metaDataFileName).plugin) {
0104         item->plugin = plugin;
0105         item->plugin->setIsEnabled(item->isEnabled);
0106         item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog();
0107         item->plugin->setOrder(item->order);
0108         mPluginDataList.append(item->pluginData);
0109     }
0110 }
0111 
0112 QList<PluginEditor *> PluginEditorManagerPrivate::pluginsList() const
0113 {
0114     QList<PluginEditor *> lst;
0115     QList<PluginEditorInfo>::ConstIterator end(mPluginList.constEnd());
0116     for (QList<PluginEditorInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
0117         if (auto plugin = (*it).plugin) {
0118             lst << plugin;
0119         }
0120     }
0121     return lst;
0122 }
0123 
0124 QList<PimCommon::PluginUtilData> PluginEditorManagerPrivate::pluginDataList() const
0125 {
0126     return mPluginDataList;
0127 }
0128 
0129 QString PluginEditorManagerPrivate::configGroupName() const
0130 {
0131     return QStringLiteral("KMailPluginEditor");
0132 }
0133 
0134 QString PluginEditorManagerPrivate::configPrefixSettingKey() const
0135 {
0136     return QStringLiteral("KMailEditorPlugin");
0137 }
0138 
0139 PluginEditor *PluginEditorManagerPrivate::pluginFromIdentifier(const QString &id)
0140 {
0141     QList<PluginEditorInfo>::ConstIterator end(mPluginList.constEnd());
0142     for (QList<PluginEditorInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
0143         if ((*it).pluginData.mIdentifier == id) {
0144             return (*it).plugin;
0145         }
0146     }
0147     return {};
0148 }
0149 
0150 PluginEditorManager::PluginEditorManager(QObject *parent)
0151     : QObject(parent)
0152     , d(new MessageComposer::PluginEditorManagerPrivate(this))
0153 {
0154 }
0155 
0156 PluginEditorManager::~PluginEditorManager() = default;
0157 
0158 PluginEditorManager *PluginEditorManager::self()
0159 {
0160     static PluginEditorManager s_self;
0161     return &s_self;
0162 }
0163 
0164 QList<PluginEditor *> PluginEditorManager::pluginsList() const
0165 {
0166     return d->pluginsList();
0167 }
0168 
0169 QList<PimCommon::PluginUtilData> PluginEditorManager::pluginsDataList() const
0170 {
0171     return d->pluginDataList();
0172 }
0173 
0174 QString PluginEditorManager::configGroupName() const
0175 {
0176     return d->configGroupName();
0177 }
0178 
0179 QString PluginEditorManager::configPrefixSettingKey() const
0180 {
0181     return d->configPrefixSettingKey();
0182 }
0183 
0184 PluginEditor *PluginEditorManager::pluginFromIdentifier(const QString &id)
0185 {
0186     return d->pluginFromIdentifier(id);
0187 }
0188 
0189 #include "moc_plugineditormanager.cpp"