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 "device.h"
10#include "device_p.h"
11#include "pendingcall.h"
12#include "utils.h"
13
14namespace BluezQt
15{
16Device::Device(const QString &path, const QVariantMap &properties, AdapterPtr adapter)
17 : QObject()
18 , d(new DevicePrivate(path, properties, adapter))
19{
20}
21
22Device::~Device() = default;
23
24DevicePtr Device::toSharedPtr() const
25{
26 return d->q.toStrongRef();
27}
28
29QString Device::ubi() const
30{
31 return d->m_bluezDevice->path();
32}
33
34QString Device::address() const
35{
36 return d->m_address;
37}
38
39QString Device::name() const
40{
41 return d->m_alias;
42}
43
44PendingCall *Device::setName(const QString &name)
45{
46 return new PendingCall(d->setDBusProperty(QStringLiteral("Alias"), value: name), PendingCall::ReturnVoid, this);
47}
48
49QString Device::friendlyName() const
50{
51 if (name().isEmpty() || name() == remoteName()) {
52 return name();
53 }
54 if (remoteName().isEmpty()) {
55 return name();
56 }
57 return QStringLiteral("%1 (%2)").arg(args: name(), args: remoteName());
58}
59
60QString Device::remoteName() const
61{
62 return d->m_name;
63}
64
65quint32 Device::deviceClass() const
66{
67 return d->m_deviceClass;
68}
69
70Device::Type Device::type() const
71{
72 if (deviceClass() == 0) {
73 return appearanceToType(appearance: appearance());
74 }
75
76 return classToType(classNum: d->m_deviceClass);
77}
78
79quint16 Device::appearance() const
80{
81 return d->m_appearance;
82}
83
84QString Device::icon() const
85{
86 switch (type()) {
87 case Headset:
88 return QStringLiteral("audio-headset");
89 case Headphones:
90 return QStringLiteral("audio-headphones");
91 default:
92 return d->m_icon.isEmpty() ? QStringLiteral("preferences-system-bluetooth") : d->m_icon;
93 }
94}
95
96bool Device::isPaired() const
97{
98 return d->m_paired;
99}
100
101bool Device::isTrusted() const
102{
103 return d->m_trusted;
104}
105
106PendingCall *Device::setTrusted(bool trusted)
107{
108 return new PendingCall(d->setDBusProperty(QStringLiteral("Trusted"), value: trusted), PendingCall::ReturnVoid, this);
109}
110
111bool Device::isBlocked() const
112{
113 return d->m_blocked;
114}
115
116PendingCall *Device::setBlocked(bool blocked)
117{
118 return new PendingCall(d->setDBusProperty(QStringLiteral("Blocked"), value: blocked), PendingCall::ReturnVoid, this);
119}
120
121bool Device::hasLegacyPairing() const
122{
123 return d->m_legacyPairing;
124}
125
126qint16 Device::rssi() const
127{
128 return d->m_rssi;
129}
130
131ManData Device::manufacturerData() const
132{
133 return d->m_manufacturerData;
134}
135
136bool Device::isServicesResolved() const
137{
138 return d->m_servicesResolved;
139}
140
141bool Device::isConnected() const
142{
143 return d->m_connected;
144}
145
146QStringList Device::uuids() const
147{
148 return d->m_uuids;
149}
150
151QString Device::modalias() const
152{
153 return d->m_modalias;
154}
155
156QHash<QString, QByteArray> Device::serviceData() const
157{
158 return d->m_serviceData;
159}
160
161BatteryPtr Device::battery() const
162{
163 return d->m_battery;
164}
165
166InputPtr Device::input() const
167{
168 return d->m_input;
169}
170
171MediaPlayerPtr Device::mediaPlayer() const
172{
173 return d->m_mediaPlayer;
174}
175
176MediaTransportPtr Device::mediaTransport() const
177{
178 return d->m_mediaTransport;
179}
180
181AdapterPtr Device::adapter() const
182{
183 return d->m_adapter;
184}
185
186QList<GattServiceRemotePtr> Device::gattServices() const
187{
188 return d->m_services;
189}
190
191QString Device::typeToString(Device::Type type)
192{
193 switch (type) {
194 case Device::Phone:
195 return QStringLiteral("phone");
196 case Device::Modem:
197 return QStringLiteral("modem");
198 case Device::Computer:
199 return QStringLiteral("computer");
200 case Device::Network:
201 return QStringLiteral("network");
202 case Device::Headset:
203 return QStringLiteral("headset");
204 case Device::Headphones:
205 return QStringLiteral("headphones");
206 case Device::AudioVideo:
207 return QStringLiteral("audiovideo");
208 case Device::Keyboard:
209 return QStringLiteral("keyboard");
210 case Device::Mouse:
211 return QStringLiteral("mouse");
212 case Device::Joypad:
213 return QStringLiteral("joypad");
214 case Device::Tablet:
215 return QStringLiteral("tablet");
216 case Device::Peripheral:
217 return QStringLiteral("peripheral");
218 case Device::Camera:
219 return QStringLiteral("camera");
220 case Device::Printer:
221 return QStringLiteral("printer");
222 case Device::Imaging:
223 return QStringLiteral("imaging");
224 case Device::Wearable:
225 return QStringLiteral("wearable");
226 case Device::Toy:
227 return QStringLiteral("toy");
228 case Device::Health:
229 return QStringLiteral("health");
230 default:
231 return QStringLiteral("uncategorized");
232 }
233}
234
235Device::Type Device::stringToType(const QString &typeString)
236{
237 if (typeString == QLatin1String("phone")) {
238 return Device::Phone;
239 } else if (typeString == QLatin1String("modem")) {
240 return Device::Modem;
241 } else if (typeString == QLatin1String("computer")) {
242 return Device::Computer;
243 } else if (typeString == QLatin1String("network")) {
244 return Device::Network;
245 } else if (typeString == QLatin1String("headset")) {
246 return Device::Headset;
247 } else if (typeString == QLatin1String("headphones")) {
248 return Device::Headphones;
249 } else if (typeString == QLatin1String("audio")) {
250 return Device::AudioVideo;
251 } else if (typeString == QLatin1String("keyboard")) {
252 return Device::Keyboard;
253 } else if (typeString == QLatin1String("mouse")) {
254 return Device::Mouse;
255 } else if (typeString == QLatin1String("joypad")) {
256 return Device::Joypad;
257 } else if (typeString == QLatin1String("tablet")) {
258 return Device::Tablet;
259 } else if (typeString == QLatin1String("peripheral")) {
260 return Device::Peripheral;
261 } else if (typeString == QLatin1String("camera")) {
262 return Device::Camera;
263 } else if (typeString == QLatin1String("printer")) {
264 return Device::Printer;
265 } else if (typeString == QLatin1String("imaging")) {
266 return Device::Imaging;
267 } else if (typeString == QLatin1String("wearable")) {
268 return Device::Wearable;
269 } else if (typeString == QLatin1String("toy")) {
270 return Device::Toy;
271 } else if (typeString == QLatin1String("health")) {
272 return Device::Health;
273 }
274 return Device::Uncategorized;
275}
276
277PendingCall *Device::connectToDevice()
278{
279 return new PendingCall(d->m_bluezDevice->Connect(), PendingCall::ReturnVoid, this);
280}
281
282PendingCall *Device::disconnectFromDevice()
283{
284 return new PendingCall(d->m_bluezDevice->Disconnect(), PendingCall::ReturnVoid, this);
285}
286
287PendingCall *Device::connectProfile(const QString &uuid)
288{
289 return new PendingCall(d->m_bluezDevice->ConnectProfile(UUID: uuid), PendingCall::ReturnVoid, this);
290}
291
292PendingCall *Device::disconnectProfile(const QString &uuid)
293{
294 return new PendingCall(d->m_bluezDevice->DisconnectProfile(UUID: uuid), PendingCall::ReturnVoid, this);
295}
296
297PendingCall *Device::pair()
298{
299 return new PendingCall(d->m_bluezDevice->Pair(), PendingCall::ReturnVoid, this);
300}
301
302PendingCall *Device::cancelPairing()
303{
304 return new PendingCall(d->m_bluezDevice->CancelPairing(), PendingCall::ReturnVoid, this);
305}
306
307} // namespace BluezQt
308
309#include "moc_device.cpp"
310

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