From e996d68f6130847637ba287518cff1289cfa48e5 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Fri, 6 Nov 2015 14:22:44 +1000 Subject: Make UnknownAccessibility not block requests This allows requests to proceed without needing bearer plugins. Task-number: QTBUG-49267 Change-Id: Ie5ce188ddefebd14d666bb5846e8f93ee2925ed1 Reviewed-by: Markus Goetz (Woboq GmbH) --- src/network/access/qnetworkaccessmanager.cpp | 3 +-- src/network/access/qnetworkaccessmanager_p.h | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'src/network') diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 086140f967..0e5870a235 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -976,7 +976,6 @@ QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccess else return NotAccessible; } else { - // Network accessibility is either disabled or unknown. if (d->defaultAccessControl) { if (d->online) return d->networkAccessible; @@ -1161,7 +1160,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera #ifndef QT_NO_BEARERMANAGEMENT // Return a disabled network reply if network access is disabled. // Except if the scheme is empty or file://. - if (!d->networkAccessible && !isLocalFile) { + if (d->networkAccessible == NotAccessible && !isLocalFile) { return new QDisabledNetworkReply(this, req, op); } diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index 54ae114581..3fc33b5c15 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -93,6 +93,8 @@ public: online = (networkConfiguration.state().testFlag(QNetworkConfiguration::Active)); if (online) networkAccessible = QNetworkAccessManager::Accessible; + else if (networkConfiguration.state().testFlag(QNetworkConfiguration::Undefined)) + networkAccessible = QNetworkAccessManager::UnknownAccessibility; else networkAccessible = QNetworkAccessManager::NotAccessible; #endif -- cgit v1.2.3 From 9ffbc139d1b9ca780ca44ac1522d4bec624923c3 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Sun, 8 Nov 2015 23:26:43 +0200 Subject: QNativeSocketEngine: fix build in debug mode under Unix Change-Id: I197e4853cd3ddd7543bbdb12cecc19c0ed2c9ee2 Reviewed-by: Thiago Macieira --- src/network/socket/qnativesocketengine_unix.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/network') diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index f1845f31f3..8626a6be0f 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -921,8 +921,10 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxS #if defined (QNATIVESOCKETENGINE_DEBUG) qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli", data, qt_prettyDebug(data, qMin(recvResult, ssize_t(16)), recvResult).data(), maxSize, - address ? address->toString().toLatin1().constData() : "(nil)", - port ? *port : 0, (qint64) recvResult); + (recvResult != -1 && options != QAbstractSocketEngine::WantNone) + ? header->senderAddress.toString().toLatin1().constData() : "(unknown)", + (recvResult != -1 && options != QAbstractSocketEngine::WantNone) + ? header->senderPort : 0, (qint64) recvResult); #endif return qint64(maxSize ? recvResult : recvResult == -1 ? -1 : 0); @@ -1018,8 +1020,9 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l #if defined (QNATIVESOCKETENGINE_DEBUG) qDebug("QNativeSocketEngine::sendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data, - qt_prettyDebug(data, qMin(len, 16), len).data(), len, host.toString().toLatin1().constData(), - port, (qint64) sentBytes); + qt_prettyDebug(data, qMin(len, 16), len).data(), len, + header.destinationAddress.toString().toLatin1().constData(), + header.destinationPort, (qint64) sentBytes); #endif return qint64(sentBytes); -- cgit v1.2.3 From 702a98bfb0196c299de047e7f635f0a912b9bb6a Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 29 Oct 2015 10:17:18 +0100 Subject: winrt: Also list current profile in QNetworkInterface::allInterfaces GetConnectionProfiles does not list the current profile, so "allInterfaces" also has to use GetInternetConnectionProfile. Task-number: QTBUG-49121 Change-Id: I80a3ea1bfddfe502c84376ca90a7e1fe5d3020c3 Reviewed-by: Samuel Nevala Reviewed-by: Andrew Knight --- src/network/kernel/qnetworkinterface_winrt.cpp | 146 ++++++++++++++++--------- 1 file changed, 94 insertions(+), 52 deletions(-) (limited to 'src/network') diff --git a/src/network/kernel/qnetworkinterface_winrt.cpp b/src/network/kernel/qnetworkinterface_winrt.cpp index 0234154427..6791caaf21 100644 --- a/src/network/kernel/qnetworkinterface_winrt.cpp +++ b/src/network/kernel/qnetworkinterface_winrt.cpp @@ -36,6 +36,8 @@ #ifndef QT_NO_NETWORKINTERFACE +#include + #include #include #include @@ -59,6 +61,54 @@ struct HostNameInfo { QString address; }; +static QNetworkInterfacePrivate *interfaceFromProfile(IConnectionProfile *profile, QList *hostList) +{ + if (!profile) + return 0; + + QNetworkInterfacePrivate *iface = new QNetworkInterfacePrivate; + + NetworkConnectivityLevel connectivityLevel; + HRESULT hr = profile->GetNetworkConnectivityLevel(&connectivityLevel); + Q_ASSERT_SUCCEEDED(hr); + if (connectivityLevel != NetworkConnectivityLevel_None) + iface->flags = QNetworkInterface::IsUp | QNetworkInterface::IsRunning; + + ComPtr adapter; + hr = profile->get_NetworkAdapter(&adapter); + Q_ASSERT_SUCCEEDED(hr); + UINT32 type; + hr = adapter->get_IanaInterfaceType(&type); + Q_ASSERT_SUCCEEDED(hr); + if (type == 23) + iface->flags |= QNetworkInterface::IsPointToPoint; + GUID id; + hr = adapter->get_NetworkAdapterId(&id); + Q_ASSERT_SUCCEEDED(hr); + OLECHAR adapterName[39]={0}; + StringFromGUID2(id, adapterName, 39); + iface->name = QString::fromWCharArray(adapterName); + + // According to http://stackoverflow.com/questions/12936193/how-unique-is-the-ethernet-network-adapter-id-in-winrt-it-is-derived-from-the-m + // obtaining the MAC address using WinRT API is impossible + // iface->hardwareAddress = ? + + for (int i = 0; i < hostList->length(); ++i) { + const HostNameInfo hostInfo = hostList->at(i); + if (id != hostInfo.adapterId) + continue; + + QNetworkAddressEntry entry; + entry.setIp(QHostAddress(hostInfo.address)); + entry.setPrefixLength(hostInfo.prefixLength); + iface->addressEntries << entry; + + hostList->takeAt(i); + --i; + } + return iface; +} + static QList interfaceListing() { QList interfaces; @@ -66,36 +116,46 @@ static QList interfaceListing() QList hostList; ComPtr hostNameStatics; - GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &hostNameStatics); + HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &hostNameStatics); + Q_ASSERT_SUCCEEDED(hr); ComPtr> hostNames; - hostNameStatics->GetHostNames(&hostNames); + hr = hostNameStatics->GetHostNames(&hostNames); + Q_ASSERT_SUCCEEDED(hr); if (!hostNames) return interfaces; unsigned int hostNameCount; - hostNames->get_Size(&hostNameCount); + hr = hostNames->get_Size(&hostNameCount); + Q_ASSERT_SUCCEEDED(hr); for (unsigned i = 0; i < hostNameCount; ++i) { HostNameInfo hostInfo; ComPtr hostName; - hostNames->GetAt(i, &hostName); + hr = hostNames->GetAt(i, &hostName); + Q_ASSERT_SUCCEEDED(hr); HostNameType type; - hostName->get_Type(&type); + hr = hostName->get_Type(&type); + Q_ASSERT_SUCCEEDED(hr); if (type == HostNameType_DomainName) continue; ComPtr ipInformation; - hostName->get_IPInformation(&ipInformation); + hr = hostName->get_IPInformation(&ipInformation); + Q_ASSERT_SUCCEEDED(hr); ComPtr currentAdapter; - ipInformation->get_NetworkAdapter(¤tAdapter); + hr = ipInformation->get_NetworkAdapter(¤tAdapter); + Q_ASSERT_SUCCEEDED(hr); - currentAdapter->get_NetworkAdapterId(&hostInfo.adapterId); + hr = currentAdapter->get_NetworkAdapterId(&hostInfo.adapterId); + Q_ASSERT_SUCCEEDED(hr); ComPtr> prefixLengthReference; - ipInformation->get_PrefixLength(&prefixLengthReference); + hr = ipInformation->get_PrefixLength(&prefixLengthReference); + Q_ASSERT_SUCCEEDED(hr); - prefixLengthReference->get_Value(&hostInfo.prefixLength); + hr = prefixLengthReference->get_Value(&hostInfo.prefixLength); + Q_ASSERT_SUCCEEDED(hr); // invalid prefixes if ((type == HostNameType_Ipv4 && hostInfo.prefixLength > 32) @@ -103,7 +163,8 @@ static QList interfaceListing() continue; HString name; - hostName->get_CanonicalName(name.GetAddressOf()); + hr = hostName->get_CanonicalName(name.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); UINT32 length; PCWSTR rawString = name.GetRawBuffer(&length); hostInfo.address = QString::fromWCharArray(rawString, length); @@ -112,54 +173,35 @@ static QList interfaceListing() } INetworkInformationStatics *networkInfoStatics; - GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &networkInfoStatics); + hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &networkInfoStatics); + Q_ASSERT_SUCCEEDED(hr); + ComPtr connectionProfile; + hr = networkInfoStatics->GetInternetConnectionProfile(&connectionProfile); + Q_ASSERT_SUCCEEDED(hr); + QNetworkInterfacePrivate *iface = interfaceFromProfile(connectionProfile.Get(), &hostList); + if (iface) { + iface->index = 0; + interfaces << iface; + } + ComPtr> connectionProfiles; - networkInfoStatics->GetConnectionProfiles(&connectionProfiles); + hr = networkInfoStatics->GetConnectionProfiles(&connectionProfiles); + Q_ASSERT_SUCCEEDED(hr); if (!connectionProfiles) return interfaces; unsigned int size; - connectionProfiles->get_Size(&size); + hr = connectionProfiles->get_Size(&size); + Q_ASSERT_SUCCEEDED(hr); for (unsigned int i = 0; i < size; ++i) { - QNetworkInterfacePrivate *iface = new QNetworkInterfacePrivate; - interfaces << iface; - ComPtr profile; - connectionProfiles->GetAt(i, &profile); - - NetworkConnectivityLevel connectivityLevel; - profile->GetNetworkConnectivityLevel(&connectivityLevel); - if (connectivityLevel != NetworkConnectivityLevel_None) - iface->flags = QNetworkInterface::IsUp | QNetworkInterface::IsRunning; - - ComPtr adapter; - profile->get_NetworkAdapter(&adapter); - UINT32 type; - adapter->get_IanaInterfaceType(&type); - if (type == 23) - iface->flags |= QNetworkInterface::IsPointToPoint; - GUID id; - adapter->get_NetworkAdapterId(&id); - OLECHAR adapterName[39]={0}; - StringFromGUID2(id, adapterName, 39); - iface->name = QString::fromWCharArray(adapterName); - - // According to http://stackoverflow.com/questions/12936193/how-unique-is-the-ethernet-network-adapter-id-in-winrt-it-is-derived-from-the-m - // obtaining the MAC address using WinRT API is impossible - // iface->hardwareAddress = ? - - for (int i = 0; i < hostList.length(); ++i) { - const HostNameInfo hostInfo = hostList.at(i); - if (id != hostInfo.adapterId) - continue; - - QNetworkAddressEntry entry; - entry.setIp(QHostAddress(hostInfo.address)); - entry.setPrefixLength(hostInfo.prefixLength); - iface->addressEntries << entry; - - hostList.takeAt(i); - --i; + hr = connectionProfiles->GetAt(i, &profile); + Q_ASSERT_SUCCEEDED(hr); + + iface = interfaceFromProfile(profile.Get(), &hostList); + if (iface) { + iface->index = i + 1; + interfaces << iface; } } return interfaces; -- cgit v1.2.3 From b91389fef0d3c850dad17eab762d5c873f29a64d Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 10 Nov 2015 08:48:57 +0100 Subject: winrt: Clean up QNativeSocketEngine WinRT/Windows Phone "coding guidelines" are now used for the native socket engine as well. - Whenever an operation is expected to succeed Q_ASSERT_SUCCEEDED is used. - QWinRTFunctions::await is used for waiting for async operations - Improved error handling Change-Id: I6c8d64731da5c94b911a5190231c7c8f68d9c261 Reviewed-by: Andrew Knight --- src/network/socket/qnativesocketengine_winrt.cpp | 222 ++++++++++++----------- 1 file changed, 112 insertions(+), 110 deletions(-) (limited to 'src/network') diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index d41bd4d313..cfb950592f 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -150,16 +150,10 @@ static AsyncStatus opStatus(const ComPtr &op) { ComPtr info; HRESULT hr = op.As(&info); - if (FAILED(hr)) { - qErrnoWarning(hr, "Failed to cast op to IAsyncInfo."); - return Error; - } + Q_ASSERT_SUCCEEDED(hr); AsyncStatus status; hr = info->get_Status(&status); - if (FAILED(hr)) { - qErrnoWarning(hr, "Failed to get AsyncStatus."); - return Error; - } + Q_ASSERT_SUCCEEDED(hr); return status; } @@ -265,25 +259,26 @@ bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port) Q_D(QNativeSocketEngine); HStringReference hostNameRef(reinterpret_cast(name.utf16())); ComPtr hostNameFactory; - GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), - &hostNameFactory); + HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), + &hostNameFactory); + Q_ASSERT_SUCCEEDED(hr); ComPtr remoteHost; - if (FAILED(hostNameFactory->CreateHostName(hostNameRef.Get(), &remoteHost))) { - qWarning("QNativeSocketEnginePrivate::nativeConnect:: Could not create hostname"); - return false; - } + hr = hostNameFactory->CreateHostName(hostNameRef.Get(), &remoteHost); + RETURN_FALSE_IF_FAILED("QNativeSocketEngine::connectToHostByName: Could not create hostname."); const QString portString = QString::number(port); HStringReference portReference(reinterpret_cast(portString.utf16())); - HRESULT hr = E_FAIL; if (d->socketType == QAbstractSocket::TcpSocket) hr = d->tcpSocket()->ConnectAsync(remoteHost.Get(), portReference.Get(), &d->connectOp); else if (d->socketType == QAbstractSocket::UdpSocket) hr = d->udpSocket()->ConnectAsync(remoteHost.Get(), portReference.Get(), &d->connectOp); - if (FAILED(hr)) { - qWarning("QNativeSocketEnginePrivate::nativeConnect:: Could not obtain connect action"); + if (hr == E_ACCESSDENIED) { + qErrnoWarning(hr, "QNativeSocketEngine::connectToHostByName: Unable to connect to host. \ + Please check your manifest capabilities."); return false; } + Q_ASSERT_SUCCEEDED(hr); + d->socketState = QAbstractSocket::ConnectingState; hr = d->connectOp->put_Completed(Callback( d, &QNativeSocketEnginePrivate::handleConnectToHost).Get()); @@ -295,68 +290,52 @@ bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port) bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port) { Q_D(QNativeSocketEngine); + HRESULT hr; ComPtr hostAddress; + if (address != QHostAddress::Any && address != QHostAddress::AnyIPv4 && address != QHostAddress::AnyIPv6) { ComPtr hostNameFactory; - GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), + hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), &hostNameFactory); + Q_ASSERT_SUCCEEDED(hr); const QString addressString = address.toString(); HStringReference addressRef(reinterpret_cast(addressString.utf16())); - hostNameFactory->CreateHostName(addressRef.Get(), &hostAddress); + hr = hostNameFactory->CreateHostName(addressRef.Get(), &hostAddress); + RETURN_FALSE_IF_FAILED("QNativeSocketEngine::bind: Could not create hostname."); } - HRESULT hr; QString portQString = port ? QString::number(port) : QString(); HStringReference portString(reinterpret_cast(portQString.utf16())); ComPtr op; if (d->socketType == QAbstractSocket::TcpSocket) { - if (!d->tcpListener - && FAILED(RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocketListener).Get(), - &d->tcpListener))) { - qWarning("Failed to create listener"); - return false; + if (!d->tcpListener) { + hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocketListener).Get(), + &d->tcpListener); + Q_ASSERT_SUCCEEDED(hr); } - d->tcpListener->add_ConnectionReceived(Callback(d, &QNativeSocketEnginePrivate::handleClientConnection).Get(), &d->connectionToken); + hr = d->tcpListener->add_ConnectionReceived( + Callback(d, &QNativeSocketEnginePrivate::handleClientConnection).Get(), + &d->connectionToken); + Q_ASSERT_SUCCEEDED(hr); hr = d->tcpListener->BindEndpointAsync(hostAddress.Get(), portString.Get(), &op); - if (FAILED(hr)) { - qErrnoWarning(hr, "Unable to bind socket."); // ### Set error message - return false; - } } else if (d->socketType == QAbstractSocket::UdpSocket) { hr = d->udpSocket()->BindEndpointAsync(hostAddress.Get(), portString.Get(), &op); - if (FAILED(hr)) { - qErrnoWarning(hr, "Unable to bind socket."); // ### Set error message - return false; - } - hr = op->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleBindCompleted).Get()); - if (FAILED(hr)) { - qErrnoWarning(hr, "Unable to set bind callback."); - return false; - } } - - if (op) { - while (opStatus(op) == Started) - d->eventLoop.processEvents(); - - AsyncStatus status = opStatus(op); - if (status == Error || status == Canceled) - return false; - - hr = op->GetResults(); - if (FAILED(hr)) { - qErrnoWarning(hr, "Failed to bind socket"); - return false; - } - - d->socketState = QAbstractSocket::BoundState; - d->fetchConnectionParameters(); - return true; + if (hr == E_ACCESSDENIED) { + qErrnoWarning(hr, "Unable to bind socket. Please check your manifest capabilities."); + return false; } + Q_ASSERT_SUCCEEDED(hr); - return false; + hr = op->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleBindCompleted).Get()); + Q_ASSERT_SUCCEEDED(hr); + hr = QWinRTFunctions::await(op); + Q_ASSERT_SUCCEEDED(hr); + + d->socketState = QAbstractSocket::BoundState; + return d->fetchConnectionParameters(); } bool QNativeSocketEngine::listen() @@ -430,27 +409,36 @@ void QNativeSocketEngine::close() d->notifyOnWrite = false; d->notifyOnException = false; + HRESULT hr; if (d->connectOp) { ComPtr info; - d->connectOp.As(&info); + hr = d->connectOp.As(&info); + Q_ASSERT_SUCCEEDED(hr); if (info) { - info->Cancel(); - info->Close(); + hr = info->Cancel(); + Q_ASSERT_SUCCEEDED(hr); + hr = info->Close(); + Q_ASSERT_SUCCEEDED(hr); } } if (d->socketDescriptor != -1) { ComPtr socket; if (d->socketType == QAbstractSocket::TcpSocket) { - d->tcpSocket()->QueryInterface(IID_PPV_ARGS(&socket)); - d->tcpSocket()->Release(); + hr = d->tcpSocket()->QueryInterface(IID_PPV_ARGS(&socket)); + Q_ASSERT_SUCCEEDED(hr); + hr = d->tcpSocket()->Release(); + Q_ASSERT_SUCCEEDED(hr); } else if (d->socketType == QAbstractSocket::UdpSocket) { - d->udpSocket()->QueryInterface(IID_PPV_ARGS(&socket)); - d->udpSocket()->Release(); + hr = d->udpSocket()->QueryInterface(IID_PPV_ARGS(&socket)); + Q_ASSERT_SUCCEEDED(hr); + hr = d->udpSocket()->Release(); + Q_ASSERT_SUCCEEDED(hr); } if (socket) { - socket->Close(); + hr = socket->Close(); + Q_ASSERT_SUCCEEDED(hr); d->socketDescriptor = -1; } d->socketDescriptor = -1; @@ -531,7 +519,7 @@ qint64 QNativeSocketEngine::write(const char *data, qint64 len) hr = d->tcpSocket()->get_OutputStream(&stream); else if (d->socketType == QAbstractSocket::UdpSocket) hr = d->udpSocket()->get_OutputStream(&stream); - RETURN_IF_FAILED("Failed to get output stream to socket", return -1); + Q_ASSERT_SUCCEEDED(hr); qint64 bytesWritten = writeIOStream(stream, data, len); if (bytesWritten < 0) @@ -580,20 +568,21 @@ qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 len, const QI HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_HostName).Get(), &hostNameFactory); - RETURN_IF_FAILED("Could not obtain hostname factory", return -1); + Q_ASSERT_SUCCEEDED(hr); const QString addressString = header.destinationAddress.toString(); HStringReference hostNameRef(reinterpret_cast(addressString.utf16())); - hostNameFactory->CreateHostName(hostNameRef.Get(), &remoteHost); + hr = hostNameFactory->CreateHostName(hostNameRef.Get(), &remoteHost); + RETURN_IF_FAILED("QNativeSocketEngine::writeDatagram: Could not create hostname.", return -1); ComPtr> streamOperation; ComPtr stream; const QString portString = QString::number(header.destinationPort); HStringReference portRef(reinterpret_cast(portString.utf16())); hr = d->udpSocket()->GetOutputStreamAsync(remoteHost.Get(), portRef.Get(), &streamOperation); - RETURN_IF_FAILED("Failed to get output stream to socket", return -1); + Q_ASSERT_SUCCEEDED(hr); hr = QWinRTFunctions::await(streamOperation, stream.GetAddressOf()); - RETURN_IF_FAILED("Failed to get output stream to socket", return -1); + Q_ASSERT_SUCCEEDED(hr); return writeIOStream(stream, data, len); } @@ -778,26 +767,23 @@ void QNativeSocketEngine::establishRead() bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol &socketProtocol) { Q_UNUSED(socketProtocol); + HRESULT hr; + switch (socketType) { case QAbstractSocket::TcpSocket: { ComPtr socket; - HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocket).Get(), &socket); - if (FAILED(hr)) { - qWarning("Failed to create StreamSocket instance"); - return false; - } + hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocket).Get(), &socket); + Q_ASSERT_SUCCEEDED(hr); socketDescriptor = qintptr(socket.Detach()); break; } case QAbstractSocket::UdpSocket: { ComPtr socket; - HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_DatagramSocket).Get(), &socket); - if (FAILED(hr)) { - qWarning("Failed to create stream socket"); - return false; - } + hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_DatagramSocket).Get(), &socket); + Q_ASSERT_SUCCEEDED(hr); socketDescriptor = qintptr(socket.Detach()); - udpSocket()->add_MessageReceived(Callback(this, &QNativeSocketEnginePrivate::handleNewDatagram).Get(), &connectionToken); + hr = udpSocket()->add_MessageReceived(Callback(this, &QNativeSocketEnginePrivate::handleNewDatagram).Get(), &connectionToken); + Q_ASSERT_SUCCEEDED(hr); break; } default: @@ -834,10 +820,12 @@ QNativeSocketEnginePrivate::~QNativeSocketEnginePrivate() if (socketDescriptor == -1 || connectionToken.value == -1) return; + HRESULT hr; if (socketType == QAbstractSocket::UdpSocket) - udpSocket()->remove_MessageReceived(connectionToken); + hr = udpSocket()->remove_MessageReceived(connectionToken); else if (socketType == QAbstractSocket::TcpSocket) - tcpListener->remove_ConnectionReceived(connectionToken); + hr = tcpListener->remove_ConnectionReceived(connectionToken); + Q_ASSERT_SUCCEEDED(hr); } void QNativeSocketEnginePrivate::setError(QAbstractSocket::SocketError error, ErrorString errorString) const @@ -1064,56 +1052,66 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters() peerPort = 0; peerAddress.clear(); + HRESULT hr; if (socketType == QAbstractSocket::TcpSocket) { ComPtr hostName; HString tmpHString; ComPtr info; - if (FAILED(tcpSocket()->get_Information(&info))) { - qWarning("QNativeSocketEnginePrivate::fetchConnectionParameters: Could not obtain socket info"); - return false; - } - info->get_LocalAddress(&hostName); + hr = tcpSocket()->get_Information(&info); + Q_ASSERT_SUCCEEDED(hr); + hr = info->get_LocalAddress(&hostName); + Q_ASSERT_SUCCEEDED(hr); if (hostName) { - hostName->get_CanonicalName(tmpHString.GetAddressOf()); + hr = hostName->get_CanonicalName(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); localAddress.setAddress(qt_QStringFromHString(tmpHString)); - info->get_LocalPort(tmpHString.GetAddressOf()); + hr = info->get_LocalPort(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); localPort = qt_QStringFromHString(tmpHString).toInt(); } if (!localPort && tcpListener) { ComPtr listenerInfo = 0; - tcpListener->get_Information(&listenerInfo); - listenerInfo->get_LocalPort(tmpHString.GetAddressOf()); + hr = tcpListener->get_Information(&listenerInfo); + Q_ASSERT_SUCCEEDED(hr); + hr = listenerInfo->get_LocalPort(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); localPort = qt_QStringFromHString(tmpHString).toInt(); - localAddress == QHostAddress::Any; + localAddress = QHostAddress::Any; } info->get_RemoteAddress(&hostName); if (hostName) { - hostName->get_CanonicalName(tmpHString.GetAddressOf()); + hr = hostName->get_CanonicalName(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); peerAddress.setAddress(qt_QStringFromHString(tmpHString)); - info->get_RemotePort(tmpHString.GetAddressOf()); + hr = info->get_RemotePort(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); peerPort = qt_QStringFromHString(tmpHString).toInt(); } } else if (socketType == QAbstractSocket::UdpSocket) { ComPtr hostName; HString tmpHString; ComPtr info; - if (FAILED(udpSocket()->get_Information(&info))) { - qWarning("QNativeSocketEnginePrivate::fetchConnectionParameters: Could not obtain socket information"); - return false; - } - info->get_LocalAddress(&hostName); + hr = udpSocket()->get_Information(&info); + Q_ASSERT_SUCCEEDED(hr); + hr = info->get_LocalAddress(&hostName); + Q_ASSERT_SUCCEEDED(hr); if (hostName) { - hostName->get_CanonicalName(tmpHString.GetAddressOf()); + hr = hostName->get_CanonicalName(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); localAddress.setAddress(qt_QStringFromHString(tmpHString)); - info->get_LocalPort(tmpHString.GetAddressOf()); + hr = info->get_LocalPort(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); localPort = qt_QStringFromHString(tmpHString).toInt(); } - info->get_RemoteAddress(&hostName); + hr = info->get_RemoteAddress(&hostName); + Q_ASSERT_SUCCEEDED(hr); if (hostName) { - hostName->get_CanonicalName(tmpHString.GetAddressOf()); + hr = hostName->get_CanonicalName(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); peerAddress.setAddress(qt_QStringFromHString(tmpHString)); - info->get_RemotePort(tmpHString.GetAddressOf()); + hr = info->get_RemotePort(tmpHString.GetAddressOf()); + Q_ASSERT_SUCCEEDED(hr); peerPort = qt_QStringFromHString(tmpHString).toInt(); } } @@ -1174,12 +1172,16 @@ void QNativeSocketEnginePrivate::handleConnectionEstablished(IAsyncAction *actio // The callback might be triggered several times if we do not cancel/reset it here if (connectOp) { ComPtr info; - connectOp.As(&info); + hr = connectOp.As(&info); + Q_ASSERT_SUCCEEDED(hr); if (info) { - info->Cancel(); - info->Close(); + hr = info->Cancel(); + Q_ASSERT_SUCCEEDED(hr); + hr = info->Close(); + Q_ASSERT_SUCCEEDED(hr); } - connectOp.Reset(); + hr = connectOp.Reset(); + Q_ASSERT_SUCCEEDED(hr); } socketState = QAbstractSocket::ConnectedState; -- cgit v1.2.3 From 08f9a1bd6ab9b1777ee5ba163d75e5c848c39eb4 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 10 Nov 2015 08:28:12 +0100 Subject: winrt: Fixed listening to tcp socket For some reason add_ConnectionReceived has to be called on the Xaml thread now. Otherwise the callback function won't be called and thus listening on a TCP socket won't work at all. Task-number: QTBUG-49121 Change-Id: I11ce2f72b0c1d3bb20e9579de5a2ce5150ca966a Reviewed-by: Andrew Knight Reviewed-by: Samuel Nevala Reviewed-by: Maurice Kalinowski --- src/network/socket/qnativesocketengine_winrt.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/network') diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index cfb950592f..e9fa227733 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -47,11 +47,13 @@ #include #include +#include #ifndef QT_NO_SSL #include #endif +#include #include #include #include @@ -315,9 +317,11 @@ bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port) Q_ASSERT_SUCCEEDED(hr); } - hr = d->tcpListener->add_ConnectionReceived( - Callback(d, &QNativeSocketEnginePrivate::handleClientConnection).Get(), - &d->connectionToken); + hr = QEventDispatcherWinRT::runOnXamlThread([d]() { + return d->tcpListener->add_ConnectionReceived( + Callback(d, &QNativeSocketEnginePrivate::handleClientConnection).Get(), + &d->connectionToken); + }); Q_ASSERT_SUCCEEDED(hr); hr = d->tcpListener->BindEndpointAsync(hostAddress.Get(), portString.Get(), &op); } else if (d->socketType == QAbstractSocket::UdpSocket) { -- cgit v1.2.3