Libksysguard

SensorDaemonInterface.cpp
1/*
2 SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "SensorDaemonInterface_p.h"
8
9#include <QDBusPendingCallWatcher>
10
11#include "systemstats/DBusInterface.h"
12
13using namespace KSysGuard;
14
15class SensorDaemonInterface::Private
16{
17public:
18 std::unique_ptr<SystemStats::DBusInterface> dbusInterface;
19 std::unique_ptr<QDBusServiceWatcher> serviceWatcher;
20 QStringList subscribedSensors;
21};
22
23SensorDaemonInterface::SensorDaemonInterface(QObject *parent)
24 : QObject(parent)
25 , d(new Private)
26{
27 qDBusRegisterMetaType<SensorData>();
28 qDBusRegisterMetaType<SensorInfo>();
29 qDBusRegisterMetaType<SensorDataList>();
30 qDBusRegisterMetaType<SensorInfoMap>();
31
32 d->serviceWatcher =
33 std::make_unique<QDBusServiceWatcher>(SystemStats::ServiceName, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForUnregistration);
34 connect(d->serviceWatcher.get(), &QDBusServiceWatcher::serviceUnregistered, this, &SensorDaemonInterface::reconnect);
35 reconnect();
36}
37
38void KSysGuard::SensorDaemonInterface::reconnect()
39{
40 d->dbusInterface = std::make_unique<SystemStats::DBusInterface>();
41 connect(d->dbusInterface.get(), &SystemStats::DBusInterface::sensorMetaDataChanged, this, &SensorDaemonInterface::onMetaDataChanged);
42 connect(d->dbusInterface.get(), &SystemStats::DBusInterface::newSensorData, this, &SensorDaemonInterface::onValueChanged);
43 connect(d->dbusInterface.get(), &SystemStats::DBusInterface::sensorAdded, this, &SensorDaemonInterface::sensorAdded);
44 connect(d->dbusInterface.get(), &SystemStats::DBusInterface::sensorRemoved, this, &SensorDaemonInterface::sensorRemoved);
45 subscribe(d->subscribedSensors);
46}
47
48SensorDaemonInterface::~SensorDaemonInterface()
49{
50}
51
52void SensorDaemonInterface::requestMetaData(const QString &sensorId)
53{
54 requestMetaData(QStringList{sensorId});
55}
56
57void SensorDaemonInterface::requestMetaData(const QStringList &sensorIds)
58{
59 auto watcher = new QDBusPendingCallWatcher{d->dbusInterface->sensors(sensorIds), this};
60 connect(watcher, &QDBusPendingCallWatcher::finished, watcher, [this](QDBusPendingCallWatcher *self) {
61 self->deleteLater();
62
63 const QDBusPendingReply<SensorInfoMap> reply = *self;
64 if (reply.isError()) {
65 return;
66 }
67
68 const auto infos = reply.value();
69 for (auto itr = infos.begin(); itr != infos.end(); ++itr) {
70 Q_EMIT metaDataChanged(itr.key(), itr.value());
71 }
72 });
73}
74
75void SensorDaemonInterface::requestValue(const QString &sensorId)
76{
77 auto watcher = new QDBusPendingCallWatcher{d->dbusInterface->sensorData({sensorId}), this};
78 connect(watcher, &QDBusPendingCallWatcher::finished, watcher, [this](QDBusPendingCallWatcher *self) {
79 self->deleteLater();
80
81 const QDBusPendingReply<SensorDataList> reply = *self;
82 if (reply.isError()) {
83 return;
84 }
85
86 const auto allData = reply.value();
87 for (auto data : allData) {
88 Q_EMIT valueChanged(data.sensorProperty, data.payload);
89 }
90 });
91}
92
93QDBusPendingCallWatcher *SensorDaemonInterface::allSensors() const
94{
95 return new QDBusPendingCallWatcher{d->dbusInterface->allSensors()};
96}
97
98void SensorDaemonInterface::subscribe(const QString &sensorId)
99{
100 subscribe(QStringList{sensorId});
101}
102
103void KSysGuard::SensorDaemonInterface::subscribe(const QStringList &sensorIds)
104{
105 d->dbusInterface->subscribe(sensorIds);
106 d->subscribedSensors.append(sensorIds);
107}
108
109void SensorDaemonInterface::unsubscribe(const QString &sensorId)
110{
111 unsubscribe(QStringList{sensorId});
112}
113
114void KSysGuard::SensorDaemonInterface::unsubscribe(const QStringList &sensorIds)
115{
116 d->dbusInterface->unsubscribe(sensorIds);
117}
118
119SensorDaemonInterface *SensorDaemonInterface::instance()
120{
121 static SensorDaemonInterface instance;
122 return &instance;
123}
124
125void SensorDaemonInterface::onMetaDataChanged(const QHash<QString, SensorInfo> &metaData)
126{
127 for (auto itr = metaData.begin(); itr != metaData.end(); ++itr) {
128 Q_EMIT metaDataChanged(itr.key(), itr.value());
129 }
130}
131
132void SensorDaemonInterface::onValueChanged(const SensorDataList &values)
133{
134 for (auto entry : values) {
135 Q_EMIT valueChanged(entry.sensorProperty, entry.payload);
136 }
137}
Internal helper class to communicate with the daemon.
QDBusConnection sessionBus()
void finished(QDBusPendingCallWatcher *self)
bool isError() const const
typename Select< 0 >::Type value() const const
void serviceUnregistered(const QString &serviceName)
iterator begin()
iterator end()
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void deleteLater()
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:21:23 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.