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

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