File indexing completed on 2024-04-21 03:56:28

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 }