]> git.saurik.com Git - wxWidgets.git/commitdiff
don't duplicate GSocket creation/destruction and shutdown code in BSD and Winsock...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 23 Nov 2008 01:44:50 +0000 (01:44 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 23 Nov 2008 01:44:50 +0000 (01:44 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56926 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gsocket.h
include/wx/msw/gsockmsw.h
include/wx/unix/gsockunx.h
src/common/socket.cpp
src/msw/gsocket.cpp
src/msw/gsockmsw.cpp
src/unix/gsocket.cpp

index a587ece8c0801410c5b4d73418e8b7cd9e2465cd..70fd12f29938456dae4322fa71cc10d688ffde8d 100644 (file)
@@ -163,15 +163,22 @@ private:
 class GSocketBase
 {
 public:
 class GSocketBase
 {
 public:
+    // static factory function
+    static GSocket *Create();
+
+    virtual ~GSocketBase();
+
     GSocketEventFlags Select(GSocketEventFlags flags);
 
     GSocketEventFlags Select(GSocketEventFlags flags);
 
+    virtual void Close() = 0;
+    virtual void Shutdown();
+
 #ifdef __WINDOWS__
     SOCKET m_fd;
 #else
     int m_fd;
 #endif
 
 #ifdef __WINDOWS__
     SOCKET m_fd;
 #else
     int m_fd;
 #endif
 
-    bool m_ok;
     int m_initialRecvBufferSize;
     int m_initialSendBufferSize;
 
     int m_initialRecvBufferSize;
     int m_initialSendBufferSize;
 
@@ -196,6 +203,9 @@ public:
     GSocketEventFlags m_detected;
     GSocketCallback m_cbacks[GSOCK_MAX_EVENT];
     char *m_data[GSOCK_MAX_EVENT];
     GSocketEventFlags m_detected;
     GSocketCallback m_cbacks[GSOCK_MAX_EVENT];
     char *m_data[GSOCK_MAX_EVENT];
+
+protected:
+    GSocketBase();
 };
 
 #if defined(__WINDOWS__)
 };
 
 #if defined(__WINDOWS__)
@@ -204,7 +214,6 @@ public:
     #include "wx/unix/gsockunx.h"
 #endif
 
     #include "wx/unix/gsockunx.h"
 #endif
 
-
 /* Global initializers */
 
 /* GSocket_Init() must be called at the beginning (but after calling
 /* Global initializers */
 
 /* GSocket_Init() must be called at the beginning (but after calling
@@ -215,11 +224,6 @@ bool GSocket_Init();
 void GSocket_Cleanup();
 
 
 void GSocket_Cleanup();
 
 
-/* Constructors / Destructors */
-
-GSocket *GSocket_new();
-
-
 /* GAddress */
 
 // Represents a socket endpoint, i.e. -- in spite of its name -- not an address
 /* GAddress */
 
 // Represents a socket endpoint, i.e. -- in spite of its name -- not an address
@@ -334,6 +338,13 @@ GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf);
     #define SOCKOPTLEN_T int
 #endif
 
     #define SOCKOPTLEN_T int
 #endif
 
+/*
+ * MSW defines this, Unices don't.
+ */
+#ifndef INVALID_SOCKET
+#define INVALID_SOCKET (-1)
+#endif
+
 #endif /* wxUSE_SOCKETS */
 
 #endif /* _WX_GSOCKET_H_ */
 #endif /* wxUSE_SOCKETS */
 
 #endif /* _WX_GSOCKET_H_ */
