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 | |
16 | namespace BluezQt |
17 | { |
18 | class RequestPrivate |
19 | { |
20 | public: |
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 | |
33 | bool 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 | |
47 | QString 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 | |
61 | QString 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 | |
71 | void 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 | |
85 | void 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 | |
93 | void 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 |
102 | template<typename T> |
103 | Request<T>::Request() |
104 | : d(new RequestPrivate) |
105 | { |
106 | } |
107 | |
108 | template<typename T> |
109 | Request<T>::Request(RequestOriginatingType type, const QDBusMessage &message) |
110 | : d(new RequestPrivate) |
111 | { |
112 | d->m_type = type; |
113 | d->m_message = message; |
114 | } |
115 | |
116 | template<typename T> |
117 | Request<T>::~Request() |
118 | { |
119 | } |
120 | |
121 | template<typename T> |
122 | Request<T>::Request(const Request &other) |
123 | : d(other.d) |
124 | { |
125 | } |
126 | |
127 | template<typename T> |
128 | Request<T> &Request<T>::operator=(const Request<T> &other) |
129 | { |
130 | if (d != other.d) { |
131 | d = other.d; |
132 | } |
133 | return *this; |
134 | } |
135 | |
136 | template<typename T> |
137 | void Request<T>::accept(T returnValue) const |
138 | { |
139 | d->acceptRequest(val: returnValue); |
140 | } |
141 | |
142 | template<typename T> |
143 | void Request<T>::reject() const |
144 | { |
145 | d->rejectRequest(); |
146 | } |
147 | |
148 | template<typename T> |
149 | void Request<T>::cancel() const |
150 | { |
151 | d->cancelRequest(); |
152 | } |
153 | |
154 | // void |
155 | Request<void>::Request() |
156 | : d(new RequestPrivate) |
157 | { |
158 | } |
159 | |
160 | Request<void>::Request(RequestOriginatingType type, const QDBusMessage &message) |
161 | : d(new RequestPrivate) |
162 | { |
163 | d->m_type = type; |
164 | d->m_message = message; |
165 | } |
166 | |
167 | Request<void>::~Request() |
168 | { |
169 | } |
170 | |
171 | Request<void>::Request(const Request &other) |
172 | : d(other.d) |
173 | { |
174 | } |
175 | |
176 | Request<void> &Request<void>::operator=(const Request<void> &other) |
177 | { |
178 | if (d != other.d) { |
179 | d = other.d; |
180 | } |
181 | return *this; |
182 | } |
183 | |
184 | void Request<void>::accept() const |
185 | { |
186 | d->acceptRequest(val: QVariant()); |
187 | } |
188 | |
189 | void Request<void>::reject() const |
190 | { |
191 | d->rejectRequest(); |
192 | } |
193 | |
194 | void Request<void>::cancel() const |
195 | { |
196 | d->cancelRequest(); |
197 | } |
198 | |
199 | // Generate classes |
200 | template class Request<void>; |
201 | template class Request<quint32>; |
202 | template class Request<QString>; |
203 | template class Request<QByteArray>; |
204 | |
205 | } // namespace BluezQt |
206 |