Use CF socket manager in GUI OS X applications.

wxSocketManagerMac was never created under OS X since wxSocket code
refactoring as wxGUIAppTraits::GetSocketManager() wasn't overridden.

Doing this required an extra nasty hack with a global variable in the base
library which is used just to pass the socket manager pointer from the net
library to the core one without creating a dependency between them but this
seems unfortunately unavoidable.

See #11030.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61676 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-08-16 23:13:55 +00:00
parent 4f260c9c68
commit 5815e95907
4 changed files with 38 additions and 13 deletions

View File

@@ -36,15 +36,11 @@ public:
// TODO: Should we use XtAddInput() for wxX11 too? Or, vice versa, if there is
// no advantage in doing this compared to the generic way currently used
// by wxX11, should we continue to use GTK/Motif-specific stuff?
#if defined(__WXGTK__) || defined(__WXMOTIF__)
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
#define wxHAS_GUI_PROCESS_CALLBACKS
#define wxHAS_GUI_SOCKET_MANAGER
#endif
#ifdef __DARWIN__
#define wxHAS_GUI_PROCESS_CALLBACKS
#endif
class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase
{
public:

View File

@@ -254,17 +254,21 @@ 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;
#endif // wxUSE_SOCKETS

View File

@@ -45,6 +45,15 @@
// Default path style
#define kDefaultPathStyle kCFURLPOSIXPathStyle
#if wxUSE_SOCKETS
// global pointer which lives in the base library, set from the net one (see
// sockosx.cpp) and used from the GUI code (see utilsexc_cf.cpp) -- ugly but
// needed hack, see the above-mentioned files for more information
class wxSocketManager;
extern WXDLLIMPEXP_BASE wxSocketManager *wxOSXSocketManagerCF;
wxSocketManager *wxOSXSocketManagerCF = NULL;
#endif // wxUSE_SOCKETS
extern bool WXDLLEXPORT wxIsDebuggerRunning()
{
// TODO : try to find out ...

View File

@@ -116,3 +116,19 @@ wxStandardPaths& wxGUIAppTraits::GetStandardPaths()
}
#endif
#if wxUSE_SOCKETS
// we need to implement this method in a file of the core library as it should
// only be used for the GUI applications but we can't use socket stuff from it
// directly as this would create unwanted dependencies of core on net library
//
// so we have this global pointer which is set from sockosx.cpp when it is
// linked in and we simply return it from here
extern WXDLLIMPEXP_BASE wxSocketManager *wxOSXSocketManagerCF;
wxSocketManager *wxGUIAppTraits::GetSocketManager()
{
return wxOSXSocketManagerCF ? wxOSXSocketManagerCF
: wxGUIAppTraitsBase::GetSocketManager();
}
#endif // wxUSE_SOCKETS