From: David Elliott Date: Sun, 18 Jan 2004 19:34:16 +0000 (+0000) Subject: Add virtual methods to GSocketBSD for calling the event loop handler X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/444cb1fdcb628cc74057dd75ffc0343efa2f4aec Add virtual methods to GSocketBSD for calling the event loop handler instead of the GUI event functions table. Also added a compatibility class to gsocket.cpp until we can update all of the GUIs. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25234 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/unix/gsockunx.h b/include/wx/unix/gsockunx.h index e5eefa2c4e..19e210ae3c 100644 --- a/include/wx/unix/gsockunx.h +++ b/include/wx/unix/gsockunx.h @@ -34,7 +34,7 @@ class GSocketBSD { public: GSocketBSD(); - ~GSocketBSD(); + virtual ~GSocketBSD(); bool IsOk() { return m_ok; } void Close(); void Shutdown(); @@ -70,6 +70,10 @@ protected: void Detected_Read(); void Detected_Write(); bool m_ok; + virtual void EventLoop_Enable_Events() = 0; + virtual void EventLoop_Disable_Events() = 0; + virtual void EventLoop_Install_Callback(GSocketEvent event) = 0; + virtual void EventLoop_Uninstall_Callback(GSocketEvent event) = 0; public: //DFE: We can't protect these data member until the GUI code is updated //protected: diff --git a/src/unix/gsocket.cpp b/src/unix/gsocket.cpp index 1a86f4d369..b1192c0555 100644 --- a/src/unix/gsocket.cpp +++ b/src/unix/gsocket.cpp @@ -156,30 +156,83 @@ int _System soclose(int); # define GSocket_Debug(args) #endif /* __GSOCKET_DEBUG__ */ +/////////////////////////////////////////////////////////////////////////// +// GSocketBSDGUIShim +class GSocketBSDGUIShim:public GSocketBSD +{ + friend void GSocket_SetGUIFunctions(struct GSocketGUIFunctionsTable *guifunc); +public: + static inline bool GUI_Init(); + static inline void GUI_Cleanup(); + static inline bool UseGUI(); + GSocketBSDGUIShim(); + virtual ~GSocketBSDGUIShim(); +protected: + virtual void EventLoop_Enable_Events(); + virtual void EventLoop_Disable_Events(); + virtual void EventLoop_Install_Callback(GSocketEvent event); + virtual void EventLoop_Uninstall_Callback(GSocketEvent event); +private: /* Table of GUI-related functions. We must call them indirectly because * of wxBase and GUI separation: */ -static struct GSocketGUIFunctionsTable *gs_gui_functions; - -#define USE_GUI() (gs_gui_functions != NULL) - -/* Define macros to simplify indirection: */ -#define _GSocket_GUI_Init() \ - if (gs_gui_functions) gs_gui_functions->GUI_Init() -#define _GSocket_GUI_Cleanup() \ - if (gs_gui_functions) gs_gui_functions->GUI_Cleanup() -#define _GSocket_GUI_Init_Socket(socket) \ - (gs_gui_functions ? gs_gui_functions->GUI_Init_Socket(socket) : 1) -#define _GSocket_GUI_Destroy_Socket(socket) \ - if (gs_gui_functions) gs_gui_functions->GUI_Destroy_Socket(socket) -#define _GSocket_Enable_Events(socket) \ - if (gs_gui_functions) gs_gui_functions->Enable_Events(socket) -#define _GSocket_Disable_Events(socket) \ - if (gs_gui_functions) gs_gui_functions->Disable_Events(socket) -#define _GSocket_Install_Callback(socket, event) \ - if (gs_gui_functions) gs_gui_functions->Install_Callback(socket, event) -#define _GSocket_Uninstall_Callback(socket, event) \ - if (gs_gui_functions) gs_gui_functions->Uninstall_Callback(socket, event) + static struct GSocketGUIFunctionsTable *ms_gui_functions; +}; + +struct GSocketGUIFunctionsTable *GSocketBSDGUIShim::ms_gui_functions = NULL; + +void GSocket_SetGUIFunctions(struct GSocketGUIFunctionsTable *guifunc) +{ + GSocketBSDGUIShim::ms_gui_functions = guifunc; +} + +inline bool GSocketBSDGUIShim::UseGUI() +{ + return ms_gui_functions; +} + +inline bool GSocketBSDGUIShim::GUI_Init() +{ + return (ms_gui_functions)?ms_gui_functions->GUI_Init():true; +} + +inline void GSocketBSDGUIShim::GUI_Cleanup() +{ + if (ms_gui_functions) ms_gui_functions->GUI_Cleanup(); +} + +GSocketBSDGUIShim::GSocketBSDGUIShim() +{ + m_ok = (ms_gui_functions ? ms_gui_functions->GUI_Init_Socket(this) : true); +} + +GSocketBSDGUIShim::~GSocketBSDGUIShim() +{ + if (ms_gui_functions) ms_gui_functions->GUI_Destroy_Socket(this); +} + +void GSocketBSDGUIShim::EventLoop_Enable_Events() +{ + if (ms_gui_functions) ms_gui_functions->Enable_Events(this); +} + +void GSocketBSDGUIShim::EventLoop_Disable_Events() +{ + if (ms_gui_functions) ms_gui_functions->Disable_Events(this); +} + +void GSocketBSDGUIShim::EventLoop_Install_Callback(GSocketEvent event) +{ + if (ms_gui_functions) ms_gui_functions->Install_Callback(this, event); +} + +void GSocketBSDGUIShim::EventLoop_Uninstall_Callback(GSocketEvent event) +{ + if (ms_gui_functions) ms_gui_functions->Uninstall_Callback(this, event); +} + +/////////////////////////////////////////////////////////////////////////// +// GSocketBSD static struct GSocketBaseFunctionsTable gs_base_functions = { @@ -189,27 +242,14 @@ static struct GSocketBaseFunctionsTable gs_base_functions = /* Global initialisers */ -void GSocket_SetGUIFunctions(struct GSocketGUIFunctionsTable *guifunc) -{ - gs_gui_functions = guifunc; -} - int GSocket_Init(void) { - if (gs_gui_functions) - { - if ( !gs_gui_functions->GUI_Init() ) - return 0; - } - return 1; + return GSocketBSDGUIShim::GUI_Init(); } void GSocket_Cleanup(void) { - if (gs_gui_functions) - { - gs_gui_functions->GUI_Cleanup(); - } + GSocketBSDGUIShim::GUI_Cleanup(); } GSocketBSD::GSocketBSD() @@ -235,13 +275,12 @@ GSocketBSD::GSocketBSD() m_functions = &gs_base_functions; - /* Per-socket GUI-specific initialization */ - m_ok = _GSocket_GUI_Init_Socket(this); + m_ok = true; } void GSocketBSD::Close() { - _GSocket_Disable_Events(this); + EventLoop_Disable_Events(); // gsockosx.c calls CFSocketInvalidate which closes the socket for us #if !(defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))) close(m_fd); @@ -251,15 +290,6 @@ void GSocketBSD::Close() GSocketBSD::~GSocketBSD() { - assert(this); - - /* Check that the socket is really shutdowned */ - if (m_fd != INVALID_SOCKET) - Shutdown(); - - /* Per-socket GUI-specific cleanup */ - _GSocket_GUI_Destroy_Socket(this); - /* Destroy private addresses */ if (m_local) GAddress_destroy(m_local); @@ -459,7 +489,7 @@ GSocketError GSocketBSD::SetServer() #else ioctl(m_fd, FIONBIO, &arg); #endif - _GSocket_Enable_Events(this); + EventLoop_Enable_Events(); /* allow a socket to re-bind if the socket is in the TIME_WAIT state after being previously closed. @@ -517,9 +547,9 @@ GSocket *GSocketBSD::WaitConnection() } /* Create a GSocket object for the new connection */ - connection = new GSocketBSD(); + connection = GSocket_new(); - if (!connection->IsOk()) + if (!connection) { delete connection; m_error = GSOCK_MEMERR; @@ -573,7 +603,7 @@ GSocket *GSocketBSD::WaitConnection() #else ioctl(connection->m_fd, FIONBIO, &arg); #endif - _GSocket_Enable_Events(connection); + connection->EventLoop_Enable_Events(); return connection; } @@ -645,7 +675,7 @@ GSocketError GSocketBSD::Connect(GSocketStream stream) #else ioctl(m_fd, FIONBIO, &arg); #endif - _GSocket_Enable_Events(this); + EventLoop_Enable_Events(); /* Connect it to the peer address, with a timeout (see below) */ ret = connect(m_fd, m_peer->m_addr, m_peer->m_len); @@ -752,7 +782,7 @@ GSocketError GSocketBSD::SetNonOriented() #else ioctl(m_fd, FIONBIO, &arg); #endif - _GSocket_Enable_Events(this); + EventLoop_Enable_Events(); /* Bind to the local address, * and retrieve the actual address bound. @@ -883,7 +913,7 @@ int GSocketBSD::Write(const char *buffer, int size) */ GSocketEventFlags GSocketBSD::Select(GSocketEventFlags flags) { - if (!USE_GUI()) + if (!GSocketBSDGUIShim::UseGUI()) { GSocketEventFlags result = 0; @@ -1122,13 +1152,13 @@ void GSocketBSD::UnsetCallback(GSocketEventFlags flags) void GSocketBSD::Enable(GSocketEvent event) { m_detected &= ~(1 << event); - _GSocket_Install_Callback(this, event); + EventLoop_Install_Callback(event); } void GSocketBSD::Disable(GSocketEvent event) { m_detected |= (1 << event); - _GSocket_Uninstall_Callback(this, event); + EventLoop_Uninstall_Callback(event); } /* _GSocket_Input_Timeout: @@ -1392,7 +1422,7 @@ void GSocketBSD::Detected_Write() /* Compatibility functions for GSocket */ GSocket *GSocket_new(void) { - GSocket *newsocket = new GSocketBSD(); + GSocket *newsocket = new GSocketBSDGUIShim(); if(newsocket->IsOk()) return newsocket; delete newsocket; @@ -1401,6 +1431,12 @@ GSocket *GSocket_new(void) void GSocket_destroy(GSocket *socket) { + assert(socket); + + /* Check that the socket is really shutdowned */ + if (socket->m_fd != INVALID_SOCKET) + socket->Shutdown(); + delete socket; }