File indexing completed on 2024-12-08 12:15:32
0001 /* 0002 * BluezQt - Asynchronous BlueZ wrapper library 0003 * 0004 * SPDX-FileCopyrightText: 2014-2015 David Rosca <nowrep@gmail.com> 0005 * 0006 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #ifndef BLUEZQT_DEVICE_H 0010 #define BLUEZQT_DEVICE_H 0011 0012 #include <QObject> 0013 0014 #include "bluezqt_export.h" 0015 #include "gattserviceremote.h" 0016 #include "input.h" 0017 #include "mediaplayer.h" 0018 #include "mediatransport.h" 0019 namespace BluezQt 0020 { 0021 class Adapter; 0022 class PendingCall; 0023 0024 /** 0025 * @class BluezQt::Device device.h <BluezQt/Device> 0026 * 0027 * Bluetooth device. 0028 * 0029 * This class represents a Bluetooth device. 0030 */ 0031 class BLUEZQT_EXPORT Device : public QObject 0032 { 0033 Q_OBJECT 0034 0035 Q_PROPERTY(QString ubi READ ubi) 0036 Q_PROPERTY(QString address READ address NOTIFY addressChanged) 0037 Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) 0038 Q_PROPERTY(QString friendlyName READ friendlyName NOTIFY friendlyNameChanged) 0039 Q_PROPERTY(QString remoteName READ remoteName NOTIFY remoteNameChanged) 0040 Q_PROPERTY(quint32 deviceClass READ deviceClass NOTIFY deviceClassChanged) 0041 Q_PROPERTY(Type type READ type NOTIFY typeChanged) 0042 Q_PROPERTY(quint16 appearance READ appearance NOTIFY appearanceChanged) 0043 Q_PROPERTY(QString icon READ icon NOTIFY iconChanged) 0044 Q_PROPERTY(bool paired READ isPaired NOTIFY pairedChanged) 0045 Q_PROPERTY(bool trusted READ isTrusted WRITE setTrusted NOTIFY trustedChanged) 0046 Q_PROPERTY(bool blocked READ isBlocked WRITE setBlocked NOTIFY blockedChanged) 0047 Q_PROPERTY(bool legacyPairing READ hasLegacyPairing NOTIFY legacyPairingChanged) 0048 Q_PROPERTY(qint16 rssi READ rssi NOTIFY rssiChanged) 0049 Q_PROPERTY(ManData manufacturerData READ manufacturerData NOTIFY manufacturerDataChanged) 0050 Q_PROPERTY(bool servicesResolved READ isServicesResolved NOTIFY servicesResolvedChanged) 0051 Q_PROPERTY(bool connected READ isConnected NOTIFY connectedChanged) 0052 Q_PROPERTY(QStringList uuids READ uuids NOTIFY uuidsChanged) 0053 Q_PROPERTY(QString modalias READ modalias NOTIFY modaliasChanged) 0054 Q_PROPERTY(BatteryPtr battery READ battery NOTIFY batteryChanged) 0055 Q_PROPERTY(InputPtr input READ input NOTIFY inputChanged) 0056 Q_PROPERTY(MediaPlayerPtr mediaPlayer READ mediaPlayer NOTIFY mediaPlayerChanged) 0057 Q_PROPERTY(MediaTransportPtr mediaTransport READ mediaTransport NOTIFY mediaTransportChanged) 0058 Q_PROPERTY(AdapterPtr adapter READ adapter) 0059 Q_PROPERTY(QList<GattServiceRemotePtr> gattServices READ gattServices NOTIFY gattServicesChanged) 0060 0061 public: 0062 /** 0063 * %Device types. 0064 */ 0065 enum Type { 0066 /** The device is a phone. */ 0067 Phone, 0068 /** The device is a modem. */ 0069 Modem, 0070 /** The device is a computer. */ 0071 Computer, 0072 /** The device is a network. */ 0073 Network, 0074 /** The device is a headset. */ 0075 Headset, 0076 /** The device is a headphones. */ 0077 Headphones, 0078 /** The device is an uncategorized audio video device. */ 0079 AudioVideo, 0080 /** The device is a keyboard. */ 0081 Keyboard, 0082 /** The device is a mouse. */ 0083 Mouse, 0084 /** The device is a joypad. */ 0085 Joypad, 0086 /** The device is a graphics tablet (input device). */ 0087 Tablet, 0088 /** The device is an uncategorized peripheral device. */ 0089 Peripheral, 0090 /** The device is a camera. */ 0091 Camera, 0092 /** The device is a printer. */ 0093 Printer, 0094 /** The device is an uncategorized imaging device. */ 0095 Imaging, 0096 /** The device is a wearable device. */ 0097 Wearable, 0098 /** The device is a toy. */ 0099 Toy, 0100 /** The device is a health device. */ 0101 Health, 0102 /** The device is not of any of the known types. */ 0103 Uncategorized, 0104 }; 0105 Q_ENUM(Type) 0106 0107 /** 0108 * Destroys a Device object. 0109 */ 0110 ~Device() override; 0111 0112 /** 0113 * Returns a shared pointer from this. 0114 * 0115 * @return DevicePtr 0116 */ 0117 DevicePtr toSharedPtr() const; 0118 0119 /** 0120 * Returns an UBI of the device. 0121 * 0122 * Example UBI: "/org/bluez/hci0/dev_40_79_6A_0C_39_75" 0123 * 0124 * @return UBI of device 0125 */ 0126 QString ubi() const; 0127 0128 /** 0129 * Returns an address of the device. 0130 * 0131 * Example address: "40:79:6A:0C:39:75" 0132 * 0133 * @return address of device 0134 */ 0135 QString address() const; 0136 0137 /** 0138 * Returns a name of the device. 0139 * 0140 * If the name of the device wasn't previously changed, 0141 * remoteName is returned. 0142 * 0143 * @return name of device 0144 */ 0145 QString name() const; 0146 0147 /** 0148 * Sets the name of the device. 0149 * 0150 * @param name name for device 0151 * @return void pending call 0152 */ 0153 PendingCall *setName(const QString &name); 0154 0155 /** 0156 * Returns a friendly name of the device. 0157 * 0158 * Friendly name is a string "name (remoteName)". 0159 * If the remoteName is same as name, it returns just name. 0160 * 0161 * @return friendly name of device 0162 */ 0163 QString friendlyName() const; 0164 0165 /** 0166 * Returns a remote name of the device. 0167 * 0168 * @return remote name of device 0169 */ 0170 QString remoteName() const; 0171 0172 /** 0173 * Returns a class of the device. 0174 * 0175 * In case of Bluetooth Low Energy only devices, 0176 * device class is invalid (0). 0177 * 0178 * @see type() const 0179 * 0180 * @return class of device 0181 */ 0182 quint32 deviceClass() const; 0183 0184 /** 0185 * Returns a type of the device. 0186 * 0187 * Type of device is deduced from its class (for Bluetooth Classic devices) 0188 * or its appearance (for Bluetooth Low Energy devices). 0189 * 0190 * @see deviceClass() const 0191 * @see appearance() const 0192 * 0193 * @return type of device 0194 */ 0195 Device::Type type() const; 0196 0197 /** 0198 * Returns an appearance of the device. 0199 * 0200 * @return appearance of device 0201 */ 0202 quint16 appearance() const; 0203 0204 /** 0205 * Returns an icon name of the device. 0206 * 0207 * In case the icon is empty, "preferences-system-bluetooth" is returned. 0208 * 0209 * @return icon name of device 0210 */ 0211 QString icon() const; 0212 0213 /** 0214 * Returns whether the device is paired. 0215 * 0216 * @return true if device is paired 0217 */ 0218 bool isPaired() const; 0219 0220 /** 0221 * Returns whether the device is trusted. 0222 * 0223 * @return true if device is trusted 0224 */ 0225 bool isTrusted() const; 0226 0227 /** 0228 * Sets the trusted state of the device. 0229 * 0230 * @param trusted trusted state 0231 * @return void pending call 0232 */ 0233 PendingCall *setTrusted(bool trusted); 0234 0235 /** 0236 * Returns whether the device is blocked. 0237 * 0238 * @return true if device is blocked 0239 */ 0240 bool isBlocked() const; 0241 0242 /** 0243 * Sets the blocked state of the device. 0244 * 0245 * @param blocked blocked state 0246 * @return void pending call 0247 */ 0248 PendingCall *setBlocked(bool blocked); 0249 0250 /** 0251 * Returns whether the device has legacy pairing. 0252 * 0253 * @return true if device has legacy pairing 0254 */ 0255 bool hasLegacyPairing() const; 0256 0257 /** 0258 * Returns Received Signal Strength Indicator of the device. 0259 * 0260 * The bigger value indicates better signal strength. 0261 * 0262 * @note RSSI is only updated during discovery. 0263 * 0264 * @return RSSI of device 0265 */ 0266 qint16 rssi() const; 0267 0268 /** 0269 * Returns manufacturer specific advertisement data. 0270 * 0271 * @note Keys are 16 bits Manufacturer ID followed by 0272 * its byte array value. 0273 * 0274 * @return manufacturerData of device. 0275 */ 0276 ManData manufacturerData() const; 0277 0278 /** 0279 * Returns whether or not service discovery has been resolved. 0280 * 0281 * @return true if servicesResolved 0282 */ 0283 bool isServicesResolved() const; 0284 0285 /** 0286 * Returns whether the device is connected. 0287 * 0288 * @return true if connected 0289 */ 0290 bool isConnected() const; 0291 0292 /** 0293 * Returns UUIDs of supported services by the device. 0294 * 0295 * UUIDs will always be returned in uppercase. 0296 * 0297 * @return UUIDs of supported services 0298 */ 0299 QStringList uuids() const; 0300 0301 /** 0302 * Returns remote device ID in modalias format. 0303 * 0304 * @return device modalias 0305 */ 0306 QString modalias() const; 0307 0308 /** 0309 * Returns the service advertisement data. 0310 * 0311 * @returns A hash with keys being the UUIDs in and values being the raw service data value. 0312 * @since 5.72 0313 */ 0314 QHash<QString, QByteArray> serviceData() const; 0315 0316 /** 0317 * Returns the battery interface for the device. 0318 * 0319 * @return null if device has no battery 0320 * @since 5.66 0321 */ 0322 BatteryPtr battery() const; 0323 0324 /** 0325 * Returns the input interface for the device. 0326 * 0327 * Only input devices will have valid input interface. 0328 * 0329 * @return null if device have no input 0330 */ 0331 InputPtr input() const; 0332 0333 /** 0334 * Returns the media player interface for the device. 0335 * 0336 * Only devices with connected appropriate profile will 0337 * have valid media player interface. 0338 * 0339 * @return null if device have no media player 0340 */ 0341 MediaPlayerPtr mediaPlayer() const; 0342 0343 /** 0344 * Returns the media transport interface for the device. 0345 * 0346 * Only devices with connected appropriate profile will 0347 * have valid media transport interface. 0348 * 0349 * @return null if device have no media transport 0350 */ 0351 MediaTransportPtr mediaTransport() const; 0352 0353 /** 0354 * Returns an adapter that discovered this device. 0355 * 0356 * @return adapter of device 0357 */ 0358 AdapterPtr adapter() const; 0359 0360 /** 0361 * Returns list of services known by the device. 0362 * 0363 * @return list of services 0364 */ 0365 QList<GattServiceRemotePtr> gattServices() const; 0366 /** 0367 * Returns a string for device type. 0368 * 0369 * @param type device type 0370 * @return device type string 0371 */ 0372 static QString typeToString(Device::Type type); 0373 0374 /** 0375 * Returns a device type for string. 0376 * 0377 * @param typeString type string 0378 * @return device type 0379 */ 0380 static Device::Type stringToType(const QString &typeString); 0381 0382 public Q_SLOTS: 0383 /** 0384 * Connects all auto-connectable profiles of the device. 0385 * 0386 * This method indicates success if at least one profile was connected. 0387 * 0388 * Possible errors: PendingCall::NotReady, PendingCall::Failed, 0389 * PendingCall::InProgress, PendingCall::AlreadyConnected 0390 * 0391 * @return void pending call 0392 */ 0393 PendingCall *connectToDevice(); 0394 0395 /** 0396 * Disconnects all connected profiles of the device. 0397 * 0398 * This method can be used to cancel not-yet finished connectDevice() call. 0399 * 0400 * Possible errors: PendingCall::NotConnected 0401 * 0402 * @return void pending call 0403 */ 0404 PendingCall *disconnectFromDevice(); 0405 0406 /** 0407 * Connects a specific profile of the device. 0408 * 0409 * Possible errors: PendingCall::DoesNotExist, PendingCall::AlreadyConnected, 0410 * PendingCall::ConnectFailed 0411 * 0412 * @param uuid service UUID 0413 * @return void pending call 0414 */ 0415 PendingCall *connectProfile(const QString &uuid); 0416 0417 /** 0418 * Disconnects a specific profile of the device. 0419 * 0420 * Possible errors: PendingCall::DoesNotExist, PendingCall::Failed, 0421 * PendingCall::NotConnected, PendingCall::NotSupported 0422 * 0423 * @param uuid service UUID 0424 * @return void pending call 0425 */ 0426 PendingCall *disconnectProfile(const QString &uuid); 0427 0428 /** 0429 * Initiates a pairing with the device. 0430 * 0431 * Possible errors: PendingCall::InvalidArguments, PendingCall::Failed, 0432 * PendingCall::AlreadyExists, PendingCall::AuthenticationCanceled, 0433 * PendingCall::AuthenticationFailed, PendingCall::AuthenticationRejected, 0434 * PendingCall::AuthenticationTimeout, PendingCall::ConnectionAttemptFailed 0435 * 0436 * @return void pending call 0437 */ 0438 PendingCall *pair(); 0439 0440 /** 0441 * Cancels a pairing with the device. 0442 * 0443 * This method can be used to cancel pairing operation initiated with pair(). 0444 * 0445 * Possible errors: PendingCall::DoesNotExist, PendingCall::Failed 0446 * 0447 * @return void pending call 0448 */ 0449 PendingCall *cancelPairing(); 0450 0451 Q_SIGNALS: 0452 /** 0453 * Indicates that the device was removed. 0454 */ 0455 void deviceRemoved(DevicePtr device); 0456 0457 /** 0458 * Indicates that at least one of the device's properties have changed. 0459 */ 0460 void deviceChanged(DevicePtr device); 0461 0462 /** 0463 * Indicates that a new service was added (eg. found by connection). 0464 */ 0465 void gattServiceAdded(GattServiceRemotePtr service); 0466 0467 /** 0468 * Indicates that device GATT services list has changed 0469 */ 0470 void gattServicesChanged(QList<GattServiceRemotePtr> services); 0471 0472 /** 0473 * Indicates that a service was removed. 0474 */ 0475 void gattServiceRemoved(GattServiceRemotePtr service); 0476 0477 /** 0478 * Indicates that at least one of the device's services have changed. 0479 */ 0480 void gattServiceChanged(GattServiceRemotePtr service); 0481 0482 /** 0483 * Indicates that device's name have changed. 0484 */ 0485 void nameChanged(const QString &name); 0486 0487 /** 0488 * Indicates that device's address have changed. 0489 */ 0490 void addressChanged(const QString &address); 0491 0492 /** 0493 * Indicates that device's friendly name have changed. 0494 */ 0495 void friendlyNameChanged(const QString &friendlyName); 0496 0497 /** 0498 * Indicates that device's remote name have changed. 0499 */ 0500 void remoteNameChanged(const QString &remoteName); 0501 0502 /** 0503 * Indicates that device's class have changed. 0504 */ 0505 void deviceClassChanged(quint32 deviceClass); 0506 0507 /** 0508 * Indicates that device's type have changed. 0509 */ 0510 void typeChanged(Type type); 0511 0512 /** 0513 * Indicates that device's appearance have changed. 0514 */ 0515 void appearanceChanged(quint16 appearance); 0516 0517 /** 0518 * Indicates that device's icon have changed. 0519 */ 0520 void iconChanged(const QString &icon); 0521 0522 /** 0523 * Indicates that device's paired state have changed. 0524 */ 0525 void pairedChanged(bool paired); 0526 0527 /** 0528 * Indicates that device's trusted state have changed. 0529 */ 0530 void trustedChanged(bool trusted); 0531 0532 /** 0533 * Indicates that device's blocked state have changed. 0534 */ 0535 void blockedChanged(bool blocked); 0536 0537 /** 0538 * Indicates that device's legacy pairing state have changed. 0539 */ 0540 void legacyPairingChanged(bool legacyPairing); 0541 0542 /** 0543 * Indicates that device's RSSI have changed. 0544 */ 0545 void rssiChanged(qint16 rssi); 0546 0547 /** 0548 * Indicates that device's manufacturer data have changed. 0549 */ 0550 void manufacturerDataChanged(ManData man); 0551 0552 /** 0553 * Indicates that device's servicesResolved state have changed. 0554 */ 0555 void servicesResolvedChanged(bool servicesResolved); 0556 0557 /** 0558 * Indicates that device's connected state have changed. 0559 */ 0560 void connectedChanged(bool connected); 0561 0562 /** 0563 * Indicates that device's UUIDs have changed. 0564 */ 0565 void uuidsChanged(const QStringList &uuids); 0566 0567 /** 0568 * Indicates that device's modalias have changed. 0569 */ 0570 void modaliasChanged(const QString &modalias); 0571 0572 /** 0573 * Indicates that the device's service data has changed. 0574 * @since 5.72 0575 */ 0576 void serviceDataChanged(const QHash<QString, QByteArray> &serviceData); 0577 0578 /** 0579 * Indicates that device's battery has changed. 0580 */ 0581 void batteryChanged(BatteryPtr battery); 0582 0583 /** 0584 * Indicates that device's input have changed. 0585 */ 0586 void inputChanged(InputPtr input); 0587 0588 /** 0589 * Indicates that device's media player have changed. 0590 */ 0591 void mediaPlayerChanged(MediaPlayerPtr mediaPlayer); 0592 0593 /** 0594 * Indicates that device's media transport have changed. 0595 */ 0596 void mediaTransportChanged(MediaTransportPtr mediaTransport); 0597 0598 private: 0599 BLUEZQT_NO_EXPORT explicit Device(const QString &path, const QVariantMap &properties, AdapterPtr adapter); 0600 0601 class DevicePrivate *const d; 0602 0603 friend class DevicePrivate; 0604 friend class ManagerPrivate; 0605 friend class Adapter; 0606 }; 0607 0608 } // namespace BluezQt 0609 0610 Q_DECLARE_METATYPE(BluezQt::ManData) 0611 0612 #endif // BLUEZQT_DEVICE_H