]> git.saurik.com Git - wxWidgets.git/commitdiff
make wxSocketImplUnix inherit from wxFDIOHandler as they're used for almost the same...
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 28 Nov 2008 14:39:49 +0000 (14:39 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 28 Nov 2008 14:39:49 +0000 (14:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56998 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/private/socket.h
include/wx/private/socketiohandler.h [deleted file]
include/wx/unix/private/sockunix.h
src/common/socketiohandler.cpp
src/gtk/sockgtk.cpp
src/gtk1/sockgtk.cpp
src/motif/sockmot.cpp
src/os2/sockpm.cpp
src/unix/sockunix.cpp

index 03da655036bc45d86567b60a7fa00c1bb49a9734..22d99911e01af4c5721242fd8d6c3b321b088cce 100644 (file)
@@ -3,7 +3,7 @@
 // Purpose:     wxSocketImpl nd related declarations
 // Authors:     Guilhem Lavaux, Vadim Zeitlin
 // Created:     April 1997
-// RCS-ID:      $Id$
+// RCS-ID:      $Id: socket.h 56994 2008-11-28 12:47:07Z VZ $
 // Copyright:   (c) 1997 Guilhem Lavaux
 //              (c) 2008 Vadim Zeitlin
 // Licence:     wxWindows licence
@@ -275,12 +275,7 @@ public:
     // named) OnRequest() method
     void NotifyOnStateChange(wxSocketNotify event);
 
-    // FIXME: making these functions virtual is a hack necessary to make the
-    //        wxBase library link without requiring wxNet under Unix where
-    //        wxSocketSelectManager (part of wxBase) uses them, they don't
-    //        really need to be virtual at all
-    virtual void Detected_Read() { }
-    virtual void Detected_Write() { }
+    // FIXME: this one probably isn't needed here at all
     virtual void Notify(bool WXUNUSED(notify)) { }
 
     // TODO: make these fields protected and provide accessors for those of
diff --git a/include/wx/private/socketiohandler.h b/include/wx/private/socketiohandler.h
deleted file mode 100644 (file)
index 5fdee62..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Name:        wx/private/gsocketiohandler.h
-// Purpose:     class for registering sockets with wxSelectDispatcher
-// Authors:     Lukasz Michalski
-// Created:     December 2006
-// Copyright:   (c) Lukasz Michalski
-// RCS-ID:      $Id$
-// Licence:     wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef _WX_PRIVATE_GSOCKETIOHANDLER_H_
-#define _WX_PRIVATE_GSOCKETIOHANDLER_H_
-
-#include "wx/defs.h"
-
-#if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
-
-#include "wx/private/selectdispatcher.h"
-#include "wx/private/socket.h"
-
-class WXDLLIMPEXP_BASE wxSocketIOHandler : public wxFDIOHandler
-{
-public:
-    wxSocketIOHandler(wxSocketImpl *socket)
-    {
-        m_socket = socket;
-        m_flags = 0;
-    }
-
-    int GetFlags() const { return m_flags; }
-    void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; }
-    void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; }
-
-    virtual void OnReadWaiting() { m_socket->Detected_Read(); }
-    virtual void OnWriteWaiting() { m_socket->Detected_Write(); }
-    virtual void OnExceptionWaiting() { m_socket->Detected_Read(); }
-
-private:
-    wxSocketImpl *m_socket;
-    int m_flags;
-};
-
-#endif // wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
-
-#endif // _WX_PRIVATE_SOCKETEVTDISPATCH_H_
index 472d524a565e78b5b26b41c011d6a55f7d052bf4..26b7f90d82f5653bb46745f7ad224e3790b01b8c 100644 (file)
 
 #include <unistd.h>
 #include <sys/ioctl.h>
+#include "wx/private/fdiodispatcher.h"
 
-class wxSocketImplUnix : public wxSocketImpl
+class wxSocketImplUnix : public wxSocketImpl,
+                         public wxFDIOHandler
 {
 public:
     wxSocketImplUnix(wxSocketBase& wxsocket)
@@ -34,8 +36,11 @@ public:
     int Write(const char *buffer, int size);
     //attach or detach from main loop
     void Notify(bool flag);
-    void Detected_Read();
-    void Detected_Write();
+
+    // wxFDIOHandler methods
+    virtual void OnReadWaiting();
+    virtual void OnWriteWaiting();
+    virtual void OnExceptionWaiting();
 
 private:
     virtual wxSocketError DoHandleConnect(int ret);
@@ -160,9 +165,9 @@ protected:
     }
 
     // access the FDs we store
