1 /* 2 SPDX-FileCopyrightText: 2018-2021 Laurent Montel <montel@kde.org> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #include "authenticationmanager.h" 8 #include "kcoreaddons_version.h" 9 #include "ruqola_debug.h" 10 #include <KPluginFactory> 11 #include <KPluginLoader> 12 #include <KPluginMetaData> 13 #include <QFileInfo> 14 15 #include <plugins/pluginauthentication.h> 16 AuthenticationManager(QObject * parent)17AuthenticationManager::AuthenticationManager(QObject *parent) 18 : QObject(parent) 19 { 20 initializePluginList(); 21 } 22 23 AuthenticationManager::~AuthenticationManager() = default; 24 self()25AuthenticationManager *AuthenticationManager::self() 26 { 27 static AuthenticationManager s_self; 28 return &s_self; 29 } 30 initializePluginList()31void AuthenticationManager::initializePluginList() 32 { 33 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(5, 86, 0) 34 const QVector<KPluginMetaData> plugins = KPluginLoader::findPlugins(QStringLiteral("ruqolaplugins/authentication")); 35 #else 36 const QVector<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("ruqolaplugins/authentication")); 37 #endif 38 39 QVectorIterator<KPluginMetaData> i(plugins); 40 i.toBack(); 41 QSet<QString> unique; 42 while (i.hasPrevious()) { 43 AuthenticationManagerInfo info; 44 const KPluginMetaData data = i.previous(); 45 46 // 1) get plugin data => name/description etc. 47 info.pluginData = createPluginMetaData(data); 48 // 2) look at if plugin is activated 49 info.data = data; 50 info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); 51 info.metaDataFileName = data.fileName(); 52 // only load plugins once, even if found multiple times! 53 if (unique.contains(info.metaDataFileNameBaseName)) { 54 continue; 55 } 56 info.plugin = nullptr; 57 mPluginList.push_back(info); 58 unique.insert(info.metaDataFileNameBaseName); 59 } 60 QVector<AuthenticationManagerInfo>::iterator end(mPluginList.end()); 61 for (QVector<AuthenticationManagerInfo>::iterator it = mPluginList.begin(); it != end; ++it) { 62 loadPlugin(&(*it)); 63 } 64 } 65 loadPlugin(AuthenticationManagerInfo * item)66void AuthenticationManager::loadPlugin(AuthenticationManagerInfo *item) 67 { 68 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(5, 86, 0) 69 KPluginLoader pluginLoader(item->metaDataFileName); 70 if (pluginLoader.factory()) { 71 item->plugin = pluginLoader.factory()->create<PluginAuthentication>(this, QVariantList() << item->metaDataFileNameBaseName); 72 mPluginDataList.append(item->pluginData); 73 } 74 #else 75 if (auto plugin = KPluginFactory::instantiatePlugin<PluginAuthentication>(item->data, this, QVariantList() << item->metaDataFileNameBaseName).plugin) { 76 item->plugin = plugin; 77 mPluginDataList.append(item->pluginData); 78 } 79 #endif 80 } 81 pluginsList() const82QVector<PluginAuthentication *> AuthenticationManager::pluginsList() const 83 { 84 QVector<PluginAuthentication *> lst; 85 QVector<AuthenticationManagerInfo>::ConstIterator end(mPluginList.constEnd()); 86 for (QVector<AuthenticationManagerInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { 87 if (auto plugin = (*it).plugin) { 88 lst << plugin; 89 } 90 } 91 return lst; 92 } 93 createPluginMetaData(const KPluginMetaData & metaData)94PluginUtilData AuthenticationManager::createPluginMetaData(const KPluginMetaData &metaData) 95 { 96 PluginUtilData pluginData; 97 pluginData.mName = metaData.name(); 98 pluginData.mIdentifier = metaData.pluginId(); 99 return pluginData; 100 } 101