void QBluetoothDeviceDiscoveryAgentPrivate::start() { if(pendingCancel == true) { pendingStart = true; return; } discoveredDevices.clear(); QDBusPendingReply<QDBusObjectPath> reply = manager->DefaultAdapter(); reply.waitForFinished(); if (reply.isError()) { errorString = reply.error().message(); #ifdef QTM_DEVICEDISCOVERY_DEBUG qDebug() << Q_FUNC_INFO << "ERROR: " << errorString; #endif lastError = QBluetoothDeviceDiscoveryAgent::IOFailure; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); return; } adapter = new OrgBluezAdapterInterface(QLatin1String("org.bluez"), reply.value().path(), QDBusConnection::systemBus()); Q_Q(QBluetoothDeviceDiscoveryAgent); QObject::connect(adapter, SIGNAL(DeviceFound(QString,QVariantMap)), q, SLOT(_q_deviceFound(QString,QVariantMap))); QObject::connect(adapter, SIGNAL(PropertyChanged(QString,QDBusVariant)), q, SLOT(_q_propertyChanged(QString,QDBusVariant))); QDBusPendingReply<QVariantMap> propertiesReply = adapter->GetProperties(); propertiesReply.waitForFinished(); if(propertiesReply.isError()) { #ifdef QTM_DEVICEDISCOVERY_DEBUG qDebug() << Q_FUNC_INFO << "ERROR: " << errorString; #endif errorString = propertiesReply.error().message(); lastError = QBluetoothDeviceDiscoveryAgent::IOFailure; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); return; } QDBusPendingReply<> discoveryReply = adapter->StartDiscovery(); if (discoveryReply.isError()) { delete adapter; adapter = 0; errorString = discoveryReply.error().message(); lastError = QBluetoothDeviceDiscoveryAgent::IOFailure; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); #ifdef QTM_DEVICEDISCOVERY_DEBUG qDebug() << Q_FUNC_INFO << "ERROR: " << errorString; #endif return; } }
void QBluetoothDeviceDiscoveryAgentPrivate::start() { if(pendingCancel == true) { pendingStart = true; return; } discoveredDevices.clear(); QDBusPendingReply<QDBusObjectPath> reply; if (m_adapterAddress.isNull()) reply = manager->DefaultAdapter(); else reply = manager->FindAdapter(m_adapterAddress.toString()); reply.waitForFinished(); if (reply.isError()) { errorString = reply.error().message(); qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); return; } adapter = new OrgBluezAdapterInterface(QLatin1String("org.bluez"), reply.value().path(), QDBusConnection::systemBus()); Q_Q(QBluetoothDeviceDiscoveryAgent); QObject::connect(adapter, SIGNAL(DeviceFound(QString,QVariantMap)), q, SLOT(_q_deviceFound(QString,QVariantMap))); QObject::connect(adapter, SIGNAL(PropertyChanged(QString,QDBusVariant)), q, SLOT(_q_propertyChanged(QString,QDBusVariant))); QDBusPendingReply<QVariantMap> propertiesReply = adapter->GetProperties(); propertiesReply.waitForFinished(); if(propertiesReply.isError()) { errorString = propertiesReply.error().message(); delete adapter; adapter = 0; qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); delete adapter; adapter = 0; emit q->error(lastError); return; } if (!propertiesReply.value().value(QStringLiteral("Powered")).toBool()) { qCDebug(QT_BT_BLUEZ) << "Aborting device discovery due to offline Bluetooth Adapter"; lastError = QBluetoothDeviceDiscoveryAgent::PoweredOffError; errorString = QBluetoothDeviceDiscoveryAgent::tr("Device is powered off"); delete adapter; adapter = 0; emit q->error(lastError); return; } QDBusPendingReply<> discoveryReply = adapter->StartDiscovery(); if (discoveryReply.isError()) { delete adapter; adapter = 0; errorString = discoveryReply.error().message(); lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; return; } }
void QBluetoothDeviceDiscoveryAgentPrivate::start() { if (pendingCancel == true) { pendingStart = true; return; } discoveredDevices.clear(); if (managerBluez5) { startBluez5(); return; } QDBusPendingReply<QDBusObjectPath> reply; if (m_adapterAddress.isNull()) reply = manager->DefaultAdapter(); else reply = manager->FindAdapter(m_adapterAddress.toString()); reply.waitForFinished(); if (reply.isError()) { errorString = reply.error().message(); qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); return; } adapter = new OrgBluezAdapterInterface(QStringLiteral("org.bluez"), reply.value().path(), QDBusConnection::systemBus()); Q_Q(QBluetoothDeviceDiscoveryAgent); QObject::connect(adapter, SIGNAL(DeviceFound(QString, QVariantMap)), q, SLOT(_q_deviceFound(QString, QVariantMap))); QObject::connect(adapter, SIGNAL(PropertyChanged(QString, QDBusVariant)), q, SLOT(_q_propertyChanged(QString, QDBusVariant))); QDBusPendingReply<QVariantMap> propertiesReply = adapter->GetProperties(); propertiesReply.waitForFinished(); if (propertiesReply.isError()) { errorString = propertiesReply.error().message(); delete adapter; adapter = 0; qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); delete adapter; adapter = 0; emit q->error(lastError); return; } if (!propertiesReply.value().value(QStringLiteral("Powered")).toBool()) { qCDebug(QT_BT_BLUEZ) << "Aborting device discovery due to offline Bluetooth Adapter"; lastError = QBluetoothDeviceDiscoveryAgent::PoweredOffError; errorString = QBluetoothDeviceDiscoveryAgent::tr("Device is powered off"); delete adapter; adapter = 0; emit q->error(lastError); return; } if (propertiesReply.value().value(QStringLiteral("Discovering")).toBool()) { /* The discovery session is already ongoing. BTLE devices are advertised immediately after the start of the device discovery session. Hence if the session is already ongoing, we have just missed the BTLE device advertisement. This always happens during the second device discovery run in the current process. The first discovery doesn't have this issue. As to why the discovery session remains active despite the previous one being terminated is not known. This may be a bug in Bluez4. To workaround this issue we have to wait for two discovery sessions cycles. */ qCDebug(QT_BT_BLUEZ) << "Using BTLE device discovery workaround."; useExtendedDiscovery = true; } else { useExtendedDiscovery = false; } QDBusPendingReply<> discoveryReply = adapter->StartDiscovery(); if (discoveryReply.isError()) { delete adapter; adapter = 0; errorString = discoveryReply.error().message(); lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); emit q->error(lastError); qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; return; } }