KUnifiedPush

client.cpp
1/*
2 SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
3 SPDX-License-Identifier: LGPL-2.0-or-later
4*/
5
6#include "client.h"
7#include "connector1iface.h"
8#include "connector2iface.h"
9#include "distributor.h"
10#include "logging.h"
11
12#include "../shared/unifiedpush-constants.h"
13
14#include <QDBusConnection>
15#include <QDBusConnectionInterface>
16#include <QSettings>
17
18using namespace KUnifiedPush;
19
20Client Client::load(const QString &token, QSettings &settings)
21{
22 settings.beginGroup(token);
23 Client client;
24 client.token = token;
25 client.remoteId = settings.value("RemoteId", QString()).toString();
26 client.serviceName = settings.value("ServiceName", QString()).toString();
27 client.endpoint = settings.value("Endpoint", QString()).toString();
28 client.description = settings.value("Description", QString()).toString();
29 client.vapidKey = settings.value("VAPIDKey", QString()).toString();
30 client.version = static_cast<UnifiedPushVersion>(settings.value("Version", 1).toInt());
31 settings.endGroup();
32 return client;
33}
34
35void Client::store(QSettings& settings) const
36{
37 settings.beginGroup(token);
38 settings.setValue("RemoteId", remoteId);
39 settings.setValue("ServiceName", serviceName);
40 settings.setValue("Endpoint", endpoint);
41 settings.setValue("Description", description);
42 settings.setValue("VAPIDKey", vapidKey);
43 settings.setValue("Version", qToUnderlying(version));
44 settings.endGroup();
45}
46
47bool Client::isValid() const
48{
49 return !token.isEmpty() && !serviceName.isEmpty();
50}
51
52void Client::activate() const
53{
54 qCDebug(Log) << "activating" << serviceName;
56}
57
58void Client::message(Distributor *distributor, const QByteArray &message, const QString &messageIdentifier) const
59{
60 switch (version) {
61 case UnifiedPushVersion::v1:
62 {
63 OrgUnifiedpushConnector1Interface iface(serviceName, UP_CONNECTOR_PATH, QDBusConnection::sessionBus());
64 iface.Message(token, message, messageIdentifier);
65 distributor->messageAcknowledged(*this, messageIdentifier);
66 break;
67 }
68 case UnifiedPushVersion::v2:
69 {
70 OrgUnifiedpushConnector2Interface iface(serviceName, UP_CONNECTOR_PATH, QDBusConnection::sessionBus());
71 QVariantMap args;
72 args.insert(UP_ARG_TOKEN, token);
73 args.insert(UP_ARG_MESSAGE, message);
74 if (!messageIdentifier.isEmpty()) {
75 args.insert(UP_ARG_MESSAGE_IDENTIFIER, messageIdentifier);
76 }
77 const auto reply = iface.Message(args);
78
79 auto watcher = new QDBusPendingCallWatcher(reply, distributor);
80 QObject::connect(watcher, &QDBusPendingCallWatcher::finished, distributor, [distributor, client = *this](auto *watcher) {
81 QDBusPendingReply<QVariantMap> reply = *watcher;
82 if (reply.isError()) {
83 qCWarning(Log) << reply.error();
84 // TODO explicit NACK? does any backend support that?
85 } else {
86 const auto response = reply.argumentAt<0>();
87 const auto messageId = response.value(UP_ARG_MESSAGE_IDENTIFIER).toString();
88 distributor->messageAcknowledged(client, messageId);
89 }
90 watcher->deleteLater();
91 });
92
93 break;
94 }
95 }
96}
97
98void Client::newEndpoint() const
99{
100 switch (version) {
101 case UnifiedPushVersion::v1:
102 {
103 OrgUnifiedpushConnector1Interface iface(serviceName, UP_CONNECTOR_PATH, QDBusConnection::sessionBus());
104 iface.NewEndpoint(token, endpoint);
105 break;
106 }
107 case UnifiedPushVersion::v2:
108 {
109 OrgUnifiedpushConnector2Interface iface(serviceName, UP_CONNECTOR_PATH, QDBusConnection::sessionBus());
110 QVariantMap args;
111 args.insert(UP_ARG_TOKEN, token);
112 args.insert(UP_ARG_ENDPOINT, endpoint);
113 iface.NewEndpoint(args);
114 break;
115 }
116 }
117}
118
119void Client::unregistered(bool isConfirmation) const
120{
121 switch (version) {
122 case UnifiedPushVersion::v1:
123 {
124 OrgUnifiedpushConnector1Interface iface(serviceName, UP_CONNECTOR_PATH, QDBusConnection::sessionBus());
125 iface.Unregistered(isConfirmation ? QString() : token);
126 break;
127 }
128 case UnifiedPushVersion::v2:
129 {
130 OrgUnifiedpushConnector2Interface iface(serviceName, UP_CONNECTOR_PATH, QDBusConnection::sessionBus());
131 QVariantMap args;
132 args.insert(UP_ARG_TOKEN, this->token); // v2 sends the token unconditionally
133 iface.Unregistered(args);
134 break;
135 }
136 }
137}
Information about a registered client.
Definition client.h:20
void activate() const
Activate client on D-Bus.
Definition client.cpp:52
bool isValid() const
Contains all required information for a client.
Definition client.cpp:47
void message(Distributor *distributor, const QByteArray &message, const QString &messageIdentifier) const
D-Bus UnifiedPush connector interface.
Definition client.cpp:58
UnifiedPush distributor service.
Definition distributor.h:35
Client-side integration with UnifiedPush.
Definition connector.h:14
QDBusConnectionInterface * interface() const const
QDBusConnection sessionBus()
QDBusReply< void > startService(const QString &name)
void finished(QDBusPendingCallWatcher *self)
QVariant argumentAt(int index) const const
QDBusError error() const const
bool isError() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void beginGroup(QAnyStringView prefix)
void endGroup()
void setValue(QAnyStringView key, const QVariant &value)
QVariant value(QAnyStringView key) const const
bool isEmpty() const const
QString toString() const const
T value() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 12:05:39 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.