File indexing completed on 2024-04-28 15:17:50

0001 /*
0002  * BluezQt - Asynchronous Bluez wrapper library
0003  *
0004  * SPDX-FileCopyrightText: 2014 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 "adapter_p.h"
0010 #include "adapter.h"
0011 #include "gattmanager.h"
0012 #include "leadvertisingmanager.h"
0013 #include "leadvertisingmanager_p.h"
0014 #include "macros.h"
0015 #include "media.h"
0016 #include "media_p.h"
0017 #include "utils.h"
0018 
0019 namespace BluezQt
0020 {
0021 AdapterPrivate::AdapterPrivate(const QString &path, const QVariantMap &properties)
0022     : QObject()
0023     , m_dbusProperties(nullptr)
0024     , m_adapterClass(0)
0025     , m_powered(0)
0026     , m_discoverable(false)
0027     , m_discoverableTimeout(0)
0028     , m_pairable(false)
0029     , m_pairableTimeout(0)
0030 {
0031     m_bluezAdapter = new BluezAdapter(Strings::orgBluez(), path, DBusConnection::orgBluez(), this);
0032 
0033     init(properties);
0034 }
0035 
0036 void AdapterPrivate::init(const QVariantMap &properties)
0037 {
0038     m_dbusProperties = new DBusProperties(Strings::orgBluez(), m_bluezAdapter->path(), DBusConnection::orgBluez(), this);
0039 
0040     // Init properties
0041     m_address = properties.value(QStringLiteral("Address")).toString();
0042     m_name = properties.value(QStringLiteral("Name")).toString();
0043     m_alias = properties.value(QStringLiteral("Alias")).toString();
0044     m_adapterClass = properties.value(QStringLiteral("Class")).toUInt();
0045     m_powered = properties.value(QStringLiteral("Powered")).toBool();
0046     m_discoverable = properties.value(QStringLiteral("Discoverable")).toBool();
0047     m_discoverableTimeout = properties.value(QStringLiteral("DiscoverableTimeout")).toUInt();
0048     m_pairable = properties.value(QStringLiteral("Pairable")).toBool();
0049     m_pairableTimeout = properties.value(QStringLiteral("PairableTimeout")).toUInt();
0050     m_discovering = properties.value(QStringLiteral("Discovering")).toBool();
0051     m_uuids = stringListToUpper(properties.value(QStringLiteral("UUIDs")).toStringList());
0052     m_modalias = properties.value(QStringLiteral("Modalias")).toString();
0053 }
0054 
0055 void AdapterPrivate::interfacesAdded(const QString &path, const QVariantMapMap &interfaces)
0056 {
0057     bool changed = false;
0058 
0059     for (auto it = interfaces.cbegin(); it != interfaces.cend(); ++it) {
0060         if (it.key() == Strings::orgBluezMedia1()) {
0061             m_media = MediaPtr(new Media(path));
0062             Q_EMIT q.lock()->mediaChanged(m_media);
0063             changed = true;
0064         } else if (it.key() == Strings::orgBluezLEAdvertisingManager1()) {
0065             m_leAdvertisingManager = LEAdvertisingManagerPtr(new LEAdvertisingManager(path));
0066             Q_EMIT q.lock()->leAdvertisingManagerChanged(m_leAdvertisingManager);
0067             changed = true;
0068         } else if (it.key() == Strings::orgBluezGattManager1()) {
0069             m_gattManager = GattManagerPtr(new GattManager(path));
0070             Q_EMIT q.lock()->gattManagerChanged(m_gattManager);
0071             changed = true;
0072         }
0073     }
0074 
0075     if (changed) {
0076         Q_EMIT q.lock()->adapterChanged(q.toStrongRef());
0077     }
0078 }
0079 
0080 void AdapterPrivate::interfacesRemoved(const QString &path, const QStringList &interfaces)
0081 {
0082     bool changed = false;
0083 
0084     for (const QString &interface : interfaces) {
0085         if (interface == Strings::orgBluezMedia1() && m_media && m_media->d->m_path == path) {
0086             m_media.clear();
0087             Q_EMIT q.lock()->mediaChanged(m_media);
0088             changed = true;
0089         } else if (interface == Strings::orgBluezLEAdvertisingManager1() && m_leAdvertisingManager && m_leAdvertisingManager->d->m_path == path) {
0090             m_leAdvertisingManager.clear();
0091             Q_EMIT q.lock()->leAdvertisingManagerChanged(m_leAdvertisingManager);
0092             changed = true;
0093         }
0094     }
0095 
0096     if (changed) {
0097         Q_EMIT q.lock()->adapterChanged(q.toStrongRef());
0098     }
0099 }
0100 
0101 void AdapterPrivate::addDevice(const DevicePtr &device)
0102 {
0103     m_devices.append(device);
0104     Q_EMIT q.lock()->deviceAdded(device);
0105 
0106     connect(device.data(), &Device::deviceChanged, q.lock().data(), &Adapter::deviceChanged);
0107 }
0108 
0109 void AdapterPrivate::removeDevice(const DevicePtr &device)
0110 {
0111     m_devices.removeOne(device);
0112     Q_EMIT device->deviceRemoved(device);
0113     Q_EMIT q.lock()->deviceRemoved(device);
0114 
0115     disconnect(device.data(), &Device::deviceChanged, q.lock().data(), &Adapter::deviceChanged);
0116 }
0117 
0118 QDBusPendingReply<> AdapterPrivate::setDBusProperty(const QString &name, const QVariant &value)
0119 {
0120     return m_dbusProperties->Set(Strings::orgBluezAdapter1(), name, QDBusVariant(value));
0121 }
0122 
0123 void AdapterPrivate::propertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalidated)
0124 {
0125     if (interface != Strings::orgBluezAdapter1()) {
0126         return;
0127     }
0128 
0129     QVariantMap::const_iterator i;
0130     for (i = changed.constBegin(); i != changed.constEnd(); ++i) {
0131         const QVariant &value = i.value();
0132         const QString &property = i.key();
0133 
0134         if (property == QLatin1String("Name")) {
0135             PROPERTY_CHANGED(m_name, toString, systemNameChanged);
0136         } else if (property == QLatin1String("Alias")) {
0137             PROPERTY_CHANGED(m_alias, toString, nameChanged);
0138         } else if (property == QLatin1String("Class")) {
0139             PROPERTY_CHANGED(m_adapterClass, toUInt, adapterClassChanged);
0140         } else if (property == QLatin1String("Powered")) {
0141             PROPERTY_CHANGED(m_powered, toBool, poweredChanged);
0142         } else if (property == QLatin1String("Discoverable")) {
0143             PROPERTY_CHANGED(m_discoverable, toBool, discoverableChanged);
0144         } else if (property == QLatin1String("DiscoverableTimeout")) {
0145             PROPERTY_CHANGED(m_discoverableTimeout, toUInt, discoverableTimeoutChanged);
0146         } else if (property == QLatin1String("Pairable")) {
0147             PROPERTY_CHANGED(m_pairable, toBool, pairableChanged);
0148         } else if (property == QLatin1String("PairableTimeout")) {
0149             PROPERTY_CHANGED(m_pairableTimeout, toUInt, pairableTimeoutChanged);
0150         } else if (property == QLatin1String("Discovering")) {
0151             PROPERTY_CHANGED(m_discovering, toBool, discoveringChanged);
0152         } else if (property == QLatin1String("Modalias")) {
0153             PROPERTY_CHANGED(m_modalias, toString, modaliasChanged);
0154         } else if (property == QLatin1String("UUIDs")) {
0155             PROPERTY_CHANGED2(m_uuids, stringListToUpper(value.toStringList()), uuidsChanged);
0156         }
0157     }
0158 
0159     for (const QString &property : invalidated) {
0160         if (property == QLatin1String("Modalias")) {
0161             PROPERTY_INVALIDATED(m_modalias, QString(), modaliasChanged);
0162         }
0163     }
0164 
0165     Q_EMIT q.lock()->adapterChanged(q.toStrongRef());
0166 }
0167 
0168 } // namespace BluezQt
0169 
0170 #include "moc_adapter_p.cpp"