| 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 | |
| 14 | namespace BluezQt |
| 15 | { |
| 16 | Device::Device(const QString &path, const QVariantMap &properties, AdapterPtr adapter) |
| 17 | : QObject() |
| 18 | , d(new DevicePrivate(path, properties, adapter)) |
| 19 | { |
| 20 | } |
| 21 | |
| 22 | Device::~Device() = default; |
| 23 | |
| 24 | DevicePtr Device::toSharedPtr() const |
| 25 | { |
| 26 | return d->q.toStrongRef(); |
| 27 | } |
| 28 | |
| 29 | QString Device::ubi() const |
| 30 | { |
| 31 | return d->m_bluezDevice->path(); |
| 32 | } |
| 33 | |
| 34 | QString Device::address() const |
| 35 | { |
| 36 | return d->m_address; |
| 37 | } |
| 38 | |
| 39 | QString Device::name() const |
| 40 | { |
| 41 | return d->m_alias; |
| 42 | } |
| 43 | |
| 44 | PendingCall *Device::setName(const QString &name) |
| 45 | { |
| 46 | return new PendingCall(d->setDBusProperty(QStringLiteral("Alias" ), value: name), PendingCall::ReturnVoid, this); |
| 47 | } |
| 48 | |
| 49 | QString 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 | |
| 60 | QString Device::remoteName() const |
| 61 | { |
| 62 | return d->m_name; |
| 63 | } |
| 64 | |
| 65 | quint32 Device::deviceClass() const |
| 66 | { |
| 67 | return d->m_deviceClass; |
| 68 | } |
| 69 | |
| 70 | Device::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 | |
| 79 | quint16 Device::appearance() const |
| 80 | { |
| 81 | return d->m_appearance; |
| 82 | } |
| 83 | |
| 84 | QString 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 | |
| 96 | bool Device::isPaired() const |
| 97 | { |
| 98 | return d->m_paired; |
| 99 | } |
| 100 | |
| 101 | bool Device::isTrusted() const |
| 102 | { |
| 103 | return d->m_trusted; |
| 104 | } |
| 105 | |
| 106 | PendingCall *Device::setTrusted(bool trusted) |
| 107 | { |
| 108 | return new PendingCall(d->setDBusProperty(QStringLiteral("Trusted" ), value: trusted), PendingCall::ReturnVoid, this); |
| 109 | } |
| 110 | |
| 111 | bool Device::isBlocked() const |
| 112 | { |
| 113 | return d->m_blocked; |
| 114 | } |
| 115 | |
| 116 | PendingCall *Device::setBlocked(bool blocked) |
| 117 | { |
| 118 | return new PendingCall(d->setDBusProperty(QStringLiteral("Blocked" ), value: blocked), PendingCall::ReturnVoid, this); |
| 119 | } |
| 120 | |
| 121 | bool Device::hasLegacyPairing() const |
| 122 | { |
| 123 | return d->m_legacyPairing; |
| 124 | } |
| 125 | |
| 126 | qint16 Device::() const |
| 127 | { |
| 128 | return d->m_rssi; |
| 129 | } |
| 130 | |
| 131 | ManData Device::manufacturerData() const |
| 132 | { |
| 133 | return d->m_manufacturerData; |
| 134 | } |
| 135 | |
| 136 | bool Device::isServicesResolved() const |
| 137 | { |
| 138 | return d->m_servicesResolved; |
| 139 | } |
| 140 | |
| 141 | bool Device::isConnected() const |
| 142 | { |
| 143 | return d->m_connected; |
| 144 | } |
| 145 | |
| 146 | QStringList Device::uuids() const |
| 147 | { |
| 148 | return d->m_uuids; |
| 149 | } |
| 150 | |
| 151 | QString Device::modalias() const |
| 152 | { |
| 153 | return d->m_modalias; |
| 154 | } |
| 155 | |
| 156 | QHash<QString, QByteArray> Device::serviceData() const |
| 157 | { |
| 158 | return d->m_serviceData; |
| 159 | } |
| 160 | |
| 161 | BatteryPtr Device::battery() const |
| 162 | { |
| 163 | return d->m_battery; |
| 164 | } |
| 165 | |
| 166 | InputPtr Device::input() const |
| 167 | { |
| 168 | return d->m_input; |
| 169 | } |
| 170 | |
| 171 | MediaPlayerPtr Device::mediaPlayer() const |
| 172 | { |
| 173 | return d->m_mediaPlayer; |
| 174 | } |
| 175 | |
| 176 | MediaTransportPtr Device::mediaTransport() const |
| 177 | { |
| 178 | return d->m_mediaTransport; |
| 179 | } |
| 180 | |
| 181 | AdapterPtr Device::adapter() const |
| 182 | { |
| 183 | return d->m_adapter; |
| 184 | } |
| 185 | |
| 186 | QList<GattServiceRemotePtr> Device::gattServices() const |
| 187 | { |
| 188 | return d->m_services; |
| 189 | } |
| 190 | |
| 191 | QString 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 | |
| 235 | Device::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 | |
| 277 | PendingCall *Device::connectToDevice() |
| 278 | { |
| 279 | return new PendingCall(d->m_bluezDevice->Connect(), PendingCall::ReturnVoid, this); |
| 280 | } |
| 281 | |
| 282 | PendingCall *Device::disconnectFromDevice() |
| 283 | { |
| 284 | return new PendingCall(d->m_bluezDevice->Disconnect(), PendingCall::ReturnVoid, this); |
| 285 | } |
| 286 | |
| 287 | PendingCall *Device::connectProfile(const QString &uuid) |
| 288 | { |
| 289 | return new PendingCall(d->m_bluezDevice->ConnectProfile(UUID: uuid), PendingCall::ReturnVoid, this); |
| 290 | } |
| 291 | |
| 292 | PendingCall *Device::disconnectProfile(const QString &uuid) |
| 293 | { |
| 294 | return new PendingCall(d->m_bluezDevice->DisconnectProfile(UUID: uuid), PendingCall::ReturnVoid, this); |
| 295 | } |
| 296 | |
| 297 | PendingCall *Device::pair() |
| 298 | { |
| 299 | return new PendingCall(d->m_bluezDevice->Pair(), PendingCall::ReturnVoid, this); |
| 300 | } |
| 301 | |
| 302 | PendingCall *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 | |