1/*
2 * BluezQt - Asynchronous Bluez wrapper library
3 *
4 * SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
5 *
6 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8
9#include "request.h"
10#include "debug.h"
11#include "utils.h"
12
13#include <QDBusConnection>
14#include <QDBusMessage>
15
16namespace BluezQt
17{
18class RequestPrivate
19{
20public:
21 RequestOriginatingType m_type;
22 QDBusMessage m_message;
23
24 bool sendMessage(const QDBusMessage &msg);
25 QString interfaceName();
26 QString serviceName();
27
28 void acceptRequest(const QVariant &val);
29 void rejectRequest();
30 void cancelRequest();
31};
32
33bool RequestPrivate::sendMessage(const QDBusMessage &msg)
34{
35 switch (m_type) {
36 case OrgBluezAgent:
37 case OrgBluezProfile:
38 return DBusConnection::orgBluez().send(message: msg);
39 case OrgBluezObexAgent:
40 return DBusConnection::orgBluezObex().send(message: msg);
41
42 default:
43 return false;
44 }
45}
46
47QString RequestPrivate::interfaceName()
48{
49 switch (m_type) {
50 case OrgBluezAgent:
51 return QStringLiteral("org.bluez.Agent1");
52 case OrgBluezProfile:
53 return QStringLiteral("org.bluez.Profile1");
54 case OrgBluezObexAgent:
55 return QStringLiteral("org.bluez.obex.Agent1");
56 default:
57 return QString();
58 }
59}
60
61QString RequestPrivate::serviceName()
62{
63 switch (m_type) {
64 case OrgBluezObexAgent:
65 return QStringLiteral("org.bluez.obex");
66 default:
67 return QStringLiteral("org.bluez");
68 }
69}
70
71void RequestPrivate::acceptRequest(const QVariant &val)
72{
73 QDBusMessage reply;
74 if (val.isValid()) {
75 reply = m_message.createReply(argument: val);
76 } else {
77 reply = m_message.createReply();
78 }
79
80 if (!sendMessage(msg: reply)) {
81 qCWarning(BLUEZQT) << "Request: Failed to put reply on DBus queue";
82 }
83}
84
85void RequestPrivate::rejectRequest()
86{
87 const QDBusMessage &reply = m_message.createErrorReply(name: serviceName() % QStringLiteral(".Error.Rejected"), QStringLiteral("Rejected"));
88 if (!sendMessage(msg: reply)) {
89 qCWarning(BLUEZQT) << "Request: Failed to put reply on DBus queue";
90 }
91}
92
93void RequestPrivate::cancelRequest()
94{
95 const QDBusMessage &reply = m_message.createErrorReply(name: serviceName() % QStringLiteral(".Error.Canceled"), QStringLiteral("Canceled"));
96 if (!sendMessage(msg: reply)) {
97 qCWarning(BLUEZQT) << "Request: Failed to put reply on DBus queue";
98 }
99}
100
101// T
102template<typename T>
103Request<T>::Request()
104 : d(new RequestPrivate)
105{
106}
107
108template<typename T>
109Request<T>::Request(RequestOriginatingType type, const QDBusMessage &message)
110 : d(new RequestPrivate)
111{
112 d->m_type = type;
113 d->m_message = message;
114}
115
116template<typename T>
117Request<T>::~Request()
118{
119}
120
121template<typename T>
122Request<T>::Request(const Request &other)
123 : d(other.d)
124{
125}
126
127template<typename T>
128Request<T> &Request<T>::operator=(const Request<T> &other)
129{
130 if (d != other.d) {
131 d = other.d;
132 }
133 return *this;
134}
135
136template<typename T>
137void Request<T>::accept(T returnValue) const
138{
139 d->acceptRequest(val: returnValue);
140}
141
142template<typename T>
143void Request<T>::reject() const
144{
145 d->rejectRequest();
146}
147
148template<typename T>
149void Request<T>::cancel() const
150{
151 d->cancelRequest();
152}
153
154// void
155Request<void>::Request()
156 : d(new RequestPrivate)
157{
158}
159
160Request<void>::Request(RequestOriginatingType type, const QDBusMessage &message)
161 : d(new RequestPrivate)
162{
163 d->m_type = type;
164 d->m_message = message;
165}
166
167Request<void>::~Request()
168{
169}
170
171Request<void>::Request(const Request &other)
172 : d(other.d)
173{
174}
175
176Request<void> &Request<void>::operator=(const Request<void> &other)
177{
178 if (d != other.d) {
179 d = other.d;
180 }
181 return *this;
182}
183
184void Request<void>::accept() const
185{
186 d->acceptRequest(val: QVariant());
187}
188
189void Request<void>::reject() const
190{
191 d->rejectRequest();
192}
193
194void Request<void>::cancel() const
195{
196 d->cancelRequest();
197}
198
199// Generate classes
200template class Request<void>;
201template class Request<quint32>;
202template class Request<QString>;
203template class Request<QByteArray>;
204
205} // namespace BluezQt
206

source code of bluez-qt/src/request.cpp