File indexing completed on 2024-05-05 03:52:33

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