File indexing completed on 2024-05-12 05:37:09

0001 /*
0002     SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2020 Konrad Materka <materka@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #pragma once
0009 
0010 #include <QDBusError>
0011 #include <QHash>
0012 #include <QObject>
0013 #include <QPointer>
0014 #include <QRegularExpression>
0015 
0016 class KPluginMetaData;
0017 class SystemTraySettings;
0018 class QDBusServiceWatcher;
0019 
0020 /**
0021  * @brief Loading and unloading Plasmoids when DBus services come and go.
0022  */
0023 class DBusServiceObserver : public QObject
0024 {
0025     Q_OBJECT
0026 public:
0027     explicit DBusServiceObserver(const QPointer<SystemTraySettings> &settings, QObject *parent = nullptr);
0028 
0029     void registerPlugin(const KPluginMetaData &pluginMetaData);
0030     void unregisterPlugin(const QString &pluginId);
0031     bool isDBusActivable(const QString &pluginId);
0032 
0033 Q_SIGNALS:
0034     void serviceStarted(const QString &pluginId);
0035     void serviceStopped(const QString &pluginId);
0036 
0037 public Q_SLOTS:
0038     void initDBusActivatables();
0039 
0040 private Q_SLOTS:
0041     void sessionBusNameFetchFinished(const QStringList &list);
0042     void systemBusNameFetchFinished(const QStringList &list);
0043     void sessionBusNameFetchError(const QDBusError &error);
0044     void systemBusNameFetchError(const QDBusError &error);
0045 
0046 private:
0047     void serviceRegistered(const QString &service);
0048     void serviceUnregistered(const QString &service);
0049 
0050     QPointer<SystemTraySettings> m_settings;
0051 
0052     QDBusServiceWatcher *m_sessionServiceWatcher;
0053     QDBusServiceWatcher *m_systemServiceWatcher;
0054 
0055     QHash<QString /*plugin id*/, QRegularExpression /*DBus Service*/> m_dbusActivatableTasks;
0056     QHash<QString, int> m_dbusServiceCounts;
0057     bool m_dbusSessionServiceNamesFetched = false;
0058     bool m_dbusSystemServiceNamesFetched = false;
0059 };