From f07c94c0037a2e9a51b8177edb757063206e00cc Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 2 Feb 2017 15:14:11 +0100 Subject: winrt: Register callbacks in Xaml thread Change-Id: Ib32af0803e95229a1671055da4d5608f3fd3e0f6 Reviewed-by: Maurice Kalinowski --- src/bluetooth/qbluetoothserver_winrt.cpp | 16 +++++++++++----- src/bluetooth/qbluetoothsocket_winrt.cpp | 24 +++++++++++++++--------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/bluetooth/qbluetoothserver_winrt.cpp b/src/bluetooth/qbluetoothserver_winrt.cpp index 28ab7e53..d37fc9e3 100644 --- a/src/bluetooth/qbluetoothserver_winrt.cpp +++ b/src/bluetooth/qbluetoothserver_winrt.cpp @@ -43,6 +43,7 @@ #include "qbluetoothsocket_p.h" #include +#include #include #include @@ -156,11 +157,16 @@ bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port) return false; HRESULT hr; - hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocketListener).Get(), - &d->socketListener); - Q_ASSERT_SUCCEEDED(hr); - hr = d->socketListener->add_ConnectionReceived(Callback(d, &QBluetoothServerPrivate::handleClientConnection).Get(), - &d->connectionToken); + hr = QEventDispatcherWinRT::runOnXamlThread([d, this] () + { + HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocketListener).Get(), + &d->socketListener); + Q_ASSERT_SUCCEEDED(hr); + hr = d->socketListener->add_ConnectionReceived(Callback(d, &QBluetoothServerPrivate::handleClientConnection).Get(), + &d->connectionToken); + Q_ASSERT_SUCCEEDED(hr); + return S_OK; + }); Q_ASSERT_SUCCEEDED(hr); //We can not register an actual Rfcomm port, because the platform does not allow it diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 855af16d..fb0587cc 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -167,15 +167,21 @@ public slots: public: void startReading() { - ComPtr buffer; - HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); - Q_ASSERT_SUCCEEDED(hr); - ComPtr stream; - hr = m_socket->get_InputStream(&stream); - Q_ASSERT_SUCCEEDED(hr); - hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, m_initialReadOp.GetAddressOf()); - Q_ASSERT_SUCCEEDED(hr); - hr = m_initialReadOp->put_Completed(Callback(this, &SocketWorker::onReadyRead).Get()); + HRESULT hr; + hr = QEventDispatcherWinRT::runOnXamlThread([this]() + { + ComPtr buffer; + HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); + Q_ASSERT_SUCCEEDED(hr); + ComPtr stream; + hr = m_socket->get_InputStream(&stream); + Q_ASSERT_SUCCEEDED(hr); + hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, m_initialReadOp.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); + hr = m_initialReadOp->put_Completed(Callback(this, &SocketWorker::onReadyRead).Get()); + Q_ASSERT_SUCCEEDED(hr); + return S_OK; + }); Q_ASSERT_SUCCEEDED(hr); } -- cgit v1.2.3