summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp61
1 files changed, 32 insertions, 29 deletions
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp
index 21c5dc607a..c5281ee9c5 100644
--- a/src/network/socket/qnativesocketengine_winrt.cpp
+++ b/src/network/socket/qnativesocketengine_winrt.cpp
@@ -239,7 +239,8 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::
close();
// Currently, only TCP sockets are initialized this way.
- d->socketDescriptor = qintptr(gSocketHandler->pendingTcpSockets.take(socketDescriptor));
+ IStreamSocket *socket = gSocketHandler->pendingTcpSockets.take(socketDescriptor);
+ d->socketDescriptor = qintptr(socket);
d->socketType = QAbstractSocket::TcpSocket;
if (!d->socketDescriptor || !d->fetchConnectionParameters()) {
@@ -249,6 +250,36 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::
return false;
}
+ // Start processing incoming data
+ if (d->socketType == QAbstractSocket::TcpSocket) {
+ HRESULT hr;
+ hr = QEventDispatcherWinRT::runOnXamlThread([d, socket, this]() {
+ ComPtr<IBuffer> buffer;
+ HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer);
+ RETURN_HR_IF_FAILED("initialize(): Could not create buffer");
+
+ ComPtr<IInputStream> stream;
+ hr = socket->get_InputStream(&stream);
+ RETURN_HR_IF_FAILED("initialize(): Could not obtain input stream");
+ hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, d->readOp.GetAddressOf());
+ if (FAILED(hr)) {
+ qErrnoWarning(hr, "initialize(): Failed to read from the socket buffer (%s).",
+ socketDescription(this).constData());
+ return E_FAIL;
+ }
+ hr = d->readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get());
+ if (FAILED(hr)) {
+ qErrnoWarning(hr, "initialize(): Failed to set socket read callback (%s).",
+ socketDescription(this).constData());
+ return E_FAIL;
+ }
+ return S_OK;
+ });
+ if (hr == E_FAIL)
+ return false;
+ Q_ASSERT_SUCCEEDED(hr);
+ }
+
d->socketState = socketState;
return true;
}
@@ -390,37 +421,9 @@ int QNativeSocketEngine::accept()
return -1;
}
- // Start processing incoming data
if (d->socketType == QAbstractSocket::TcpSocket) {
IStreamSocket *socket = d->pendingConnections.takeFirst();
- HRESULT hr;
- hr = QEventDispatcherWinRT::runOnXamlThread([d, socket, this]() {
- ComPtr<IBuffer> buffer;
- HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer);
- RETURN_HR_IF_FAILED("accept(): Could not create buffer");
- ComPtr<IInputStream> stream;
- hr = socket->get_InputStream(&stream);
- RETURN_HR_IF_FAILED("accept(): Could not obtain input stream");
- hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, &d->readOp);
- if (FAILED(hr)) {
- qErrnoWarning(hr, "accept(): Failed to read from the socket buffer (%s).",
- socketDescription(this).constData());
- return E_FAIL;
- }
- hr = d->readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get());
- if (FAILED(hr)) {
- qErrnoWarning(hr, "accept(): Failed to set socket read callback (%s).",
- socketDescription(this).constData());
- return E_FAIL;
- }
- return S_OK;
- });
- if (hr == E_FAIL)
- return -1;
- Q_ASSERT_SUCCEEDED(hr);
- d->currentConnections.append(socket);
-
SocketHandler *handler = gSocketHandler();
handler->pendingTcpSockets.insert(++handler->socketCount, socket);
return handler->socketCount;