]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/core/sockosx.cpp
Generate text events in generic wxSpinCtrl itself.
[wxWidgets.git] / src / osx / core / sockosx.cpp
index 08dbd21815e14f0245a401c2af2e0e23ac301dd9..847b8ac12d63314a221494de291dd46d72a872ca 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        osx/core/gsockosx.cpp
+// Name:        src/osx/core/gsockosx.cpp
 // Purpose:     wxSocketImpl implementation for OS X
 // Authors:     Brian Victor, Vadim Zeitlin
 // Created:     February 2002
@@ -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 <CoreFoundation/CoreFoundation.h>
 
@@ -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,34 +137,41 @@ 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.
-                // The change in behavior cannot be traced to any particular commit or
+                // The change in behaviour cannot be traced to any particular commit or
                 // timeframe so I'm not sure what to think, but after so many hours,
                 // this seems to address the issue and it's time to move on.
                 if (data == NULL)
-                    socket->Detected_Write();
+                    socket->OnWriteWaiting();
                 break;
 
             case kCFSocketReadCallBack:
-                socket->Detected_Read();
+                socket->OnReadWaiting();
                 break;
 
             case kCFSocketWriteCallBack:
-                socket->Detected_Write();
+                socket->OnWriteWaiting();
                 break;
 
             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