File indexing completed on 2025-01-19 06:44:34
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"