| 1 | // Copyright (C) 2016 The Qt Company Ltd. |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
| 3 | |
| 4 | #include "qbluetoothlocaldevice.h" |
| 5 | #include "qbluetoothlocaldevice_p.h" |
| 6 | #include "qbluetoothaddress.h" |
| 7 | |
| 8 | #include <QtCore/QString> |
| 9 | |
| 10 | QT_BEGIN_NAMESPACE |
| 11 | |
| 12 | QT_IMPL_METATYPE_EXTERN_TAGGED(QBluetoothLocalDevice::Pairing, QBluetoothLocalDevice__Pairing) |
| 13 | QT_IMPL_METATYPE_EXTERN_TAGGED(QBluetoothLocalDevice::HostMode, QBluetoothLocalDevice__HostMode) |
| 14 | QT_IMPL_METATYPE_EXTERN_TAGGED(QBluetoothLocalDevice::Error, QBluetoothLocalDevice__Error) |
| 15 | |
| 16 | /*! |
| 17 | \class QBluetoothLocalDevice |
| 18 | \inmodule QtBluetooth |
| 19 | \brief The QBluetoothLocalDevice class enables access to the local Bluetooth |
| 20 | device. |
| 21 | |
| 22 | \since 5.2 |
| 23 | |
| 24 | QBluetoothLocalDevice provides functions for getting and setting the state of local Bluetooth |
| 25 | devices. |
| 26 | |
| 27 | On iOS, this class cannot be used because the platform does not expose |
| 28 | any data or API which may provide information on the local Bluetooth device. |
| 29 | */ |
| 30 | |
| 31 | /*! |
| 32 | \enum QBluetoothLocalDevice::Pairing |
| 33 | |
| 34 | This enum describes the pairing state between the two Bluetooth devices. |
| 35 | |
| 36 | \value Unpaired The Bluetooth devices are not paired. |
| 37 | \value Paired The Bluetooth devices are paired. The system will prompt the user for |
| 38 | authorization when the remote device initiates a connection to the |
| 39 | local device. |
| 40 | \value AuthorizedPaired The Bluetooth devices are paired. The system will not prompt the user |
| 41 | for authorization when the remote device initiates a connection to the |
| 42 | local device. |
| 43 | */ |
| 44 | |
| 45 | /*! |
| 46 | \enum QBluetoothLocalDevice::Error |
| 47 | |
| 48 | This enum describes errors that maybe returned |
| 49 | |
| 50 | \value NoError No known error |
| 51 | \value PairingError Error in pairing |
| 52 | \value [since 6.4] MissingPermissionsError The operating system requests |
| 53 | permissions which were not |
| 54 | granted by the user. |
| 55 | \value UnknownError Unknown error |
| 56 | |
| 57 | */ |
| 58 | |
| 59 | /*! |
| 60 | \enum QBluetoothLocalDevice::HostMode |
| 61 | |
| 62 | This enum describes the most of the local Bluetooth device. |
| 63 | |
| 64 | \value HostPoweredOff Power off the device |
| 65 | \value HostConnectable Remote Bluetooth devices can connect to the local Bluetooth device |
| 66 | if they have previously been paired with it or otherwise know its address. This powers up the |
| 67 | device if it was powered off. |
| 68 | \value HostDiscoverable Remote Bluetooth devices can discover the presence of the local |
| 69 | Bluetooth device. The device will also be connectable, and powered on. On Android, this mode can only be active |
| 70 | for a maximum of 5 minutes. |
| 71 | \value HostDiscoverableLimitedInquiry Remote Bluetooth devices can discover the presence of the local |
| 72 | Bluetooth device when performing a limited inquiry. This should be used for locating services that are |
| 73 | only made discoverable for a limited period of time. This can speed up discovery between gaming devices, |
| 74 | as service discovery can be skipped on devices not in LimitedInquiry mode. In this mode, the device will |
| 75 | be connectable and powered on, if required. This mode is is not supported on Android. |
| 76 | |
| 77 | \note On \macos, it is not possible to set the \l hostMode(). The |
| 78 | reported host modes are limited to HostPoweredOff and HostConnectable. |
| 79 | |
| 80 | \note On Windows, it is not possible to set the \l hostMode() to |
| 81 | HostDiscoverable or HostDiscoverableLimitedInquiry. Using these modes is |
| 82 | equivalent to HostConnectable. |
| 83 | |
| 84 | \note Starting from Android 13 (API level 33) the HostPoweredOff state relies on |
| 85 | non-public Android API as the public one has been deprecated, see |
| 86 | (\l {https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#disable()} |
| 87 | {disable()}). This may change in a future version of Android. |
| 88 | |
| 89 | \note At least on Android 12 the device's Bluetooth visibility setting may dictate the result |
| 90 | of setting either HostDiscoverable or HostConnectable. For example if the visibility is set |
| 91 | \e off, it may not be possible to enter the HostDiscoverable mode, but HostConnectable will be |
| 92 | used instead. This may change in future version of Android. |
| 93 | |
| 94 | */ |
| 95 | |
| 96 | void registerQBluetoothLocalDeviceMetaType() |
| 97 | { |
| 98 | static bool initDone = false; |
| 99 | if (!initDone) { |
| 100 | qRegisterMetaType<QBluetoothLocalDevice::HostMode>(); |
| 101 | qRegisterMetaType<QBluetoothLocalDevice::Pairing>(); |
| 102 | qRegisterMetaType<QBluetoothLocalDevice::Error>(); |
| 103 | initDone = true; |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | #ifndef QT_OSX_BLUETOOTH |
| 108 | |
| 109 | /*! |
| 110 | Destroys the QBluetoothLocalDevice. |
| 111 | */ |
| 112 | QBluetoothLocalDevice::~QBluetoothLocalDevice() |
| 113 | { |
| 114 | delete d_ptr; |
| 115 | } |
| 116 | |
| 117 | /*! |
| 118 | Returns \c true if the QBluetoothLocalDevice represents an available local Bluetooth device; |
| 119 | otherwise return false. |
| 120 | |
| 121 | If the local Bluetooth adapter represented by an instance of this class |
| 122 | is removed from the system (e.g. removal of the underlying Bluetooth dongle) |
| 123 | then this instance will become invalid. An already invalid QBluetoothLocalDevice instance |
| 124 | remains invalid even if the same Bluetooth adapter is returned to |
| 125 | the system. |
| 126 | |
| 127 | //! [android-permissions-valid] |
| 128 | \note Starting from Android 12 (API level 31), the construction of this class requires |
| 129 | \l {https://developer.android.com/guide/topics/connectivity/bluetooth/permissions} |
| 130 | {bluetooth runtime permissions} (\e BLUETOOTH_SCAN and \e BLUETOOTH_CONNECT). If the |
| 131 | permissions are not granted, the device will not be valid. |
| 132 | //! [android-permissions-valid] |
| 133 | |
| 134 | \sa allDevices() |
| 135 | */ |
| 136 | bool QBluetoothLocalDevice::isValid() const |
| 137 | { |
| 138 | if (d_ptr) |
| 139 | return d_ptr->isValid(); |
| 140 | return false; |
| 141 | } |
| 142 | |
| 143 | #endif |
| 144 | |
| 145 | /*! |
| 146 | \fn void QBluetoothLocalDevice::setHostMode(QBluetoothLocalDevice::HostMode mode) |
| 147 | |
| 148 | Sets the host mode of this local Bluetooth device to \a mode. |
| 149 | |
| 150 | Some transitions such as turning the device on or off may take some time. Therefore |
| 151 | subsequent calls should only be made once the \l hostModeStateChanged() signal |
| 152 | has concluded the previous request. If this is ignored the result of such a series |
| 153 | of calls is not well defined. |
| 154 | |
| 155 | \note Due to varying security policies on the supported platforms, this method may have |
| 156 | differing behaviors on the various platforms. For example the system may ask the user for |
| 157 | confirmation before turning Bluetooth on or off and not all host modes may be supported. |
| 158 | On \macos, it is not possbile to programmatically change the \l hostMode(). |
| 159 | A user can only switch Bluetooth on/off in the System Preferences. |
| 160 | On Windows this method \e must be called from the UI thread because it might |
| 161 | require user confirmation. |
| 162 | Please refer to the platform specific Bluetooth documentation for details. |
| 163 | */ |
| 164 | |
| 165 | /*! |
| 166 | \fn QBluetoothLocalDevice::HostMode QBluetoothLocalDevice::hostMode() const |
| 167 | |
| 168 | Returns the current host mode of this local Bluetooth device. On \macos, it is either |
| 169 | HostPoweredOff or HostConnectable. |
| 170 | */ |
| 171 | |
| 172 | /*! |
| 173 | \fn QBluetoothLocalDevice::name() const |
| 174 | |
| 175 | Returns the name assgined by the user to this Bluetooth device. |
| 176 | */ |
| 177 | |
| 178 | /*! |
| 179 | \fn QBluetoothLocalDevice::address() const |
| 180 | |
| 181 | Returns the MAC address of this Bluetooth device. |
| 182 | |
| 183 | \note On Android, this function always returns the constant |
| 184 | value \c {02:00:00:00:00:00} as local address starting with Android 6.0. |
| 185 | The programmatic access to the device's local MAC address was removed. |
| 186 | */ |
| 187 | |
| 188 | /*! |
| 189 | \fn QList<QBluetoothLocalDevice> QBluetoothLocalDevice::allDevices() |
| 190 | |
| 191 | Returns a list of all available local Bluetooth devices. On \macos, there is |
| 192 | only the "default" local device. |
| 193 | */ |
| 194 | |
| 195 | /*! |
| 196 | \fn QBluetoothLocalDevice::powerOn() |
| 197 | |
| 198 | Powers on the device after returning it to the hostMode() state, if it was powered off. |
| 199 | |
| 200 | \note Due to varying security policies on the supported platforms, this method may have |
| 201 | differing behaviors on the various platforms. For example |
| 202 | the system may ask the user for confirmation before turning Bluetooth on or off. |
| 203 | On \macos it is not possible to power on/off Bluetooth. |
| 204 | Please refer to the platform specific Bluetooth documentation for details. |
| 205 | */ |
| 206 | |
| 207 | /*! |
| 208 | \fn QBluetoothLocalDevice::QBluetoothLocalDevice(QObject *parent) |
| 209 | Constructs a QBluetoothLocalDevice with \a parent. |
| 210 | |
| 211 | \include qbluetoothlocaldevice.cpp android-permissions-valid |
| 212 | \sa isValid() |
| 213 | */ |
| 214 | |
| 215 | /*! |
| 216 | \fn QBluetoothLocalDevice::hostModeStateChanged(QBluetoothLocalDevice::HostMode state) |
| 217 | The \a state of the host has transitioned to a different HostMode. |
| 218 | */ |
| 219 | |
| 220 | /*! |
| 221 | \fn QBluetoothLocalDevice::deviceConnected(const QBluetoothAddress &address) |
| 222 | \since 5.3 |
| 223 | |
| 224 | This signal is emitted when the local device establishes a connection to a remote device |
| 225 | with \a address. |
| 226 | |
| 227 | \sa deviceDisconnected(), connectedDevices() |
| 228 | */ |
| 229 | |
| 230 | /*! |
| 231 | \fn QBluetoothLocalDevice::deviceDisconnected(const QBluetoothAddress &address) |
| 232 | \since 5.3 |
| 233 | |
| 234 | This signal is emitted when the local device disconnects from a remote Bluetooth device |
| 235 | with \a address. |
| 236 | |
| 237 | \sa deviceConnected(), connectedDevices() |
| 238 | */ |
| 239 | |
| 240 | /*! |
| 241 | \fn QList<QBluetoothAddress> QBluetoothLocalDevice::connectedDevices() const |
| 242 | \since 5.3 |
| 243 | |
| 244 | Returns the list of connected devices. This list is different from the list of currently |
| 245 | paired devices. |
| 246 | |
| 247 | On Android and \macos, it is not possible to retrieve a list of connected devices. It is only possible to |
| 248 | listen to (dis)connect changes. For convenience, this class monitors all connect |
| 249 | and disconnect events since its instanciation and returns the current list when calling this function. |
| 250 | Therefore it is possible that this function returns an empty list shortly after creating an |
| 251 | instance. |
| 252 | |
| 253 | \sa deviceConnected(), deviceDisconnected() |
| 254 | */ |
| 255 | |
| 256 | /*! |
| 257 | \fn QBluetoothLocalDevice::pairingStatus(const QBluetoothAddress &address) const |
| 258 | |
| 259 | Returns the current bluetooth pairing status of \a address, if it's unpaired, paired, or paired and authorized. |
| 260 | */ |
| 261 | |
| 262 | /*! |
| 263 | \fn QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pairing pairing) |
| 264 | |
| 265 | Set the \a pairing status with \a address. The results are returned by the signal, pairingFinished(). |
| 266 | |
| 267 | On Android and \macos, AuthorizedPaired is not possible and will have the same behavior as Paired. |
| 268 | On Windows the exact pairing mode decision is up to the operating system. |
| 269 | |
| 270 | On \macos, it is not possible to unpair a device. If Unpaired is requested, \l pairingFinished() |
| 271 | is immediately emitted although the device remains paired. It is possible to request the pairing |
| 272 | for a previously unpaired device. In addition \l AuthorizedPaired has the same behavior as \l Paired. |
| 273 | |
| 274 | Caution: creating a pairing may take minutes, and may require the user to acknowledge. |
| 275 | */ |
| 276 | |
| 277 | /*! |
| 278 | \fn QBluetoothLocalDevice::pairingFinished(const QBluetoothAddress &address, |
| 279 | QBluetoothLocalDevice::Pairing pairing) |
| 280 | |
| 281 | Pairing or unpairing has completed with \a address. Current pairing status is in \a pairing. |
| 282 | If the pairing request was not successful, this signal will not be emitted. The errorOccurred() |
| 283 | signal is emitted if the pairing request failed. The signal is only ever emitted for pairing |
| 284 | requests which have previously requested by calling \l requestPairing() of the current object |
| 285 | instance. |
| 286 | */ |
| 287 | |
| 288 | /*! |
| 289 | \fn QBluetoothLocalDevice::errorOccurred(QBluetoothLocalDevice::Error error) |
| 290 | Signal emitted if there's an exceptional \a error while pairing. |
| 291 | |
| 292 | \since 6.2 |
| 293 | */ |
| 294 | |
| 295 | /*! |
| 296 | \fn QBluetoothLocalDevice::QBluetoothLocalDevice(const QBluetoothAddress &address, QObject *parent = 0) |
| 297 | |
| 298 | Construct new QBluetoothLocalDevice for \a address. If \a address is default constructed |
| 299 | the resulting local device selects the local default device. |
| 300 | |
| 301 | \include qbluetoothlocaldevice.cpp android-permissions-valid |
| 302 | \sa isValid() |
| 303 | */ |
| 304 | |
| 305 | QT_END_NAMESPACE |
| 306 | |
| 307 | #include "moc_qbluetoothlocaldevice.cpp" |
| 308 | |