From 92609ca2efc33a091ede3e16a5f077fa227c3f1f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 16 Jan 2014 11:23:41 +0100 Subject: Fix memory leaks in Bluez specific device and SDP discovery classes. [ChangeLog][QtBluetooth][Platform Specific Changes] Memory leaks fixed in Bluez device and service discovery implementations. Change-Id: Ibc7c883d42d81a97310ff44ba40ffa94c71f611f Reviewed-by: Fabian Bumberger Reviewed-by: Aaron McCarthy Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp | 3 +++ .../qbluetoothservicediscoveryagent_bluez.cpp | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp index 805f648a..48c8b983 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp @@ -65,6 +65,7 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate(con QBluetoothDeviceDiscoveryAgentPrivate::~QBluetoothDeviceDiscoveryAgentPrivate() { delete manager; + delete adapter; } bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const @@ -115,6 +116,8 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start() propertiesReply.waitForFinished(); if(propertiesReply.isError()) { errorString = propertiesReply.error().message(); + delete adapter; + adapter = 0; qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "ERROR: " << errorString; lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; Q_Q(QBluetoothDeviceDiscoveryAgent); diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index 8f969ef6..1a1180d7 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -60,12 +60,16 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(c { qRegisterMetaType("ServiceMap"); qDBusRegisterMetaType(); + + manager = new OrgBluezManagerInterface(QLatin1String("org.bluez"), QLatin1String("/"), + QDBusConnection::systemBus()); } QBluetoothServiceDiscoveryAgentPrivate::~QBluetoothServiceDiscoveryAgentPrivate() { delete device; delete manager; + delete adapter; } void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &address) @@ -74,8 +78,6 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr qCDebug(QT_BT_BLUEZ) << "Full discovery on: " << address.toString(); - manager = new OrgBluezManagerInterface(QLatin1String("org.bluez"), QLatin1String("/"), - QDBusConnection::systemBus()); QDBusPendingReply reply; if (m_deviceAdapterAddress.isNull()) reply = manager->DefaultAdapter(); @@ -130,6 +132,8 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa QDBusPendingReply deviceObjectPath = *watcher; if (deviceObjectPath.isError()) { if (deviceObjectPath.error().name() != QLatin1String("org.bluez.Error.AlreadyExists")) { + delete adapter; + adapter = 0; _q_serviceDiscoveryFinished(); qCDebug(QT_BT_BLUEZ) << "Create device failed Error: " << error << deviceObjectPath.error().name(); return; @@ -138,6 +142,8 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa deviceObjectPath = adapter->FindDevice(address.toString()); deviceObjectPath.waitForFinished(); if (deviceObjectPath.isError()) { + delete adapter; + adapter = 0; if (singleDevice) { error = QBluetoothServiceDiscoveryAgent::InputOutputError; errorString = QBluetoothServiceDiscoveryAgent::tr("Unable to access device"); @@ -152,11 +158,14 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa device = new OrgBluezDeviceInterface(QLatin1String("org.bluez"), deviceObjectPath.value().path(), QDBusConnection::systemBus()); + delete adapter; + adapter = 0; QDBusPendingReply deviceReply = device->GetProperties(); deviceReply.waitForFinished(); if (deviceReply.isError()) { qCDebug(QT_BT_BLUEZ) << "GetProperties error: " << error << deviceObjectPath.error().name(); + delete device; return; } QVariantMap v = deviceReply.value(); @@ -171,7 +180,6 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa watcher = new QDBusPendingCallWatcher(discoverReply, q); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), q, SLOT(_q_discoveredServices(QDBusPendingCallWatcher*))); - } void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingCallWatcher *watcher) @@ -188,6 +196,8 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingC errorString = reply.error().message(); emit q->error(error); } + delete device; + device = 0; _q_serviceDiscoveryFinished(); return; } @@ -234,6 +244,8 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingC } watcher->deleteLater(); + delete device; + device = 0; _q_serviceDiscoveryFinished(); } -- cgit v1.2.3 From 4d7b35b4b06ac0e99f44ed7634d1d069f1d945f4 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 16 Jan 2014 11:35:01 +0100 Subject: Cleanup dead code in Bluez SDP discovery backend The change tweaks the discovery debug output log too. Change-Id: I4ef3e2e8ebaf0d9e593eee35a669641e3914da01 Reviewed-by: Fabian Bumberger Reviewed-by: Aaron McCarthy --- src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index 1a1180d7..8e2f73cd 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -161,22 +161,14 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa delete adapter; adapter = 0; - QDBusPendingReply deviceReply = device->GetProperties(); - deviceReply.waitForFinished(); - if (deviceReply.isError()) { - qCDebug(QT_BT_BLUEZ) << "GetProperties error: " << error << deviceObjectPath.error().name(); - delete device; - return; - } - QVariantMap v = deviceReply.value(); - QStringList device_uuids = v.value(QLatin1String("UUIDs")).toStringList(); - QString pattern; foreach (const QBluetoothUuid &uuid, uuidFilter) pattern += uuid.toString().remove(QLatin1Char('{')).remove(QLatin1Char('}')) + QLatin1Char(' '); - qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "Discover: " << pattern.trimmed(); - QDBusPendingReply discoverReply = device->DiscoverServices(pattern.trimmed()); + pattern = pattern.trimmed(); + qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "Discover restrictions:" << pattern; + + QDBusPendingReply discoverReply = device->DiscoverServices(pattern); watcher = new QDBusPendingCallWatcher(discoverReply, q); QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), q, SLOT(_q_discoveredServices(QDBusPendingCallWatcher*))); -- cgit v1.2.3 From 576cdf8ec66e15efe7e306199442465addd7c9d9 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 17 Jan 2014 13:10:32 +0100 Subject: Improve QBluetoothServiceDiscoveryAgent documentation [ChangeLog][QtBluetooth][QBluetoothServiceDiscoveryAgent] The QBluetoothServiceDiscoveryAgent class documentation has been improved. Change-Id: I5472e9ceda45d9bcf0634b5bf2cecf265986bc10 Reviewed-by: Fabian Bumberger Reviewed-by: Aaron McCarthy --- src/bluetooth/qbluetoothservicediscoveryagent.cpp | 50 +++++++++++++++-------- 1 file changed, 34 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index 2d1c6709..a1a9378c 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -99,7 +99,7 @@ QT_BEGIN_NAMESPACE /*! \fn QBluetoothServiceDiscoveryAgent::finished() - This signal is emitted when Bluetooth service discovery completes. This signal will even + This signal is emitted when the Bluetooth service discovery completes. This signal will even be emitted when an error occurred during the service discovery. */ @@ -123,7 +123,7 @@ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(QObject *parent /*! Constructs a new QBluetoothServiceDiscoveryAgent for \a deviceAdapter and with \a parent. - If \a deviceAdapter is null, the default adapter will be used. + If \a deviceAdapter is default constructed, the local default adapter will be used. */ QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent) : QObject(parent), d_ptr(new QBluetoothServiceDiscoveryAgentPrivate(deviceAdapter)) @@ -144,6 +144,13 @@ QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent() /*! Returns the list of all discovered services. + + This list of services accumulates newly discovered services from multiple calls + to \l start(). Unless \l clear() is called the list cannot decrease in size. This implies + that if a remote Bluetooth device moves out of range in between two subsequent calls + to \l start() the list may contain stale entries. + + \sa clear() */ QList QBluetoothServiceDiscoveryAgent::discoveredServices() const { @@ -194,10 +201,15 @@ QList QBluetoothServiceDiscoveryAgent::uuidFilter() const } /*! - Sets remote device address to \a address. If \a address is null, services will be discovered - on all contactable Bluetooth devices. A new remote address can only be set while there is - no service discovery in progress; otherwise this function returns false. + Sets the remote device address to \a address. If \a address is default constructed, + services will be discovered on all contactable Bluetooth devices. A new remote + address can only be set while there is no service discovery in progress; otherwise + this function returns false. + + On some platforms such as Blackberry the service discovery might lead to pairing requests. + Therefore it is not recommended to do service discoveries on all devices. + \sa remoteAddress() */ bool QBluetoothServiceDiscoveryAgent::setRemoteAddress(const QBluetoothAddress &address) { @@ -211,9 +223,10 @@ bool QBluetoothServiceDiscoveryAgent::setRemoteAddress(const QBluetoothAddress & } /*! - Returns the remote device address. If setRemoteAddress is not called, the function - will return default QBluetoothAddress. + Returns the remote device address. If \l setRemoteAddress() is not called, the function + will return a default constructed \l QBluetoothAddress. + \sa setRemoteAddress() */ QBluetoothAddress QBluetoothServiceDiscoveryAgent::remoteAddress() const { @@ -246,7 +259,8 @@ void QBluetoothServiceDiscoveryAgent::start(DiscoveryMode mode) } /*! - Stops service discovery. + Stops the service discovery process. The \l canceled() signal will be emitted once + the search has stopped. */ void QBluetoothServiceDiscoveryAgent::stop() { @@ -266,7 +280,9 @@ void QBluetoothServiceDiscoveryAgent::stop() } /*! - Clears the results of a previous service discovery. + Clears the results of previous service discoveries. + + \sa discoveredServices() */ void QBluetoothServiceDiscoveryAgent::clear() { @@ -278,7 +294,8 @@ void QBluetoothServiceDiscoveryAgent::clear() } /*! - Returns true if service discovery is currently active, otherwise returns false. + Returns \c true if the service discovery is currently active; otherwise returns \c false. + An active discovery can be stopped by calling \l stop(). */ bool QBluetoothServiceDiscoveryAgent::isActive() const { @@ -288,9 +305,9 @@ bool QBluetoothServiceDiscoveryAgent::isActive() const } /*! - Returns the type of error that last occurred. If service discovery is done - on a signle address it will return errors that occured while trying to discover - services on that device. If the alternate constructor is used and devices are + Returns the type of error that last occurred. If the service discovery is done + for a single \l remoteAddress() it will return errors that occurred while trying to discover + services on that device. If the \l remoteAddress() is not set and devices are discovered by a scan, errors during service discovery on individual devices are not saved and no signals are emitted. In this case, errors are fairly normal as some devices may not respond to discovery or @@ -306,8 +323,8 @@ QBluetoothServiceDiscoveryAgent::Error QBluetoothServiceDiscoveryAgent::error() } /*! - Returns a human-readable description of the last error that occurred during - service discovery on a single device. + Returns a human-readable description of the last error that occurred during the + service discovery. */ QString QBluetoothServiceDiscoveryAgent::errorString() const { @@ -318,7 +335,8 @@ QString QBluetoothServiceDiscoveryAgent::errorString() const /*! \fn QBluetoothServiceDiscoveryAgent::canceled() - Signals the cancellation of the service discovery. + + This signal is triggered when the service discovery was canceled via a call to \l stop(). */ -- cgit v1.2.3 From 1f33f347fad40f71fa89110c084880a81db1d15a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 17 Jan 2014 13:37:35 +0100 Subject: Do not clear result lists while the SDP search is ongoing. Or bad things will happen... Change-Id: I7df3925ff5d15f3f904f4dd38e24b247ec151fd1 Reviewed-by: Fabian Bumberger Reviewed-by: Aaron McCarthy --- src/bluetooth/qbluetoothservicediscoveryagent.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index a1a9378c..87ccb108 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -280,7 +280,8 @@ void QBluetoothServiceDiscoveryAgent::stop() } /*! - Clears the results of previous service discoveries. + Clears the results of previous service discoveries and resets \l uuidFilter(). + This function does nothing during an ongoing service discovery (see \l isActive()). \sa discoveredServices() */ @@ -288,6 +289,10 @@ void QBluetoothServiceDiscoveryAgent::clear() { Q_D(QBluetoothServiceDiscoveryAgent); + //don't clear the list while the search is ongoing + if (isActive()) + return; + d->discoveredDevices.clear(); d->discoveredServices.clear(); d->uuidFilter.clear(); -- cgit v1.2.3 From e413009f3be46ec1020e4ccc1e574e55fb4eb17f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 22 Jan 2014 16:45:55 +0100 Subject: Add missing documentation for QQmlNdefRecord::Unknown enum value. Change-Id: Ida3f7816340f9379629e653abc5ef89f5aa38486 Reviewed-by: Fabian Bumberger --- src/nfc/qqmlndefrecord.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/nfc/qqmlndefrecord.cpp b/src/nfc/qqmlndefrecord.cpp index 8a3f24d7..c94578eb 100644 --- a/src/nfc/qqmlndefrecord.cpp +++ b/src/nfc/qqmlndefrecord.cpp @@ -262,6 +262,7 @@ QQmlNdefRecord::QQmlNdefRecord(const QNdefRecord &record, QObject *parent) \value Uri The NDEF record type follows the construct described in RFC 3986. \value ExternalRtd The NDEF record type follows the construct for external type names described the NFC RTD Specification. + \value Unknown The NDEF record type is unknown. */ /*! -- cgit v1.2.3 From 5254e62e1898cffe397ecd0b0c8be43213e5b4e8 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 21 Jan 2014 16:00:01 +0100 Subject: Stop SDP search if QML Model is turned off So far, we only ever disabled the device search. If a SDP discovery was running and we changed to device discovery the SDP discovery kept running in the background. Change-Id: I5f2cf88ecf7f9b5cfe2608e0ceda366b552982e5 Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothservicediscoveryagent.cpp | 3 +++ src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index 87ccb108..beaa3503 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -266,6 +266,9 @@ void QBluetoothServiceDiscoveryAgent::stop() { Q_D(QBluetoothServiceDiscoveryAgent); + if (!isActive()) + return; + switch (d->discoveryState()) { case QBluetoothServiceDiscoveryAgentPrivate::DeviceDiscovery: d->stopDeviceDiscovery(); diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp index 6689d663..b7534329 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp @@ -367,11 +367,10 @@ void QDeclarativeBluetoothDiscoveryModel::setRunning(bool running) d->m_running = running; if (!running) { - if (d->m_deviceAgent) { + if (d->m_deviceAgent) d->m_deviceAgent->stop(); - } else if (d->m_serviceAgent) { + if (d->m_serviceAgent) d->m_serviceAgent->stop(); - } } else { clearModel(); d->m_error = NoError; -- cgit v1.2.3 From 0789c35b26b85597a9fb0e03713839643d2feb41 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 21 Jan 2014 16:32:45 +0100 Subject: Fix crash during SDP discovery on Bluez Stopping the discovery during an ongoing SDP search may cause a crash because discoveredDevices has been cleared although we still access the list later on. Even if list access wouldn't be required anymore there is no reason to continue the discovery. Entry guards for the involved slots were added. Additionally it revealed a memory leak which has been fixed Change-Id: I3fd3c99a82a9d7b61e853a3f9f3877b8ad7f6d41 Reviewed-by: Fabian Bumberger Reviewed-by: Alex Blasche --- .../qbluetoothservicediscoveryagent_bluez.cpp | 29 ++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp index 8e2f73cd..2795a855 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp @@ -108,21 +108,33 @@ void QBluetoothServiceDiscoveryAgentPrivate::start(const QBluetoothAddress &addr void QBluetoothServiceDiscoveryAgentPrivate::stop() { qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << "Stop called"; - if(device){ + if (device) { + //we are waiting for _q_discoveredServices() slot to be called + // adapter is already 0 QDBusPendingReply<> reply = device->CancelDiscovery(); reply.waitForFinished(); - discoveredDevices.clear(); - setDiscoveryState(Inactive); - Q_Q(QBluetoothServiceDiscoveryAgent); - emit q->canceled(); - - qCDebug(QT_BT_BLUEZ) << "Stop done"; + device->deleteLater(); + device = 0; + Q_ASSERT(!adapter); + } else if (adapter) { + //we are waiting for _q_createdDevice() slot to be called + adapter->deleteLater(); + adapter = 0; + Q_ASSERT(!device); } + + discoveredDevices.clear(); + setDiscoveryState(Inactive); + Q_Q(QBluetoothServiceDiscoveryAgent); + emit q->canceled(); } void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWatcher *watcher) { + if (!adapter) + return; + Q_Q(QBluetoothServiceDiscoveryAgent); const QBluetoothAddress &address = watcher->property("_q_BTaddress").value(); @@ -176,6 +188,9 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingCallWatcher *watcher) { + if (!device) + return; + qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO; QDBusPendingReply reply = *watcher; -- cgit v1.2.3 From 7644b7184ab5c304594bb3298c41405374203592 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 24 Jan 2014 14:12:46 +0100 Subject: Fix broken SDP discovery on QBluetoothSocket ThHis is only used on Bluez at this stage. THe SDP agent was initialized with the local adapter being the remote address of the remote service. This could never work. The remote address is now properly set (being the handed over bt address to QBluetoothSocket::connectToService()). [ChangeLog][QtBluetooth][QtBluetoothSocket] Fixed incorrect invocation of QBluetoothDiscoveryAgent where the remote service address was incorrectly assumed to be the local Bt adapter address. This prevented the detection of the remote service. This bug only affects the Bluez backend. Change-Id: Ice2b9c351bfd42f1f4398b14ac68f76315f01fa8 Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothsocket.cpp | 4 +++- src/bluetooth/qbluetoothsocket_bluez.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 4b3cdd21..9eaf6758 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -488,10 +488,12 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O qCDebug(QT_BT) << "Starting discovery"; if(d->discoveryAgent) { + d->discoveryAgent->stop(); delete d->discoveryAgent; } - d->discoveryAgent = new QBluetoothServiceDiscoveryAgent(service.device().address(),this); + d->discoveryAgent = new QBluetoothServiceDiscoveryAgent(this); + d->discoveryAgent->setRemoteAddress(service.device().address()); //qDebug() << "Got agent"; diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index a3048546..13ae2b93 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -361,7 +361,7 @@ QString QBluetoothSocketPrivate::peerName() const convertAddress(addr.l2_bdaddr.b, bdaddr); } else { - qCWarning(QT_BT_BLUEZ) << "peerName() called on socket of known type"; + qCWarning(QT_BT_BLUEZ) << "peerName() called on socket of unknown type"; return QString(); } -- cgit v1.2.3 From 29de876f55dc96748fdca8dd3fef0c873791796f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 24 Jan 2014 14:59:08 +0100 Subject: Fix crash in Bluez implementation for QBluetoothSocket The internal socket was closed but not reset to -1 after calling close() or abort(). As a consequence the subsequent connect() call crashed since internal socket notifier were invalid [ChangeLog][QtBluetooth][QBluetoothSocket] Fixed a crash in Bluez part of QBluetoothSocket() which was caused when triggered when calling the sequence connect() - abort() - connect(). Change-Id: I21b779c7808d0a5211df9e2481da28e2e9753ca9 Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothsocket_bluez.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 13ae2b93..ed2e8ab8 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -196,7 +196,6 @@ void QBluetoothSocketPrivate::_q_writeNotify() } char buf[1024]; - Q_Q(QBluetoothSocket); int size = txBuffer.read(buf, 1024); @@ -258,6 +257,7 @@ void QBluetoothSocketPrivate::abort() // we don't call disconnectFromService or // QBluetoothSocket::close QT_CLOSE(socket); + socket = -1; Q_Q(QBluetoothSocket); emit q->disconnected(); @@ -510,7 +510,8 @@ void QBluetoothSocketPrivate::close() // We are disconnected now, so go to unconnected. q->setSocketState(QBluetoothSocket::UnconnectedState); emit q->disconnected(); - ::close(socket); + QT_CLOSE(socket); + socket = -1; } } -- cgit v1.2.3 From 43a95bb690d2c37c031fc827efe922ea334780c1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 28 Jan 2014 11:57:09 +0100 Subject: Initialize QBluetoothSocket::socketError properly. So far the initial value is compiler dependent. In most cases this meant it was set to 0. However 0 is not even a valid QBluetoothSocket::SocketError enum value. The NoSocketError value is -2. Change-Id: Ieee4f7bd1c97d758295f4d0cc1297f62c114f4f3 Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothsocket_bluez.cpp | 1 + src/bluetooth/qbluetoothsocket_qnx.cpp | 1 + 2 files changed, 2 insertions(+) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index ed2e8ab8..d12acf7c 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -67,6 +67,7 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() : socket(-1), socketType(QBluetoothServiceInfo::UnknownProtocol), state(QBluetoothSocket::UnconnectedState), + socketError(QBluetoothSocket::NoSocketError), readNotifier(0), connectWriteNotifier(0), connecting(false), diff --git a/src/bluetooth/qbluetoothsocket_qnx.cpp b/src/bluetooth/qbluetoothsocket_qnx.cpp index f242e4d9..6c87011b 100644 --- a/src/bluetooth/qbluetoothsocket_qnx.cpp +++ b/src/bluetooth/qbluetoothsocket_qnx.cpp @@ -50,6 +50,7 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() : socket(-1), socketType(QBluetoothServiceInfo::UnknownProtocol), state(QBluetoothSocket::UnconnectedState), + socketError(QBluetoothSocket::NoSocketError), readNotifier(0), connectWriteNotifier(0), connecting(false), -- cgit v1.2.3 From d85171d34a28e53d416609fb0e60129f570463cf Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 27 Jan 2014 17:23:47 +0100 Subject: Refine documentation for QBluetoothSocket::localXYZ() functions. Bluez never returns anything until the connection has been established. BlackBerry and the future Android port are much quicker. Change-Id: Ic465a9b68176e7fff5f0c88b4fb602f8665f7197 Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothsocket.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 9eaf6758..2f086d91 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -169,19 +169,30 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_QNX) \fn QString QBluetoothSocket::localName() const Returns the name of the local device. + + Although some platforms may differ the socket must generally be connected to guarantee + the return of a valid name. In particular, this is true when dealing with platforms + that support multiple local Bluetooth adapters. */ /*! \fn QBluetoothAddress QBluetoothSocket::localAddress() const Returns the address of the local device. + + Although some platforms may differ the socket must generally be connected to guarantee + the return of a valid address. In particular, this is true when dealing with platforms + that support multiple local Bluetooth adapters. */ /*! \fn quint16 QBluetoothSocket::localPort() const Returns the port number of the local socket if available, otherwise returns 0. - On BlackBerry, this feature is not supported and returns 0. + Although some platforms may differ the socket must generally be connected to guarantee + the return of a valid port number. + + On BlackBerry, this feature is not supported at all and the function always returns 0. */ /*! -- cgit v1.2.3 From 7f6c59623c535fcd2075464e3870e9897c3f5f2b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 27 Jan 2014 17:36:14 +0100 Subject: Don't cache the QBluetoothSocket::localName() & peerName() This affects Bluez only. The other platforms don't use this feature. The problem was triggered when connecting, disconnecting and connecting again to another device. localName() might change due to a different local Bluetooth adapter being used and peerName() is different anyway in such cases. Change-Id: I8983a355832cf4f4d9a654971c54f5624be288e6 Reviewed-by: Fabian Bumberger Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothsocket_bluez.cpp | 14 ++------------ src/bluetooth/qbluetoothsocket_p.h | 2 -- src/bluetooth/qbluetoothsocket_qnx.cpp | 2 +- 3 files changed, 3 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index d12acf7c..bb8e9685 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -266,9 +266,6 @@ void QBluetoothSocketPrivate::abort() QString QBluetoothSocketPrivate::localName() const { - if (!m_localName.isEmpty()) - return m_localName; - const QBluetoothAddress address = localAddress(); if (address.isNull()) return QString(); @@ -289,9 +286,7 @@ QString QBluetoothSocketPrivate::localName() const if (properties.isError()) return QString(); - m_localName = properties.value().value(QLatin1String("Name")).toString(); - - return m_localName; + return properties.value().value(QLatin1String("Name")).toString(); } QBluetoothAddress QBluetoothSocketPrivate::localAddress() const @@ -340,9 +335,6 @@ quint16 QBluetoothSocketPrivate::localPort() const QString QBluetoothSocketPrivate::peerName() const { - if (!m_peerName.isEmpty()) - return m_peerName; - quint64 bdaddr; if (socketType == QBluetoothServiceInfo::RfcommProtocol) { @@ -400,9 +392,7 @@ QString QBluetoothSocketPrivate::peerName() const if (properties.isError()) return QString(); - m_peerName = properties.value().value(QLatin1String("Alias")).toString(); - - return m_peerName; + return properties.value().value(QLatin1String("Alias")).toString(); } QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 92712911..08a6ec86 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -150,8 +150,6 @@ protected: QBluetoothSocket *q_ptr; private: - mutable QString m_localName; - mutable QString m_peerName; #ifdef QT_QNX_BLUETOOTH QBluetoothAddress m_peerAddress; QBluetoothUuid m_uuid; diff --git a/src/bluetooth/qbluetoothsocket_qnx.cpp b/src/bluetooth/qbluetoothsocket_qnx.cpp index 6c87011b..0be90ec9 100644 --- a/src/bluetooth/qbluetoothsocket_qnx.cpp +++ b/src/bluetooth/qbluetoothsocket_qnx.cpp @@ -195,7 +195,7 @@ quint16 QBluetoothSocketPrivate::localPort() const QString QBluetoothSocketPrivate::peerName() const { - return m_peerName; + return QString(); } QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const -- cgit v1.2.3 From 039982cfa41515fbf559a4e3645aab14f77ee447 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 28 Jan 2014 10:13:28 +0100 Subject: Synchronize setting of QBluetoothSocket's error string, code and signal This fixes a few cases where errorString, error signal and error code where out of sync because one was set but not the other. This was addressed by unifying the usage pattern for error activation to a pattern where errorString is set and setSocketError() is called afterwards. Change-Id: Ibfb04772cf560936aa4ce8ea9643d6a410cc9ee2 Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothsocket.cpp | 9 ++++++--- src/bluetooth/qbluetoothsocket_bluez.cpp | 14 +++++++------- src/bluetooth/qbluetoothsocket_qnx.cpp | 20 +++++++++----------- 3 files changed, 22 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 2f086d91..2f2660d0 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -319,13 +319,15 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op #else if (service.protocolServiceMultiplexer() > 0) { if (!d->ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) { - emit error(UnknownSocketError); + 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)) { - emit error(UnknownSocketError); + d->errorString = tr("Unknown socket error"); + setSocketError(UnknownSocketError); return; } d->connectToService(service.device().address(), service.serverChannel(), openMode); @@ -544,7 +546,8 @@ void QBluetoothSocket::discoveryFinished() Q_D(QBluetoothSocket); if (d->discoveryAgent){ qCDebug(QT_BT) << "Didn't find any"; - emit error(QBluetoothSocket::ServiceNotFoundError); + d->errorString = tr("Service cannot be found"); + setSocketError(ServiceNotFoundError); d->discoveryAgent->deleteLater(); d->discoveryAgent = 0; } diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index bb8e9685..2b1eee9e 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -180,7 +180,7 @@ void QBluetoothSocketPrivate::_q_writeNotify() ::getsockopt(socket, SOL_SOCKET, SO_ERROR, &errorno, (socklen_t*)&len); if(errorno) { errorString = QString::fromLocal8Bit(strerror(errorno)); - emit q->error(QBluetoothSocket::UnknownSocketError); + q->setSocketError(QBluetoothSocket::UnknownSocketError); return; } @@ -201,8 +201,8 @@ void QBluetoothSocketPrivate::_q_writeNotify() int size = txBuffer.read(buf, 1024); if (::write(socket, buf, size) != size) { - socketError = QBluetoothSocket::NetworkError; - emit q->error(socketError); + errorString = QBluetoothSocket::tr("Network error"); + q->setSocketError(QBluetoothSocket::NetworkError); } else { emit q->bytesWritten(size); @@ -233,9 +233,9 @@ void QBluetoothSocketPrivate::_q_readNotify() errorString = QString::fromLocal8Bit(strerror(errsv)); qCWarning(QT_BT_BLUEZ) << Q_FUNC_INFO << socket << "error:" << readFromDevice << errorString; if(errsv == EHOSTDOWN) - emit q->error(QBluetoothSocket::HostNotFoundError); + q->setSocketError(QBluetoothSocket::HostNotFoundError); else - emit q->error(QBluetoothSocket::UnknownSocketError); + q->setSocketError(QBluetoothSocket::UnknownSocketError); q->disconnectFromService(); q->setSocketState(QBluetoothSocket::UnconnectedState); @@ -444,8 +444,8 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) Q_Q(QBluetoothSocket); if (q->openMode() & QIODevice::Unbuffered) { if (::write(socket, data, maxSize) != maxSize) { - socketError = QBluetoothSocket::NetworkError; - emit q->error(socketError); + errorString = QBluetoothSocket::tr("Network error"); + q->setSocketError(QBluetoothSocket::NetworkError); } emit q->bytesWritten(maxSize); diff --git a/src/bluetooth/qbluetoothsocket_qnx.cpp b/src/bluetooth/qbluetoothsocket_qnx.cpp index 0be90ec9..90f90178 100644 --- a/src/bluetooth/qbluetoothsocket_qnx.cpp +++ b/src/bluetooth/qbluetoothsocket_qnx.cpp @@ -118,8 +118,8 @@ void QBluetoothSocketPrivate::_q_writeNotify() int size = txBuffer.read(buf, 1024); if (::write(socket, buf, size) != size) { - socketError = QBluetoothSocket::NetworkError; - emit q->error(socketError); + errorString = QBluetoothSocket::tr("Network Error"); + q->setSocketError(QBluetoothSocket::NetworkError); } else { emit q->bytesWritten(size); @@ -144,9 +144,9 @@ void QBluetoothSocketPrivate::_q_readNotify() int errsv = errno; readNotifier->setEnabled(false); connectWriteNotifier->setEnabled(false); - errorString = QString::fromLocal8Bit(strerror(errsv)); qCWarning(QT_BT_QNX) << Q_FUNC_INFO << socket << " error:" << readFromDevice << errorString; //TODO Try if this actually works - emit q->error(QBluetoothSocket::UnknownSocketError); + errorString = QString::fromLocal8Bit(strerror(errsv)); + q->setSocketError(QBluetoothSocket::UnknownSocketError); q->disconnectFromService(); q->setSocketState(QBluetoothSocket::UnconnectedState); @@ -213,9 +213,9 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) Q_Q(QBluetoothSocket); if (q->openMode() & QIODevice::Unbuffered) { if (::write(socket, data, maxSize) != maxSize) { - socketError = QBluetoothSocket::NetworkError; + errorString = QBluetoothSocket::tr("Network Error"); + q->setSocketError(QBluetoothSocket::NetworkError); qCWarning(QT_BT_QNX) << Q_FUNC_INFO << "Socket error"; - Q_EMIT q->error(socketError); } Q_EMIT q->bytesWritten(maxSize); @@ -303,8 +303,7 @@ void QBluetoothSocketPrivate::controlReply(ppsResult result) if (!result.errorMsg.isEmpty()) { qCWarning(QT_BT_QNX) << Q_FUNC_INFO << "Error connecting to service:" << result.errorMsg; errorString = result.errorMsg; - socketError = QBluetoothSocket::UnknownSocketError; - emit q->error(QBluetoothSocket::UnknownSocketError); + q->setSocketError(QBluetoothSocket::UnknownSocketError); q->setSocketState(QBluetoothSocket::UnconnectedState); return; } else { @@ -319,8 +318,7 @@ void QBluetoothSocketPrivate::controlReply(ppsResult result) if (!result.errorMsg.isEmpty()) { qCWarning(QT_BT_QNX) << Q_FUNC_INFO << result.errorMsg; errorString = result.errorMsg; - socketError = QBluetoothSocket::UnknownSocketError; - emit q->error(QBluetoothSocket::UnknownSocketError); + q->setSocketError(QBluetoothSocket::UnknownSocketError); q->setSocketState(QBluetoothSocket::UnconnectedState); return; } else { @@ -328,8 +326,8 @@ void QBluetoothSocketPrivate::controlReply(ppsResult result) socket = ::open(path.toStdString().c_str(), O_RDWR); if (socket == -1) { errorString = QString::fromLocal8Bit(strerror(errno)); + q->setSocketError(QBluetoothSocket::UnknownSocketError); qCWarning(QT_BT_QNX) << Q_FUNC_INFO << socket << " error:" << errno << errorString; //TODO Try if this actually works - emit q->error(QBluetoothSocket::UnknownSocketError); q->disconnectFromService(); q->setSocketState(QBluetoothSocket::UnconnectedState); -- cgit v1.2.3 From 7d4f4c3083d565af00f1564ae80e5cbfbc338bd5 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 29 Jan 2014 10:18:26 +0100 Subject: Use qt_error_string rather than strerror. Change-Id: Ide3f00cacd7a42e99823441a45609f8e50063fce Reviewed-by: Fabian Bumberger --- src/bluetooth/qbluetoothserver_bluez.cpp | 8 ++++---- src/bluetooth/qbluetoothsocket_bluez.cpp | 6 +++--- src/bluetooth/qbluetoothsocket_qnx.cpp | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothserver_bluez.cpp b/src/bluetooth/qbluetoothserver_bluez.cpp index cf50d140..0b504d9a 100644 --- a/src/bluetooth/qbluetoothserver_bluez.cpp +++ b/src/bluetooth/qbluetoothserver_bluez.cpp @@ -257,7 +257,7 @@ void QBluetoothServer::setSecurityFlags(QBluetooth::SecurityFlags security) if (setsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0){ qCWarning(QT_BT_BLUEZ) << "Failed to set socket option, closing socket for safety" << errno; - qCWarning(QT_BT_BLUEZ) << "Error: " << strerror(errno); + qCWarning(QT_BT_BLUEZ) << "Error: " << qt_error_string(errno); d->m_lastError = InputOutputError; emit error(d->m_lastError); d->socket->close(); @@ -274,7 +274,7 @@ void QBluetoothServer::setSecurityFlags(QBluetooth::SecurityFlags security) if (setsockopt(d->socket->socketDescriptor(), SOL_L2CAP, L2CAP_LM, &lm, sizeof(lm)) < 0){ qCWarning(QT_BT_BLUEZ) << "Failed to set socket option, closing socket for safety" << errno; - qCWarning(QT_BT_BLUEZ) << "Error: " << strerror(errno); + qCWarning(QT_BT_BLUEZ) << "Error: " << qt_error_string(errno); d->m_lastError = InputOutputError; emit error(d->m_lastError); d->socket->close(); @@ -293,7 +293,7 @@ QBluetooth::SecurityFlags QBluetoothServer::securityFlags() const if (d->serverType == QBluetoothServiceInfo::RfcommProtocol) { if (getsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, (socklen_t *)&len) < 0) { - qCWarning(QT_BT_BLUEZ) << "Failed to get security flags" << strerror(errno); + qCWarning(QT_BT_BLUEZ) << "Failed to get security flags" << qt_error_string(errno); return QBluetooth::NoSecurity; } @@ -310,7 +310,7 @@ QBluetooth::SecurityFlags QBluetoothServer::securityFlags() const security |= QBluetooth::Authorization; } else { if (getsockopt(d->socket->socketDescriptor(), SOL_L2CAP, L2CAP_LM, &lm, (socklen_t *)&len) < 0) { - qCWarning(QT_BT_BLUEZ) << "Failed to get security flags" << strerror(errno); + qCWarning(QT_BT_BLUEZ) << "Failed to get security flags" << qt_error_string(errno); return QBluetooth::NoSecurity; } diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 2b1eee9e..24879d11 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -166,7 +166,7 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, connecting = true; q->setSocketState(QBluetoothSocket::ConnectingState); } else { - errorString = QString::fromLocal8Bit(strerror(errno)); + errorString = qt_error_string(errno); q->setSocketError(QBluetoothSocket::UnknownSocketError); } } @@ -179,7 +179,7 @@ void QBluetoothSocketPrivate::_q_writeNotify() len = sizeof(errorno); ::getsockopt(socket, SOL_SOCKET, SO_ERROR, &errorno, (socklen_t*)&len); if(errorno) { - errorString = QString::fromLocal8Bit(strerror(errorno)); + errorString = qt_error_string(errorno); q->setSocketError(QBluetoothSocket::UnknownSocketError); return; } @@ -230,7 +230,7 @@ void QBluetoothSocketPrivate::_q_readNotify() int errsv = errno; readNotifier->setEnabled(false); connectWriteNotifier->setEnabled(false); - errorString = QString::fromLocal8Bit(strerror(errsv)); + errorString = qt_error_string(errsv); qCWarning(QT_BT_BLUEZ) << Q_FUNC_INFO << socket << "error:" << readFromDevice << errorString; if(errsv == EHOSTDOWN) q->setSocketError(QBluetoothSocket::HostNotFoundError); diff --git a/src/bluetooth/qbluetoothsocket_qnx.cpp b/src/bluetooth/qbluetoothsocket_qnx.cpp index 90f90178..fc609919 100644 --- a/src/bluetooth/qbluetoothsocket_qnx.cpp +++ b/src/bluetooth/qbluetoothsocket_qnx.cpp @@ -145,7 +145,7 @@ void QBluetoothSocketPrivate::_q_readNotify() readNotifier->setEnabled(false); connectWriteNotifier->setEnabled(false); qCWarning(QT_BT_QNX) << Q_FUNC_INFO << socket << " error:" << readFromDevice << errorString; //TODO Try if this actually works - errorString = QString::fromLocal8Bit(strerror(errsv)); + errorString = qt_error_string(errsv); q->setSocketError(QBluetoothSocket::UnknownSocketError); q->disconnectFromService(); @@ -325,7 +325,7 @@ void QBluetoothSocketPrivate::controlReply(ppsResult result) qCDebug(QT_BT_QNX) << "Mount point path is:" << path; socket = ::open(path.toStdString().c_str(), O_RDWR); if (socket == -1) { - errorString = QString::fromLocal8Bit(strerror(errno)); + errorString = qt_error_string(errno); q->setSocketError(QBluetoothSocket::UnknownSocketError); qCWarning(QT_BT_QNX) << Q_FUNC_INFO << socket << " error:" << errno << errorString; //TODO Try if this actually works -- cgit v1.2.3