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

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