File indexing completed on 2025-03-09 04:46:42

0001 /*
0002    SPDX-FileCopyrightText: 2015-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "shorturlenginepluginmanager.h"
0008 #include "shorturlengineplugin.h"
0009 #include <KPluginFactory>
0010 #include <KPluginMetaData>
0011 #include <QFileInfo>
0012 #include <QList>
0013 
0014 class ShortUrlEnginePluginInfo
0015 {
0016 public:
0017     KPluginMetaData data;
0018     QString metaDataFileNameBaseName;
0019     QString pluginName;
0020     ShortUrlEnginePlugin *plugin = nullptr;
0021 };
0022 
0023 class ShortUrlEnginePluginManagerPrivate
0024 {
0025 public:
0026     explicit ShortUrlEnginePluginManagerPrivate(ShortUrlEnginePluginManager *qq)
0027         : q(qq)
0028     {
0029     }
0030 
0031     void initializePlugins();
0032     void loadPlugin(ShortUrlEnginePluginInfo *item);
0033     [[nodiscard]] QList<ShortUrlEnginePlugin *> pluginsList() const;
0034     QList<ShortUrlEnginePluginInfo> mPluginList;
0035     ShortUrlEnginePluginManager *const q;
0036 };
0037 
0038 void ShortUrlEnginePluginManagerPrivate::initializePlugins()
0039 {
0040     const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/pimcommon/shorturlengine"));
0041 
0042     QListIterator<KPluginMetaData> i(plugins);
0043     i.toBack();
0044     while (i.hasPrevious()) {
0045         ShortUrlEnginePluginInfo info;
0046         const KPluginMetaData data = i.previous();
0047         info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName();
0048         info.pluginName = data.name();
0049         info.data = data;
0050 
0051         info.plugin = nullptr;
0052         mPluginList.push_back(info);
0053     }
0054     const QList<ShortUrlEnginePluginInfo>::iterator end(mPluginList.end());
0055     for (QList<ShortUrlEnginePluginInfo>::iterator it = mPluginList.begin(); it != end; ++it) {
0056         loadPlugin(&(*it));
0057     }
0058 }
0059 
0060 void ShortUrlEnginePluginManagerPrivate::loadPlugin(ShortUrlEnginePluginInfo *item)
0061 {
0062     if (auto plugin = KPluginFactory::instantiatePlugin<ShortUrlEnginePlugin>(item->data, q, QVariantList() << item->metaDataFileNameBaseName).plugin) {
0063         item->plugin = plugin;
0064         item->plugin->setPluginName(item->pluginName);
0065     }
0066 }
0067 
0068 QList<ShortUrlEnginePlugin *> ShortUrlEnginePluginManagerPrivate::pluginsList() const
0069 {
0070     QList<ShortUrlEnginePlugin *> lst;
0071     QList<ShortUrlEnginePluginInfo>::ConstIterator end(mPluginList.constEnd());
0072     for (QList<ShortUrlEnginePluginInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) {
0073         if ((*it).plugin) {
0074             lst << (*it).plugin;
0075         }
0076     }
0077     return lst;
0078 }
0079 
0080 ShortUrlEnginePluginManager::ShortUrlEnginePluginManager(QObject *parent)
0081     : QObject(parent)
0082     , d(new ShortUrlEnginePluginManagerPrivate(this))
0083 {
0084     d->initializePlugins();
0085 }
0086 
0087 ShortUrlEnginePluginManager::~ShortUrlEnginePluginManager() = default;
0088 
0089 ShortUrlEnginePluginManager *ShortUrlEnginePluginManager::self()
0090 {
0091     static ShortUrlEnginePluginManager s_self;
0092     return &s_self;
0093 }
0094 
0095 QList<ShortUrlEnginePlugin *> ShortUrlEnginePluginManager::pluginsList() const
0096 {
0097     return d->pluginsList();
0098 }
0099 
0100 #include "moc_shorturlenginepluginmanager.cpp"