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"