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"