diff options
19 files changed, 269 insertions, 55 deletions
diff --git a/examples/bluetooth/btchat/remoteselector.cpp b/examples/bluetooth/btchat/remoteselector.cpp index 50bebcd3..ee195413 100644 --- a/examples/bluetooth/btchat/remoteselector.cpp +++ b/examples/bluetooth/btchat/remoteselector.cpp @@ -43,15 +43,30 @@ #include <qbluetoothdeviceinfo.h> #include <qbluetoothaddress.h> +#include <qbluetoothlocaldevice.h> QT_USE_NAMESPACE_BLUETOOTH RemoteSelector::RemoteSelector(QWidget *parent) -: QDialog(parent), ui(new Ui::RemoteSelector), - m_discoveryAgent(new QBluetoothServiceDiscoveryAgent) +: QDialog(parent), ui(new Ui::RemoteSelector) { ui->setupUi(this); + //Using default Bluetooth adapter + QBluetoothLocalDevice localDevice; + QBluetoothAddress adapterAddress = localDevice.address(); + + /* + * In case of multiple Bluetooth adapters it is possible to + * set which adapter will be used by providing MAC Address. + * Example code: + * + * QBluetoothAddress adapterAddress("XX:XX:XX:XX:XX:XX"); + * m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + */ + + m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + connect(m_discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), this, SLOT(serviceDiscovered(QBluetoothServiceInfo))); connect(m_discoveryAgent, SIGNAL(finished()), this, SLOT(discoveryFinished())); @@ -60,6 +75,7 @@ RemoteSelector::RemoteSelector(QWidget *parent) RemoteSelector::~RemoteSelector() { delete ui; + delete m_discoveryAgent; } void RemoteSelector::startDiscovery(const QBluetoothUuid &uuid) diff --git a/examples/bluetooth/btfiletransfer/remoteselector.cpp b/examples/bluetooth/btfiletransfer/remoteselector.cpp index 70cde972..b148dab4 100644 --- a/examples/bluetooth/btfiletransfer/remoteselector.cpp +++ b/examples/bluetooth/btfiletransfer/remoteselector.cpp @@ -59,10 +59,24 @@ QT_USE_NAMESPACE_BLUETOOTH RemoteSelector::RemoteSelector(QWidget *parent) : QDialog(parent), ui(new Ui::RemoteSelector), - m_discoveryAgent(new QBluetoothServiceDiscoveryAgent), m_localDevice(new QBluetoothLocalDevice), m_pindisplay(0) + m_localDevice(new QBluetoothLocalDevice), m_pindisplay(0) { ui->setupUi(this); + //Using default Bluetooth adapter + QBluetoothAddress adapterAddress = m_localDevice->address(); + + /* + * In case of multiple Bluetooth adapters it is possible to + * set which adapter will be used by providing MAC Address. + * Example code: + * + * QBluetoothAddress adapterAddress("XX:XX:XX:XX:XX:XX"); + * m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + */ + + m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + connect(m_discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), this, SLOT(serviceDiscovered(QBluetoothServiceInfo))); connect(m_discoveryAgent, SIGNAL(finished()), this, SLOT(discoveryFinished())); diff --git a/examples/bluetooth/btscanner/device.cpp b/examples/bluetooth/btscanner/device.cpp index 1437f612..732eb371 100644 --- a/examples/bluetooth/btscanner/device.cpp +++ b/examples/bluetooth/btscanner/device.cpp @@ -48,12 +48,22 @@ #include <QDebug> DeviceDiscoveryDialog::DeviceDiscoveryDialog(QWidget *parent) -: QDialog(parent), discoveryAgent(new QBluetoothDeviceDiscoveryAgent), - localDevice(new QBluetoothLocalDevice), +: QDialog(parent), localDevice(new QBluetoothLocalDevice), ui(new Ui_DeviceDiscovery) { ui->setupUi(this); + /* + * In case of multiple Bluetooth adapters it is possible to set adapter + * which will be used. Example code: + * + * QBluetoothAddress address("XX:XX:XX:XX:XX:XX"); + * discoveryAgent = new QBluetoothDeviceDiscoveryAgent(address); + * + **/ + + discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); + connect(ui->inquiryType, SIGNAL(toggled(bool)), this, SLOT(setGeneralUnlimited(bool))); connect(ui->scan, SIGNAL(clicked()), this, SLOT(startScan())); diff --git a/examples/bluetooth/btscanner/service.cpp b/examples/bluetooth/btscanner/service.cpp index 7718f518..10df64c5 100644 --- a/examples/bluetooth/btscanner/service.cpp +++ b/examples/bluetooth/btscanner/service.cpp @@ -43,15 +43,32 @@ #include <qbluetoothaddress.h> #include <qbluetoothservicediscoveryagent.h> #include <qbluetoothserviceinfo.h> +#include <qbluetoothlocaldevice.h> ServiceDiscoveryDialog::ServiceDiscoveryDialog(const QString &name, const QBluetoothAddress &address, QWidget *parent) -: QDialog(parent), discoveryAgent(new QBluetoothServiceDiscoveryAgent(address)), - ui(new Ui_ServiceDiscovery) +: QDialog(parent), ui(new Ui_ServiceDiscovery) { ui->setupUi(this); + //Using default Bluetooth adapter + QBluetoothLocalDevice localDevice; + QBluetoothAddress adapterAddress = localDevice.address(); + + /* + * In case of multiple Bluetooth adapters it is possible to + * set which adapter will be used by providing MAC Address. + * Example code: + * + * QBluetoothAddress adapterAddress("XX:XX:XX:XX:XX:XX"); + * discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + */ + + discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + + bool set = discoveryAgent->setRemoteAddress(address); + setWindowTitle(name); connect(discoveryAgent, SIGNAL(serviceDiscovered(const QBluetoothServiceInfo&)), diff --git a/examples/bluetooth/bttennis/tennis.cpp b/examples/bluetooth/bttennis/tennis.cpp index bec62aa0..32c6cf44 100644 --- a/examples/bluetooth/bttennis/tennis.cpp +++ b/examples/bluetooth/bttennis/tennis.cpp @@ -66,8 +66,8 @@ //#include <qllcpsocket.h> Tennis::Tennis(QWidget *parent) -: QDialog(parent), ui(new Ui_Tennis), board(new Board), controller(new Controller), socket(0), - m_discoveryAgent(new QBluetoothServiceDiscoveryAgent)//, m_handover(0) +: QDialog(parent), ui(new Ui_Tennis), board(new Board), controller(new Controller), socket(0) + //, m_handover(0) { // start Bluetooth if not started QBluetoothLocalDevice *device = new QBluetoothLocalDevice(); @@ -75,6 +75,21 @@ Tennis::Tennis(QWidget *parent) delete device; device = 0; + //Using default Bluetooth adapter + QBluetoothLocalDevice localDevice; + QBluetoothAddress adapterAddress = localDevice.address(); + + /* + * In case of multiple Bluetooth adapters it is possible to + * set which adapter will be used by providing MAC Address. + * Example code: + * + * QBluetoothAddress adapterAddress("XX:XX:XX:XX:XX:XX"); + * m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress); + */ + + m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(adapterAddress, this); + //! [Construct UI] ui->setupUi(this); diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent.cpp index 333c3697..64d0b1a0 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent.cpp @@ -134,12 +134,12 @@ QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(QObject *parent) } /*! - Constructs a new Bluetooth device discovery agent with parent \a parent and uses the adapter with - address \a address for the device search. If \a address is default constructed the resulting + Constructs a new Bluetooth device discovery agent with parent \a parent and uses the adapter \a deviceAdapter + for the device search. If \a deviceAdapter is default constructed the resulting QBluetoothDeviceDiscoveryAgent object will use the local default Bluetooth adapter. */ -QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(const QBluetoothAddress &address, QObject *parent) - : QObject(parent), d_ptr(new QBluetoothDeviceDiscoveryAgentPrivate(address)) +QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent) + : QObject(parent), d_ptr(new QBluetoothDeviceDiscoveryAgentPrivate(deviceAdapter)) { d_ptr->q_ptr = this; } diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.h b/src/bluetooth/qbluetoothdevicediscoveryagent.h index cf0e3a62..c3a00a69 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent.h +++ b/src/bluetooth/qbluetoothdevicediscoveryagent.h @@ -75,7 +75,7 @@ public: }; QBluetoothDeviceDiscoveryAgent(QObject *parent = 0); - explicit QBluetoothDeviceDiscoveryAgent(const QBluetoothAddress &address, QObject *parent = 0); + explicit QBluetoothDeviceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = 0); ~QBluetoothDeviceDiscoveryAgent(); QBluetoothDeviceDiscoveryAgent::InquiryType inquiryType() const; diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp index 46a6361b..2b4e7f93 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp @@ -52,9 +52,9 @@ QT_BEGIN_NAMESPACE_BLUETOOTH -QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &address) - : lastError(QBluetoothDeviceDiscoveryAgent::NoError), m_deviceAddress(address), - pendingCancel(false), pendingStart(false), adapter(0) +QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter) + : lastError(QBluetoothDeviceDiscoveryAgent::NoError), m_adapterAddress(deviceAdapter), pendingCancel(false), pendingStart(false), + adapter(0) { manager = new OrgBluezManagerInterface(QLatin1String("org.bluez"), QLatin1String("/"), QDBusConnection::systemBus()); @@ -86,10 +86,10 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() discoveredDevices.clear(); QDBusPendingReply<QDBusObjectPath> reply; - if (m_deviceAddress.isNull()) + if (m_adapterAddress.isNull()) reply = manager->DefaultAdapter(); else - reply = manager->FindAdapter(m_deviceAddress.toString()); + reply = manager->FindAdapter(m_adapterAddress.toString()); reply.waitForFinished(); if (reply.isError()) { diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp index 952f17d2..638ff66e 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.cpp @@ -48,9 +48,9 @@ QT_BEGIN_NAMESPACE_BLUETOOTH -QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &address) +QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter) { - Q_UNUSED(address); + Q_UNUSED(deviceAdapter); inquiryType = QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry; lastError = QBluetoothDeviceDiscoveryAgent::NoError; } diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h index df3282c9..3f9dd2b3 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h @@ -48,6 +48,8 @@ #include <qbluetoothaddress.h> +#include <qbluetoothlocaldevice.h> + #ifdef QT_BLUEZ_BLUETOOTH class OrgBluezManagerInterface; class OrgBluezAdapterInterface; @@ -71,7 +73,7 @@ class QBluetoothDeviceDiscoveryAgentPrivate #endif Q_DECLARE_PUBLIC(QBluetoothDeviceDiscoveryAgent) public: - QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &address); + QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter); ~QBluetoothDeviceDiscoveryAgentPrivate(); void start(); @@ -91,7 +93,7 @@ private: QString errorString; #ifdef QT_BLUEZ_BLUETOOTH - QBluetoothAddress m_deviceAddress; + QBluetoothAddress m_adapterAddress; bool pendingCancel; bool pendingStart; OrgBluezManagerInterface *manager; diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp index 02e360d3..2e63771e 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_qnx.cpp @@ -49,11 +49,11 @@ QT_BEGIN_NAMESPACE_BLUETOOTH -QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &address): +QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter): QObject(0), lastError(QBluetoothDeviceDiscoveryAgent::NoError), m_rdfd(-1), m_active(false), m_nextOp(None), m_currentOp(None) { - Q_UNUSED(address); + Q_UNUSED(deviceAdapter); inquiryType = QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry; ppsRegisterControl(); ppsRegisterForEvent(QStringLiteral("device_added"), this); diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index 136ec8e5..89149941 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -119,18 +119,14 @@ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(QObject *parent } /*! - Constructs a new QBluetoothServiceDiscoveryAgent for \a remoteAddress and with \a parent. + Constructs a new QBluetoothServiceDiscoveryAgent for \a deviceAdapter and with \a parent. - If \a remoteAddress is null, services will be discovred on all contactable Bluetooth - devices. + If \a deviceAdapter is null, the default adapter will be used. */ -QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &remoteAddress, QObject *parent) -: QObject(parent), d_ptr(new QBluetoothServiceDiscoveryAgentPrivate(remoteAddress)) +QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent) +: QObject(parent), d_ptr(new QBluetoothServiceDiscoveryAgentPrivate(deviceAdapter)) { d_ptr->q_ptr = this; - if (!remoteAddress.isNull()) { - d_ptr->singleDevice = true; - } } /*! @@ -196,6 +192,36 @@ QList<QBluetoothUuid> QBluetoothServiceDiscoveryAgent::uuidFilter() const } /*! + Sets remote device address to \a address. If \a address is null, services will be discovered + on all contactable Bluetooth devices. A new remote address can only be set while there is + no service discovery in progress; otherwise this function returns false. + +*/ +bool QBluetoothServiceDiscoveryAgent::setRemoteAddress(const QBluetoothAddress &address) +{ + if (isActive()) + return false; + if (!address.isNull()) + d_ptr->singleDevice = true; + d_ptr->deviceAddress = address; + + return true; +} + +/*! + Returns the remote device address. If setRemoteAddress is not called, the function + will return default QBluetoothAddress. + +*/ +QBluetoothAddress QBluetoothServiceDiscoveryAgent::remoteAddress() const +{ + if (d_ptr->singleDevice == true) + return d_ptr->deviceAddress; + else + return QBluetoothAddress(); +} + +/*! Starts service discovery. \a mode specifies the type of service discovery to perform. On Blackberry devices device discovery may lead to pairing requests. diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.h b/src/bluetooth/qbluetoothservicediscoveryagent.h index 4e3cdf42..0a67030b 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent.h @@ -72,7 +72,7 @@ public: }; QBluetoothServiceDiscoveryAgent(QObject *parent = 0); - explicit QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &remoteAddress, QObject *parent = 0); + explicit QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = 0); ~QBluetoothServiceDiscoveryAgent(); bool isActive() const; @@ -85,6 +85,8 @@ public: void setUuidFilter(const QList<QBluetoothUuid> &uuids); void setUuidFilter(const QBluetoothUuid &uuid); QList<QBluetoothUuid> uuidFilter() const; + bool setRemoteAddress(const QBluetoothAddress &address); + QBluetoothAddress remoteAddress() const; public Q_SLOTS: void start(DiscoveryMode mode = MinimalDiscovery); diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index a8893a5b..1474cc02 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -56,10 +56,10 @@ QT_BEGIN_NAMESPACE_BLUETOOTH -QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &address) -: error(QBluetoothServiceDiscoveryAgent::NoError), state(Inactive), deviceAddress(address), - deviceDiscoveryAgent(0), mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery), - singleDevice(false), manager(0), device(0) +QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter) +: error(QBluetoothServiceDiscoveryAgent::NoError), state(Inactive), deviceDiscoveryAgent(0), + mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery), singleDevice(false), + manager(0), device(0), m_deviceAdapterAddress(deviceAdapter) { qRegisterMetaType<ServiceMap>("ServiceMap"); qDBusRegisterMetaType<ServiceMap>(); @@ -81,15 +81,17 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr manager = new OrgBluezManagerInterface(QLatin1String("org.bluez"), QLatin1String("/"), QDBusConnection::systemBus()); + QDBusPendingReply<QDBusObjectPath> reply; + if (m_deviceAdapterAddress.isNull()) + reply = manager->DefaultAdapter(); + else + reply = manager->FindAdapter(m_deviceAdapterAddress.toString()); - QDBusPendingReply<QDBusObjectPath> reply = manager->DefaultAdapter(); reply.waitForFinished(); if (reply.isError()) { - if (singleDevice) { - error = QBluetoothServiceDiscoveryAgent::DeviceDiscoveryError; - errorString = QBluetoothServiceDiscoveryAgent::tr("Unable to find default adapter"); - emit q->error(error); - } + error = QBluetoothServiceDiscoveryAgent::DeviceDiscoveryError; + errorString = QBluetoothServiceDiscoveryAgent::tr("Unable to find appointed local adapter"); + emit q->error(error); _q_serviceDiscoveryFinished(); return; } diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp index 508270d7..063fc4bd 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp @@ -44,9 +44,9 @@ QT_BEGIN_NAMESPACE_BLUETOOTH -QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &address) +QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter) { - Q_UNUSED(address); + Q_UNUSED(deviceAdapter); } QBluetoothServiceDiscoveryAgentPrivate::~QBluetoothServiceDiscoveryAgentPrivate() diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.h b/src/bluetooth/qbluetoothservicediscoveryagent_p.h index b1b1d635..e19a090f 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.h @@ -87,7 +87,7 @@ public: ServiceDiscovery, }; - QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &address); + QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter); ~QBluetoothServiceDiscoveryAgentPrivate(); void startDeviceDiscovery(); @@ -134,13 +134,12 @@ private: public: QBluetoothServiceDiscoveryAgent::Error error; QString errorString; - + QBluetoothAddress deviceAddress; QList<QBluetoothServiceInfo> discoveredServices; QList<QBluetoothDeviceInfo> discoveredDevices; private: DiscoveryState state; - QBluetoothAddress deviceAddress; QList<QBluetoothUuid> uuidFilter; QBluetoothDeviceDiscoveryAgent *deviceDiscoveryAgent; @@ -153,6 +152,7 @@ private: OrgBluezManagerInterface *manager; OrgBluezAdapterInterface *adapter; OrgBluezDeviceInterface *device; + QBluetoothAddress m_deviceAdapterAddress; #endif protected: diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp index eb942303..6c8d9f23 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_qnx.cpp @@ -54,8 +54,8 @@ QT_BEGIN_NAMESPACE_BLUETOOTH -QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &address) - : m_rdfd(-1), rdNotifier(0), error(QBluetoothServiceDiscoveryAgent::NoError), state(Inactive), deviceAddress(address), +QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &deviceAdapter) + : m_rdfd(-1), rdNotifier(0), error(QBluetoothServiceDiscoveryAgent::NoError), state(Inactive), deviceAddress(deviceAdapter), deviceDiscoveryAgent(0), mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery) { ppsRegisterControl(); diff --git a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp index ef7cd09b..33b6b204 100644 --- a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp +++ b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp @@ -43,6 +43,7 @@ #include <QDebug> #include <QVariant> +#include <QList> #include <qbluetoothaddress.h> #include <qbluetoothdevicediscoveryagent.h> @@ -303,7 +304,21 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery() { QFETCH(QBluetoothDeviceDiscoveryAgent::InquiryType, inquiryType); - QBluetoothDeviceDiscoveryAgent discoveryAgent; + //Run test in case of multiple Bluetooth adapters + QBluetoothLocalDevice localDevice; + //We will use default adapter if there is no other adapter + QBluetoothAddress address = localDevice.address(); + int numberOfAdapters = (localDevice.allDevices()).size(); + QList<QBluetoothAddress> addresses; + if (numberOfAdapters > 1) { + + for (int i=0; i < numberOfAdapters; i++) { + addresses.append(((QBluetoothHostInfo)localDevice.allDevices().at(i)).address()); + } + address = (QBluetoothAddress)addresses.at(0); + } + + QBluetoothDeviceDiscoveryAgent discoveryAgent(address); QVERIFY(discoveryAgent.error() == discoveryAgent.NoError); QVERIFY(discoveryAgent.errorString().isEmpty()); QVERIFY(!discoveryAgent.isActive()); @@ -361,7 +376,7 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery() if (!remoteDevice.isNull()) QVERIFY(discoveredSpy.count() > 0); - + int counter = 0; // All returned QBluetoothDeviceInfo should be valid. while (!discoveredSpy.isEmpty()) { const QBluetoothDeviceInfo info = @@ -369,7 +384,16 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery() QVERIFY(info.isValid()); qDebug() << "Discovered device:" << info.address().toString() << info.name(); + if (numberOfAdapters > 1) { + for (int i= 1; i < numberOfAdapters; i++) { + if (info.address().toString() == addresses[i].toString()) + counter++; + } + } } + //For multiple Bluetooth adapter do the check only for GeneralUnlimitedInquiry + if (!(inquiryType == QBluetoothDeviceDiscoveryAgent::LimitedInquiry)) + QVERIFY((numberOfAdapters-1) == counter); } } diff --git a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp index 2ab0326c..ec5ff840 100644 --- a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp +++ b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp @@ -43,12 +43,14 @@ #include <QDebug> #include <QVariant> -#include <QStringList> +#include <QList> #include <qbluetoothaddress.h> #include <qbluetoothdevicediscoveryagent.h> #include <qbluetoothservicediscoveryagent.h> #include <qbluetoothlocaldevice.h> +#include <qbluetoothserver.h> +#include <qbluetoothserviceinfo.h> QT_USE_NAMESPACE_BLUETOOTH @@ -76,6 +78,7 @@ private slots: void tst_serviceDiscovery_data(); void tst_serviceDiscovery(); + void tst_serviceDiscoveryAdapters(); private: QList<QBluetoothDeviceInfo> devices; @@ -250,6 +253,84 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery_data() << QBluetoothServiceDiscoveryAgent::NoError; } +void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscoveryAdapters() +{ + QBluetoothLocalDevice localDevice; + int numberOfAdapters = (localDevice.allDevices()).size(); + if (numberOfAdapters>1) { + if (devices.isEmpty()) + QSKIP("This test requires an in-range bluetooth device"); + + QList<QBluetoothAddress> addresses; + + for (int i=0; i<numberOfAdapters; i++) { + addresses.append(((QBluetoothHostInfo)localDevice.allDevices().at(i)).address()); + } + QBluetoothServer server(QBluetoothServer::RfcommServer); + QBluetoothUuid uuid(QBluetoothUuid::Ftp); + server.listen(addresses[0]); + QBluetoothServiceInfo serviceInfo; + serviceInfo.setAttribute(QBluetoothServiceInfo::ServiceName, "serviceName"); + serviceInfo.setAttribute(QBluetoothServiceInfo::BrowseGroupList, + QBluetoothUuid(QBluetoothUuid::PublicBrowseGroup)); + + QBluetoothServiceInfo::Sequence classId; + classId << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::SerialPort)); + serviceInfo.setAttribute(QBluetoothServiceInfo::ServiceClassIds, classId); + serviceInfo.setAttribute(QBluetoothServiceInfo::BluetoothProfileDescriptorList, + classId); + + serviceInfo.setServiceUuid(uuid); + + QBluetoothServiceInfo::Sequence protocolDescriptorList; + QBluetoothServiceInfo::Sequence protocol; + protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::L2cap)); + protocolDescriptorList.append(QVariant::fromValue(protocol)); + protocol.clear(); + + protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::Rfcomm)) + << QVariant::fromValue(quint8(server.serverPort())); + + protocolDescriptorList.append(QVariant::fromValue(protocol)); + serviceInfo.setAttribute(QBluetoothServiceInfo::ProtocolDescriptorList, + protocolDescriptorList); + QVERIFY(serviceInfo.registerService()); + + QVERIFY(server.isListening()); + qDebug() << "Scanning address" << addresses[0].toString(); + QBluetoothServiceDiscoveryAgent discoveryAgent(addresses[1]); + bool setAddress = discoveryAgent.setRemoteAddress(addresses[0]); + + QVERIFY(setAddress); + + QVERIFY(!discoveryAgent.isActive()); + + QVERIFY(discoveryAgent.discoveredServices().isEmpty()); + + QSignalSpy finishedSpy(&discoveryAgent, SIGNAL(finished())); + + discoveryAgent.start(); + int scanTime = MaxScanTime; + while (finishedSpy.count() == 0 && scanTime > 0) { + QTest::qWait(1000); + scanTime -= 1000; + } + + QList<QBluetoothServiceInfo> discServices = discoveryAgent.discoveredServices(); + QVERIFY(!discServices.empty()); + + int counter = 0; + for (int i = 0; i<discServices.size(); i++) + { + QBluetoothServiceInfo service((QBluetoothServiceInfo)discServices.at(i)); + if (uuid == service.serviceUuid()) + counter++; + } + QVERIFY(counter == 1); + } + +} + void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery() { @@ -263,8 +344,13 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery() QFETCH(QList<QBluetoothUuid>, uuidFilter); QFETCH(QBluetoothServiceDiscoveryAgent::Error, serviceDiscoveryError); + QBluetoothLocalDevice localDevice; + qDebug() << "Scanning address" << deviceInfo.address().toString(); - QBluetoothServiceDiscoveryAgent discoveryAgent(deviceInfo.address()); + QBluetoothServiceDiscoveryAgent discoveryAgent(localDevice.address()); + bool setAddress = discoveryAgent.setRemoteAddress(deviceInfo.address()); + + QVERIFY(setAddress); QVERIFY(!discoveryAgent.isActive()); |