winrt: Register callbacks in Xaml thread

Change-Id: Ib32af0803e95229a1671055da4d5608f3fd3e0f6
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
This commit is contained in:
Oliver Wolff 2017-02-02 15:14:11 +01:00
parent 69c8d41f90
commit f07c94c003
2 changed files with 26 additions and 14 deletions

View File

@ -43,6 +43,7 @@
#include "qbluetoothsocket_p.h"
#include <QtCore/QLoggingCategory>
#include <QtCore/private/qeventdispatcher_winrt_p.h>
#include <qfunctions_winrt.h>
#include <windows.networking.h>
@ -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<ClientConnectedHandler>(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<ClientConnectedHandler>(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

View File

@ -167,15 +167,21 @@ public slots:
public:
void startReading()
{
ComPtr<IBuffer> buffer;
HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer);
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IInputStream> 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<SocketReadCompletedHandler>(this, &SocketWorker::onReadyRead).Get());
HRESULT hr;
hr = QEventDispatcherWinRT::runOnXamlThread([this]()
{
ComPtr<IBuffer> buffer;
HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer);
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IInputStream> 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<SocketReadCompletedHandler>(this, &SocketWorker::onReadyRead).Get());
Q_ASSERT_SUCCEEDED(hr);
return S_OK;
});
Q_ASSERT_SUCCEEDED(hr);
}