File indexing completed on 2025-01-12 03:36:44
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 #include "utils.h" 0010 #include "bluezqt_export.h" 0011 #include "manager.h" 0012 #include "obexmanager.h" 0013 0014 #include <QDBusArgument> 0015 #include <QDBusConnection> 0016 #include <QPointer> 0017 0018 namespace BluezQt 0019 { 0020 class GlobalData 0021 { 0022 public: 0023 explicit GlobalData(); 0024 0025 bool testRun; 0026 QString orgFreedesktopDBus; 0027 QString orgFreedesktopDBusProperties; 0028 QString orgBluez; 0029 QString orgBluezAdapter1; 0030 QString orgBluezBattery1; 0031 QString orgBluezDevice1; 0032 QString orgBluezGattService1; 0033 QString orgBluezGattCharateristic1; 0034 QString orgBluezGattDescriptor1; 0035 QString orgBluezInput1; 0036 QString orgBluezGattManager1; 0037 QString orgBluezLEAdvertisingManager1; 0038 QString orgBluezMedia1; 0039 QString orgBluezMediaPlayer1; 0040 QString orgBluezMediaTransport1; 0041 QString orgBluezAgentManager1; 0042 QString orgBluezProfileManager1; 0043 QString orgBluezObex; 0044 QString orgBluezObexClient1; 0045 QString orgBluezObexAgentManager1; 0046 QString orgBluezObexSession1; 0047 QString orgBluezObexTransfer1; 0048 QPointer<Manager> manager; 0049 QPointer<ObexManager> obexManager; 0050 }; 0051 0052 GlobalData::GlobalData() 0053 { 0054 testRun = false; 0055 orgFreedesktopDBus = QStringLiteral("org.freedesktop.DBus"); 0056 orgFreedesktopDBusProperties = QStringLiteral("org.freedesktop.DBus.Properties"); 0057 orgBluez = QStringLiteral("org.bluez"); 0058 orgBluezAdapter1 = QStringLiteral("org.bluez.Adapter1"); 0059 orgBluezBattery1 = QStringLiteral("org.bluez.Battery1"); 0060 orgBluezDevice1 = QStringLiteral("org.bluez.Device1"); 0061 orgBluezGattService1 = QStringLiteral("org.bluez.GattService1"); 0062 orgBluezGattCharateristic1 = QStringLiteral("org.bluez.GattCharacteristic1"); 0063 orgBluezGattDescriptor1 = QStringLiteral("org.bluez.GattDescriptor1"); 0064 orgBluezInput1 = QStringLiteral("org.bluez.Input1"); 0065 orgBluezGattManager1 = QStringLiteral("org.bluez.GattManager1"); 0066 orgBluezLEAdvertisingManager1 = QStringLiteral("org.bluez.LEAdvertisingManager1"); 0067 orgBluezMedia1 = QStringLiteral("org.bluez.Media1"); 0068 orgBluezMediaPlayer1 = QStringLiteral("org.bluez.MediaPlayer1"); 0069 orgBluezMediaTransport1 = QStringLiteral("org.bluez.MediaTransport1"); 0070 orgBluezAgentManager1 = QStringLiteral("org.bluez.AgentManager1"); 0071 orgBluezProfileManager1 = QStringLiteral("org.bluez.ProfileManager1"); 0072 orgBluezObex = QStringLiteral("org.bluez.obex"); 0073 orgBluezObexClient1 = QStringLiteral("org.bluez.obex.Client1"); 0074 orgBluezObexAgentManager1 = QStringLiteral("org.bluez.obex.AgentManager1"); 0075 orgBluezObexSession1 = QStringLiteral("org.bluez.obex.Session1"); 0076 orgBluezObexTransfer1 = QStringLiteral("org.bluez.obex.Transfer1"); 0077 } 0078 0079 Q_GLOBAL_STATIC(GlobalData, globalData) 0080 0081 // For fakebluez tests 0082 BLUEZQT_EXPORT void bluezqt_initFakeBluezTestRun() 0083 { 0084 globalData->testRun = true; 0085 globalData->orgBluez = QStringLiteral("org.kde.bluezqt.fakebluez"); 0086 globalData->orgBluezObex = QStringLiteral("org.kde.bluezqt.fakebluez"); 0087 } 0088 0089 QString Strings::orgFreedesktopDBus() 0090 { 0091 return globalData->orgFreedesktopDBus; 0092 } 0093 0094 QString Strings::orgFreedesktopDBusProperties() 0095 { 0096 return globalData->orgFreedesktopDBusProperties; 0097 } 0098 0099 QString Strings::orgBluez() 0100 { 0101 return globalData->orgBluez; 0102 } 0103 0104 QString Strings::orgBluezAdapter1() 0105 { 0106 return globalData->orgBluezAdapter1; 0107 } 0108 0109 QString Strings::orgBluezBattery1() 0110 { 0111 return globalData->orgBluezBattery1; 0112 } 0113 0114 QString Strings::orgBluezDevice1() 0115 { 0116 return globalData->orgBluezDevice1; 0117 } 0118 0119 QString Strings::orgBluezGattService1() 0120 { 0121 return globalData->orgBluezGattService1; 0122 } 0123 0124 QString Strings::orgBluezGattCharacteristic1() 0125 { 0126 return globalData->orgBluezGattCharateristic1; 0127 } 0128 0129 QString Strings::orgBluezGattDescriptor1() 0130 { 0131 return globalData->orgBluezGattDescriptor1; 0132 } 0133 0134 QString Strings::orgBluezInput1() 0135 { 0136 return globalData->orgBluezInput1; 0137 } 0138 0139 QString Strings::orgBluezGattManager1() 0140 { 0141 return globalData->orgBluezGattManager1; 0142 } 0143 0144 QString Strings::orgBluezLEAdvertisingManager1() 0145 { 0146 return globalData->orgBluezLEAdvertisingManager1; 0147 } 0148 0149 QString Strings::orgBluezMedia1() 0150 { 0151 return globalData->orgBluezMedia1; 0152 } 0153 0154 QString Strings::orgBluezMediaPlayer1() 0155 { 0156 return globalData->orgBluezMediaPlayer1; 0157 } 0158 0159 QString Strings::orgBluezMediaTransport1() 0160 { 0161 return globalData->orgBluezMediaTransport1; 0162 } 0163 0164 QString Strings::orgBluezAgentManager1() 0165 { 0166 return globalData->orgBluezAgentManager1; 0167 } 0168 0169 QString Strings::orgBluezProfileManager1() 0170 { 0171 return globalData->orgBluezProfileManager1; 0172 } 0173 0174 QString Strings::orgBluezObex() 0175 { 0176 return globalData->orgBluezObex; 0177 } 0178 0179 QString Strings::orgBluezObexClient1() 0180 { 0181 return globalData->orgBluezObexClient1; 0182 } 0183 0184 QString Strings::orgBluezObexAgentManager1() 0185 { 0186 return globalData->orgBluezObexAgentManager1; 0187 } 0188 0189 QString Strings::orgBluezObexSession1() 0190 { 0191 return globalData->orgBluezObexSession1; 0192 } 0193 0194 QString Strings::orgBluezObexTransfer1() 0195 { 0196 return globalData->orgBluezObexTransfer1; 0197 } 0198 0199 QDBusConnection DBusConnection::orgBluez() 0200 { 0201 if (globalData->testRun) { 0202 return QDBusConnection::sessionBus(); 0203 } 0204 return QDBusConnection::systemBus(); 0205 } 0206 0207 QDBusConnection DBusConnection::orgBluezObex() 0208 { 0209 return QDBusConnection::sessionBus(); 0210 } 0211 0212 Manager *Instance::manager() 0213 { 0214 return globalData->manager; 0215 } 0216 0217 void Instance::setManager(Manager *manager) 0218 { 0219 globalData->manager = manager; 0220 } 0221 0222 ObexManager *Instance::obexManager() 0223 { 0224 return globalData->obexManager; 0225 } 0226 0227 void Instance::setObexManager(ObexManager *obexManager) 0228 { 0229 globalData->obexManager = obexManager; 0230 } 0231 0232 QStringList stringListToUpper(const QStringList &list) 0233 { 0234 QStringList converted; 0235 converted.reserve(list.size()); 0236 for (const QString &str : list) { 0237 converted.append(str.toUpper()); 0238 } 0239 return converted; 0240 } 0241 0242 ManData variantToManData(const QVariant &v) { 0243 // Map to return 0244 ManData manData; 0245 0246 if (!v.isValid()) { 0247 return manData; 0248 } 0249 0250 // Map with QVariant values 0251 QMap<uint16_t,QVariant> vMap; 0252 const QDBusArgument &dbusArgs = v.value<QDBusArgument>(); 0253 dbusArgs >> vMap; 0254 // Iterate & convert values to byte array 0255 QMap<uint16_t,QVariant>::const_iterator i; 0256 for (i = vMap.constBegin(); i != vMap.constEnd(); ++i) { 0257 const QVariant &value = i.value(); 0258 const uint16_t &key = i.key(); 0259 manData.insert(key,value.toByteArray()); 0260 } 0261 return manData; 0262 } 0263 0264 Device::Type classToType(quint32 classNum) 0265 { 0266 switch ((classNum & 0x1f00) >> 8) { 0267 case 0x01: 0268 return Device::Computer; 0269 case 0x02: 0270 switch ((classNum & 0xfc) >> 2) { 0271 case 0x04: 0272 return Device::Modem; 0273 default: 0274 return Device::Phone; 0275 } 0276 case 0x03: 0277 return Device::Network; 0278 case 0x04: 0279 switch ((classNum & 0xfc) >> 2) { 0280 case 0x01: 0281 case 0x02: 0282 return Device::Headset; 0283 case 0x06: 0284 return Device::Headphones; 0285 default: 0286 return Device::AudioVideo; 0287 } 0288 case 0x05: 0289 switch ((classNum & 0xc0) >> 6) { 0290 case 0x00: 0291 switch ((classNum & 0x1e) >> 2) { 0292 case 0x01: 0293 case 0x02: 0294 return Device::Joypad; 0295 } 0296 break; 0297 case 0x01: 0298 return Device::Keyboard; 0299 case 0x02: 0300 switch ((classNum & 0x1e) >> 2) { 0301 case 0x05: 0302 return Device::Tablet; 0303 default: 0304 return Device::Mouse; 0305 } 0306 } 0307 return Device::Peripheral; 0308 case 0x06: 0309 if (classNum & 0x80) { 0310 return Device::Printer; 0311 } else if (classNum & 0x20) { 0312 return Device::Camera; 0313 } 0314 return Device::Imaging; 0315 case 0x07: 0316 return Device::Wearable; 0317 case 0x08: 0318 return Device::Toy; 0319 case 0x09: 0320 return Device::Health; 0321 default: 0322 return Device::Uncategorized; 0323 } 0324 } 0325 0326 Device::Type appearanceToType(quint16 appearance) 0327 { 0328 switch ((appearance & 0xffc0) >> 6) { 0329 case 0x00: 0330 return Device::Uncategorized; 0331 case 0x01: // Generic Phone 0332 return Device::Phone; 0333 case 0x02: // Generic Computer 0334 return Device::Computer; 0335 case 0x05: // Generic Display 0336 return Device::AudioVideo; 0337 case 0x0a: // Generic Media Player 0338 return Device::AudioVideo; 0339 case 0x0b: // Generic Barcode Scanner 0340 return Device::Peripheral; 0341 case 0x0f: // Generic HID 0342 switch (appearance & 0x3f) { 0343 case 0x01: // Keyboard 0344 return Device::Keyboard; 0345 case 0x02: // Mouse 0346 return Device::Mouse; 0347 case 0x03: // Joystick 0348 case 0x04: // Gamepad 0349 return Device::Joypad; 0350 case 0x05: // Digitizer Tablet 0351 return Device::Tablet; 0352 case 0x08: // Barcode Scanner 0353 return Device::Peripheral; 0354 } 0355 // fall-through 0356 default: 0357 return Device::Uncategorized; 0358 } 0359 } 0360 0361 } // namespace BluezQt