-    int& FD(wxSocketImpl *socket, SocketDir d)
+    int& FD(wxSocketImplUnix *socket, SocketDir d)
     {
-        return static_cast<wxSocketImplUnix *>(socket)->m_fds[d];
+        return socket->m_fds[d];
     }
 };
 
@@ -171,8 +176,11 @@ protected:
 class wxSocketInputBasedManager : public wxSocketFDBasedManager
 {
 public:
-    virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event)
+    virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event)
     {
+        wxSocketImplUnix * const
+            socket = static_cast<wxSocketImplUnix *>(socket_);
+
         wxCHECK_RET( socket->m_fd != -1,
                         "shouldn't be called on invalid socket" );
 
@@ -182,11 +190,14 @@ public:
         if ( fd != -1 )
             RemoveInput(fd);
 
-        fd = AddInput(socket, d);
+        fd = AddInput(socket, socket->m_fd, d);
     }
 
-    virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event)
+    virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event)
     {
+        wxSocketImplUnix * const
+            socket = static_cast<wxSocketImplUnix *>(socket_);
+
         const SocketDir d = GetDirForEvent(socket, event);
 
         int& fd = FD(socket, d);
@@ -200,7 +211,7 @@ public:
 private:
     // these functions map directly to XtAdd/RemoveInput() or
     // gdk_input_add/remove()
-    virtual int AddInput(wxSocketImpl *socket, SocketDir d) = 0;
+    virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) = 0;
     virtual void RemoveInput(int fd) = 0;
 };
 
index baa797a74e85c173e26376adde21f989bd37558d..97af802a370fe28c11c25e6e840ebee047f824fe 100644 (file)
@@ -23,8 +23,7 @@
 #if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
 
 #include "wx/apptrait.h"
-#include "wx/unix/private.h"
-#include "wx/private/socketiohandler.h"
+#include "wx/private/socket.h"
 
 // ============================================================================
 // implementation
@@ -40,15 +39,14 @@ public:
     wxSocketImplFDIO(wxSocketBase& wxsocket)
         : wxSocketImplUnix(wxsocket)
     {
-        m_handler = NULL;
     }
 
-    virtual ~wxSocketImplFDIO()
-    {
-        delete m_handler;
-    }
+    int GetFlags() const { return m_flags; }
+    void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; }
+    void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; }
 
-    wxSocketIOHandler *m_handler;
+private:
+    int m_flags;
 };
 
 // ----------------------------------------------------------------------------
@@ -83,34 +81,18 @@ void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_,
     if ( !dispatcher )
         return;
 
-    wxSocketIOHandler *& handler = socket->m_handler;
+    FD(socket, d) = fd;
 
-    // we should register the new handlers but modify the existing ones in place
-    bool registerHandler;
-    if ( handler )
-    {
-        registerHandler = false;
-    }
-    else // no existing handler
-    {
-        registerHandler = true;
-        handler = new wxSocketIOHandler(socket);
-    }
+    // register it when it's used for the first time, update it if it had been
+    // previously registered
+    const bool registerHandler = socket->GetFlags() == 0;
 
-    FD(socket, d) = fd;
-    if (d == FD_INPUT)
-    {
-        handler->AddFlag(wxFDIO_INPUT);
-    }
-    else
-    {
-        handler->AddFlag(wxFDIO_OUTPUT);
-    }
+    socket->AddFlag(d == FD_INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT);
 
     if ( registerHandler )
-        dispatcher->RegisterFD(fd, handler, handler->GetFlags());
+        dispatcher->RegisterFD(fd, socket, socket->GetFlags());
     else
-        dispatcher->ModifyFD(fd, handler, handler->GetFlags());
+        dispatcher->ModifyFD(fd, socket, socket->GetFlags());
 }
 
 void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_,
