#include "bluezclient.h" #include "dbus-shared.h" #include "device.h" #include #include #include BluezClient::BluezClient(QObject *parent): QObject(parent), m_dbus(QDBusConnection::systemBus()), m_bluezManager("org.bluez", "/", m_dbus), m_bluezAgentManager("org.bluez", "/org/bluez", m_dbus) { qDBusRegisterMetaType(); qDBusRegisterMetaType(); if (m_bluezManager.isValid()) { connect(&m_bluezManager, SIGNAL(InterfacesAdded(const QDBusObjectPath&, InterfaceList)), this, SLOT(slotInterfacesAdded(const QDBusObjectPath&, InterfaceList))); connect(&m_bluezManager, SIGNAL(InterfacesRemoved(const QDBusObjectPath&, const QStringList&)), this, SLOT(slotInterfacesRemoved(const QDBusObjectPath&, const QStringList&))); auto objectList = m_bluezManager.GetManagedObjects().argumentAt<0>(); for (QDBusObjectPath path : objectList.keys()) { InterfaceList ifaces = objectList.value(path); if (ifaces.contains(BLUEZ_DEVICE_IFACE)) { QString candidatePath = path.path(); qDebug() << "have device" << candidatePath; auto properties = ifaces.value(BLUEZ_DEVICE_IFACE); addDevice(path, properties); } } if (m_devices.isEmpty()) { // Try with bluez 4 QDBusConnection system = QDBusConnection::systemBus(); QDBusReply > listAdaptersReply = system.call( QDBusMessage::createMethodCall("org.bluez", "/", "org.bluez.Manager", "ListAdapters")); if (!listAdaptersReply.isValid()) { qWarning() << listAdaptersReply.error().message(); return; } QList adapters = listAdaptersReply.value(); if (adapters.isEmpty()) { qWarning() << "No BT adapters found"; return; } QDBusReply adapterPropertiesReply = system.call( QDBusMessage::createMethodCall("org.bluez", adapters[0].path(), "org.bluez.Adapter", "GetProperties")); if (!adapterPropertiesReply.isValid()) { qWarning() << adapterPropertiesReply.error().message(); return; } QList devices; adapterPropertiesReply.value()["Devices"].value() >> devices; foreach (QDBusObjectPath path, devices) { QDBusReply devicePropertiesReply = system.call( QDBusMessage::createMethodCall("org.bluez", path.path(), "org.bluez.Device", "GetProperties")); if (!devicePropertiesReply.isValid()) { qCritical() << devicePropertiesReply.error().message(); continue; } const QVariantMap &dict = devicePropertiesReply.value(); QString name = dict["Name"].toString(); if (name.startsWith("Pebble") && !name.startsWith("Pebble Time LE") && !name.startsWith("Pebble-LE")) { qDebug() << "Found Pebble:" << name; addDevice(path, dict); } } } } } QList BluezClient::pairedPebbles() const { QList ret; foreach (const BluezDevice &dev, m_devices) { ret << dev; } return ret; } void BluezClient::addDevice(const QDBusObjectPath &path, const QVariantMap &properties) { QString address = properties.value("Address").toString(); QString name = properties.value("Name").toString(); qDebug() << "Adding device" << address << name; if (name.startsWith("Pebble") && !name.startsWith("Pebble Time LE") && !name.startsWith("Pebble-LE") && !m_devices.contains(address)) { qDebug() << "Found new Pebble:" << address << name; BluezDevice device; device.address = QBluetoothAddress(address); device.name = name; device.path = path.path(); m_devices.insert(path.path(), device); qDebug() << "emitting added"; emit devicesChanged(); } } void BluezClient::slotInterfacesAdded(const QDBusObjectPath &path, InterfaceList ifaces) { qDebug() << "Interface added!"; if (ifaces.contains(BLUEZ_DEVICE_IFACE)) { auto properties = ifaces.value(BLUEZ_DEVICE_IFACE); addDevice(path, properties); } } void BluezClient::slotDevicePairingDone(bool success) { qDebug() << "pairing done" << success; if (!success) { return; } Device *device = static_cast(sender()); device->deleteLater(); if (!m_devices.contains(device->getAddress())) { BluezDevice bluezDevice; bluezDevice.address = QBluetoothAddress(device->getAddress()); bluezDevice.name = device->getName(); bluezDevice.path = device->getPath(); m_devices.insert(device->getAddress(), bluezDevice); emit devicesChanged(); } } void BluezClient::slotInterfacesRemoved(const QDBusObjectPath &path, const QStringList &ifaces) { qDebug() << "interfaces removed" << path.path() << ifaces; if (!ifaces.contains(BLUEZ_DEVICE_IFACE)) { return; } if (m_devices.contains(path.path())) { m_devices.take(path.path()); qDebug() << "removing dev"; emit devicesChanged(); } }