From 72c609203b48a684afe51878bd7bd487fe96a103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 8 Mar 2021 19:23:11 +0100 Subject: macOS: Notify socket notifier on connection error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable kCFSocketConnectCallBack to get connection made/failed notifications. For the error case, the data pointer will be set (it points to an int with the error code). Change-Id: Ib51c0ae7c2c74d7bc2fea3c8b7aa9033a860f602 Fixes: QTBUG-91619 Reviewed-by: Morten Johan Sørvig Reviewed-by: Paul Wicking Reviewed-by: Timur Pocheptsov (cherry picked from commit d492245d9f98e410e1748f28a598945244dbafa8) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qcfsocketnotifier.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/corelib/kernel/qcfsocketnotifier.cpp b/src/corelib/kernel/qcfsocketnotifier.cpp index 920ec9cd86..13fe30d0cd 100644 --- a/src/corelib/kernel/qcfsocketnotifier.cpp +++ b/src/corelib/kernel/qcfsocketnotifier.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE Socket Notifiers *************************************************************************/ void qt_mac_socket_callback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef, - const void *, void *info) + const void *data, void *info) { QCFSocketNotifier *cfSocketNotifier = static_cast(info); @@ -61,7 +61,15 @@ void qt_mac_socket_callback(CFSocketRef s, CFSocketCallBackType callbackType, CF // notification after we've successfully disabled the CFSocket, but our Qt // notifier is now gone. The upshot is we have to check the notifier // every time. - if (callbackType == kCFSocketReadCallBack) { + if (callbackType == kCFSocketConnectCallBack) { + // The data pointer will be non-null on connection error + if (data) { + if (socketInfo->readNotifier) + QCoreApplication::sendEvent(socketInfo->readNotifier, ¬ifierEvent); + if (socketInfo->writeNotifier) + QCoreApplication::sendEvent(socketInfo->writeNotifier, ¬ifierEvent); + } + } else if (callbackType == kCFSocketReadCallBack) { if (socketInfo->readNotifier && socketInfo->readEnabled) { socketInfo->readEnabled = false; QCoreApplication::sendEvent(socketInfo->readNotifier, ¬ifierEvent); @@ -152,7 +160,7 @@ void QCFSocketNotifier::registerSocketNotifier(QSocketNotifier *notifier) // Create CFSocket, specify that we want both read and write callbacks (the callbacks // are enabled/disabled later on). - const int callbackTypes = kCFSocketReadCallBack | kCFSocketWriteCallBack; + const int callbackTypes = kCFSocketConnectCallBack | kCFSocketReadCallBack | kCFSocketWriteCallBack; CFSocketContext context = {0, this, 0, 0, 0}; socketInfo->socket = CFSocketCreateWithNative(kCFAllocatorDefault, nativeSocket, callbackTypes, qt_mac_socket_callback, &context); if (CFSocketIsValid(socketInfo->socket) == false) { -- cgit v1.2.3