#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>
CFSocketInvalidate(m_socket);
CFRelease(m_source);
+ m_source = NULL;
+
CFRelease(m_socket);
+ m_socket = NULL;
}
// initialize the data associated with the given socket
if ( !m_source )
{
CFRelease(m_socket);
+ m_socket = NULL;
+
return false;
}
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.
// 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
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:
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