File indexing completed on 2024-04-21 15:02:48

0001 /*
0002     SPDX-FileCopyrightText: 2013 David Edmundson <davidedmundson@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "personpluginmanager.h"
0008 #include "backends/basepersonsdatasource.h"
0009 
0010 #include "kpeople_debug.h"
0011 
0012 #include <KPluginFactory>
0013 #include <KPluginMetaData>
0014 
0015 #include <QMutex>
0016 #include <QMutexLocker>
0017 
0018 using namespace KPeople;
0019 
0020 class PersonPluginManagerPrivate
0021 {
0022 public:
0023     PersonPluginManagerPrivate();
0024     ~PersonPluginManagerPrivate();
0025     QHash<QString /* SourceName*/, BasePersonsDataSource *> dataSourcePlugins;
0026 
0027     void loadDataSourcePlugins();
0028     bool m_autoloadDataSourcePlugins = true;
0029     bool m_loadedDataSourcePlugins = false;
0030     QMutex m_mutex;
0031 };
0032 
0033 Q_GLOBAL_STATIC(PersonPluginManagerPrivate, s_instance)
0034 
0035 PersonPluginManagerPrivate::PersonPluginManagerPrivate()
0036 {
0037 }
0038 
0039 PersonPluginManagerPrivate::~PersonPluginManagerPrivate()
0040 {
0041     qDeleteAll(dataSourcePlugins);
0042 }
0043 
0044 void PersonPluginManagerPrivate::loadDataSourcePlugins()
0045 {
0046     const QVector<KPluginMetaData> pluginList = KPluginMetaData::findPlugins(QStringLiteral("kpeople/datasource"));
0047     for (const KPluginMetaData &data : pluginList) {
0048         auto dataSourceResult = KPluginFactory::instantiatePlugin<BasePersonsDataSource>(data);
0049         if (dataSourceResult) {
0050             BasePersonsDataSource *dataSource = dataSourceResult.plugin;
0051             const QString pluginId = dataSource->sourcePluginId();
0052             if (!dataSourcePlugins.contains(pluginId)) {
0053                 dataSourcePlugins[pluginId] = dataSource;
0054             } else {
0055                 dataSource->deleteLater();
0056                 qCDebug(KPEOPLE_LOG) << "Plugin" << pluginId << "was already loaded manually, ignoring...";
0057             }
0058         } else {
0059             qCWarning(KPEOPLE_LOG) << "Failed to create data source " << dataSourceResult.errorText << data.fileName();
0060         }
0061     }
0062 
0063     m_loadedDataSourcePlugins = true;
0064 }
0065 
0066 void PersonPluginManager::setAutoloadDataSourcePlugins(bool autoloadDataSourcePlugins)
0067 {
0068     s_instance->m_autoloadDataSourcePlugins = autoloadDataSourcePlugins;
0069 }
0070 
0071 void PersonPluginManager::addDataSource(const QString &sourceId, BasePersonsDataSource *source)
0072 {
0073     QMutexLocker(&s_instance->m_mutex);
0074     if (s_instance->dataSourcePlugins.contains(sourceId)) {
0075         qCWarning(KPEOPLE_LOG) << "Attempting to load data source that is already loaded, overriding!";
0076         s_instance->dataSourcePlugins[sourceId]->deleteLater();
0077     }
0078     s_instance->dataSourcePlugins.insert(sourceId, source);
0079 }
0080 
0081 void PersonPluginManager::setDataSourcePlugins(const QHash<QString, BasePersonsDataSource *> &dataSources)
0082 {
0083     QMutexLocker(&s_instance->m_mutex);
0084     qDeleteAll(s_instance->dataSourcePlugins);
0085     s_instance->dataSourcePlugins = dataSources;
0086     s_instance->m_loadedDataSourcePlugins = true;
0087 }
0088 
0089 QList<BasePersonsDataSource *> PersonPluginManager::dataSourcePlugins()
0090 {
0091     QMutexLocker(&s_instance->m_mutex);
0092     if (!s_instance->m_loadedDataSourcePlugins && s_instance->m_autoloadDataSourcePlugins) {
0093         s_instance->loadDataSourcePlugins();
0094     }
0095     return s_instance->dataSourcePlugins.values();
0096 }
0097 
0098 BasePersonsDataSource *PersonPluginManager::dataSource(const QString &sourceId)
0099 {
0100     QMutexLocker(&s_instance->m_mutex);
0101     if (!s_instance->m_loadedDataSourcePlugins && s_instance->m_autoloadDataSourcePlugins) {
0102         s_instance->loadDataSourcePlugins();
0103     }
0104     return s_instance->dataSourcePlugins.value(sourceId);
0105 }
0106 
0107 bool KPeople::PersonPluginManager::addContact(const QVariantMap &properties)
0108 {
0109     bool ret = false;
0110     for (auto p : std::as_const(s_instance->dataSourcePlugins)) {
0111         auto v2 = dynamic_cast<BasePersonsDataSourceV2 *>(p);
0112         if (!v2) {
0113             continue;
0114         }
0115         const bool added = v2->addContact(properties);
0116         ret |= added;
0117     }
0118     return ret;
0119 }
0120 
0121 bool KPeople::PersonPluginManager::deleteContact(const QString &uri)
0122 {
0123     bool ret = false;
0124     for (auto p : std::as_const(s_instance->dataSourcePlugins)) {
0125         auto v2 = dynamic_cast<BasePersonsDataSourceV2 *>(p);
0126         if (!v2) {
0127             continue;
0128         }
0129         const bool deleted = v2->deleteContact(uri);
0130         ret |= deleted;
0131     }
0132     return ret;
0133 }