File indexing completed on 2024-09-22 04:47:56
0001 /* 0002 SPDX-FileCopyrightText: 2017-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "transportpluginmanager.h" 0008 #include "mailtransport_debug.h" 0009 #include <KPluginFactory> 0010 #include <KPluginMetaData> 0011 0012 #include <MailTransport/TransportAbstractPlugin> 0013 0014 #include <QFileInfo> 0015 0016 using namespace MailTransport; 0017 0018 class MailTransportPluginInfo 0019 { 0020 public: 0021 QString metaDataFileNameBaseName; 0022 QString metaDataFileName; 0023 KPluginMetaData data; 0024 MailTransport::TransportAbstractPlugin *plugin = nullptr; 0025 }; 0026 0027 namespace 0028 { 0029 QString pluginVersion() 0030 { 0031 return QStringLiteral("1.0"); 0032 } 0033 } 0034 0035 class MailTransport::TransportPluginManagerPrivate 0036 { 0037 public: 0038 TransportPluginManagerPrivate(TransportPluginManager *qq) 0039 : q(qq) 0040 { 0041 initializePlugins(); 0042 } 0043 0044 void loadPlugin(MailTransportPluginInfo *item); 0045 [[nodiscard]] QList<MailTransport::TransportAbstractPlugin *> pluginsList() const; 0046 QList<MailTransportPluginInfo> mPluginList; 0047 void initializePlugins(); 0048 0049 private: 0050 TransportPluginManager *q; 0051 }; 0052 0053 void TransportPluginManagerPrivate::initializePlugins() 0054 { 0055 if (!mPluginList.isEmpty()) { 0056 return; 0057 } 0058 const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/mailtransport")); 0059 0060 QListIterator<KPluginMetaData> i(plugins); 0061 i.toBack(); 0062 while (i.hasPrevious()) { 0063 MailTransportPluginInfo info; 0064 const KPluginMetaData data = i.previous(); 0065 0066 info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); 0067 info.metaDataFileName = data.fileName(); 0068 info.data = data; 0069 if (pluginVersion() == data.version()) { 0070 info.plugin = nullptr; 0071 mPluginList.push_back(info); 0072 } else { 0073 qCWarning(MAILTRANSPORT_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded."; 0074 } 0075 } 0076 const QList<MailTransportPluginInfo>::iterator end(mPluginList.end()); 0077 for (QList<MailTransportPluginInfo>::iterator it = mPluginList.begin(); it != end; ++it) { 0078 loadPlugin(&(*it)); 0079 } 0080 } 0081 0082 void TransportPluginManagerPrivate::loadPlugin(MailTransportPluginInfo *item) 0083 { 0084 if (auto plugin = 0085 KPluginFactory::instantiatePlugin<MailTransport::TransportAbstractPlugin>(item->data, q, QVariantList() << item->metaDataFileNameBaseName).plugin) { 0086 item->plugin = plugin; 0087 QObject::connect(plugin, &TransportAbstractPlugin::updatePluginList, q, &TransportPluginManager::updatePluginList); 0088 } 0089 } 0090 0091 QList<MailTransport::TransportAbstractPlugin *> TransportPluginManagerPrivate::pluginsList() const 0092 { 0093 QList<MailTransport::TransportAbstractPlugin *> lst; 0094 const QList<MailTransportPluginInfo>::ConstIterator end(mPluginList.constEnd()); 0095 for (QList<MailTransportPluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { 0096 if (auto plugin = (*it).plugin) { 0097 lst << plugin; 0098 } 0099 } 0100 return lst; 0101 } 0102 0103 TransportPluginManager::TransportPluginManager(QObject *parent) 0104 : QObject(parent) 0105 , d(new TransportPluginManagerPrivate(this)) 0106 { 0107 } 0108 0109 TransportPluginManager::~TransportPluginManager() = default; 0110 0111 TransportPluginManager *TransportPluginManager::self() 0112 { 0113 static TransportPluginManager s_self; 0114 return &s_self; 0115 } 0116 0117 QList<MailTransport::TransportAbstractPlugin *> TransportPluginManager::pluginsList() const 0118 { 0119 return d->pluginsList(); 0120 } 0121 0122 MailTransport::TransportAbstractPlugin *TransportPluginManager::plugin(const QString &identifier) 0123 { 0124 const QList<MailTransport::TransportAbstractPlugin *> lstPlugins = pluginsList(); 0125 for (MailTransport::TransportAbstractPlugin *p : lstPlugins) { 0126 const QList<TransportAbstractPluginInfo> lstPluginInfo = p->names(); 0127 for (const MailTransport::TransportAbstractPluginInfo &info : lstPluginInfo) { 0128 if (info.identifier == identifier) { 0129 return p; 0130 } 0131 } 0132 } 0133 return {}; 0134 } 0135 0136 #include "moc_transportpluginmanager.cpp"