@@ -133,25 +115,15 @@ void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_,
     if ( !dispatcher )
         return;
 
-    wxSocketIOHandler *& handler = socket->m_handler;
-    if ( handler )
+    socket->RemoveFlag(flag);
+
+    if ( !socket->GetFlags() )
     {
-        handler->RemoveFlag(flag);
-
-        if ( !handler->GetFlags() )
-        {
-            dispatcher->UnregisterFD(fd);
-            delete handler;
-            socket->m_handler = NULL;
-        }
-        else
-        {
-            dispatcher->ModifyFD(fd, handler, handler->GetFlags());
-        }
+        dispatcher->UnregisterFD(fd);
     }
     else
     {
-        dispatcher->UnregisterFD(fd);
+        dispatcher->ModifyFD(fd, socket, socket->GetFlags());
     }
 }
 
index bd80f8594249610a0d848f535836e3639e75cb60..ae2225a6a12a1c2954efc07b9b2adc997fa7bd3b 100644 (file)
@@ -28,26 +28,26 @@ void wxSocket_GDK_Input(gpointer data,
                         gint WXUNUSED(source),
                         GdkInputCondition condition)
 {
-    wxSocketImpl * const socket = static_cast<wxSocketImpl *>(data);
+    wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
 
     if ( condition & GDK_INPUT_READ )
-        socket->Detected_Read();
+        handler->OnReadWaiting();
     if ( condition & GDK_INPUT_WRITE )
-        socket->Detected_Write();
+        handler->OnWriteWaiting();
 }
 }
 
 class GTKSocketManager : public wxSocketInputBasedManager
 {
 public:
-    virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+    virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
     {
         return gdk_input_add
                (
-                    socket->m_fd,
+                    fd,
                     d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ,
                     wxSocket_GDK_Input,
-                    socket
+                    handler
                );
     }
 
index b8b1ecb61228a6ca8a24724d9b473610f210dec2..ae2225a6a12a1c2954efc07b9b2adc997fa7bd3b 100644 (file)
@@ -28,26 +28,26 @@ void wxSocket_GDK_Input(gpointer data,
                         gint WXUNUSED(source),
                         GdkInputCondition condition)
 {
-  wxSocketImpl const *socket = static_cast<wxSocketImpl *>(data);
+    wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
 
-  if ( condition & GDK_INPUT_READ )
-    socket->Detected_Read();
-  if ( condition & GDK_INPUT_WRITE )
-    socket->Detected_Write();
+    if ( condition & GDK_INPUT_READ )
+        handler->OnReadWaiting();
+    if ( condition & GDK_INPUT_WRITE )
+        handler->OnWriteWaiting();
 }
 }
 
 class GTKSocketManager : public wxSocketInputBasedManager
 {
 public:
-    virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+    virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
     {
         return gdk_input_add
                (
-                    socket->m_fd,
+                    fd,
                     d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ,
                     wxSocket_GDK_Input,
-                    socket
+                    handler
                );
     }
 
index 98257ddddcb8a823c983b896c4fdabebd37e8c8e..7aaf341d51145d38f15e3e8e5e3fcef87ff1b764 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        motif/gsockmot.cpp
+// Name:        motif/sockmot.cpp
 // Purpose:     implementation of wxMotif-specific socket event handling
 // Author:      Guilhem Lavaux, Vadim Zeitlin
 // Created:     1999
@@ -23,17 +23,17 @@ extern "C" {
 static void wxSocket_Motif_Input(XtPointer data, int *WXUNUSED(fid),
                                  XtInputId *WXUNUSED(id))
 {
-    wxSocketImpl * const socket = static_cast<wxSocketImpl *>(data);
+    wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
 
-    socket->Detected_Read();
+    handler->OnReadWaiting();
 }
 
 static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid),
                                   XtInputId *WXUNUSED(id))
 {
-    wxSocketImpl * const socket = static_cast<wxSocketImpl *>(data);
+    wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
 
-    socket->Detected_Write();
+    handler->OnWriteWaiting();
 }
 
 }
