165QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(
const QBluetoothAddress &deviceAdapter, QObject *parent)
167 d_ptr(
new QBluetoothServiceDiscoveryAgentPrivate(
this, deviceAdapter))
169 if (!deviceAdapter.isNull()) {
170 const QList<QBluetoothHostInfo> localDevices = QBluetoothLocalDevice::allDevices();
171 for (
const QBluetoothHostInfo &hostInfo : localDevices) {
172 if (hostInfo.address() == deviceAdapter)
175 d_ptr->error = InvalidBluetoothAdapterError;
176 d_ptr->errorString = tr(
"Invalid Bluetooth adapter address");
311void QBluetoothServiceDiscoveryAgent::start(DiscoveryMode mode)
313 Q_D(QBluetoothServiceDiscoveryAgent);
314#ifdef QT_OSX_BLUETOOTH
316 DarwinBluetooth::qt_test_iobluetooth_runloop();
319 if (d->discoveryState() == QBluetoothServiceDiscoveryAgentPrivate::Inactive
320 && d->error != InvalidBluetoothAdapterError) {
324 d->foundHostAdapterPath.clear();
326 d->setDiscoveryMode(mode);
328 d->error = QBluetoothServiceDiscoveryAgent::NoError;
329 d->errorString.clear();
330 if (d->deviceAddress.isNull()) {
331 d->startDeviceDiscovery();
333 d->discoveredDevices << QBluetoothDeviceInfo(d->deviceAddress, QString(), 0);
334 d->startServiceDiscovery();
343void QBluetoothServiceDiscoveryAgent::stop()
345 Q_D(QBluetoothServiceDiscoveryAgent);
347 if (d->error == InvalidBluetoothAdapterError || !isActive())
350 switch (d->discoveryState()) {
351 case QBluetoothServiceDiscoveryAgentPrivate::DeviceDiscovery:
352 d->stopDeviceDiscovery();
354 case QBluetoothServiceDiscoveryAgentPrivate::ServiceDiscovery:
355 d->stopServiceDiscovery();
361 d->discoveredDevices.clear();
436void QBluetoothServiceDiscoveryAgentPrivate::startDeviceDiscovery()
438 Q_Q(QBluetoothServiceDiscoveryAgent);
440 if (!deviceDiscoveryAgent) {
442 deviceDiscoveryAgent =
new QBluetoothDeviceDiscoveryAgent(m_deviceAdapterAddress, q);
444 deviceDiscoveryAgent =
new QBluetoothDeviceDiscoveryAgent(q);
446 QObject::connect(deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished,
448 this->_q_deviceDiscoveryFinished();
450 QObject::connect(deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,
451 q, [
this](
const QBluetoothDeviceInfo &info){
452 this->_q_deviceDiscovered(info);
454 QObject::connect(deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::errorOccurred, q,
455 [
this](QBluetoothDeviceDiscoveryAgent::Error newError) {
456 this->_q_deviceDiscoveryError(newError);
460 setDiscoveryState(DeviceDiscovery);
462 deviceDiscoveryAgent->start(QBluetoothDeviceDiscoveryAgent::ClassicMethod);
468void QBluetoothServiceDiscoveryAgentPrivate::stopDeviceDiscovery()
472 deviceDiscoveryAgent->disconnect();
474 deviceDiscoveryAgent->stop();
475 delete deviceDiscoveryAgent;
476 deviceDiscoveryAgent =
nullptr;
478 setDiscoveryState(Inactive);
480 Q_Q(QBluetoothServiceDiscoveryAgent);
487void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryFinished()
489 if (deviceDiscoveryAgent->error() != QBluetoothDeviceDiscoveryAgent::NoError) {
491 error =
static_cast<QBluetoothServiceDiscoveryAgent::Error>(deviceDiscoveryAgent->error());
492 errorString = deviceDiscoveryAgent->errorString();
493 setDiscoveryState(Inactive);
494 Q_Q(QBluetoothServiceDiscoveryAgent);
495 emit q->errorOccurred(error);
500 delete deviceDiscoveryAgent;
501 deviceDiscoveryAgent =
nullptr;
503 startServiceDiscovery();
506void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscovered(
const QBluetoothDeviceInfo &info)
509 const auto addressEquals = [](
const auto &a) {
510 return [a](
const auto &info) {
return info.address() == a; };
512 erase_if(discoveredDevices, addressEquals(info.address()));
513 discoveredDevices.prepend(info);
516void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryError(QBluetoothDeviceDiscoveryAgent::Error newError)
518 error =
static_cast<QBluetoothServiceDiscoveryAgent::Error>(newError);
519 errorString = deviceDiscoveryAgent->errorString();
523 deviceDiscoveryAgent->disconnect();
525 deviceDiscoveryAgent->stop();
526 delete deviceDiscoveryAgent;
527 deviceDiscoveryAgent =
nullptr;
529 setDiscoveryState(Inactive);
530 Q_Q(QBluetoothServiceDiscoveryAgent);
531 emit q->errorOccurred(error);
538void QBluetoothServiceDiscoveryAgentPrivate::startServiceDiscovery()
540 Q_Q(QBluetoothServiceDiscoveryAgent);
542 if (discoveredDevices.isEmpty()) {
543 setDiscoveryState(Inactive);
548 setDiscoveryState(ServiceDiscovery);
549 start(discoveredDevices.at(0).address());