1 | /* |
2 | * BluezQt - Asynchronous BlueZ wrapper library |
3 | * |
4 | * SPDX-FileCopyrightText: 2014-2015 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 | #ifndef BLUEZQT_DEVICE_H |
10 | #define BLUEZQT_DEVICE_H |
11 | |
12 | #include <QObject> |
13 | |
14 | #include "bluezqt_export.h" |
15 | #include "types.h" |
16 | |
17 | #include <memory> |
18 | |
19 | namespace BluezQt |
20 | { |
21 | class Adapter; |
22 | class PendingCall; |
23 | |
24 | /*! |
25 | * \inmodule BluezQt |
26 | * \class BluezQt::Device |
27 | * \inheaderfile BluezQt/Device |
28 | * |
29 | * \brief Bluetooth device. |
30 | * |
31 | * This class represents a Bluetooth device. |
32 | */ |
33 | class BLUEZQT_EXPORT Device : public QObject |
34 | { |
35 | Q_OBJECT |
36 | |
37 | /*! \property BluezQt::Device::ubi */ |
38 | Q_PROPERTY(QString ubi READ ubi) |
39 | /*! \property BluezQt::Device::address */ |
40 | Q_PROPERTY(QString address READ address NOTIFY addressChanged) |
41 | /*! \property BluezQt::Device::name */ |
42 | Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) |
43 | /*! \property BluezQt::Device::friendlyName */ |
44 | Q_PROPERTY(QString friendlyName READ friendlyName NOTIFY friendlyNameChanged) |
45 | /*! \property BluezQt::Device::remoteName */ |
46 | Q_PROPERTY(QString remoteName READ remoteName NOTIFY remoteNameChanged) |
47 | /*! \property BluezQt::Device::deviceClass */ |
48 | Q_PROPERTY(quint32 deviceClass READ deviceClass NOTIFY deviceClassChanged) |
49 | /*! \property BluezQt::Device::type */ |
50 | Q_PROPERTY(Type type READ type NOTIFY typeChanged) |
51 | /*! \property BluezQt::Device::appearance */ |
52 | Q_PROPERTY(quint16 appearance READ appearance NOTIFY appearanceChanged) |
53 | /*! \property BluezQt::Device::icon */ |
54 | Q_PROPERTY(QString icon READ icon NOTIFY iconChanged) |
55 | /*! \property BluezQt::Device::paired */ |
56 | Q_PROPERTY(bool paired READ isPaired NOTIFY pairedChanged) |
57 | /*! \property BluezQt::Device::trusted */ |
58 | Q_PROPERTY(bool trusted READ isTrusted WRITE setTrusted NOTIFY trustedChanged) |
59 | /*! \property BluezQt::Device::blocked */ |
60 | Q_PROPERTY(bool blocked READ isBlocked WRITE setBlocked NOTIFY blockedChanged) |
61 | /*! \property BluezQt::Device::legacyPairing */ |
62 | Q_PROPERTY(bool legacyPairing READ hasLegacyPairing NOTIFY legacyPairingChanged) |
63 | /*! \property BluezQt::Device::rssi */ |
64 | Q_PROPERTY(qint16 rssi READ rssi NOTIFY rssiChanged) |
65 | /*! \property BluezQt::Device::manufacturerData */ |
66 | Q_PROPERTY(ManData manufacturerData READ manufacturerData NOTIFY manufacturerDataChanged) |
67 | /*! \property BluezQt::Device::servicesResolved */ |
68 | Q_PROPERTY(bool servicesResolved READ isServicesResolved NOTIFY servicesResolvedChanged) |
69 | /*! \property BluezQt::Device::connected */ |
70 | Q_PROPERTY(bool connected READ isConnected NOTIFY connectedChanged) |
71 | /*! \property BluezQt::Device::uuids */ |
72 | Q_PROPERTY(QStringList uuids READ uuids NOTIFY uuidsChanged) |
73 | /*! \property BluezQt::Device::modalias */ |
74 | Q_PROPERTY(QString modalias READ modalias NOTIFY modaliasChanged) |
75 | /*! \property BluezQt::Device::battery */ |
76 | Q_PROPERTY(BatteryPtr battery READ battery NOTIFY batteryChanged) |
77 | /*! \property BluezQt::Device::input */ |
78 | Q_PROPERTY(InputPtr input READ input NOTIFY inputChanged) |
79 | /*! \property BluezQt::Device::mediaPlayer */ |
80 | Q_PROPERTY(MediaPlayerPtr mediaPlayer READ mediaPlayer NOTIFY mediaPlayerChanged) |
81 | /*! \property BluezQt::Device::mediaTransport */ |
82 | Q_PROPERTY(MediaTransportPtr mediaTransport READ mediaTransport NOTIFY mediaTransportChanged) |
83 | /*! \property BluezQt::Device::adapter */ |
84 | Q_PROPERTY(AdapterPtr adapter READ adapter) |
85 | /*! \property BluezQt::Device::gattServices */ |
86 | Q_PROPERTY(QList<GattServiceRemotePtr> gattServices READ gattServices NOTIFY gattServicesChanged) |
87 | |
88 | public: |
89 | /*! |
90 | * Device types. |
91 | * \value Phone |
92 | * The device is a phone. |
93 | * \value Modem |
94 | * The device is a modem. |
95 | * \value Computer |
96 | * The device is a computer. |
97 | * \value Network |
98 | * The device is a computer. |
99 | * \value Headset |
100 | * The device is a headset. |
101 | * \value Headphones |
102 | * The device is a headphone. |
103 | * \value AudioVideo |
104 | * The device is an uncategorized audio/video device. |
105 | * \value Keyboard |
106 | * The device is a keyboard. |
107 | * \value Mouse |
108 | * The device is a mouse. |
109 | * \value Joypad |
110 | * The device is a joypad. |
111 | * \value Tablet |
112 | * The device is a graphics tablet (input device). |
113 | * \value Peripheral |
114 | * The device is an uncategorized peripheral device. |
115 | * \value Camera |
116 | * The device is a camera. |
117 | * \value Printer |
118 | * The device is a printer. |
119 | * \value Imaging |
120 | * The device is an uncategorized imaging device. |
121 | * \value Wearable |
122 | * The device is a wearable device. |
123 | * \value Toy |
124 | * The device is a toy. |
125 | * \value Health |
126 | * The device is a health device. |
127 | * \value Uncategorized |
128 | * The device is not of any of the known types. |
129 | */ |
130 | enum Type { |
131 | Phone, |
132 | Modem, |
133 | Computer, |
134 | Network, |
135 | Headset, |
136 | Headphones, |
137 | AudioVideo, |
138 | Keyboard, |
139 | Mouse, |
140 | Joypad, |
141 | Tablet, |
142 | Peripheral, |
143 | Camera, |
144 | Printer, |
145 | Imaging, |
146 | Wearable, |
147 | Toy, |
148 | Health, |
149 | Uncategorized, |
150 | }; |
151 | Q_ENUM(Type) |
152 | |
153 | ~Device() override; |
154 | |
155 | /*! |
156 | * Returns a shared pointer from this. |
157 | */ |
158 | DevicePtr toSharedPtr() const; |
159 | |
160 | /*! |
161 | * Returns the UBI of the device. |
162 | * |
163 | * Example UBI: "/org/bluez/hci0/dev_40_79_6A_0C_39_75" |
164 | */ |
165 | QString ubi() const; |
166 | |
167 | /*! |
168 | * Returns the address of the device. |
169 | * |
170 | * Example address: "40:79:6A:0C:39:75" |
171 | */ |
172 | QString address() const; |
173 | |
174 | /*! |
175 | * Returns the name of the device. |
176 | * |
177 | * If the name of the device wasn't previously changed, |
178 | * remoteName is returned. |
179 | */ |
180 | QString name() const; |
181 | |
182 | /*! |
183 | * Sets the \a name of the device. |
184 | * |
185 | * Returns a void pending call. |
186 | */ |
187 | PendingCall *setName(const QString &name); |
188 | |
189 | /*! |
190 | * Returns the friendly name of the device. |
191 | * |
192 | * Friendly name is a string "name (remoteName)". |
193 | * If the remoteName is same as name, it returns just name. |
194 | */ |
195 | QString friendlyName() const; |
196 | |
197 | /*! |
198 | * Returns the remote name of the device. |
199 | */ |
200 | QString remoteName() const; |
201 | |
202 | /*! |
203 | * Returns the class of the device. |
204 | * |
205 | * In case of Bluetooth Low Energy only devices, |
206 | * device class is invalid (0). |
207 | * |
208 | * \sa type() |
209 | */ |
210 | quint32 deviceClass() const; |
211 | |
212 | /*! |
213 | * Returns the type of the device. |
214 | * |
215 | * Type of device is deduced from its class (for Bluetooth Classic devices) |
216 | * or its appearance (for Bluetooth Low Energy devices). |
217 | * |
218 | * \sa deviceClass() |
219 | * \sa appearance() |
220 | */ |
221 | Device::Type type() const; |
222 | |
223 | /*! |
224 | * Returns the appearance of the device. |
225 | */ |
226 | quint16 appearance() const; |
227 | |
228 | /*! |
229 | * Returns the icon name of the device. |
230 | * |
231 | * In case the icon is empty, "preferences-system-bluetooth" is returned. |
232 | */ |
233 | QString icon() const; |
234 | |
235 | /*! |
236 | * Returns whether the device is paired. |
237 | */ |
238 | bool isPaired() const; |
239 | |
240 | /*! |
241 | * Returns whether the device is trusted. |
242 | */ |
243 | bool isTrusted() const; |
244 | |
245 | /*! |
246 | * Sets the \a trusted state of the device. |
247 | * |
248 | * Returns void pending call. |
249 | */ |
250 | PendingCall *setTrusted(bool trusted); |
251 | |
252 | /*! |
253 | * Returns whether the device is blocked. |
254 | */ |
255 | bool isBlocked() const; |
256 | |
257 | /*! |
258 | * Sets the \a blocked state of the device. |
259 | * |
260 | * Returns void pending call. |
261 | */ |
262 | PendingCall *setBlocked(bool blocked); |
263 | |
264 | /*! |
265 | * Returns whether the device has legacy pairing. |
266 | */ |
267 | bool hasLegacyPairing() const; |
268 | |
269 | /*! |
270 | * Returns the Received Signal Strength Indicator of the device. |
271 | * |
272 | * The bigger value indicates better signal strength. |
273 | * |
274 | * \note RSSI is only updated during discovery. |
275 | */ |
276 | qint16 () const; |
277 | |
278 | /*! |
279 | * Returns manufacturer specific advertisement data. |
280 | * |
281 | * \note Keys are 16 bits Manufacturer ID followed by |
282 | * its byte array value. |
283 | */ |
284 | ManData manufacturerData() const; |
285 | |
286 | /*! |
287 | * Returns whether or not service discovery has been resolved. |
288 | */ |
289 | bool isServicesResolved() const; |
290 | |
291 | /*! |
292 | * Returns whether the device is connected. |
293 | */ |
294 | bool isConnected() const; |
295 | |
296 | /*! |
297 | * Returns UUIDs of services supported by the device. |
298 | * |
299 | * UUIDs will always be returned in uppercase. |
300 | */ |
301 | QStringList uuids() const; |
302 | |
303 | /*! |
304 | * Returns remote device ID in modalias format. |
305 | */ |
306 | QString modalias() const; |
307 | |
308 | /*! |
309 | * Returns the service advertisement data. |
310 | * |
311 | * Returns a hash with keys being the UUIDs in and values being the raw service data value. |
312 | * \since 5.72 |
313 | */ |
314 | QHash<QString, QByteArray> serviceData() const; |
315 | |
316 | /*! |
317 | * Returns the battery interface for the device. |
318 | * |
319 | * Returns null if device has no battery. |
320 | * \since 5.66 |
321 | */ |
322 | BatteryPtr battery() const; |
323 | |
324 | /*! |
325 | * Returns the input interface for the device. |
326 | * |
327 | * Only input devices will have valid input interface. |
328 | * |
329 | * Returns null if device has no input. |
330 | */ |
331 | InputPtr input() const; |
332 | |
333 | /*! |
334 | * Returns the media player interface for the device. |
335 | * |
336 | * Only devices with connected appropriate profile will |
337 | * have valid media player interface. |
338 | * |
339 | * Returns null if device has no media player. |
340 | */ |
341 | MediaPlayerPtr mediaPlayer() const; |
342 | |
343 | /*! |
344 | * Returns the media transport interface for the device. |
345 | * |
346 | * Only devices with connected appropriate profile will |
347 | * have valid media transport interface. |
348 | * |
349 | * Returns null if device has no media transport. |
350 | */ |
351 | MediaTransportPtr mediaTransport() const; |
352 | |
353 | /*! |
354 | * Returns the adapter that discovered this device. |
355 | */ |
356 | AdapterPtr adapter() const; |
357 | |
358 | /*! |
359 | * Returns a list of services known by the device. |
360 | */ |
361 | QList<GattServiceRemotePtr> gattServices() const; |
362 | /*! |
363 | * Returns a string of the device \a type. |
364 | */ |
365 | static QString typeToString(Device::Type type); |
366 | |
367 | /*! |
368 | * Returns a string for the device type \a typeString. |
369 | */ |
370 | static Device::Type stringToType(const QString &typeString); |
371 | |
372 | public Q_SLOTS: |
373 | /*! |
374 | * Connects all auto-connectable profiles of the device. |
375 | * |
376 | * This method indicates success if at least one profile was connected. |
377 | * |
378 | * Possible errors: |
379 | * |
380 | * \list |
381 | * \li PendingCall::NotReady |
382 | * \li PendingCall::Failed |
383 | * \li PendingCall::InProgress |
384 | * \li PendingCall::AlreadyConnected |
385 | * \endlist |
386 | * |
387 | * Returns void pending call. |
388 | */ |
389 | PendingCall *connectToDevice(); |
390 | |
391 | /*! |
392 | * Disconnects all connected profiles of the device. |
393 | * |
394 | * This method can be used to cancel not-yet finished connectDevice() call. |
395 | * |
396 | * Possible errors: |
397 | * |
398 | * \list |
399 | * \li PendingCall::NotConnected |
400 | * \endlist |
401 | * |
402 | * Returns void pending call. |
403 | */ |
404 | PendingCall *disconnectFromDevice(); |
405 | |
406 | /*! |
407 | * Connects a specific profile of the device with the given service \a uuid. |
408 | * |
409 | * Possible errors: |
410 | * |
411 | * \list |
412 | * \li PendingCall::DoesNotExist |
413 | * \li PendingCall::AlreadyConnected |
414 | * \li PendingCall::ConnectFailed |
415 | * \endlist |
416 | * |
417 | * Returns void pending call. |
418 | */ |
419 | PendingCall *connectProfile(const QString &uuid); |
420 | |
421 | /*! |
422 | * Disconnects a specific profile of the device with the given service \a uuid. |
423 | * |
424 | * Possible errors: |
425 | * |
426 | * \list |
427 | * \li PendingCall::DoesNotExist |
428 | * \li PendingCall::Failed |
429 | * \li PendingCall::NotConnected |
430 | * \li PendingCall::NotSupported |
431 | * \endlist |
432 | * |
433 | * Returns void pending call. |
434 | */ |
435 | PendingCall *disconnectProfile(const QString &uuid); |
436 | |
437 | /*! |
438 | * Initiates a pairing with the device. |
439 | * |
440 | * Possible errors: |
441 | * |
442 | * \list |
443 | * \li PendingCall::InvalidArguments |
444 | * \li PendingCall::Failed |
445 | * \li PendingCall::AlreadyExists |
446 | * \li PendingCall::AuthenticationCanceled |
447 | * \li PendingCall::AuthenticationFailed |
448 | * \li PendingCall::AuthenticationRejected |
449 | * \li PendingCall::AuthenticationTimeout |
450 | * \li PendingCall::ConnectionAttemptFailed |
451 | * \endlist |
452 | * |
453 | * Returns void pending call. |
454 | */ |
455 | PendingCall *pair(); |
456 | |
457 | /*! |
458 | * Cancels a pairing with the device. |
459 | * |
460 | * This method can be used to cancel pairing operation initiated with pair(). |
461 | * |
462 | * Possible errors: |
463 | * |
464 | * \list |
465 | * \li PendingCall::DoesNotExist |
466 | * \li PendingCall::Failed |
467 | * \endlist |
468 | * |
469 | * Returns void pending call. |
470 | */ |
471 | PendingCall *cancelPairing(); |
472 | |
473 | Q_SIGNALS: |
474 | /*! |
475 | * Indicates that the device was removed. |
476 | */ |
477 | void deviceRemoved(DevicePtr device); |
478 | |
479 | /*! |
480 | * Indicates that at least one of the device's properties has changed. |
481 | */ |
482 | void deviceChanged(DevicePtr device); |
483 | |
484 | /*! |
485 | * Indicates that a new service was added (eg. found by connection). |
486 | */ |
487 | void gattServiceAdded(GattServiceRemotePtr service); |
488 | |
489 | /*! |
490 | * Indicates that the device GATT services list has changed. |
491 | */ |
492 | void gattServicesChanged(QList<GattServiceRemotePtr> services); |
493 | |
494 | /*! |
495 | * Indicates that a service was removed. |
496 | */ |
497 | void gattServiceRemoved(GattServiceRemotePtr service); |
498 | |
499 | /*! |
500 | * Indicates that at least one of the device's services has changed. |
501 | */ |
502 | void gattServiceChanged(GattServiceRemotePtr service); |
503 | |
504 | /*! |
505 | * Indicates that the device's name has changed. |
506 | */ |
507 | void nameChanged(const QString &name); |
508 | |
509 | /*! |
510 | * Indicates that the device's address has changed. |
511 | */ |
512 | void addressChanged(const QString &address); |
513 | |
514 | /*! |
515 | * Indicates that the device's friendly name has changed. |
516 | */ |
517 | void friendlyNameChanged(const QString &friendlyName); |
518 | |
519 | /*! |
520 | * Indicates that the device's remote name has changed. |
521 | */ |
522 | void remoteNameChanged(const QString &remoteName); |
523 | |
524 | /*! |
525 | * Indicates that the device's class has changed. |
526 | */ |
527 | void deviceClassChanged(quint32 deviceClass); |
528 | |
529 | /*! |
530 | * Indicates that the device's type has changed. |
531 | */ |
532 | void typeChanged(Type type); |
533 | |
534 | /*! |
535 | * Indicates that the device's appearance has changed. |
536 | */ |
537 | void appearanceChanged(quint16 appearance); |
538 | |
539 | /*! |
540 | * Indicates that the device's icon has changed. |
541 | */ |
542 | void iconChanged(const QString &icon); |
543 | |
544 | /*! |
545 | * Indicates that the device's paired state has changed. |
546 | */ |
547 | void pairedChanged(bool paired); |
548 | |
549 | /*! |
550 | * Indicates that the device's trusted state has changed. |
551 | */ |
552 | void trustedChanged(bool trusted); |
553 | |
554 | /*! |
555 | * Indicates that the device's blocked state has changed. |
556 | */ |
557 | void blockedChanged(bool blocked); |
558 | |
559 | /*! |
560 | * Indicates that the device's legacy pairing state has changed. |
561 | */ |
562 | void legacyPairingChanged(bool legacyPairing); |
563 | |
564 | /*! |
565 | * Indicates that the device's RSSI has changed. |
566 | */ |
567 | void (qint16 ); |
568 | |
569 | /*! |
570 | * Indicates that the device's manufacturer data has changed. |
571 | */ |
572 | void manufacturerDataChanged(ManData man); |
573 | |
574 | /*! |
575 | * Indicates that the device's servicesResolved state has changed. |
576 | */ |
577 | void servicesResolvedChanged(bool servicesResolved); |
578 | |
579 | /*! |
580 | * Indicates that the device's connected state has changed. |
581 | */ |
582 | void connectedChanged(bool connected); |
583 | |
584 | /*! |
585 | * Indicates that the device's UUIDs has changed. |
586 | */ |
587 | void uuidsChanged(const QStringList &uuids); |
588 | |
589 | /*! |
590 | * Indicates that the device's modalias has changed. |
591 | */ |
592 | void modaliasChanged(const QString &modalias); |
593 | |
594 | /*! |
595 | * Indicates that the device's service data has changed. |
596 | * \since 5.72 |
597 | */ |
598 | void serviceDataChanged(const QHash<QString, QByteArray> &serviceData); |
599 | |
600 | /*! |
601 | * Indicates that the device's battery has changed. |
602 | */ |
603 | void batteryChanged(BatteryPtr battery); |
604 | |
605 | /*! |
606 | * Indicates that the device's input has changed. |
607 | */ |
608 | void inputChanged(InputPtr input); |
609 | |
610 | /*! |
611 | * Indicates that the device's media player has changed. |
612 | */ |
613 | void mediaPlayerChanged(MediaPlayerPtr mediaPlayer); |
614 | |
615 | /*! |
616 | * Indicates that the device's media transport has changed. |
617 | */ |
618 | void mediaTransportChanged(MediaTransportPtr mediaTransport); |
619 | |
620 | private: |
621 | BLUEZQT_NO_EXPORT explicit Device(const QString &path, const QVariantMap &properties, AdapterPtr adapter); |
622 | |
623 | std::unique_ptr<class DevicePrivate> const d; |
624 | |
625 | friend class DevicePrivate; |
626 | friend class ManagerPrivate; |
627 | friend class Adapter; |
628 | }; |
629 | |
630 | } // namespace BluezQt |
631 | |
632 | Q_DECLARE_METATYPE(BluezQt::ManData) |
633 | |
634 | #endif // BLUEZQT_DEVICE_H |
635 | |