@@ -41,17 +41,17 @@ static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid),
 class MotifSocketManager : public wxSocketInputBasedManager
 {
 public:
-    virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+    virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
     {
         return XtAppAddInput
                (
                     wxGetAppContext(),
-                    socket->m_fd,
+                    fd,
                     (XtPointer)(d == FD_OUTPUT ? XtInputWriteMask
                                                : XtInputReadMask),
                     d == FD_OUTPUT ? wxSocket_Motif_Output
                                    : wxSocket_Motif_Input,
-                    socket
+                    handler
                );
     }
 
index 8168d7fb61ffc439434742f84d9b1c18515d8601..341aedb2393d50f63994f3ff46809e3bbf92ea1c 100644 (file)
@@ -1,10 +1,12 @@
-/* -------------------------------------------------------------------------
- * Project: wxSocketImpl (Generic Socket) for WX
- * Name:    gsockpm.c
- * Purpose: wxSocketImpl: PM part
- * Licence: The wxWindows licence
- * CVSID:   $Id$
- * ------------------------------------------------------------------------- */
+///////////////////////////////////////////////////////////////////////////////
+// Name:        os2/sockpm.cpp
+// Purpose:     implementation of OS-2-specific handler event handling
+// Author:      Guilhem Lavaux, Vadim Zeitlin
+// Created:     1999
+// RCS-ID:      $Id$
+// Copyright:   (c) 1999-2008 wxWidgets dev team
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 static void wxSocket_PM_Input(void *data)
 {
-    wxSocketImpl *socket = static_cast<wxSocketImpl *>(data);
+    wxFDIOHandler *handler = static_cast<wxFDIOHandler *>(data);
 
-    socket->Detected_Read();
+    handler->OnReadWaiting();
 }
 
 static void wxSocket_PM_Output(void *data)
 {
-    wxSocketImpl *socket = static_cast<wxSocketImpl *>(data);
+    wxFDIOHandler *handler = static_cast<wxFDIOHandler *>(data);
 
-    socket->Detected_Write();
+    handler->OnWriteWaiting();
 }
 
 class PMSocketManager : public wxSocketInputBasedManager
 {
 public:
-    virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+    virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
     {
-
       if (d == FD_OUTPUT)
-          return wxTheApp->AddSocketHandler(socket->m_fd, wxSockWriteMask,
-                                            wxSocket_PM_Output, (void *)socket);
+          return wxTheApp->AddSocketHandler(fd, wxSockWriteMask,
+                                            wxSocket_PM_Output, handler);
       else
-          return wxTheApp->AddSocketHandler(socket->m_fd, wxSockReadMask,
-                                            wxSocket_PM_Input, (void *)socket);
+          return wxTheApp->AddSocketHandler(fd, wxSockReadMask,
+                                            wxSocket_PM_Input, handler);
     }
 
     virtual void RemoveInput(int fd)
index 1893e118e88ca491c1c8943495d40f390567dc7d..3fd9875c8bfc9478bd04a6d25f9fad42266a60bd 100644 (file)
@@ -672,7 +672,7 @@ int wxSocketImplUnix::Read(char *buffer, int size)
       if (m_use_events)
       {
         m_detected = wxSOCKET_LOST_FLAG;
-        Detected_Read();
+        OnReadWaiting();
         return 0;
       }
     }
@@ -974,11 +974,10 @@ void wxSocketImplUnix::OnStateChange(wxSocketNotify event)
         Shutdown();
 }
 
-void wxSocketImplUnix::Detected_Read()
+void wxSocketImplUnix::OnReadWaiting()
 {
   char c;
 
-  /* Safeguard against straggling call to Detected_Read */
   if (m_fd == INVALID_SOCKET)
   {
     return;
@@ -1035,7 +1034,7 @@ void wxSocketImplUnix::Detected_Read()
   }
 }
 
-void wxSocketImplUnix::Detected_Write()
+void wxSocketImplUnix::OnWriteWaiting()
 {
   /* If we have already detected a LOST event, then don't try
    * to do any further processing.
@@ -1077,6 +1076,11 @@ void wxSocketImplUnix::Detected_Write()
   }
 }
 
+void wxSocketImplUnix::OnExceptionWaiting()
+{
+    wxFAIL_MSG( "not supposed to be called" );
+}
+
 /*
  * -------------------------------------------------------------------------
  * GAddress