index 36e7bfbb87091560e3282a623d906893ffe7c598..94f622064b93d59e42d27bb244686d1e34881213 100644 (file)
 class GSocket : public GSocketBase
 {
 public:
 class GSocket : public GSocketBase
 {
 public:
-  GSocket();
-  ~GSocket();
-  bool IsOk() { return m_ok; }
-  void Close();
-  void Shutdown();
+  GSocket() : GSocketBase() { m_msgnumber = 0; }
+
+  virtual void Close();
+
   GSocketError SetLocal(GAddress *address);
   GSocketError SetPeer(GAddress *address);
   GAddress *GetLocal();
   GSocketError SetLocal(GAddress *address);
   GSocketError SetPeer(GAddress *address);
   GAddress *GetLocal();
index c6459aab095e48f2957ecdadfb32f402a6afddb1..3741595542d60a91db04378650bd3f2a9b8cf6bc 100644 (file)
@@ -17,10 +17,9 @@ class GSocket : public GSocketBase
 {
 public:
     GSocket();
 {
 public:
     GSocket();
-    virtual ~GSocket();
-    bool IsOk() { return m_ok; }
-    void Close();
-    void Shutdown();
+    ~GSocket();
+    virtual void Close();
+    virtual void Shutdown();
     GSocketError SetLocal(GAddress *address);
     GSocketError SetPeer(GAddress *address);
     GAddress *GetLocal();
     GSocketError SetLocal(GAddress *address);
     GSocketError SetPeer(GAddress *address);
     GAddress *GetLocal();
@@ -45,8 +44,8 @@ public:
         const void *optval, int optlen);
     //attach or detach from main loop
     void Notify(bool flag);
         const void *optval, int optlen);
     //attach or detach from main loop
     void Notify(bool flag);
-    virtual void Detected_Read();
-    virtual void Detected_Write();
+    void Detected_Read();
+    void Detected_Write();
     void SetInitialSocketBuffers(int recv, int send)
     {
         m_initialRecvBufferSize = recv;
     void SetInitialSocketBuffers(int recv, int send)
     {
         m_initialRecvBufferSize = recv;
index d7acc0b6712000e12f08114688c8fe7673ac39c3..266e81cce733918404b4ad56bc0cc2cdb167d62c 100644 (file)
@@ -152,6 +152,86 @@ void GSocketManager::Init()
     ms_manager = app->GetTraits()->GetSocketManager();
 }
 
     ms_manager = app->GetTraits()->GetSocketManager();
 }
 
+// ==========================================================================
+// GSocketBase
+// ==========================================================================
+
+/* static */
+GSocket *GSocketBase::Create()
+{
+    GSocket * const newsocket = new GSocket();
+    if ( !GSocketManager::Get()->Init_Socket(newsocket) )
+    {
+        delete newsocket;
+        return NULL;
+    }
+
+    return newsocket;
+}
+
+GSocketBase::GSocketBase()
+{
+    m_fd              = INVALID_SOCKET;
+    m_detected        = 0;
+    m_local           = NULL;
+    m_peer            = NULL;
+    m_error           = GSOCK_NOERROR;
+    m_server          = false;
+    m_stream          = true;
+    m_non_blocking    = false;
+#ifdef __WINDOWS__
+    m_timeout.tv_sec  = 10 * 60;  /* 10 minutes */
+    m_timeout.tv_usec = 0;
+#else
+    m_timeout         = 10*60*1000; /* 10 minutes * 60 sec * 1000 millisec */
+#endif
+
+    m_establishing    = false;
+    m_reusable        = false;
+    m_broadcast       = false;
+    m_dobind          = true;
+    m_initialRecvBufferSize = -1;
+    m_initialSendBufferSize = -1;
+
+    for ( int i = 0; i < GSOCK_MAX_EVENT; i++ )
+        m_cbacks[i] = NULL;
+}
+
+GSocketBase::~GSocketBase()
+{
+    if (m_fd != INVALID_SOCKET)
+        Shutdown();
+
+    if (m_local)
+        GAddress_destroy(m_local);
+
+    if (m_peer)
+        GAddress_destroy(m_peer);
+
+    // cast is ok as all GSocketBase objects we have in our code are really
+    // GSockets
+    GSocketManager::Get()->Destroy_Socket(static_cast<GSocket *>(this));
+}
+
+/* GSocket_Shutdown:
+ *  Disallow further read/write operations on this socket, close
+ *  the fd and disable all callbacks.
+ */
+void GSocketBase::Shutdown()
+{
+    if ( m_fd != INVALID_SOCKET )
+    {
+        shutdown(m_fd, 1 /* SD_SEND */);
+        Close();
+    }
+
+    /* Disable GUI callbacks */
+    for ( int evt = 0; evt < GSOCK_MAX_EVENT; evt++ )
+        m_cbacks[evt] = NULL;
+
+    m_detected = GSOCK_LOST_FLAG;
+}
+
 // ==========================================================================
 // wxSocketBase
 // ==========================================================================
 // ==========================================================================
 // wxSocketBase
 // ==========================================================================
@@ -1243,7 +1323,7 @@ wxSocketServer::wxSocketServer(const wxSockAddress& addr_man,
 {
     wxLogTrace( wxTRACE_Socket, _T("Opening wxSocketServer") );
 
 {
     wxLogTrace( wxTRACE_Socket, _T("Opening wxSocketServer") );
 
-    m_socket = GSocket_new();
+    m_socket = GSocket::Create();
 
     if (!m_socket)
     {
 
     if (!m_socket)
     {
@@ -1406,7 +1486,7 @@ bool wxSocketClient::DoConnect(const wxSockAddress& addr_man,
         delete m_socket;
     }
 
         delete m_socket;
     }
 
-    m_socket = GSocket_new();
+    m_socket = GSocket::Create();
     m_connected = false;
     m_establishing = false;
 
     m_connected = false;
     m_establishing = false;
 
@@ -1521,7 +1601,7 @@ wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr,
                 : wxSocketBase( flags, wxSOCKET_DATAGRAM )
 {
     // Create the socket
                 : wxSocketBase( flags, wxSOCKET_DATAGRAM )
 {
     // Create the socket
-    m_socket = GSocket_new();
+    m_socket = GSocket::Create();
 
     if (!m_socket)
     {
 
     if (!m_socket)
     {
index 1730fc7fc77ac0cbc743ed09d77323fe57ee9ad0..5730a6cf187e31a741922f66ed50f0a046d0d29a 100644 (file)
@@ -110,34 +110,6 @@ void GSocket_Cleanup()
 
 /* Constructors / Destructors for GSocket */
 
 
 /* Constructors / Destructors for GSocket */
 
-GSocket::GSocket()
-{
-  int i;
-
-  m_fd              = INVALID_SOCKET;
-  for (i = 0; i < GSOCK_MAX_EVENT; i++)
-  {
-    m_cbacks[i]     = NULL;
-  }
-  m_detected        = 0;
-  m_local           = NULL;
-  m_peer            = NULL;
-  m_error           = GSOCK_NOERROR;
-  m_server          = false;
-  m_stream          = true;
-  m_non_blocking    = false;
-  m_timeout.tv_sec  = 10 * 60;  /* 10 minutes */
-  m_timeout.tv_usec = 0;
-  m_establishing    = false;
-  m_reusable        = false;
-  m_broadcast       = false;
-  m_dobind          = true;
-  m_initialRecvBufferSize = -1;
-  m_initialSendBufferSize = -1;
-
-  m_ok = GSocketManager::Get()->Init_Socket(this);
-}
-
 void GSocket::Close()
 {
     GSocketManager::Get()->Disable_Events(this);
 void GSocket::Close()
 {
     GSocketManager::Get()->Disable_Events(this);
@@ -145,44 +117,6 @@ void GSocket::Close()
     m_fd = INVALID_SOCKET;
 }
 
     m_fd = INVALID_SOCKET;
 }
 
-GSocket::~GSocket()
-{
-  GSocketManager::Get()->Destroy_Socket(this);
-
-  /* Check that the socket is really shutdowned */
-  if (m_fd != INVALID_SOCKET)
-    Shutdown();
-
-  /* Destroy private addresses */
-  if (m_local)
-    GAddress_destroy(m_local);
-
-  if (m_peer)
-    GAddress_destroy(m_peer);
-}
-
-/* GSocket_Shutdown:
- *  Disallow further read/write operations on this socket, close
- *  the fd and disable all callbacks.
- */
-void GSocket::Shutdown()
-{
-  int evt;
-
-  /* If socket has been created, shutdown it */
-  if (m_fd != INVALID_SOCKET)
-  {
-    shutdown(m_fd, 1 /* SD_SEND */);
-    Close();
-  }
-
-  /* Disable GUI callbacks */
-  for (evt = 0; evt < GSOCK_MAX_EVENT; evt++)
-    m_cbacks[evt] = NULL;
-
-  m_detected = GSOCK_LOST_FLAG;
-}
-
 /* Address handling */
 
 /* GSocket_SetLocal:
 /* Address handling */
 
 /* GSocket_SetLocal:
@@ -393,7 +327,7 @@ GSocket *GSocket::WaitConnection()
   }
 
   /* Create a GSocket object for the new connection */
   }
 
   /* Create a GSocket object for the new connection */
-  connection = GSocket_new();
+  connection = GSocket::Create();
 
   if (!connection)
   {
 
   if (!connection)
   {
@@ -1032,17 +966,6 @@ int GSocket::Send_Dgram(const char *buffer, int size)
   return ret;
 }
 
   return ret;
 }
 
-/* Compatibility functions for GSocket */
-GSocket *GSocket_new()
-{
-    GSocket *newsocket = new GSocket();
-    if(newsocket->IsOk())
-        return newsocket;
-    delete newsocket;
-    return NULL;
-}
-
-
 /*
  * -------------------------------------------------------------------------
  * GAddress
 /*
  * -------------------------------------------------------------------------
  * GAddress
index 489feff570b45f59d255b128d01ac6ddd446dde3..61ba71bdfe4cedae43b791691f923d6016603c49 100644 (file)
@@ -313,10 +313,10 @@ void GSocketMSWManager::Destroy_Socket(GSocket *socket)
 {
   /* Remove the socket from the list */
   EnterCriticalSection(&critical);
 {
   /* Remove the socket from the list */
   EnterCriticalSection(&critical);
-  if ( socket->IsOk() )
-  {
-      const int msgnum = socket->m_msgnumber;
 
 
+  const int msgnum = socket->m_msgnumber;
+  if ( msgnum )
+  {
       // we need to remove any pending messages for this socket to avoid having
       // them sent to a new socket which could reuse the same message number as
       // soon as we destroy this one
       // we need to remove any pending messages for this socket to avoid having
       // them sent to a new socket which could reuse the same message number as
       // soon as we destroy this one
@@ -326,6 +326,7 @@ void GSocketMSWManager::Destroy_Socket(GSocket *socket)
 
       socketList[msgnum - WM_USER] = NULL;
   }
 
       socketList[msgnum - WM_USER] = NULL;
   }
+  //else: the socket has never been created successfully
 
   LeaveCriticalSection(&critical);
 }
 
   LeaveCriticalSection(&critical);
 }
index 97105ca534aa7a9386492ad38ea7468fa9294b8e..226f46ad0da8b6110742790d34295b35a67e768c 100644 (file)
@@ -134,13 +134,6 @@ int _System soclose(int);
 #define SOCKOPTLEN_T WX_SOCKLEN_T
 #endif
 
 #define SOCKOPTLEN_T WX_SOCKLEN_T
 #endif
 
-/*
- * MSW defines this, Unices don't.
- */
-#ifndef INVALID_SOCKET
-#define INVALID_SOCKET -1
-#endif
-
 /* UnixWare reportedly needs this for FIONBIO definition */
 #ifdef __UNIXWARE__
 #include <sys/filio.h>
 /* UnixWare reportedly needs this for FIONBIO definition */
 #ifdef __UNIXWARE__
 #include <sys/filio.h>
@@ -476,34 +469,10 @@ void GSocket_Cleanup()
 
 GSocket::GSocket()
 {
 
 GSocket::GSocket()
 {
-  int i;
-
-  m_fd                  = INVALID_SOCKET;
   m_handler             = NULL;
 
   m_handler             = NULL;
 
-  for (i=0;i<GSOCK_MAX_EVENT;i++)
-  {
-    m_cbacks[i]         = NULL;
-  }
-  m_detected            = 0;
-  m_local               = NULL;
-  m_peer                = NULL;
-  m_error               = GSOCK_NOERROR;
-  m_server              = false;
-  m_stream              = true;
   m_gui_dependent       = NULL;
   m_gui_dependent       = NULL;
-  m_non_blocking        = false;
-  m_reusable            = false;
-  m_broadcast           = false;
-  m_dobind              = true;
-  m_timeout             = 10*60*1000;
-                                /* 10 minutes * 60 sec * 1000 millisec */
-  m_establishing        = false;
   m_use_events          = false;
   m_use_events          = false;
-  m_initialRecvBufferSize = -1;
-  m_initialSendBufferSize = -1;
-
-  m_ok = GSocketManager::Get()->Init_Socket(this);
 }
 
 void GSocket::Close()
 }
 
 void GSocket::Close()
@@ -526,23 +495,7 @@ void GSocket::Close()
 
 GSocket::~GSocket()
 {
 
 GSocket::~GSocket()
 {
-  assert(this);
-
-  /* Check that the socket is really shutdowned */
-  if (m_fd != INVALID_SOCKET)
-    Shutdown();
-
-  GSocketManager::Get()->Destroy_Socket(this);
-
   delete m_handler;
   delete m_handler;
-
-  /* Destroy private addresses */
-  if (m_local)
-    GAddress_destroy(m_local);
-
-  if (m_peer)
-    GAddress_destroy(m_peer);
-
 }
 
 /* GSocket_Shutdown:
 }
 
 /* GSocket_Shutdown:
@@ -551,26 +504,11 @@ GSocket::~GSocket()
  */
 void GSocket::Shutdown()
 {
  */
 void GSocket::Shutdown()
 {
-  int evt;
-
-  assert(this);
-
-  /* Don't allow events to fire after socket has been closed */
-  if (m_use_events)
-    DisableEvents();
-
-  /* If socket has been created, shutdown it */
-  if (m_fd != INVALID_SOCKET)
-  {
-    shutdown(m_fd, 1);
-    Close();
-  }
-
-  /* Disable GUI callbacks */
-  for (evt = 0; evt < GSOCK_MAX_EVENT; evt++)
-    m_cbacks[evt] = NULL;
+    /* Don't allow events to fire after socket has been closed */
+    if (m_use_events)
+        DisableEvents();
 
 
-  m_detected = GSOCK_LOST_FLAG;
+    GSocketBase::Shutdown();
 }
 
 /* Address handling */
 }
 
 /* Address handling */
@@ -803,7 +741,7 @@ GSocket *GSocket::WaitConnection()
   }
 
   /* Create a GSocket object for the new connection */
   }
 
   /* Create a GSocket object for the new connection */
-  connection = GSocket_new();
+  connection = GSocket::Create();
 
   if (!connection)
   {
 
   if (!connection)
   {
@@ -1743,18 +1681,6 @@ void GSocket::Detected_Write()
   }
 }
 
   }
 }
 
-/* Compatibility functions for GSocket */
-GSocket *GSocket_new(void)
-{
-    GSocket *newsocket = new GSocket();
-    if (newsocket->IsOk())
-        return newsocket;
-
-    delete newsocket;
-
-    return NULL;
-}
-
 /*
  * -------------------------------------------------------------------------
  * GAddress
 /*
  * -------------------------------------------------------------------------
  * GAddress