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 }