summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@qt.io>2018-08-01 12:48:32 +0200
committerAlex Blasche <alexander.blasche@qt.io>2018-08-09 08:55:08 +0000
commit45c843ceca9fac1aa1246043730eaeeb3ed23235 (patch)
tree81e7e35b768ffa5443a3477fb4943df9f7fc5ec1 /src
parent80bea1f32b92c70c21c96762e31c726cb49e180f (diff)
Shift close/abort signaling from QBluetoothSocket to private implementations
The private implementation can much more easily determine whether the socket closure is already done or not. On Bluez DBus, this avoids disconnected() being emitted twice. Another platform that is still delayed is Android. The patch permits the removal of Android specific ifdefs. Last but not least the patch cleans up missing signals in WinRT. Task-number: QTBUG-68550 Change-Id: I189e1dbc9f6d410522da1a82113fdf4fe79a4cbd Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/bluetooth/qbluetoothsocket.cpp15
-rw-r--r--src/bluetooth/qbluetoothsocket_android.cpp3
-rw-r--r--src/bluetooth/qbluetoothsocket_bluezdbus.cpp11
-rw-r--r--src/bluetooth/qbluetoothsocket_winrt.cpp16
-rw-r--r--src/bluetooth/qbluetoothsocket_winrt_p.h2
5 files changed, 28 insertions, 19 deletions
diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp
index 4bd59095..36e4a54c 100644
--- a/src/bluetooth/qbluetoothsocket.cpp
+++ b/src/bluetooth/qbluetoothsocket.cpp
@@ -639,13 +639,6 @@ void QBluetoothSocket::abort()
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()
@@ -725,14 +718,6 @@ void QBluetoothSocket::close()
setSocketState(ClosingState);
d->close();
-
-#ifndef QT_ANDROID_BLUETOOTH
- // TODO Add return type to d->close() & d->abort() to detect when to emit below signals
- //Android closes when the Java event loop comes around
- setSocketState(UnconnectedState);
- emit readChannelFinished();
- emit disconnected();
-#endif
}
/*!
diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp
index 9047bb31..5d0bf5fd 100644
--- a/src/bluetooth/qbluetoothsocket_android.cpp
+++ b/src/bluetooth/qbluetoothsocket_android.cpp
@@ -715,6 +715,9 @@ void QBluetoothSocketPrivateAndroid::abort()
// Unconnected (now) in advance
Q_Q(QBluetoothSocket);
q->setSocketState(QBluetoothSocket::UnconnectedState);
+ q->setOpenMode(QIODevice::NotOpen);
+ emit q->readChannelFinished();
+ emit q->disconnected();
}
}
}
diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp
index 52193a1a..e9c47df8 100644
--- a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp
+++ b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp
@@ -337,10 +337,15 @@ void QBluetoothSocketPrivateBluezDBus::abort()
{
if (localSocket) {
localSocket->close();
- //TODO delayed disconnected() not yet implemented
+ // delayed disconnected signal emission when localSocket closes
} else {
- // delayed disconnected not needed
+ Q_Q(QBluetoothSocket);
+
clearSocket();
+ q->setOpenMode(QIODevice::NotOpen);
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
+ emit q->readChannelFinished();
+ emit q->disconnected();
}
}
@@ -551,7 +556,7 @@ void QBluetoothSocketPrivateBluezDBus::socketStateChanged(QLocalSocket::LocalSoc
case QLocalSocket::UnconnectedState:
clearSocket();
q->setSocketState(QBluetoothSocket::UnconnectedState);
-
+ q->setOpenMode(QIODevice::NotOpen);
emit q->readChannelFinished();
emit q->disconnected();
break;
diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp
index 556d9fc5..f985952a 100644
--- a/src/bluetooth/qbluetoothsocket_winrt.cpp
+++ b/src/bluetooth/qbluetoothsocket_winrt.cpp
@@ -393,7 +393,7 @@ void QBluetoothSocketPrivateWinRT::connectToServiceHelper(const QBluetoothAddres
Q_ASSERT_SUCCEEDED(hr);
q->setSocketState(QBluetoothSocket::ConnectingState);
- q->setOpenMode(openMode);
+ requestedOpenMode = openMode;
QEventDispatcherWinRT::runOnXamlThread([this]() {
HRESULT hr;
hr = m_connectOp->put_Completed(Callback<IAsyncActionCompletedHandler>(
@@ -517,7 +517,14 @@ void QBluetoothSocketPrivateWinRT::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();
+ emit q->disconnected();
+ }
}
QString QBluetoothSocketPrivateWinRT::localName() const
@@ -727,7 +734,13 @@ void QBluetoothSocketPrivateWinRT::handleError(QBluetoothSocket::SocketError err
}
q->setSocketError(error);
+ const bool wasConnected = q->state() == QBluetoothSocket::ConnectedState;
q->setSocketState(QBluetoothSocket::UnconnectedState);
+ if (wasConnected) {
+ q->setOpenMode(QIODevice::NotOpen);
+ emit q->readChannelFinished();
+ emit q->disconnected();
+ }
}
void QBluetoothSocketPrivateWinRT::addToPendingData(const QVector<QByteArray> &data)
@@ -794,6 +807,7 @@ HRESULT QBluetoothSocketPrivateWinRT::handleConnectOpFinished(ABI::Windows::Foun
Q_ASSERT_SUCCEEDED(hr);
}
+ q->setOpenMode(requestedOpenMode);
q->setSocketState(QBluetoothSocket::ConnectedState);
m_worker->startReading();
emit q->connected();
diff --git a/src/bluetooth/qbluetoothsocket_winrt_p.h b/src/bluetooth/qbluetoothsocket_winrt_p.h
index 6a740206..40e87f01 100644
--- a/src/bluetooth/qbluetoothsocket_winrt_p.h
+++ b/src/bluetooth/qbluetoothsocket_winrt_p.h
@@ -127,6 +127,8 @@ private slots:
private:
HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action,
ABI::Windows::Foundation::AsyncStatus status);
+
+ QIODevice::OpenMode requestedOpenMode = QIODevice::NotOpen;
};
QT_END_NAMESPACE