File indexing completed on 2024-04-28 07:45:18
0001 /* 0002 SPDX-FileCopyrightText: 2005-2009 Olivier Goffart <ogoffart at kde.org> 0003 SPDX-FileCopyrightText: 2023 Kai Uwe Broulik <kde@broulik.de> 0004 0005 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 */ 0007 0008 #include "knotifyconfig.h" 0009 0010 #include <KConfigGroup> 0011 #include <KSharedConfig> 0012 0013 #include <QCache> 0014 #include <QStandardPaths> 0015 0016 typedef QCache<QString, KSharedConfig::Ptr> ConfigCache; 0017 Q_GLOBAL_STATIC_WITH_ARGS(ConfigCache, static_cache, (15)) 0018 0019 class KNotifyConfigPrivate : public QSharedData 0020 { 0021 public: 0022 QString readEntry(const QString &group, const QString &key, bool path) const; 0023 0024 QString applicationName; 0025 QString eventId; 0026 0027 KSharedConfig::Ptr eventsFile; 0028 KSharedConfig::Ptr configFile; 0029 }; 0030 0031 QString KNotifyConfigPrivate::readEntry(const QString &group, const QString &key, bool path) const 0032 { 0033 if (configFile->hasGroup(group)) { 0034 KConfigGroup cg(configFile, group); 0035 const QString value = path ? cg.readPathEntry(key, QString()) : cg.readEntry(key, QString()); 0036 if (!value.isNull()) { 0037 return value; 0038 } 0039 } 0040 0041 if (eventsFile->hasGroup(group)) { 0042 KConfigGroup cg(eventsFile, group); 0043 const QString value = path ? cg.readPathEntry(key, QString()) : cg.readEntry(key, QString()); 0044 if (!value.isNull()) { 0045 return value; 0046 } 0047 } 0048 0049 return QString(); 0050 } 0051 0052 static KSharedConfig::Ptr retrieve_from_cache(const QString &filename, QStandardPaths::StandardLocation type = QStandardPaths::GenericConfigLocation) 0053 { 0054 QCache<QString, KSharedConfig::Ptr> &cache = *static_cache; 0055 if (cache.contains(filename)) { 0056 return *cache[filename]; 0057 } 0058 0059 KSharedConfig::Ptr m = KSharedConfig::openConfig(filename, KConfig::NoGlobals, type); 0060 // also search for event config files in qrc resources 0061 if (type == QStandardPaths::GenericDataLocation) { 0062 m->addConfigSources({QStringLiteral(":/") + filename}); 0063 } 0064 cache.insert(filename, new KSharedConfig::Ptr(m)); 0065 0066 return m; 0067 } 0068 0069 void KNotifyConfig::reparseConfiguration() 0070 { 0071 QCache<QString, KSharedConfig::Ptr> &cache = *static_cache; 0072 const auto listFiles = cache.keys(); 0073 for (const QString &filename : listFiles) { 0074 (*cache[filename])->reparseConfiguration(); 0075 } 0076 } 0077 0078 void KNotifyConfig::reparseSingleConfiguration(const QString &app) 0079 { 0080 QCache<QString, KSharedConfig::Ptr> &cache = *static_cache; 0081 const QString appCacheKey = app + QStringLiteral(".notifyrc"); 0082 if (cache.contains(appCacheKey)) { 0083 (*cache[appCacheKey])->reparseConfiguration(); 0084 } 0085 } 0086 0087 KNotifyConfig::KNotifyConfig(const QString &applicationName, const QString &eventId) 0088 : d(new KNotifyConfigPrivate) 0089 { 0090 d->applicationName = applicationName; 0091 d->eventId = eventId; 0092 0093 d->eventsFile = retrieve_from_cache(QLatin1String("knotifications6/") + applicationName + QLatin1String(".notifyrc"), QStandardPaths::GenericDataLocation); 0094 d->configFile = retrieve_from_cache(applicationName + QStringLiteral(".notifyrc")); 0095 } 0096 0097 KNotifyConfig::KNotifyConfig(const KNotifyConfig &other) 0098 : d(other.d) 0099 { 0100 } 0101 0102 KNotifyConfig &KNotifyConfig::operator=(const KNotifyConfig &other) 0103 { 0104 d = other.d; 0105 return *this; 0106 } 0107 0108 KNotifyConfig::~KNotifyConfig() = default; 0109 0110 QString KNotifyConfig::applicationName() const 0111 { 0112 return d->applicationName; 0113 } 0114 0115 QString KNotifyConfig::eventId() const 0116 { 0117 return d->eventId; 0118 } 0119 0120 bool KNotifyConfig::isValid() const 0121 { 0122 const QString group = QLatin1String("Event/") + d->eventId; 0123 return d->configFile->hasGroup(group) || d->eventsFile->hasGroup(group); 0124 } 0125 0126 QString KNotifyConfig::readGlobalEntry(const QString &key) const 0127 { 0128 return d->readEntry(QStringLiteral("Global"), key, false); 0129 } 0130 0131 QString KNotifyConfig::readEntry(const QString &key) const 0132 { 0133 const QString group = QLatin1String("Event/") + d->eventId; 0134 return d->readEntry(group, key, false); 0135 } 0136 0137 QString KNotifyConfig::readPathEntry(const QString &key) const 0138 { 0139 const QString group = QLatin1String("Event/") + d->eventId; 0140 return d->readEntry(group, key, true); 0141 }