File indexing completed on 2025-03-09 04:54:36

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