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"