X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/579213e97b34f35ba1661c6d5b553d2989caddaf..545cb3fcf2460919deb52cf47f6cb0bdf494fae7:/src/osx/core/sockosx.cpp diff --git a/src/osx/core/sockosx.cpp b/src/osx/core/sockosx.cpp index f940120738..0b6b77d0e1 100644 --- a/src/osx/core/sockosx.cpp +++ b/src/osx/core/sockosx.cpp @@ -16,6 +16,9 @@ #include "wx/private/socket.h" #include "wx/unix/private/sockunix.h" #include "wx/apptrait.h" +#include "wx/link.h" + +#include "wx/osx/core/cfstring.h" // for wxMacWakeUp() only #include @@ -75,7 +78,10 @@ private: CFSocketInvalidate(m_socket); CFRelease(m_source); + m_source = NULL; + CFRelease(m_socket); + m_socket = NULL; } // initialize the data associated with the given socket @@ -110,6 +116,8 @@ private: if ( !m_source ) { CFRelease(m_socket); + m_socket = NULL; + return false; } @@ -129,7 +137,7 @@ private: switch (callbackType) { case kCFSocketConnectCallBack: - wxASSERT(!socket->m_server); + wxASSERT(!socket->IsServer()); // KH: If data is non-NULL, the connect failed, do not call Detected_Write, // which will only end up creating a spurious connect event because the // call to getsocketopt SO_ERROR inexplicably returns no error. @@ -151,12 +159,19 @@ private: default: wxFAIL_MSG( "unexpected socket callback" ); } + + // receiving a socket event does _not_ make ReceiveNextEvent() (or the + // equivalent NSApp:nextEventMatchingMask:untilDate:inMode:dequeue) + // return control, i.e. apparently it doesn't count as a real event, so + // we need to generate a wake up to return control to the code waiting + // for something to happen and process this socket event + wxMacWakeUp(); } CFSocketRef m_socket; CFRunLoopSourceRef m_source; - DECLARE_NO_COPY_CLASS(wxSocketImplMac) + wxDECLARE_NO_COPY_CLASS(wxSocketImplMac); }; } // anonymous namespace @@ -219,18 +234,17 @@ int wxSocketManagerMac::GetCFCallback(wxSocketImpl *socket, wxSocketNotify event switch ( event ) { case wxSOCKET_CONNECTION: - return socket->m_server ? kCFSocketReadCallBack - : kCFSocketConnectCallBack; + return socket->IsServer() ? kCFSocketReadCallBack + : kCFSocketConnectCallBack; - case wxSOCKET_LOST: case wxSOCKET_INPUT: return kCFSocketReadCallBack; case wxSOCKET_OUTPUT: return kCFSocketWriteCallBack; - case wxSOCKET_MAX_EVENT: - wxFAIL_MSG( "invalid wxSocketNotify" ); + case wxSOCKET_LOST: + wxFAIL_MSG( "unexpected wxSocketNotify" ); return 0; default: @@ -255,17 +269,24 @@ void wxSocketManagerMac::Uninstall_Callback(wxSocketImpl *socket_, CFSocketDisableCallBacks(socket->GetSocket(), GetCFCallback(socket, event)); } -// set the wxBase variable to point to our wxSocketManager implementation +// set the wxBase variable to point to CF wxSocketManager implementation so +// that the GUI code in utilsexc_cf.cpp could return it from its traits method // -// see comments in wx/apptrait.h for the explanation of why do we do it -// like this -static struct ManagerSetter +// this is very roundabout but necessary to allow us to have different +// behaviours in console and GUI applications while avoiding dependencies of +// GUI library on the network one +extern WXDLLIMPEXP_BASE wxSocketManager *wxOSXSocketManagerCF; + +static struct OSXManagerSetter { - ManagerSetter() + OSXManagerSetter() { static wxSocketManagerMac s_manager; - wxAppTraits::SetDefaultSocketManager(&s_manager); + wxOSXSocketManagerCF = &s_manager; } -} gs_managerSetter; +} gs_OSXManagerSetter; + +// see the relative linker macro in socket.cpp +wxFORCE_LINK_THIS_MODULE( osxsocket ); #endif // wxUSE_SOCKETS