summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--config.tests/bluez/main.cpp9
-rw-r--r--config.tests/winrt_bt/main.cpp4
-rw-r--r--examples/bluetooth/btchat/chat.cpp59
-rw-r--r--examples/bluetooth/btchat/chat.h13
-rw-r--r--examples/bluetooth/btchat/chatclient.cpp27
-rw-r--r--examples/bluetooth/btchat/chatclient.h11
-rw-r--r--examples/bluetooth/btchat/chatserver.cpp18
-rw-r--r--examples/bluetooth/btchat/chatserver.h11
-rw-r--r--examples/bluetooth/btchat/main.cpp4
-rw-r--r--examples/bluetooth/btchat/remoteselector.cpp7
-rw-r--r--examples/bluetooth/btchat/remoteselector.h12
-rw-r--r--examples/bluetooth/heartrate-game/bluetoothbaseclass.h2
-rw-r--r--examples/bluetooth/heartrate-game/connectionhandler.h2
-rw-r--r--examples/bluetooth/heartrate-game/devicefinder.cpp13
-rw-r--r--examples/bluetooth/heartrate-game/devicefinder.h5
-rw-r--r--examples/bluetooth/heartrate-game/devicehandler.cpp21
-rw-r--r--examples/bluetooth/heartrate-game/devicehandler.h11
-rw-r--r--examples/bluetooth/heartrate-game/deviceinfo.cpp2
-rw-r--r--examples/bluetooth/heartrate-game/main.cpp4
-rw-r--r--examples/bluetooth/heartrate-server/main.cpp11
-rw-r--r--examples/bluetooth/lowenergyscanner/characteristicinfo.cpp9
-rw-r--r--examples/bluetooth/lowenergyscanner/characteristicinfo.h2
-rw-r--r--examples/bluetooth/lowenergyscanner/device.cpp46
-rw-r--r--examples/bluetooth/lowenergyscanner/device.h16
-rw-r--r--examples/bluetooth/lowenergyscanner/deviceinfo.cpp4
-rw-r--r--examples/bluetooth/lowenergyscanner/deviceinfo.h2
-rw-r--r--examples/bluetooth/lowenergyscanner/main.cpp4
-rw-r--r--examples/bluetooth/lowenergyscanner/serviceinfo.cpp4
-rw-r--r--examples/bluetooth/lowenergyscanner/serviceinfo.h4
-rw-r--r--examples/nfc/annotatedurl/annotatedurl.cpp2
-rw-r--r--examples/nfc/ndefeditor/mainwindow.cpp2
-rw-r--r--src/android/nfc/nfc.pro4
-rw-r--r--src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java5
-rw-r--r--src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java72
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver.cpp4
-rw-r--r--src/bluetooth/android/androidbroadcastreceiver_p.h2
-rw-r--r--src/bluetooth/android/devicediscoverybroadcastreceiver.cpp7
-rw-r--r--src/bluetooth/android/devicediscoverybroadcastreceiver_p.h2
-rw-r--r--src/bluetooth/android/inputstreamthread.cpp4
-rw-r--r--src/bluetooth/android/inputstreamthread_p.h6
-rw-r--r--src/bluetooth/android/localdevicebroadcastreceiver_p.h2
-rw-r--r--src/bluetooth/android/lowenergynotificationhub.cpp2
-rw-r--r--src/bluetooth/android/lowenergynotificationhub_p.h2
-rw-r--r--src/bluetooth/android/serveracceptancethread_p.h2
-rw-r--r--src/bluetooth/android/servicediscoverybroadcastreceiver_p.h2
-rw-r--r--src/bluetooth/bluetooth.pro32
-rw-r--r--src/bluetooth/bluez/bluetoothmanagement.cpp2
-rw-r--r--src/bluetooth/bluez/bluez.pri4
-rw-r--r--src/bluetooth/bluez/bluez5_helper.cpp22
-rw-r--r--src/bluetooth/bluez/bluez5_helper_p.h2
-rwxr-xr-xsrc/bluetooth/bluez/generate3
-rw-r--r--src/bluetooth/bluez/hcimanager.cpp8
-rw-r--r--src/bluetooth/bluez/hcimanager_p.h4
-rw-r--r--src/bluetooth/bluez/org.bluez.Profile1.xml17
-rw-r--r--src/bluetooth/bluez/profile1.cpp10
-rw-r--r--src/bluetooth/bluez/profile1_p.h34
-rw-r--r--src/bluetooth/bluez/profile1context.cpp72
-rw-r--r--src/bluetooth/bluez/profile1context_p.h96
-rw-r--r--src/bluetooth/bluez/profilemanager1.cpp26
-rw-r--r--src/bluetooth/bluez/profilemanager1_p.h61
-rw-r--r--src/bluetooth/bluez/remotedevicemanager_p.h2
-rw-r--r--src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp2
-rw-r--r--src/bluetooth/lecmaccalculator.cpp2
-rw-r--r--src/bluetooth/osx/osxbtledeviceinquiry.mm12
-rw-r--r--src/bluetooth/osx/osxbtobexsession.mm4
-rw-r--r--src/bluetooth/osx/osxbtsdpinquiry.mm2
-rw-r--r--src/bluetooth/osx/osxbtservicerecord.mm6
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent.cpp22
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent.h11
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp23
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp114
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm2
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent_p.h10
-rw-r--r--src/bluetooth/qbluetoothdeviceinfo.cpp87
-rw-r--r--src/bluetooth/qbluetoothdeviceinfo.h15
-rw-r--r--src/bluetooth/qbluetoothdeviceinfo_p.h2
-rw-r--r--src/bluetooth/qbluetoothlocaldevice_bluez.cpp112
-rw-r--r--src/bluetooth/qbluetoothlocaldevice_p.cpp4
-rw-r--r--src/bluetooth/qbluetoothlocaldevice_p.h18
-rw-r--r--src/bluetooth/qbluetoothserver.h4
-rw-r--r--src/bluetooth/qbluetoothserver_android.cpp8
-rw-r--r--src/bluetooth/qbluetoothserver_bluez.cpp43
-rw-r--r--src/bluetooth/qbluetoothserver_osx.mm2
-rw-r--r--src/bluetooth/qbluetoothserver_p.cpp2
-rw-r--r--src/bluetooth/qbluetoothserver_p.h4
-rw-r--r--src/bluetooth/qbluetoothserver_winrt.cpp4
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent.cpp28
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent.h19
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_android.cpp37
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp80
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_osx.mm2
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_p.cpp1
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_p.h16
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_winrt.cpp9
-rw-r--r--src/bluetooth/qbluetoothserviceinfo.cpp12
-rw-r--r--src/bluetooth/qbluetoothserviceinfo_android.cpp2
-rw-r--r--src/bluetooth/qbluetoothserviceinfo_bluez.cpp8
-rw-r--r--src/bluetooth/qbluetoothserviceinfo_osx.mm11
-rw-r--r--src/bluetooth/qbluetoothserviceinfo_p.h4
-rw-r--r--src/bluetooth/qbluetoothserviceinfo_winrt.cpp261
-rw-r--r--src/bluetooth/qbluetoothsocket.cpp294
-rw-r--r--src/bluetooth/qbluetoothsocket.h26
-rw-r--r--src/bluetooth/qbluetoothsocket_android.cpp169
-rw-r--r--src/bluetooth/qbluetoothsocket_android_p.h145
-rw-r--r--src/bluetooth/qbluetoothsocket_bluez.cpp185
-rw-r--r--src/bluetooth/qbluetoothsocket_bluez_p.h108
-rw-r--r--src/bluetooth/qbluetoothsocket_bluezdbus.cpp612
-rw-r--r--src/bluetooth/qbluetoothsocket_bluezdbus_p.h130
-rw-r--r--src/bluetooth/qbluetoothsocket_dummy.cpp (renamed from src/bluetooth/qbluetoothsocket_p.cpp)86
-rw-r--r--src/bluetooth/qbluetoothsocket_dummy_p.h108
-rw-r--r--src/bluetooth/qbluetoothsocket_osx.mm8
-rw-r--r--src/bluetooth/qbluetoothsocket_osx_p.h5
-rw-r--r--src/bluetooth/qbluetoothsocket_winrt.cpp189
-rw-r--r--src/bluetooth/qbluetoothsocket_winrt_p.h136
-rw-r--r--src/bluetooth/qbluetoothsocketbase.cpp54
-rw-r--r--src/bluetooth/qbluetoothsocketbase_p.h (renamed from src/bluetooth/qbluetoothsocket_p.h)240
-rw-r--r--src/bluetooth/qbluetoothtransferreply.cpp1
-rw-r--r--src/bluetooth/qbluetoothtransferreply_bluez.cpp5
-rw-r--r--src/bluetooth/qbluetoothtransferreply_bluez_p.h14
-rw-r--r--src/bluetooth/qbluetoothtransferreply_p.h2
-rw-r--r--src/bluetooth/qleadvertiser_bluez.cpp9
-rw-r--r--src/bluetooth/qlowenergycharacteristic.cpp8
-rw-r--r--src/bluetooth/qlowenergycharacteristic.h2
-rw-r--r--src/bluetooth/qlowenergycharacteristicdata.cpp2
-rw-r--r--src/bluetooth/qlowenergycontroller.h1
-rw-r--r--src/bluetooth/qlowenergycontroller_android.cpp4
-rw-r--r--src/bluetooth/qlowenergycontroller_android_p.h4
-rw-r--r--src/bluetooth/qlowenergycontroller_bluez.cpp49
-rw-r--r--src/bluetooth/qlowenergycontroller_bluez_p.h12
-rw-r--r--src/bluetooth/qlowenergycontroller_bluezdbus_p.h4
-rw-r--r--src/bluetooth/qlowenergycontroller_osx.mm9
-rw-r--r--src/bluetooth/qlowenergycontroller_p.h4
-rw-r--r--src/bluetooth/qlowenergycontroller_winrt.cpp11
-rw-r--r--src/bluetooth/qlowenergycontroller_winrt_p.h4
-rw-r--r--src/bluetooth/qlowenergycontrollerbase.cpp22
-rw-r--r--src/bluetooth/qlowenergydescriptor.cpp6
-rw-r--r--src/bluetooth/qlowenergydescriptor.h2
-rw-r--r--src/bluetooth/qlowenergyservice.cpp2
-rw-r--r--src/bluetooth/qlowenergyservice_osx.mm2
-rw-r--r--src/bluetooth/qlowenergyservicedata.cpp2
-rw-r--r--src/bluetooth/qlowenergyserviceprivate_p.h2
-rw-r--r--src/imports/bluetooth/plugin.cpp9
-rw-r--r--src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp9
-rw-r--r--src/imports/bluetooth/qdeclarativebluetoothservice.cpp16
-rw-r--r--src/imports/bluetooth/qdeclarativebluetoothsocket.cpp8
-rw-r--r--src/imports/bluetooth/qdeclarativebluetoothsocket_p.h6
-rw-r--r--src/imports/nfc/plugin.cpp9
-rw-r--r--src/imports/nfc/qdeclarativenearfield.cpp4
-rw-r--r--src/nfc/android/androidjninfc.cpp5
-rw-r--r--src/nfc/android/androidjninfc_p.h1
-rw-r--r--src/nfc/android/androidmainnewintentlistener.cpp2
-rw-r--r--src/nfc/doc/src/examples.qdoc2
-rw-r--r--src/nfc/neard/neard_helper.cpp11
-rw-r--r--src/nfc/nfc.pro1
-rw-r--r--src/nfc/qllcpsocket_android_p.cpp10
-rw-r--r--src/nfc/qnearfieldmanager.cpp65
-rw-r--r--src/nfc/qnearfieldmanager.h9
-rw-r--r--src/nfc/qnearfieldmanager_android.cpp69
-rw-r--r--src/nfc/qnearfieldmanager_android_p.h21
-rw-r--r--src/nfc/qnearfieldmanager_emulator.cpp4
-rw-r--r--src/nfc/qnearfieldmanager_emulator_p.h4
-rw-r--r--src/nfc/qnearfieldmanager_neard.cpp32
-rw-r--r--src/nfc/qnearfieldmanager_neard_p.h21
-rw-r--r--src/nfc/qnearfieldmanager_p.h6
-rw-r--r--src/nfc/qnearfieldmanagervirtualbase.cpp2
-rw-r--r--src/nfc/qnearfieldmanagervirtualbase_p.h12
-rw-r--r--src/nfc/qnearfieldtagtype1.cpp12
-rw-r--r--src/nfc/qnearfieldtarget.cpp13
-rw-r--r--src/nfc/qnearfieldtarget.h2
-rw-r--r--src/nfc/qnearfieldtarget_android.cpp36
-rw-r--r--src/nfc/qnearfieldtarget_emulator.cpp20
-rw-r--r--src/nfc/qnearfieldtarget_neard_p.h10
-rw-r--r--src/nfc/qtlv.cpp6
-rw-r--r--src/tools/sdpscanner/main.cpp12
-rw-r--r--sync.profile2
-rw-r--r--tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp10
-rw-r--r--tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp6
-rw-r--r--tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp2
-rw-r--r--tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp13
-rw-r--r--tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp6
-rw-r--r--tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp11
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp2
-rw-r--r--tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp18
-rw-r--r--tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp13
-rw-r--r--tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp2
-rw-r--r--tests/bttestui/btlocaldevice.cpp37
187 files changed, 3699 insertions, 1409 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 76c202ab..097d8b94 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -1,3 +1,3 @@
load(qt_build_config)
-MODULE_VERSION = 5.11.2
+MODULE_VERSION = 5.12.0
diff --git a/config.tests/bluez/main.cpp b/config.tests/bluez/main.cpp
index 3fe5ee09..2e978b85 100644
--- a/config.tests/bluez/main.cpp
+++ b/config.tests/bluez/main.cpp
@@ -30,11 +30,10 @@
int main()
{
-#ifdef BDADDR_NONE
- bacmp(BDADDR_ANY, BDADDR_NONE);
-#else
- bacmp(BDADDR_ANY, BDADDR_LOCAL);
-#endif
+ bdaddr_t anyTmp = {{0, 0, 0, 0, 0, 0}};
+ bdaddr_t localTmp = {{0, 0, 0, 0xff, 0xff, 0xff}};
+
+ bacmp(&anyTmp, &localTmp);
return 0;
}
diff --git a/config.tests/winrt_bt/main.cpp b/config.tests/winrt_bt/main.cpp
index 2e0eb276..85c26bf7 100644
--- a/config.tests/winrt_bt/main.cpp
+++ b/config.tests/winrt_bt/main.cpp
@@ -30,6 +30,10 @@
#include <windows.devices.enumeration.h>
#include <windows.devices.bluetooth.h>
+#if defined(_WIN32) && defined(__INTEL_COMPILER)
+#error "Windows ICC fails to build the WinRT backend (QTBUG-68026)."
+#endif
+
int main()
{
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Enumeration::IDeviceInformationStatics> deviceInformationStatics;
diff --git a/examples/bluetooth/btchat/chat.cpp b/examples/bluetooth/btchat/chat.cpp
index 9325765e..4cc5f08d 100644
--- a/examples/bluetooth/btchat/chat.cpp
+++ b/examples/bluetooth/btchat/chat.cpp
@@ -53,34 +53,30 @@
#include "chatserver.h"
#include "chatclient.h"
-#include <qbluetoothuuid.h>
-#include <qbluetoothserver.h>
-#include <qbluetoothservicediscoveryagent.h>
-#include <qbluetoothdeviceinfo.h>
-#include <qbluetoothlocaldevice.h>
+#include <QtCore/qdebug.h>
+
+#include <QtBluetooth/qbluetoothdeviceinfo.h>
+#include <QtBluetooth/qbluetoothlocaldevice.h>
+#include <QtBluetooth/qbluetoothuuid.h>
#ifdef Q_OS_ANDROID
#include <QtAndroidExtras/QtAndroid>
#endif
-#include <QTimer>
-
-#include <QDebug>
-
static const QLatin1String serviceUuid("e8e10f95-1a70-4b27-9ccf-02010264e9c8");
#ifdef Q_OS_ANDROID
static const QLatin1String reverseUuid("c8e96402-0102-cf9c-274b-701a950fe1e8");
#endif
Chat::Chat(QWidget *parent)
- : QDialog(parent), currentAdapterIndex(0), ui(new Ui_Chat)
+ : QDialog(parent), ui(new Ui_Chat)
{
//! [Construct UI]
ui->setupUi(this);
- connect(ui->quitButton, SIGNAL(clicked()), this, SLOT(accept()));
- connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(connectClicked()));
- connect(ui->sendButton, SIGNAL(clicked()), this, SLOT(sendClicked()));
+ connect(ui->quitButton, &QPushButton::clicked, this, &Chat::accept);
+ connect(ui->connectButton, &QPushButton::clicked, this, &Chat::connectClicked);
+ connect(ui->sendButton, &QPushButton::clicked, this, &Chat::sendClicked);
//! [Construct UI]
localAdapters = QBluetoothLocalDevice::allDevices();
@@ -93,19 +89,21 @@ Chat::Chat(QWidget *parent)
arg(localAdapters.at(0).address().toString()));
ui->secondAdapter->setText(localAdapters.at(1).address().toString());
ui->firstAdapter->setChecked(true);
- connect(ui->firstAdapter, SIGNAL(clicked()), this, SLOT(newAdapterSelected()));
- connect(ui->secondAdapter, SIGNAL(clicked()), this, SLOT(newAdapterSelected()));
+ connect(ui->firstAdapter, &QRadioButton::clicked, this, &Chat::newAdapterSelected);
+ connect(ui->secondAdapter, &QRadioButton::clicked, this, &Chat::newAdapterSelected);
QBluetoothLocalDevice adapter(localAdapters.at(0).address());
adapter.setHostMode(QBluetoothLocalDevice::HostDiscoverable);
}
//! [Create Chat Server]
server = new ChatServer(this);
- connect(server, SIGNAL(clientConnected(QString)), this, SLOT(clientConnected(QString)));
- connect(server, SIGNAL(clientDisconnected(QString)), this, SLOT(clientDisconnected(QString)));
- connect(server, SIGNAL(messageReceived(QString,QString)),
- this, SLOT(showMessage(QString,QString)));
- connect(this, SIGNAL(sendMessage(QString)), server, SLOT(sendMessage(QString)));
+ connect(server, QOverload<const QString &>::of(&ChatServer::clientConnected),
+ this, &Chat::clientConnected);
+ connect(server, QOverload<const QString &>::of(&ChatServer::clientDisconnected),
+ this, QOverload<const QString &>::of(&Chat::clientDisconnected));
+ connect(server, &ChatServer::messageReceived,
+ this, &Chat::showMessage);
+ connect(this, &Chat::sendMessage, server, &ChatServer::sendMessage);
server->startServer();
//! [Create Chat Server]
@@ -137,6 +135,7 @@ void Chat::connected(const QString &name)
{
ui->chat->insertPlainText(QString::fromLatin1("Joined chat with %1.\n").arg(name));
}
+//! [connected]
void Chat::newAdapterSelected()
{
@@ -163,7 +162,11 @@ int Chat::adapterFromUserSelection() const
}
return result;
}
-//! [connected]
+
+void Chat::reactOnSocketError(const QString &error)
+{
+ ui->chat->insertPlainText(error);
+}
//! [clientDisconnected]
void Chat::clientDisconnected()
@@ -206,11 +209,15 @@ void Chat::connectClicked()
ChatClient *client = new ChatClient(this);
qDebug() << "Connecting...";
- connect(client, SIGNAL(messageReceived(QString,QString)),
- this, SLOT(showMessage(QString,QString)));
- connect(client, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
- connect(client, SIGNAL(connected(QString)), this, SLOT(connected(QString)));
- connect(this, SIGNAL(sendMessage(QString)), client, SLOT(sendMessage(QString)));
+ connect(client, &ChatClient::messageReceived,
+ this, &Chat::showMessage);
+ connect(client, &ChatClient::disconnected,
+ this, QOverload<>::of(&Chat::clientDisconnected));
+ connect(client, QOverload<const QString &>::of(&ChatClient::connected),
+ this, &Chat::connected);
+ connect(client, &ChatClient::socketErrorOccurred,
+ this, &Chat::reactOnSocketError);
+ connect(this, &Chat::sendMessage, client, &ChatClient::sendMessage);
qDebug() << "Start client";
client->startClient(service);
diff --git a/examples/bluetooth/btchat/chat.h b/examples/bluetooth/btchat/chat.h
index 57f13257..e4c81b24 100644
--- a/examples/bluetooth/btchat/chat.h
+++ b/examples/bluetooth/btchat/chat.h
@@ -50,13 +50,9 @@
#include "ui_chat.h"
-#include <QDialog>
+#include <QtWidgets/qdialog.h>
-#include <qbluetoothserviceinfo.h>
-#include <qbluetoothsocket.h>
-#include <qbluetoothhostinfo.h>
-
-#include <QDebug>
+#include <QtBluetooth/qbluetoothhostinfo.h>
QT_USE_NAMESPACE
@@ -69,7 +65,7 @@ class Chat : public QDialog
Q_OBJECT
public:
- Chat(QWidget *parent = 0);
+ explicit Chat(QWidget *parent = nullptr);
~Chat();
signals:
@@ -85,12 +81,13 @@ private slots:
void clientDisconnected(const QString &name);
void clientDisconnected();
void connected(const QString &name);
+ void reactOnSocketError(const QString &error);
void newAdapterSelected();
private:
int adapterFromUserSelection() const;
- int currentAdapterIndex;
+ int currentAdapterIndex = 0;
Ui_Chat *ui;
ChatServer *server;
diff --git a/examples/bluetooth/btchat/chatclient.cpp b/examples/bluetooth/btchat/chatclient.cpp
index 6682667f..cf3e2331 100644
--- a/examples/bluetooth/btchat/chatclient.cpp
+++ b/examples/bluetooth/btchat/chatclient.cpp
@@ -50,10 +50,10 @@
#include "chatclient.h"
-#include <qbluetoothsocket.h>
+#include <QtCore/qmetaobject.h>
ChatClient::ChatClient(QObject *parent)
-: QObject(parent), socket(0)
+ : QObject(parent)
{
}
@@ -74,9 +74,12 @@ void ChatClient::startClient(const QBluetoothServiceInfo &remoteService)
socket->connectToService(remoteService);
qDebug() << "ConnectToService done";
- connect(socket, SIGNAL(readyRead()), this, SLOT(readSocket()));
- connect(socket, SIGNAL(connected()), this, SLOT(connected()));
- connect(socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
+ connect(socket, &QBluetoothSocket::readyRead, this, &ChatClient::readSocket);
+ connect(socket, &QBluetoothSocket::connected, this, QOverload<>::of(&ChatClient::connected));
+ connect(socket, &QBluetoothSocket::disconnected, this, &ChatClient::disconnected);
+ connect(socket, QOverload<QBluetoothSocket::SocketError>::of(&QBluetoothSocket::error),
+ this, &ChatClient::onSocketErrorOccurred);
+
}
//! [startClient]
@@ -84,7 +87,7 @@ void ChatClient::startClient(const QBluetoothServiceInfo &remoteService)
void ChatClient::stopClient()
{
delete socket;
- socket = 0;
+ socket = nullptr;
}
//! [stopClient]
@@ -110,6 +113,18 @@ void ChatClient::sendMessage(const QString &message)
}
//! [sendMessage]
+void ChatClient::onSocketErrorOccurred(QBluetoothSocket::SocketError error)
+{
+ if (error == QBluetoothSocket::NoSocketError)
+ return;
+
+ QMetaEnum metaEnum = QMetaEnum::fromType<QBluetoothSocket::SocketError>();
+ QString errorString = socket->peerName() + QLatin1Char(' ')
+ + metaEnum.valueToKey(error) + QLatin1String(" occurred");
+
+ emit socketErrorOccurred(errorString);
+}
+
//! [connected]
void ChatClient::connected()
{
diff --git a/examples/bluetooth/btchat/chatclient.h b/examples/bluetooth/btchat/chatclient.h
index a2f2eafc..25002f90 100644
--- a/examples/bluetooth/btchat/chatclient.h
+++ b/examples/bluetooth/btchat/chatclient.h
@@ -51,9 +51,10 @@
#ifndef CHATCLIENT_H
#define CHATCLIENT_H
-#include <qbluetoothserviceinfo.h>
+#include <QtCore/qobject.h>
-#include <QtCore/QObject>
+#include <QtBluetooth/qbluetoothserviceinfo.h>
+#include <QtBluetooth/qbluetoothsocket.h>
QT_FORWARD_DECLARE_CLASS(QBluetoothSocket)
@@ -65,7 +66,7 @@ class ChatClient : public QObject
Q_OBJECT
public:
- explicit ChatClient(QObject *parent = 0);
+ explicit ChatClient(QObject *parent = nullptr);
~ChatClient();
void startClient(const QBluetoothServiceInfo &remoteService);
@@ -78,13 +79,15 @@ signals:
void messageReceived(const QString &sender, const QString &message);
void connected(const QString &name);
void disconnected();
+ void socketErrorOccurred(const QString &errorString);
private slots:
void readSocket();
void connected();
+ void onSocketErrorOccurred(QBluetoothSocket::SocketError);
private:
- QBluetoothSocket *socket;
+ QBluetoothSocket *socket = nullptr;
};
//! [declaration]
diff --git a/examples/bluetooth/btchat/chatserver.cpp b/examples/bluetooth/btchat/chatserver.cpp
index e4293c75..59210e55 100644
--- a/examples/bluetooth/btchat/chatserver.cpp
+++ b/examples/bluetooth/btchat/chatserver.cpp
@@ -50,16 +50,15 @@
#include "chatserver.h"
-#include <qbluetoothserver.h>
-#include <qbluetoothsocket.h>
-#include <qbluetoothlocaldevice.h>
+#include <QtBluetooth/qbluetoothserver.h>
+#include <QtBluetooth/qbluetoothsocket.h>
//! [Service UUID]
static const QLatin1String serviceUuid("e8e10f95-1a70-4b27-9ccf-02010264e9c8");
//! [Service UUID]
ChatServer::ChatServer(QObject *parent)
-: QObject(parent), rfcommServer(0)
+ : QObject(parent)
{
}
@@ -75,7 +74,8 @@ void ChatServer::startServer(const QBluetoothAddress& localAdapter)
//! [Create the server]
rfcommServer = new QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol, this);
- connect(rfcommServer, SIGNAL(newConnection()), this, SLOT(clientConnected()));
+ connect(rfcommServer, &QBluetoothServer::newConnection,
+ this, QOverload<>::of(&ChatServer::clientConnected));
bool result = rfcommServer->listen(localAdapter);
if (!result) {
qWarning() << "Cannot bind chat server to" << localAdapter.toString();
@@ -145,7 +145,7 @@ void ChatServer::stopServer()
// Close server
delete rfcommServer;
- rfcommServer = 0;
+ rfcommServer = nullptr;
}
//! [stopServer]
@@ -154,7 +154,7 @@ void ChatServer::sendMessage(const QString &message)
{
QByteArray text = message.toUtf8() + '\n';
- foreach (QBluetoothSocket *socket, clientSockets)
+ for (QBluetoothSocket *socket : qAsConst(clientSockets))
socket->write(text);
}
//! [sendMessage]
@@ -166,8 +166,8 @@ void ChatServer::clientConnected()
if (!socket)
return;
- connect(socket, SIGNAL(readyRead()), this, SLOT(readSocket()));
- connect(socket, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
+ connect(socket, &QBluetoothSocket::readyRead, this, &ChatServer::readSocket);
+ connect(socket, &QBluetoothSocket::disconnected, this, QOverload<>::of(&ChatServer::clientDisconnected));
clientSockets.append(socket);
emit clientConnected(socket->peerName());
}
diff --git a/examples/bluetooth/btchat/chatserver.h b/examples/bluetooth/btchat/chatserver.h
index f7117b74..c4191db8 100644
--- a/examples/bluetooth/btchat/chatserver.h
+++ b/examples/bluetooth/btchat/chatserver.h
@@ -51,11 +51,10 @@
#ifndef CHATSERVER_H
#define CHATSERVER_H
-#include <qbluetoothserviceinfo.h>
-#include <qbluetoothaddress.h>
+#include <QtCore/qobject.h>
-#include <QtCore/QObject>
-#include <QtCore/QList>
+#include <QtBluetooth/qbluetoothaddress.h>
+#include <QtBluetooth/qbluetoothserviceinfo.h>
QT_FORWARD_DECLARE_CLASS(QBluetoothServer)
QT_FORWARD_DECLARE_CLASS(QBluetoothSocket)
@@ -68,7 +67,7 @@ class ChatServer : public QObject
Q_OBJECT
public:
- explicit ChatServer(QObject *parent = 0);
+ explicit ChatServer(QObject *parent = nullptr);
~ChatServer();
void startServer(const QBluetoothAddress &localAdapter = QBluetoothAddress());
@@ -88,7 +87,7 @@ private slots:
void readSocket();
private:
- QBluetoothServer *rfcommServer;
+ QBluetoothServer *rfcommServer = nullptr;
QBluetoothServiceInfo serviceInfo;
QList<QBluetoothSocket *> clientSockets;
};
diff --git a/examples/bluetooth/btchat/main.cpp b/examples/bluetooth/btchat/main.cpp
index 84b33ae4..5c7bbf75 100644
--- a/examples/bluetooth/btchat/main.cpp
+++ b/examples/bluetooth/btchat/main.cpp
@@ -50,7 +50,7 @@
#include "chat.h"
-#include <QApplication>
+#include <QtWidgets/qapplication.h>
//#include <QtCore/QLoggingCategory>
int main(int argc, char *argv[])
@@ -59,7 +59,7 @@ int main(int argc, char *argv[])
QApplication app(argc, argv);
Chat d;
- QObject::connect(&d, SIGNAL(accepted()), &app, SLOT(quit()));
+ QObject::connect(&d, &Chat::accepted, &app, &QApplication::quit);
#ifdef Q_OS_ANDROID
d.showMaximized();
diff --git a/examples/bluetooth/btchat/remoteselector.cpp b/examples/bluetooth/btchat/remoteselector.cpp
index c1302f6b..2bd1efcc 100644
--- a/examples/bluetooth/btchat/remoteselector.cpp
+++ b/examples/bluetooth/btchat/remoteselector.cpp
@@ -51,14 +51,13 @@
#include "remoteselector.h"
#include "ui_remoteselector.h"
-#include <qbluetoothdeviceinfo.h>
-#include <qbluetoothaddress.h>
-#include <qbluetoothlocaldevice.h>
+#include <QtBluetooth/qbluetoothlocaldevice.h>
+#include <QtBluetooth/qbluetoothservicediscoveryagent.h>
QT_USE_NAMESPACE
RemoteSelector::RemoteSelector(const QBluetoothAddress &localAdapter, QWidget *parent)
-: QDialog(parent), ui(new Ui::RemoteSelector)
+ : QDialog(parent), ui(new Ui::RemoteSelector)
{
ui->setupUi(this);
diff --git a/examples/bluetooth/btchat/remoteselector.h b/examples/bluetooth/btchat/remoteselector.h
index 9174cabd..54649ba9 100644
--- a/examples/bluetooth/btchat/remoteselector.h
+++ b/examples/bluetooth/btchat/remoteselector.h
@@ -51,13 +51,13 @@
#ifndef REMOTESELECTOR_H
#define REMOTESELECTOR_H
-#include <QDialog>
+#include <QtWidgets/qdialog.h>
-#include <qbluetoothuuid.h>
-#include <qbluetoothserviceinfo.h>
-#include <qbluetoothservicediscoveryagent.h>
+#include <QtBluetooth/qbluetoothaddress.h>
+#include <QtBluetooth/qbluetoothserviceinfo.h>
+#include <QtBluetooth/qbluetoothuuid.h>
-QT_FORWARD_DECLARE_CLASS(QModelIndex)
+QT_FORWARD_DECLARE_CLASS(QBluetoothServiceDiscoveryAgent)
QT_FORWARD_DECLARE_CLASS(QListWidgetItem)
QT_USE_NAMESPACE
@@ -73,7 +73,7 @@ class RemoteSelector : public QDialog
Q_OBJECT
public:
- explicit RemoteSelector(const QBluetoothAddress &localAdapter, QWidget *parent = 0);
+ explicit RemoteSelector(const QBluetoothAddress &localAdapter, QWidget *parent = nullptr);
~RemoteSelector();
void startDiscovery(const QBluetoothUuid &uuid);
diff --git a/examples/bluetooth/heartrate-game/bluetoothbaseclass.h b/examples/bluetooth/heartrate-game/bluetoothbaseclass.h
index 74fe4576..5a043b3d 100644
--- a/examples/bluetooth/heartrate-game/bluetoothbaseclass.h
+++ b/examples/bluetooth/heartrate-game/bluetoothbaseclass.h
@@ -60,7 +60,7 @@ class BluetoothBaseClass : public QObject
Q_PROPERTY(QString info READ info WRITE setInfo NOTIFY infoChanged)
public:
- explicit BluetoothBaseClass(QObject *parent = 0);
+ explicit BluetoothBaseClass(QObject *parent = nullptr);
QString error() const;
void setError(const QString& error);
diff --git a/examples/bluetooth/heartrate-game/connectionhandler.h b/examples/bluetooth/heartrate-game/connectionhandler.h
index b4280978..9f5a42cc 100644
--- a/examples/bluetooth/heartrate-game/connectionhandler.h
+++ b/examples/bluetooth/heartrate-game/connectionhandler.h
@@ -63,7 +63,7 @@ class ConnectionHandler : public QObject
Q_OBJECT
public:
- explicit ConnectionHandler(QObject *parent = 0);
+ explicit ConnectionHandler(QObject *parent = nullptr);
bool alive() const;
bool requiresAddressType() const;
diff --git a/examples/bluetooth/heartrate-game/devicefinder.cpp b/examples/bluetooth/heartrate-game/devicefinder.cpp
index 38f538e9..19ebee90 100644
--- a/examples/bluetooth/heartrate-game/devicefinder.cpp
+++ b/examples/bluetooth/heartrate-game/devicefinder.cpp
@@ -85,7 +85,7 @@ DeviceFinder::~DeviceFinder()
void DeviceFinder::startSearch()
{
clearMessages();
- m_deviceHandler->setDevice(0);
+ m_deviceHandler->setDevice(nullptr);
qDeleteAll(m_devices);
m_devices.clear();
@@ -135,7 +135,7 @@ void DeviceFinder::scanFinished()
m_devices.append(new DeviceInfo(QBluetoothDeviceInfo()));
#endif
- if (m_devices.size() == 0)
+ if (m_devices.isEmpty())
setError(tr("No Low Energy devices found."));
else
setInfo(tr("Scanning done."));
@@ -148,10 +148,11 @@ void DeviceFinder::connectToService(const QString &address)
{
m_deviceDiscoveryAgent->stop();
- DeviceInfo *currentDevice = 0;
- for (int i = 0; i < m_devices.size(); i++) {
- if (((DeviceInfo*)m_devices.at(i))->getAddress() == address ) {
- currentDevice = (DeviceInfo*)m_devices.at(i);
+ DeviceInfo *currentDevice = nullptr;
+ for (QObject *entry : qAsConst(m_devices)) {
+ auto device = qobject_cast<DeviceInfo *>(entry);
+ if (device && device->getAddress() == address ) {
+ currentDevice = device;
break;
}
}
diff --git a/examples/bluetooth/heartrate-game/devicefinder.h b/examples/bluetooth/heartrate-game/devicefinder.h
index 2c54f550..6dbb5692 100644
--- a/examples/bluetooth/heartrate-game/devicefinder.h
+++ b/examples/bluetooth/heartrate-game/devicefinder.h
@@ -55,9 +55,10 @@
#include "bluetoothbaseclass.h"
#include <QTimer>
+#include <QVariant>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QBluetoothDeviceInfo>
-#include <QVariant>
+
class DeviceInfo;
class DeviceHandler;
@@ -70,7 +71,7 @@ class DeviceFinder: public BluetoothBaseClass
Q_PROPERTY(QVariant devices READ devices NOTIFY devicesChanged)
public:
- DeviceFinder(DeviceHandler *handler, QObject *parent = 0);
+ DeviceFinder(DeviceHandler *handler, QObject *parent = nullptr);
~DeviceFinder();
bool scanning() const;
diff --git a/examples/bluetooth/heartrate-game/devicehandler.cpp b/examples/bluetooth/heartrate-game/devicehandler.cpp
index 3d263a4c..83a4fbbe 100644
--- a/examples/bluetooth/heartrate-game/devicehandler.cpp
+++ b/examples/bluetooth/heartrate-game/devicehandler.cpp
@@ -56,9 +56,6 @@
DeviceHandler::DeviceHandler(QObject *parent) :
BluetoothBaseClass(parent),
- m_control(0),
- m_service(0),
- m_currentDevice(0),
m_foundHeartRateService(false),
m_measuring(false),
m_currentValue(0),
@@ -107,7 +104,7 @@ void DeviceHandler::setDevice(DeviceInfo *device)
if (m_control) {
m_control->disconnectFromDevice();
delete m_control;
- m_control = 0;
+ m_control = nullptr;
}
// Create new controller and connect it if device available
@@ -115,7 +112,7 @@ void DeviceHandler::setDevice(DeviceInfo *device)
// Make connections
//! [Connect-Signals-1]
- m_control = new QLowEnergyController(m_currentDevice->getDevice(), this);
+ m_control = QLowEnergyController::createCentral(m_currentDevice->getDevice(), this);
//! [Connect-Signals-1]
m_control->setRemoteAddressType(m_addressType);
//! [Connect-Signals-2]
@@ -181,7 +178,7 @@ void DeviceHandler::serviceScanDone()
// Delete old service if available
if (m_service) {
delete m_service;
- m_service = 0;
+ m_service = nullptr;
}
//! [Filter HeartRate service 2]
@@ -240,15 +237,15 @@ void DeviceHandler::updateHeartRateValue(const QLowEnergyCharacteristic &c, cons
if (c.uuid() != QBluetoothUuid(QBluetoothUuid::HeartRateMeasurement))
return;
- const quint8 *data = reinterpret_cast<const quint8 *>(value.constData());
- quint8 flags = data[0];
+ auto data = reinterpret_cast<const quint8 *>(value.constData());
+ quint8 flags = *data;
//Heart Rate
int hrvalue = 0;
if (flags & 0x1) // HR 16 bit? otherwise 8 bit
- hrvalue = (int)qFromLittleEndian<quint16>(data[1]);
+ hrvalue = static_cast<int>(qFromLittleEndian<quint16>(data[1]));
else
- hrvalue = (int)data[1];
+ hrvalue = static_cast<int>(data[1]);
addMeasurement(hrvalue);
}
@@ -276,7 +273,7 @@ void DeviceHandler::confirmedDescriptorWrite(const QLowEnergyDescriptor &d, cons
//disabled notifications -> assume disconnect intent
m_control->disconnectFromDevice();
delete m_service;
- m_service = 0;
+ m_service = nullptr;
}
}
@@ -293,7 +290,7 @@ void DeviceHandler::disconnectService()
m_control->disconnectFromDevice();
delete m_service;
- m_service = 0;
+ m_service = nullptr;
}
}
diff --git a/examples/bluetooth/heartrate-game/devicehandler.h b/examples/bluetooth/heartrate-game/devicehandler.h
index 05984ea5..4fa2782b 100644
--- a/examples/bluetooth/heartrate-game/devicehandler.h
+++ b/examples/bluetooth/heartrate-game/devicehandler.h
@@ -54,8 +54,9 @@
#include "bluetoothbaseclass.h"
#include <QDateTime>
-#include <QVector>
#include <QTimer>
+#include <QVector>
+
#include <QLowEnergyController>
#include <QLowEnergyService>
@@ -82,7 +83,7 @@ public:
};
Q_ENUM(AddressType)
- DeviceHandler(QObject *parent = 0);
+ DeviceHandler(QObject *parent = nullptr);
void setDevice(DeviceInfo *device);
void setAddressType(AddressType type);
@@ -127,10 +128,10 @@ private:
private:
void addMeasurement(int value);
- QLowEnergyController *m_control;
- QLowEnergyService *m_service;
+ QLowEnergyController *m_control = nullptr;
+ QLowEnergyService *m_service = nullptr;
QLowEnergyDescriptor m_notificationDesc;
- DeviceInfo *m_currentDevice;
+ DeviceInfo *m_currentDevice = nullptr;
bool m_foundHeartRateService;
bool m_measuring;
diff --git a/examples/bluetooth/heartrate-game/deviceinfo.cpp b/examples/bluetooth/heartrate-game/deviceinfo.cpp
index 3925ce66..4ed7f1b1 100644
--- a/examples/bluetooth/heartrate-game/deviceinfo.cpp
+++ b/examples/bluetooth/heartrate-game/deviceinfo.cpp
@@ -54,7 +54,7 @@
#include <QBluetoothUuid>
DeviceInfo::DeviceInfo(const QBluetoothDeviceInfo &info):
- QObject(), m_device(info)
+ m_device(info)
{
}
diff --git a/examples/bluetooth/heartrate-game/main.cpp b/examples/bluetooth/heartrate-game/main.cpp
index 33760e9d..099f82a7 100644
--- a/examples/bluetooth/heartrate-game/main.cpp
+++ b/examples/bluetooth/heartrate-game/main.cpp
@@ -49,9 +49,9 @@
****************************************************************************/
#include <QGuiApplication>
+#include <QLoggingCategory>
#include <QQmlApplicationEngine>
#include <QQmlContext>
-#include <QtCore/QLoggingCategory>
#include "connectionhandler.h"
#include "devicefinder.h"
@@ -59,7 +59,7 @@
int main(int argc, char *argv[])
{
- //QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
+ QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
QGuiApplication app(argc, argv);
ConnectionHandler connectionHandler;
diff --git a/examples/bluetooth/heartrate-server/main.cpp b/examples/bluetooth/heartrate-server/main.cpp
index f51a1694..ea01d07d 100644
--- a/examples/bluetooth/heartrate-server/main.cpp
+++ b/examples/bluetooth/heartrate-server/main.cpp
@@ -93,7 +93,7 @@ int main(int argc, char *argv[])
//! [Start Advertising]
const QScopedPointer<QLowEnergyController> leController(QLowEnergyController::createPeripheral());
- const QScopedPointer<QLowEnergyService> service(leController->addService(serviceData));
+ QScopedPointer<QLowEnergyService> service(leController->addService(serviceData));
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,
advertisingData);
//! [Start Advertising]
@@ -123,9 +123,12 @@ int main(int argc, char *argv[])
heartbeatTimer.start(1000);
//! [Provide Heartbeat]
- auto reconnect = [&leController, advertisingData]() {
- leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,
- advertisingData);
+ auto reconnect = [&leController, advertisingData, &service, serviceData]()
+ {
+ service.reset(leController->addService(serviceData));
+ if (!service.isNull())
+ leController->startAdvertising(QLowEnergyAdvertisingParameters(),
+ advertisingData, advertisingData);
};
QObject::connect(leController.data(), &QLowEnergyController::disconnected, reconnect);
diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp
index 58f91f5d..2402f4d1 100644
--- a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp
+++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp
@@ -53,10 +53,6 @@
#include "qbluetoothuuid.h"
#include <QByteArray>
-CharacteristicInfo::CharacteristicInfo()
-{
-}
-
CharacteristicInfo::CharacteristicInfo(const QLowEnergyCharacteristic &characteristic):
m_characteristic(characteristic)
{
@@ -76,7 +72,8 @@ QString CharacteristicInfo::getName() const
return name;
// find descriptor with CharacteristicUserDescription
- foreach (const QLowEnergyDescriptor &descriptor, m_characteristic.descriptors()) {
+ const QList<QLowEnergyDescriptor> descriptors = m_characteristic.descriptors();
+ for (const QLowEnergyDescriptor &descriptor : descriptors) {
if (descriptor.type() == QBluetoothUuid::CharacteristicUserDescription) {
name = descriptor.value();
break;
@@ -130,7 +127,7 @@ QString CharacteristicInfo::getHandle() const
QString CharacteristicInfo::getPermission() const
{
QString properties = "( ";
- int permission = m_characteristic.properties();
+ uint permission = m_characteristic.properties();
if (permission & QLowEnergyCharacteristic::Read)
properties += QStringLiteral(" Read");
if (permission & QLowEnergyCharacteristic::Write)
diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.h b/examples/bluetooth/lowenergyscanner/characteristicinfo.h
index ccc280e8..3f3600ab 100644
--- a/examples/bluetooth/lowenergyscanner/characteristicinfo.h
+++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.h
@@ -65,7 +65,7 @@ class CharacteristicInfo: public QObject
Q_PROPERTY(QString characteristicPermission READ getPermission NOTIFY characteristicChanged)
public:
- CharacteristicInfo();
+ CharacteristicInfo() = default;
CharacteristicInfo(const QLowEnergyCharacteristic &characteristic);
void setCharacteristic(const QLowEnergyCharacteristic &characteristic);
QString getName() const;
diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp
index d70d27a2..82179db1 100644
--- a/examples/bluetooth/lowenergyscanner/device.cpp
+++ b/examples/bluetooth/lowenergyscanner/device.cpp
@@ -61,8 +61,7 @@
#include <QMetaEnum>
#include <QTimer>
-Device::Device():
- connected(false), controller(0), m_deviceScanState(false), randomAddress(false)
+Device::Device()
{
//! [les-devicediscovery-1]
discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
@@ -110,7 +109,7 @@ void Device::startDeviceDiscovery()
void Device::addDevice(const QBluetoothDeviceInfo &info)
{
if (info.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration) {
- DeviceInfo *d = new DeviceInfo(info);
+ auto d = new DeviceInfo(info);
devices.append(d);
setUpdate("Last device added: " + d->getName());
}
@@ -152,9 +151,13 @@ void Device::scanServices(const QString &address)
{
// We need the current device for service discovery.
- for (int i = 0; i < devices.size(); i++) {
- if (((DeviceInfo*)devices.at(i))->getAddress() == address )
- currentDevice.setDevice(((DeviceInfo*)devices.at(i))->getDevice());
+ for (auto d: qAsConst(devices)) {
+ auto device = qobject_cast<DeviceInfo *>(d);
+ if (!device)
+ continue;
+
+ if (device->getAddress() == address )
+ currentDevice.setDevice(device->getDevice());
}
if (!currentDevice.getDevice().isValid()) {
@@ -174,13 +177,13 @@ void Device::scanServices(const QString &address)
if (controller && m_previousAddress != currentDevice.getAddress()) {
controller->disconnectFromDevice();
delete controller;
- controller = 0;
+ controller = nullptr;
}
//! [les-controller-1]
if (!controller) {
// Connecting signals and slots for connecting to LE services.
- controller = new QLowEnergyController(currentDevice.getDevice());
+ controller = QLowEnergyController::createCentral(currentDevice.getDevice());
connect(controller, &QLowEnergyController::connected,
this, &Device::deviceConnected);
connect(controller, QOverload<QLowEnergyController::Error>::of(&QLowEnergyController::error),
@@ -212,7 +215,7 @@ void Device::addLowEnergyService(const QBluetoothUuid &serviceUuid)
return;
}
//! [les-service-1]
- ServiceInfo *serv = new ServiceInfo(service);
+ auto serv = new ServiceInfo(service);
m_services.append(serv);
emit servicesUpdated();
@@ -229,9 +232,12 @@ void Device::serviceScanDone()
void Device::connectToService(const QString &uuid)
{
- QLowEnergyService *service = 0;
- for (int i = 0; i < m_services.size(); i++) {
- ServiceInfo *serviceInfo = (ServiceInfo*)m_services.at(i);
+ QLowEnergyService *service = nullptr;
+ for (auto s: qAsConst(m_services)) {
+ auto serviceInfo = qobject_cast<ServiceInfo *>(s);
+ if (!serviceInfo)
+ continue;
+
if (serviceInfo->getUuid() == uuid) {
service = serviceInfo->service();
break;
@@ -257,8 +263,8 @@ void Device::connectToService(const QString &uuid)
//discovery already done
const QList<QLowEnergyCharacteristic> chars = service->characteristics();
- foreach (const QLowEnergyCharacteristic &ch, chars) {
- CharacteristicInfo *cInfo = new CharacteristicInfo(ch);
+ for (const QLowEnergyCharacteristic &ch : chars) {
+ auto cInfo = new CharacteristicInfo(ch);
m_characteristics.append(cInfo);
}
@@ -280,7 +286,7 @@ void Device::errorReceived(QLowEnergyController::Error /*error*/)
setUpdate(QString("Back\n(%1)").arg(controller->errorString()));
}
-void Device::setUpdate(QString message)
+void Device::setUpdate(const QString &message)
{
m_message = message;
emit updateChanged();
@@ -319,7 +325,7 @@ void Device::serviceDetailsDiscovered(QLowEnergyService::ServiceState newState)
return;
}
- QLowEnergyService *service = qobject_cast<QLowEnergyService *>(sender());
+ auto service = qobject_cast<QLowEnergyService *>(sender());
if (!service)
return;
@@ -327,8 +333,8 @@ void Device::serviceDetailsDiscovered(QLowEnergyService::ServiceState newState)
//! [les-chars]
const QList<QLowEnergyCharacteristic> chars = service->characteristics();
- foreach (const QLowEnergyCharacteristic &ch, chars) {
- CharacteristicInfo *cInfo = new CharacteristicInfo(ch);
+ for (const QLowEnergyCharacteristic &ch : chars) {
+ auto cInfo = new CharacteristicInfo(ch);
m_characteristics.append(cInfo);
}
//! [les-chars]
@@ -360,9 +366,7 @@ bool Device::state()
bool Device::hasControllerError() const
{
- if (controller && controller->error() != QLowEnergyController::NoError)
- return true;
- return false;
+ return (controller && controller->error() != QLowEnergyController::NoError);
}
bool Device::isRandomAddress() const
diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h
index a30cf9b6..ef94c7f9 100644
--- a/examples/bluetooth/lowenergyscanner/device.h
+++ b/examples/bluetooth/lowenergyscanner/device.h
@@ -122,18 +122,18 @@ Q_SIGNALS:
void randomAddressChanged();
private:
- void setUpdate(QString message);
+ void setUpdate(const QString &message);
QBluetoothDeviceDiscoveryAgent *discoveryAgent;
DeviceInfo currentDevice;
- QList<QObject*> devices;
- QList<QObject*> m_services;
- QList<QObject*> m_characteristics;
+ QList<QObject *> devices;
+ QList<QObject *> m_services;
+ QList<QObject *> m_characteristics;
QString m_previousAddress;
QString m_message;
- bool connected;
- QLowEnergyController *controller;
- bool m_deviceScanState;
- bool randomAddress;
+ bool connected = false;
+ QLowEnergyController *controller = nullptr;
+ bool m_deviceScanState = false;
+ bool randomAddress = false;
};
#endif // DEVICE_H
diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp
index 69fedcea..23acc440 100644
--- a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp
+++ b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp
@@ -53,10 +53,6 @@
#include "deviceinfo.h"
-DeviceInfo::DeviceInfo()
-{
-}
-
DeviceInfo::DeviceInfo(const QBluetoothDeviceInfo &d)
{
device = d;
diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.h b/examples/bluetooth/lowenergyscanner/deviceinfo.h
index 8b20fa76..249afad2 100644
--- a/examples/bluetooth/lowenergyscanner/deviceinfo.h
+++ b/examples/bluetooth/lowenergyscanner/deviceinfo.h
@@ -64,7 +64,7 @@ class DeviceInfo: public QObject
Q_PROPERTY(QString deviceName READ getName NOTIFY deviceChanged)
Q_PROPERTY(QString deviceAddress READ getAddress NOTIFY deviceChanged)
public:
- DeviceInfo();
+ DeviceInfo() = default;
DeviceInfo(const QBluetoothDeviceInfo &d);
QString getAddress() const;
QString getName() const;
diff --git a/examples/bluetooth/lowenergyscanner/main.cpp b/examples/bluetooth/lowenergyscanner/main.cpp
index b3fac945..351ab13a 100644
--- a/examples/bluetooth/lowenergyscanner/main.cpp
+++ b/examples/bluetooth/lowenergyscanner/main.cpp
@@ -62,11 +62,11 @@ int main(int argc, char *argv[])
QGuiApplication app(argc, argv);
Device d;
- QQuickView *view = new QQuickView;
+ auto view = new QQuickView;
view->rootContext()->setContextProperty("device", &d);
view->setSource(QUrl("qrc:/assets/main.qml"));
view->setResizeMode(QQuickView::SizeRootObjectToView);
view->show();
- return app.exec();
+ return QGuiApplication::exec();
}
diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp
index 844c9cec..720619d0 100644
--- a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp
+++ b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp
@@ -51,10 +51,6 @@
#include "serviceinfo.h"
-ServiceInfo::ServiceInfo()
-{
-}
-
ServiceInfo::ServiceInfo(QLowEnergyService *service):
m_service(service)
{
diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.h b/examples/bluetooth/lowenergyscanner/serviceinfo.h
index e360fde7..6709be69 100644
--- a/examples/bluetooth/lowenergyscanner/serviceinfo.h
+++ b/examples/bluetooth/lowenergyscanner/serviceinfo.h
@@ -60,7 +60,7 @@ class ServiceInfo: public QObject
Q_PROPERTY(QString serviceUuid READ getUuid NOTIFY serviceChanged)
Q_PROPERTY(QString serviceType READ getType NOTIFY serviceChanged)
public:
- ServiceInfo();
+ ServiceInfo() = default;
ServiceInfo(QLowEnergyService *service);
QLowEnergyService *service() const;
QString getUuid() const;
@@ -71,7 +71,7 @@ Q_SIGNALS:
void serviceChanged();
private:
- QLowEnergyService *m_service;
+ QLowEnergyService *m_service = nullptr;
};
#endif // SERVICEINFO_H
diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp
index 0e6b58fa..acd401f2 100644
--- a/examples/nfc/annotatedurl/annotatedurl.cpp
+++ b/examples/nfc/annotatedurl/annotatedurl.cpp
@@ -143,7 +143,7 @@ void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget *
QPixmap pixmap;
//! [handleMessage 2]
- foreach (const QNdefRecord &record, message) {
+ for (const QNdefRecord &record : message) {
if (record.isRecordType<QNdefNfcTextRecord>()) {
QNdefNfcTextRecord textRecord(record);
diff --git a/examples/nfc/ndefeditor/mainwindow.cpp b/examples/nfc/ndefeditor/mainwindow.cpp
index 38865b88..869f1790 100644
--- a/examples/nfc/ndefeditor/mainwindow.cpp
+++ b/examples/nfc/ndefeditor/mainwindow.cpp
@@ -266,7 +266,7 @@ void MainWindow::ndefMessageRead(const QNdefMessage &message)
{
clearMessage();
- foreach (const QNdefRecord &record, message) {
+ for (const QNdefRecord &record : message) {
if (record.isRecordType<QNdefNfcTextRecord>()) {
addRecord<TextRecordEditor>(ui, record);
} else if (record.isRecordType<QNdefNfcUriRecord>()) {
diff --git a/src/android/nfc/nfc.pro b/src/android/nfc/nfc.pro
index 89026b75..66b1d8a4 100644
--- a/src/android/nfc/nfc.pro
+++ b/src/android/nfc/nfc.pro
@@ -2,12 +2,14 @@ TARGET = QtNfc
CONFIG += java
DESTDIR = $$[QT_INSTALL_PREFIX/get]/jar
+API_VERSION = android-18
PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/nfc
JAVACLASSPATH += $$PWD/src/
JAVASOURCES += \
- $$PWD/src/org/qtproject/qt5/android/nfc/QtNfc.java
+ $$PWD/src/org/qtproject/qt5/android/nfc/QtNfc.java \
+ $$PWD/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java \
# install
target.path = $$[QT_INSTALL_PREFIX]/jar
diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
index 345b87d3..6b0fbcbd 100644
--- a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
+++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java
@@ -169,6 +169,11 @@ public class QtNfc
return m_adapter.isEnabled();
}
+ static public boolean isSupported()
+ {
+ return (m_adapter != null);
+ }
+
static public Intent getStartIntent()
{
Log.d(TAG, "getStartIntent");
diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java
new file mode 100644
index 00000000..ea650ede
--- /dev/null
+++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Governikus GmbH & Co. KG
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtNfc module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+package org.qtproject.qt5.android.nfc;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+
+
+public class QtNfcBroadcastReceiver extends BroadcastReceiver
+{
+ private Context qtContext;
+
+ public QtNfcBroadcastReceiver(Context context)
+ {
+ qtContext = context;
+ IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
+ qtContext.registerReceiver(this, filter);
+ }
+
+ public void unregisterReceiver()
+ {
+ qtContext.unregisterReceiver(this);
+ }
+
+ public void onReceive(Context context, Intent intent)
+ {
+ final int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF);
+ jniOnReceive(state);
+ }
+
+ public native void jniOnReceive(int state);
+}
diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp
index 50465017..c64e61ff 100644
--- a/src/bluetooth/android/androidbroadcastreceiver.cpp
+++ b/src/bluetooth/android/androidbroadcastreceiver.cpp
@@ -54,9 +54,7 @@ AndroidBroadcastReceiver::AndroidBroadcastReceiver(QObject* parent)
: QObject(parent), valid(false)
{
// get Qt Context
- // TODO: replace with QtAndroidPrivate::context() introduced by Qt 5.8
- contextObject = QAndroidJniObject(QtAndroidPrivate::activity()
- ? QtAndroidPrivate::activity() : QtAndroidPrivate::service());
+ contextObject = QAndroidJniObject(QtAndroidPrivate::context());
broadcastReceiverObject = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver");
if (!broadcastReceiverObject.isValid())
diff --git a/src/bluetooth/android/androidbroadcastreceiver_p.h b/src/bluetooth/android/androidbroadcastreceiver_p.h
index ed30acad..49aa63c0 100644
--- a/src/bluetooth/android/androidbroadcastreceiver_p.h
+++ b/src/bluetooth/android/androidbroadcastreceiver_p.h
@@ -65,7 +65,7 @@ class AndroidBroadcastReceiver: public QObject
{
Q_OBJECT
public:
- AndroidBroadcastReceiver(QObject* parent = 0);
+ AndroidBroadcastReceiver(QObject* parent = nullptr);
virtual ~AndroidBroadcastReceiver();
void addAction(const QAndroidJniObject &filter);
diff --git a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp
index 131fb48d..99245af3 100644
--- a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp
+++ b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp
@@ -245,6 +245,7 @@ enum ADType {
ADType32BitUuidComplete = 0x05,
ADType128BitUuidIncomplete = 0x06,
ADType128BitUuidComplete = 0x07,
+ ADTypeManufacturerSpecificData = 0xff,
// .. more will be added when required
};
@@ -548,6 +549,12 @@ QBluetoothDeviceInfo DeviceDiscoveryBroadcastReceiver::retrieveDeviceInfo(JNIEnv
foundService =
QBluetoothUuid(qToBigEndian<quint128>(qFromLittleEndian<quint128>(dataPtr)));
break;
+ case ADTypeManufacturerSpecificData:
+ if (nBytes >= 3) {
+ info.setManufacturerData(qFromLittleEndian<quint16>(dataPtr),
+ QByteArray(dataPtr + 2, nBytes - 3));
+ }
+ break;
default:
// no other types supported yet and therefore skipped
// https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
diff --git a/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h b/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h
index 526c57e2..0302971d 100644
--- a/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h
+++ b/src/bluetooth/android/devicediscoverybroadcastreceiver_p.h
@@ -63,7 +63,7 @@ class DeviceDiscoveryBroadcastReceiver : public AndroidBroadcastReceiver
{
Q_OBJECT
public:
- DeviceDiscoveryBroadcastReceiver(QObject* parent = 0);
+ DeviceDiscoveryBroadcastReceiver(QObject* parent = nullptr);
virtual void onReceive(JNIEnv *env, jobject context, jobject intent);
virtual void onReceiveLeScan(JNIEnv *env, jobject jBluetoothDevice, jint rssi,
jbyteArray scanRecord);
diff --git a/src/bluetooth/android/inputstreamthread.cpp b/src/bluetooth/android/inputstreamthread.cpp
index 982c477b..1cc353a3 100644
--- a/src/bluetooth/android/inputstreamthread.cpp
+++ b/src/bluetooth/android/inputstreamthread.cpp
@@ -42,13 +42,13 @@
#include <QtAndroidExtras/QAndroidJniEnvironment>
#include "android/inputstreamthread_p.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_android_p.h"
QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
-InputStreamThread::InputStreamThread(QBluetoothSocketPrivate *socket)
+InputStreamThread::InputStreamThread(QBluetoothSocketPrivateAndroid *socket)
: QObject(), m_socket_p(socket), expectClosure(false)
{
}
diff --git a/src/bluetooth/android/inputstreamthread_p.h b/src/bluetooth/android/inputstreamthread_p.h
index a6ee0655..060b2acf 100644
--- a/src/bluetooth/android/inputstreamthread_p.h
+++ b/src/bluetooth/android/inputstreamthread_p.h
@@ -59,13 +59,13 @@
QT_BEGIN_NAMESPACE
-class QBluetoothSocketPrivate;
+class QBluetoothSocketPrivateAndroid;
class InputStreamThread : public QObject
{
Q_OBJECT
public:
- explicit InputStreamThread(QBluetoothSocketPrivate *socket_p);
+ explicit InputStreamThread(QBluetoothSocketPrivateAndroid *socket_p);
qint64 bytesAvailable() const;
bool canReadLine() const;
@@ -82,7 +82,7 @@ signals:
void error(int errorCode);
private:
- QBluetoothSocketPrivate *m_socket_p;
+ QBluetoothSocketPrivateAndroid *m_socket_p;
QAndroidJniObject javaInputStreamThread;
mutable QMutex m_mutex;
bool expectClosure;
diff --git a/src/bluetooth/android/localdevicebroadcastreceiver_p.h b/src/bluetooth/android/localdevicebroadcastreceiver_p.h
index 261bf29d..c6ae424d 100644
--- a/src/bluetooth/android/localdevicebroadcastreceiver_p.h
+++ b/src/bluetooth/android/localdevicebroadcastreceiver_p.h
@@ -61,7 +61,7 @@ class LocalDeviceBroadcastReceiver : public AndroidBroadcastReceiver
{
Q_OBJECT
public:
- explicit LocalDeviceBroadcastReceiver(QObject *parent = 0);
+ explicit LocalDeviceBroadcastReceiver(QObject *parent = nullptr);
virtual ~LocalDeviceBroadcastReceiver() {}
virtual void onReceive(JNIEnv *env, jobject context, jobject intent);
virtual void onReceiveLeScan(JNIEnv *, jobject, jint, jbyteArray) {}
diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp
index fee8ce19..b37e3e0c 100644
--- a/src/bluetooth/android/lowenergynotificationhub.cpp
+++ b/src/bluetooth/android/lowenergynotificationhub.cpp
@@ -70,7 +70,7 @@ LowEnergyNotificationHub::LowEnergyNotificationHub(const QBluetoothAddress &remo
jBluetoothLe = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothLE",
"(Ljava/lang/String;Landroid/content/Context;)V",
address.object<jstring>(),
- QtAndroidPrivate::activity() ? QtAndroidPrivate::activity() : QtAndroidPrivate::service());
+ QtAndroidPrivate::context());
}
if (env->ExceptionCheck() || !jBluetoothLe.isValid()) {
diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h
index da651e68..27016bc5 100644
--- a/src/bluetooth/android/lowenergynotificationhub_p.h
+++ b/src/bluetooth/android/lowenergynotificationhub_p.h
@@ -69,7 +69,7 @@ class LowEnergyNotificationHub : public QObject
Q_OBJECT
public:
explicit LowEnergyNotificationHub(const QBluetoothAddress &remote, bool isPeripheral,
- QObject *parent = 0);
+ QObject *parent = nullptr);
~LowEnergyNotificationHub();
static void lowEnergy_connectionChange(JNIEnv*, jobject, jlong qtObject,
diff --git a/src/bluetooth/android/serveracceptancethread_p.h b/src/bluetooth/android/serveracceptancethread_p.h
index 45a5c667..c7c68314 100644
--- a/src/bluetooth/android/serveracceptancethread_p.h
+++ b/src/bluetooth/android/serveracceptancethread_p.h
@@ -62,7 +62,7 @@ class ServerAcceptanceThread : public QObject
{
Q_OBJECT
public:
- explicit ServerAcceptanceThread(QObject *parent = 0);
+ explicit ServerAcceptanceThread(QObject *parent = nullptr);
~ServerAcceptanceThread();
void setServiceDetails(const QBluetoothUuid &uuid, const QString &serviceName,
QBluetooth::SecurityFlags securityFlags);
diff --git a/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h b/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h
index a93cbd3f..4984e358 100644
--- a/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h
+++ b/src/bluetooth/android/servicediscoverybroadcastreceiver_p.h
@@ -64,7 +64,7 @@ class ServiceDiscoveryBroadcastReceiver : public AndroidBroadcastReceiver
{
Q_OBJECT
public:
- ServiceDiscoveryBroadcastReceiver(QObject* parent = 0);
+ ServiceDiscoveryBroadcastReceiver(QObject* parent = nullptr);
virtual void onReceive(JNIEnv *env, jobject context, jobject intent);
virtual void onReceiveLeScan(JNIEnv *, jobject, jint, jbyteArray) {}
diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro
index ee548208..193ed217 100644
--- a/src/bluetooth/bluetooth.pro
+++ b/src/bluetooth/bluetooth.pro
@@ -1,6 +1,6 @@
TARGET = QtBluetooth
QT = core core-private
-
+DEFINES += QT_NO_FOREACH
QMAKE_DOCS = $$PWD/doc/qtbluetooth.qdocconf
OTHER_FILES += doc/src/*.qdoc # show .qdoc files in Qt Creator
@@ -40,7 +40,7 @@ PRIVATE_HEADERS += \
qbluetoothserviceinfo_p.h\
qbluetoothdevicediscoveryagent_p.h\
qbluetoothservicediscoveryagent_p.h\
- qbluetoothsocket_p.h\
+ qbluetoothsocketbase_p.h \
qbluetoothserver_p.h\
qbluetoothtransferreply_p.h \
qbluetoothtransferrequest_p.h \
@@ -60,6 +60,7 @@ SOURCES += \
qbluetoothdevicediscoveryagent.cpp\
qbluetoothservicediscoveryagent.cpp\
qbluetoothsocket.cpp\
+ qbluetoothsocketbase.cpp \
qbluetoothserver.cpp \
qbluetoothlocaldevice.cpp \
qbluetooth.cpp \
@@ -86,7 +87,7 @@ win32 {
qtConfig(bluez) {
QT_PRIVATE = concurrent
- QT_FOR_PRIVATE += dbus
+ QT_FOR_PRIVATE += dbus network
# do not link against QtNetwork but use inline qt_safe_* functions
INCLUDEPATH += $$QT.network_private.includes
@@ -94,16 +95,19 @@ qtConfig(bluez) {
include(bluez/bluez.pri)
PRIVATE_HEADERS += \
- qbluetoothtransferreply_bluez_p.h
+ qbluetoothtransferreply_bluez_p.h \
+ qbluetoothsocket_bluez_p.h \
+ qbluetoothsocket_bluezdbus_p.h
SOURCES += \
qbluetoothserviceinfo_bluez.cpp \
qbluetoothdevicediscoveryagent_bluez.cpp\
qbluetoothservicediscoveryagent_bluez.cpp \
qbluetoothsocket_bluez.cpp \
+ qbluetoothsocket_bluezdbus.cpp \
qbluetoothserver_bluez.cpp \
qbluetoothlocaldevice_bluez.cpp \
- qbluetoothtransferreply_bluez.cpp \
+ qbluetoothtransferreply_bluez.cpp
# old versions of Bluez do not have the required BTLE symbols
@@ -148,8 +152,8 @@ qtConfig(bluez) {
qbluetoothserver_android.cpp \
qlowenergycontroller_android.cpp
- PRIVATE_HEADERS += qlowenergycontroller_android_p.h
-
+ PRIVATE_HEADERS += qlowenergycontroller_android_p.h \
+ qbluetoothsocket_android_p.h
} else:osx {
QT_PRIVATE = concurrent
DEFINES += QT_OSX_BLUETOOTH
@@ -177,6 +181,7 @@ qtConfig(bluez) {
SOURCES -= qbluetoothserviceinfo.cpp
SOURCES -= qbluetoothservicediscoveryagent.cpp
SOURCES -= qbluetoothsocket.cpp
+ SOURCES -= qbluetoothsocketbase.cpp
SOURCES -= qbluetoothserver.cpp
SOURCES -= qlowenergyservice_p.cpp
SOURCES -= qlowenergyservice.cpp
@@ -192,14 +197,15 @@ qtConfig(bluez) {
qlowenergyservice_osx.mm
PRIVATE_HEADERS += \
- qlowenergycontroller_osx_p.h
+ qlowenergycontroller_osx_p.h \
+ qbluetoothsocket_dummy_p.h
include(osx/osxbt.pri)
SOURCES += \
qbluetoothlocaldevice_p.cpp \
qbluetoothserviceinfo_p.cpp \
qbluetoothservicediscoveryagent_p.cpp \
- qbluetoothsocket_p.cpp \
+ qbluetoothsocket_dummy.cpp \
qbluetoothserver_p.cpp
SOURCES -= qbluetoothdevicediscoveryagent.cpp
@@ -225,7 +231,8 @@ qtConfig(bluez) {
qbluetoothsocket_winrt.cpp \
qlowenergycontroller_winrt.cpp
- PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h
+ PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h \
+ qbluetoothsocket_winrt_p.h
lessThan(WINDOWS_SDK_VERSION, 14393) {
DEFINES += QT_WINRT_LIMITED_SERVICEDISCOVERY
@@ -240,11 +247,12 @@ qtConfig(bluez) {
qbluetoothlocaldevice_p.cpp \
qbluetoothserviceinfo_p.cpp \
qbluetoothservicediscoveryagent_p.cpp \
- qbluetoothsocket_p.cpp \
+ qbluetoothsocket_dummy.cpp \
qbluetoothserver_p.cpp \
qlowenergycontroller_p.cpp
- PRIVATE_HEADERS += qlowenergycontroller_p.h
+ PRIVATE_HEADERS += qlowenergycontroller_p.h \
+ qbluetoothsocket_dummy_p.h
}
winrt {
diff --git a/src/bluetooth/bluez/bluetoothmanagement.cpp b/src/bluetooth/bluez/bluetoothmanagement.cpp
index 9df74b34..3f97f75c 100644
--- a/src/bluetooth/bluez/bluetoothmanagement.cpp
+++ b/src/bluetooth/bluez/bluetoothmanagement.cpp
@@ -43,7 +43,7 @@
#include "bluetoothmanagement_p.h"
#include "bluez_data_p.h"
-#include "../qbluetoothsocket_p.h"
+#include "../qbluetoothsocketbase_p.h"
#include <unistd.h>
#include <sys/prctl.h>
diff --git a/src/bluetooth/bluez/bluez.pri b/src/bluetooth/bluez/bluez.pri
index a8ca8e22..4201f104 100644
--- a/src/bluetooth/bluez/bluez.pri
+++ b/src/bluetooth/bluez/bluez.pri
@@ -13,7 +13,9 @@ HEADERS += bluez/manager_p.h \
bluez/properties_p.h \
bluez/adapter1_bluez5_p.h \
bluez/device1_bluez5_p.h \
+ bluez/profilemanager1_p.h \
bluez/profile1_p.h \
+ bluez/profile1context_p.h \
bluez/obex_client1_bluez5_p.h \
bluez/obex_objectpush1_bluez5_p.h \
bluez/obex_transfer1_bluez5_p.h \
@@ -40,7 +42,9 @@ SOURCES += bluez/manager.cpp \
bluez/adapter1_bluez5.cpp \
bluez/device1_bluez5.cpp \
bluez/bluez5_helper.cpp \
+ bluez/profilemanager1.cpp \
bluez/profile1.cpp \
+ bluez/profile1context.cpp \
bluez/obex_client1_bluez5.cpp \
bluez/obex_objectpush1_bluez5.cpp \
bluez/obex_transfer1_bluez5.cpp \
diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp
index f798088e..bacdfe3c 100644
--- a/src/bluetooth/bluez/bluez5_helper.cpp
+++ b/src/bluetooth/bluez/bluez5_helper.cpp
@@ -120,8 +120,8 @@ bool mandatoryHciIoctlsAvailable()
}
// check HCIGETDEVLIST & HCIGETDEVLIST
- struct hci_dev_req *devRequest = 0;
- struct hci_dev_list_req *devRequestList = 0;
+ struct hci_dev_req *devRequest = nullptr;
+ struct hci_dev_list_req *devRequestList = nullptr;
struct hci_dev_info devInfo;
const int devListSize = sizeof(struct hci_dev_list_req)
+ HCI_MAX_DEV * sizeof(struct hci_dev_req);
@@ -282,18 +282,18 @@ QVersionNumber bluetoothdVersion()
struct AdapterData
{
public:
- AdapterData() : reference(1), wasListeningAlready(false), propteryListener(0) {}
+ AdapterData() : reference(1), wasListeningAlready(false) {}
int reference;
bool wasListeningAlready;
- OrgFreedesktopDBusPropertiesInterface *propteryListener;
+ OrgFreedesktopDBusPropertiesInterface *propteryListener = nullptr;
};
class QtBluezDiscoveryManagerPrivate
{
public:
QMap<QString, AdapterData *> references;
- OrgFreedesktopDBusObjectManagerInterface *manager;
+ OrgFreedesktopDBusObjectManagerInterface *manager = nullptr;
};
Q_GLOBAL_STATIC(QtBluezDiscoveryManager, discoveryManager)
@@ -331,7 +331,8 @@ QtBluezDiscoveryManager::~QtBluezDiscoveryManager()
{
qCDebug(QT_BT_BLUEZ) << "Destroying QtBluezDiscoveryManager";
- foreach (const QString &adapterPath, d->references.keys()) {
+ const QList<QString> adapterPaths = d->references.keys();
+ for (const QString &adapterPath : adapterPaths) {
AdapterData *data = d->references.take(adapterPath);
delete data->propteryListener;
@@ -354,7 +355,7 @@ QtBluezDiscoveryManager *QtBluezDiscoveryManager::instance()
return discoveryManager();
Q_ASSERT(false);
- return 0;
+ return nullptr;
}
bool QtBluezDiscoveryManager::registerDiscoveryInterest(const QString &adapterPath)
@@ -416,7 +417,8 @@ void QtBluezDiscoveryManager::unregisterDiscoveryInterest(const QString &adapter
// if (d->references.isEmpty()) {
// qCDebug(QT_BT_BLUEZ) << "No running registration";
// } else {
-// foreach (const QString &path, d->references.keys()) {
+// const QList<QString> paths = d->references.keys();
+// for (const QString &path : paths) {
// qCDebug(QT_BT_BLUEZ) << path << "->" << d->references[path]->reference;
// }
// }
@@ -489,7 +491,7 @@ void QtBluezDiscoveryManager::removeAdapterFromMonitoring(const QString &dbusPat
If \a ok is false the lookup was aborted due to a dbus error and this function
returns an empty string.
*/
-QString findAdapterForAddress(const QBluetoothAddress &wantedAddress, bool *ok = 0)
+QString findAdapterForAddress(const QBluetoothAddress &wantedAddress, bool *ok = nullptr)
{
OrgFreedesktopDBusObjectManagerInterface manager(QStringLiteral("org.bluez"),
QStringLiteral("/"),
@@ -536,7 +538,7 @@ QString findAdapterForAddress(const QBluetoothAddress &wantedAddress, bool *ok =
if (wantedAddress.isNull())
return localAdapters.front().first; // -> return first found adapter
- foreach (const AddressForPathType &pair, localAdapters) {
+ for (const AddressForPathType &pair : qAsConst(localAdapters)) {
if (pair.second == wantedAddress)
return pair.first; // -> found local adapter with wanted address
}
diff --git a/src/bluetooth/bluez/bluez5_helper_p.h b/src/bluetooth/bluez/bluez5_helper_p.h
index 1747f249..0db6f29f 100644
--- a/src/bluetooth/bluez/bluez5_helper_p.h
+++ b/src/bluetooth/bluez/bluez5_helper_p.h
@@ -80,7 +80,7 @@ class QtBluezDiscoveryManager : public QObject
{
Q_OBJECT
public:
- QtBluezDiscoveryManager(QObject* parent = 0);
+ QtBluezDiscoveryManager(QObject* parent = nullptr);
~QtBluezDiscoveryManager();
static QtBluezDiscoveryManager *instance();
diff --git a/src/bluetooth/bluez/generate b/src/bluetooth/bluez/generate
index 5c401ffe..73d3b3f5 100755
--- a/src/bluetooth/bluez/generate
+++ b/src/bluetooth/bluez/generate
@@ -14,7 +14,8 @@ qdbusxml2cpp -a obex_agent_p.h:obex_agent.cpp org.openobex.agent.xml org.openobe
#Bluez 5
qdbusxml2cpp -p adapter1_bluez5_p.h:adapter1_bluez5.cpp org.bluez.Adapter1.xml
qdbusxml2cpp -i bluez5_helper_p.h -p device1_bluez5_p.h:device1_bluez5.cpp org.bluez.Device1.xml
-qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.ProfileManager1.xml
+qdbusxml2cpp -p profilemanager1_p.h:profilemanager1.cpp org.bluez.ProfileManager1.xml
+qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.Profile1.xml
qdbusxml2cpp -i bluez5_helper_p.h -p objectmanager_p.h:objectmanager.cpp org.freedesktop.dbus.objectmanager.xml
qdbusxml2cpp -p properties_p.h:properties.cpp org.freedesktop.dbus.properties.xml
qdbusxml2cpp -p obex_client1_bluez5_p.h:obex_client1_bluez5_p.h org.bluez.Client1.xml
diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp
index be62c881..2a7c9060 100644
--- a/src/bluetooth/bluez/hcimanager.cpp
+++ b/src/bluetooth/bluez/hcimanager.cpp
@@ -40,7 +40,7 @@
#include "hcimanager_p.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocketbase_p.h"
#include "qlowenergyconnectionparameters.h"
#include <QtCore/qloggingcategory.h>
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
HciManager::HciManager(const QBluetoothAddress& deviceAdapter, QObject *parent) :
- QObject(parent), hciSocket(-1), hciDev(-1), notifier(0)
+ QObject(parent), hciSocket(-1), hciDev(-1)
{
hciSocket = ::socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
if (hciSocket < 0) {
@@ -114,8 +114,8 @@ int HciManager::hciForAddress(const QBluetoothAddress &deviceAdapter)
bdaddr_t adapter;
convertAddress(deviceAdapter.toUInt64(), adapter.b);
- struct hci_dev_req *devRequest = 0;
- struct hci_dev_list_req *devRequestList = 0;
+ struct hci_dev_req *devRequest = nullptr;
+ struct hci_dev_list_req *devRequestList = nullptr;
struct hci_dev_info devInfo;
const int devListSize = sizeof(struct hci_dev_list_req)
+ HCI_MAX_DEV * sizeof(struct hci_dev_req);
diff --git a/src/bluetooth/bluez/hcimanager_p.h b/src/bluetooth/bluez/hcimanager_p.h
index 3127a747..15b8791e 100644
--- a/src/bluetooth/bluez/hcimanager_p.h
+++ b/src/bluetooth/bluez/hcimanager_p.h
@@ -72,7 +72,7 @@ public:
LeMetaEvent = 0x3e,
};
- explicit HciManager(const QBluetoothAddress &deviceAdapter, QObject *parent = 0);
+ explicit HciManager(const QBluetoothAddress &deviceAdapter, QObject *parent = nullptr);
~HciManager();
bool isValid() const;
@@ -109,7 +109,7 @@ private:
int hciSocket;
int hciDev;
quint8 sigPacketIdentifier = 0;
- QSocketNotifier *notifier;
+ QSocketNotifier *notifier = nullptr;
QSet<HciManager::HciEvent> runningEvents;
};
diff --git a/src/bluetooth/bluez/org.bluez.Profile1.xml b/src/bluetooth/bluez/org.bluez.Profile1.xml
new file mode 100644
index 00000000..2e5ec131
--- /dev/null
+++ b/src/bluetooth/bluez/org.bluez.Profile1.xml
@@ -0,0 +1,17 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.bluez.Profile1">
+ <method name="NewConnection">
+ <arg type="o" direction="in"/>
+ <arg type="h" direction="in"/>
+ <arg type="a{sv}" direction="in"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QVariantMap"/>
+ </method>
+ <method name="RequestDisconnection">
+ <arg type="o" direction="in"/>
+ </method>
+ <method name="Release">
+ <annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
+ </method>
+ </interface>
+</node>
diff --git a/src/bluetooth/bluez/profile1.cpp b/src/bluetooth/bluez/profile1.cpp
index 26d42c7c..e74be807 100644
--- a/src/bluetooth/bluez/profile1.cpp
+++ b/src/bluetooth/bluez/profile1.cpp
@@ -1,8 +1,8 @@
/*
* This file was generated by qdbusxml2cpp version 0.8
- * Command line was: qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.ProfileManager1.xml
+ * Command line was: qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.Profile1.xml
*
- * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ * qdbusxml2cpp is Copyright (C) 2018 The Qt Company Ltd.
*
* This is an auto-generated file.
* This file may have been hand-edited. Look for HAND-EDIT comments
@@ -12,15 +12,15 @@
#include "profile1_p.h"
/*
- * Implementation of interface class OrgBluezProfileManager1Interface
+ * Implementation of interface class OrgBluezProfile1Interface
*/
-OrgBluezProfileManager1Interface::OrgBluezProfileManager1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
+OrgBluezProfile1Interface::OrgBluezProfile1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
: QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
{
}
-OrgBluezProfileManager1Interface::~OrgBluezProfileManager1Interface()
+OrgBluezProfile1Interface::~OrgBluezProfile1Interface()
{
}
diff --git a/src/bluetooth/bluez/profile1_p.h b/src/bluetooth/bluez/profile1_p.h
index e61fb2a9..63ea40b8 100644
--- a/src/bluetooth/bluez/profile1_p.h
+++ b/src/bluetooth/bluez/profile1_p.h
@@ -1,8 +1,8 @@
/*
* This file was generated by qdbusxml2cpp version 0.8
- * Command line was: qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.ProfileManager1.xml
+ * Command line was: qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.Profile1.xml
*
- * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ * qdbusxml2cpp is Copyright (C) 2018 The Qt Company Ltd.
*
* This is an auto-generated file.
* Do not edit! All changes made to it will be lost.
@@ -21,33 +21,39 @@
#include <QtDBus/QtDBus>
/*
- * Proxy class for interface org.bluez.ProfileManager1
+ * Proxy class for interface org.bluez.Profile1
*/
-class OrgBluezProfileManager1Interface: public QDBusAbstractInterface
+class OrgBluezProfile1Interface: public QDBusAbstractInterface
{
Q_OBJECT
public:
static inline const char *staticInterfaceName()
- { return "org.bluez.ProfileManager1"; }
+ { return "org.bluez.Profile1"; }
public:
- OrgBluezProfileManager1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);
+ OrgBluezProfile1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);
- ~OrgBluezProfileManager1Interface();
+ ~OrgBluezProfile1Interface();
public Q_SLOTS: // METHODS
- inline QDBusPendingReply<> RegisterProfile(const QDBusObjectPath &profile, const QString &UUID, const QVariantMap &options)
+ inline QDBusPendingReply<> NewConnection(const QDBusObjectPath &in0, const QDBusUnixFileDescriptor &in1, const QVariantMap &in2)
{
QList<QVariant> argumentList;
- argumentList << QVariant::fromValue(profile) << QVariant::fromValue(UUID) << QVariant::fromValue(options);
- return asyncCallWithArgumentList(QStringLiteral("RegisterProfile"), argumentList);
+ argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2);
+ return asyncCallWithArgumentList(QStringLiteral("NewConnection"), argumentList);
}
- inline QDBusPendingReply<> UnregisterProfile(const QDBusObjectPath &profile)
+ inline Q_NOREPLY void Release()
{
QList<QVariant> argumentList;
- argumentList << QVariant::fromValue(profile);
- return asyncCallWithArgumentList(QStringLiteral("UnregisterProfile"), argumentList);
+ callWithArgumentList(QDBus::NoBlock, QStringLiteral("Release"), argumentList);
+ }
+
+ inline QDBusPendingReply<> RequestDisconnection(const QDBusObjectPath &in0)
+ {
+ QList<QVariant> argumentList;
+ argumentList << QVariant::fromValue(in0);
+ return asyncCallWithArgumentList(QStringLiteral("RequestDisconnection"), argumentList);
}
Q_SIGNALS: // SIGNALS
@@ -55,7 +61,7 @@ Q_SIGNALS: // SIGNALS
namespace org {
namespace bluez {
- typedef ::OrgBluezProfileManager1Interface ProfileManager1;
+ typedef ::OrgBluezProfile1Interface Profile1;
}
}
#endif
diff --git a/src/bluetooth/bluez/profile1context.cpp b/src/bluetooth/bluez/profile1context.cpp
new file mode 100644
index 00000000..5eeec56a
--- /dev/null
+++ b/src/bluetooth/bluez/profile1context.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "profile1context_p.h"
+
+#include <QtCore/qloggingcategory.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
+
+OrgBluezProfile1ContextInterface::OrgBluezProfile1ContextInterface(QObject *parent) : QObject(parent)
+{
+}
+
+void OrgBluezProfile1ContextInterface::NewConnection(const QDBusObjectPath &/*remotePath*/,
+ const QDBusUnixFileDescriptor &descriptor,
+ const QVariantMap &/*properties*/)
+{
+ qCDebug(QT_BT_BLUEZ) << "Profile Context: New Connection";
+ emit newConnection(descriptor);
+ setDelayedReply(false);
+}
+
+void OrgBluezProfile1ContextInterface::RequestDisconnection(const QDBusObjectPath &/*remotePath*/)
+{
+ qCDebug(QT_BT_BLUEZ) << "Profile Context: Request Disconnection";
+ setDelayedReply(false);
+}
+
+void OrgBluezProfile1ContextInterface::Release()
+{
+ qCDebug(QT_BT_BLUEZ) << "Profile Context: Release";
+}
+
+QT_END_NAMESPACE
diff --git a/src/bluetooth/bluez/profile1context_p.h b/src/bluetooth/bluez/profile1context_p.h
new file mode 100644
index 00000000..bd7b7df3
--- /dev/null
+++ b/src/bluetooth/bluez/profile1context_p.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PROFILECONTEXT_P_H
+#define PROFILECONTEXT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobject.h>
+#include <QtDBus/qdbuscontext.h>
+#include <QtDBus/qdbusextratypes.h>
+#include <QtDBus/qdbusunixfiledescriptor.h>
+
+QT_BEGIN_NAMESPACE
+
+class OrgBluezProfile1ContextInterface : public QObject, protected QDBusContext
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.bluez.Profile1")
+ Q_CLASSINFO("D-Bus Introspection", ""
+" <interface name=\"org.bluez.Profile1\">\n"
+" <method name=\"NewConnection\">\n"
+" <arg direction=\"in\" type=\"o\"/>\n"
+" <arg direction=\"in\" type=\"h\"/>\n"
+" <arg direction=\"in\" type=\"a{sv}\"/>\n"
+" <annotation value=\"QVariantMap\" name=\"org.qtproject.QtDBus.QtTypeName.In2\"/>\n"
+" </method>\n"
+" <method name=\"RequestDisconnection\">\n"
+" <arg direction=\"in\" type=\"o\"/>\n"
+" </method>\n"
+" <method name=\"Release\">\n"
+" <annotation value=\"true\" name=\"org.freedesktop.DBus.Method.NoReply\"/>\n"
+" </method>\n"
+" </interface>\n"
+ "")
+public:
+ explicit OrgBluezProfile1ContextInterface(QObject *parent = nullptr);
+
+Q_SIGNALS:
+ void newConnection(const QDBusUnixFileDescriptor &fd);
+
+public Q_SLOTS:
+ void NewConnection(const QDBusObjectPath &, const QDBusUnixFileDescriptor &,
+ const QVariantMap &);
+ void RequestDisconnection(const QDBusObjectPath &);
+ Q_NOREPLY void Release();
+};
+
+QT_END_NAMESPACE
+
+#endif // PROFILECONTEXT_P_H
diff --git a/src/bluetooth/bluez/profilemanager1.cpp b/src/bluetooth/bluez/profilemanager1.cpp
new file mode 100644
index 00000000..fe685c63
--- /dev/null
+++ b/src/bluetooth/bluez/profilemanager1.cpp
@@ -0,0 +1,26 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp -p profilemanager1_p.h:profilemanager1.cpp org.bluez.ProfileManager1.xml
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * This file may have been hand-edited. Look for HAND-EDIT comments
+ * before re-generating it.
+ */
+
+#include "profilemanager1_p.h"
+
+/*
+ * Implementation of interface class OrgBluezProfileManager1Interface
+ */
+
+OrgBluezProfileManager1Interface::OrgBluezProfileManager1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
+ : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
+{
+}
+
+OrgBluezProfileManager1Interface::~OrgBluezProfileManager1Interface()
+{
+}
+
diff --git a/src/bluetooth/bluez/profilemanager1_p.h b/src/bluetooth/bluez/profilemanager1_p.h
new file mode 100644
index 00000000..5530783b
--- /dev/null
+++ b/src/bluetooth/bluez/profilemanager1_p.h
@@ -0,0 +1,61 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp -p profilemanager1_p.h:profilemanager1.cpp org.bluez.ProfileManager1.xml
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * Do not edit! All changes made to it will be lost.
+ */
+
+#ifndef PROFILEMANAGER1_P_H
+#define PROFILEMANAGER1_P_H
+
+#include <QtCore/QObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+#include <QtDBus/QtDBus>
+
+/*
+ * Proxy class for interface org.bluez.ProfileManager1
+ */
+class OrgBluezProfileManager1Interface: public QDBusAbstractInterface
+{
+ Q_OBJECT
+public:
+ static inline const char *staticInterfaceName()
+ { return "org.bluez.ProfileManager1"; }
+
+public:
+ OrgBluezProfileManager1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr);
+
+ ~OrgBluezProfileManager1Interface();
+
+public Q_SLOTS: // METHODS
+ inline QDBusPendingReply<> RegisterProfile(const QDBusObjectPath &profile, const QString &UUID, const QVariantMap &options)
+ {
+ QList<QVariant> argumentList;
+ argumentList << QVariant::fromValue(profile) << QVariant::fromValue(UUID) << QVariant::fromValue(options);
+ return asyncCallWithArgumentList(QStringLiteral("RegisterProfile"), argumentList);
+ }
+
+ inline QDBusPendingReply<> UnregisterProfile(const QDBusObjectPath &profile)
+ {
+ QList<QVariant> argumentList;
+ argumentList << QVariant::fromValue(profile);
+ return asyncCallWithArgumentList(QStringLiteral("UnregisterProfile"), argumentList);
+ }
+
+Q_SIGNALS: // SIGNALS
+};
+
+namespace org {
+ namespace bluez {
+ typedef ::OrgBluezProfileManager1Interface ProfileManager1;
+ }
+}
+#endif
diff --git a/src/bluetooth/bluez/remotedevicemanager_p.h b/src/bluetooth/bluez/remotedevicemanager_p.h
index a6af8f44..d177d74e 100644
--- a/src/bluetooth/bluez/remotedevicemanager_p.h
+++ b/src/bluetooth/bluez/remotedevicemanager_p.h
@@ -73,7 +73,7 @@ public:
JobDisconnectDevice,
};
- explicit RemoteDeviceManager(const QBluetoothAddress& localAddress, QObject *parent = 0);
+ explicit RemoteDeviceManager(const QBluetoothAddress& localAddress, QObject *parent = nullptr);
bool isJobInProgress() const { return jobInProgress; }
bool scheduleJob(JobType job, const QVector<QBluetoothAddress>& remoteDevices);
diff --git a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp
index 2e28c3f5..a2c4d8b1 100644
--- a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp
+++ b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp
@@ -225,7 +225,7 @@ void MyClass::enableCharNotifications()
{
QBluetoothDeviceInfo remoteDevice;
QLowEnergyService *service;
- QLowEnergyController *control = new QLowEnergyController(remoteDevice, this);
+ QLowEnergyController *control = QLowEnergyController::createCentral(remoteDevice, this);
control->connectToDevice();
diff --git a/src/bluetooth/lecmaccalculator.cpp b/src/bluetooth/lecmaccalculator.cpp
index 47fef7df..b150466e 100644
--- a/src/bluetooth/lecmaccalculator.cpp
+++ b/src/bluetooth/lecmaccalculator.cpp
@@ -123,7 +123,7 @@ quint64 LeCmacCalculator::calculateMac(const QByteArray &message, const quint128
private:
int m_socket;
};
- SocketWrapper cryptoSocket(accept(m_baseSocket, nullptr, 0));
+ SocketWrapper cryptoSocket(accept(m_baseSocket, nullptr, nullptr));
if (cryptoSocket.value() == -1) {
qCWarning(QT_BT_BLUEZ) << "accept() failed for crypto socket:" << strerror(errno);
return 0;
diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm
index 2cece15b..e61968ed 100644
--- a/src/bluetooth/osx/osxbtledeviceinquiry.mm
+++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm
@@ -45,6 +45,7 @@
#include <QtCore/qloggingcategory.h>
#include <QtCore/qdebug.h>
+#include <QtCore/qendian.h>
#include <algorithm>
@@ -81,6 +82,7 @@ struct AdvertisementData {
// For now, we "parse":
QString localName;
QList<QBluetoothUuid> serviceUuids;
+ QHash<quint16, QByteArray> manufacturerData;
// TODO: other keys probably?
AdvertisementData(NSDictionary *AdvertisementData);
};
@@ -105,6 +107,12 @@ AdvertisementData::AdvertisementData(NSDictionary *advertisementData)
for (CBUUID *cbUuid in uuids)
serviceUuids << qt_uuid(cbUuid);
}
+
+ value = [advertisementData objectForKey:CBAdvertisementDataManufacturerDataKey];
+ if (value && [value isKindOfClass:[NSData class]]) {
+ QByteArray data = QByteArray::fromNSData(static_cast<NSData *>(value));
+ manufacturerData.insert(qFromLittleEndian<quint16>(data.constData()), data.mid(2));
+ }
}
}
@@ -321,6 +329,10 @@ QT_USE_NAMESPACE
QBluetoothDeviceInfo::DataIncomplete);
}
+ const QList<quint16> keys = qtAdvData.manufacturerData.keys();
+ for (quint16 key : keys)
+ newDeviceInfo.setManufacturerData(key, qtAdvData.manufacturerData.value(key));
+
// CoreBluetooth scans only for LE devices.
newDeviceInfo.setCoreConfigurations(QBluetoothDeviceInfo::LowEnergyCoreConfiguration);
emit notifier->deviceDiscovered(newDeviceInfo);
diff --git a/src/bluetooth/osx/osxbtobexsession.mm b/src/bluetooth/osx/osxbtobexsession.mm
index e228d6db..9fbc2c12 100644
--- a/src/bluetooth/osx/osxbtobexsession.mm
+++ b/src/bluetooth/osx/osxbtobexsession.mm
@@ -537,14 +537,14 @@ QT_USE_NAMESPACE
const OBEXConnectCommandResponseData *const response = &event->u.connectCommandResponseData;
if (response->headerDataPtr && response->headerDataLength >= 2) {
// 2 == 1 byte headerID + at least 1 byte headerValue ...
- QList<OBEXHeader> headers(qt_bluetooth_headers(static_cast<const uint8_t *>(response->headerDataPtr),
+ const QList<OBEXHeader> headers(qt_bluetooth_headers(static_cast<const uint8_t *>(response->headerDataPtr),
response->headerDataLength));
// ConnectionID is used when multiplexing OBEX connections
// to identify which particular connection this object is
// being sent on. When used, this _must_ be the first
// header sent.
- foreach (const OBEXHeader &header, headers) {
+ for (const OBEXHeader &header : headers) {
if (header.headerID == kOBEXHeaderIDConnectionID) {
connectionID = header.value.value<quint32>();
connectionIDFound = true;
diff --git a/src/bluetooth/osx/osxbtsdpinquiry.mm b/src/bluetooth/osx/osxbtsdpinquiry.mm
index a0bfdeef..6df2d16e 100644
--- a/src/bluetooth/osx/osxbtsdpinquiry.mm
+++ b/src/bluetooth/osx/osxbtsdpinquiry.mm
@@ -188,7 +188,7 @@ using namespace OSXBluetooth;
return kIOReturnError;
}
- foreach (const QBluetoothUuid &qUuid, qtFilters) {
+ for (const QBluetoothUuid &qUuid : qtFilters) {
ObjCStrongReference<IOBluetoothSDPUUID> uuid(iobluetooth_uuid(qUuid));
if (uuid)
[array addObject:uuid];
diff --git a/src/bluetooth/osx/osxbtservicerecord.mm b/src/bluetooth/osx/osxbtservicerecord.mm
index d12169bb..23d55d13 100644
--- a/src/bluetooth/osx/osxbtservicerecord.mm
+++ b/src/bluetooth/osx/osxbtservicerecord.mm
@@ -386,7 +386,7 @@ bool add_sequence_attribute(const QVariant &var, AttributeId key, NSMutableArray
return false;
const Sequence sequence(var.value<Sequence>());
- foreach (const QVariant &var, sequence) {
+ for (const QVariant &var : sequence) {
if (var.canConvert<Sequence>()) {
NSMutableArray *const nested = [NSMutableArray array];
add_sequence_attribute(var, key, nested);
@@ -411,7 +411,7 @@ bool add_sequence_attribute(const QBluetoothServiceInfo &serviceInfo, AttributeI
NSMutableArray *const list = [NSMutableArray array];
const Sequence sequence(var.value<Sequence>());
- foreach (const QVariant &element, sequence) {
+ for (const QVariant &element : sequence) {
if (!add_sequence_attribute(element, key, list))
add_attribute(element, key, list);
}
@@ -433,7 +433,7 @@ Dictionary iobluetooth_service_dictionary(const QBluetoothServiceInfo &serviceIn
dict.reset([[NSMutableDictionary alloc] init]);
- foreach (quint16 key, attributeIds) {
+ for (quint16 key : attributeIds) {
if (key == QSInfo::ProtocolDescriptorList) // We handle it in a special way.
continue;
// TODO: check if non-sequence QVariant still must be
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent.cpp
index 5f142f1a..ac978349 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent.cpp
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent.cpp
@@ -155,6 +155,26 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT)
*/
/*!
+ \fn void QBluetoothDeviceDiscoveryAgent::deviceUpdated(const QBluetoothDeviceInfo &info, QBluetoothDeviceInfo::Fields updatedFields)
+
+ This signal is emitted when the agent receives additional information about
+ the Bluetooth device described by \a info. The \l updatedFields flags tell
+ which information has been updated.
+
+ During discovery, some information can change dynamically, such as
+ \l {signal strength}{QBluetoothDeviceInfo::rssi()} and
+ \l {manufacturerData}{QBluetoothDeviceInfo::manufacturerData()}.
+ This signal informs you that if your application is displaying this data, it
+ can be updated, rather than waiting until the discovery has finished.
+
+ \note This signal is only emitted on Android and BlueZ 5.x.
+
+ \sa QBluetoothDeviceInfo::rssi(), lowEnergyDiscoveryTimeout()
+*/
+
+// TODO deviceUpdated() signal not implemented on WinRT and Apple platforms
+
+/*!
\fn void QBluetoothDeviceDiscoveryAgent::finished()
This signal is emitted when Bluetooth device discovery completes.
@@ -210,7 +230,7 @@ QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(
{
if (!deviceAdapter.isNull()) {
const QList<QBluetoothHostInfo> localDevices = QBluetoothLocalDevice::allDevices();
- foreach (const QBluetoothHostInfo &hostInfo, localDevices) {
+ for (const QBluetoothHostInfo &hostInfo : localDevices) {
if (hostInfo.address() == deviceAdapter)
return;
}
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent.h b/src/bluetooth/qbluetoothdevicediscoveryagent.h
index d3e41265..59a8b456 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent.h
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent.h
@@ -112,6 +112,7 @@ public Q_SLOTS:
Q_SIGNALS:
void deviceDiscovered(const QBluetoothDeviceInfo &info);
+ void deviceUpdated(const QBluetoothDeviceInfo &info, QBluetoothDeviceInfo::Fields updatedFields);
void finished();
void error(QBluetoothDeviceDiscoveryAgent::Error error);
void canceled();
@@ -119,16 +120,6 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QBluetoothDeviceDiscoveryAgent)
QBluetoothDeviceDiscoveryAgentPrivate *d_ptr;
-
-#if QT_CONFIG(bluez)
- Q_PRIVATE_SLOT(d_func(), void _q_deviceFound(const QString &address, const QVariantMap &dict))
- Q_PRIVATE_SLOT(d_func(), void _q_propertyChanged(const QString &name, const QDBusVariant &value))
- Q_PRIVATE_SLOT(d_func(), void _q_InterfacesAdded(const QDBusObjectPath &path, InterfaceList interfaceList))
- Q_PRIVATE_SLOT(d_func(), void _q_discoveryFinished())
- Q_PRIVATE_SLOT(d_func(), void _q_discoveryInterrupted(const QString &path))
- Q_PRIVATE_SLOT(d_func(), void _q_PropertiesChanged(const QString &interface, const QVariantMap &changed_properties, const QStringList &invalidated_properties))
- Q_PRIVATE_SLOT(d_func(), void _q_extendedDeviceDiscoveryTimeout())
-#endif
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QBluetoothDeviceDiscoveryAgent::DiscoveryMethods)
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp
index c7afd578..50f3aef9 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp
@@ -317,12 +317,29 @@ void QBluetoothDeviceDiscoveryAgentPrivate::processDiscoveredDevices(
for (int i = 0; i < discoveredDevices.size(); i++) {
if (discoveredDevices[i].address() == info.address()) {
- if (discoveredDevices[i] == info && lowEnergySearchTimeout > 0) {
- qCDebug(QT_BT_ANDROID) << "Duplicate: " << info.address()
- << "isLeScanResult:" << isLeResult;
+ QBluetoothDeviceInfo::Fields updatedFields = QBluetoothDeviceInfo::Field::None;
+ if (discoveredDevices[i].rssi() != info.rssi()) {
+ qCDebug(QT_BT_ANDROID) << "Updating RSSI for" << info.address()
+ << info.rssi();
+ discoveredDevices[i].setRssi(info.rssi());
+ updatedFields.setFlag(QBluetoothDeviceInfo::Field::RSSI);
+ }
+ if (discoveredDevices[i].manufacturerData() != info.manufacturerData()) {
+ qCDebug(QT_BT_ANDROID) << "Updating manufacturer data for" << info.address();
+ const QVector<quint16> keys = info.manufacturerIds();
+ for (auto key: keys)
+ discoveredDevices[i].setManufacturerData(key, info.manufacturerData(key));
+ updatedFields.setFlag(QBluetoothDeviceInfo::Field::ManufacturerData);
+ }
+
+ if (!updatedFields.testFlag(QBluetoothDeviceInfo::Field::None)) {
+ emit q->deviceUpdated(discoveredDevices[i], updatedFields);
return;
}
+ if (discoveredDevices[i] == info)
+ return;
+
if (discoveredDevices.at(i).name() == info.name()) {
qCDebug(QT_BT_ANDROID) << "Almost Duplicate "<< info.address()
<< info.name() << "- replacing in place";
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp
index 3cc3354a..86b7a5e7 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp
@@ -63,16 +63,10 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(
m_adapterAddress(deviceAdapter),
pendingCancel(false),
pendingStart(false),
- manager(0),
- adapter(0),
- managerBluez5(0),
- adapterBluez5(0),
- discoveryTimer(0),
useExtendedDiscovery(false),
lowEnergySearchTimeout(-1), // remains -1 on BlueZ 4 -> timeout not supported
q_ptr(parent)
{
- Q_Q(QBluetoothDeviceDiscoveryAgent);
if (isBluez5()) {
lowEnergySearchTimeout = 20000;
managerBluez5 = new OrgFreedesktopDBusObjectManagerInterface(
@@ -80,8 +74,10 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(
QStringLiteral("/"),
QDBusConnection::systemBus(), parent);
QObject::connect(managerBluez5,
- SIGNAL(InterfacesAdded(QDBusObjectPath,InterfaceList)),
- q, SLOT(_q_InterfacesAdded(QDBusObjectPath,InterfaceList)));
+ &OrgFreedesktopDBusObjectManagerInterface::InterfacesAdded,
+ [this](const QDBusObjectPath &objectPath, InterfaceList interfacesAndProperties) {
+ this->_q_InterfacesAdded(objectPath, interfacesAndProperties);
+ });
// start private address monitoring
BluetoothManagement::instance();
@@ -89,8 +85,9 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(
manager = new OrgBluezManagerInterface(QStringLiteral("org.bluez"), QStringLiteral("/"),
QDBusConnection::systemBus(), parent);
QObject::connect(&extendedDiscoveryTimer,
- SIGNAL(timeout()),
- q, SLOT(_q_extendedDeviceDiscoveryTimeout()));
+ &QTimer::timeout, [this]() {
+ this->_q_extendedDeviceDiscoveryTimeout();
+ });
extendedDiscoveryTimer.setInterval(10000);
extendedDiscoveryTimer.setSingleShot(true);
}
@@ -164,22 +161,26 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent
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)));
+ QObject::connect(adapter, &OrgBluezAdapterInterface::DeviceFound,
+ [this](const QString &address, const QVariantMap &dict) {
+ this->_q_deviceFound(address, dict);
+ });
+ QObject::connect(adapter, &OrgBluezAdapterInterface::PropertyChanged,
+ [this](const QString &name, const QDBusVariant &value) {
+ this->_q_propertyChanged(name, value);
+ });
QDBusPendingReply<QVariantMap> propertiesReply = adapter->GetProperties();
propertiesReply.waitForFinished();
if (propertiesReply.isError()) {
errorString = propertiesReply.error().message();
delete adapter;
- adapter = 0;
+ adapter = nullptr;
qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString;
lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError;
Q_Q(QBluetoothDeviceDiscoveryAgent);
delete adapter;
- adapter = 0;
+ adapter = nullptr;
emit q->error(lastError);
return;
}
@@ -189,7 +190,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent
lastError = QBluetoothDeviceDiscoveryAgent::PoweredOffError;
errorString = QBluetoothDeviceDiscoveryAgent::tr("Device is powered off");
delete adapter;
- adapter = 0;
+ adapter = nullptr;
emit q->error(lastError);
return;
}
@@ -218,7 +219,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent
discoveryReply.waitForFinished();
if (discoveryReply.isError()) {
delete adapter;
- adapter = 0;
+ adapter = nullptr;
errorString = discoveryReply.error().message();
lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError;
Q_Q(QBluetoothDeviceDiscoveryAgent);
@@ -251,7 +252,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startBluez5(QBluetoothDeviceDiscover
lastError = QBluetoothDeviceDiscoveryAgent::PoweredOffError;
errorString = QBluetoothDeviceDiscoveryAgent::tr("Device is powered off");
delete adapterBluez5;
- adapterBluez5 = 0;
+ adapterBluez5 = nullptr;
emit q->error(lastError);
return;
}
@@ -276,7 +277,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startBluez5(QBluetoothDeviceDiscover
errorString = QBluetoothDeviceDiscoveryAgent::tr("One or more device discovery methods "
"are not supported on this platform");
delete adapterBluez5;
- adapterBluez5 = 0;
+ adapterBluez5 = nullptr;
emit q->error(lastError);
return;
} else if (filterReply.error().type() != QDBusError::UnknownMethod) {
@@ -285,8 +286,10 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startBluez5(QBluetoothDeviceDiscover
}
QtBluezDiscoveryManager::instance()->registerDiscoveryInterest(adapterBluez5->path());
- QObject::connect(QtBluezDiscoveryManager::instance(), SIGNAL(discoveryInterrupted(QString)),
- q, SLOT(_q_discoveryInterrupted(QString)));
+ QObject::connect(QtBluezDiscoveryManager::instance(), &QtBluezDiscoveryManager::discoveryInterrupted,
+ [this](const QString &path){
+ this->_q_discoveryInterrupted(path);
+ });
// collect initial set of information
QDBusPendingReply<ManagedObjectList> reply = managerBluez5->GetManagedObjects();
@@ -317,8 +320,10 @@ void QBluetoothDeviceDiscoveryAgentPrivate::startBluez5(QBluetoothDeviceDiscover
if (!discoveryTimer) {
discoveryTimer = new QTimer(q);
discoveryTimer->setSingleShot(true);
- QObject::connect(discoveryTimer, SIGNAL(timeout()),
- q, SLOT(_q_discoveryFinished()));
+ QObject::connect(discoveryTimer, &QTimer::timeout,
+ [this]() {
+ this->_q_discoveryFinished();
+ });
}
if (lowEnergySearchTimeout > 0) { // otherwise no timeout and stop() required
@@ -360,7 +365,9 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_deviceFound(const QString &addres
if (dict.value(QStringLiteral("RSSI")).isValid())
device.setRssi(dict.value(QStringLiteral("RSSI")).toInt());
QList<QBluetoothUuid> uuids;
- foreach (const QString &u, dict.value(QLatin1String("UUIDs")).toStringList())
+ const QStringList uuidStrings
+ = dict.value(QLatin1String("UUIDs")).toStringList();
+ for (const QString &u : uuidStrings)
uuids.append(QBluetoothUuid(u));
device.setServiceUuids(uuids, QBluetoothDeviceInfo::DataIncomplete);
device.setCached(dict.value(QStringLiteral("Cached")).toBool());
@@ -418,12 +425,17 @@ void QBluetoothDeviceDiscoveryAgentPrivate::deviceFoundBluez5(const QString& dev
qCDebug(QT_BT_BLUEZ) << "Discovered: " << btAddress.toString() << btName
<< "Num UUIDs" << device.uUIDs().count()
<< "total device" << discoveredDevices.count() << "cached"
- << "RSSI" << device.rSSI() << "Class" << btClass;
+ << "RSSI" << device.rSSI() << "Class" << btClass
+ << "Num ManufacturerData" << device.manufacturerData().size();
OrgFreedesktopDBusPropertiesInterface *prop = new OrgFreedesktopDBusPropertiesInterface(
QStringLiteral("org.bluez"), devicePath, QDBusConnection::systemBus(), q);
- QObject::connect(prop, SIGNAL(PropertiesChanged(QString,QVariantMap,QStringList)),
- q, SLOT(_q_PropertiesChanged(QString,QVariantMap,QStringList)));
+ QObject::connect(prop, &OrgFreedesktopDBusPropertiesInterface::PropertiesChanged,
+ [this](const QString &interface, const QVariantMap &changedProperties,
+ const QStringList &invalidatedProperties) {
+ this->_q_PropertiesChanged(interface, changedProperties, invalidatedProperties);
+ });
+
// remember what we have to cleanup
propertyMonitors.append(prop);
@@ -457,6 +469,12 @@ void QBluetoothDeviceDiscoveryAgentPrivate::deviceFoundBluez5(const QString& dev
deviceInfo.setCoreConfigurations(QBluetoothDeviceInfo::BaseRateAndLowEnergyCoreConfiguration);
}
+ const ManufacturerDataList deviceManufacturerData = device.manufacturerData();
+ const QList<quint16> keys = deviceManufacturerData.keys();
+ for (quint16 key : keys)
+ deviceInfo.setManufacturerData(
+ key, deviceManufacturerData.value(key).variant().toByteArray());
+
for (int i = 0; i < discoveredDevices.size(); i++) {
if (discoveredDevices[i].address() == deviceInfo.address()) {
if (discoveredDevices[i] == deviceInfo && lowEnergySearchTimeout > 0) {
@@ -484,13 +502,13 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_propertyChanged(const QString &na
Q_Q(QBluetoothDeviceDiscoveryAgent);
if (pendingCancel && !pendingStart) {
adapter->deleteLater();
- adapter = 0;
+ adapter = nullptr;
pendingCancel = false;
emit q->canceled();
} else if (pendingStart) {
adapter->deleteLater();
- adapter = 0;
+ adapter = nullptr;
pendingStart = false;
pendingCancel = false;
@@ -514,7 +532,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_propertyChanged(const QString &na
QDBusPendingReply<> reply = adapter->StopDiscovery();
reply.waitForFinished();
adapter->deleteLater();
- adapter = 0;
+ adapter = nullptr;
emit q->finished();
}
} else {
@@ -529,7 +547,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_extendedDeviceDiscoveryTimeout()
if (adapter) {
adapter->deleteLater();
- adapter = 0;
+ adapter = nullptr;
}
if (isActive()) {
Q_Q(QBluetoothDeviceDiscoveryAgent);
@@ -566,7 +584,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_discoveryFinished()
propertyMonitors.clear();
delete adapterBluez5;
- adapterBluez5 = 0;
+ adapterBluez5 = nullptr;
if (pendingCancel && !pendingStart) {
pendingCancel = false;
@@ -599,7 +617,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_discoveryInterrupted(const QStrin
// does this automatically when emitting discoveryInterrupted(QString) signal
delete adapterBluez5;
- adapterBluez5 = 0;
+ adapterBluez5 = nullptr;
errorString = QBluetoothDeviceDiscoveryAgent::tr("Bluetooth adapter error");
lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError;
@@ -613,7 +631,8 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_PropertiesChanged(const QString &
{
Q_Q(QBluetoothDeviceDiscoveryAgent);
if (interface == QStringLiteral("org.bluez.Device1")
- && changed_properties.contains(QStringLiteral("RSSI"))) {
+ && (changed_properties.contains(QStringLiteral("RSSI"))
+ || changed_properties.contains(QStringLiteral("ManufacturerData")))) {
OrgFreedesktopDBusPropertiesInterface *props =
qobject_cast<OrgFreedesktopDBusPropertiesInterface *>(q->sender());
if (!props)
@@ -623,10 +642,27 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_PropertiesChanged(const QString &
QDBusConnection::systemBus());
for (int i = 0; i < discoveredDevices.size(); i++) {
if (discoveredDevices[i].address().toString() == device.address()) {
- qCDebug(QT_BT_BLUEZ) << "Updating RSSI for" << device.address()
- << changed_properties.value(QStringLiteral("RSSI"));
- discoveredDevices[i].setRssi(
- changed_properties.value(QStringLiteral("RSSI")).toInt());
+ QBluetoothDeviceInfo::Fields updatedFields = QBluetoothDeviceInfo::Field::None;
+ if (changed_properties.contains(QStringLiteral("RSSI"))) {
+ qCDebug(QT_BT_BLUEZ) << "Updating RSSI for" << device.address()
+ << changed_properties.value(QStringLiteral("RSSI"));
+ discoveredDevices[i].setRssi(
+ changed_properties.value(QStringLiteral("RSSI")).toInt());
+ updatedFields.setFlag(QBluetoothDeviceInfo::Field::RSSI);
+ }
+ if (changed_properties.contains(QStringLiteral("ManufacturerData"))) {
+ qCDebug(QT_BT_BLUEZ) << "Updating ManufacturerData for" << device.address();
+ ManufacturerDataList changedManufacturerData =
+ qdbus_cast< ManufacturerDataList >(changed_properties.value(QStringLiteral("ManufacturerData")));
+
+ const QList<quint16> keys = changedManufacturerData.keys();
+ for (quint16 key : keys) {
+ if (discoveredDevices[i].setManufacturerData(key, changedManufacturerData.value(key).variant().toByteArray()))
+ updatedFields.setFlag(QBluetoothDeviceInfo::Field::ManufacturerData);
+ }
+ }
+ if (!updatedFields.testFlag(QBluetoothDeviceInfo::Field::None))
+ emit q->deviceUpdated(discoveredDevices[i], updatedFields);
return;
}
}
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm
index fed33bb2..4657da82 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent_osx.mm
@@ -553,7 +553,7 @@ QBluetoothDeviceDiscoveryAgent::QBluetoothDeviceDiscoveryAgent(
{
if (!deviceAdapter.isNull()) {
const QList<QBluetoothHostInfo> localDevices = QBluetoothLocalDevice::allDevices();
- foreach (const QBluetoothHostInfo &hostInfo, localDevices) {
+ for (const QBluetoothHostInfo &hostInfo : localDevices) {
if (hostInfo.address() == deviceAdapter)
return;
}
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h
index 15758195..ce31392f 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h
@@ -150,11 +150,11 @@ private:
QBluetoothAddress m_adapterAddress;
bool pendingCancel;
bool pendingStart;
- OrgBluezManagerInterface *manager;
- OrgBluezAdapterInterface *adapter;
- OrgFreedesktopDBusObjectManagerInterface *managerBluez5;
- OrgBluezAdapter1Interface *adapterBluez5;
- QTimer *discoveryTimer;
+ OrgBluezManagerInterface *manager = nullptr;
+ OrgBluezAdapterInterface *adapter = nullptr;
+ OrgFreedesktopDBusObjectManagerInterface *managerBluez5 = nullptr;
+ OrgBluezAdapter1Interface *adapterBluez5 = nullptr;
+ QTimer *discoveryTimer = nullptr;
QList<OrgFreedesktopDBusPropertiesInterface *> propertyMonitors;
void deviceFoundBluez5(const QString& devicePath);
diff --git a/src/bluetooth/qbluetoothdeviceinfo.cpp b/src/bluetooth/qbluetoothdeviceinfo.cpp
index f068963e..bd3b9c00 100644
--- a/src/bluetooth/qbluetoothdeviceinfo.cpp
+++ b/src/bluetooth/qbluetoothdeviceinfo.cpp
@@ -72,6 +72,20 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \enum QBluetoothDeviceInfo::Field
+
+ This enum is used in conjuntion with the \l deviceUpdated() signal and indicates the field
+ that changed.
+
+ \value None None of the values changed.
+ \value RSSI The \l rssi() value of the device changed.
+ \value ManufacturerData The \l manufacturerData() field changed
+ \value All Matches every possible field.
+
+ \since 5.12
+*/
+
+/*!
\enum QBluetoothDeviceInfo::MinorMiscellaneousClass
This enum describes the minor device classes for miscellaneous Bluetooth devices.
@@ -405,6 +419,7 @@ QBluetoothDeviceInfo &QBluetoothDeviceInfo::operator=(const QBluetoothDeviceInfo
d->cached = other.d_func()->cached;
d->serviceUuidsCompleteness = other.d_func()->serviceUuidsCompleteness;
d->serviceUuids = other.d_func()->serviceUuids;
+ d->manufacturerData = other.d_func()->manufacturerData;
d->rssi = other.d_func()->rssi;
d->deviceCoreConfiguration = other.d_func()->deviceCoreConfiguration;
d->deviceUuid = other.d_func()->deviceUuid;
@@ -439,6 +454,8 @@ bool QBluetoothDeviceInfo::operator==(const QBluetoothDeviceInfo &other) const
return false;
if (d->serviceUuids != other.d_func()->serviceUuids)
return false;
+ if (d->manufacturerData != other.d_func()->manufacturerData)
+ return false;
if (d->deviceCoreConfiguration != other.d_func()->deviceCoreConfiguration)
return false;
if (d->deviceUuid != other.d_func()->deviceUuid)
@@ -557,10 +574,78 @@ QList<QBluetoothUuid> QBluetoothDeviceInfo::serviceUuids(DataCompleteness *compl
QBluetoothDeviceInfo::DataCompleteness QBluetoothDeviceInfo::serviceUuidsCompleteness() const
{
Q_D(const QBluetoothDeviceInfo);
-
return d->serviceUuidsCompleteness;
}
+
+/*!
+ Returns all manufacturer ids attached to this device information.
+
+ \sa manufacturerData(), setManufacturerData()
+
+ \since 5.12
+ */
+QVector<quint16> QBluetoothDeviceInfo::manufacturerIds() const
+{
+ Q_D(const QBluetoothDeviceInfo);
+ return d->manufacturerData.keys().toVector();
+}
+
+/*!
+ Returns the data associated with the given \a manufacturerId.
+
+ Manufacturer data is defined by
+ the Supplement to the Bluetooth Core Specification and consists of two segments:
+
+ \list
+ \li Manufacturer specific identifier code from the
+ \l {https://www.bluetooth.com/specifications/assigned-numbers} {Assigned Numbers}
+ Company Identifiers document
+ \li Sequence of arbitrary data octets
+ \endlist
+
+ The interpretation of the data octets is defined by the manufacturer
+ specified by the company identifier.
+
+ \sa manufacturerIds(), setManufacturerData()
+ \since 5.12
+ */
+QByteArray QBluetoothDeviceInfo::manufacturerData(quint16 manufacturerId) const
+{
+ // TODO Currently not implemented on WinRT
+ Q_D(const QBluetoothDeviceInfo);
+ return d->manufacturerData.value(manufacturerId);
+}
+
+/*!
+ Sets the advertised manufacturer \a data for the given \a manufacturerId.
+ Returns true if it was inserted or changed, false if it was already known.
+
+ \sa manufacturerData,
+ \since 5.12
+*/
+bool QBluetoothDeviceInfo::setManufacturerData(quint16 manufacturerId, const QByteArray &data)
+{
+ Q_D(QBluetoothDeviceInfo);
+ const auto it = d->manufacturerData.find(manufacturerId);
+ if (it != d->manufacturerData.end() && *it == data)
+ return false;
+ d->manufacturerData.insert(manufacturerId, data);
+ return true;
+}
+
+/*!
+ Returns the complete set of all manufacturer data.
+
+ \sa setManufacturerData
+ \since 5.12
+*/
+QHash<quint16, QByteArray> QBluetoothDeviceInfo::manufacturerData() const
+{
+ Q_D(const QBluetoothDeviceInfo);
+ return d->manufacturerData;
+}
+
/*!
Sets the CoreConfigurations of the device to \a coreConfigs. This will help to make a difference
between regular and Low Energy devices.
diff --git a/src/bluetooth/qbluetoothdeviceinfo.h b/src/bluetooth/qbluetoothdeviceinfo.h
index f2558bbf..d59eb27d 100644
--- a/src/bluetooth/qbluetoothdeviceinfo.h
+++ b/src/bluetooth/qbluetoothdeviceinfo.h
@@ -44,6 +44,8 @@
#include <QtCore/qstring.h>
#include <QtCore/qmetatype.h>
+#include <QtCore/qbytearray.h>
+#include <QtCore/qvector.h>
QT_BEGIN_NAMESPACE
@@ -196,6 +198,14 @@ public:
DataUnavailable
};
+ enum class Field {
+ None = 0x0000,
+ RSSI = 0x0001,
+ ManufacturerData = 0x0002,
+ All = 0x7fff
+ };
+ Q_DECLARE_FLAGS(Fields, Field)
+
enum CoreConfiguration {
UnknownCoreConfiguration = 0x0,
LowEnergyCoreConfiguration = 0x01,
@@ -235,6 +245,11 @@ public:
QList<QBluetoothUuid> serviceUuids(DataCompleteness *completeness = nullptr) const;
DataCompleteness serviceUuidsCompleteness() const;
+ QVector<quint16> manufacturerIds() const;
+ QByteArray manufacturerData(quint16 manufacturerId) const;
+ bool setManufacturerData(quint16 manufacturerId, const QByteArray &data);
+ QHash<quint16, QByteArray> manufacturerData() const;
+
void setCoreConfigurations(QBluetoothDeviceInfo::CoreConfigurations coreConfigs);
QBluetoothDeviceInfo::CoreConfigurations coreConfigurations() const;
diff --git a/src/bluetooth/qbluetoothdeviceinfo_p.h b/src/bluetooth/qbluetoothdeviceinfo_p.h
index 8d827f0b..15c9e21c 100644
--- a/src/bluetooth/qbluetoothdeviceinfo_p.h
+++ b/src/bluetooth/qbluetoothdeviceinfo_p.h
@@ -56,6 +56,7 @@
#include "qbluetoothuuid.h"
#include <QString>
+#include <QtCore/qhash.h>
QT_BEGIN_NAMESPACE
@@ -78,6 +79,7 @@ public:
QBluetoothDeviceInfo::DataCompleteness serviceUuidsCompleteness;
QList<QBluetoothUuid> serviceUuids;
+ QHash<quint16, QByteArray> manufacturerData;
QBluetoothDeviceInfo::CoreConfigurations deviceCoreConfiguration;
QBluetoothUuid deviceUuid;
diff --git a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
index c247f679..f02c6ab9 100644
--- a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
+++ b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp
@@ -249,7 +249,8 @@ QList<QBluetoothHostInfo> QBluetoothLocalDevice::allDevices()
if (reply.isError())
return localDevices;
- foreach (const QDBusObjectPath &path, reply.value()) {
+ const QList<QDBusObjectPath> paths = reply.value();
+ for (const QDBusObjectPath &path : paths) {
QBluetoothHostInfo hostinfo;
OrgBluezAdapterInterface adapter(QStringLiteral("org.bluez"), path.path(),
QDBusConnection::systemBus());
@@ -274,12 +275,12 @@ static inline OrgBluezDeviceInterface *getDevice(const QBluetoothAddress &addres
QBluetoothLocalDevicePrivate *d_ptr)
{
if (!d_ptr || !d_ptr->adapter)
- return 0;
+ return nullptr;
QDBusPendingReply<QDBusObjectPath> reply = d_ptr->adapter->FindDevice(address.toString());
reply.waitForFinished();
if (reply.isError()) {
qCWarning(QT_BT_BLUEZ) << Q_FUNC_INFO << "reply failed" << reply.error();
- return 0;
+ return nullptr;
}
QDBusObjectPath path = reply.value();
@@ -310,7 +311,7 @@ void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pai
QDBusPendingReply<> cancelReply = d_ptr->pairingTarget->CancelPairing();
cancelReply.waitForFinished();
delete d_ptr->pairingTarget;
- d_ptr->pairingTarget = 0;
+ d_ptr->pairingTarget = nullptr;
}
}
@@ -396,8 +397,8 @@ void QBluetoothLocalDevice::requestPairing(const QBluetoothAddress &address, Pai
QStringLiteral("NoInputNoOutput"));
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
- connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher *)), d_ptr,
- SLOT(pairingCompleted(QDBusPendingCallWatcher *)));
+ connect(watcher, &QDBusPendingCallWatcher::finished,
+ d_ptr, &QBluetoothLocalDevicePrivate::pairingCompleted);
if (reply.isError())
qCWarning(QT_BT_BLUEZ) << Q_FUNC_INFO << reply.error() << d_ptr->agent_path;
@@ -445,7 +446,7 @@ void QBluetoothLocalDevicePrivate::requestPairingBluez5(const QBluetoothAddress
if (pairingTarget) {
delete pairingTarget;
- pairingTarget = 0;
+ pairingTarget = nullptr;
}
// pairing implies that the device was found
@@ -491,8 +492,8 @@ void QBluetoothLocalDevicePrivate::requestPairingBluez5(const QBluetoothAddress
pairingDiscoveryTimer = new QTimer(this);
pairingDiscoveryTimer->setSingleShot(true);
pairingDiscoveryTimer->setInterval(20000); //20s
- connect(pairingDiscoveryTimer, SIGNAL(timeout()),
- SLOT(pairingDiscoveryTimedOut()));
+ connect(pairingDiscoveryTimer, &QTimer::timeout,
+ this, &QBluetoothLocalDevicePrivate::pairingDiscoveryTimedOut);
}
qCDebug(QT_BT_BLUEZ) << "Initiating discovery for pairing on" << targetAddress.toString();
@@ -554,8 +555,8 @@ void QBluetoothLocalDevicePrivate::processPairingBluez5(const QString &objectPat
//initiate the pairing
QDBusPendingReply<> pairReply = pairingTarget->Pair();
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pairReply, this);
- connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- SLOT(pairingCompleted(QDBusPendingCallWatcher*)));
+ connect(watcher, &QDBusPendingCallWatcher::finished,
+ this, &QBluetoothLocalDevicePrivate::pairingCompleted);
return;
}
@@ -566,7 +567,7 @@ void QBluetoothLocalDevicePrivate::processPairingBluez5(const QString &objectPat
pairingTarget->setTrusted(false);
delete pairingTarget;
- pairingTarget = 0;
+ pairingTarget = nullptr;
emit q->pairingFinished(targetAddress, target);
@@ -654,17 +655,8 @@ QBluetoothLocalDevice::Pairing QBluetoothLocalDevice::pairingStatus(
QBluetoothLocalDevicePrivate::QBluetoothLocalDevicePrivate(QBluetoothLocalDevice *q,
QBluetoothAddress address) :
- adapter(0),
- adapterBluez5(0),
- adapterProperties(0),
- managerBluez5(0),
- agent(0),
- manager(0),
localAddress(address),
- pairingTarget(0),
- pairingDiscoveryTimer(0),
pendingHostModeChange(-1),
- msgConnection(0),
q_ptr(q)
{
registerQBluetoothLocalDeviceMetaType();
@@ -686,12 +678,12 @@ void QBluetoothLocalDevicePrivate::connectDeviceChanges()
{
if (adapter) { // invalid QBluetoothLocalDevice due to wrong local adapter address
createCache();
- connect(adapter, SIGNAL(PropertyChanged(QString, QDBusVariant)),
- SLOT(PropertyChanged(QString, QDBusVariant)));
- connect(adapter, SIGNAL(DeviceCreated(QDBusObjectPath)),
- SLOT(_q_deviceCreated(QDBusObjectPath)));
- connect(adapter, SIGNAL(DeviceRemoved(QDBusObjectPath)),
- SLOT(_q_deviceRemoved(QDBusObjectPath)));
+ connect(adapter, &OrgBluezAdapterInterface::PropertyChanged,
+ this, &QBluetoothLocalDevicePrivate::PropertyChanged);
+ connect(adapter, &OrgBluezAdapterInterface::DeviceCreated,
+ this, &QBluetoothLocalDevicePrivate::_q_deviceCreated);
+ connect(adapter, &OrgBluezAdapterInterface::DeviceRemoved,
+ this, &QBluetoothLocalDevicePrivate::_q_deviceRemoved);
} else if (adapterBluez5 && managerBluez5) {
//setup property change notifications for all existing devices
QDBusPendingReply<ManagedObjectList> reply = managerBluez5->GetManagedObjects();
@@ -699,7 +691,7 @@ void QBluetoothLocalDevicePrivate::connectDeviceChanges()
if (reply.isError())
return;
- OrgFreedesktopDBusPropertiesInterface *monitor = 0;
+ OrgFreedesktopDBusPropertiesInterface *monitor = nullptr;
ManagedObjectList managedObjectList = reply.value();
for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) {
@@ -718,8 +710,8 @@ void QBluetoothLocalDevicePrivate::connectDeviceChanges()
monitor = new OrgFreedesktopDBusPropertiesInterface(QStringLiteral("org.bluez"),
path.path(),
QDBusConnection::systemBus(), this);
- connect(monitor, SIGNAL(PropertiesChanged(QString,QVariantMap,QStringList)),
- SLOT(PropertiesChanged(QString,QVariantMap,QStringList)));
+ connect(monitor, &OrgFreedesktopDBusPropertiesInterface::PropertiesChanged,
+ this, &QBluetoothLocalDevicePrivate::PropertiesChanged);
deviceChangeMonitors.insert(path.path(), monitor);
if (ifaceValues.value(QStringLiteral("Connected"), false).toBool()) {
@@ -770,7 +762,8 @@ void QBluetoothLocalDevicePrivate::initializeAdapter()
if (reply.isError())
return;
- foreach (const QDBusObjectPath &path, reply.value()) {
+ const QList<QDBusObjectPath> paths = reply.value();
+ for (const QDBusObjectPath &path : paths) {
OrgBluezAdapterInterface *tmpAdapter
= new OrgBluezAdapterInterface(QStringLiteral("org.bluez"),
path.path(), QDBusConnection::systemBus());
@@ -795,13 +788,13 @@ void QBluetoothLocalDevicePrivate::initializeAdapter()
// monitor case when local adapter is removed
manager = man.take();
- connect(manager, SIGNAL(AdapterRemoved(QDBusObjectPath)),
- this, SLOT(adapterRemoved(QDBusObjectPath)));
+ connect(manager, &OrgBluezManagerInterface::AdapterRemoved,
+ this, &QBluetoothLocalDevicePrivate::adapterRemoved);
currentMode = static_cast<QBluetoothLocalDevice::HostMode>(-1);
if (adapter) {
- connect(adapter, SIGNAL(PropertyChanged(QString, QDBusVariant)),
- SLOT(PropertyChanged(QString, QDBusVariant)));
+ connect(adapter, &OrgBluezAdapterInterface::PropertyChanged,
+ this, &QBluetoothLocalDevicePrivate::PropertyChanged);
agent_path = agentPath;
agent_path.append(QString::fromLatin1("/%1").arg(QRandomGenerator::global()->generate()));
@@ -820,10 +813,10 @@ void QBluetoothLocalDevicePrivate::initializeAdapterBluez5()
QStringLiteral("/"),
QDBusConnection::systemBus(), this);
- connect(managerBluez5, SIGNAL(InterfacesAdded(QDBusObjectPath,InterfaceList)),
- SLOT(InterfacesAdded(QDBusObjectPath,InterfaceList)));
- connect(managerBluez5, SIGNAL(InterfacesRemoved(QDBusObjectPath,QStringList)),
- SLOT(InterfacesRemoved(QDBusObjectPath,QStringList)));
+ connect(managerBluez5, &OrgFreedesktopDBusObjectManagerInterface::InterfacesAdded,
+ this, &QBluetoothLocalDevicePrivate::InterfacesAdded);
+ connect(managerBluez5, &OrgFreedesktopDBusObjectManagerInterface::InterfacesRemoved,
+ this, &QBluetoothLocalDevicePrivate::InterfacesRemoved);
bool ok = true;
const QString adapterPath = findAdapterForAddress(localAddress, &ok);
@@ -840,8 +833,8 @@ void QBluetoothLocalDevicePrivate::initializeAdapterBluez5()
adapterProperties = new OrgFreedesktopDBusPropertiesInterface(
QStringLiteral("org.bluez"), adapterBluez5->path(),
QDBusConnection::systemBus(), this);
- connect(adapterProperties, SIGNAL(PropertiesChanged(QString,QVariantMap,QStringList)),
- SLOT(PropertiesChanged(QString,QVariantMap,QStringList)));
+ connect(adapterProperties, &OrgFreedesktopDBusPropertiesInterface::PropertiesChanged,
+ this, &QBluetoothLocalDevicePrivate::PropertiesChanged);
}
currentMode = static_cast<QBluetoothLocalDevice::HostMode>(-1);
@@ -921,8 +914,8 @@ void QBluetoothLocalDevicePrivate::InterfacesAdded(const QDBusObjectPath &object
QStringLiteral("org.bluez"),
object_path.path(),
QDBusConnection::systemBus());
- connect(monitor, SIGNAL(PropertiesChanged(QString,QVariantMap,QStringList)),
- SLOT(PropertiesChanged(QString,QVariantMap,QStringList)));
+ connect(monitor, &OrgFreedesktopDBusPropertiesInterface::PropertiesChanged,
+ this, &QBluetoothLocalDevicePrivate::PropertiesChanged);
deviceChangeMonitors.insert(object_path.path(), monitor);
const QVariantMap ifaceValues = interfaces_and_properties.value(QStringLiteral("org.bluez.Device1"));
@@ -971,14 +964,14 @@ void QBluetoothLocalDevicePrivate::InterfacesRemoved(const QDBusObjectPath &obje
qCDebug(QT_BT_BLUEZ) << "Adapter" << adapterBluez5->path() << "was removed";
// current adapter was removed -> invalidate the instance
delete adapterBluez5;
- adapterBluez5 = 0;
+ adapterBluez5 = nullptr;
managerBluez5->deleteLater();
- managerBluez5 = 0;
+ managerBluez5 = nullptr;
delete adapterProperties;
- adapterProperties = 0;
+ adapterProperties = nullptr;
delete pairingTarget;
- pairingTarget = 0;
+ pairingTarget = nullptr;
// turn off connectivity monitoring
qDeleteAll(deviceChangeMonitors);
@@ -1005,19 +998,19 @@ void QBluetoothLocalDevicePrivate::adapterRemoved(const QDBusObjectPath &deviceP
<< "was removed. Invalidating object.";
// the current adapter was removed
delete adapter;
- adapter = 0;
+ adapter = nullptr;
manager->deleteLater();
- manager = 0;
+ manager = nullptr;
// stop all pairing related activities
if (agent) {
QDBusConnection::systemBus().unregisterObject(agent_path);
delete agent;
- agent = 0;
+ agent = nullptr;
}
delete msgConnection;
- msgConnection = 0;
+ msgConnection = nullptr;
// stop all connectivity monitoring
qDeleteAll(devices);
@@ -1041,8 +1034,8 @@ void QBluetoothLocalDevicePrivate::_q_deviceCreated(const QDBusObjectPath &devic
= new OrgBluezDeviceInterface(QStringLiteral("org.bluez"),
device.path(),
QDBusConnection::systemBus(), this);
- connect(deviceInterface, SIGNAL(PropertyChanged(QString, QDBusVariant)),
- SLOT(_q_devicePropertyChanged(QString, QDBusVariant)));
+ connect(deviceInterface, &OrgBluezDeviceInterface::PropertyChanged,
+ this, &QBluetoothLocalDevicePrivate::_q_devicePropertyChanged);
devices << deviceInterface;
QDBusPendingReply<QVariantMap> properties
= deviceInterface->asyncCall(QStringLiteral("GetProperties"));
@@ -1067,7 +1060,7 @@ void QBluetoothLocalDevicePrivate::_q_deviceCreated(const QDBusObjectPath &devic
void QBluetoothLocalDevicePrivate::_q_deviceRemoved(const QDBusObjectPath &device)
{
- foreach (OrgBluezDeviceInterface *deviceInterface, devices) {
+ for (OrgBluezDeviceInterface *deviceInterface : qAsConst(devices)) {
if (deviceInterface->path() == device.path()) {
devices.remove(deviceInterface);
delete deviceInterface; // deviceDisconnected is already emitted by _q_devicePropertyChanged
@@ -1113,13 +1106,14 @@ void QBluetoothLocalDevicePrivate::createCache()
qCWarning(QT_BT_BLUEZ) << reply.error().message();
return;
}
- foreach (const QDBusObjectPath &device, reply.value()) {
+ const QList<QDBusObjectPath> knownDevices = reply.value();
+ for (const QDBusObjectPath &device : knownDevices) {
OrgBluezDeviceInterface *deviceInterface =
new OrgBluezDeviceInterface(QStringLiteral("org.bluez"),
device.path(),
QDBusConnection::systemBus(), this);
- connect(deviceInterface, SIGNAL(PropertyChanged(QString,QDBusVariant)),
- SLOT(_q_devicePropertyChanged(QString,QDBusVariant)));
+ connect(deviceInterface, &OrgBluezDeviceInterface::PropertyChanged,
+ this, &QBluetoothLocalDevicePrivate::_q_devicePropertyChanged);
devices << deviceInterface;
QDBusPendingReply<QVariantMap> properties
@@ -1159,7 +1153,7 @@ void QBluetoothLocalDevice::pairingConfirmation(bool confirmation)
d_ptr->msgConnection->send(error);
}
delete d_ptr->msgConnection;
- d_ptr->msgConnection = 0;
+ d_ptr->msgConnection = nullptr;
}
QString QBluetoothLocalDevicePrivate::RequestPinCode(const QDBusObjectPath &in0)
@@ -1232,7 +1226,7 @@ void QBluetoothLocalDevicePrivate::pairingCompleted(QDBusPendingCallWatcher *wat
pairingTarget->setTrusted(false);
delete pairingTarget;
- pairingTarget = 0;
+ pairingTarget = nullptr;
emit q->pairingFinished(targetAddress, pairing);
}
diff --git a/src/bluetooth/qbluetoothlocaldevice_p.cpp b/src/bluetooth/qbluetoothlocaldevice_p.cpp
index 7a9d8221..b93de6a9 100644
--- a/src/bluetooth/qbluetoothlocaldevice_p.cpp
+++ b/src/bluetooth/qbluetoothlocaldevice_p.cpp
@@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE
QBluetoothLocalDevice::QBluetoothLocalDevice(QObject *parent) :
QObject(parent),
- d_ptr(0)
+ d_ptr(nullptr)
{
#if !defined(QT_IOS_BLUETOOTH) && !defined(QT_WINRT_BLUETOOTH)
printDummyWarning();
@@ -59,7 +59,7 @@ QBluetoothLocalDevice::QBluetoothLocalDevice(QObject *parent) :
QBluetoothLocalDevice::QBluetoothLocalDevice(const QBluetoothAddress &, QObject *parent) :
QObject(parent),
- d_ptr(0)
+ d_ptr(nullptr)
{
registerQBluetoothLocalDeviceMetaType();
}
diff --git a/src/bluetooth/qbluetoothlocaldevice_p.h b/src/bluetooth/qbluetoothlocaldevice_p.h
index a52b683c..038effcd 100644
--- a/src/bluetooth/qbluetoothlocaldevice_p.h
+++ b/src/bluetooth/qbluetoothlocaldevice_p.h
@@ -140,13 +140,13 @@ public:
QSet<OrgBluezDeviceInterface *> devices;
QSet<QBluetoothAddress> connectedDevicesSet;
- OrgBluezAdapterInterface *adapter; //Bluez 4
- OrgBluezAdapter1Interface *adapterBluez5; //Bluez 5
- OrgFreedesktopDBusPropertiesInterface *adapterProperties; //Bluez 5
- OrgFreedesktopDBusObjectManagerInterface *managerBluez5; //Bluez 5
+ OrgBluezAdapterInterface *adapter = nullptr; //Bluez 4
+ OrgBluezAdapter1Interface *adapterBluez5 = nullptr; //Bluez 5
+ OrgFreedesktopDBusPropertiesInterface *adapterProperties = nullptr; //Bluez 5
+ OrgFreedesktopDBusObjectManagerInterface *managerBluez5 = nullptr; //Bluez 5
QMap<QString, OrgFreedesktopDBusPropertiesInterface *> deviceChangeMonitors; //Bluez 5
- OrgBluezAgentAdaptor *agent;
- OrgBluezManagerInterface *manager;
+ OrgBluezAgentAdaptor *agent = nullptr;
+ OrgBluezManagerInterface *manager = nullptr;
QList<QBluetoothAddress> connectedDevices() const;
@@ -154,8 +154,8 @@ public:
QBluetoothAddress localAddress;
QBluetoothAddress address;
QBluetoothLocalDevice::Pairing pairing;
- OrgBluezDevice1Interface *pairingTarget;
- QTimer *pairingDiscoveryTimer;
+ OrgBluezDevice1Interface *pairingTarget = nullptr;
+ QTimer *pairingDiscoveryTimer = nullptr;
QBluetoothLocalDevice::HostMode currentMode;
int pendingHostModeChange;
@@ -199,7 +199,7 @@ private:
void connectDeviceChanges();
QDBusMessage msgConfirmation;
- QDBusConnection *msgConnection;
+ QDBusConnection *msgConnection = nullptr;
QString deviceAdapterPath;
QBluetoothLocalDevice *q_ptr;
diff --git a/src/bluetooth/qbluetoothserver.h b/src/bluetooth/qbluetoothserver.h
index 193101fc..5e71b58c 100644
--- a/src/bluetooth/qbluetoothserver.h
+++ b/src/bluetooth/qbluetoothserver.h
@@ -104,10 +104,6 @@ protected:
private:
Q_DECLARE_PRIVATE(QBluetoothServer)
-
-#if QT_CONFIG(bluez)
- Q_PRIVATE_SLOT(d_func(), void _q_newConnection())
-#endif
};
QT_END_NAMESPACE
diff --git a/src/bluetooth/qbluetoothserver_android.cpp b/src/bluetooth/qbluetoothserver_android.cpp
index 7d3d3588..4c469c76 100644
--- a/src/bluetooth/qbluetoothserver_android.cpp
+++ b/src/bluetooth/qbluetoothserver_android.cpp
@@ -41,7 +41,7 @@
#include "qbluetoothserver.h"
#include "qbluetoothserver_p.h"
#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_android_p.h"
#include "qbluetoothlocaldevice.h"
#include "android/serveracceptancethread_p.h"
@@ -70,7 +70,7 @@ QBluetoothServerPrivate::~QBluetoothServerPrivate()
__fakeServerPorts.remove(this);
thread->deleteLater();
- thread = 0;
+ thread = nullptr;
}
bool QBluetoothServerPrivate::initiateActiveListening(
@@ -142,7 +142,7 @@ bool QBluetoothServer::listen(const QBluetoothAddress &localAdapter, quint16 por
if (!localAdapter.isNull()) {
bool found = false;
- foreach (const QBluetoothHostInfo &hostInfo, localDevices) {
+ for (const QBluetoothHostInfo &hostInfo : localDevices) {
if (hostInfo.address() == localAdapter) {
found = true;
break;
@@ -254,7 +254,7 @@ QBluetoothSocket *QBluetoothServer::nextPendingConnection()
bool success = newSocket->d_ptr->setSocketDescriptor(socket, d->serverType);
if (!success) {
delete newSocket;
- newSocket = 0;
+ newSocket = nullptr;
}
return newSocket;
diff --git a/src/bluetooth/qbluetoothserver_bluez.cpp b/src/bluetooth/qbluetoothserver_bluez.cpp
index fe36a712..f45aee28 100644
--- a/src/bluetooth/qbluetoothserver_bluez.cpp
+++ b/src/bluetooth/qbluetoothserver_bluez.cpp
@@ -40,6 +40,7 @@
#include "qbluetoothserver.h"
#include "qbluetoothserver_p.h"
#include "qbluetoothsocket.h"
+#include "qbluetoothsocket_bluez_p.h"
#include "qbluetoothlocaldevice.h"
#include "bluez/bluez_data_p.h"
@@ -52,24 +53,27 @@ QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
-static inline void convertAddress(quint64 from, quint8 (&to)[6])
+QBluetoothSocket *QBluetoothServerPrivate::createSocketForServer(
+ QBluetoothServiceInfo::Protocol socketType)
{
- to[0] = (from >> 0) & 0xff;
- to[1] = (from >> 8) & 0xff;
- to[2] = (from >> 16) & 0xff;
- to[3] = (from >> 24) & 0xff;
- to[4] = (from >> 32) & 0xff;
- to[5] = (from >> 40) & 0xff;
+ // QBluetoothServer does not work with the BluetoothSocket implementation for DBus.
+ // Fall back to the raw socket implementation.
+ // Usually the private implementation is picked based on detected BlueZ version.
+
+ // ownership of these objects is taken care of inside QBluetoothSocket and QBluetoothServer
+ QBluetoothSocketPrivateBluez *rawSocketPrivate = new QBluetoothSocketPrivateBluez();
+ QBluetoothSocket *socket = new QBluetoothSocket(rawSocketPrivate, socketType);
+ return socket;
}
QBluetoothServerPrivate::QBluetoothServerPrivate(QBluetoothServiceInfo::Protocol sType)
: maxPendingConnections(1), securityFlags(QBluetooth::Authorization), serverType(sType),
- m_lastError(QBluetoothServer::NoError), socketNotifier(0)
+ m_lastError(QBluetoothServer::NoError)
{
if (sType == QBluetoothServiceInfo::RfcommProtocol)
- socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
+ socket = createSocketForServer(QBluetoothServiceInfo::RfcommProtocol);
else
- socket = new QBluetoothSocket(QBluetoothServiceInfo::L2capProtocol);
+ socket = createSocketForServer(QBluetoothServiceInfo::L2capProtocol);
}
QBluetoothServerPrivate::~QBluetoothServerPrivate()
@@ -143,7 +147,7 @@ void QBluetoothServer::close()
Q_D(QBluetoothServer);
delete d->socketNotifier;
- d->socketNotifier = 0;
+ d->socketNotifier = nullptr;
d->socket->close();
}
@@ -185,9 +189,9 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port)
delete d->socket;
if (serverType() == QBluetoothServiceInfo::RfcommProtocol)
- d->socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
+ d->socket = QBluetoothServerPrivate::createSocketForServer(QBluetoothServiceInfo::RfcommProtocol);
else
- d->socket = new QBluetoothSocket(QBluetoothServiceInfo::L2capProtocol);
+ d->socket = QBluetoothServerPrivate::createSocketForServer(QBluetoothServiceInfo::L2capProtocol);
sock = d->socket->socketDescriptor();
if (sock < 0) {
@@ -235,7 +239,7 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port)
}
}
- d->setSocketSecurityLevel(d->securityFlags, 0);
+ d->setSocketSecurityLevel(d->securityFlags, nullptr);
if (::listen(sock, d->maxPendingConnections) < 0) {
d->m_lastError = InputOutputError;
@@ -248,7 +252,10 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port)
if (!d->socketNotifier) {
d->socketNotifier = new QSocketNotifier(d->socket->socketDescriptor(),
QSocketNotifier::Read);
- connect(d->socketNotifier, SIGNAL(activated(int)), this, SLOT(_q_newConnection()));
+ connect(d->socketNotifier, &QSocketNotifier::activated,
+ [d](){
+ d->_q_newConnection();
+ });
}
return true;
@@ -278,7 +285,7 @@ QBluetoothSocket *QBluetoothServer::nextPendingConnection()
Q_D(QBluetoothServer);
if (!hasPendingConnections())
- return 0;
+ return nullptr;
int pending;
if (d->serverType == QBluetoothServiceInfo::RfcommProtocol) {
@@ -294,7 +301,7 @@ QBluetoothSocket *QBluetoothServer::nextPendingConnection()
}
if (pending >= 0) {
- QBluetoothSocket *newSocket = new QBluetoothSocket;
+ QBluetoothSocket *newSocket = QBluetoothServerPrivate::createSocketForServer();
if (d->serverType == QBluetoothServiceInfo::RfcommProtocol)
newSocket->setSocketDescriptor(pending, QBluetoothServiceInfo::RfcommProtocol);
else
@@ -307,7 +314,7 @@ QBluetoothSocket *QBluetoothServer::nextPendingConnection()
d->socketNotifier->setEnabled(true);
}
- return 0;
+ return nullptr;
}
QBluetoothAddress QBluetoothServer::serverAddress() const
diff --git a/src/bluetooth/qbluetoothserver_osx.mm b/src/bluetooth/qbluetoothserver_osx.mm
index a1774d14..d7f29ed3 100644
--- a/src/bluetooth/qbluetoothserver_osx.mm
+++ b/src/bluetooth/qbluetoothserver_osx.mm
@@ -43,7 +43,7 @@
// The order is important: a workround for
// a private header included by private header
// (incorrectly handled dependencies).
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocketbase_p.h"
#include "qbluetoothsocket_osx_p.h"
#include "qbluetoothlocaldevice.h"
diff --git a/src/bluetooth/qbluetoothserver_p.cpp b/src/bluetooth/qbluetoothserver_p.cpp
index 7f8e3525..4f28c9b1 100644
--- a/src/bluetooth/qbluetoothserver_p.cpp
+++ b/src/bluetooth/qbluetoothserver_p.cpp
@@ -89,7 +89,7 @@ bool QBluetoothServer::hasPendingConnections() const
QBluetoothSocket *QBluetoothServer::nextPendingConnection()
{
- return 0;
+ return nullptr;
}
QBluetoothAddress QBluetoothServer::serverAddress() const
diff --git a/src/bluetooth/qbluetoothserver_p.h b/src/bluetooth/qbluetoothserver_p.h
index 9c414cdb..d78eee5f 100644
--- a/src/bluetooth/qbluetoothserver_p.h
+++ b/src/bluetooth/qbluetoothserver_p.h
@@ -98,6 +98,8 @@ public:
void _q_newConnection();
void setSocketSecurityLevel(QBluetooth::SecurityFlags requestedSecLevel, int *errnoCode);
QBluetooth::SecurityFlags socketSecurityLevel() const;
+ static QBluetoothSocket *createSocketForServer(
+ QBluetoothServiceInfo::Protocol socketType = QBluetoothServiceInfo::RfcommProtocol);
#endif
public:
@@ -113,7 +115,7 @@ protected:
private:
QBluetoothServer::Error m_lastError;
#if QT_CONFIG(bluez)
- QSocketNotifier *socketNotifier;
+ QSocketNotifier *socketNotifier = nullptr;
#elif defined(QT_ANDROID_BLUETOOTH)
ServerAcceptanceThread *thread;
QString m_serviceName;
diff --git a/src/bluetooth/qbluetoothserver_winrt.cpp b/src/bluetooth/qbluetoothserver_winrt.cpp
index 08aa45b4..3bcd6b33 100644
--- a/src/bluetooth/qbluetoothserver_winrt.cpp
+++ b/src/bluetooth/qbluetoothserver_winrt.cpp
@@ -40,7 +40,7 @@
#include "qbluetoothserver.h"
#include "qbluetoothserver_p.h"
#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_winrt_p.h"
#include <QtCore/QLoggingCategory>
#include <QtCore/private/qeventdispatcher_winrt_p.h>
@@ -238,7 +238,7 @@ QBluetoothSocket *QBluetoothServer::nextPendingConnection()
bool success = newSocket->d_ptr->setSocketDescriptor(socket, d->serverType);
if (!success) {
delete newSocket;
- newSocket = 0;
+ newSocket = nullptr;
}
return newSocket;
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp
index 05d62ab1..3260d7db 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp
@@ -177,7 +177,7 @@ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoot
{
if (!deviceAdapter.isNull()) {
const QList<QBluetoothHostInfo> localDevices = QBluetoothLocalDevice::allDevices();
- foreach (const QBluetoothHostInfo &hostInfo, localDevices) {
+ for (const QBluetoothHostInfo &hostInfo : localDevices) {
if (hostInfo.address() == deviceAdapter)
return;
}
@@ -434,13 +434,19 @@ void QBluetoothServiceDiscoveryAgentPrivate::startDeviceDiscovery()
#else
deviceDiscoveryAgent = new QBluetoothDeviceDiscoveryAgent(q);
#endif
- QObject::connect(deviceDiscoveryAgent, SIGNAL(finished()),
- q, SLOT(_q_deviceDiscoveryFinished()));
- QObject::connect(deviceDiscoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
- q, SLOT(_q_deviceDiscovered(QBluetoothDeviceInfo)));
- QObject::connect(deviceDiscoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)),
- q, SLOT(_q_deviceDiscoveryError(QBluetoothDeviceDiscoveryAgent::Error)));
-
+ QObject::connect(deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished,
+ [this](){
+ this->_q_deviceDiscoveryFinished();
+ });
+ QObject::connect(deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,
+ [this](const QBluetoothDeviceInfo &info){
+ this->_q_deviceDiscovered(info);
+ });
+ QObject::connect(deviceDiscoveryAgent,
+ QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::error),
+ [this](QBluetoothDeviceDiscoveryAgent::Error newError){
+ this->_q_deviceDiscoveryError(newError);
+ });
}
setDiscoveryState(DeviceDiscovery);
@@ -459,7 +465,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::stopDeviceDiscovery()
deviceDiscoveryAgent->stop();
delete deviceDiscoveryAgent;
- deviceDiscoveryAgent = 0;
+ deviceDiscoveryAgent = nullptr;
setDiscoveryState(Inactive);
@@ -484,7 +490,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryFinished()
}
delete deviceDiscoveryAgent;
- deviceDiscoveryAgent = 0;
+ deviceDiscoveryAgent = nullptr;
startServiceDiscovery();
}
@@ -510,7 +516,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_deviceDiscoveryError(QBluetoothD
deviceDiscoveryAgent->stop();
delete deviceDiscoveryAgent;
- deviceDiscoveryAgent = 0;
+ deviceDiscoveryAgent = nullptr;
setDiscoveryState(Inactive);
Q_Q(QBluetoothServiceDiscoveryAgent);
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.h b/src/bluetooth/qbluetoothservicediscoveryagent.h
index 4a553c7d..1db05f55 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent.h
+++ b/src/bluetooth/qbluetoothservicediscoveryagent.h
@@ -110,25 +110,6 @@ Q_SIGNALS:
private:
QBluetoothServiceDiscoveryAgentPrivate *d_ptr;
-
-
- Q_PRIVATE_SLOT(d_func(), void _q_deviceDiscovered(const QBluetoothDeviceInfo &info))
- Q_PRIVATE_SLOT(d_func(), void _q_deviceDiscoveryFinished())
- Q_PRIVATE_SLOT(d_func(), void _q_deviceDiscoveryError(QBluetoothDeviceDiscoveryAgent::Error))
- Q_PRIVATE_SLOT(d_func(), void _q_serviceDiscoveryFinished())
-
-#if QT_CONFIG(bluez)
- Q_PRIVATE_SLOT(d_func(), void _q_discoveredServices(QDBusPendingCallWatcher*))
- Q_PRIVATE_SLOT(d_func(), void _q_createdDevice(QDBusPendingCallWatcher*))
- Q_PRIVATE_SLOT(d_func(), void _q_foundDevice(QDBusPendingCallWatcher*))
- Q_PRIVATE_SLOT(d_func(), void _q_sdpScannerDone(int,QProcess::ExitStatus))
-#endif
-#ifdef QT_ANDROID_BLUETOOTH
- Q_PRIVATE_SLOT(d_func(), void _q_processFetchedUuids(const QBluetoothAddress &address,
- const QList<QBluetoothUuid>&))
- Q_PRIVATE_SLOT(d_func(), void _q_fetchUuidsTimeout())
- Q_PRIVATE_SLOT(d_func(), void _q_hostModeStateChanged(QBluetoothLocalDevice::HostMode state))
-#endif
};
QT_END_NAMESPACE
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp
index 0d2aff2c..ac2b1906 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_android.cpp
@@ -37,6 +37,7 @@
**
****************************************************************************/
+#include <QtCore/qcoreapplication.h>
#include <QtCore/QLoggingCategory>
#include <QtCore/QTimer>
#include <QtCore/private/qjnihelpers_p.h>
@@ -56,9 +57,9 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID)
QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(
QBluetoothServiceDiscoveryAgent *qp, const QBluetoothAddress &/*deviceAdapter*/)
: error(QBluetoothServiceDiscoveryAgent::NoError),
- state(Inactive), deviceDiscoveryAgent(0),
+ state(Inactive),
mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery),
- singleDevice(false), receiver(0), localDeviceReceiver(0),
+ singleDevice(false),
q_ptr(qp)
{
@@ -198,14 +199,18 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr
//Full discovery uses BluetoothDevice.fetchUuidsWithSdp()
if (!receiver) {
receiver = new ServiceDiscoveryBroadcastReceiver();
- QObject::connect(receiver, SIGNAL(uuidFetchFinished(QBluetoothAddress,QList<QBluetoothUuid>)),
- q, SLOT(_q_processFetchedUuids(QBluetoothAddress,QList<QBluetoothUuid>)));
+ QObject::connect(receiver, &ServiceDiscoveryBroadcastReceiver::uuidFetchFinished,
+ [this](const QBluetoothAddress &address, const QList<QBluetoothUuid>& uuids) {
+ this->_q_processFetchedUuids(address, uuids);
+ });
}
if (!localDeviceReceiver) {
localDeviceReceiver = new LocalDeviceBroadcastReceiver();
- QObject::connect(localDeviceReceiver, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)),
- q, SLOT(_q_hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
+ QObject::connect(localDeviceReceiver, &LocalDeviceBroadcastReceiver::hostModeStateChanged,
+ [this](QBluetoothLocalDevice::HostMode state){
+ this->_q_hostModeStateChanged(state);
+ });
}
jboolean result = remoteDevice.callMethod<jboolean>("fetchUuidsWithSdp");
@@ -213,7 +218,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr
//kill receiver to limit load of signals
receiver->unregisterReceiver();
receiver->deleteLater();
- receiver = 0;
+ receiver = nullptr;
qCWarning(QT_BT_ANDROID) << "Cannot start dynamic fetch.";
_q_serviceDiscoveryFinished();
}
@@ -228,7 +233,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::stop()
//kill receiver to limit load of signals
receiver->unregisterReceiver();
receiver->deleteLater();
- receiver = 0;
+ receiver = nullptr;
Q_Q(QBluetoothServiceDiscoveryAgent);
emit q->canceled();
@@ -245,8 +250,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_processFetchedUuids(
//could not find any service for the current address/device -> go to next one
if (address.isNull() || uuids.isEmpty()) {
if (discoveredDevices.count() == 1) {
- Q_Q(QBluetoothServiceDiscoveryAgent);
- QTimer::singleShot(4000, q, SLOT(_q_fetchUuidsTimeout()));
+ QTimer::singleShot(4000, qApp, [this]() {
+ this->_q_fetchUuidsTimeout();
+ });
}
_q_serviceDiscoveryFinished();
return;
@@ -295,8 +301,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_processFetchedUuids(
//the discovery on the last device cannot immediately finish
//we have to grant the 2 seconds timeout delay
if (discoveredDevices.count() == 1) {
- Q_Q(QBluetoothServiceDiscoveryAgent);
- QTimer::singleShot(4000, q, SLOT(_q_fetchUuidsTimeout()));
+ QTimer::singleShot(4000, qApp, [this]() {
+ this->_q_fetchUuidsTimeout();
+ });
return;
}
@@ -433,7 +440,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_fetchUuidsTimeout()
QPair<QBluetoothDeviceInfo,QList<QBluetoothUuid> > pair;
const QList<QBluetoothAddress> keys = sdpCache.keys();
- foreach (const QBluetoothAddress &key, keys) {
+ for (const QBluetoothAddress &key : keys) {
pair = sdpCache.take(key);
populateDiscoveredServices(pair.first, pair.second);
}
@@ -443,7 +450,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_fetchUuidsTimeout()
//kill receiver to limit load of signals
receiver->unregisterReceiver();
receiver->deleteLater();
- receiver = 0;
+ receiver = nullptr;
_q_serviceDiscoveryFinished();
}
@@ -460,7 +467,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_hostModeStateChanged(QBluetoothL
//kill receiver to limit load of signals
receiver->unregisterReceiver();
receiver->deleteLater();
- receiver = 0;
+ receiver = nullptr;
Q_Q(QBluetoothServiceDiscoveryAgent);
emit q->error(error);
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
index ea9f354b..dbd084ed 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
@@ -60,9 +60,8 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(
QBluetoothServiceDiscoveryAgent *qp, const QBluetoothAddress &deviceAdapter)
-: error(QBluetoothServiceDiscoveryAgent::NoError), m_deviceAdapterAddress(deviceAdapter), state(Inactive), deviceDiscoveryAgent(0),
+: error(QBluetoothServiceDiscoveryAgent::NoError), m_deviceAdapterAddress(deviceAdapter), state(Inactive),
mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery), singleDevice(false),
- manager(0), managerBluez5(0), adapter(0), device(0), sdpScannerProcess(0),
q_ptr(qp)
{
if (isBluez5()) {
@@ -129,8 +128,10 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(deviceObjectPath, q);
watcher->setProperty("_q_BTaddress", QVariant::fromValue(address));
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- q, SLOT(_q_foundDevice(QDBusPendingCallWatcher*)));
+ QObject::connect(watcher, &QDBusPendingCallWatcher::finished,
+ [this](QDBusPendingCallWatcher *watcher){
+ this->_q_foundDevice(watcher);
+ });
}
// Bluez 5
@@ -213,8 +214,11 @@ void QBluetoothServiceDiscoveryAgentPrivate::runExternalSdpScan(
if (QT_BT_BLUEZ().isDebugEnabled())
sdpScannerProcess->setProcessChannelMode(QProcess::ForwardedErrorChannel);
sdpScannerProcess->setProgram(fileInfo.canonicalFilePath());
- q->connect(sdpScannerProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
- q, SLOT(_q_sdpScannerDone(int,QProcess::ExitStatus)));
+ q->connect(sdpScannerProcess,
+ QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
+ [this](int exitCode, QProcess::ExitStatus status){
+ this->_q_sdpScannerDone(exitCode, status);
+ });
}
QStringList arguments;
@@ -223,7 +227,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::runExternalSdpScan(
// No filter implies PUBLIC_BROWSE_GROUP based SDP scan
if (!uuidFilter.isEmpty()) {
arguments << QLatin1String("-u"); // cmd line option for list of uuids
- foreach (const QBluetoothUuid& uuid, uuidFilter)
+ for (const QBluetoothUuid& uuid : qAsConst(uuidFilter))
arguments << uuid.toString();
}
@@ -286,14 +290,16 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_finishSdpScan(QBluetoothServiceD
errorString = errorDescription;
emit q->error(error);
} else if (!xmlRecords.isEmpty() && discoveryState() != Inactive) {
- foreach (const QString &record, xmlRecords) {
+ for (const QString &record : xmlRecords) {
const QBluetoothServiceInfo serviceInfo = parseServiceXml(record);
//apply uuidFilter
if (!uuidFilter.isEmpty()) {
bool serviceNameMatched = uuidFilter.contains(serviceInfo.serviceUuid());
bool serviceClassMatched = false;
- foreach (const QBluetoothUuid &id, serviceInfo.serviceClassUuids()) {
+ const QList<QBluetoothUuid> serviceClassUuids
+ = serviceInfo.serviceClassUuids();
+ for (const QBluetoothUuid &id : serviceClassUuids) {
if (uuidFilter.contains(id)) {
serviceClassMatched = true;
break;
@@ -325,18 +331,18 @@ void QBluetoothServiceDiscoveryAgentPrivate::stop()
{
qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "Stop called";
if (device) {
- //we are waiting for _q_discoveredServices() slot to be called
+ //we are waiting for _q_discoveredServices() to be called
// adapter is already 0
QDBusPendingReply<> reply = device->CancelDiscovery();
reply.waitForFinished();
device->deleteLater();
- device = 0;
+ device = nullptr;
Q_ASSERT(!adapter);
} else if (adapter) {
- //we are waiting for _q_createdDevice() slot to be called
+ //we are waiting for _q_createdDevice() to be called
adapter->deleteLater();
- adapter = 0;
+ adapter = nullptr;
Q_ASSERT(!device);
}
@@ -376,7 +382,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_foundDevice(QDBusPendingCallWatc
if (deviceObjectPath.error().name() != QStringLiteral("org.bluez.Error.DoesNotExist")) {
qCDebug(QT_BT_BLUEZ) << "Find device failed Error: " << error << deviceObjectPath.error().name();
delete adapter;
- adapter = 0;
+ adapter = nullptr;
if (singleDevice) {
error = QBluetoothServiceDiscoveryAgent::InputOutputError;
errorString = QBluetoothServiceDiscoveryAgent::tr("Unable to access device");
@@ -389,8 +395,11 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_foundDevice(QDBusPendingCallWatc
deviceObjectPath = adapter->CreateDevice(address.toString());
watcher = new QDBusPendingCallWatcher(deviceObjectPath, q);
watcher->setProperty("_q_BTaddress", QVariant::fromValue(address));
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- q, SLOT(_q_createdDevice(QDBusPendingCallWatcher*)));
+ QObject::connect(watcher, &QDBusPendingCallWatcher::finished,
+ [this](QDBusPendingCallWatcher *watcher){
+ this->_q_createdDevice(watcher);
+ });
+
return;
}
@@ -417,7 +426,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa
if (deviceObjectPath.error().name() != QLatin1String("org.bluez.Error.AlreadyExists")) {
qCDebug(QT_BT_BLUEZ) << "Create device failed Error: " << error << deviceObjectPath.error().name();
delete adapter;
- adapter = 0;
+ adapter = nullptr;
if (singleDevice) {
error = QBluetoothServiceDiscoveryAgent::InputOutputError;
errorString = QBluetoothServiceDiscoveryAgent::tr("Unable to access device");
@@ -440,7 +449,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::discoverServices(const QString &dev
deviceObjectPath,
QDBusConnection::systemBus());
delete adapter;
- adapter = 0;
+ adapter = nullptr;
QVariantMap deviceProperties;
QString classType;
@@ -467,7 +476,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::discoverServices(const QString &dev
if (classType.isEmpty()) { //is BLE device or device properties above not retrievable
qCDebug(QT_BT_BLUEZ) << "Discovered BLE-only device. Normal service discovery skipped.";
delete device;
- device = 0;
+ device = nullptr;
const QStringList deviceUuids = deviceProperties.value(QStringLiteral("UUIDs")).toStringList();
for (int i = 0; i < deviceUuids.size(); i++) {
@@ -519,7 +528,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::discoverServices(const QString &dev
_q_serviceDiscoveryFinished();
} else {
QString pattern;
- foreach (const QBluetoothUuid &uuid, uuidFilter)
+ for (const QBluetoothUuid &uuid : qAsConst(uuidFilter))
pattern += uuid.toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')) + QLatin1Char(' ');
pattern = pattern.trimmed();
@@ -527,8 +536,10 @@ void QBluetoothServiceDiscoveryAgentPrivate::discoverServices(const QString &dev
QDBusPendingReply<ServiceMap> discoverReply = device->DiscoverServices(pattern);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(discoverReply, q);
- QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- q, SLOT(_q_discoveredServices(QDBusPendingCallWatcher*)));
+ QObject::connect(watcher, &QDBusPendingCallWatcher::finished,
+ [this](QDBusPendingCallWatcher *watcher){
+ this->_q_discoveredServices(watcher);
+ });
}
}
@@ -553,18 +564,18 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingC
emit q->error(error);
}
delete device;
- device = 0;
+ device = nullptr;
_q_serviceDiscoveryFinished();
return;
}
- ServiceMap map = reply.value();
+ const ServiceMap map = reply.value();
qCDebug(QT_BT_BLUEZ) << "Parsing xml" << discoveredDevices.at(0).address().toString() << discoveredDevices.count() << map.count();
- foreach (const QString &record, reply.value()) {
+ for (const QString &record : map) {
QBluetoothServiceInfo serviceInfo = parseServiceXml(record);
if (!serviceInfo.isValid())
@@ -578,7 +589,8 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingC
// to our own naming resolution.
if (serviceInfo.serviceName().isEmpty()
&& !serviceInfo.serviceClassUuids().isEmpty()) {
- foreach (const QBluetoothUuid &classUuid, serviceInfo.serviceClassUuids()) {
+ const QList<QBluetoothUuid> classUuids = serviceInfo.serviceClassUuids();
+ for (const QBluetoothUuid &classUuid : classUuids) {
bool ok = false;
QBluetoothUuid::ServiceClassUuid clsId
= static_cast<QBluetoothUuid::ServiceClassUuid>(classUuid.toUInt16(&ok));
@@ -603,7 +615,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingC
watcher->deleteLater();
delete device;
- device = 0;
+ device = nullptr;
_q_serviceDiscoveryFinished();
}
@@ -622,7 +634,7 @@ QBluetoothServiceInfo QBluetoothServiceDiscoveryAgentPrivate::parseServiceXml(
if (xml.tokenType() == QXmlStreamReader::StartElement &&
xml.name() == QLatin1String("attribute")) {
quint16 attributeId =
- xml.attributes().value(QLatin1String("id")).toString().toUShort(0, 0);
+ xml.attributes().value(QLatin1String("id")).toString().toUShort(nullptr, 0);
if (xml.readNextStartElement()) {
const QVariant value = readAttributeValue(xml);
@@ -745,19 +757,19 @@ QVariant QBluetoothServiceDiscoveryAgentPrivate::readAttributeValue(QXmlStreamRe
xml.skipCurrentElement();
return value == QLatin1String("true");
} else if (xml.name() == QLatin1String("uint8")) {
- quint8 value = xml.attributes().value(QStringLiteral("value")).toString().toUShort(0, 0);
+ quint8 value = xml.attributes().value(QStringLiteral("value")).toString().toUShort(nullptr, 0);
xml.skipCurrentElement();
return value;
} else if (xml.name() == QLatin1String("uint16")) {
- quint16 value = xml.attributes().value(QStringLiteral("value")).toString().toUShort(0, 0);
+ quint16 value = xml.attributes().value(QStringLiteral("value")).toString().toUShort(nullptr, 0);
xml.skipCurrentElement();
return value;
} else if (xml.name() == QLatin1String("uint32")) {
- quint32 value = xml.attributes().value(QStringLiteral("value")).toString().toUInt(0, 0);
+ quint32 value = xml.attributes().value(QStringLiteral("value")).toString().toUInt(nullptr, 0);
xml.skipCurrentElement();
return value;
} else if (xml.name() == QLatin1String("uint64")) {
- quint64 value = xml.attributes().value(QStringLiteral("value")).toString().toULongLong(0, 0);
+ quint64 value = xml.attributes().value(QStringLiteral("value")).toString().toULongLong(nullptr, 0);
xml.skipCurrentElement();
return value;
} else if (xml.name() == QLatin1String("uuid")) {
@@ -765,10 +777,10 @@ QVariant QBluetoothServiceDiscoveryAgentPrivate::readAttributeValue(QXmlStreamRe
const QString value = xml.attributes().value(QStringLiteral("value")).toString();
if (value.startsWith(QStringLiteral("0x"))) {
if (value.length() == 6) {
- quint16 v = value.toUShort(0, 0);
+ quint16 v = value.toUShort(nullptr, 0);
uuid = QBluetoothUuid(v);
} else if (value.length() == 10) {
- quint32 v = value.toUInt(0, 0);
+ quint32 v = value.toUInt(nullptr, 0);
uuid = QBluetoothUuid(v);
}
} else {
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm
index 1d0cc7da..61d3bcc2 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_osx.mm
@@ -441,7 +441,7 @@ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoot
{
if (!deviceAdapter.isNull()) {
const QList<QBluetoothHostInfo> localDevices = QBluetoothLocalDevice::allDevices();
- foreach (const QBluetoothHostInfo &hostInfo, localDevices) {
+ for (const QBluetoothHostInfo &hostInfo : localDevices) {
if (hostInfo.address() == deviceAdapter)
return;
}
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp
index 948fdf3e..a23fda95 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.cpp
@@ -49,7 +49,6 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(
QBluetoothServiceDiscoveryAgent *qp, const QBluetoothAddress &deviceAdapter)
: error(QBluetoothServiceDiscoveryAgent::NoError),
state(Inactive),
- deviceDiscoveryAgent(0),
mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery),
singleDevice(false),
q_ptr(qp)
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.h b/src/bluetooth/qbluetoothservicediscoveryagent_p.h
index 2a57c531..dbf8b1d4 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_p.h
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.h
@@ -178,23 +178,23 @@ private:
DiscoveryState state;
QList<QBluetoothUuid> uuidFilter;
- QBluetoothDeviceDiscoveryAgent *deviceDiscoveryAgent;
+ QBluetoothDeviceDiscoveryAgent *deviceDiscoveryAgent = nullptr;
QBluetoothServiceDiscoveryAgent::DiscoveryMode mode;
bool singleDevice;
#if QT_CONFIG(bluez)
QString foundHostAdapterPath;
- OrgBluezManagerInterface *manager;
- OrgFreedesktopDBusObjectManagerInterface *managerBluez5;
- OrgBluezAdapterInterface *adapter;
- OrgBluezDeviceInterface *device;
- QProcess *sdpScannerProcess;
+ OrgBluezManagerInterface *manager = nullptr;
+ OrgFreedesktopDBusObjectManagerInterface *managerBluez5 = nullptr;
+ OrgBluezAdapterInterface *adapter = nullptr;
+ OrgBluezDeviceInterface *device = nullptr;
+ QProcess *sdpScannerProcess = nullptr;
#endif
#ifdef QT_ANDROID_BLUETOOTH
- ServiceDiscoveryBroadcastReceiver *receiver;
- LocalDeviceBroadcastReceiver *localDeviceReceiver;
+ ServiceDiscoveryBroadcastReceiver *receiver = nullptr;
+ LocalDeviceBroadcastReceiver *localDeviceReceiver = nullptr;
QAndroidJniObject btAdapter;
QMap<QBluetoothAddress,QPair<QBluetoothDeviceInfo,QList<QBluetoothUuid> > > sdpCache;
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_winrt.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_winrt.cpp
index 77310d01..c6b00346 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_winrt.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_winrt.cpp
@@ -480,7 +480,6 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(
QBluetoothServiceDiscoveryAgent *qp, const QBluetoothAddress &deviceAdapter)
: error(QBluetoothServiceDiscoveryAgent::NoError),
state(Inactive),
- deviceDiscoveryAgent(0),
mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery),
singleDevice(false),
q_ptr(qp)
@@ -537,7 +536,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::processFoundService(quint64 deviceA
if (!uuidFilter.isEmpty()) {
bool serviceNameMatched = uuidFilter.contains(info.serviceUuid());
bool serviceClassMatched = false;
- for (const QBluetoothUuid &id : info.serviceClassUuids()) {
+ const QList<QBluetoothUuid> serviceClassUuids
+ = info.serviceClassUuids();
+ for (const QBluetoothUuid &id : serviceClassUuids) {
if (uuidFilter.contains(id)) {
serviceClassMatched = true;
break;
@@ -553,7 +554,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::processFoundService(quint64 deviceA
QBluetoothServiceInfo returnInfo(info);
bool deviceFound;
- for (const QBluetoothDeviceInfo &deviceInfo : discoveredDevices) {
+ for (const QBluetoothDeviceInfo &deviceInfo : qAsConst(discoveredDevices)) {
if (deviceInfo.address().toUInt64() == deviceAddress) {
deviceFound = true;
returnInfo.setDevice(deviceInfo);
@@ -576,7 +577,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::onScanFinished(quint64 deviceAddres
{
Q_Q(QBluetoothServiceDiscoveryAgent);
bool deviceFound;
- for (const QBluetoothDeviceInfo &deviceInfo : discoveredDevices) {
+ for (const QBluetoothDeviceInfo &deviceInfo : qAsConst(discoveredDevices)) {
if (deviceInfo.address().toUInt64() == deviceAddress) {
deviceFound = true;
discoveredDevices.removeOne(deviceInfo);
diff --git a/src/bluetooth/qbluetoothserviceinfo.cpp b/src/bluetooth/qbluetoothserviceinfo.cpp
index d706e4a7..9da1cf78 100644
--- a/src/bluetooth/qbluetoothserviceinfo.cpp
+++ b/src/bluetooth/qbluetoothserviceinfo.cpp
@@ -346,6 +346,7 @@ bool QBluetoothServiceInfo::unregisterService()
QBluetoothServiceInfo::QBluetoothServiceInfo()
: d_ptr(QSharedPointer<QBluetoothServiceInfoPrivate>::create())
{
+ qRegisterMetaType<QBluetoothServiceInfo>();
}
/*!
@@ -606,12 +607,12 @@ static void dumpAttributeVariant(QDebug dbg, const QVariant &var, const QString&
} else if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Sequence>()) {
dbg << QString::asprintf("%sSequence\n", indent.toUtf8().constData());
const QBluetoothServiceInfo::Sequence *sequence = static_cast<const QBluetoothServiceInfo::Sequence *>(var.data());
- foreach (const QVariant &v, *sequence)
+ for (const QVariant &v : *sequence)
dumpAttributeVariant(dbg, v, indent + QLatin1Char('\t'));
} else if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Alternative>()) {
dbg << QString::asprintf("%sAlternative\n", indent.toUtf8().constData());
const QBluetoothServiceInfo::Alternative *alternative = static_cast<const QBluetoothServiceInfo::Alternative *>(var.data());
- foreach (const QVariant &v, *alternative)
+ for (const QVariant &v : *alternative)
dumpAttributeVariant(dbg, v, indent + QLatin1Char('\t'));
}
break;
@@ -626,7 +627,8 @@ QDebug operator<<(QDebug dbg, const QBluetoothServiceInfo &info)
{
QDebugStateSaver saver(dbg);
dbg.noquote() << "\n";
- foreach (quint16 id, info.attributes()) {
+ QList<quint16> attributes = info.attributes();
+ for (quint16 id : attributes) {
dumpAttributeVariant(dbg, info.attribute(id), QStringLiteral("(%1)\t").arg(id));
}
return dbg;
@@ -637,7 +639,9 @@ QBluetoothServiceInfo::Sequence QBluetoothServiceInfoPrivate::protocolDescriptor
if (!attributes.contains(QBluetoothServiceInfo::ProtocolDescriptorList))
return QBluetoothServiceInfo::Sequence();
- foreach (const QVariant &v, attributes.value(QBluetoothServiceInfo::ProtocolDescriptorList).value<QBluetoothServiceInfo::Sequence>()) {
+ const QBluetoothServiceInfo::Sequence sequence
+ = attributes.value(QBluetoothServiceInfo::ProtocolDescriptorList).value<QBluetoothServiceInfo::Sequence>();
+ for (const QVariant &v : sequence) {
QBluetoothServiceInfo::Sequence parameters = v.value<QBluetoothServiceInfo::Sequence>();
if (parameters.empty())
continue;
diff --git a/src/bluetooth/qbluetoothserviceinfo_android.cpp b/src/bluetooth/qbluetoothserviceinfo_android.cpp
index 0b46e11b..b0193f73 100644
--- a/src/bluetooth/qbluetoothserviceinfo_android.cpp
+++ b/src/bluetooth/qbluetoothserviceinfo_android.cpp
@@ -95,7 +95,7 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress& loca
if (!localAdapter.isNull()) {
bool found = false;
- foreach (const QBluetoothHostInfo &hostInfo, localDevices) {
+ for (const QBluetoothHostInfo &hostInfo : localDevices) {
if (hostInfo.address() == localAdapter) {
found = true;
break;
diff --git a/src/bluetooth/qbluetoothserviceinfo_bluez.cpp b/src/bluetooth/qbluetoothserviceinfo_bluez.cpp
index 9040348c..09829b13 100644
--- a/src/bluetooth/qbluetoothserviceinfo_bluez.cpp
+++ b/src/bluetooth/qbluetoothserviceinfo_bluez.cpp
@@ -43,7 +43,7 @@
#include "bluez/manager_p.h"
#include "bluez/service_p.h"
#include "bluez/bluez5_helper_p.h"
-#include "bluez/profile1_p.h"
+#include "bluez/profilemanager1_p.h"
#include <QtCore/QLoggingCategory>
#include <QtCore/QXmlStreamWriter>
@@ -158,13 +158,13 @@ static void writeAttribute(QXmlStreamWriter *stream, const QVariant &attribute)
stream->writeStartElement(QStringLiteral("sequence"));
const QBluetoothServiceInfo::Sequence *sequence =
static_cast<const QBluetoothServiceInfo::Sequence *>(attribute.data());
- foreach (const QVariant &v, *sequence)
+ for (const QVariant &v : *sequence)
writeAttribute(stream, v);
stream->writeEndElement();
} else if (attribute.userType() == qMetaTypeId<QBluetoothServiceInfo::Alternative>()) {
const QBluetoothServiceInfo::Alternative *alternative =
static_cast<const QBluetoothServiceInfo::Alternative *>(attribute.data());
- foreach (const QVariant &v, *alternative)
+ for (const QVariant &v : *alternative)
writeAttribute(stream, v);
stream->writeEndElement();
}
@@ -175,7 +175,7 @@ static void writeAttribute(QXmlStreamWriter *stream, const QVariant &attribute)
}
QBluetoothServiceInfoPrivate::QBluetoothServiceInfoPrivate()
-: service(0), serviceBluez5(0), serviceRecord(0), registered(false)
+: serviceRecord(0), registered(false)
{
if (isBluez5()) {
serviceBluez5 = new OrgBluezProfileManager1Interface(
diff --git a/src/bluetooth/qbluetoothserviceinfo_osx.mm b/src/bluetooth/qbluetoothserviceinfo_osx.mm
index 755e85c9..27da70fc 100644
--- a/src/bluetooth/qbluetoothserviceinfo_osx.mm
+++ b/src/bluetooth/qbluetoothserviceinfo_osx.mm
@@ -359,12 +359,12 @@ static void dumpAttributeVariant(const QVariant &var, const QString indent)
} else if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Sequence>()) {
qDebug("%sSequence", indent.toLocal8Bit().constData());
const QBluetoothServiceInfo::Sequence *sequence = static_cast<const QBluetoothServiceInfo::Sequence *>(var.data());
- foreach (const QVariant &v, *sequence)
+ for (const QVariant &v : *sequence)
dumpAttributeVariant(v, indent + QLatin1Char('\t'));
} else if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Alternative>()) {
qDebug("%sAlternative", indent.toLocal8Bit().constData());
const QBluetoothServiceInfo::Alternative *alternative = static_cast<const QBluetoothServiceInfo::Alternative *>(var.data());
- foreach (const QVariant &v, *alternative)
+ for (const QVariant &v : *alternative)
dumpAttributeVariant(v, indent + QLatin1Char('\t'));
}
break;
@@ -375,7 +375,8 @@ static void dumpAttributeVariant(const QVariant &var, const QString indent)
QDebug operator << (QDebug dbg, const QBluetoothServiceInfo &info)
{
- foreach (quint16 id, info.attributes()) {
+ const QList<quint16> attributes = info.attributes();
+ for (quint16 id : attributes) {
dumpAttributeVariant(info.attribute(id), QString::fromLatin1("(%1)\t").arg(id));
}
return dbg;
@@ -386,7 +387,9 @@ QBluetoothServiceInfo::Sequence QBluetoothServiceInfoPrivate::protocolDescriptor
if (!attributes.contains(QBluetoothServiceInfo::ProtocolDescriptorList))
return QBluetoothServiceInfo::Sequence();
- foreach (const QVariant &v, attributes.value(QBluetoothServiceInfo::ProtocolDescriptorList).value<QBluetoothServiceInfo::Sequence>()) {
+ const QBluetoothServiceInfo::Sequence sequence
+ = attributes.value(QBluetoothServiceInfo::ProtocolDescriptorList).value<QBluetoothServiceInfo::Sequence>();
+ for (const QVariant &v : sequence) {
QBluetoothServiceInfo::Sequence parameters = v.value<QBluetoothServiceInfo::Sequence>();
if (parameters.empty())
continue;
diff --git a/src/bluetooth/qbluetoothserviceinfo_p.h b/src/bluetooth/qbluetoothserviceinfo_p.h
index ea695b56..e4e835e4 100644
--- a/src/bluetooth/qbluetoothserviceinfo_p.h
+++ b/src/bluetooth/qbluetoothserviceinfo_p.h
@@ -107,8 +107,8 @@ private:
#if QT_CONFIG(bluez)
bool ensureSdpConnection(const QBluetoothAddress &localAdapter = QBluetoothAddress());
- OrgBluezServiceInterface *service;
- OrgBluezProfileManager1Interface *serviceBluez5;
+ OrgBluezServiceInterface *service = nullptr;
+ OrgBluezProfileManager1Interface *serviceBluez5 = nullptr;
quint32 serviceRecord;
QBluetoothAddress currentLocalAdapter;
QString profilePath;
diff --git a/src/bluetooth/qbluetoothserviceinfo_winrt.cpp b/src/bluetooth/qbluetoothserviceinfo_winrt.cpp
index fd77662a..04b1872b 100644
--- a/src/bluetooth/qbluetoothserviceinfo_winrt.cpp
+++ b/src/bluetooth/qbluetoothserviceinfo_winrt.cpp
@@ -41,6 +41,7 @@
#include "qbluetoothserviceinfo_p.h"
#include "qbluetoothserver_p.h"
+#include <QtCore/private/qeventdispatcher_winrt_p.h>
#include <QtCore/QLoggingCategory>
#ifdef CLASSIC_APP_BUILD
#define Q_OS_WINRT
@@ -67,16 +68,106 @@ QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(QT_BT_WINRT)
-#define TYPE_UINT8 8
-#define TYPE_UINT16 9
-#define TYPE_UINT32 10
-#define TYPE_SHORT_UUID 25
-#define TYPE_LONG_UUID 28
-#define TYPE_STRING 37
-#define TYPE_SEQUENCE 53
+#define TYPE_VOID 0
+#define TYPE_UINT8 8
+#define TYPE_UINT16 9
+#define TYPE_UINT32 10
+#define TYPE_UINT64 11
+//#define TYPE_UINT128 12
+#define TYPE_INT8 16
+#define TYPE_INT16 17
+#define TYPE_INT32 18
+#define TYPE_INT64 19
+//#define TYPE_INT128 20
+#define TYPE_UUID16 25
+#define TYPE_UUID32 26
+#define TYPE_UUID128 28
+#define TYPE_STRING_BASE 32
+#define TYPE_BOOLEAN 40
+#define TYPE_SEQUENCE_BASE 48
+#define TYPE_ALTERNATIVE_BASE 56
+#define TYPE_URL_BASE 64
extern QHash<QBluetoothServerPrivate *, int> __fakeServerPorts;
+inline bool typeIsOfBase(unsigned char type, unsigned char baseType)
+{
+ return ((type & baseType) == baseType);
+}
+
+qint64 getLengthForBaseType(unsigned char type, ComPtr<IDataReader> &reader)
+{
+ const bool isOfBase = (typeIsOfBase(type, TYPE_STRING_BASE)
+ || typeIsOfBase(type, TYPE_SEQUENCE_BASE)
+ || typeIsOfBase(type, TYPE_ALTERNATIVE_BASE)
+ || typeIsOfBase(type, TYPE_URL_BASE));
+ if (!isOfBase)
+ return -1;
+
+ HRESULT hr;
+ // For these types, the first 5 bits are the base type followed by 3 bits
+ // describing the size index. This index decides how many additional bits
+ // have to be read to get the type's length.
+ const unsigned char sizeIndex = (type & 0x7);
+ switch (sizeIndex) {
+ case 5: {
+ quint8 length;
+ hr = reader->ReadByte(&length);
+ RETURN_IF_FAILED("Could not read length from buffer", return -1);
+ return length;
+ } case 6: {
+ quint16 length;
+ hr = reader->ReadUInt16(&length);
+ RETURN_IF_FAILED("Could not read length from buffer", return -1);
+ return length;
+ } case 7: {
+ quint32 length;
+ hr = reader->ReadUInt32(&length);
+ RETURN_IF_FAILED("Could not read length from buffer", return -1);
+ return length;
+ }
+ }
+ return -1;
+}
+
+bool writeStringHelper(const QString &string, ComPtr<IDataWriter> writer)
+{
+ HRESULT hr;
+ const int stringLength = string.length();
+ unsigned char type = TYPE_STRING_BASE;
+ if (stringLength < 0) {
+ qCWarning(QT_BT_WINRT) << "Can not write invalid string value to buffer";
+ return false;
+ } if (stringLength <= 0xff) {
+ type += 5;
+ hr = writer->WriteByte(type);
+ RETURN_FALSE_IF_FAILED("Could not write string type data.");
+ hr = writer->WriteByte(stringLength);
+ RETURN_FALSE_IF_FAILED("Could not write string length.");
+ } else if (stringLength <= 0xffff) {
+ type += 6;
+ hr = writer->WriteByte(type);
+ RETURN_FALSE_IF_FAILED("Could not write string type data.");
+ hr = writer->WriteUInt16(stringLength);
+ RETURN_FALSE_IF_FAILED("Could not write string length.");
+ } else {
+ type += 7;
+ hr = writer->WriteByte(type);
+ RETURN_FALSE_IF_FAILED("Could not write string type data.");
+ hr = writer->WriteUInt32(stringLength);
+ RETURN_FALSE_IF_FAILED("Could not write string length.");
+ }
+ HStringReference stringRef(reinterpret_cast<LPCWSTR>(string.utf16()));
+ quint32 bytesWritten;
+ hr = writer->WriteString(stringRef.Get(), &bytesWritten);
+ RETURN_FALSE_IF_FAILED("Could not write string to buffer.");
+ if (bytesWritten != string.length()) {
+ qCWarning(QT_BT_WINRT) << "Did not write full value to buffer";
+ return false;
+ }
+ return true;
+}
+
bool repairProfileDescriptorListIfNeeded(ComPtr<IBuffer> &buffer)
{
ComPtr<IDataReaderStatics> dataReaderStatics;
@@ -91,19 +182,16 @@ bool repairProfileDescriptorListIfNeeded(ComPtr<IBuffer> &buffer)
BYTE type;
hr = reader->ReadByte(&type);
Q_ASSERT_SUCCEEDED(hr);
- if (type != TYPE_SEQUENCE) {
+ if (!typeIsOfBase(type, TYPE_SEQUENCE_BASE)) {
qCWarning(QT_BT_WINRT) << Q_FUNC_INFO << "Malformed profile descriptor list read";
return false;
}
- quint8 length;
- hr = reader->ReadByte(&length);
- Q_ASSERT_SUCCEEDED(hr);
-
+ qint64 length = getLengthForBaseType(type, reader);
hr = reader->ReadByte(&type);
Q_ASSERT_SUCCEEDED(hr);
// We have to "repair" the structure if the outer sequence contains a uuid directly
- if (type == TYPE_SHORT_UUID && length == 4) {
+ if (type == TYPE_UUID16 && length == 4) {
qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Repairing profile descriptor list";
quint16 uuid;
hr = reader->ReadUInt16(&uuid);
@@ -114,16 +202,16 @@ bool repairProfileDescriptorListIfNeeded(ComPtr<IBuffer> &buffer)
&writer);
Q_ASSERT_SUCCEEDED(hr);
- hr = writer->WriteByte(TYPE_SEQUENCE);
+ hr = writer->WriteByte(TYPE_SEQUENCE_BASE + 5);
Q_ASSERT_SUCCEEDED(hr);
// 8 == length of nested sequence (outer sequence -> inner sequence -> uuid and version)
hr = writer->WriteByte(8);
Q_ASSERT_SUCCEEDED(hr);
- hr = writer->WriteByte(TYPE_SEQUENCE);
+ hr = writer->WriteByte(TYPE_SEQUENCE_BASE + 5);
Q_ASSERT_SUCCEEDED(hr);
hr = writer->WriteByte(7);
Q_ASSERT_SUCCEEDED(hr);
- hr = writer->WriteByte(TYPE_SHORT_UUID);
+ hr = writer->WriteByte(TYPE_UUID16);
Q_ASSERT_SUCCEEDED(hr);
hr = writer->WriteUInt16(uuid);
Q_ASSERT_SUCCEEDED(hr);
@@ -149,61 +237,80 @@ static ComPtr<IBuffer> bufferFromAttribute(const QVariant &attribute)
switch (int(attribute.type())) {
case QMetaType::Void:
- qCWarning(QT_BT_WINRT) << "Don't know how to register QMetaType::Void";
- return nullptr;
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::Void:";
+ hr = writer->WriteByte(TYPE_VOID);
+ Q_ASSERT_SUCCEEDED(hr);
+ break;
case QMetaType::UChar:
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::UChar";
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::UChar:" << attribute.value<quint8>();
hr = writer->WriteByte(TYPE_UINT8);
Q_ASSERT_SUCCEEDED(hr);
hr = writer->WriteByte(attribute.value<quint8>());
Q_ASSERT_SUCCEEDED(hr);
break;
case QMetaType::UShort:
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::UShort";
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::UShort:" << attribute.value<quint16>();
hr = writer->WriteByte(TYPE_UINT16);
Q_ASSERT_SUCCEEDED(hr);
hr = writer->WriteUInt16(attribute.value<quint16>());
Q_ASSERT_SUCCEEDED(hr);
break;
case QMetaType::UInt:
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::UInt";
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::UInt:" << attribute.value<quint32>();
hr = writer->WriteByte(TYPE_UINT32);
Q_ASSERT_SUCCEEDED(hr);
- hr = writer->WriteByte(attribute.value<quint32>());
+ hr = writer->WriteUInt32(attribute.value<quint32>());
+ Q_ASSERT_SUCCEEDED(hr);
+ break;
+ case QMetaType::ULongLong:
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::ULongLong:" << attribute.value<quint64>();
+ hr = writer->WriteByte(TYPE_UINT64);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteUInt64(attribute.value<quint64>());
Q_ASSERT_SUCCEEDED(hr);
break;
case QMetaType::Char:
- qCWarning(QT_BT_WINRT) << "Don't know how to register QMetaType::Char";
- return nullptr;
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::Char:" << attribute.value<qint8>();
+ hr = writer->WriteByte(TYPE_INT8);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteByte(attribute.value<qint8>());
+ Q_ASSERT_SUCCEEDED(hr);
break;
case QMetaType::Short:
- qCWarning(QT_BT_WINRT) << "Don't know how to register QMetaType::Short";
- return nullptr;
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::Short:" << attribute.value<qint16>();
+ hr = writer->WriteByte(TYPE_INT16);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteInt16(attribute.value<qint16>());
+ Q_ASSERT_SUCCEEDED(hr);
break;
case QMetaType::Int:
- qCWarning(QT_BT_WINRT) << "Don't know how to register QMetaType::Int";
- return nullptr;
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::Int:" << attribute.value<qint32>();
+ hr = writer->WriteByte(TYPE_INT32);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteInt32(attribute.value<qint32>());
+ Q_ASSERT_SUCCEEDED(hr);
break;
- case QMetaType::QString: {
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::QString";
- hr = writer->WriteByte(TYPE_STRING);
+ case QMetaType::LongLong:
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::LongLong:" << attribute.value<qint64>();
+ hr = writer->WriteByte(TYPE_INT64);
Q_ASSERT_SUCCEEDED(hr);
- const QString stringValue = attribute.value<QString>();
- hr = writer->WriteByte(stringValue.length());
+ hr = writer->WriteInt64(attribute.value<qint64>());
Q_ASSERT_SUCCEEDED(hr);
- HStringReference stringRef(reinterpret_cast<LPCWSTR>(stringValue.utf16()));
- quint32 bytesWritten;
- hr = writer->WriteString(stringRef.Get(), &bytesWritten);
- if (bytesWritten != stringValue.length()) {
- qCWarning(QT_BT_WINRT) << "Did not write full value to buffer";
+ break;
+ case QMetaType::QString: {
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::QString:" << attribute.value<QString>();
+ const QString stringValue = attribute.value<QString>();
+ const bool writeSucces = writeStringHelper(stringValue, writer);
+ if (!writeSucces)
return nullptr;
- }
- Q_ASSERT_SUCCEEDED(hr);
break;
}
case QMetaType::Bool:
- qCWarning(QT_BT_WINRT) << "Don't know how to register QMetaType::Bool";
- return nullptr;
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering attribute of type QMetaType::Bool:" << attribute.value<bool>();
+ hr = writer->WriteByte(TYPE_BOOLEAN);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteByte(attribute.value<bool>());
+ Q_ASSERT_SUCCEEDED(hr);
break;
case QMetaType::QUrl:
qCWarning(QT_BT_WINRT) << "Don't know how to register QMetaType::QUrl";
@@ -219,26 +326,23 @@ static ComPtr<IBuffer> bufferFromAttribute(const QVariant &attribute)
return nullptr;
break;
case 2:
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering Uuid attribute with length 2" << uuid;
- hr = writer->WriteByte(TYPE_SHORT_UUID);
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering Uuid attribute with length 2:" << uuid;
+ hr = writer->WriteByte(TYPE_UUID16);
Q_ASSERT_SUCCEEDED(hr);
hr = writer->WriteUInt16(uuid.toUInt16());
Q_ASSERT_SUCCEEDED(hr);
break;
case 4:
- qCWarning(QT_BT_WINRT) << "Don't know how to register Uuid of length 4";
- return nullptr;
- break;
- case 16:
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering Uuid attribute with length 16";
- hr = writer->WriteByte(TYPE_LONG_UUID);
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering Uuid attribute with length 4:" << uuid;
+ hr = writer->WriteByte(TYPE_UUID32);
Q_ASSERT_SUCCEEDED(hr);
- hr = writer->WriteGuid(uuid);
+ hr = writer->WriteUInt32(uuid.toUInt32());
Q_ASSERT_SUCCEEDED(hr);
break;
+ case 16:
default:
- qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering Uuid attribute";
- hr = writer->WriteByte(TYPE_LONG_UUID);
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registering Uuid attribute:" << uuid;
+ hr = writer->WriteByte(TYPE_UUID128);
Q_ASSERT_SUCCEEDED(hr);
hr = writer->WriteGuid(uuid);
Q_ASSERT_SUCCEEDED(hr);
@@ -246,15 +350,13 @@ static ComPtr<IBuffer> bufferFromAttribute(const QVariant &attribute)
}
} else if (attribute.userType() == qMetaTypeId<QBluetoothServiceInfo::Sequence>()) {
qCDebug(QT_BT_WINRT) << "Registering sequence attribute";
- hr = writer->WriteByte(TYPE_SEQUENCE);
- Q_ASSERT_SUCCEEDED(hr);
const QBluetoothServiceInfo::Sequence *sequence =
static_cast<const QBluetoothServiceInfo::Sequence *>(attribute.data());
ComPtr<IDataWriter> tmpWriter;
HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Storage_Streams_DataWriter).Get(),
&tmpWriter);
Q_ASSERT_SUCCEEDED(hr);
- foreach (const QVariant &v, *sequence) {
+ for (const QVariant &v : *sequence) {
ComPtr<IBuffer> tmpBuffer = bufferFromAttribute(v);
if (!tmpBuffer) {
qCWarning(QT_BT_WINRT) << "Could not create buffer from attribute in sequence";
@@ -273,8 +375,27 @@ static ComPtr<IBuffer> bufferFromAttribute(const QVariant &attribute)
quint32 length;
tmpBuffer->get_Length(&length);
Q_ASSERT_SUCCEEDED(hr);
- hr = writer->WriteByte(length + 1);
- Q_ASSERT_SUCCEEDED(hr);
+ unsigned char type = TYPE_SEQUENCE_BASE;
+ length += 1;
+ if (length <= 0xff) {
+ type += 5;
+ hr = writer->WriteByte(type);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteByte(length);
+ Q_ASSERT_SUCCEEDED(hr);
+ } else if (length <= 0xffff) {
+ type += 6;
+ hr = writer->WriteByte(type);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteUInt16(length);
+ Q_ASSERT_SUCCEEDED(hr);
+ } else {
+ type += 7;
+ hr = writer->WriteByte(type);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = writer->WriteUInt32(length);
+ Q_ASSERT_SUCCEEDED(hr);
+ }
// write sequence data
hr = writer->WriteBuffer(tmpBuffer.Get());
Q_ASSERT_SUCCEEDED(hr);
@@ -285,7 +406,7 @@ static ComPtr<IBuffer> bufferFromAttribute(const QVariant &attribute)
}
break;
default:
- qCWarning(QT_BT_WINRT) << "Unknown variant type", attribute.userType();
+ qCWarning(QT_BT_WINRT) << "Unknown variant type" << attribute.userType();
return nullptr;
}
ComPtr<IBuffer> buffer;
@@ -337,7 +458,12 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca
IID_PPV_ARGS(&providerStatics));
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IAsyncOperation<RfcommServiceProvider *>> op;
- hr = providerStatics->CreateAsync(serviceId.Get(), &op);
+ hr = QEventDispatcherWinRT::runOnXamlThread([providerStatics, serviceId, &op]
+ {
+ HRESULT hr;
+ hr = providerStatics->CreateAsync(serviceId.Get(), &op);
+ return hr;
+ });
Q_ASSERT_SUCCEEDED(hr);
hr = QWinRTFunctions::await(op, serviceProvider.GetAddressOf());
if (hr == HRESULT_FROM_WIN32(ERROR_DEVICE_NOT_AVAILABLE)) {
@@ -368,10 +494,19 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca
result = writeSdpAttributes();
if (!result) {
+ qCWarning(QT_BT_WINRT) << "Could not write SDP attributes.";
return false;
}
+ qCDebug(QT_BT_WINRT) << "SDP attributes written.";
- hr = serviceProvider->StartAdvertising(listener.Get());
+ ComPtr<IRfcommServiceProvider2> serviceProvider2;
+ hr = serviceProvider.As(&serviceProvider2);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = QEventDispatcherWinRT::runOnXamlThread([listener, serviceProvider2] {
+ HRESULT hr;
+ hr = serviceProvider2->StartAdvertisingWithRadioDiscoverability(listener.Get(), true);
+ return hr;
+ });
if (FAILED(hr)) {
qCWarning(QT_BT_WINRT) << Q_FUNC_INFO << "Could not start advertising. Check your SDP data.";
return false;
@@ -418,7 +553,8 @@ bool QBluetoothServiceInfoPrivate::writeSdpAttributes()
ComPtr<IMap<UINT32, IBuffer *>> rawAttributes;
hr = serviceProvider->get_SdpRawAttributes(&rawAttributes);
Q_ASSERT_SUCCEEDED(hr);
- for (quint16 key : attributes.keys()) {
+ const QList<quint16> keys = attributes.keys();
+ for (quint16 key : keys) {
// The SDP Class Id List and RFCOMM and L2CAP protocol descriptors are automatically
// generated by the RfcommServiceProvider. Do not specify it in the SDP raw attribute map.
if (key == QBluetoothServiceInfo::ServiceClassIds
@@ -451,6 +587,7 @@ bool QBluetoothServiceInfoPrivate::writeSdpAttributes()
hr = rawAttributes->Insert(key, buffer.Get(), &replaced);
Q_ASSERT_SUCCEEDED(hr);
Q_ASSERT(!replaced);
+ qCDebug(QT_BT_WINRT) << Q_FUNC_INFO << "Registered attribute" << QString::number(key, 16).rightJustified(4, '0') << "with value" << attribute;
}
return true;
}
diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp
index 803de43c..16461bd3 100644
--- a/src/bluetooth/qbluetoothsocket.cpp
+++ b/src/bluetooth/qbluetoothsocket.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Copyright (C) 2016 BlackBerry Limited. All rights reserved.
** Contact: https://www.qt.io/licensing/
**
@@ -39,13 +39,20 @@
****************************************************************************/
#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#if QT_CONFIG(bluez)
+#include "qbluetoothsocket_bluez_p.h"
+#include "qbluetoothsocket_bluezdbus_p.h"
+#include "bluez/bluez5_helper_p.h"
+#elif defined(QT_ANDROID_BLUETOOTH)
+#include "qbluetoothsocket_android_p.h"
+#elif defined(QT_WINRT_BLUETOOTH)
+#include "qbluetoothsocket_winrt_p.h"
+#else
+#include "qbluetoothsocket_dummy_p.h"
+#endif
-#include "qbluetoothdeviceinfo.h"
-#include "qbluetoothserviceinfo.h"
#include "qbluetoothservicediscoveryagent.h"
-
#include <QtCore/QLoggingCategory>
#include <QSocketNotifier>
@@ -246,15 +253,35 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT)
\reimp
*/
+static QBluetoothSocketBasePrivate *createSocketPrivate()
+{
+#if QT_CONFIG(bluez)
+ if (bluetoothdVersion() >= QVersionNumber(5, 46)) {
+ qCDebug(QT_BT) << "Using Bluetooth dbus socket implementation";
+ return new QBluetoothSocketPrivateBluezDBus();
+ } else {
+ qCDebug(QT_BT) << "Using Bluetooth raw socket implementation";
+ return new QBluetoothSocketPrivateBluez();
+ }
+#elif defined(QT_ANDROID_BLUETOOTH)
+ return new QBluetoothSocketPrivateAndroid();
+#elif defined(QT_WINRT_BLUETOOTH)
+ return new QBluetoothSocketPrivateWinRT();
+#else
+ return new QBluetoothSocketPrivateDummy();
+#endif
+}
+
/*!
Constructs a Bluetooth socket of \a socketType type, with \a parent.
*/
QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, QObject *parent)
-: QIODevice(parent), d_ptr(new QBluetoothSocketPrivate)
+: QIODevice(parent)
{
+ d_ptr = createSocketPrivate();
d_ptr->q_ptr = this;
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
d->ensureNativeSocket(socketType);
setOpenMode(QIODevice::NotOpen);
@@ -264,19 +291,41 @@ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, Q
Constructs a Bluetooth socket with \a parent.
*/
QBluetoothSocket::QBluetoothSocket(QObject *parent)
- : QIODevice(parent), d_ptr(new QBluetoothSocketPrivate)
+ : QIODevice(parent)
{
+ d_ptr = createSocketPrivate();
d_ptr->q_ptr = this;
setOpenMode(QIODevice::NotOpen);
}
+#if QT_CONFIG(bluez)
+
+/*!
+ \internal
+*/
+QBluetoothSocket::QBluetoothSocket(QBluetoothSocketBasePrivate *dPrivate,
+ QBluetoothServiceInfo::Protocol socketType,
+ QObject *parent)
+ : QIODevice(parent)
+{
+ d_ptr = dPrivate;
+ d_ptr->q_ptr = this;
+
+ Q_D(QBluetoothSocketBase);
+ d->ensureNativeSocket(socketType);
+
+ setOpenMode(QIODevice::NotOpen);
+}
+
+#endif
+
/*!
Destroys the Bluetooth socket.
*/
QBluetoothSocket::~QBluetoothSocket()
{
delete d_ptr;
- d_ptr = 0;
+ d_ptr = nullptr;
}
/*!
@@ -294,7 +343,7 @@ bool QBluetoothSocket::isSequential() const
*/
qint64 QBluetoothSocket::bytesAvailable() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return QIODevice::bytesAvailable() + d->bytesAvailable();
}
@@ -304,7 +353,7 @@ qint64 QBluetoothSocket::bytesAvailable() const
*/
qint64 QBluetoothSocket::bytesToWrite() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->bytesToWrite();
}
@@ -327,63 +376,8 @@ qint64 QBluetoothSocket::bytesToWrite() const
*/
void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, OpenMode openMode)
{
- Q_D(QBluetoothSocket);
-
- if (state() != QBluetoothSocket::UnconnectedState && state() != QBluetoothSocket::ServiceLookupState) {
- qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket";
- d->errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
- setSocketError(QBluetoothSocket::OperationError);
- return;
- }
-#if defined(QT_ANDROID_BLUETOOTH)
- if (!d->ensureNativeSocket(service.socketProtocol())) {
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
- d->connectToService(service.device().address(), service.serviceUuid(), openMode);
-#else
-#if defined(QT_WINRT_BLUETOOTH)
- // Report these problems early:
- if (service.socketProtocol() != QBluetoothServiceInfo::RfcommProtocol) {
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
-#endif // QT_WINRT_BLUETOOTH
- if (service.socketProtocol() == QBluetoothServiceInfo::UnknownProtocol) {
- qCWarning(QT_BT) << "QBluetoothSocket::connectToService cannot "
- "connect with 'UnknownProtocol' type";
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
-
- if (service.protocolServiceMultiplexer() > 0) {
- if (!d->ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) {
- d->errorString = tr("Unknown socket error");
- setSocketError(UnknownSocketError);
- return;
- }
- d->connectToService(service.device().address(), service.protocolServiceMultiplexer(), openMode);
- } else if (service.serverChannel() > 0) {
- if (!d->ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) {
- d->errorString = tr("Unknown socket error");
- setSocketError(UnknownSocketError);
- return;
- }
- d->connectToService(service.device().address(), service.serverChannel(), openMode);
- } else {
- // try doing service discovery to see if we can find the socket
- if (service.serviceUuid().isNull()
- && !service.serviceClassUuids().contains(QBluetoothUuid::SerialPort)) {
- qCWarning(QT_BT) << "No port, no PSM, and no UUID provided, unable to connect";
- return;
- }
- qCDebug(QT_BT) << "Need a port/psm, doing discovery";
- doDeviceDiscovery(service, openMode);
- }
-#endif
+ Q_D(QBluetoothSocketBase);
+ d->connectToService(service, openMode);
}
/*!
@@ -403,10 +397,10 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op
For BlueZ, the socket first enters the \l ServiceLookupState and queries the connection parameters for
\a uuid. If the service parameters are successfully retrieved the socket enters
ConnectingState, and attempts to connect to \a address. If a connection is established,
- QBluetoothSocket enters Connected State and emits connected().
+ QBluetoothSocket enters \l ConnectedState and emits connected().
On Android, the service connection can directly be established
- using the UUID of the remote service. Therefore the platforms does not require
+ using the UUID of the remote service. Therefore the platform does not require
the \l ServiceLookupState and \l socketType() is always set to
\l QBluetoothServiceInfo::RfcommProtocol.
@@ -419,45 +413,8 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op
*/
void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, OpenMode openMode)
{
- Q_D(QBluetoothSocket);
-
- if (state() != QBluetoothSocket::UnconnectedState) {
- qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket";
- d->errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
- setSocketError(QBluetoothSocket::OperationError);
- return;
- }
-
-#if defined(QT_ANDROID_BLUETOOTH)
- if (!d->ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) {
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
+ Q_D(QBluetoothSocketBase);
d->connectToService(address, uuid, openMode);
-#else
-#if defined(QT_WINRT_BLUETOOTH)
- // Report these problems early, prevent device discovery:
- if (socketType() != QBluetoothServiceInfo::RfcommProtocol) {
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
-#endif // QT_WINRT_BLUETOOTH
- if (socketType() == QBluetoothServiceInfo::UnknownProtocol) {
- qCWarning(QT_BT) << "QBluetoothSocket::connectToService cannot "
- "connect with 'UnknownProtocol' type";
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
-
- QBluetoothServiceInfo service;
- QBluetoothDeviceInfo device(address, QString(), QBluetoothDeviceInfo::MiscellaneousDevice);
- service.setDevice(device);
- service.setServiceUuid(uuid);
- doDeviceDiscovery(service, openMode);
-#endif
}
/*!
@@ -471,7 +428,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const
At any point, the socket can emit error() to signal that an error occurred.
On Android, a connection to a service can not be established using a port. Calling this function
- will emit a \l {QBluetoothSocket::ServiceNotFoundError}{ServiceNotFoundError}
+ will emit a \l {QBluetoothSocket::ServiceNotFoundError}{ServiceNotFoundError}.
Note that most platforms require a pairing prior to connecting to the remote device. Otherwise
the connection process may fail.
@@ -480,41 +437,8 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const
*/
void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint16 port, OpenMode openMode)
{
- Q_D(QBluetoothSocket);
-#if defined(QT_ANDROID_BLUETOOTH)
- Q_UNUSED(port);
- Q_UNUSED(openMode);
- Q_UNUSED(address);
- d->errorString = tr("Connecting to port is not supported");
- setSocketError(QBluetoothSocket::ServiceNotFoundError);
- qCWarning(QT_BT) << "Connecting to port is not supported";
-#else
-#if defined(QT_WINRT_BLUETOOTH)
- // Report these problems early
- if (socketType() != QBluetoothServiceInfo::RfcommProtocol) {
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
-#endif // QT_WINRT_BLUETOOTH
- if (socketType() == QBluetoothServiceInfo::UnknownProtocol) {
- qCWarning(QT_BT) << "QBluetoothSocket::connectToService cannot "
- "connect with 'UnknownProtocol' type";
- d->errorString = tr("Socket type not supported");
- setSocketError(QBluetoothSocket::UnsupportedProtocolError);
- return;
- }
-
- if (state() != QBluetoothSocket::UnconnectedState) {
- qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket";
- d->errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
- setSocketError(QBluetoothSocket::OperationError);
- return;
- }
-
- setOpenMode(openMode);
+ Q_D(QBluetoothSocketBase);
d->connectToService(address, port, openMode);
-#endif
}
/*!
@@ -526,7 +450,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint1
*/
QBluetoothServiceInfo::Protocol QBluetoothSocket::socketType() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->socketType;
}
@@ -535,7 +459,7 @@ QBluetoothServiceInfo::Protocol QBluetoothSocket::socketType() const
*/
QBluetoothSocket::SocketState QBluetoothSocket::state() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->state;
}
@@ -544,7 +468,7 @@ QBluetoothSocket::SocketState QBluetoothSocket::state() const
*/
QBluetoothSocket::SocketError QBluetoothSocket::error() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->socketError;
}
@@ -553,7 +477,7 @@ QBluetoothSocket::SocketError QBluetoothSocket::error() const
*/
QString QBluetoothSocket::errorString() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->errorString;
}
@@ -586,7 +510,7 @@ QString QBluetoothSocket::errorString() const
*/
void QBluetoothSocket::setPreferredSecurityFlags(QBluetooth::SecurityFlags flags)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
if (d->secFlags != flags)
d->secFlags = flags;
}
@@ -607,7 +531,7 @@ void QBluetoothSocket::setPreferredSecurityFlags(QBluetooth::SecurityFlags flags
*/
QBluetooth::SecurityFlags QBluetoothSocket::preferredSecurityFlags() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->secFlags;
}
@@ -616,11 +540,21 @@ QBluetooth::SecurityFlags QBluetoothSocket::preferredSecurityFlags() const
*/
void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state)
{
- Q_D(QBluetoothSocket);
- SocketState old = d->state;
+ Q_D(QBluetoothSocketBase);
+ const SocketState old = d->state;
+ if (state == old)
+ return;
+
d->state = state;
if(old != d->state)
emit stateChanged(state);
+ if (state == QBluetoothSocket::ConnectedState) {
+ emit connected();
+ } else if ((old == QBluetoothSocket::ConnectedState
+ || old == QBluetoothSocket::ClosingState)
+ && state == QBluetoothSocket::UnconnectedState) {
+ emit disconnected();
+ }
if(state == ListeningState){
// TODO: look at this, is this really correct?
// if we're a listening socket we can't handle connects?
@@ -636,7 +570,7 @@ void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state)
bool QBluetoothSocket::canReadLine() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->canReadLine();
}
@@ -645,7 +579,7 @@ bool QBluetoothSocket::canReadLine() const
*/
void QBluetoothSocket::setSocketError(QBluetoothSocket::SocketError error_)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
d->socketError = error_;
emit error(error_);
}
@@ -658,10 +592,10 @@ void QBluetoothSocket::setSocketError(QBluetoothSocket::SocketError error_)
void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, OpenMode openMode)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
setSocketState(QBluetoothSocket::ServiceLookupState);
- qCDebug(QT_BT) << "Starting Bluetooth Socket discovery";
+ qCDebug(QT_BT) << "Starting Bluetooth service discovery";
if(d->discoveryAgent) {
d->discoveryAgent->stop();
@@ -697,12 +631,12 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O
void QBluetoothSocket::serviceDiscovered(const QBluetoothServiceInfo &service)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
qCDebug(QT_BT) << "FOUND SERVICE!" << service;
if (service.protocolServiceMultiplexer() > 0 || service.serverChannel() > 0) {
connectToService(service, d->openMode);
d->discoveryAgent->deleteLater();
- d->discoveryAgent = 0;
+ d->discoveryAgent = nullptr;
} else {
qCDebug(QT_BT) << "Could not find port/psm for potential remote service";
}
@@ -711,14 +645,14 @@ void QBluetoothSocket::serviceDiscovered(const QBluetoothServiceInfo &service)
void QBluetoothSocket::discoveryFinished()
{
qCDebug(QT_BT) << "Socket discovery finished";
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
if (d->discoveryAgent){
qCDebug(QT_BT) << "Didn't find any";
d->errorString = tr("Service cannot be found");
setSocketError(ServiceNotFoundError);
setSocketState(QBluetoothSocket::UnconnectedState);
d->discoveryAgent->deleteLater();
- d->discoveryAgent = 0;
+ d->discoveryAgent = nullptr;
}
}
@@ -727,24 +661,17 @@ void QBluetoothSocket::abort()
if (state() == UnconnectedState)
return;
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
setOpenMode(QIODevice::NotOpen);
if (state() == ServiceLookupState && d->discoveryAgent) {
d->discoveryAgent->disconnect();
d->discoveryAgent->stop();
- d->discoveryAgent = 0;
+ d->discoveryAgent = nullptr;
}
setSocketState(ClosingState);
d->abort();
-
-#ifndef QT_ANDROID_BLUETOOTH
- //Android closes when the Java event loop comes around
- setSocketState(QBluetoothSocket::UnconnectedState);
- emit readChannelFinished();
- emit disconnected();
-#endif
}
void QBluetoothSocket::disconnectFromService()
@@ -754,43 +681,43 @@ void QBluetoothSocket::disconnectFromService()
QString QBluetoothSocket::localName() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->localName();
}
QBluetoothAddress QBluetoothSocket::localAddress() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->localAddress();
}
quint16 QBluetoothSocket::localPort() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->localPort();
}
QString QBluetoothSocket::peerName() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->peerName();
}
QBluetoothAddress QBluetoothSocket::peerAddress() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->peerAddress();
}
quint16 QBluetoothSocket::peerPort() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->peerPort();
}
qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
if (!data || maxSize <= 0) {
d_ptr->errorString = tr("Invalid data/data size");
@@ -803,7 +730,7 @@ qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize)
qint64 QBluetoothSocket::readData(char *data, qint64 maxSize)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
return d->readData(data, maxSize);
}
@@ -812,25 +739,18 @@ void QBluetoothSocket::close()
if (state() == UnconnectedState)
return;
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
setOpenMode(QIODevice::NotOpen);
if (state() == ServiceLookupState && d->discoveryAgent) {
d->discoveryAgent->disconnect();
d->discoveryAgent->stop();
- d->discoveryAgent = 0;
+ d->discoveryAgent = nullptr;
}
setSocketState(ClosingState);
d->close();
-
-#ifndef QT_ANDROID_BLUETOOTH
- //Android closes when the Java event loop comes around
- setSocketState(UnconnectedState);
- emit readChannelFinished();
- emit disconnected();
-#endif
}
/*!
@@ -844,7 +764,7 @@ void QBluetoothSocket::close()
bool QBluetoothSocket::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
SocketState socketState, OpenMode openMode)
{
- Q_D(QBluetoothSocket);
+ Q_D(QBluetoothSocketBase);
return d->setSocketDescriptor(socketDescriptor, socketType, socketState, openMode);
}
@@ -855,7 +775,7 @@ bool QBluetoothSocket::setSocketDescriptor(int socketDescriptor, QBluetoothServi
int QBluetoothSocket::socketDescriptor() const
{
- Q_D(const QBluetoothSocket);
+ Q_D(const QBluetoothSocketBase);
return d->socket;
}
diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h
index a7f43170..cf76e8b8 100644
--- a/src/bluetooth/qbluetoothsocket.h
+++ b/src/bluetooth/qbluetoothsocket.h
@@ -52,15 +52,30 @@
QT_BEGIN_NAMESPACE
+#ifndef QT_OSX_BLUETOOTH
+class QBluetoothSocketBasePrivate;
+#else
class QBluetoothSocketPrivate;
+#endif
class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice
{
Q_OBJECT
+#ifndef QT_OSX_BLUETOOTH
+ Q_DECLARE_PRIVATE(QBluetoothSocketBase)
+#else
Q_DECLARE_PRIVATE(QBluetoothSocket)
+#endif
+
friend class QBluetoothServer;
friend class QBluetoothServerPrivate;
+ friend class QBluetoothSocketPrivate;
+ friend class QBluetoothSocketPrivateAndroid;
+ friend class QBluetoothSocketPrivateBluez;
+ friend class QBluetoothSocketPrivateBluezDBus;
+ friend class QBluetoothSocketPrivateDummy;
+ friend class QBluetoothSocketPrivateWinRT;
public:
@@ -166,7 +181,18 @@ private Q_SLOTS:
protected:
+#if QT_CONFIG(bluez)
+ //evil hack to enable QBluetoothServer on Bluez to set the desired d_ptr
+ explicit QBluetoothSocket(QBluetoothSocketBasePrivate *d,
+ QBluetoothServiceInfo::Protocol socketType,
+ QObject *parent = nullptr);
+ friend class QBluetoothServerPrivate;
+#endif
+#ifndef QT_OSX_BLUETOOTH
+ QBluetoothSocketBasePrivate *d_ptr;
+#else
QBluetoothSocketPrivate *d_ptr;
+#endif
private:
friend class QLowEnergyControllerPrivateBluez;
diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp
index a70b95a2..a478819b 100644
--- a/src/bluetooth/qbluetoothsocket_android.cpp
+++ b/src/bluetooth/qbluetoothsocket_android.cpp
@@ -39,8 +39,10 @@
****************************************************************************/
#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_android_p.h"
#include "qbluetoothaddress.h"
+#include "qbluetoothdeviceinfo.h"
+#include "qbluetoothserviceinfo.h"
#include <QtCore/QLoggingCategory>
#include <QtCore/QThread>
#include <QtCore/QTime>
@@ -148,8 +150,8 @@ public:
{
}
- // Runs in same thread as QBluetoothSocketPrivate
- void setupWorker(QBluetoothSocketPrivate* d_ptr, const QAndroidJniObject& socketObject,
+ // Runs in same thread as QBluetoothSocketPrivateAndroid
+ void setupWorker(QBluetoothSocketPrivateAndroid* d_ptr, const QAndroidJniObject& socketObject,
const QAndroidJniObject& uuidObject, bool useFallback,
const QBluetoothUuid& qtUuid = QBluetoothUuid())
{
@@ -159,18 +161,18 @@ public:
connect(this, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &QThread::finished, this, &QObject::deleteLater);
- connect(d_ptr, &QBluetoothSocketPrivate::connectJavaSocket,
+ connect(d_ptr, &QBluetoothSocketPrivateAndroid::connectJavaSocket,
worker, &SocketConnectWorker::connectSocket);
- connect(d_ptr, &QBluetoothSocketPrivate::closeJavaSocket,
+ connect(d_ptr, &QBluetoothSocketPrivateAndroid::closeJavaSocket,
worker, &SocketConnectWorker::closeSocket);
connect(worker, &SocketConnectWorker::socketConnectDone,
- d_ptr, &QBluetoothSocketPrivate::socketConnectSuccess);
+ d_ptr, &QBluetoothSocketPrivateAndroid::socketConnectSuccess);
if (useFallback) {
connect(worker, &SocketConnectWorker::socketConnectFailed,
- d_ptr, &QBluetoothSocketPrivate::fallbackSocketConnectFailed);
+ d_ptr, &QBluetoothSocketPrivateAndroid::fallbackSocketConnectFailed);
} else {
connect(worker, &SocketConnectWorker::socketConnectFailed,
- d_ptr, &QBluetoothSocketPrivate::defaultSocketConnectFailed);
+ d_ptr, &QBluetoothSocketPrivateAndroid::defaultSocketConnectFailed);
}
workerPointer = worker;
@@ -204,16 +206,11 @@ static QBluetoothUuid reverseUuid(const QBluetoothUuid &serviceUuid)
return QBluetoothUuid(reversed);
}
-QBluetoothSocketPrivate::QBluetoothSocketPrivate()
- : socket(-1),
- socketType(QBluetoothServiceInfo::UnknownProtocol),
- state(QBluetoothSocket::UnconnectedState),
- socketError(QBluetoothSocket::NoSocketError),
- connecting(false),
- discoveryAgent(0),
- secFlags(QBluetooth::Secure),
+QBluetoothSocketPrivateAndroid::QBluetoothSocketPrivateAndroid()
+ :
inputThread(0)
{
+ secFlags = QBluetooth::Secure;
adapter = QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothAdapter",
"getDefaultAdapter",
"()Landroid/bluetooth/BluetoothAdapter;");
@@ -221,13 +218,13 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate()
qRegisterMetaType<QBluetoothSocket::SocketState>();
}
-QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
+QBluetoothSocketPrivateAndroid::~QBluetoothSocketPrivateAndroid()
{
if (state != QBluetoothSocket::UnconnectedState)
emit closeJavaSocket();
}
-bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
+bool QBluetoothSocketPrivateAndroid::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
{
socketType = type;
if (socketType == QBluetoothServiceInfo::RfcommProtocol)
@@ -236,7 +233,7 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol
return false;
}
-bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channel)
+bool QBluetoothSocketPrivateAndroid::fallBackConnect(QAndroidJniObject uuid, int channel)
{
qCWarning(QT_BT_ANDROID) << "Falling back to getServiceChannel() workaround.";
@@ -355,7 +352,7 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe
/*
* Workaround for QTBUG-61392
*/
-bool QBluetoothSocketPrivate::fallBackReversedConnect(const QBluetoothUuid &uuid)
+bool QBluetoothSocketPrivateAndroid::fallBackReversedConnect(const QBluetoothUuid &uuid)
{
Q_Q(QBluetoothSocket);
@@ -408,31 +405,31 @@ bool QBluetoothSocketPrivate::fallBackReversedConnect(const QBluetoothUuid &uuid
}
/*
- * The call order during a connectToService() is as follows:
+ * The call order during a connectToServiceHelper() is as follows:
*
- * 1. call connectToService()
+ * 1. call connectToServiceHelper()
* 2. wait for execution of SocketConnectThread::run()
* 3. if threaded connect succeeds call socketConnectSuccess() via signals
* -> done
* 4. if threaded connect fails call defaultSocketConnectFailed() via signals
* 5. call fallBackConnect() if Android version 22 or below
- * -> Android 23+ complete failure of entire connectToService()
+ * -> Android 23+ complete failure of entire connectToServiceHelper()
* 6. call fallBackReversedConnect() if Android version 23 or above
- * -> if failure entire connectToService() fails
+ * -> if failure entire connectToServiceHelper() fails
* 7. if threaded connect on one of above fallbacks succeeds call socketConnectSuccess()
* via signals
* -> done
* 8. if threaded connect on fallback channel fails call fallbackSocketConnectFailed()
- * -> complete failure of entire connectToService()
+ * -> complete failure of entire connectToServiceHelper()
* */
-void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
+void QBluetoothSocketPrivateAndroid::connectToServiceHelper(const QBluetoothAddress &address,
const QBluetoothUuid &uuid,
QIODevice::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
Q_UNUSED(openMode);
- qCDebug(QT_BT_ANDROID) << "connectToService()" << address.toString() << uuid.toString();
+ qCDebug(QT_BT_ANDROID) << "connectToServiceHelper()" << address.toString() << uuid.toString();
q->setSocketState(QBluetoothSocket::ConnectingState);
@@ -508,7 +505,71 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
emit connectJavaSocket();
}
-void QBluetoothSocketPrivate::socketConnectSuccess(const QAndroidJniObject &socket)
+void QBluetoothSocketPrivateAndroid::connectToService(
+ const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState
+ && q->state() != QBluetoothSocket::ServiceLookupState) {
+ qCWarning(QT_BT_ANDROID) << "QBluetoothSocketPrivateAndroid::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (!ensureNativeSocket(service.socketProtocol())) {
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+ connectToServiceHelper(service.device().address(), service.serviceUuid(), openMode);
+}
+
+void QBluetoothSocketPrivateAndroid::connectToService(
+ const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState) {
+ qCWarning(QT_BT_ANDROID) << "QBluetoothSocketPrivateAndroid::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) {
+ qCWarning(QT_BT_ANDROID) << "QBluetoothSocketPrivateAndroid::connectToService cannot "
+ "connect with 'UnknownProtocol' (type provided by given service)";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ if (!ensureNativeSocket(q->socketType())) {
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+ connectToServiceHelper(address, uuid, openMode);
+}
+
+void QBluetoothSocketPrivateAndroid::connectToService(
+ const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+{
+ Q_UNUSED(port);
+ Q_UNUSED(openMode);
+ Q_UNUSED(address);
+
+ Q_Q(QBluetoothSocket);
+
+ errorString = tr("Connecting to port is not supported");
+ q->setSocketError(QBluetoothSocket::ServiceNotFoundError);
+ qCWarning(QT_BT_ANDROID) << "Connecting to port is not supported";
+}
+
+void QBluetoothSocketPrivateAndroid::socketConnectSuccess(const QAndroidJniObject &socket)
{
Q_Q(QBluetoothSocket);
QAndroidJniEnvironment env;
@@ -565,10 +626,9 @@ void QBluetoothSocketPrivate::socketConnectSuccess(const QAndroidJniObject &sock
q->setOpenMode(QIODevice::ReadWrite|QIODevice::Unbuffered);
q->setSocketState(QBluetoothSocket::ConnectedState);
- emit q->connected();
}
-void QBluetoothSocketPrivate::defaultSocketConnectFailed(
+void QBluetoothSocketPrivateAndroid::defaultSocketConnectFailed(
const QAndroidJniObject &socket, const QAndroidJniObject &targetUuid,
const QBluetoothUuid &qtTargetUuid)
{
@@ -597,7 +657,7 @@ void QBluetoothSocketPrivate::defaultSocketConnectFailed(
}
}
-void QBluetoothSocketPrivate::fallbackSocketConnectFailed(
+void QBluetoothSocketPrivateAndroid::fallbackSocketConnectFailed(
const QAndroidJniObject &socket, const QAndroidJniObject &targetUuid)
{
Q_UNUSED(targetUuid);
@@ -616,7 +676,7 @@ void QBluetoothSocketPrivate::fallbackSocketConnectFailed(
q->setSocketState(QBluetoothSocket::UnconnectedState);
}
-void QBluetoothSocketPrivate::abort()
+void QBluetoothSocketPrivateAndroid::abort()
{
if (state == QBluetoothSocket::UnconnectedState)
return;
@@ -629,7 +689,7 @@ void QBluetoothSocketPrivate::abort()
* thread because inputStream.read() throws IOException
* In turn the thread stops and throws an error which sets
* new state, error and emits relevant signals.
- * See QBluetoothSocketPrivate::inputThreadError() for details
+ * See QBluetoothSocketPrivateAndroid::inputThreadError() for details
*/
if (inputThread)
@@ -653,12 +713,14 @@ void QBluetoothSocketPrivate::abort()
// close() without further feedback. Therefore we have to set
// Unconnected (now) in advance
Q_Q(QBluetoothSocket);
+ q->setOpenMode(QIODevice::NotOpen);
q->setSocketState(QBluetoothSocket::UnconnectedState);
+ emit q->readChannelFinished();
}
}
}
-QString QBluetoothSocketPrivate::localName() const
+QString QBluetoothSocketPrivateAndroid::localName() const
{
if (adapter.isValid())
return adapter.callObjectMethod<jstring>("getName").toString();
@@ -666,7 +728,7 @@ QString QBluetoothSocketPrivate::localName() const
return QString();
}
-QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
+QBluetoothAddress QBluetoothSocketPrivateAndroid::localAddress() const
{
QString result;
if (adapter.isValid())
@@ -675,13 +737,13 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
return QBluetoothAddress(result);
}
-quint16 QBluetoothSocketPrivate::localPort() const
+quint16 QBluetoothSocketPrivateAndroid::localPort() const
{
// Impossible to get channel number with current Android API (Levels 5 to 19)
return 0;
}
-QString QBluetoothSocketPrivate::peerName() const
+QString QBluetoothSocketPrivateAndroid::peerName() const
{
if (!remoteDevice.isValid())
return QString();
@@ -689,7 +751,7 @@ QString QBluetoothSocketPrivate::peerName() const
return remoteDevice.callObjectMethod("getName", "()Ljava/lang/String;").toString();
}
-QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
+QBluetoothAddress QBluetoothSocketPrivateAndroid::peerAddress() const
{
if (!remoteDevice.isValid())
return QBluetoothAddress();
@@ -700,13 +762,13 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
return QBluetoothAddress(address);
}
-quint16 QBluetoothSocketPrivate::peerPort() const
+quint16 QBluetoothSocketPrivateAndroid::peerPort() const
{
// Impossible to get channel number with current Android API (Levels 5 to 13)
return 0;
}
-qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateAndroid::writeData(const char *data, qint64 maxSize)
{
//TODO implement buffered behavior (so far only unbuffered)
Q_Q(QBluetoothSocket);
@@ -736,7 +798,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
return maxSize;
}
-qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateAndroid::readData(char *data, qint64 maxSize)
{
Q_Q(QBluetoothSocket);
if (state != QBluetoothSocket::ConnectedState || !inputThread) {
@@ -749,7 +811,7 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
return inputThread->readData(data, maxSize);
}
-void QBluetoothSocketPrivate::inputThreadError(int errorCode)
+void QBluetoothSocketPrivateAndroid::inputThreadError(int errorCode)
{
Q_Q(QBluetoothSocket);
@@ -777,13 +839,12 @@ void QBluetoothSocketPrivate::inputThreadError(int errorCode)
}
}
- q->setSocketState(QBluetoothSocket::UnconnectedState);
q->setOpenMode(QIODevice::NotOpen);
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
emit q->readChannelFinished();
- emit q->disconnected();
}
-void QBluetoothSocketPrivate::close()
+void QBluetoothSocketPrivateAndroid::close()
{
/* This function is called by QBluetoothSocket::close and softer version
QBluetoothSocket::disconnectFromService() which difference I do not quite fully understand.
@@ -792,7 +853,7 @@ void QBluetoothSocketPrivate::close()
abort();
}
-bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+bool QBluetoothSocketPrivateAndroid::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
Q_UNUSED(socketDescriptor);
@@ -803,7 +864,7 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo
return false;
}
-bool QBluetoothSocketPrivate::setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType_,
+bool QBluetoothSocketPrivateAndroid::setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType_,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
@@ -853,10 +914,6 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(const QAndroidJniObject &socke
this, SLOT(inputThreadError(int)), Qt::QueuedConnection);
inputThread->run();
-
- q->setSocketState(socketState);
- q->setOpenMode(openMode | QIODevice::Unbuffered);
-
// WorkerThread manages all sockets for us
// When we come through here the socket was already connected by
// server socket listener (see QBluetoothServer)
@@ -865,13 +922,13 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(const QAndroidJniObject &socke
workerThread->setupWorker(this, socketObject, QAndroidJniObject(), !USE_FALLBACK);
workerThread->start();
- if (openMode == QBluetoothSocket::ConnectedState)
- emit q->connected();
+ q->setOpenMode(openMode | QIODevice::Unbuffered);
+ q->setSocketState(socketState);
return true;
}
-qint64 QBluetoothSocketPrivate::bytesAvailable() const
+qint64 QBluetoothSocketPrivateAndroid::bytesAvailable() const
{
//We cannot access buffer directly as it is part of different thread
if (inputThread)
@@ -880,12 +937,12 @@ qint64 QBluetoothSocketPrivate::bytesAvailable() const
return 0;
}
-qint64 QBluetoothSocketPrivate::bytesToWrite() const
+qint64 QBluetoothSocketPrivateAndroid::bytesToWrite() const
{
return 0; // nothing because always unbuffered
}
-bool QBluetoothSocketPrivate::canReadLine() const
+bool QBluetoothSocketPrivateAndroid::canReadLine() const
{
// We cannot access buffer directly as it is part of different thread
if (inputThread)
diff --git a/src/bluetooth/qbluetoothsocket_android_p.h b/src/bluetooth/qbluetoothsocket_android_p.h
new file mode 100644
index 00000000..7bf42e32
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocket_android_p.h
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef QBLUETOOTHSOCKET_ANDROID_P_H
+#define QBLUETOOTHSOCKET_ANDROID_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbluetoothsocketbase_p.h"
+
+#include <QtAndroidExtras/QAndroidJniObject>
+#include <QtCore/QPointer>
+#include "android/inputstreamthread_p.h"
+#include <jni.h>
+
+QT_BEGIN_NAMESPACE
+
+class QBluetoothSocketPrivateAndroid final : public QBluetoothSocketBasePrivate
+{
+ Q_OBJECT
+ friend class QBluetoothServerPrivate;
+
+public:
+ QBluetoothSocketPrivateAndroid();
+ ~QBluetoothSocketPrivateAndroid() override;
+
+ //On Android we connect using the uuid not the port
+ void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) override;
+
+ void connectToService(const QBluetoothServiceInfo &service,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ bool fallBackConnect(QAndroidJniObject uuid, int channel);
+ bool fallBackReversedConnect(const QBluetoothUuid &uuid);
+
+ bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override;
+
+ QString localName() const override;
+ QBluetoothAddress localAddress() const override;
+ quint16 localPort() const override;
+
+ QString peerName() const override;
+ QBluetoothAddress peerAddress() const override;
+ quint16 peerPort() const override;
+
+ void abort() override;
+ void close() override;
+
+ qint64 writeData(const char *data, qint64 maxSize) override;
+ qint64 readData(char *data, qint64 maxSize) override;
+
+ bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ qint64 bytesAvailable() const override;
+ bool canReadLine() const override;
+ qint64 bytesToWrite() const override;
+
+ QAndroidJniObject adapter;
+ QAndroidJniObject socketObject;
+ QAndroidJniObject remoteDevice;
+ QAndroidJniObject inputStream;
+ QAndroidJniObject outputStream;
+ InputStreamThread *inputThread;
+
+public slots:
+ void socketConnectSuccess(const QAndroidJniObject &socket);
+ void defaultSocketConnectFailed(const QAndroidJniObject & socket,
+ const QAndroidJniObject &targetUuid,
+ const QBluetoothUuid &qtTargetUuid);
+ void fallbackSocketConnectFailed(const QAndroidJniObject &socket,
+ const QAndroidJniObject &targetUuid);
+ void inputThreadError(int errorCode);
+
+signals:
+ void connectJavaSocket();
+ void closeJavaSocket();
+
+};
+
+// QTBUG-61392 related
+// Private API to disable the silent behavior to reverse a remote service's
+// UUID. In rare cases the workaround behavior might not be desirable as
+// it may lead to connects to incorrect services.
+extern bool useReverseUuidWorkAroundConnect;
+
+QT_END_NAMESPACE
+
+#endif // QBLUETOOTHSOCKET_ANDROID_P_H
diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp
index 678caacf..bbc32a90 100644
--- a/src/bluetooth/qbluetoothsocket_bluez.cpp
+++ b/src/bluetooth/qbluetoothsocket_bluez.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtBluetooth module of the Qt Toolkit.
@@ -38,7 +38,8 @@
****************************************************************************/
#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_bluez_p.h"
+#include "qbluetoothdeviceinfo.h"
#include "bluez/manager_p.h"
#include "bluez/adapter_p.h"
@@ -62,38 +63,30 @@ QT_BEGIN_NAMESPACE
Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
-QBluetoothSocketPrivate::QBluetoothSocketPrivate()
- : socket(-1),
- socketType(QBluetoothServiceInfo::UnknownProtocol),
- state(QBluetoothSocket::UnconnectedState),
- socketError(QBluetoothSocket::NoSocketError),
- readNotifier(0),
- connectWriteNotifier(0),
- connecting(false),
- discoveryAgent(0),
- secFlags(QBluetooth::Authorization),
- lowEnergySocketType(0)
+QBluetoothSocketPrivateBluez::QBluetoothSocketPrivateBluez()
+ : QBluetoothSocketBasePrivate()
{
+ secFlags = QBluetooth::Authorization;
}
-QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
+QBluetoothSocketPrivateBluez::~QBluetoothSocketPrivateBluez()
{
delete readNotifier;
- readNotifier = 0;
+ readNotifier = nullptr;
delete connectWriteNotifier;
- connectWriteNotifier = 0;
+ connectWriteNotifier = nullptr;
}
-bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
+bool QBluetoothSocketPrivateBluez::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
{
if (socket != -1) {
if (socketType == type)
return true;
delete readNotifier;
- readNotifier = 0;
+ readNotifier = nullptr;
delete connectWriteNotifier;
- connectWriteNotifier = 0;
+ connectWriteNotifier = nullptr;
QT_CLOSE(socket);
}
@@ -129,7 +122,7 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol
return true;
}
-void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+void QBluetoothSocketPrivateBluez::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
int result = -1;
@@ -214,7 +207,111 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
}
}
-void QBluetoothSocketPrivate::_q_writeNotify()
+void QBluetoothSocketPrivateBluez::connectToService(
+ const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState
+ && q->state() != QBluetoothSocket::ServiceLookupState) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ // we are checking the service protocol and not socketType()
+ // socketType will change in ensureNativeSocket()
+ if (service.socketProtocol() == QBluetoothServiceInfo::UnknownProtocol) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocket::connectToService cannot "
+ "connect with 'UnknownProtocol' (type provided by given service)";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ if (service.protocolServiceMultiplexer() > 0) {
+ Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::L2capProtocol);
+
+ if (!ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) {
+ errorString = QBluetoothSocket::tr("Unknown socket error");
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
+ connectToServiceHelper(service.device().address(), service.protocolServiceMultiplexer(),
+ openMode);
+ } else if (service.serverChannel() > 0) {
+ Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::RfcommProtocol);
+
+ if (!ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) {
+ errorString = QBluetoothSocket::tr("Unknown socket error");
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
+ connectToServiceHelper(service.device().address(), service.serverChannel(), openMode);
+ } else {
+ // try doing service discovery to see if we can find the socket
+ if (service.serviceUuid().isNull()
+ && !service.serviceClassUuids().contains(QBluetoothUuid::SerialPort)) {
+ qCWarning(QT_BT_BLUEZ) << "No port, no PSM, and no UUID provided. Unable to connect";
+ return;
+ }
+ qCDebug(QT_BT_BLUEZ) << "Need a port/psm, doing discovery";
+ q->doDeviceDiscovery(service, openMode);
+ }
+}
+
+void QBluetoothSocketPrivateBluez::connectToService(
+ const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService cannot "
+ "connect with 'UnknownProtocol' (type provided by given service)";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ QBluetoothServiceInfo service;
+ QBluetoothDeviceInfo device(address, QString(), QBluetoothDeviceInfo::MiscellaneousDevice);
+ service.setDevice(device);
+ service.setServiceUuid(uuid);
+ q->doDeviceDiscovery(service, openMode);
+}
+
+void QBluetoothSocketPrivateBluez::connectToService(
+ const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService cannot "
+ "connect with 'UnknownProtocol' (type provided by given service)";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ if (q->state() != QBluetoothSocket::UnconnectedState) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+ connectToServiceHelper(address, port, openMode);
+}
+
+void QBluetoothSocketPrivateBluez::_q_writeNotify()
{
Q_Q(QBluetoothSocket);
if(connecting && state == QBluetoothSocket::ConnectingState){
@@ -228,7 +325,6 @@ void QBluetoothSocketPrivate::_q_writeNotify()
}
q->setSocketState(QBluetoothSocket::ConnectedState);
- emit q->connected();
connectWriteNotifier->setEnabled(false);
connecting = false;
@@ -275,7 +371,7 @@ void QBluetoothSocketPrivate::_q_writeNotify()
}
}
-void QBluetoothSocketPrivate::_q_readNotify()
+void QBluetoothSocketPrivateBluez::_q_readNotify()
{
Q_Q(QBluetoothSocket);
char *writePointer = buffer.reserve(QPRIVATELINEARBUFFER_BUFFERSIZE);
@@ -302,21 +398,28 @@ void QBluetoothSocketPrivate::_q_readNotify()
}
}
-void QBluetoothSocketPrivate::abort()
+void QBluetoothSocketPrivateBluez::abort()
{
delete readNotifier;
- readNotifier = 0;
+ readNotifier = nullptr;
delete connectWriteNotifier;
- connectWriteNotifier = 0;
+ connectWriteNotifier = nullptr;
// We don't transition through Closing for abort, so
// we don't call disconnectFromService or
// QBluetoothSocket::close
QT_CLOSE(socket);
socket = -1;
+
+ Q_Q(QBluetoothSocket);
+
+ q->setOpenMode(QIODevice::NotOpen);
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
+ emit q->readChannelFinished();
+ emit q->disconnected();
}
-QString QBluetoothSocketPrivate::localName() const
+QString QBluetoothSocketPrivateBluez::localName() const
{
const QBluetoothAddress address = localAddress();
if (address.isNull())
@@ -326,7 +429,7 @@ QString QBluetoothSocketPrivate::localName() const
return device.name();
}
-QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
+QBluetoothAddress QBluetoothSocketPrivateBluez::localAddress() const
{
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
sockaddr_rc addr;
@@ -345,7 +448,7 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
return QBluetoothAddress();
}
-quint16 QBluetoothSocketPrivate::localPort() const
+quint16 QBluetoothSocketPrivateBluez::localPort() const
{
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
sockaddr_rc addr;
@@ -364,7 +467,7 @@ quint16 QBluetoothSocketPrivate::localPort() const
return 0;
}
-QString QBluetoothSocketPrivate::peerName() const
+QString QBluetoothSocketPrivateBluez::peerName() const
{
quint64 bdaddr;
@@ -452,7 +555,7 @@ QString QBluetoothSocketPrivate::peerName() const
}
}
-QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
+QBluetoothAddress QBluetoothSocketPrivateBluez::peerAddress() const
{
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
sockaddr_rc addr;
@@ -471,7 +574,7 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
return QBluetoothAddress();
}
-quint16 QBluetoothSocketPrivate::peerPort() const
+quint16 QBluetoothSocketPrivateBluez::peerPort() const
{
if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
sockaddr_rc addr;
@@ -490,7 +593,7 @@ quint16 QBluetoothSocketPrivate::peerPort() const
return 0;
}
-qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateBluez::writeData(const char *data, qint64 maxSize)
{
Q_Q(QBluetoothSocket);
@@ -535,7 +638,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
}
}
-qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateBluez::readData(char *data, qint64 maxSize)
{
Q_Q(QBluetoothSocket);
@@ -553,7 +656,7 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
return 0;
}
-void QBluetoothSocketPrivate::close()
+void QBluetoothSocketPrivateBluez::close()
{
if (txBuffer.size() > 0)
connectWriteNotifier->setEnabled(true);
@@ -561,14 +664,14 @@ void QBluetoothSocketPrivate::close()
abort();
}
-bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType_,
+bool QBluetoothSocketPrivateBluez::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType_,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
delete readNotifier;
- readNotifier = 0;
+ readNotifier = nullptr;
delete connectWriteNotifier;
- connectWriteNotifier = 0;
+ connectWriteNotifier = nullptr;
socketType = socketType_;
socket = socketDescriptor;
@@ -589,17 +692,17 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo
return true;
}
-qint64 QBluetoothSocketPrivate::bytesAvailable() const
+qint64 QBluetoothSocketPrivateBluez::bytesAvailable() const
{
return buffer.size();
}
-qint64 QBluetoothSocketPrivate::bytesToWrite() const
+qint64 QBluetoothSocketPrivateBluez::bytesToWrite() const
{
return txBuffer.size();
}
-bool QBluetoothSocketPrivate::canReadLine() const
+bool QBluetoothSocketPrivateBluez::canReadLine() const
{
return buffer.canReadLine();
}
diff --git a/src/bluetooth/qbluetoothsocket_bluez_p.h b/src/bluetooth/qbluetoothsocket_bluez_p.h
new file mode 100644
index 00000000..67c04b3d
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocket_bluez_p.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBLUETOOTHSOCKET_BLUEZ_H
+#define QBLUETOOTHSOCKET_BLUEZ_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbluetoothsocketbase_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class QBluetoothSocketPrivateBluez final: public QBluetoothSocketBasePrivate
+{
+ Q_OBJECT
+
+public:
+ QBluetoothSocketPrivateBluez();
+ ~QBluetoothSocketPrivateBluez() override;
+
+ void connectToServiceHelper(const QBluetoothAddress &address,
+ quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ void connectToService(const QBluetoothServiceInfo &service,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override;
+
+ QString localName() const override;
+ QBluetoothAddress localAddress() const override;
+ quint16 localPort() const override;
+
+ QString peerName() const override;
+ QBluetoothAddress peerAddress() const override;
+ quint16 peerPort() const override;
+
+ void abort() override;
+ void close() override;
+
+ qint64 writeData(const char *data, qint64 maxSize) override;
+ qint64 readData(char *data, qint64 maxSize) override;
+
+ bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ qint64 bytesAvailable() const override;
+ bool canReadLine() const override;
+ qint64 bytesToWrite() const override;
+
+private slots:
+ void _q_readNotify();
+ void _q_writeNotify();
+};
+
+QT_END_NAMESPACE
+
+#endif // QBLUETOOTHSOCKET_BLUEZ_H
diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp
new file mode 100644
index 00000000..c98d0c26
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp
@@ -0,0 +1,612 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbluetoothsocket.h"
+#include "qbluetoothsocket_bluezdbus_p.h"
+
+#include "bluez/bluez_data_p.h"
+#include "bluez/bluez5_helper_p.h"
+#include "bluez/adapter1_bluez5_p.h"
+#include "bluez/device1_bluez5_p.h"
+#include "bluez/objectmanager_p.h"
+#include "bluez/profile1_p.h"
+#include "bluez/profile1context_p.h"
+#include "bluez/profilemanager1_p.h"
+
+#include <QtBluetooth/qbluetoothdeviceinfo.h>
+#include <QtBluetooth/qbluetoothserviceinfo.h>
+
+#include <QtCore/qloggingcategory.h>
+#include <QtCore/qrandom.h>
+
+#include <QtNetwork/qlocalsocket.h>
+
+#include <unistd.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
+
+static const QLatin1String profilePathTemplate("/qt/btsocket/%1%2/%3");
+
+QBluetoothSocketPrivateBluezDBus::QBluetoothSocketPrivateBluezDBus()
+{
+ secFlags = QBluetooth::NoSecurity;
+
+ profileManager = new OrgBluezProfileManager1Interface(
+ QStringLiteral("org.bluez"),
+ QStringLiteral("/org/bluez"),
+ QDBusConnection::systemBus(),
+ this);
+}
+
+QBluetoothSocketPrivateBluezDBus::~QBluetoothSocketPrivateBluezDBus()
+{
+}
+
+bool QBluetoothSocketPrivateBluezDBus::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
+{
+ switch (type) {
+ case QBluetoothServiceInfo::UnknownProtocol:
+ break;
+ case QBluetoothServiceInfo::RfcommProtocol:
+ case QBluetoothServiceInfo::L2capProtocol:
+ socketType = type;
+ return true;
+ }
+
+ return false;
+}
+
+void QBluetoothSocketPrivateBluezDBus::connectToServiceHelper(
+ const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+{
+ // TODO Remove when Bluez4 support dropped
+ // Only used by QBluetoothSocketPrivateBluez
+ Q_UNUSED(openMode);
+ Q_UNUSED(address);
+ Q_UNUSED(port);
+}
+
+static QString findRemoteDevicePath(const QBluetoothAddress &address)
+{
+ OrgFreedesktopDBusObjectManagerInterface manager(QStringLiteral("org.bluez"),
+ QStringLiteral("/"),
+ QDBusConnection::systemBus());
+
+ bool ok = false;
+ const QString adapterPath = findAdapterForAddress(QBluetoothAddress(), &ok);
+ if (!ok)
+ return QString();
+
+ auto reply = manager.GetManagedObjects();
+ reply.waitForFinished();
+ if (reply.isError())
+ return QString();
+
+ QString remoteDevicePath;
+
+ ManagedObjectList objectList = reply.value();
+ for (ManagedObjectList::const_iterator it = objectList.constBegin();
+ it != objectList.constEnd(); ++it) {
+ const QDBusObjectPath &path = it.key();
+ const InterfaceList &ifaceList = it.value();
+
+ for (InterfaceList::const_iterator ifaceIter = ifaceList.constBegin();
+ ifaceIter != ifaceList.constEnd(); ++ifaceIter) {
+ if (ifaceIter.key() == QStringLiteral("org.bluez.Device1")) {
+ if (path.path().indexOf(adapterPath) != 0)
+ continue; // devices whose path does not start with same path we skip
+
+ OrgBluezDevice1Interface device(QStringLiteral("org.bluez"),
+ path.path(), QDBusConnection::systemBus());
+ if (device.adapter().path() != adapterPath)
+ continue;
+
+ const QBluetoothAddress btAddress(device.address());
+ if (btAddress.isNull() || btAddress != address)
+ continue;
+
+ return path.path();
+ }
+ }
+ }
+
+ return QString();
+}
+
+void QBluetoothSocketPrivateBluezDBus::connectToServiceHelper(
+ const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ int i = 0;
+ bool success = false;
+ profileUuid = uuid.toString(QUuid::WithoutBraces);
+
+ if (profileContext) {
+ qCDebug(QT_BT_BLUEZ) << "Profile context still active. close socket first.";
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
+
+
+ profileContext = new OrgBluezProfile1ContextInterface(this);
+ connect(profileContext, &OrgBluezProfile1ContextInterface::newConnection,
+ this, &QBluetoothSocketPrivateBluezDBus::remoteConnected);
+
+ for (i = 0; i < 10 && !success; i++) {
+ // profile registration might fail in case other service uses same path
+ // try 10 times and otherwise abort
+
+ profilePath = QString(profilePathTemplate).
+ arg(sanitizeNameForDBus(QCoreApplication::applicationName())).
+ arg(QCoreApplication::applicationPid()).
+ arg(QRandomGenerator::global()->generate());
+
+ success = QDBusConnection::systemBus().registerObject(
+ profilePath, profileContext, QDBusConnection::ExportAllSlots);
+ }
+
+ if (!success) {
+ // we could not register the profile
+ qCWarning(QT_BT_BLUEZ) << "Cannot export serial client profile on DBus";
+
+ delete profileContext;
+ profileContext = nullptr;
+
+ errorString = QBluetoothSocket::tr("Cannot export profile on DBus");
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+
+ return;
+ }
+
+ QVariantMap profileOptions;
+ profileOptions.insert(QStringLiteral("Role"), QStringLiteral("client"));
+ profileOptions.insert(QStringLiteral("Service"), profileUuid);
+ profileOptions.insert(QStringLiteral("Name"),
+ QStringLiteral("QBluetoothSocket-%1").arg(QCoreApplication::applicationPid()));
+
+ // TODO support more profile parameter
+ // profileOptions.insert(QStringLiteral("Channel"), 0);
+
+ qCDebug(QT_BT_BLUEZ) << "Registering client profile on" << profilePath << "with options:";
+ qCDebug(QT_BT_BLUEZ) << profileOptions;
+ QDBusPendingReply<> reply = profileManager->RegisterProfile(
+ QDBusObjectPath(profilePath),
+ profileUuid,
+ profileOptions);
+ reply.waitForFinished();
+ if (reply.isError()) {
+ qCWarning(QT_BT_BLUEZ) << "Client profile registration failed:"
+ << reply.error().message();
+
+ QDBusConnection::systemBus().unregisterObject(profilePath);
+ errorString = QBluetoothSocket::tr("Cannot register profile on DBus");
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
+
+ remoteDevicePath = findRemoteDevicePath(address);
+ if (remoteDevicePath.isEmpty()) {
+ qCWarning(QT_BT_BLUEZ) << "Unknown remote device:" << address
+ << "Try device discovery first";
+ clearSocket();
+
+ errorString = QBluetoothSocket::tr("Cannot find remote device");
+ q->setSocketError(QBluetoothSocket::HostNotFoundError);
+ return;
+ }
+
+ OrgBluezDevice1Interface device(QStringLiteral("org.bluez"), remoteDevicePath,
+ QDBusConnection::systemBus());
+ reply = device.ConnectProfile(profileUuid);
+ if (reply.isError()) {
+ qCWarning(QT_BT_BLUEZ) << "Cannot connect to profile/service:" << uuid;
+
+ clearSocket();
+
+ errorString = QBluetoothSocket::tr("Cannot connect to remote profile");
+ q->setSocketError(QBluetoothSocket::HostNotFoundError);
+ return;
+ }
+
+ q->setOpenMode(openMode);
+ q->setSocketState(QBluetoothSocket::ConnectingState);
+}
+
+void QBluetoothSocketPrivateBluezDBus::connectToService(
+ const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+ QBluetoothUuid targetService;
+
+ targetService = service.serviceUuid();
+ if (targetService.isNull()) {
+ // Do we have serialport service class?
+ if (service.serviceClassUuids().contains(QBluetoothUuid::SerialPort))
+ targetService = QBluetoothUuid::SerialPort;
+ }
+
+ if (targetService.isNull()) {
+ qCWarning(QT_BT_BLUEZ) << "Cannot find appropriate serviceUuid"
+ << "or SerialPort service class uuid";
+ errorString = QBluetoothSocket::tr("Missing serviceUuid or Serial Port service class uuid");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ connectToService(service.device().address(), targetService, openMode);
+}
+
+void QBluetoothSocketPrivateBluezDBus::connectToService(
+ const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (address.isNull()) {
+ qCWarning(QT_BT_BLUEZ) << "Invalid address to remote address passed.";
+ errorString = QBluetoothSocket::tr("Invalid Bluetooth address passed to connectToService()");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (uuid.isNull()) {
+ qCWarning(QT_BT_BLUEZ) << "Cannot find appropriate serviceUuid"
+ << "or SerialPort service class uuid";
+ errorString = QBluetoothSocket::tr("Missing serviceUuid or Serial Port service class uuid");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (q->state() != QBluetoothSocket::UnconnectedState) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluezDBus::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) {
+ qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluezDBus::connectToService cannot "
+ "connect with 'UnknownProtocol' (type provided by given service)";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ if (!ensureNativeSocket(q->socketType())) {
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+ connectToServiceHelper(address, uuid, openMode);
+}
+
+void QBluetoothSocketPrivateBluezDBus::connectToService(
+ const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+{
+
+ Q_UNUSED(port);
+ Q_UNUSED(address);
+ Q_UNUSED(openMode);
+ Q_Q(QBluetoothSocket);
+
+ errorString = tr("Connecting to port is not supported via Bluez DBus");
+ q->setSocketError(QBluetoothSocket::ServiceNotFoundError);
+ qCWarning(QT_BT_BLUEZ) << "Connecting to port is not supported (Uuid required)";
+}
+
+void QBluetoothSocketPrivateBluezDBus::abort()
+{
+ if (localSocket) {
+ localSocket->close();
+ // delayed disconnected signal emission when localSocket closes
+ } else {
+ Q_Q(QBluetoothSocket);
+
+ clearSocket();
+ q->setOpenMode(QIODevice::NotOpen);
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
+ emit q->readChannelFinished();
+ }
+}
+
+QString QBluetoothSocketPrivateBluezDBus::localName() const
+{
+ bool ok = false;
+ const QString adapterPath = findAdapterForAddress(QBluetoothAddress(), &ok);
+ if (!ok)
+ return QString();
+
+ OrgBluezAdapter1Interface adapter(QStringLiteral("org.bluez"), adapterPath,
+ QDBusConnection::systemBus());
+ return QString(adapter.alias());
+}
+
+QBluetoothAddress QBluetoothSocketPrivateBluezDBus::localAddress() const
+{
+ bool ok = false;
+ const QString adapterPath = findAdapterForAddress(QBluetoothAddress(), &ok);
+ if (!ok)
+ return QBluetoothAddress();
+
+ OrgBluezAdapter1Interface adapter(QStringLiteral("org.bluez"), adapterPath,
+ QDBusConnection::systemBus());
+ return QBluetoothAddress(adapter.address());
+}
+
+quint16 QBluetoothSocketPrivateBluezDBus::localPort() const
+{
+ int descriptor = -1;
+
+ if (localSocket)
+ descriptor = int(localSocket->socketDescriptor());
+ if (descriptor == -1)
+ return 0;
+
+ if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
+ sockaddr_rc addr;
+ socklen_t addrLength = sizeof(addr);
+
+ if (::getsockname(descriptor, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+ return (addr.rc_channel);
+ } else if (socketType == QBluetoothServiceInfo::L2capProtocol) {
+ sockaddr_l2 addr;
+ socklen_t addrLength = sizeof(addr);
+
+ if (::getsockname(descriptor, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+ return addr.l2_psm;
+ }
+
+ return 0;
+}
+
+QString QBluetoothSocketPrivateBluezDBus::peerName() const
+{
+ if (remoteDevicePath.isEmpty())
+ return QString();
+
+ OrgBluezDevice1Interface device(QStringLiteral("org.bluez"), remoteDevicePath,
+ QDBusConnection::systemBus());
+ return device.alias();
+}
+
+QBluetoothAddress QBluetoothSocketPrivateBluezDBus::peerAddress() const
+{
+ if (remoteDevicePath.isEmpty())
+ return QBluetoothAddress();
+
+ OrgBluezDevice1Interface device(QStringLiteral("org.bluez"), remoteDevicePath,
+ QDBusConnection::systemBus());
+ return QBluetoothAddress(device.address());
+}
+
+quint16 QBluetoothSocketPrivateBluezDBus::peerPort() const
+{
+ int descriptor = -1;
+
+ if (localSocket)
+ descriptor = int(localSocket->socketDescriptor());
+ if (descriptor == -1)
+ return 0;
+
+ if (socketType == QBluetoothServiceInfo::RfcommProtocol) {
+ sockaddr_rc addr;
+ socklen_t addrLength = sizeof(addr);
+
+ if (::getpeername(descriptor, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+ return addr.rc_channel;
+ } else if (socketType == QBluetoothServiceInfo::L2capProtocol) {
+ sockaddr_l2 addr;
+ socklen_t addrLength = sizeof(addr);
+
+ if (::getpeername(descriptor, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+ return addr.l2_psm;
+ }
+
+ return 0;
+}
+
+qint64 QBluetoothSocketPrivateBluezDBus::writeData(const char *data, qint64 maxSize)
+{
+ Q_UNUSED(data);
+ Q_UNUSED(maxSize);
+
+ Q_Q(QBluetoothSocket);
+
+ if (state != QBluetoothSocket::ConnectedState) {
+ errorString = QBluetoothSocket::tr("Cannot write while not connected");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return -1;
+ }
+
+ if (localSocket)
+ return localSocket->write(data, maxSize);
+
+ return -1;
+}
+
+qint64 QBluetoothSocketPrivateBluezDBus::readData(char *data, qint64 maxSize)
+{
+ Q_UNUSED(data);
+ Q_UNUSED(maxSize);
+
+ Q_Q(QBluetoothSocket);
+
+ if (state != QBluetoothSocket::ConnectedState) {
+ errorString = QBluetoothSocket::tr("Cannot read while not connected");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return -1;
+ }
+
+ if (localSocket)
+ return localSocket->read(data, maxSize);
+
+ return -1;
+}
+
+void QBluetoothSocketPrivateBluezDBus::close()
+{
+ abort();
+}
+
+bool QBluetoothSocketPrivateBluezDBus::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
+{
+ Q_UNUSED(socketDescriptor);
+ Q_UNUSED(socketType)
+ Q_UNUSED(socketState);
+ Q_UNUSED(openMode);
+ return false;
+}
+
+qint64 QBluetoothSocketPrivateBluezDBus::bytesAvailable() const
+{
+ if (localSocket)
+ return localSocket->bytesAvailable();
+
+ return 0;
+}
+
+bool QBluetoothSocketPrivateBluezDBus::canReadLine() const
+{
+ if (localSocket)
+ return localSocket->canReadLine();
+
+ return false;
+}
+
+qint64 QBluetoothSocketPrivateBluezDBus::bytesToWrite() const
+{
+ if (localSocket)
+ return localSocket->bytesToWrite();
+
+ return 0;
+}
+
+void QBluetoothSocketPrivateBluezDBus::remoteConnected(const QDBusUnixFileDescriptor &fd)
+{
+ Q_Q(QBluetoothSocket);
+
+ int descriptor = ::dup(fd.fileDescriptor());
+ localSocket = new QLocalSocket(this);
+ bool success = localSocket->setSocketDescriptor(
+ descriptor, QLocalSocket::ConnectedState, q->openMode());
+ if (!success || !localSocket->isValid()) {
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
+ delete localSocket;
+ localSocket = nullptr;
+ } else {
+ connect(localSocket, &QLocalSocket::readyRead,
+ q, &QBluetoothSocket::readyRead);
+ connect(localSocket, &QLocalSocket::stateChanged,
+ this, &QBluetoothSocketPrivateBluezDBus::socketStateChanged);
+
+ socket = descriptor;
+ q->setSocketState(QBluetoothSocket::ConnectedState);
+ }
+}
+
+void QBluetoothSocketPrivateBluezDBus::socketStateChanged(QLocalSocket::LocalSocketState newState)
+{
+ Q_Q(QBluetoothSocket);
+
+ switch (newState) {
+ case QLocalSocket::ClosingState:
+ q->setSocketState(QBluetoothSocket::ClosingState);
+ break;
+ case QLocalSocket::UnconnectedState:
+ clearSocket();
+ q->setOpenMode(QIODevice::NotOpen);
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
+ emit q->readChannelFinished();
+ break;
+ default:
+ // ConnectingState and ConnectedState not mapped
+ // (already set at the time when the socket is created)
+ break;
+ }
+}
+
+void QBluetoothSocketPrivateBluezDBus::clearSocket()
+{
+ Q_Q(QBluetoothSocket);
+
+ if (profilePath.isEmpty())
+ return;
+
+ qCDebug(QT_BT_BLUEZ) << "Clearing profile called for" << profilePath;
+
+ if (localSocket) {
+ localSocket->close();
+ localSocket->deleteLater();
+ localSocket = nullptr;
+ }
+
+ socket = -1;
+
+ if (q->state() == QBluetoothSocket::ConnectedState) {
+ OrgBluezDevice1Interface device(QStringLiteral("org.bluez"), remoteDevicePath,
+ QDBusConnection::systemBus());
+ auto reply = device.DisconnectProfile(profileUuid);
+ reply.waitForFinished();
+ if (reply.isError()) {
+ qCWarning(QT_BT_BLUEZ) << "Disconnect profile failed:"
+ << reply.error().message();
+ }
+ }
+
+ QDBusPendingReply<> reply = profileManager->UnregisterProfile(QDBusObjectPath(profilePath));
+ reply.waitForFinished();
+ if (reply.isError())
+ qCWarning(QT_BT_BLUEZ) << "Unregister profile:" << reply.error().message();
+
+ QDBusConnection::systemBus().unregisterObject(profilePath);
+
+ if (profileContext) {
+ delete profileContext;
+ profileContext = nullptr;
+ }
+
+ remoteDevicePath.clear();
+ profileUuid.clear();
+ profilePath.clear();
+}
+QT_END_NAMESPACE
diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h
new file mode 100644
index 00000000..4d1a272e
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBLUETOOTHSOCKET_BLUEZDBUS_H
+#define QBLUETOOTHSOCKET_BLUEZDBUS_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbluetoothsocketbase_p.h"
+
+#include <QtDBus/qdbusunixfiledescriptor.h>
+
+#include <QtNetwork/qlocalsocket.h>
+
+class OrgBluezProfileManager1Interface;
+
+QT_BEGIN_NAMESPACE
+
+class QLocalSocket;
+class OrgBluezProfile1ContextInterface;
+
+class QBluetoothSocketPrivateBluezDBus final: public QBluetoothSocketBasePrivate
+{
+ Q_OBJECT
+
+public:
+ QBluetoothSocketPrivateBluezDBus();
+ ~QBluetoothSocketPrivateBluezDBus() override;
+
+ void connectToServiceHelper(const QBluetoothAddress &address,
+ quint16 port,
+ QIODevice::OpenMode openMode) override;
+ void connectToServiceHelper(const QBluetoothAddress &address,
+ const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode);
+
+ void connectToService(const QBluetoothServiceInfo &service,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override;
+
+ QString localName() const override;
+ QBluetoothAddress localAddress() const override;
+ quint16 localPort() const override;
+
+ QString peerName() const override;
+ QBluetoothAddress peerAddress() const override;
+ quint16 peerPort() const override;
+
+ void abort() override;
+ void close() override;
+
+ qint64 writeData(const char *data, qint64 maxSize) override;
+ qint64 readData(char *data, qint64 maxSize) override;
+
+ bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ qint64 bytesAvailable() const override;
+ bool canReadLine() const override;
+ qint64 bytesToWrite() const override;
+
+private:
+ void remoteConnected(const QDBusUnixFileDescriptor &fd);
+ void socketStateChanged(QLocalSocket::LocalSocketState newState);
+
+ void clearSocket();
+
+private:
+ OrgBluezProfileManager1Interface *profileManager = nullptr;
+ OrgBluezProfile1ContextInterface *profileContext = nullptr;
+ QString remoteDevicePath;
+ QString profileUuid;
+ QString profilePath;
+ QLocalSocket *localSocket = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBLUETOOTHSOCKET_BLUEZDBUS_H
diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_dummy.cpp
index 4c716005..82da46c2 100644
--- a/src/bluetooth/qbluetoothsocket_p.cpp
+++ b/src/bluetooth/qbluetoothsocket_dummy.cpp
@@ -38,78 +38,114 @@
****************************************************************************/
#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_dummy_p.h"
#ifndef QT_IOS_BLUETOOTH
#include "dummy/dummy_helper_p.h"
#endif
QT_BEGIN_NAMESPACE
-QBluetoothSocketPrivate::QBluetoothSocketPrivate()
- : socket(-1),
- socketType(QBluetoothServiceInfo::UnknownProtocol),
- state(QBluetoothSocket::UnconnectedState),
- socketError(QBluetoothSocket::NoSocketError),
- discoveryAgent(0),
- secFlags(QBluetooth::NoSecurity)
+QBluetoothSocketPrivateDummy::QBluetoothSocketPrivateDummy()
{
+ secFlags = QBluetooth::NoSecurity;
#ifndef QT_IOS_BLUETOOTH
printDummyWarning();
#endif
}
-QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
+QBluetoothSocketPrivateDummy::~QBluetoothSocketPrivateDummy()
{
}
-bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
+bool QBluetoothSocketPrivateDummy::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
{
socketType = type;
return false;
}
-void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+void QBluetoothSocketPrivateDummy::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
{
Q_UNUSED(openMode);
Q_UNUSED(address);
Q_UNUSED(port);
}
-void QBluetoothSocketPrivate::abort()
+void QBluetoothSocketPrivateDummy::connectToService(
+ const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode)
+{
+ Q_UNUSED(service);
+ Q_UNUSED(openMode);
+
+ Q_Q(QBluetoothSocket);
+
+ qWarning() << "Using non-functional QBluetoothSocketPrivateDummy";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+}
+
+void QBluetoothSocketPrivateDummy::connectToService(
+ const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode)
+{
+ Q_UNUSED(address);
+ Q_UNUSED(uuid);
+ Q_UNUSED(openMode);
+
+ Q_Q(QBluetoothSocket);
+
+ qWarning() << "Using non-functional QBluetoothSocketPrivateDummy";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+}
+
+void QBluetoothSocketPrivateDummy::connectToService(
+ const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+{
+ Q_UNUSED(address);
+ Q_UNUSED(port);
+ Q_UNUSED(openMode);
+
+ Q_Q(QBluetoothSocket);
+
+ qWarning() << "Using non-functional QBluetoothSocketPrivateDummy";
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+}
+
+void QBluetoothSocketPrivateDummy::abort()
{
}
-QString QBluetoothSocketPrivate::localName() const
+QString QBluetoothSocketPrivateDummy::localName() const
{
return QString();
}
-QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
+QBluetoothAddress QBluetoothSocketPrivateDummy::localAddress() const
{
return QBluetoothAddress();
}
-quint16 QBluetoothSocketPrivate::localPort() const
+quint16 QBluetoothSocketPrivateDummy::localPort() const
{
return 0;
}
-QString QBluetoothSocketPrivate::peerName() const
+QString QBluetoothSocketPrivateDummy::peerName() const
{
return QString();
}
-QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
+QBluetoothAddress QBluetoothSocketPrivateDummy::peerAddress() const
{
return QBluetoothAddress();
}
-quint16 QBluetoothSocketPrivate::peerPort() const
+quint16 QBluetoothSocketPrivateDummy::peerPort() const
{
return 0;
}
-qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateDummy::writeData(const char *data, qint64 maxSize)
{
Q_UNUSED(data);
Q_UNUSED(maxSize);
@@ -124,7 +160,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
return -1;
}
-qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateDummy::readData(char *data, qint64 maxSize)
{
Q_UNUSED(data);
Q_UNUSED(maxSize);
@@ -140,11 +176,11 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
return -1;
}
-void QBluetoothSocketPrivate::close()
+void QBluetoothSocketPrivateDummy::close()
{
}
-bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+bool QBluetoothSocketPrivateDummy::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
Q_UNUSED(socketDescriptor);
@@ -154,17 +190,17 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo
return false;
}
-qint64 QBluetoothSocketPrivate::bytesAvailable() const
+qint64 QBluetoothSocketPrivateDummy::bytesAvailable() const
{
return 0;
}
-bool QBluetoothSocketPrivate::canReadLine() const
+bool QBluetoothSocketPrivateDummy::canReadLine() const
{
return false;
}
-qint64 QBluetoothSocketPrivate::bytesToWrite() const
+qint64 QBluetoothSocketPrivateDummy::bytesToWrite() const
{
return 0;
}
diff --git a/src/bluetooth/qbluetoothsocket_dummy_p.h b/src/bluetooth/qbluetoothsocket_dummy_p.h
new file mode 100644
index 00000000..78a2049b
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocket_dummy_p.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBLUETOOTHSOCKET_DUMMY_H
+#define QBLUETOOTHSOCKET_DUMMY_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbluetoothsocket.h"
+#include "qbluetoothsocketbase_p.h"
+#include <QtGlobal>
+
+QT_BEGIN_NAMESPACE
+
+class QBluetoothSocketPrivateDummy final : public QBluetoothSocketBasePrivate
+{
+ Q_OBJECT
+ friend class QBluetoothServerPrivate;
+
+public:
+ QBluetoothSocketPrivateDummy();
+ ~QBluetoothSocketPrivateDummy() override;
+
+ void connectToServiceHelper(const QBluetoothAddress &address,
+ quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ void connectToService(const QBluetoothServiceInfo &service,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override;
+
+ QString localName() const override;
+ QBluetoothAddress localAddress() const override;
+ quint16 localPort() const override;
+
+ QString peerName() const override;
+ QBluetoothAddress peerAddress() const override;
+ quint16 peerPort() const override;
+
+ void abort() override;
+ void close() override;
+
+ qint64 writeData(const char *data, qint64 maxSize) override;
+ qint64 readData(char *data, qint64 maxSize) override;
+
+ bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ qint64 bytesAvailable() const override;
+ bool canReadLine() const override;
+ qint64 bytesToWrite() const override;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBLUETOOTHSOCKET_DUMMY_H
+
diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm
index 7ef6fd64..7f630146 100644
--- a/src/bluetooth/qbluetoothsocket_osx.mm
+++ b/src/bluetooth/qbluetoothsocket_osx.mm
@@ -41,9 +41,7 @@
// The order is important (the first header contains
// the base class for a private socket) - workaround for
// dependencies problem.
-#include "qbluetoothsocket_p.h"
-#include "qbluetoothsocket_osx_p.h"
-//
+#include "qbluetoothsocketbase_p.h"
#include "qbluetoothsocket_osx_p.h"
#include "qbluetoothlocaldevice.h"
#include "qbluetoothdeviceinfo.h"
@@ -60,14 +58,14 @@
QT_BEGIN_NAMESPACE
QBluetoothSocketPrivate::QBluetoothSocketPrivate()
- : q_ptr(nullptr),
- writeChunk(std::numeric_limits<UInt16>::max()),
+ : writeChunk(std::numeric_limits<UInt16>::max()),
openMode(QIODevice::NotOpen), // That's what is set in public class' ctors.
state(QBluetoothSocket::UnconnectedState),
socketType(QBluetoothServiceInfo::UnknownProtocol),
socketError(QBluetoothSocket::NoSocketError),
isConnecting(false)
{
+ q_ptr = nullptr;
}
QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
diff --git a/src/bluetooth/qbluetoothsocket_osx_p.h b/src/bluetooth/qbluetoothsocket_osx_p.h
index ce376702..dcc684b8 100644
--- a/src/bluetooth/qbluetoothsocket_osx_p.h
+++ b/src/bluetooth/qbluetoothsocket_osx_p.h
@@ -79,10 +79,9 @@
QT_BEGIN_NAMESPACE
-class QBluetoothServiceDiscoveryAgent;
class QBluetoothAddress;
-class QBluetoothSocketPrivate : public QBluetoothSocketPrivateBase, public OSXBluetooth::ChannelDelegate
+class QBluetoothSocketPrivate : public QBluetoothSocketBasePrivate, public OSXBluetooth::ChannelDelegate
{
friend class QBluetoothSocket;
friend class QBluetoothServer;
@@ -121,8 +120,6 @@ private:
qint64 writeData(const char *data, qint64 maxSize);
qint64 readData(char *data, qint64 maxSize);
- QBluetoothSocket *q_ptr;
-
QScopedPointer<QBluetoothServiceDiscoveryAgent> discoveryAgent;
QPrivateLinearBuffer buffer;
diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp
index 670235fa..79dccdd6 100644
--- a/src/bluetooth/qbluetoothsocket_winrt.cpp
+++ b/src/bluetooth/qbluetoothsocket_winrt.cpp
@@ -37,8 +37,7 @@
**
****************************************************************************/
-#include "qbluetoothsocket.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocket_winrt_p.h"
#ifdef CLASSIC_APP_BUILD
#define Q_OS_WINRT
@@ -48,6 +47,8 @@
#include <private/qeventdispatcher_winrt_p.h>
#include <QtBluetooth/QBluetoothLocalDevice>
+#include <QtBluetooth/qbluetoothdeviceinfo.h>
+#include <QtBluetooth/qbluetoothserviceinfo.h>
#include <QtCore/qloggingcategory.h>
#include <robuffer.h>
@@ -319,27 +320,22 @@ private:
ComPtr<IAsyncOperationWithProgress<IBuffer *, UINT32>> m_readOp;
};
-QBluetoothSocketPrivate::QBluetoothSocketPrivate()
- : socket(-1),
- socketType(QBluetoothServiceInfo::UnknownProtocol),
- state(QBluetoothSocket::UnconnectedState),
- socketError(QBluetoothSocket::NoSocketError),
- discoveryAgent(0),
- secFlags(QBluetooth::NoSecurity),
- m_worker(new SocketWorker())
+QBluetoothSocketPrivateWinRT::QBluetoothSocketPrivateWinRT()
+ : m_worker(new SocketWorker())
{
+ secFlags = QBluetooth::NoSecurity;
connect(m_worker, &SocketWorker::newDataReceived,
- this, &QBluetoothSocketPrivate::handleNewData, Qt::QueuedConnection);
+ this, &QBluetoothSocketPrivateWinRT::handleNewData, Qt::QueuedConnection);
connect(m_worker, &SocketWorker::socketErrorOccured,
- this, &QBluetoothSocketPrivate::handleError, Qt::QueuedConnection);
+ this, &QBluetoothSocketPrivateWinRT::handleError, Qt::QueuedConnection);
}
-QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
+QBluetoothSocketPrivateWinRT::~QBluetoothSocketPrivateWinRT()
{
abort();
}
-bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
+bool QBluetoothSocketPrivateWinRT::ensureNativeSocket(QBluetoothServiceInfo::Protocol type)
{
if (socket != -1) {
if (type == socketType)
@@ -363,7 +359,7 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol
return true;
}
-void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+void QBluetoothSocketPrivateWinRT::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
Q_UNUSED(openMode);
@@ -382,14 +378,14 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IHostName> remoteHost;
hr = hostNameFactory->CreateHostName(hostNameRef.Get(), &remoteHost);
- RETURN_VOID_IF_FAILED("QBluetoothSocketPrivate::connectToService: Could not create hostname.");
+ RETURN_VOID_IF_FAILED("QBluetoothSocketPrivateWinRT::connectToService: Could not create hostname.");
const QString portString = QString::number(port);
HStringReference portReference(reinterpret_cast<LPCWSTR>(portString.utf16()));
hr = m_socketObject->ConnectAsync(remoteHost.Get(), portReference.Get(), &m_connectOp);
if (hr == E_ACCESSDENIED) {
- qErrnoWarning(hr, "QBluetoothSocketPrivate::connectToService: Unable to connect to bluetooth socket."
+ qErrnoWarning(hr, "QBluetoothSocketPrivateWinRT::connectToService: Unable to connect to bluetooth socket."
"Please check your manifest capabilities.");
q->setSocketState(QBluetoothSocket::UnconnectedState);
return;
@@ -397,26 +393,124 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
Q_ASSERT_SUCCEEDED(hr);
q->setSocketState(QBluetoothSocket::ConnectingState);
- q->setOpenMode(openMode);
- QEventDispatcherWinRT::runOnXamlThread([this]() {
+ requestedOpenMode = openMode;
+ hr = QEventDispatcherWinRT::runOnXamlThread([this]() {
HRESULT hr;
hr = m_connectOp->put_Completed(Callback<IAsyncActionCompletedHandler>(
- this, &QBluetoothSocketPrivate::handleConnectOpFinished).Get());
+ this, &QBluetoothSocketPrivateWinRT::handleConnectOpFinished).Get());
RETURN_HR_IF_FAILED("connectToHostByName: Could not register \"connectOp\" callback");
return S_OK;
});
+ Q_ASSERT_SUCCEEDED(hr);
}
-void QBluetoothSocketPrivate::abort()
+void QBluetoothSocketPrivateWinRT::connectToService(
+ const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState
+ && q->state() != QBluetoothSocket::ServiceLookupState) {
+ qCWarning(QT_BT_WINRT) << "QBluetoothSocket::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ // we are checking the service protocol and not socketType()
+ // socketType will change in ensureNativeSocket()
+ if (service.socketProtocol() != QBluetoothServiceInfo::RfcommProtocol) {
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ if (service.protocolServiceMultiplexer() > 0) {
+ Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::L2capProtocol);
+
+ if (!ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) {
+ errorString = QBluetoothSocket::tr("Unknown socket error");
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
+ connectToServiceHelper(service.device().address(), service.protocolServiceMultiplexer(), openMode);
+ } else if (service.serverChannel() > 0) {
+ Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::RfcommProtocol);
+
+ if (!ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) {
+ errorString = QBluetoothSocket::tr("Unknown socket error");
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
+ connectToServiceHelper(service.device().address(), service.serverChannel(), openMode);
+ } else {
+ // try doing service discovery to see if we can find the socket
+ if (service.serviceUuid().isNull()
+ && !service.serviceClassUuids().contains(QBluetoothUuid::SerialPort)) {
+ qCWarning(QT_BT_WINRT) << "No port, no PSM, and no UUID provided. Unable to connect";
+ return;
+ }
+ qCDebug(QT_BT_WINRT) << "Need a port/psm, doing discovery";
+ q->doDeviceDiscovery(service, openMode);
+ }
+}
+
+void QBluetoothSocketPrivateWinRT::connectToService(
+ const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState) {
+ qCWarning(QT_BT_WINRT) << "QBluetoothSocketPrivateWinRT::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (q->socketType() != QBluetoothServiceInfo::RfcommProtocol) {
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ QBluetoothServiceInfo service;
+ QBluetoothDeviceInfo device(address, QString(), QBluetoothDeviceInfo::MiscellaneousDevice);
+ service.setDevice(device);
+ service.setServiceUuid(uuid);
+ q->doDeviceDiscovery(service, openMode);
+}
+
+void QBluetoothSocketPrivateWinRT::connectToService(
+ const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
+{
+ Q_Q(QBluetoothSocket);
+
+ if (q->state() != QBluetoothSocket::UnconnectedState) {
+ qCWarning(QT_BT_WINRT) << "QBluetoothSocketPrivateWinRT::connectToService called on busy socket";
+ errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress");
+ q->setSocketError(QBluetoothSocket::OperationError);
+ return;
+ }
+
+ if (q->socketType() != QBluetoothServiceInfo::RfcommProtocol) {
+ errorString = QBluetoothSocket::tr("Socket type not supported");
+ q->setSocketError(QBluetoothSocket::UnsupportedProtocolError);
+ return;
+ }
+
+ connectToServiceHelper(address, port, openMode);
+}
+
+void QBluetoothSocketPrivateWinRT::abort()
{
Q_Q(QBluetoothSocket);
if (state == QBluetoothSocket::UnconnectedState)
return;
disconnect(m_worker, &SocketWorker::newDataReceived,
- this, &QBluetoothSocketPrivate::handleNewData);
+ this, &QBluetoothSocketPrivateWinRT::handleNewData);
disconnect(m_worker, &SocketWorker::socketErrorOccured,
- this, &QBluetoothSocketPrivate::handleError);
+ this, &QBluetoothSocketPrivateWinRT::handleError);
m_worker->close();
m_worker->deleteLater();
@@ -424,10 +518,16 @@ void QBluetoothSocketPrivate::abort()
m_socketObject = nullptr;
socket = -1;
}
+
+ const bool wasConnected = q->state() == QBluetoothSocket::ConnectedState;
q->setSocketState(QBluetoothSocket::UnconnectedState);
+ if (wasConnected) {
+ q->setOpenMode(QIODevice::NotOpen);
+ emit q->readChannelFinished();
+ }
}
-QString QBluetoothSocketPrivate::localName() const
+QString QBluetoothSocketPrivateWinRT::localName() const
{
const QBluetoothAddress address = localAddress();
if (address.isNull())
@@ -437,7 +537,7 @@ QString QBluetoothSocketPrivate::localName() const
return device.name();
}
-QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
+QBluetoothAddress QBluetoothSocketPrivateWinRT::localAddress() const
{
if (!m_socketObject)
return QBluetoothAddress();
@@ -455,7 +555,7 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
return QBluetoothAddress(qt_QStringFromHString(localAddress));
}
-quint16 QBluetoothSocketPrivate::localPort() const
+quint16 QBluetoothSocketPrivateWinRT::localPort() const
{
if (!m_socketObject)
return 0;
@@ -470,7 +570,7 @@ quint16 QBluetoothSocketPrivate::localPort() const
return qt_QStringFromHString(localPortString).toInt();
}
-QString QBluetoothSocketPrivate::peerName() const
+QString QBluetoothSocketPrivateWinRT::peerName() const
{
if (!m_socketObject)
return QString();
@@ -488,7 +588,7 @@ QString QBluetoothSocketPrivate::peerName() const
return qt_QStringFromHString(remoteHostName);
}
-QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
+QBluetoothAddress QBluetoothSocketPrivateWinRT::peerAddress() const
{
if (!m_socketObject)
return QBluetoothAddress();
@@ -506,7 +606,7 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
return QBluetoothAddress(qt_QStringFromHString(remoteAddress));
}
-quint16 QBluetoothSocketPrivate::peerPort() const
+quint16 QBluetoothSocketPrivateWinRT::peerPort() const
{
if (!m_socketObject)
return 0;
@@ -521,7 +621,7 @@ quint16 QBluetoothSocketPrivate::peerPort() const
return qt_QStringFromHString(remotePortString).toInt();
}
-qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateWinRT::writeData(const char *data, qint64 maxSize)
{
Q_Q(QBluetoothSocket);
@@ -547,7 +647,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
return bytesWritten;
}
-qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
+qint64 QBluetoothSocketPrivateWinRT::readData(char *data, qint64 maxSize)
{
Q_Q(QBluetoothSocket);
@@ -563,12 +663,12 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
return 0;
}
-void QBluetoothSocketPrivate::close()
+void QBluetoothSocketPrivateWinRT::close()
{
abort();
}
-bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+bool QBluetoothSocketPrivateWinRT::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
Q_UNUSED(socketDescriptor);
@@ -579,7 +679,7 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo
return false;
}
-bool QBluetoothSocketPrivate::setSocketDescriptor(ComPtr<IStreamSocket> socketPtr, QBluetoothServiceInfo::Protocol socketType,
+bool QBluetoothSocketPrivateWinRT::setSocketDescriptor(ComPtr<IStreamSocket> socketPtr, QBluetoothServiceInfo::Protocol socketType,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
@@ -596,22 +696,22 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(ComPtr<IStreamSocket> socketPt
return true;
}
-qint64 QBluetoothSocketPrivate::bytesAvailable() const
+qint64 QBluetoothSocketPrivateWinRT::bytesAvailable() const
{
return buffer.size();
}
-qint64 QBluetoothSocketPrivate::bytesToWrite() const
+qint64 QBluetoothSocketPrivateWinRT::bytesToWrite() const
{
return 0; // nothing because always unbuffered
}
-bool QBluetoothSocketPrivate::canReadLine() const
+bool QBluetoothSocketPrivateWinRT::canReadLine() const
{
return buffer.canReadLine();
}
-void QBluetoothSocketPrivate::handleNewData(const QVector<QByteArray> &data)
+void QBluetoothSocketPrivateWinRT::handleNewData(const QVector<QByteArray> &data)
{
// Defer putting the data into the list until the next event loop iteration
// (where the readyRead signal is emitted as well)
@@ -619,7 +719,7 @@ void QBluetoothSocketPrivate::handleNewData(const QVector<QByteArray> &data)
Q_ARG(QVector<QByteArray>, data));
}
-void QBluetoothSocketPrivate::handleError(QBluetoothSocket::SocketError error)
+void QBluetoothSocketPrivateWinRT::handleError(QBluetoothSocket::SocketError error)
{
Q_Q(QBluetoothSocket);
switch (error) {
@@ -634,10 +734,15 @@ void QBluetoothSocketPrivate::handleError(QBluetoothSocket::SocketError error)
}
q->setSocketError(error);
+ const bool wasConnected = q->state() == QBluetoothSocket::ConnectedState;
q->setSocketState(QBluetoothSocket::UnconnectedState);
+ if (wasConnected) {
+ q->setOpenMode(QIODevice::NotOpen);
+ emit q->readChannelFinished();
+ }
}
-void QBluetoothSocketPrivate::addToPendingData(const QVector<QByteArray> &data)
+void QBluetoothSocketPrivateWinRT::addToPendingData(const QVector<QByteArray> &data)
{
Q_Q(QBluetoothSocket);
QMutexLocker locker(&m_readMutex);
@@ -650,7 +755,7 @@ void QBluetoothSocketPrivate::addToPendingData(const QVector<QByteArray> &data)
emit q->readyRead();
}
-HRESULT QBluetoothSocketPrivate::handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status)
+HRESULT QBluetoothSocketPrivateWinRT::handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status)
{
Q_Q(QBluetoothSocket);
if (status != Completed || !m_connectOp) { // Protect against a late callback
@@ -701,9 +806,9 @@ HRESULT QBluetoothSocketPrivate::handleConnectOpFinished(ABI::Windows::Foundatio
Q_ASSERT_SUCCEEDED(hr);
}
+ q->setOpenMode(requestedOpenMode);
q->setSocketState(QBluetoothSocket::ConnectedState);
m_worker->startReading();
- emit q->connected();
return S_OK;
}
diff --git a/src/bluetooth/qbluetoothsocket_winrt_p.h b/src/bluetooth/qbluetoothsocket_winrt_p.h
new file mode 100644
index 00000000..40e87f01
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocket_winrt_p.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBLUETOOTHSOCKET_WINRT_P_H
+#define QBLUETOOTHSOCKET_WINRT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbluetoothsocket.h"
+#include "qbluetoothsocketbase_p.h"
+#include <QtGlobal>
+
+QT_FORWARD_DECLARE_CLASS(SocketWorker)
+
+QT_BEGIN_NAMESPACE
+
+class QBluetoothSocketPrivateWinRT final: public QBluetoothSocketBasePrivate
+{
+ Q_OBJECT
+ friend class QBluetoothServerPrivate;
+
+public:
+ QBluetoothSocketPrivateWinRT();
+ ~QBluetoothSocketPrivateWinRT() override;
+
+ void connectToServiceHelper(const QBluetoothAddress &address,
+ quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ void connectToService(const QBluetoothServiceInfo &service,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) override;
+ void connectToService(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) override;
+
+ bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override;
+
+ QString localName() const override;
+ QBluetoothAddress localAddress() const override;
+ quint16 localPort() const override;
+
+ QString peerName() const override;
+ QBluetoothAddress peerAddress() const override;
+ quint16 peerPort() const override;
+
+ void abort() override;
+ void close() override;
+
+ qint64 writeData(const char *data, qint64 maxSize) override;
+ qint64 readData(char *data, qint64 maxSize) override;
+
+ bool setSocketDescriptor(Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocket> socket,
+ QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override;
+
+ qint64 bytesAvailable() const override;
+ bool canReadLine() const override;
+ qint64 bytesToWrite() const override;
+
+ SocketWorker *m_worker;
+
+ Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocket> m_socketObject;
+ Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncAction> m_connectOp;
+
+ QMutex m_readMutex;
+
+ // Protected by m_readMutex. Written in addToPendingData (native callback)
+ QVector<QByteArray> m_pendingData;
+
+ Q_INVOKABLE void addToPendingData(const QVector<QByteArray> &data);
+
+private slots:
+ void handleNewData(const QVector<QByteArray> &data);
+ void handleError(QBluetoothSocket::SocketError error);
+
+private:
+ HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action,
+ ABI::Windows::Foundation::AsyncStatus status);
+
+ QIODevice::OpenMode requestedOpenMode = QIODevice::NotOpen;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/bluetooth/qbluetoothsocketbase.cpp b/src/bluetooth/qbluetoothsocketbase.cpp
new file mode 100644
index 00000000..8401a1c3
--- /dev/null
+++ b/src/bluetooth/qbluetoothsocketbase.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbluetoothsocketbase_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QBluetoothSocketBasePrivate::QBluetoothSocketBasePrivate(QObject *parent) : QObject(parent)
+{
+
+}
+
+QBluetoothSocketBasePrivate::~QBluetoothSocketBasePrivate()
+{
+
+}
+
+QT_END_NAMESPACE
diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocketbase_p.h
index ae3c6182..410dcbbd 100644
--- a/src/bluetooth/qbluetoothsocket_p.h
+++ b/src/bluetooth/qbluetoothsocketbase_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtBluetooth module of the Qt Toolkit.
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QBLUETOOTHSOCKET_P_H
-#define QBLUETOOTHSOCKET_P_H
+#ifndef QBLUETOOTHSOCKETBASEPRIVATE_P_H
+#define QBLUETOOTHSOCKETBASEPRIVATE_P_H
//
// W A R N I N G
@@ -51,17 +51,15 @@
// We mean it.
//
-#include "qbluetoothsocket.h"
+#include <qglobal.h>
+#include <QObject>
+#include <QtBluetooth/qbluetoothsocket.h>
-#ifdef QT_ANDROID_BLUETOOTH
+#if defined(QT_ANDROID_BLUETOOTH)
#include <QtAndroidExtras/QAndroidJniObject>
-#include <QtCore/QPointer>
-#include "android/inputstreamthread_p.h"
-#include <jni.h>
-class WorkerThread;
#endif
-#ifdef QT_WINRT_BLUETOOTH
+#if defined(QT_WINRT_BLUETOOTH)
#include <QtCore/QMutex>
#include <wrl.h>
@@ -86,191 +84,97 @@ namespace ABI {
#endif
#include "qprivatelinearbuffer_p.h"
-#include <QtGlobal>
-
QT_FORWARD_DECLARE_CLASS(QSocketNotifier)
+QT_FORWARD_DECLARE_CLASS(QBluetoothServiceDiscoveryAgent)
QT_BEGIN_NAMESPACE
-#ifdef QT_WINRT_BLUETOOTH
-class SocketWorker;
-#endif
-
-class QBluetoothServiceDiscoveryAgent;
-
-class QSocketServerPrivate
-{
-public:
- QSocketServerPrivate();
- ~QSocketServerPrivate();
-};
-
-
-
-class QBluetoothSocket;
-class QBluetoothServiceDiscoveryAgent;
-
#ifndef QT_OSX_BLUETOOTH
-class QBluetoothSocketPrivate : public QObject
+class QBluetoothSocketBasePrivate : public QObject
{
Q_OBJECT
- Q_DECLARE_PUBLIC(QBluetoothSocket)
- friend class QBluetoothServerPrivate;
public:
+ explicit QBluetoothSocketBasePrivate(QObject *parent = nullptr);
+ virtual ~QBluetoothSocketBasePrivate();
- QBluetoothSocketPrivate();
- ~QBluetoothSocketPrivate();
+ virtual bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) = 0;
-//On Android we connect using the uuid not the port
-#if defined(QT_ANDROID_BLUETOOTH)
- void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
- QIODevice::OpenMode openMode);
-#else
- void connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode);
-#endif
-#ifdef QT_ANDROID_BLUETOOTH
- bool fallBackConnect(QAndroidJniObject uuid, int channel);
- bool fallBackReversedConnect(const QBluetoothUuid &uuid);
-#endif
+ virtual QString localName() const = 0;
+ virtual QBluetoothAddress localAddress() const = 0;
+ virtual quint16 localPort() const = 0;
+ virtual QString peerName() const = 0;
+ virtual QBluetoothAddress peerAddress() const = 0;
+ virtual quint16 peerPort() const = 0;
- bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type);
+ virtual void abort() = 0;
+ virtual void close() = 0;
- QString localName() const;
- QBluetoothAddress localAddress() const;
- quint16 localPort() const;
+ virtual qint64 writeData(const char *data, qint64 maxSize) = 0;
+ virtual qint64 readData(char *data, qint64 maxSize) = 0;
- QString peerName() const;
- QBluetoothAddress peerAddress() const;
- quint16 peerPort() const;
- //QBluetoothServiceInfo peerService() const;
+ virtual qint64 bytesAvailable() const = 0;
+ virtual bool canReadLine() const = 0;
+ virtual qint64 bytesToWrite() const = 0;
- void abort();
- void close();
+ virtual bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
+ QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0;
- //qint64 readBufferSize() const;
- //void setReadBufferSize(qint64 size);
- qint64 writeData(const char *data, qint64 maxSize);
- qint64 readData(char *data, qint64 maxSize);
+#if defined(QT_ANDROID_BLUETOOTH)
+ virtual void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) = 0;
+#else
+ virtual void connectToServiceHelper(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) = 0;
+#endif
+ virtual void connectToService(const QBluetoothServiceInfo &service,
+ QIODevice::OpenMode openMode) = 0;
+ virtual void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid,
+ QIODevice::OpenMode openMode) = 0;
+ virtual void connectToService(const QBluetoothAddress &address, quint16 port,
+ QIODevice::OpenMode openMode) = 0;
#ifdef QT_ANDROID_BLUETOOTH
- bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType,
+ virtual bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType,
QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
- QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite);
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0;
#elif defined(QT_WINRT_BLUETOOTH)
- bool setSocketDescriptor(Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocket> socket,
+ virtual bool setSocketDescriptor(Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocket> socket,
QBluetoothServiceInfo::Protocol socketType,
QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
- QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite);
+ QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0;
#endif
- bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType,
- QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState,
- QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite);
-
- qint64 bytesAvailable() const;
- bool canReadLine() const;
- qint64 bytesToWrite() const;
public:
QPrivateLinearBuffer buffer;
QPrivateLinearBuffer txBuffer;
- int socket;
- QBluetoothServiceInfo::Protocol socketType;
- QBluetoothSocket::SocketState state;
- QBluetoothSocket::SocketError socketError;
- QSocketNotifier *readNotifier;
- QSocketNotifier *connectWriteNotifier;
- bool connecting;
-
- QBluetoothServiceDiscoveryAgent *discoveryAgent;
+ int socket = -1;
+ QBluetoothServiceInfo::Protocol socketType = QBluetoothServiceInfo::UnknownProtocol;
+ QBluetoothSocket::SocketState state = QBluetoothSocket::UnconnectedState;
+ QBluetoothSocket::SocketError socketError = QBluetoothSocket::NoSocketError;
+ QSocketNotifier *readNotifier = nullptr;
+ QSocketNotifier *connectWriteNotifier = nullptr;
+ bool connecting = false;
+
+ QBluetoothServiceDiscoveryAgent *discoveryAgent = nullptr;
QBluetoothSocket::OpenMode openMode;
QBluetooth::SecurityFlags secFlags;
-
-// QByteArray rxBuffer;
-// qint64 rxOffset;
QString errorString;
-#ifdef QT_ANDROID_BLUETOOTH
- QAndroidJniObject adapter;
- QAndroidJniObject socketObject;
- QAndroidJniObject remoteDevice;
- QAndroidJniObject inputStream;
- QAndroidJniObject outputStream;
- InputStreamThread *inputThread;
-
-public slots:
- void socketConnectSuccess(const QAndroidJniObject &socket);
- void defaultSocketConnectFailed(const QAndroidJniObject & socket,
- const QAndroidJniObject &targetUuid,
- const QBluetoothUuid &qtTargetUuid);
- void fallbackSocketConnectFailed(const QAndroidJniObject &socket,
- const QAndroidJniObject &targetUuid);
- void inputThreadError(int errorCode);
-
-signals:
- void connectJavaSocket();
- void closeJavaSocket();
-
-#endif
-
-#ifdef QT_WINRT_BLUETOOTH
- SocketWorker *m_worker;
-
- Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocket> m_socketObject;
- Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncAction> m_connectOp;
-
- QMutex m_readMutex;
-
- // Protected by m_readMutex. Written in addToPendingData (native callback)
- QVector<QByteArray> m_pendingData;
-
- Q_INVOKABLE void addToPendingData(const QVector<QByteArray> &data);
-
-private slots:
- void handleNewData(const QVector<QByteArray> &data);
- void handleError(QBluetoothSocket::SocketError error);
-#endif // QT_WINRT_BLUETOOTH
-
-#if QT_CONFIG(bluez)
-private slots:
- void _q_readNotify();
- void _q_writeNotify();
-#endif
-
protected:
+ Q_DECLARE_PUBLIC(QBluetoothSocket)
QBluetoothSocket *q_ptr;
-private:
-
-#ifdef QT_WINRT_BLUETOOTH
- HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status);
-#endif
-
#if QT_CONFIG(bluez)
public:
- quint8 lowEnergySocketType;
+ quint8 lowEnergySocketType = 0;
#endif
};
-#else // QT_OSX_BLUETOOTH
-
-// QBluetoothSocketPrivate on OS X can not contain
-// Q_OBJECT (moc does not parse Objective-C syntax).
-// But QBluetoothSocket still requires QMetaObject::invokeMethod
-// to work. Here's the trick:
-class QBluetoothSocketPrivateBase : public QObject
-{
-// The most important part of it:
- Q_OBJECT
-public slots:
- virtual void _q_writeNotify() = 0;
-};
-
-#endif // QT_OSX_BLUETOOTH
-
static inline void convertAddress(const quint64 from, quint8 (&to)[6])
{
to[0] = (from >> 0) & 0xff;
@@ -281,7 +185,7 @@ static inline void convertAddress(const quint64 from, quint8 (&to)[6])
to[5] = (from >> 40) & 0xff;
}
-static inline quint64 convertAddress(const quint8 (&from)[6], quint64 *to = 0)
+static inline quint64 convertAddress(const quint8 (&from)[6], quint64 *to = nullptr)
{
const quint64 result = (quint64(from[0]) << 0) |
(quint64(from[1]) << 8) |
@@ -294,16 +198,26 @@ static inline quint64 convertAddress(const quint8 (&from)[6], quint64 *to = 0)
return result;
}
-#ifdef Q_OS_ANDROID
-// QTBUG-61392 related
-// Private API to disable the silent behavior to reverse a remote service's
-// UUID. In rare cases the workaround behavior might not be desirable as
-// it may lead to connects to incorrect services.
-extern bool useReverseUuidWorkAroundConnect;
+#else // QT_OSX_BLUETOOTH
-#endif
+// QBluetoothSocketPrivate on macOS can not contain
+// Q_OBJECT (moc does not parse Objective-C syntax).
+// But QBluetoothSocket still requires QMetaObject::invokeMethod
+// to work. Here's the trick:
+class QBluetoothSocketBasePrivate : public QObject
+{
+// The most important part of it:
+ Q_OBJECT
+public slots:
+ virtual void _q_writeNotify() = 0;
-QT_END_NAMESPACE
+protected:
+ Q_DECLARE_PUBLIC(QBluetoothSocket)
+ QBluetoothSocket *q_ptr;
+};
+#endif // QT_OSX_BLUETOOTH
-#endif
+QT_END_NAMESPACE
+
+#endif // QBLUETOOTHSOCKETBASE_P_H
diff --git a/src/bluetooth/qbluetoothtransferreply.cpp b/src/bluetooth/qbluetoothtransferreply.cpp
index 61162561..0faea96c 100644
--- a/src/bluetooth/qbluetoothtransferreply.cpp
+++ b/src/bluetooth/qbluetoothtransferreply.cpp
@@ -206,7 +206,6 @@ void QBluetoothTransferReply::setRequest(const QBluetoothTransferRequest &reques
*/
QBluetoothTransferReplyPrivate::QBluetoothTransferReplyPrivate()
- : m_manager(0)
{
}
diff --git a/src/bluetooth/qbluetoothtransferreply_bluez.cpp b/src/bluetooth/qbluetoothtransferreply_bluez.cpp
index fa96ce91..486e6288 100644
--- a/src/bluetooth/qbluetoothtransferreply_bluez.cpp
+++ b/src/bluetooth/qbluetoothtransferreply_bluez.cpp
@@ -68,8 +68,7 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ)
QBluetoothTransferReplyBluez::QBluetoothTransferReplyBluez(QIODevice *input, const QBluetoothTransferRequest &request,
QBluetoothTransferManager *parent)
: QBluetoothTransferReply(parent),
- m_client(0), m_agent(0), m_clientBluez(0), m_objectPushBluez(0),
- m_tempfile(0), m_source(input),
+ m_source(input),
m_running(false), m_finished(false), m_size(0),
m_error(QBluetoothTransferReply::NoError), m_errorStr(), m_transfer_path()
{
@@ -198,7 +197,7 @@ void QBluetoothTransferReplyBluez::cleanupSession()
qCWarning(QT_BT_BLUEZ) << "Abort: Cannot remove obex session";
delete m_objectPushBluez;
- m_objectPushBluez = 0;
+ m_objectPushBluez = nullptr;
}
void QBluetoothTransferReplyBluez::copyDone()
diff --git a/src/bluetooth/qbluetoothtransferreply_bluez_p.h b/src/bluetooth/qbluetoothtransferreply_bluez_p.h
index a432c955..48a8d4f0 100644
--- a/src/bluetooth/qbluetoothtransferreply_bluez_p.h
+++ b/src/bluetooth/qbluetoothtransferreply_bluez_p.h
@@ -72,7 +72,7 @@ class Q_BLUETOOTH_EXPORT QBluetoothTransferReplyBluez : public QBluetoothTransfe
public:
explicit QBluetoothTransferReplyBluez(QIODevice *input, const QBluetoothTransferRequest &request,
- QBluetoothTransferManager *parent = 0);
+ QBluetoothTransferManager *parent = nullptr);
~QBluetoothTransferReplyBluez();
bool isFinished() const;
@@ -87,14 +87,14 @@ private slots:
private:
void startOPP(const QString &filename);
- OrgOpenobexClientInterface *m_client;
- AgentAdaptor *m_agent;
- OrgBluezObexClient1Interface *m_clientBluez;
- OrgBluezObexObjectPush1Interface *m_objectPushBluez;
+ OrgOpenobexClientInterface *m_client = nullptr;
+ AgentAdaptor *m_agent = nullptr;
+ OrgBluezObexClient1Interface *m_clientBluez = nullptr;
+ OrgBluezObexObjectPush1Interface *m_objectPushBluez = nullptr;
- QTemporaryFile *m_tempfile;
- QIODevice *m_source;
+ QTemporaryFile *m_tempfile = nullptr;
+ QIODevice *m_source = nullptr;
bool m_running;
bool m_finished;
diff --git a/src/bluetooth/qbluetoothtransferreply_p.h b/src/bluetooth/qbluetoothtransferreply_p.h
index daac5333..375a89a3 100644
--- a/src/bluetooth/qbluetoothtransferreply_p.h
+++ b/src/bluetooth/qbluetoothtransferreply_p.h
@@ -60,7 +60,7 @@ class Q_BLUETOOTH_EXPORT QBluetoothTransferReplyPrivate
public:
QBluetoothTransferReplyPrivate();
- QBluetoothTransferManager *m_manager;
+ QBluetoothTransferManager *m_manager = nullptr;
QBluetoothTransferRequest m_request;
};
diff --git a/src/bluetooth/qleadvertiser_bluez.cpp b/src/bluetooth/qleadvertiser_bluez.cpp
index b964f620..47daed25 100644
--- a/src/bluetooth/qleadvertiser_bluez.cpp
+++ b/src/bluetooth/qleadvertiser_bluez.cpp
@@ -41,7 +41,7 @@
#include "bluez/bluez_data_p.h"
#include "bluez/hcimanager_p.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocketbase_p.h"
#include <QtCore/qloggingcategory.h>
@@ -273,7 +273,8 @@ void QLeAdvertiserBluez::setServicesData(const QLowEnergyAdvertisingData &src, A
QVector<quint16> services16;
QVector<quint32> services32;
QVector<quint128> services128;
- foreach (const QBluetoothUuid &service, src.services()) {
+ const QList<QBluetoothUuid> services = src.services();
+ for (const QBluetoothUuid &service : services) {
bool ok;
const quint16 service16 = service.toUInt16(&ok);
if (ok) {
@@ -393,7 +394,9 @@ void QLeAdvertiserBluez::setWhiteList()
if (parameters().filterPolicy() == QLowEnergyAdvertisingParameters::IgnoreWhiteList)
return;
queueCommand(OcfLeClearWhiteList, QByteArray());
- foreach (const auto &addressInfo, parameters().whiteList()) {
+ const QList<QLowEnergyAdvertisingParameters::AddressInfo> whiteListInfos
+ = parameters().whiteList();
+ for (const auto &addressInfo : whiteListInfos) {
WhiteListParams commandParam;
static_assert(sizeof commandParam == 7, "unexpected struct size");
commandParam.addrType = addressInfo.type;
diff --git a/src/bluetooth/qlowenergycharacteristic.cpp b/src/bluetooth/qlowenergycharacteristic.cpp
index a8b4c449..1419fa7c 100644
--- a/src/bluetooth/qlowenergycharacteristic.cpp
+++ b/src/bluetooth/qlowenergycharacteristic.cpp
@@ -104,7 +104,7 @@ struct QLowEnergyCharacteristicPrivate
\sa isValid()
*/
QLowEnergyCharacteristic::QLowEnergyCharacteristic():
- d_ptr(0), data(0)
+ d_ptr(nullptr)
{
}
@@ -116,7 +116,7 @@ QLowEnergyCharacteristic::QLowEnergyCharacteristic():
upon write.
*/
QLowEnergyCharacteristic::QLowEnergyCharacteristic(const QLowEnergyCharacteristic &other):
- d_ptr(other.d_ptr), data(0)
+ d_ptr(other.d_ptr)
{
if (other.data) {
data = new QLowEnergyCharacteristicPrivate();
@@ -241,7 +241,7 @@ QLowEnergyCharacteristic &QLowEnergyCharacteristic::operator=(const QLowEnergyCh
if (!other.data) {
if (data) {
delete data;
- data = 0;
+ data = nullptr;
}
} else {
if (!data)
@@ -380,7 +380,7 @@ QList<QLowEnergyDescriptor> QLowEnergyCharacteristic::descriptors() const
std::sort(descriptorKeys.begin(), descriptorKeys.end());
- foreach (const QLowEnergyHandle descHandle, descriptorKeys) {
+ for (const QLowEnergyHandle descHandle : qAsConst(descriptorKeys)) {
QLowEnergyDescriptor descriptor(d_ptr, data->handle, descHandle);
result.append(descriptor);
}
diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h
index f870a582..cb747e32 100644
--- a/src/bluetooth/qlowenergycharacteristic.h
+++ b/src/bluetooth/qlowenergycharacteristic.h
@@ -103,7 +103,7 @@ protected:
friend class QLowEnergyControllerPrivateCommon;
friend class QLowEnergyControllerPrivateOSX;
friend class QLowEnergyControllerPrivateWinRT;
- QLowEnergyCharacteristicPrivate *data;
+ QLowEnergyCharacteristicPrivate *data = nullptr;
QLowEnergyCharacteristic(QSharedPointer<QLowEnergyServicePrivate> p,
QLowEnergyHandle handle);
};
diff --git a/src/bluetooth/qlowenergycharacteristicdata.cpp b/src/bluetooth/qlowenergycharacteristicdata.cpp
index 9e0d69ad..700566a6 100644
--- a/src/bluetooth/qlowenergycharacteristicdata.cpp
+++ b/src/bluetooth/qlowenergycharacteristicdata.cpp
@@ -157,7 +157,7 @@ QList<QLowEnergyDescriptorData> QLowEnergyCharacteristicData::descriptors() cons
void QLowEnergyCharacteristicData::setDescriptors(const QList<QLowEnergyDescriptorData> &descriptors)
{
d->descriptors.clear();
- foreach (const QLowEnergyDescriptorData &desc, descriptors)
+ for (const QLowEnergyDescriptorData &desc : descriptors)
addDescriptor(desc);
}
diff --git a/src/bluetooth/qlowenergycontroller.h b/src/bluetooth/qlowenergycontroller.h
index f9e6ef5d..9fe46fe5 100644
--- a/src/bluetooth/qlowenergycontroller.h
+++ b/src/bluetooth/qlowenergycontroller.h
@@ -114,6 +114,7 @@ public:
ControllerState state() const;
+ // TODO Qt6 remove this property. It is not longer needed when using Bluez DBus backend
RemoteAddressType remoteAddressType() const;
void setRemoteAddressType(RemoteAddressType type);
diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp
index 54665f7b..35d943fc 100644
--- a/src/bluetooth/qlowenergycontroller_android.cpp
+++ b/src/bluetooth/qlowenergycontroller_android.cpp
@@ -501,7 +501,7 @@ void QLowEnergyControllerPrivateAndroid::servicesDiscovered(
if (errorCode == QLowEnergyController::NoError) {
//Android delivers all services in one go
const QStringList list = foundServices.split(QStringLiteral(" "), QString::SkipEmptyParts);
- foreach (const QString &entry, list) {
+ for (const QString &entry : list) {
const QBluetoothUuid service(entry);
if (service.isNull())
return;
@@ -550,7 +550,7 @@ void QLowEnergyControllerPrivateAndroid::serviceDetailsDiscoveryFinished(
const QStringList list = javaIncludes.toString()
.split(QStringLiteral(" "),
QString::SkipEmptyParts);
- foreach (const QString &entry, list) {
+ for (const QString &entry : list) {
const QBluetoothUuid service(entry);
if (service.isNull())
return;
diff --git a/src/bluetooth/qlowenergycontroller_android_p.h b/src/bluetooth/qlowenergycontroller_android_p.h
index e575d96e..3f97e363 100644
--- a/src/bluetooth/qlowenergycontroller_android_p.h
+++ b/src/bluetooth/qlowenergycontroller_android_p.h
@@ -92,12 +92,12 @@ extern void registerQLowEnergyControllerMetaType();
class QLeAdvertiser;
-class QLowEnergyControllerPrivateAndroid : public QLowEnergyControllerPrivate
+class QLowEnergyControllerPrivateAndroid final : public QLowEnergyControllerPrivate
{
Q_OBJECT
public:
QLowEnergyControllerPrivateAndroid();
- ~QLowEnergyControllerPrivateAndroid();
+ ~QLowEnergyControllerPrivateAndroid() override;
void init() override;
diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp
index d288f3ad..2b979244 100644
--- a/src/bluetooth/qlowenergycontroller_bluez.cpp
+++ b/src/bluetooth/qlowenergycontroller_bluez.cpp
@@ -40,7 +40,8 @@
#include "lecmaccalculator_p.h"
#include "qlowenergycontroller_bluez_p.h"
-#include "qbluetoothsocket_p.h"
+#include "qbluetoothsocketbase_p.h"
+#include "qbluetoothsocket_bluez_p.h"
#include "qleadvertiser_p.h"
#include "bluez/bluez_data_p.h"
#include "bluez/hcimanager_p.h"
@@ -271,13 +272,10 @@ template<> void putDataAndIncrement(const QByteArray &value, char *&dst)
QLowEnergyControllerPrivateBluez::QLowEnergyControllerPrivateBluez()
: QLowEnergyControllerPrivate(),
- l2cpSocket(0), requestPending(false),
+ requestPending(false),
mtuSize(ATT_DEFAULT_LE_MTU),
securityLevelValue(-1),
- encryptionChangePending(false),
- hciManager(0),
- advertiser(0),
- serverSocketNotifier(0)
+ encryptionChangePending(false)
{
registerQLowEnergyControllerMetaType();
qRegisterMetaType<QList<QLowEnergyHandle> >();
@@ -335,6 +333,7 @@ void QLowEnergyControllerPrivateBluez::init()
requestTimer->setInterval(gattRequestTimeout);
connect(requestTimer, &QTimer::timeout,
this, &QLowEnergyControllerPrivateBluez::handleGattRequestTimeout);
+ qRegisterMetaTypeStreamOperators<QBluetoothUuid>();
}
}
}
@@ -1215,7 +1214,7 @@ void QLowEnergyControllerPrivateBluez::processReply(
lastHandle = parseReadByTypeIncludeDiscovery(
&includedServices, &data[offset], elementLength);
p->includedServices = includedServices;
- foreach (const QBluetoothUuid &uuid, includedServices) {
+ for (const QBluetoothUuid &uuid : qAsConst(includedServices)) {
if (serviceList.contains(uuid))
serviceList[uuid]->type |= QLowEnergyService::IncludedService;
}
@@ -2495,7 +2494,7 @@ void QLowEnergyControllerPrivateBluez::handleReadMultipleRequest(const QByteArra
}
const QVector<Attribute> results = getAttributes(handles.first(), handles.last());
QByteArray response(1, ATT_OP_READ_MULTIPLE_RESPONSE);
- foreach (const Attribute &attr, results) {
+ for (const Attribute &attr : results) {
const int error = checkReadPermissions(attr);
if (error) {
sendErrorResponse(packet.at(0), attr.handle, error);
@@ -2577,7 +2576,7 @@ void QLowEnergyControllerPrivateBluez::updateLocalAttributeValue(
QLowEnergyDescriptor &descriptor)
{
localAttributes[handle].value = value;
- foreach (const auto &service, localServices) {
+ for (const auto &service : qAsConst(localServices)) {
if (handle < service->startHandle || handle > service->endHandle)
continue;
for (auto charIt = service->characteristicList.begin();
@@ -2623,7 +2622,7 @@ void QLowEnergyControllerPrivateBluez::writeCharacteristicForPeripheral(
= attribute.properties & QLowEnergyCharacteristic::Indicate;
if (!hasNotifyProperty && !hasIndicateProperty)
return;
- foreach (const QLowEnergyServicePrivate::DescData &desc, charData.descriptorList) {
+ for (const QLowEnergyServicePrivate::DescData &desc : qAsConst(charData.descriptorList)) {
if (desc.uuid != QBluetoothUuid::ClientCharacteristicConfiguration)
continue;
@@ -2925,7 +2924,7 @@ void QLowEnergyControllerPrivateBluez::handleExecuteWriteRequest(const QByteArra
QVector<QLowEnergyCharacteristic> characteristics;
QVector<QLowEnergyDescriptor> descriptors;
if (!cancel) {
- foreach (const WriteRequest &request, requests) {
+ for (const WriteRequest &request : qAsConst(requests)) {
Attribute &attribute = localAttributes[request.handle];
if (request.valueOffset > attribute.value.count()) {
sendErrorResponse(packet.at(0), request.handle, ATT_ERROR_INVALID_OFFSET);
@@ -2952,9 +2951,9 @@ void QLowEnergyControllerPrivateBluez::handleExecuteWriteRequest(const QByteArra
sendPacket(QByteArray(1, ATT_OP_EXECUTE_WRITE_RESPONSE));
- foreach (const QLowEnergyCharacteristic &characteristic, characteristics)
+ for (const QLowEnergyCharacteristic &characteristic : qAsConst(characteristics))
emit characteristic.d_ptr->characteristicChanged(characteristic, characteristic.value());
- foreach (const QLowEnergyDescriptor &descriptor, descriptors)
+ for (const QLowEnergyDescriptor &descriptor : qAsConst(descriptors))
emit descriptor.d_ptr->descriptorWritten(descriptor, descriptor.value());
}
@@ -3114,7 +3113,10 @@ void QLowEnergyControllerPrivateBluez::handleConnectionRequest()
qCWarning(QT_BT_BLUEZ) << "Received client connection, but no connection complete event";
closeServerSocket();
- l2cpSocket = new QBluetoothSocket(QBluetoothServiceInfo::L2capProtocol, this);
+
+ QBluetoothSocketPrivateBluez *rawSocketPrivate = new QBluetoothSocketPrivateBluez();
+ l2cpSocket = new QBluetoothSocket(
+ rawSocketPrivate, QBluetoothServiceInfo::L2capProtocol, this);
connect(l2cpSocket, &QBluetoothSocket::disconnected,
this, &QLowEnergyControllerPrivateBluez::l2cpDisconnected);
connect(l2cpSocket, static_cast<void (QBluetoothSocket::*)(QBluetoothSocket::SocketError)>
@@ -3153,7 +3155,7 @@ bool QLowEnergyControllerPrivateBluez::isBonded() const
QVector<QLowEnergyControllerPrivateBluez::TempClientConfigurationData> QLowEnergyControllerPrivateBluez::gatherClientConfigData()
{
QVector<TempClientConfigurationData> data;
- foreach (const auto &service, localServices) {
+ for (const auto &service : qAsConst(localServices)) {
for (auto charIt = service->characteristicList.begin();
charIt != service->characteristicList.end(); ++charIt) {
QLowEnergyServicePrivate::CharData &charData = charIt.value();
@@ -3179,7 +3181,7 @@ void QLowEnergyControllerPrivateBluez::storeClientConfigurations()
}
QVector<ClientConfigurationData> clientConfigs;
const QVector<TempClientConfigurationData> &tempConfigList = gatherClientConfigData();
- foreach (const auto &tempConfigData, tempConfigList) {
+ for (const auto &tempConfigData : tempConfigList) {
Q_ASSERT(tempConfigData.descData->value.count() == 2);
const quint16 value = bt_get_le16(tempConfigData.descData->value.constData());
if (value != 0) {
@@ -3196,9 +3198,9 @@ void QLowEnergyControllerPrivateBluez::restoreClientConfigurations()
const QVector<ClientConfigurationData> &restoredClientConfigs = isBonded()
? clientConfigData.value(remoteDevice.toUInt64()) : QVector<ClientConfigurationData>();
QVector<QLowEnergyHandle> notifications;
- foreach (const auto &tempConfigData, tempConfigList) {
+ for (const auto &tempConfigData : tempConfigList) {
bool wasRestored = false;
- foreach (const auto &restoredData, restoredClientConfigs) {
+ for (const auto &restoredData : restoredClientConfigs) {
if (restoredData.charValueHandle == tempConfigData.charValueHandle) {
Q_ASSERT(tempConfigData.descData->value.count() == 2);
putBtData(restoredData.configValue, tempConfigData.descData->value.data());
@@ -3219,7 +3221,7 @@ void QLowEnergyControllerPrivateBluez::restoreClientConfigurations()
localAttributes[tempConfigData.configHandle].value = tempConfigData.descData->value;
}
- foreach (const QLowEnergyHandle handle, notifications)
+ for (const QLowEnergyHandle handle : qAsConst(notifications))
sendNotification(handle);
sendNextIndication();
}
@@ -3318,7 +3320,8 @@ void QLowEnergyControllerPrivateBluez::addToGenericAttributeList(const QLowEnerg
serviceAttribute.properties = QLowEnergyCharacteristic::Read;
serviceAttribute.value = uuidToByteArray(service.uuid());
QLowEnergyHandle currentHandle = startHandle;
- foreach (const QLowEnergyService * const service, service.includedServices()) {
+ const QList<QLowEnergyService *> includedServices = service.includedServices();
+ for (const QLowEnergyService * const service : includedServices) {
Attribute attribute;
attribute.handle = ++currentHandle;
attribute.type = QBluetoothUuid(GATT_INCLUDED_SERVICE);
@@ -3332,7 +3335,8 @@ void QLowEnergyControllerPrivateBluez::addToGenericAttributeList(const QLowEnerg
putDataAndIncrement(service->serviceUuid(), valueData);
localAttributes[attribute.handle] = attribute;
}
- foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) {
+ const QList<QLowEnergyCharacteristicData> characteristics = service.characteristics();
+ for (const QLowEnergyCharacteristicData &cd : characteristics) {
Attribute attribute;
// Characteristic declaration;
@@ -3359,7 +3363,8 @@ void QLowEnergyControllerPrivateBluez::addToGenericAttributeList(const QLowEnerg
attribute.maxLength = cd.maximumValueLength();
localAttributes[attribute.handle] = attribute;
- foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) {
+ const QList<QLowEnergyDescriptorData> descriptors = cd.descriptors();
+ for (const QLowEnergyDescriptorData &dd : descriptors) {
attribute.handle = ++currentHandle;
attribute.groupEndHandle = attribute.handle;
attribute.type = dd.uuid();
diff --git a/src/bluetooth/qlowenergycontroller_bluez_p.h b/src/bluetooth/qlowenergycontroller_bluez_p.h
index 55a8a482..65517cba 100644
--- a/src/bluetooth/qlowenergycontroller_bluez_p.h
+++ b/src/bluetooth/qlowenergycontroller_bluez_p.h
@@ -76,12 +76,12 @@ extern void registerQLowEnergyControllerMetaType();
class QLeAdvertiser;
-class QLowEnergyControllerPrivateBluez : public QLowEnergyControllerPrivate
+class QLowEnergyControllerPrivateBluez final: public QLowEnergyControllerPrivate
{
Q_OBJECT
public:
QLowEnergyControllerPrivateBluez();
- ~QLowEnergyControllerPrivateBluez();
+ ~QLowEnergyControllerPrivateBluez() override;
void init() override;
@@ -134,7 +134,7 @@ public:
private:
quint16 connectionHandle = 0;
- QBluetoothSocket *l2cpSocket;
+ QBluetoothSocket *l2cpSocket = nullptr;
struct Request {
quint8 command;
QByteArray payload;
@@ -198,9 +198,9 @@ private:
bool encryptionChangePending;
bool receivedMtuExchangeRequest = false;
- HciManager *hciManager;
- QLeAdvertiser *advertiser;
- QSocketNotifier *serverSocketNotifier;
+ HciManager *hciManager = nullptr;
+ QLeAdvertiser *advertiser = nullptr;
+ QSocketNotifier *serverSocketNotifier = nullptr;
QTimer *requestTimer = nullptr;
RemoteDeviceManager* device1Manager = nullptr;
diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h
index 7ac1808f..0e0bfcb5 100644
--- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h
+++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h
@@ -69,12 +69,12 @@ QT_BEGIN_NAMESPACE
class QDBusPendingCallWatcher;
-class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivate
+class QLowEnergyControllerPrivateBluezDBus final : public QLowEnergyControllerPrivate
{
Q_OBJECT
public:
QLowEnergyControllerPrivateBluezDBus();
- ~QLowEnergyControllerPrivateBluezDBus();
+ ~QLowEnergyControllerPrivateBluezDBus() override;
void init() override;
void connectToDevice() override;
diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm
index 2958e6ed..d01686ae 100644
--- a/src/bluetooth/qlowenergycontroller_osx.mm
+++ b/src/bluetooth/qlowenergycontroller_osx.mm
@@ -880,7 +880,9 @@ quint16 QLowEnergyControllerPrivateOSX::updateValueOfDescriptor(QLowEnergyHandle
QSharedPointer<QLowEnergyServicePrivate> QLowEnergyControllerPrivateOSX::serviceForHandle(QLowEnergyHandle handle)
{
- foreach (QSharedPointer<QLowEnergyServicePrivate> service, discoveredServices.values()) {
+ const QList<QSharedPointer<QLowEnergyServicePrivate>> services
+ = discoveredServices.values();
+ for (QSharedPointer<QLowEnergyServicePrivate> service : services) {
if (service->startHandle <= handle && handle <= service->endHandle)
return service;
}
@@ -963,7 +965,9 @@ void QLowEnergyControllerPrivateOSX::setErrorDescription(QLowEnergyController::E
void QLowEnergyControllerPrivateOSX::invalidateServices()
{
- foreach (const QSharedPointer<QLowEnergyServicePrivate> service, discoveredServices.values()) {
+ const QList<QSharedPointer<QLowEnergyServicePrivate>> services
+ = discoveredServices.values();
+ for (const QSharedPointer<QLowEnergyServicePrivate> service : services) {
service->setController(nullptr);
service->setState(QLowEnergyService::InvalidService);
}
@@ -1368,6 +1372,7 @@ QLowEnergyService *QLowEnergyController::addService(const QLowEnergyServiceData
if (const auto servicePrivate = [osx_d_ptr->peripheralManager addService:data]) {
servicePrivate->setController(osx_d_ptr);
+ servicePrivate->state = QLowEnergyService::LocalService;
osx_d_ptr->discoveredServices.insert(servicePrivate->uuid, servicePrivate);
return new QLowEnergyService(servicePrivate, parent);
}
diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h
index 623c71a2..54a49b53 100644
--- a/src/bluetooth/qlowenergycontroller_p.h
+++ b/src/bluetooth/qlowenergycontroller_p.h
@@ -65,12 +65,12 @@ class QLowEnergyServiceData;
extern void registerQLowEnergyControllerMetaType();
-class QLowEnergyControllerPrivateCommon : public QLowEnergyControllerPrivate
+class QLowEnergyControllerPrivateCommon final : public QLowEnergyControllerPrivate
{
Q_OBJECT
public:
QLowEnergyControllerPrivateCommon();
- ~QLowEnergyControllerPrivateCommon();
+ ~QLowEnergyControllerPrivateCommon() override;
void init() override;
diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp
index a7ad662b..4beea12d 100644
--- a/src/bluetooth/qlowenergycontroller_winrt.cpp
+++ b/src/bluetooth/qlowenergycontroller_winrt.cpp
@@ -292,7 +292,7 @@ QLowEnergyControllerPrivateWinRT::~QLowEnergyControllerPrivateWinRT()
mDevice->remove_ConnectionStatusChanged(mStatusChangedToken);
qCDebug(QT_BT_WINRT) << "Unregistering " << mValueChangedTokens.count() << " value change tokens";
- for (const ValueChangedEntry &entry : mValueChangedTokens)
+ for (const ValueChangedEntry &entry : qAsConst(mValueChangedTokens))
entry.characteristic->remove_ValueChanged(entry.token);
}
@@ -473,7 +473,7 @@ void QLowEnergyControllerPrivateWinRT::registerForValueChanges(const QBluetoothU
{
qCDebug(QT_BT_WINRT) << "Registering characteristic" << charUuid << "in service"
<< serviceUuid << "for value changes";
- for (const ValueChangedEntry &entry : mValueChangedTokens) {
+ for (const ValueChangedEntry &entry : qAsConst(mValueChangedTokens)) {
GUID guuid;
HRESULT hr;
hr = entry.characteristic->get_Uuid(&guuid);
@@ -666,7 +666,7 @@ void QLowEnergyControllerPrivateWinRT::discoverServiceDetails(const QBluetoothUu
HRESULT hr;
hr = QEventDispatcherWinRT::runOnXamlThread([indicateChars, service, this]() {
- for (const QBluetoothUuid &indicateChar : indicateChars)
+ for (const QBluetoothUuid &indicateChar : qAsConst(indicateChars))
registerForValueChanges(service, indicateChar);
return S_OK;
});
@@ -941,7 +941,7 @@ void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer<
GattWriteOption option = writeWithResponse ? GattWriteOption_WriteWithResponse : GattWriteOption_WriteWithoutResponse;
hr = characteristic->WriteValueWithOptionAsync(buffer.Get(), option, &writeOp);
Q_ASSERT_SUCCEEDED(hr);
- auto writeCompletedLambda =[charData, charHandle, newValue, service, this]
+ auto writeCompletedLambda =[charData, charHandle, newValue, service, writeWithResponse, this]
(IAsyncOperation<GattCommunicationStatus> *op, AsyncStatus status)
{
if (status == AsyncStatus::Canceled || status == AsyncStatus::Error) {
@@ -967,7 +967,8 @@ void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer<
// empty.
if (charData.properties & QLowEnergyCharacteristic::Read)
updateValueOfCharacteristic(charHandle, newValue, false);
- emit service->characteristicWritten(QLowEnergyCharacteristic(service, charHandle), newValue);
+ if (writeWithResponse)
+ emit service->characteristicWritten(QLowEnergyCharacteristic(service, charHandle), newValue);
return S_OK;
};
hr = writeOp->put_Completed(Callback<IAsyncOperationCompletedHandler<GattCommunicationStatus>>(writeCompletedLambda).Get());
diff --git a/src/bluetooth/qlowenergycontroller_winrt_p.h b/src/bluetooth/qlowenergycontroller_winrt_p.h
index 7edc4702..783a71fa 100644
--- a/src/bluetooth/qlowenergycontroller_winrt_p.h
+++ b/src/bluetooth/qlowenergycontroller_winrt_p.h
@@ -73,12 +73,12 @@ class QWinRTLowEnergyServiceHandler;
extern void registerQLowEnergyControllerMetaType();
-class QLowEnergyControllerPrivateWinRT : public QLowEnergyControllerPrivate
+class QLowEnergyControllerPrivateWinRT final : public QLowEnergyControllerPrivate
{
Q_OBJECT
public:
QLowEnergyControllerPrivateWinRT();
- ~QLowEnergyControllerPrivateWinRT();
+ ~QLowEnergyControllerPrivateWinRT() override;
void init() override;
diff --git a/src/bluetooth/qlowenergycontrollerbase.cpp b/src/bluetooth/qlowenergycontrollerbase.cpp
index c7b9ec0b..86108648 100644
--- a/src/bluetooth/qlowenergycontrollerbase.cpp
+++ b/src/bluetooth/qlowenergycontrollerbase.cpp
@@ -70,7 +70,7 @@ bool QLowEnergyControllerPrivate::isValidLocalAdapter()
const QList<QBluetoothHostInfo> foundAdapters = QBluetoothLocalDevice::allDevices();
bool adapterFound = false;
- foreach (const QBluetoothHostInfo &info, foundAdapters) {
+ for (const QBluetoothHostInfo &info : foundAdapters) {
if (info.address() == localAdapter) {
adapterFound = true;
break;
@@ -255,10 +255,11 @@ quint16 QLowEnergyControllerPrivate::updateValueOfDescriptor(
void QLowEnergyControllerPrivate::invalidateServices()
{
- foreach (const QSharedPointer<QLowEnergyServicePrivate> service, serviceList.values()) {
- service->setController(0);
- service->setState(QLowEnergyService::InvalidService);
- }
+ for (QSharedPointer<QLowEnergyServicePrivate> service : serviceList.values())
+ service->setController(nullptr);
+
+ for (QSharedPointer<QLowEnergyServicePrivate> service : localServices.values())
+ service->setController(nullptr);
serviceList.clear();
localServices.clear();
@@ -273,12 +274,13 @@ QLowEnergyService *QLowEnergyControllerPrivate::addServiceHelper(
// for it.
const auto servicePrivate = QSharedPointer<QLowEnergyServicePrivate>::create();
- servicePrivate->state = QLowEnergyService::LocalService;
servicePrivate->setController(this);
+ servicePrivate->state = QLowEnergyService::LocalService;
servicePrivate->uuid = service.uuid();
servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary
? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService;
- foreach (QLowEnergyService * const includedService, service.includedServices()) {
+ const QList<QLowEnergyService *> includedServices = service.includedServices();
+ for (QLowEnergyService * const includedService : includedServices) {
servicePrivate->includedServices << includedService->serviceUuid();
includedService->d_ptr->type |= QLowEnergyService::IncludedService;
}
@@ -287,14 +289,16 @@ QLowEnergyService *QLowEnergyControllerPrivate::addServiceHelper(
const QLowEnergyHandle oldLastHandle = this->lastLocalHandle;
servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration.
this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations.
- foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) {
+ const QList<QLowEnergyCharacteristicData> characteristics = service.characteristics();
+ for (const QLowEnergyCharacteristicData &cd : characteristics) {
const QLowEnergyHandle declHandle = ++this->lastLocalHandle;
QLowEnergyServicePrivate::CharData charData;
charData.valueHandle = ++this->lastLocalHandle;
charData.uuid = cd.uuid();
charData.properties = cd.properties();
charData.value = cd.value();
- foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) {
+ const QList<QLowEnergyDescriptorData> descriptors = cd.descriptors();
+ for (const QLowEnergyDescriptorData &dd : descriptors) {
QLowEnergyServicePrivate::DescData descData;
descData.uuid = dd.uuid();
descData.value = dd.value();
diff --git a/src/bluetooth/qlowenergydescriptor.cpp b/src/bluetooth/qlowenergydescriptor.cpp
index 15859f17..6908a041 100644
--- a/src/bluetooth/qlowenergydescriptor.cpp
+++ b/src/bluetooth/qlowenergydescriptor.cpp
@@ -77,7 +77,7 @@ struct QLowEnergyDescriptorPrivate
of this class is always invalid.
*/
QLowEnergyDescriptor::QLowEnergyDescriptor():
- d_ptr(0), data(0)
+ d_ptr(nullptr)
{
}
@@ -88,7 +88,7 @@ QLowEnergyDescriptor::QLowEnergyDescriptor():
upon write.
*/
QLowEnergyDescriptor::QLowEnergyDescriptor(const QLowEnergyDescriptor &other):
- d_ptr(other.d_ptr), data(0)
+ d_ptr(other.d_ptr)
{
if (other.data) {
data = new QLowEnergyDescriptorPrivate();
@@ -131,7 +131,7 @@ QLowEnergyDescriptor &QLowEnergyDescriptor::operator=(const QLowEnergyDescriptor
if (!other.data) {
if (data) {
delete data;
- data = 0;
+ data = nullptr;
}
} else {
if (!data)
diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h
index fca1be76..9dd0cc20 100644
--- a/src/bluetooth/qlowenergydescriptor.h
+++ b/src/bluetooth/qlowenergydescriptor.h
@@ -85,7 +85,7 @@ protected:
friend class QLowEnergyControllerPrivateCommon;
friend class QLowEnergyControllerPrivateOSX;
friend class QLowEnergyControllerPrivateWinRT;
- QLowEnergyDescriptorPrivate *data;
+ QLowEnergyDescriptorPrivate *data = nullptr;
QLowEnergyDescriptor(QSharedPointer<QLowEnergyServicePrivate> p,
QLowEnergyHandle charHandle,
diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp
index 357d3901..1529d3c2 100644
--- a/src/bluetooth/qlowenergyservice.cpp
+++ b/src/bluetooth/qlowenergyservice.cpp
@@ -510,7 +510,7 @@ QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
QList<QLowEnergyHandle> handles = d_ptr->characteristicList.keys();
std::sort(handles.begin(), handles.end());
- foreach (const QLowEnergyHandle &handle, handles) {
+ for (const QLowEnergyHandle &handle : qAsConst(handles)) {
QLowEnergyCharacteristic characteristic(d_ptr, handle);
results.append(characteristic);
}
diff --git a/src/bluetooth/qlowenergyservice_osx.mm b/src/bluetooth/qlowenergyservice_osx.mm
index 4423887a..c294b693 100644
--- a/src/bluetooth/qlowenergyservice_osx.mm
+++ b/src/bluetooth/qlowenergyservice_osx.mm
@@ -129,7 +129,7 @@ QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
std::sort(handles.begin(), handles.end());
- foreach (const QLowEnergyHandle &handle, handles) {
+ for (const QLowEnergyHandle &handle : qAsConst(handles)) {
QLowEnergyCharacteristic characteristic(d_ptr, handle);
result.append(characteristic);
}
diff --git a/src/bluetooth/qlowenergyservicedata.cpp b/src/bluetooth/qlowenergyservicedata.cpp
index f40addd2..c536da14 100644
--- a/src/bluetooth/qlowenergyservicedata.cpp
+++ b/src/bluetooth/qlowenergyservicedata.cpp
@@ -170,7 +170,7 @@ QList<QLowEnergyCharacteristicData> QLowEnergyServiceData::characteristics() con
void QLowEnergyServiceData::setCharacteristics(const QList<QLowEnergyCharacteristicData> &characteristics)
{
d->characteristics.clear();
- foreach (const QLowEnergyCharacteristicData &cd, characteristics)
+ for (const QLowEnergyCharacteristicData &cd : characteristics)
addCharacteristic(cd);
}
diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h
index 7727b583..fb4163a0 100644
--- a/src/bluetooth/qlowenergyserviceprivate_p.h
+++ b/src/bluetooth/qlowenergyserviceprivate_p.h
@@ -69,7 +69,7 @@ class QLowEnergyServicePrivate : public QObject
{
Q_OBJECT
public:
- explicit QLowEnergyServicePrivate(QObject *parent = 0);
+ explicit QLowEnergyServicePrivate(QObject *parent = nullptr);
~QLowEnergyServicePrivate();
struct DescData {
diff --git a/src/imports/bluetooth/plugin.cpp b/src/imports/bluetooth/plugin.cpp
index 07654ca9..7c0712a1 100644
--- a/src/imports/bluetooth/plugin.cpp
+++ b/src/imports/bluetooth/plugin.cpp
@@ -45,13 +45,6 @@
#include "qdeclarativebluetoothservice_p.h"
#include "qdeclarativebluetoothsocket_p.h"
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtBluetooth);
-#endif
-}
-
QT_USE_NAMESPACE
class QBluetoothQmlPlugin : public QQmlExtensionPlugin
@@ -59,7 +52,7 @@ class QBluetoothQmlPlugin : public QQmlExtensionPlugin
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QBluetoothQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); }
+ QBluetoothQmlPlugin(QObject *parent = nullptr) : QQmlExtensionPlugin(parent) { }
void registerTypes(const char *uri)
{
// @uri QtBluetooth
diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp
index fc1accbd..6b2f32f3 100644
--- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp
+++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp
@@ -96,8 +96,7 @@ class QDeclarativeBluetoothDiscoveryModelPrivate
{
public:
QDeclarativeBluetoothDiscoveryModelPrivate()
- : m_serviceAgent(0),
- m_deviceAgent(0),
+ :
m_error(QDeclarativeBluetoothDiscoveryModel::NoError),
m_discoveryMode(QDeclarativeBluetoothDiscoveryModel::MinimalServiceDiscovery),
m_running(false),
@@ -119,8 +118,8 @@ public:
qDeleteAll(m_services);
}
- QBluetoothServiceDiscoveryAgent *m_serviceAgent;
- QBluetoothDeviceDiscoveryAgent *m_deviceAgent;
+ QBluetoothServiceDiscoveryAgent *m_serviceAgent = nullptr;
+ QBluetoothDeviceDiscoveryAgent *m_deviceAgent = nullptr;
QDeclarativeBluetoothDiscoveryModel::Error m_error;
QList<QDeclarativeBluetoothService *> m_services;
@@ -331,7 +330,7 @@ void QDeclarativeBluetoothDiscoveryModel::serviceDiscovered(const QBluetoothServ
//qDebug() << "service discovered";
QDeclarativeBluetoothService *bs = new QDeclarativeBluetoothService(service, this);
- QDeclarativeBluetoothService *current = 0;
+ QDeclarativeBluetoothService *current = nullptr;
for (int i = 0; i < d->m_services.count(); i++) {
current = d->m_services.at(i);
if (bs->deviceAddress() == current->deviceAddress()
diff --git a/src/imports/bluetooth/qdeclarativebluetoothservice.cpp b/src/imports/bluetooth/qdeclarativebluetoothservice.cpp
index 48c9da9a..3c176752 100644
--- a/src/imports/bluetooth/qdeclarativebluetoothservice.cpp
+++ b/src/imports/bluetooth/qdeclarativebluetoothservice.cpp
@@ -87,9 +87,7 @@ class QDeclarativeBluetoothServicePrivate
{
public:
QDeclarativeBluetoothServicePrivate()
- : m_componentComplete(false),
- m_service(0),
- m_server(0)
+ : m_componentComplete(false)
{
}
@@ -100,9 +98,9 @@ public:
}
bool m_componentComplete;
- QBluetoothServiceInfo *m_service;
+ QBluetoothServiceInfo *m_service = nullptr;
QDeclarativeBluetoothService::Protocol m_protocol;
- QBluetoothServer *m_server;
+ QBluetoothServer *m_server = nullptr;
};
QDeclarativeBluetoothService::QDeclarativeBluetoothService(QObject *parent) :
@@ -275,7 +273,7 @@ void QDeclarativeBluetoothService::setRegistered(bool registered)
}
delete d->m_server;
- d->m_server = 0;
+ d->m_server = nullptr;
if (!registered) {
d->m_service->unregisterService();
@@ -354,14 +352,14 @@ QDeclarativeBluetoothSocket *QDeclarativeBluetoothService::nextClient()
if (server) {
if (server->hasPendingConnections()) {
QBluetoothSocket *socket = server->nextPendingConnection();
- return new QDeclarativeBluetoothSocket(socket, this, 0);
+ return new QDeclarativeBluetoothSocket(socket, this, nullptr);
}
else {
qCWarning(QT_BT_QML) << "Socket has no pending connection, failing";
- return 0;
+ return nullptr;
}
}
- return 0;
+ return nullptr;
}
void QDeclarativeBluetoothService::assignNextClient(QDeclarativeBluetoothSocket *dbs)
diff --git a/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp b/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp
index 07de35bc..0deb82a5 100644
--- a/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp
+++ b/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp
@@ -79,7 +79,7 @@ class QDeclarativeBluetoothSocketPrivate
{
public:
QDeclarativeBluetoothSocketPrivate(QDeclarativeBluetoothSocket *bs)
- : m_dbs(bs), m_service(0), m_socket(0),
+ : m_dbs(bs),
m_error(QDeclarativeBluetoothSocket::NoError),
m_state(QDeclarativeBluetoothSocket::NoServiceSet),
m_componentCompleted(false),
@@ -125,8 +125,8 @@ public:
}
QDeclarativeBluetoothSocket *m_dbs;
- QDeclarativeBluetoothService *m_service;
- QBluetoothSocket *m_socket;
+ QDeclarativeBluetoothService *m_service = nullptr;
+ QBluetoothSocket *m_socket = nullptr;
QDeclarativeBluetoothSocket::Error m_error;
QDeclarativeBluetoothSocket::SocketState m_state;
bool m_componentCompleted;
@@ -269,7 +269,7 @@ void QDeclarativeBluetoothSocket::socket_connected()
void QDeclarativeBluetoothSocket::socket_disconnected()
{
d->m_socket->deleteLater();
- d->m_socket = 0;
+ d->m_socket = nullptr;
emit connectedChanged();
}
diff --git a/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h b/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h
index e5092d2c..2c17b4b1 100644
--- a/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h
+++ b/src/imports/bluetooth/qdeclarativebluetoothsocket_p.h
@@ -98,11 +98,11 @@ public:
};
Q_ENUM(SocketState)
- explicit QDeclarativeBluetoothSocket(QObject *parent = 0);
+ explicit QDeclarativeBluetoothSocket(QObject *parent = nullptr);
explicit QDeclarativeBluetoothSocket(QDeclarativeBluetoothService *service,
- QObject *parent = 0);
+ QObject *parent = nullptr);
explicit QDeclarativeBluetoothSocket(QBluetoothSocket *socket, QDeclarativeBluetoothService *service,
- QObject *paprent = 0);
+ QObject *paprent = nullptr);
~QDeclarativeBluetoothSocket();
QDeclarativeBluetoothService *service();
diff --git a/src/imports/nfc/plugin.cpp b/src/imports/nfc/plugin.cpp
index 749e03d7..3a6806fa 100644
--- a/src/imports/nfc/plugin.cpp
+++ b/src/imports/nfc/plugin.cpp
@@ -47,13 +47,6 @@
#include "qdeclarativendefurirecord_p.h"
#include "qdeclarativendefmimerecord_p.h"
-static void initResources()
-{
-#ifdef QT_STATIC
- Q_INIT_RESOURCE(qmake_QtNfc);
-#endif
-}
-
QT_USE_NAMESPACE
class QNfcQmlPlugin : public QQmlExtensionPlugin
@@ -62,7 +55,7 @@ class QNfcQmlPlugin : public QQmlExtensionPlugin
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
- QNfcQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); }
+ QNfcQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { }
void registerTypes(const char *uri)
{
Q_ASSERT(uri == QStringLiteral("QtNfc"));
diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp
index a9528462..c6c53ba4 100644
--- a/src/imports/nfc/qdeclarativenearfield.cpp
+++ b/src/imports/nfc/qdeclarativenearfield.cpp
@@ -211,7 +211,7 @@ void QDeclarativeNearField::registerMessageHandler()
QNdefFilter ndefFilter;
ndefFilter.setOrderMatch(m_orderMatch);
- foreach (const QDeclarativeNdefFilter *filter, m_filterList) {
+ for (const QDeclarativeNdefFilter *filter : qAsConst(m_filterList)) {
const QString type = filter->type();
uint min = filter->minimum() < 0 ? UINT_MAX : filter->minimum();
uint max = filter->maximum() < 0 ? UINT_MAX : filter->maximum();
@@ -236,7 +236,7 @@ void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message)
listRef.clear();
- foreach (const QNdefRecord &record, message)
+ for (const QNdefRecord &record : message)
listRef.append(qNewDeclarativeNdefRecordForNdefRecord(record));
m_messageUpdating = false;
diff --git a/src/nfc/android/androidjninfc.cpp b/src/nfc/android/androidjninfc.cpp
index f21d3b08..9a1c5227 100644
--- a/src/nfc/android/androidjninfc.cpp
+++ b/src/nfc/android/androidjninfc.cpp
@@ -63,6 +63,11 @@ bool isAvailable()
return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"isAvailable");
}
+bool isSupported()
+{
+ return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"isSupported");
+}
+
bool stopDiscovery()
{
return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"stop");
diff --git a/src/nfc/android/androidjninfc_p.h b/src/nfc/android/androidjninfc_p.h
index 746a93ee..60e9a107 100644
--- a/src/nfc/android/androidjninfc_p.h
+++ b/src/nfc/android/androidjninfc_p.h
@@ -71,6 +71,7 @@ bool startDiscovery();
bool stopDiscovery();
QAndroidJniObject getStartIntent();
bool isAvailable();
+bool isSupported();
bool registerListener(AndroidNfcListenerInterface *listener);
bool unregisterListener(AndroidNfcListenerInterface *listener);
QAndroidJniObject getTag(const QAndroidJniObject &intent);
diff --git a/src/nfc/android/androidmainnewintentlistener.cpp b/src/nfc/android/androidmainnewintentlistener.cpp
index 09738cb8..2076453d 100644
--- a/src/nfc/android/androidmainnewintentlistener.cpp
+++ b/src/nfc/android/androidmainnewintentlistener.cpp
@@ -61,7 +61,7 @@ MainNfcNewIntentListener::~MainNfcNewIntentListener()
bool MainNfcNewIntentListener::handleNewIntent(JNIEnv */*env*/, jobject intent)
{
listenersLock.lockForRead();
- foreach (AndroidNfc::AndroidNfcListenerInterface *listener, listeners) {
+ for (AndroidNfc::AndroidNfcListenerInterface *listener : qAsConst(listeners)) {
listener->newIntent(QAndroidJniObject(intent));
}
listenersLock.unlock();
diff --git a/src/nfc/doc/src/examples.qdoc b/src/nfc/doc/src/examples.qdoc
index 7fb3e758..1eb410e3 100644
--- a/src/nfc/doc/src/examples.qdoc
+++ b/src/nfc/doc/src/examples.qdoc
@@ -34,8 +34,6 @@
This is a variety of examples that cover the entire range of the Qt NFC API. You will find them
in their own documentation, but they are also accessible from here.
-\section2 C++ Tutorial
-
\section2 C++ Examples
\table 80%
\header
diff --git a/src/nfc/neard/neard_helper.cpp b/src/nfc/neard/neard_helper.cpp
index ef0447a0..90781a5b 100644
--- a/src/nfc/neard/neard_helper.cpp
+++ b/src/nfc/neard/neard_helper.cpp
@@ -62,10 +62,10 @@ NeardHelper::NeardHelper(QObject *parent) :
return;
}
- connect(m_dbusObjectManager, SIGNAL(InterfacesAdded(QDBusObjectPath,InterfaceList)),
- this, SLOT(interfacesAdded(QDBusObjectPath,InterfaceList)));
- connect(m_dbusObjectManager, SIGNAL(InterfacesRemoved(QDBusObjectPath,QStringList)),
- this, SLOT(interfacesRemoved(QDBusObjectPath,QStringList)));
+ connect(m_dbusObjectManager, &OrgFreedesktopDBusObjectManagerInterface::InterfacesAdded,
+ this, &NeardHelper::interfacesAdded);
+ connect(m_dbusObjectManager, &OrgFreedesktopDBusObjectManagerInterface::InterfacesRemoved,
+ this, &NeardHelper::interfacesRemoved);
}
NeardHelper *NeardHelper::instance()
@@ -80,7 +80,8 @@ OrgFreedesktopDBusObjectManagerInterface *NeardHelper::dbusObjectManager()
void NeardHelper::interfacesAdded(const QDBusObjectPath &path, InterfaceList interfaceList)
{
- foreach (const QString &key, interfaceList.keys()) {
+ const QList<QString> keys = interfaceList.keys();
+ for (const QString &key : keys) {
if (key == QStringLiteral("org.neard.Tag")) {
emit tagFound(path);
break;
diff --git a/src/nfc/nfc.pro b/src/nfc/nfc.pro
index ae65640a..ed88b79a 100644
--- a/src/nfc/nfc.pro
+++ b/src/nfc/nfc.pro
@@ -1,5 +1,6 @@
TARGET = QtNfc
QT = core
+DEFINES += QT_NO_FOREACH
QMAKE_DOCS = $$PWD/doc/qtnfc.qdocconf
OTHER_FILES += doc/src/*.qdoc # show .qdoc files in Qt Creator
diff --git a/src/nfc/qllcpsocket_android_p.cpp b/src/nfc/qllcpsocket_android_p.cpp
index e29634d4..97b8db16 100644
--- a/src/nfc/qllcpsocket_android_p.cpp
+++ b/src/nfc/qllcpsocket_android_p.cpp
@@ -71,7 +71,7 @@ void QLlcpSocketPrivate::connectToService(QNearFieldTarget *target, const QStrin
QNXNFCManager::instance()->registerLLCPConnection(m_conListener, this);
qQNXNFCDebug() << "Connecting client socket" << serviceUri << m_conListener;
- connect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));*/
+ connect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);*/
}
void QLlcpSocketPrivate::disconnectFromService()
@@ -83,7 +83,7 @@ void QLlcpSocketPrivate::disconnectFromService()
qWarning() << Q_FUNC_INFO << "Error when trying to close LLCP socket";
}
QNXNFCManager::instance()->unregisterLLCPConnection(m_conListener);
- disconnect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));
+ disconnect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);
q->disconnected();
m_conListener = 0;
@@ -96,7 +96,7 @@ bool QLlcpSocketPrivate::bind(quint8 port)
/*m_state = QLlcpSocket::ConnectedState;
m_server = true;
- connect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));
+ connect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);
connected(QNXNFCManager::instance()->getLastTarget());*/
return true;
@@ -208,7 +208,7 @@ qint64 QLlcpSocketPrivate::writeData(const char *data, qint64 len)
qint64 QLlcpSocketPrivate::bytesAvailable() const
{
/*qint64 available = 0;
- foreach (const QByteArray &datagram, m_receivedDatagrams)
+ for (const QByteArray &datagram : qAsConst(m_receivedDatagrams))
available += datagram.length();
return available;*/
@@ -217,7 +217,7 @@ qint64 QLlcpSocketPrivate::bytesAvailable() const
bool QLlcpSocketPrivate::canReadLine() const
{
- /*foreach (const QByteArray &datagram, m_receivedDatagrams) {
+ /*for (const QByteArray &datagram : qAsConst(m_receivedDatagrams)) {
if (datagram.contains('\n'))
return true;
}*/
diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp
index 099a070c..02e4d918 100644
--- a/src/nfc/qnearfieldmanager.cpp
+++ b/src/nfc/qnearfieldmanager.cpp
@@ -119,6 +119,19 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \enum QNearFieldManager::AdapterState
+
+ \since 5.12
+
+ This enum describes the different states a NFC adapter can have.
+
+ \value Offline The nfc adapter is offline.
+ \value TurningOn The nfc adapter is turning on.
+ \value Online The nfc adapter is online.
+ \value TurningOff The nfc adapter is turning off.
+*/
+
+/*!
\enum QNearFieldManager::TargetAccessMode
This enum describes the different access modes an application can have.
@@ -133,6 +146,16 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn void QNearFieldManager::adapterStateChanged(AdapterState state)
+
+ \since 5.12
+
+ This signal is emitted whenever the state of the NFC adapter changed.
+
+ \note Currently, this signal is only emitted on Android.
+*/
+
+/*!
\fn void QNearFieldManager::targetDetected(QNearFieldTarget *target)
This signal is emitted whenever a target is detected. The \a target parameter represents the
@@ -169,10 +192,14 @@ QT_BEGIN_NAMESPACE
QNearFieldManager::QNearFieldManager(QObject *parent)
: QObject(parent), d_ptr(new QNearFieldManagerPrivateImpl)
{
- connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)),
- this, SIGNAL(targetDetected(QNearFieldTarget*)));
- connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)),
- this, SIGNAL(targetLost(QNearFieldTarget*)));
+ qRegisterMetaType<AdapterState>();
+
+ connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged,
+ this, &QNearFieldManager::adapterStateChanged);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetDetected,
+ this, &QNearFieldManager::targetDetected);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetLost,
+ this, &QNearFieldManager::targetLost);
}
/*!
@@ -186,10 +213,14 @@ QNearFieldManager::QNearFieldManager(QObject *parent)
QNearFieldManager::QNearFieldManager(QNearFieldManagerPrivate *backend, QObject *parent)
: QObject(parent), d_ptr(backend)
{
- connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)),
- this, SIGNAL(targetDetected(QNearFieldTarget*)));
- connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)),
- this, SIGNAL(targetLost(QNearFieldTarget*)));
+ qRegisterMetaType<AdapterState>();
+
+ connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged,
+ this, &QNearFieldManager::adapterStateChanged);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetDetected,
+ this, &QNearFieldManager::targetDetected);
+ connect(d_ptr, &QNearFieldManagerPrivate::targetLost,
+ this, &QNearFieldManager::targetLost);
}
/*!
@@ -201,7 +232,10 @@ QNearFieldManager::~QNearFieldManager()
}
/*!
- Returns true if NFC functionality is available; otherwise returns false.
+ Returns \c true if the device has a NFC adapter and
+ it is turned on; otherwise returns \c false.
+
+ \sa isSupported()
*/
bool QNearFieldManager::isAvailable() const
{
@@ -211,6 +245,19 @@ bool QNearFieldManager::isAvailable() const
}
/*!
+ \since 5.12
+
+ Returns \c true if the underlying device has a NFC adapter; otherwise returns \c false.
+
+ \sa isAvailable()
+*/
+bool QNearFieldManager::isSupported() const
+{
+ Q_D(const QNearFieldManager);
+
+ return d->isSupported();
+}
+/*!
\fn bool QNearFieldManager::startTargetDetection()
Starts detecting targets and returns true if target detection is
diff --git a/src/nfc/qnearfieldmanager.h b/src/nfc/qnearfieldmanager.h
index 9583e01f..500b9631 100644
--- a/src/nfc/qnearfieldmanager.h
+++ b/src/nfc/qnearfieldmanager.h
@@ -56,6 +56,13 @@ class Q_NFC_EXPORT QNearFieldManager : public QObject
Q_DECLARE_PRIVATE(QNearFieldManager)
public:
+ enum class AdapterState {
+ Offline = 1,
+ TurningOn = 2,
+ Online = 3,
+ TurningOff = 4
+ };
+ Q_ENUM(AdapterState)
enum TargetAccessMode {
NoTargetAccess = 0x00,
NdefReadTargetAccess = 0x01,
@@ -70,6 +77,7 @@ public:
~QNearFieldManager();
bool isAvailable() const;
+ bool isSupported() const;
void setTargetAccessModes(TargetAccessModes accessModes);
TargetAccessModes targetAccessModes() const;
@@ -91,6 +99,7 @@ public:
bool unregisterNdefMessageHandler(int handlerId);
Q_SIGNALS:
+ void adapterStateChanged(AdapterState state);
void targetDetected(QNearFieldTarget *target);
void targetLost(QNearFieldTarget *target);
diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp
index a5693218..0b305501 100644
--- a/src/nfc/qnearfieldmanager_android.cpp
+++ b/src/nfc/qnearfieldmanager_android.cpp
@@ -48,22 +48,52 @@
#include "qdebug.h"
#include "qlist.h"
+#include <QScopedPointer>
#include <QtCore/QMetaType>
#include <QtCore/QMetaMethod>
+#include <QtCore/private/qjnihelpers_p.h>
QT_BEGIN_NAMESPACE
+Q_GLOBAL_STATIC(QAndroidJniObject, broadcastReceiver)
+Q_GLOBAL_STATIC(QList<QNearFieldManagerPrivateImpl *>, broadcastListener)
+
+extern "C"
+{
+ JNIEXPORT void JNICALL Java_org_qtproject_qt5_android_nfc_QtNfcBroadcastReceiver_jniOnReceive(
+ JNIEnv */*env*/, jobject /*javaObject*/, jint state)
+ {
+ QNearFieldManager::AdapterState adapterState = static_cast<QNearFieldManager::AdapterState>((int) state);
+
+ for (const auto listener : qAsConst(*broadcastListener)) {
+ Q_EMIT listener->adapterStateChanged(adapterState);
+ }
+ }
+}
+
QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() :
m_detecting(false), m_handlerID(0)
{
qRegisterMetaType<QAndroidJniObject>("QAndroidJniObject");
qRegisterMetaType<QNdefMessage>("QNdefMessage");
- connect(this, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(handlerTargetDetected(QNearFieldTarget*)));
- connect(this, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(handlerTargetLost(QNearFieldTarget*)));
+
+ if (!broadcastReceiver->isValid()) {
+ *broadcastReceiver = QAndroidJniObject("org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver",
+ "(Landroid/content/Context;)V", QtAndroidPrivate::context());
+ }
+ broadcastListener->append(this);
+
+ connect(this, &QNearFieldManagerPrivateImpl::targetDetected, this, &QNearFieldManagerPrivateImpl::handlerTargetDetected);
+ connect(this, &QNearFieldManagerPrivateImpl::targetLost, this, &QNearFieldManagerPrivateImpl::handlerTargetLost);
}
QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl()
{
+ broadcastListener->removeOne(this);
+ if (broadcastListener->isEmpty()) {
+ broadcastReceiver->callMethod<void>("unregisterReceiver");
+ *broadcastReceiver = QAndroidJniObject();
+ }
}
void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *target)
@@ -71,12 +101,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *targe
if (ndefMessageHandlers.count() == 0 && ndefFilterHandlers.count() == 0) // if no handler is registered
return;
if (target->hasNdefMessage()) {
- connect(target, SIGNAL(ndefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerNdefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)));
- connect(target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerRequestCompleted(const QNearFieldTarget::RequestId &)));
- connect(target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerError(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)));
+ connect(reinterpret_cast<NearFieldTarget *>(target), &NearFieldTarget::ndefMessageRead,
+ this, &QNearFieldManagerPrivateImpl::handlerNdefMessageRead);
+ connect(target, &QNearFieldTarget::requestCompleted,
+ this, &QNearFieldManagerPrivateImpl::handlerRequestCompleted);
+ connect(target, &QNearFieldTarget::error,
+ this, &QNearFieldManagerPrivateImpl::handlerError);
QNearFieldTarget::RequestId id = target->readNdefMessages();
m_idToTarget.insert(id, target);
@@ -85,12 +115,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *targe
void QNearFieldManagerPrivateImpl::handlerTargetLost(QNearFieldTarget *target)
{
- disconnect(target, SIGNAL(ndefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerNdefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)));
- disconnect(target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerRequestCompleted(const QNearFieldTarget::RequestId &)));
- disconnect(target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)),
- this, SLOT(handlerError(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)));
+ disconnect(reinterpret_cast<NearFieldTarget *>(target), &NearFieldTarget::ndefMessageRead,
+ this, &QNearFieldManagerPrivateImpl::handlerNdefMessageRead);
+ disconnect(target, &QNearFieldTarget::requestCompleted,
+ this, &QNearFieldManagerPrivateImpl::handlerRequestCompleted);
+ disconnect(target, &QNearFieldTarget::error,
+ this, &QNearFieldManagerPrivateImpl::handlerError);
m_idToTarget.remove(m_idToTarget.key(target));
}
@@ -123,7 +153,7 @@ void QNearFieldManagerPrivateImpl::handlerNdefMessageRead(const QNdefMessage &me
filterRecords.append(vr);
}
- foreach (const QNdefRecord &record, message) {
+ for (const QNdefRecord &record : message) {
for (int j = 0; matched && (j < filterRecords.count()); ++j) {
VerifyRecord &vr = filterRecords[j];
@@ -176,6 +206,11 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const
return AndroidNfc::isAvailable();
}
+bool QNearFieldManagerPrivateImpl::isSupported() const
+{
+ return AndroidNfc::isSupported();
+}
+
bool QNearFieldManagerPrivateImpl::startTargetDetection()
{
if (m_detecting)
@@ -282,8 +317,8 @@ void QNearFieldManagerPrivateImpl::onTargetDiscovered(QAndroidJniObject intent)
target->setIntent(intent); // Updating existing target
} else {
target = new NearFieldTarget(intent, uid, this);
- connect(target, SIGNAL(targetDestroyed(QByteArray)), this, SLOT(onTargetDestroyed(QByteArray)));
- connect(target, SIGNAL(targetLost(QNearFieldTarget*)), this, SIGNAL(targetLost(QNearFieldTarget*)));
+ connect(target, &NearFieldTarget::targetDestroyed, this, &QNearFieldManagerPrivateImpl::onTargetDestroyed);
+ connect(target, &NearFieldTarget::targetLost, this, &QNearFieldManagerPrivateImpl::targetLost);
}
emit targetDetected(target);
}
diff --git a/src/nfc/qnearfieldmanager_android_p.h b/src/nfc/qnearfieldmanager_android_p.h
index 69c99709..7bf444d9 100644
--- a/src/nfc/qnearfieldmanager_android_p.h
+++ b/src/nfc/qnearfieldmanager_android_p.h
@@ -73,17 +73,18 @@ class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivate, public And
public:
QNearFieldManagerPrivateImpl();
- ~QNearFieldManagerPrivateImpl();
+ ~QNearFieldManagerPrivateImpl() override;
- virtual bool isAvailable() const;
- virtual bool startTargetDetection();
- virtual void stopTargetDetection();
- virtual int registerNdefMessageHandler(QObject *object, const QMetaMethod &method);
- virtual int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method);
- virtual bool unregisterNdefMessageHandler(int handlerId);
- virtual void requestAccess(QNearFieldManager::TargetAccessModes accessModes);
- virtual void releaseAccess(QNearFieldManager::TargetAccessModes accessModes);
- virtual void newIntent(QAndroidJniObject intent);
+ bool isAvailable() const override;
+ bool isSupported() const override;
+ bool startTargetDetection() override;
+ void stopTargetDetection() override;
+ int registerNdefMessageHandler(QObject *object, const QMetaMethod &method) override;
+ int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method) override;
+ bool unregisterNdefMessageHandler(int handlerId) override;
+ void requestAccess(QNearFieldManager::TargetAccessModes accessModes) override;
+ void releaseAccess(QNearFieldManager::TargetAccessModes accessModes) override;
+ void newIntent(QAndroidJniObject intent);
QByteArray getUid(const QAndroidJniObject &intent);
public slots:
diff --git a/src/nfc/qnearfieldmanager_emulator.cpp b/src/nfc/qnearfieldmanager_emulator.cpp
index 3186bae5..c2c037f6 100644
--- a/src/nfc/qnearfieldmanager_emulator.cpp
+++ b/src/nfc/qnearfieldmanager_emulator.cpp
@@ -53,8 +53,8 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
tagActivator->initialize();
- connect(tagActivator, SIGNAL(tagActivated(TagBase*)), this, SLOT(tagActivated(TagBase*)));
- connect(tagActivator, SIGNAL(tagDeactivated(TagBase*)), this, SLOT(tagDeactivated(TagBase*)));
+ connect(tagActivator, &TagActivator::tagActivated, this, &QNearFieldManagerPrivateImpl::tagActivated);
+ connect(tagActivator, &TagActivator::tagDeactivated, this, &QNearFieldManagerPrivateImpl::tagDeactivated);
}
QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl()
diff --git a/src/nfc/qnearfieldmanager_emulator_p.h b/src/nfc/qnearfieldmanager_emulator_p.h
index 1b660a23..0416388a 100644
--- a/src/nfc/qnearfieldmanager_emulator_p.h
+++ b/src/nfc/qnearfieldmanager_emulator_p.h
@@ -67,9 +67,9 @@ class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivateVirtualBase
public:
QNearFieldManagerPrivateImpl();
- ~QNearFieldManagerPrivateImpl();
+ ~QNearFieldManagerPrivateImpl() override;
- bool isAvailable() const;
+ bool isAvailable() const override;
void reset();
diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp
index f1758ae9..4df1e0ef 100644
--- a/src/nfc/qnearfieldmanager_neard.cpp
+++ b/src/nfc/qnearfieldmanager_neard.cpp
@@ -62,9 +62,11 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
}
bool found = false;
- foreach (const QDBusObjectPath &path, reply.value().keys()) {
+ const QList<QDBusObjectPath> paths = reply.value().keys();
+ for (const QDBusObjectPath &path : paths) {
const InterfaceList ifaceList = reply.value().value(path);
- foreach (const QString &iface, ifaceList.keys()) {
+ const QStringList ifaces = ifaceList.keys();
+ for (const QString &iface : ifaces) {
if (iface == QStringLiteral("org.neard.Adapter")) {
found = true;
m_adapterPath = path.path();
@@ -80,10 +82,10 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
if (!found) {
qCWarning(QT_NFC_NEARD) << "no adapter found, neard daemon running?";
} else {
- connect(m_neardHelper, SIGNAL(tagFound(QDBusObjectPath)),
- this, SLOT(handleTagFound(QDBusObjectPath)));
- connect(m_neardHelper, SIGNAL(tagRemoved(QDBusObjectPath)),
- this, SLOT(handleTagRemoved(QDBusObjectPath)));
+ connect(m_neardHelper, &NeardHelper::tagFound,
+ this, &QNearFieldManagerPrivateImpl::handleTagFound);
+ connect(m_neardHelper, &NeardHelper::tagRemoved,
+ this, &QNearFieldManagerPrivateImpl::handleTagRemoved);
}
}
@@ -106,7 +108,8 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const
return false;
}
- foreach (const QDBusObjectPath &path, reply.value().keys()) {
+ const QList<QDBusObjectPath> paths = reply.value().keys();
+ for (const QDBusObjectPath &path : paths) {
if (m_adapterPath == path.path())
return true;
}
@@ -114,6 +117,21 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const
return false;
}
+bool QNearFieldManagerPrivateImpl::isSupported() const
+{
+ if (m_adapterPath.isEmpty()) {
+ qCWarning(QT_NFC_NEARD) << "no adapter found, neard daemon running?";
+ return false;
+ }
+
+ if (!m_neardHelper->dbusObjectManager()->isValid() || m_adapterPath.isNull()) {
+ qCWarning(QT_NFC_NEARD) << "dbus object manager invalid or adapter path invalid";
+ return false;
+ }
+
+ return true;
+}
+
bool QNearFieldManagerPrivateImpl::startTargetDetection()
{
qCDebug(QT_NFC_NEARD) << "starting target detection";
diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h
index b50f947a..88c45c1c 100644
--- a/src/nfc/qnearfieldmanager_neard_p.h
+++ b/src/nfc/qnearfieldmanager_neard_p.h
@@ -71,24 +71,27 @@ class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivate
public:
QNearFieldManagerPrivateImpl();
- ~QNearFieldManagerPrivateImpl();
+ ~QNearFieldManagerPrivateImpl() override;
- bool isAvailable() const;
+ bool isAvailable() const override;
- bool startTargetDetection();
+ bool isSupported() const override;
- void stopTargetDetection();
+ bool startTargetDetection() override;
+
+ void stopTargetDetection() override;
// not implemented
- int registerNdefMessageHandler(QObject *object, const QMetaMethod &method);
+ int registerNdefMessageHandler(QObject *object, const QMetaMethod &method) override;
- int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object, const QMetaMethod &method);
+ int registerNdefMessageHandler(const QNdefFilter &filter, QObject *object,
+ const QMetaMethod &method) override;
- bool unregisterNdefMessageHandler(int handlerId);
+ bool unregisterNdefMessageHandler(int handlerId) override;
- void requestAccess(QNearFieldManager::TargetAccessModes accessModes);
+ void requestAccess(QNearFieldManager::TargetAccessModes accessModes) override;
- void releaseAccess(QNearFieldManager::TargetAccessModes accessModes);
+ void releaseAccess(QNearFieldManager::TargetAccessModes accessModes) override;
private Q_SLOTS:
void handleTagFound(const QDBusObjectPath&);
diff --git a/src/nfc/qnearfieldmanager_p.h b/src/nfc/qnearfieldmanager_p.h
index 7e461da8..351c844a 100644
--- a/src/nfc/qnearfieldmanager_p.h
+++ b/src/nfc/qnearfieldmanager_p.h
@@ -82,6 +82,11 @@ public:
return false;
}
+ virtual bool isSupported() const
+ {
+ return false;
+ }
+
virtual bool startTargetDetection()
{
return false;
@@ -124,6 +129,7 @@ public:
}
signals:
+ void adapterStateChanged(QNearFieldManager::AdapterState state);
void targetDetected(QNearFieldTarget *target);
void targetLost(QNearFieldTarget *target);
diff --git a/src/nfc/qnearfieldmanagervirtualbase.cpp b/src/nfc/qnearfieldmanagervirtualbase.cpp
index 3fd97508..82e272ce 100644
--- a/src/nfc/qnearfieldmanagervirtualbase.cpp
+++ b/src/nfc/qnearfieldmanagervirtualbase.cpp
@@ -173,7 +173,7 @@ void QNearFieldManagerPrivateVirtualBase::ndefReceived(const QNdefMessage &messa
filterRecords.append(vr);
}
- foreach (const QNdefRecord &record, message) {
+ for (const QNdefRecord &record : message) {
for (int j = 0; matched && (j < filterRecords.count()); ++j) {
VerifyRecord &vr = filterRecords[j];
diff --git a/src/nfc/qnearfieldmanagervirtualbase_p.h b/src/nfc/qnearfieldmanagervirtualbase_p.h
index 3d8cf2ef..164edaf5 100644
--- a/src/nfc/qnearfieldmanagervirtualbase_p.h
+++ b/src/nfc/qnearfieldmanagervirtualbase_p.h
@@ -63,16 +63,16 @@ class QNearFieldManagerPrivateVirtualBase : public QNearFieldManagerPrivate
public:
QNearFieldManagerPrivateVirtualBase();
- ~QNearFieldManagerPrivateVirtualBase();
+ ~QNearFieldManagerPrivateVirtualBase() override;
- bool startTargetDetection();
- void stopTargetDetection();
+ bool startTargetDetection() override;
+ void stopTargetDetection() override;
- int registerNdefMessageHandler(QObject *object, const QMetaMethod &method);
+ int registerNdefMessageHandler(QObject *object, const QMetaMethod &method) override;
int registerNdefMessageHandler(const QNdefFilter &filter,
- QObject *object, const QMetaMethod &method);
+ QObject *object, const QMetaMethod &method) override;
- bool unregisterNdefMessageHandler(int id);
+ bool unregisterNdefMessageHandler(int id) override;
protected:
struct Callback {
diff --git a/src/nfc/qnearfieldtagtype1.cpp b/src/nfc/qnearfieldtagtype1.cpp
index 34f2c8b8..b3479203 100644
--- a/src/nfc/qnearfieldtagtype1.cpp
+++ b/src/nfc/qnearfieldtagtype1.cpp
@@ -279,11 +279,11 @@ void QNearFieldTagType1Private::progressToNextNdefWriteMessageState()
m_tlvWriter = new QTlvWriter(q);
// write old TLVs
- foreach (const Tlv &tlv, m_tlvs)
+ for (const Tlv &tlv : qAsConst(m_tlvs))
m_tlvWriter->writeTlv(tlv.first, tlv.second);
// write new NDEF message TLVs
- foreach (const QNdefMessage &message, m_ndefWriteMessages)
+ for (const QNdefMessage &message : qAsConst(m_ndefWriteMessages))
m_tlvWriter->writeTlv(0x03, message.toByteArray());
// write terminator TLV
@@ -440,9 +440,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::readNdefMessages()
if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage) {
d->progressToNextNdefReadMessageState();
} else {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, NdefReadError),
- Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId));
+ reportError(QNearFieldTarget::NdefReadError, d->m_readNdefRequestId);
}
return d->m_readNdefRequestId;
@@ -462,9 +460,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::writeNdefMessages(const QList<QN
d->m_ndefWriteMessages = messages;
d->progressToNextNdefWriteMessageState();
} else {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, NdefWriteError),
- Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId));
+ reportError(QNearFieldTarget::NdefWriteError, d->m_readNdefRequestId);
}
return d->m_writeNdefRequestId;
diff --git a/src/nfc/qnearfieldtarget.cpp b/src/nfc/qnearfieldtarget.cpp
index e642824b..e9a6fa11 100644
--- a/src/nfc/qnearfieldtarget.cpp
+++ b/src/nfc/qnearfieldtarget.cpp
@@ -530,4 +530,17 @@ bool QNearFieldTarget::handleResponse(const QNearFieldTarget::RequestId &id,
return true;
}
+/*!
+ \since 5.12
+
+ Reports the \a error for the request \a id by appending the signal emission to the event queue.
+*/
+void QNearFieldTarget::reportError(QNearFieldTarget::Error error,
+ const QNearFieldTarget::RequestId &id)
+{
+ QMetaObject::invokeMethod(this, [this, error, id]() {
+ Q_EMIT this->error(error, id);
+ }, Qt::QueuedConnection);
+}
+
QT_END_NAMESPACE
diff --git a/src/nfc/qnearfieldtarget.h b/src/nfc/qnearfieldtarget.h
index e51960f7..868b52d5 100644
--- a/src/nfc/qnearfieldtarget.h
+++ b/src/nfc/qnearfieldtarget.h
@@ -153,6 +153,8 @@ protected:
Q_INVOKABLE virtual bool handleResponse(const QNearFieldTarget::RequestId &id,
const QByteArray &response);
+ void reportError(QNearFieldTarget::Error error, const QNearFieldTarget::RequestId &id);
+
Q_SIGNALS:
void disconnected();
diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp
index e656996e..78da6ac2 100644
--- a/src/nfc/qnearfieldtarget_android.cpp
+++ b/src/nfc/qnearfieldtarget_android.cpp
@@ -147,25 +147,19 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages()
// Making sure that target is still in range
QNearFieldTarget::RequestId requestId(new QNearFieldTarget::RequestIdPrivate);
if (!m_intent.isValid()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
// Getting Ndef technology object
if (!setTagTechnology({NDEFTECHNOLOGY})) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnsupportedError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::UnsupportedError, requestId);
return requestId;
}
// Connect
if (!connect()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
@@ -174,9 +168,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages()
if (catchJavaExceptions())
ndefMessage = QAndroidJniObject();
if (!ndefMessage.isValid()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefReadError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::NdefReadError, requestId);
return requestId;
}
@@ -249,9 +241,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma
// Connecting
QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate());
if (!connect()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
@@ -263,9 +253,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma
// Writing
QAndroidJniObject myNewVal = m_tagTech.callObjectMethod("transceive", "([B)[B", jba);
if (catchJavaExceptions()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::CommandError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::CommandError, requestId);
return requestId;
}
QByteArray result = jbyteArrayToQByteArray(myNewVal.object<jbyteArray>());
@@ -315,9 +303,7 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList<QNdef
// Connecting
QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate());
if (!connect()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
return requestId;
}
@@ -328,18 +314,14 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList<QNdef
env->SetByteArrayRegion(jba.object<jbyteArray>(), 0, ba.size(), reinterpret_cast<jbyte*>(ba.data()));
QAndroidJniObject jmessage = QAndroidJniObject("android/nfc/NdefMessage", "([B)V", jba.object<jbyteArray>());
if (catchJavaExceptions()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::UnknownError, requestId);
return requestId;
}
// Writing
m_tagTech.callMethod<void>(writeMethod, "(Landroid/nfc/NdefMessage;)V", jmessage.object<jobject>());
if (catchJavaExceptions()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefWriteError),
- Q_ARG(QNearFieldTarget::RequestId&, requestId));
+ reportError(QNearFieldTarget::NdefWriteError, requestId);
return requestId;
}
diff --git a/src/nfc/qnearfieldtarget_emulator.cpp b/src/nfc/qnearfieldtarget_emulator.cpp
index 29b1f74d..030718cc 100644
--- a/src/nfc/qnearfieldtarget_emulator.cpp
+++ b/src/nfc/qnearfieldtarget_emulator.cpp
@@ -82,9 +82,7 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command)
// tag not in proximity
if (!tagMap.value(m_tag)) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, id);
return id;
}
@@ -93,17 +91,13 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command)
QByteArray response = m_tag->processCommand(command + char(crc & 0xff) + char(crc >> 8));
if (response.isEmpty()) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, NoResponseError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::NoResponseError, id);
return id;
}
// check crc
if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::ChecksumMismatchError, id);
return id;
}
@@ -152,9 +146,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command)
// tag not in proximity
if (!tagMap.value(m_tag)) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::TargetOutOfRangeError, id);
return id;
}
@@ -168,9 +160,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command)
if (response.length() > 1) {
// check crc
if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError),
- Q_ARG(QNearFieldTarget::RequestId, id));
+ reportError(QNearFieldTarget::ChecksumMismatchError, id);
return id;
}
diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h
index 053df141..9844d99e 100644
--- a/src/nfc/qnearfieldtarget_neard_p.h
+++ b/src/nfc/qnearfieldtarget_neard_p.h
@@ -348,7 +348,7 @@ private:
if (m_readRequested) {
qCDebug(QT_NFC_NEARD) << "creating Ndef message, reading" << m_recordPaths.length() << "record paths";
QNdefMessage newNdefMessage;
- foreach (const QDBusObjectPath &recordPath, m_recordPaths)
+ for (const QDBusObjectPath &recordPath : qAsConst(m_recordPaths))
newNdefMessage.append(readRecord(recordPath));
if (!newNdefMessage.isEmpty()) {
@@ -359,9 +359,7 @@ private:
Q_EMIT this->requestCompleted(this->m_currentReadRequestId);
}, Qt::QueuedConnection);
} else {
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
- Q_ARG(QNearFieldTarget::RequestId, m_currentReadRequestId));
+ this->reportError(QNearFieldTarget::UnknownError, m_currentReadRequestId);
}
m_readRequested = false;
@@ -389,9 +387,7 @@ private:
reply.waitForFinished();
if (reply.isError()) {
qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error();
- QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
- Q_ARG(QNearFieldTarget::RequestId, m_currentWriteRequestId));
+ this->reportError(QNearFieldTarget::UnknownError, m_currentWriteRequestId);
}
QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection);
diff --git a/src/nfc/qtlv.cpp b/src/nfc/qtlv.cpp
index 7aa87ac0..3168854c 100644
--- a/src/nfc/qtlv.cpp
+++ b/src/nfc/qtlv.cpp
@@ -284,7 +284,8 @@ bool QTlvReader::readMoreData(int sparseOffset)
int QTlvReader::absoluteOffset(int sparseOffset) const
{
int absoluteOffset = sparseOffset;
- foreach (int offset, m_reservedMemory.keys()) {
+ const QList<int> offsets = m_reservedMemory.keys();
+ for (const int offset : offsets) {
if (offset <= absoluteOffset)
absoluteOffset += m_reservedMemory.value(offset);
}
@@ -298,7 +299,8 @@ int QTlvReader::absoluteOffset(int sparseOffset) const
*/
int QTlvReader::dataLength(int startOffset) const
{
- foreach (int offset, m_reservedMemory.keys()) {
+ const QList<int> offsets = m_reservedMemory.keys();
+ for (const int offset : offsets) {
if (offset <= startOffset)
continue;
diff --git a/src/tools/sdpscanner/main.cpp b/src/tools/sdpscanner/main.cpp
index edca8fa3..7e09ca6e 100644
--- a/src/tools/sdpscanner/main.cpp
+++ b/src/tools/sdpscanner/main.cpp
@@ -365,21 +365,21 @@ int main(int argc, char **argv)
uint32_t attributeRange = 0x0000ffff; //all attributes
sdp_list_t *attributes;
- attributes = sdp_list_append(0, &attributeRange);
+ attributes = sdp_list_append(nullptr, &attributeRange);
sdp_list_t *sdpResults, *sdpIter;
- sdp_list_t *totalResults = NULL;
+ sdp_list_t *totalResults = nullptr;
sdp_list_t* serviceFilter;
for (uint i = 0; i < uuids.size(); ++i) {
- serviceFilter = sdp_list_append(0, &uuids[i]);
+ serviceFilter = sdp_list_append(nullptr, &uuids[i]);
result = sdp_service_search_attr_req(session, serviceFilter,
SDP_ATTR_REQ_RANGE,
attributes, &sdpResults);
- sdp_list_free(serviceFilter, 0);
+ sdp_list_free(serviceFilter, nullptr);
if (result != 0) {
fprintf(stderr, "sdp_service_search_attr_req failed\n");
- sdp_list_free(attributes, 0);
+ sdp_list_free(attributes, nullptr);
sdp_close(session);
return RETURN_SDP_ERROR;
}
@@ -398,7 +398,7 @@ int main(int argc, char **argv)
while (sdpIter->next) // skip to end of list
sdpIter = sdpIter->next;
}
- sdp_list_free(attributes, 0);
+ sdp_list_free(attributes, nullptr);
// start XML generation from the front
sdpResults = totalResults;
diff --git a/sync.profile b/sync.profile
index 5d103a33..3261c183 100644
--- a/sync.profile
+++ b/sync.profile
@@ -21,7 +21,7 @@
"obex_client_p.h", "obex_manager_p.h", "obex_objectpush1_bluez5_p.h",
"obex_transfer1_bluez5_p.h", "obex_transfer_p.h", "objectmanager_p.h",
"profile1_p.h", "properties_p.h", "service_p.h", "gattchar1_p.h",
- "gattdesc1_p.h", "gattservice1_p.h",
+ "gattdesc1_p.h", "gattservice1_p.h", "profilemanager1_p.h",
# NFC auto-generated headers
# Note: "adapter_p.h", "agent_p.h" and "manager_p.h" are duplicated here
"dbusobjectmanager_p.h", "dbusproperties_p.h", "tag_p.h");
diff --git a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp
index 7ef78800..25764703 100644
--- a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp
+++ b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp
@@ -91,7 +91,6 @@ tst_QBluetoothServiceDiscoveryAgent::tst_QBluetoothServiceDiscoveryAgent()
#endif
qRegisterMetaType<QBluetoothDeviceInfo>();
- qRegisterMetaType<QBluetoothServiceInfo>();
qRegisterMetaType<QList<QBluetoothUuid> >();
qRegisterMetaType<QBluetoothServiceDiscoveryAgent::Error>();
qRegisterMetaType<QBluetoothDeviceDiscoveryAgent::Error>();
@@ -186,12 +185,12 @@ static void dumpAttributeVariant(const QVariant &var, const QString indent)
if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Sequence>()) {
qDebug("%sSequence", indent.toLocal8Bit().constData());
const QBluetoothServiceInfo::Sequence *sequence = static_cast<const QBluetoothServiceInfo::Sequence *>(var.data());
- foreach (const QVariant &v, *sequence)
+ for (const QVariant &v : *sequence)
dumpAttributeVariant(v, indent + '\t');
} else if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Alternative>()) {
qDebug("%sAlternative", indent.toLocal8Bit().constData());
const QBluetoothServiceInfo::Alternative *alternative = static_cast<const QBluetoothServiceInfo::Alternative *>(var.data());
- foreach (const QVariant &v, *alternative)
+ for (const QVariant &v : *alternative)
dumpAttributeVariant(v, indent + '\t');
} else if (var.userType() == qMetaTypeId<QBluetoothUuid>()) {
QBluetoothUuid uuid = var.value<QBluetoothUuid>();
@@ -237,7 +236,8 @@ static void dumpAttributeVariant(const QVariant &var, const QString indent)
static inline void dumpServiceInfoAttributes(const QBluetoothServiceInfo &info)
{
- foreach (quint16 id, info.attributes()) {
+ const QList<quint16> attributes = info.attributes();
+ for (quint16 id : attributes) {
dumpAttributeVariant(info.attribute(id), QString("\t"));
}
}
@@ -254,7 +254,7 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery_data()
// Only need to test the first 5 live devices
int max = 5;
- foreach (const QBluetoothDeviceInfo &info, devices) {
+ for (const QBluetoothDeviceInfo &info : qAsConst(devices)) {
if (info.isCached())
continue;
QTest::newRow("default filter") << info << QList<QBluetoothUuid>()
diff --git a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp
index eb7ce85a..ae8cf5d0 100644
--- a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp
+++ b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp
@@ -132,7 +132,7 @@ void tst_QBluetoothServiceInfo::tst_construction()
QCOMPARE(serviceInfo.serverChannel(), -1);
QCOMPARE(serviceInfo.protocolServiceMultiplexer(), -1);
- foreach (QBluetoothUuid::ProtocolUuid u, protUuids)
+ for (QBluetoothUuid::ProtocolUuid u : qAsConst(protUuids))
QCOMPARE(serviceInfo.protocolDescriptor(u).count(), 0);
}
@@ -166,9 +166,9 @@ void tst_QBluetoothServiceInfo::tst_construction()
QCOMPARE(copyInfo.device().address(), alternatedeviceInfo.address());
QCOMPARE(serviceInfo.device().address(), alternatedeviceInfo.address());
- foreach (QBluetoothUuid::ProtocolUuid u, protUuids)
+ for (QBluetoothUuid::ProtocolUuid u : qAsConst(protUuids))
QCOMPARE(serviceInfo.protocolDescriptor(u).count(), 0);
- foreach (QBluetoothUuid::ProtocolUuid u, protUuids)
+ for (QBluetoothUuid::ProtocolUuid u : qAsConst(protUuids))
QCOMPARE(copyInfo.protocolDescriptor(u).count(), 0);
}
}
diff --git a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp
index fa4629ac..05bc1a0f 100644
--- a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp
+++ b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp
@@ -377,7 +377,7 @@ void tst_QBluetoothSocket::tst_clientCommunication()
{
/* Send line by line with event loop */
- foreach (const QString &line, data) {
+ for (const QString &line : qAsConst(data)) {
QSignalSpy readyReadSpy(&socket, SIGNAL(readyRead()));
QSignalSpy bytesWrittenSpy(&socket, SIGNAL(bytesWritten(qint64)));
diff --git a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp
index f69644c6..6b0481a5 100644
--- a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp
+++ b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp
@@ -143,14 +143,15 @@ void tst_QBluetoothTransferManager::tst_request()
QFETCH(tst_QBluetoothTransferManager_QParameterMap, parameters);
QBluetoothTransferRequest transferRequest(address);
- foreach (QBluetoothTransferRequest::Attribute key, parameters.keys())
+ const QList<QBluetoothTransferRequest::Attribute> attributes = parameters.keys();
+ for (QBluetoothTransferRequest::Attribute key : attributes)
QCOMPARE(transferRequest.attribute(key), QVariant());
- foreach (QBluetoothTransferRequest::Attribute key, parameters.keys())
+ for (QBluetoothTransferRequest::Attribute key : attributes)
transferRequest.setAttribute((QBluetoothTransferRequest::Attribute)key, parameters[key]);
QCOMPARE(transferRequest.address(), address);
- foreach (QBluetoothTransferRequest::Attribute key, parameters.keys())
+ for (QBluetoothTransferRequest::Attribute key : attributes)
QCOMPARE(transferRequest.attribute(key), parameters[key]);
//test copy constructor
@@ -158,17 +159,17 @@ void tst_QBluetoothTransferManager::tst_request()
QVERIFY(constructorCopy == transferRequest);
QVERIFY(!(constructorCopy != transferRequest));
QCOMPARE(constructorCopy.address(), address);
- foreach (QBluetoothTransferRequest::Attribute key, parameters.keys())
+ for (QBluetoothTransferRequest::Attribute key : attributes)
QCOMPARE(constructorCopy.attribute(key), parameters[key]);
//test assignment operator
QBluetoothTransferRequest request;
QVERIFY(request.address().isNull());
- foreach (QBluetoothTransferRequest::Attribute key, parameters.keys())
+ for (QBluetoothTransferRequest::Attribute key : attributes)
QCOMPARE(request.attribute(key), QVariant());
request = transferRequest;
QCOMPARE(request.address(), address);
- foreach (QBluetoothTransferRequest::Attribute key, parameters.keys())
+ for (QBluetoothTransferRequest::Attribute key : attributes)
QCOMPARE(request.attribute(key), parameters[key]);
//test that it's a true and independent copy
diff --git a/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp b/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp
index 1a8a8e52..dcf2c95b 100644
--- a/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp
+++ b/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp
@@ -98,7 +98,8 @@ void tst_QBluetoothTransferRequest::tst_construction()
QBluetoothTransferRequest transferRequest(address);
- foreach (int key, parameters.keys()) {
+ const QList<int> keys = parameters.keys();
+ for (const int key : keys) {
transferRequest.setAttribute((QBluetoothTransferRequest::Attribute)key, parameters[key]);
QCOMPARE(parameters[key], transferRequest.attribute((QBluetoothTransferRequest::Attribute)key));
}
@@ -123,7 +124,8 @@ void tst_QBluetoothTransferRequest::tst_assignment()
QBluetoothTransferRequest transferRequest(address);
- foreach (int key, parameters.keys()) {
+ const QList<int> keys = parameters.keys();
+ for (const int key : keys) {
transferRequest.setAttribute((QBluetoothTransferRequest::Attribute)key, parameters[key]);
}
diff --git a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp
index e0513cea..7e191052 100644
--- a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp
+++ b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp
@@ -114,8 +114,8 @@ void tst_QLowEnergyCharacteristic::initTestCase()
// find first service with descriptor
QLowEnergyController *controller = 0;
- foreach (const QBluetoothDeviceInfo &remoteDevice, remoteLeDevices) {
- controller = new QLowEnergyController(remoteDevice, this);
+ for (const QBluetoothDeviceInfo &remoteDevice : qAsConst(remoteLeDevices)) {
+ controller = QLowEnergyController::createCentral(remoteDevice, this);
qDebug() << "Connecting to" << remoteDevice.name()
<< remoteDevice.address() << remoteDevice.deviceUuid();
controller->connectToDevice();
@@ -138,7 +138,8 @@ void tst_QLowEnergyCharacteristic::initTestCase()
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveredState);
- foreach (const QBluetoothUuid &leServiceUuid, controller->services()) {
+ const QList<QBluetoothUuid> leServiceUuids = controller->services();
+ for (const QBluetoothUuid &leServiceUuid : leServiceUuids) {
QLowEnergyService *leService = controller->createServiceObject(leServiceUuid, this);
if (!leService)
continue;
@@ -147,8 +148,8 @@ void tst_QLowEnergyCharacteristic::initTestCase()
QTRY_VERIFY_WITH_TIMEOUT(
leService->state() == QLowEnergyService::ServiceDiscovered, 10000);
- QList<QLowEnergyCharacteristic> chars = leService->characteristics();
- foreach (const QLowEnergyCharacteristic &ch, chars) {
+ const QList<QLowEnergyCharacteristic> chars = leService->characteristics();
+ for (const QLowEnergyCharacteristic &ch : chars) {
if (!ch.descriptors().isEmpty()) {
globalService = leService;
globalControl = controller;
diff --git a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
index 30b2fb75..f3a0e9a4 100644
--- a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
+++ b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
@@ -674,7 +674,7 @@ void TestQLowEnergyControllerGattServer::serviceData()
const auto inUuids = QSet<QBluetoothUuid>() << descData.uuid() << descData2.uuid()
<< descData3.uuid();
QSet<QBluetoothUuid> outUuids;
- foreach (const QLowEnergyDescriptor &desc, descriptors)
+ for (const QLowEnergyDescriptor &desc : descriptors)
outUuids << desc.uuid();
QCOMPARE(inUuids, outUuids);
diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
index 53c2f754..b175ddd0 100644
--- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
+++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
@@ -159,7 +159,8 @@ void tst_QLowEnergyController::initTestCase()
bool deviceFound = false;
devAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
QTRY_VERIFY_WITH_TIMEOUT(finishedSpy.count() > 0, 30000);
- foreach (const QBluetoothDeviceInfo &info, devAgent->discoveredDevices()) {
+ const QList<QBluetoothDeviceInfo> infos = devAgent->discoveredDevices();
+ for (const QBluetoothDeviceInfo &info : infos) {
#ifndef Q_OS_MAC
if (info.address() == remoteDevice) {
#else
@@ -343,7 +344,7 @@ void tst_QLowEnergyController::tst_connect()
listing.append(v.value<QBluetoothUuid>());
}
- foreach (const QBluetoothUuid &uuid, foundServices) {
+ for (const QBluetoothUuid &uuid : qAsConst(foundServices)) {
QVERIFY2(listing.contains(uuid),
uuid.toString().toLatin1());
@@ -361,7 +362,7 @@ void tst_QLowEnergyController::tst_connect()
QVERIFY(!control.createServiceObject(QBluetoothUuid(QBluetoothUuid::DeviceName)));
// initiate characteristic discovery
- foreach (QLowEnergyService *service, savedReferences) {
+ for (QLowEnergyService *service : qAsConst(savedReferences)) {
qDebug() << "Discovering" << service->serviceUuid();
QSignalSpy stateSpy(service,
SIGNAL(stateChanged(QLowEnergyService::ServiceState)));
@@ -378,7 +379,7 @@ void tst_QLowEnergyController::tst_connect()
}
// ensure that related service objects share same state
- foreach (QLowEnergyService* originalService, savedReferences) {
+ for (QLowEnergyService* originalService : qAsConst(savedReferences)) {
QLowEnergyService *newService = control.createServiceObject(
originalService->serviceUuid());
QVERIFY(newService);
@@ -398,7 +399,7 @@ void tst_QLowEnergyController::tst_connect()
} else {
QCOMPARE(disconnectedSpy.count(), 1);
// after disconnect all service references must be invalid
- foreach (const QLowEnergyService *entry, savedReferences) {
+ for (const QLowEnergyService *entry : qAsConst(savedReferences)) {
const QBluetoothUuid &uuid = entry->serviceUuid();
QVERIFY2(entry->state() == QLowEnergyService::InvalidService,
uuid.toString().toLatin1());
@@ -1208,7 +1209,7 @@ void tst_QLowEnergyController::verifyServiceProperties(
} else if (info->serviceUuid() ==
QBluetoothUuid(QString("f000aa40-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Pressure";
- QList<QLowEnergyCharacteristic> chars = info->characteristics();
+ const QList<QLowEnergyCharacteristic> chars = info->characteristics();
QVERIFY(chars.count() >= 3);
// Pressure Data
@@ -1271,7 +1272,7 @@ void tst_QLowEnergyController::verifyServiceProperties(
//calibration and period characteristic are swapped, ensure we don't depend on their order
QLowEnergyCharacteristic calibration, period;
- foreach (const QLowEnergyCharacteristic &ch, chars) {
+ for (const QLowEnergyCharacteristic &ch : chars) {
//find calibration characteristic
if (ch.uuid() == QBluetoothUuid(QString("f000aa43-0451-4000-b000-000000000000")))
calibration = ch;
@@ -1660,7 +1661,8 @@ bool tst_QLowEnergyController::verifyClientCharacteristicValue(const QByteArray
void tst_QLowEnergyController::tst_defaultBehavior()
{
QList<QBluetoothAddress> foundAddresses;
- foreach (const QBluetoothHostInfo &info, QBluetoothLocalDevice::allDevices())
+ const QList<QBluetoothHostInfo> infos = QBluetoothLocalDevice::allDevices();
+ for (const QBluetoothHostInfo &info : infos)
foundAddresses.append(info.address());
const QBluetoothAddress randomAddress("11:22:33:44:55:66");
diff --git a/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp b/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp
index e6728eab..4e82aacd 100644
--- a/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp
+++ b/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp
@@ -105,8 +105,8 @@ void tst_QLowEnergyDescriptor::initTestCase()
// find first service with descriptor
QLowEnergyController *controller = 0;
- foreach (const QBluetoothDeviceInfo& remoteDeviceInfo, remoteLeDeviceInfos) {
- controller = new QLowEnergyController(remoteDeviceInfo, this);
+ for (const QBluetoothDeviceInfo& remoteDeviceInfo : qAsConst(remoteLeDeviceInfos)) {
+ controller = QLowEnergyController::createCentral(remoteDeviceInfo, this);
qDebug() << "Connecting to" << remoteDeviceInfo.address();
controller->connectToDevice();
QTRY_IMPL(controller->state() != QLowEnergyController::ConnectingState,
@@ -128,7 +128,8 @@ void tst_QLowEnergyDescriptor::initTestCase()
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveredState);
- foreach (const QBluetoothUuid &leServiceUuid, controller->services()) {
+ const QList<QBluetoothUuid> leServiceUuids = controller->services();
+ for (const QBluetoothUuid &leServiceUuid : leServiceUuids) {
QLowEnergyService *leService = controller->createServiceObject(leServiceUuid, this);
if (!leService)
continue;
@@ -137,8 +138,8 @@ void tst_QLowEnergyDescriptor::initTestCase()
QTRY_VERIFY_WITH_TIMEOUT(
leService->state() == QLowEnergyService::ServiceDiscovered, 10000);
- QList<QLowEnergyCharacteristic> chars = leService->characteristics();
- foreach (const QLowEnergyCharacteristic &ch, chars) {
+ const QList<QLowEnergyCharacteristic> chars = leService->characteristics();
+ for (const QLowEnergyCharacteristic &ch : chars) {
if (!ch.descriptors().isEmpty()) {
globalService = leService;
globalControl = controller;
@@ -239,7 +240,7 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
QList<QLowEnergyDescriptor> targets;
const QList<QLowEnergyCharacteristic> chars = globalService->characteristics();
- foreach (const QLowEnergyCharacteristic &ch, chars) {
+ for (const QLowEnergyCharacteristic &ch : chars) {
if (!ch.descriptors().isEmpty()) {
targets = ch.descriptors();
break;
diff --git a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp
index d5b8720f..c3c457e9 100644
--- a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp
+++ b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp
@@ -205,7 +205,7 @@ void tst_QNearFieldManager::registerNdefMessageHandler_type()
const QNdefMessage message = messageSpy.first().at(0).value<QNdefMessage>();
bool hasRecord = false;
- foreach (const QNdefRecord &record, message) {
+ for (const QNdefRecord &record : message) {
if (record.typeNameFormat() == typeNameFormat && record.type() == type) {
hasRecord = true;
break;
diff --git a/tests/bttestui/btlocaldevice.cpp b/tests/bttestui/btlocaldevice.cpp
index 77696853..54de57ca 100644
--- a/tests/bttestui/btlocaldevice.cpp
+++ b/tests/bttestui/btlocaldevice.cpp
@@ -329,7 +329,8 @@ void BtLocalDevice::stopServiceDiscovery()
void BtLocalDevice::serviceDiscovered(const QBluetoothServiceInfo &info)
{
QStringList classIds;
- foreach (const QBluetoothUuid &uuid, info.serviceClassUuids())
+ const QList<QBluetoothUuid> uuids = info.serviceClassUuids();
+ for (const QBluetoothUuid &uuid : uuids)
classIds.append(uuid.toString());
qDebug() << "$$ Found new service" << info.device().address().toString()
<< info.serviceUuid() << info.serviceName() << info.serviceDescription() << classIds;
@@ -347,7 +348,7 @@ void BtLocalDevice::serviceDiscovered(const QBluetoothServiceInfo &info)
{
//This is here to detect the test server for SPP testing later on
bool alreadyKnown = false;
- foreach (const QBluetoothServiceInfo& found, foundTestServers) {
+ for (const QBluetoothServiceInfo& found : qAsConst(foundTestServers)) {
if (found.device().address() == info.device().address()) {
alreadyKnown = true;
break;
@@ -384,24 +385,24 @@ void BtLocalDevice::dumpServiceDiscovery()
if (deviceAgent) {
qDebug() << "Device Discovery active:" << deviceAgent->isActive();
qDebug() << "Error:" << deviceAgent->error() << deviceAgent->errorString();
- QList<QBluetoothDeviceInfo> list = deviceAgent->discoveredDevices();
+ const QList<QBluetoothDeviceInfo> list = deviceAgent->discoveredDevices();
qDebug() << "Discovered Devices:" << list.count();
- foreach (const QBluetoothDeviceInfo &info, list)
+ for (const QBluetoothDeviceInfo &info : list)
qDebug() << info.name() << info.address().toString() << info.rssi();
}
if (serviceAgent) {
qDebug() << "Service Discovery active:" << serviceAgent->isActive();
qDebug() << "Error:" << serviceAgent->error() << serviceAgent->errorString();
- QList<QBluetoothServiceInfo> list = serviceAgent->discoveredServices();
+ const QList<QBluetoothServiceInfo> list = serviceAgent->discoveredServices();
qDebug() << "Discovered Services:" << list.count();
- foreach (const QBluetoothServiceInfo &i, list) {
+ for (const QBluetoothServiceInfo &i : list) {
qDebug() << i.device().address().toString() << i.device().name() << i.serviceName();
}
qDebug() << "###### TestServer offered by:";
- foreach (const QBluetoothServiceInfo& found, foundTestServers) {
+ for (const QBluetoothServiceInfo& found : qAsConst(foundTestServers)) {
qDebug() << found.device().name() << found.device().address().toString();
}
}
@@ -449,7 +450,7 @@ void BtLocalDevice::closeSocket()
if (!serverSockets.isEmpty()) {
qDebug() << "###### Closing server sockets";
- foreach (QBluetoothSocket *s, serverSockets)
+ for (QBluetoothSocket *s : serverSockets)
s->close();
}
}
@@ -463,7 +464,7 @@ void BtLocalDevice::abortSocket()
if (!serverSockets.isEmpty()) {
qDebug() << "###### Closing server sockets";
- foreach (QBluetoothSocket *s, serverSockets)
+ for (QBluetoothSocket *s : serverSockets)
s->abort();
}
}
@@ -526,7 +527,7 @@ void BtLocalDevice::writeData()
if (socket && socket->state() == QBluetoothSocket::ConnectedState) {
socket->write(testData);
}
- foreach (QBluetoothSocket* client, serverSockets) {
+ for (QBluetoothSocket* client : serverSockets) {
client->write(testData);
}
}
@@ -728,7 +729,7 @@ void BtLocalDevice::dumpServerInformation()
//server->setSecurityFlags(secFlag);
- foreach (const QBluetoothSocket *client, serverSockets) {
+ for (const QBluetoothSocket *client : qAsConst(serverSockets)) {
qDebug() << "##" << client->localAddress().toString()
<< client->localName() << client->localPort();
qDebug() << "##" << client->peerAddress().toString()
@@ -756,9 +757,9 @@ void BtLocalDevice::dumpInformation()
{
qDebug() << "###### default local device";
dumpLocalDevice(localDevice);
- QList<QBluetoothHostInfo> list = QBluetoothLocalDevice::allDevices();
+ const QList<QBluetoothHostInfo> list = QBluetoothLocalDevice::allDevices();
qDebug() << "Found local devices: " << list.count();
- foreach (const QBluetoothHostInfo &info, list) {
+ for (const QBluetoothHostInfo &info : list) {
qDebug() << " " << info.address().toString() << " " <<info.name();
}
@@ -778,13 +779,17 @@ void BtLocalDevice::dumpInformation()
qDebug() << "###### Bonding state with" << address.toString() << ": " << localDevice->pairingStatus(address);
qDebug() << "###### Connected Devices";
- foreach (const QBluetoothAddress &addr, localDevice->connectedDevices())
+ const QList<QBluetoothAddress> connectedDevices = localDevice->connectedDevices();
+ for (const QBluetoothAddress &addr : connectedDevices)
qDebug() << " " << addr.toString();
qDebug() << "###### Discovered Devices";
- if (deviceAgent)
- foreach (const QBluetoothDeviceInfo &info, deviceAgent->discoveredDevices())
+ if (deviceAgent) {
+ const QList<QBluetoothDeviceInfo> devices = deviceAgent->discoveredDevices();
+ for (const QBluetoothDeviceInfo &info : devices) {
deviceDiscovered(info);
+ }
+ }
QBluetoothDeviceDiscoveryAgent invalidAgent(QBluetoothAddress("11:22:33:44:55:66"));
invalidAgent.start();