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"