]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/socket.cpp
correcting CGImage handling to be always correctly initialized and freed on OSX build...
[wxWidgets.git] / src / common / socket.cpp
index bbbdc01e59faf100ce37ac5b2633c413e33cfd25..ec78106dc57db3553da41f5f3e4870e62e3625f4 100644 (file)
 // Declarations
 // ==========================================================================
 
 // Declarations
 // ==========================================================================
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "socket.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -40,6 +36,7 @@
 
 #include "wx/sckaddr.h"
 #include "wx/socket.h"
 
 #include "wx/sckaddr.h"
 #include "wx/socket.h"
+#include "wx/stopwatch.h"
 
 // DLL options compatibility check:
 #include "wx/build.h"
 
 // DLL options compatibility check:
 #include "wx/build.h"
@@ -98,7 +95,7 @@ public:
 public:
   wxSocketState() : wxObject() {}
 
 public:
   wxSocketState() : wxObject() {}
 
-    DECLARE_NO_COPY_CLASS(wxSocketState)
+  DECLARE_NO_COPY_CLASS(wxSocketState)
 };
 
 // ==========================================================================
 };
 
 // ==========================================================================
@@ -122,14 +119,6 @@ bool wxSocketBase::Initialize()
 {
     if ( !m_countInit++ )
     {
 {
     if ( !m_countInit++ )
     {
-#ifdef __WXMSW__
-        /*
-            The following asserting might be neccessary for linux as well,
-            but I cannot verify this.
-        */
-        wxASSERT(wxThread::IsMain(), 
-            wxT("To use sockets in a secondary thread, ")
-            wxT("call wxSocketBase::Initialize() from the main thread."));
         /*
             Details: Initialize() creates a hidden window as a sink for socket
             events, such as 'read completed'. wxMSW has only one message loop
         /*
             Details: Initialize() creates a hidden window as a sink for socket
             events, such as 'read completed'. wxMSW has only one message loop
@@ -138,25 +127,32 @@ bool wxSocketBase::Initialize()
             since there is no message loop on this thread, it will never
             receive events and all socket operations will time out.
             BTW, the main thread must not be stopped using sleep or block
             since there is no message loop on this thread, it will never
             receive events and all socket operations will time out.
             BTW, the main thread must not be stopped using sleep or block
-            on a semaphore (a bad idea in any case) or socket operations 
+            on a semaphore (a bad idea in any case) or socket operations
             will time out.
             will time out.
+
+            On the Mac side, Initialize() stores a pointer to the CFRunLoop for
+            the main thread. Because secondary threads do not have run loops,
+            adding event notifications to the "Current" loop would have no
+            effect at all, events would never fire.
         */
         */
-#endif
+        wxASSERT_MSG( wxIsMainThread(),
+            wxT("Call wxSocketBase::Initialize() from the main thread first!"));
+
         wxAppTraits *traits = wxAppConsole::GetInstance() ?
                               wxAppConsole::GetInstance()->GetTraits() : NULL;
         wxAppTraits *traits = wxAppConsole::GetInstance() ?
                               wxAppConsole::GetInstance()->GetTraits() : NULL;
-        GSocketGUIFunctionsTable *functions = 
+        GSocketGUIFunctionsTable *functions =
             traits ? traits->GetSocketGUIFunctionsTable() : NULL;
         GSocket_SetGUIFunctions(functions);
             traits ? traits->GetSocketGUIFunctionsTable() : NULL;
         GSocket_SetGUIFunctions(functions);
-        
+
         if ( !GSocket_Init() )
         {
             m_countInit--;
 
         if ( !GSocket_Init() )
         {
             m_countInit--;
 
-            return FALSE;
+            return false;
         }
     }
 
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 void wxSocketBase::Shutdown()
 }
 
 void wxSocketBase::Shutdown()
@@ -184,10 +180,10 @@ void wxSocketBase::Init()
   m_establishing =
   m_reading      =
   m_writing      =
   m_establishing =
   m_reading      =
   m_writing      =
-  m_error        = FALSE;
+  m_error        = false;
   m_lcount       = 0;
   m_timeout      = 600;
   m_lcount       = 0;
   m_timeout      = 600;
-  m_beingDeleted = FALSE;
+  m_beingDeleted = false;
 
   // pushback buffer
   m_unread       = NULL;
 
   // pushback buffer
   m_unread       = NULL;
@@ -195,10 +191,10 @@ void wxSocketBase::Init()
   m_unrd_cur     = 0;
 
   // events
   m_unrd_cur     = 0;
 
   // events
-  m_id           = -1;
+  m_id           = wxID_ANY;
   m_handler      = NULL;
   m_clientData   = NULL;
   m_handler      = NULL;
   m_clientData   = NULL;
-  m_notify       = FALSE;
+  m_notify       = false;
   m_eventmask    = 0;
 
   if ( !IsInitialized() )
   m_eventmask    = 0;
 
   if ( !IsInitialized() )
@@ -236,7 +232,7 @@ wxSocketBase::~wxSocketBase()
 
   // Destroy the GSocket object
   if (m_socket)
 
   // Destroy the GSocket object
   if (m_socket)
-    GSocket_destroy(m_socket);
+    delete m_socket;
 
   // Free the pushback buffer
   if (m_unread)
 
   // Free the pushback buffer
   if (m_unread)
@@ -248,13 +244,13 @@ bool wxSocketBase::Destroy()
   // Delayed destruction: the socket will be deleted during the next
   // idle loop iteration. This ensures that all pending events have
   // been processed.
   // Delayed destruction: the socket will be deleted during the next
   // idle loop iteration. This ensures that all pending events have
   // been processed.
-  m_beingDeleted = TRUE;
+  m_beingDeleted = true;
 
   // Shutdown and close the socket
   Close();
 
   // Supress events from now on
 
   // Shutdown and close the socket
   Close();
 
   // Supress events from now on
-  Notify(FALSE);
+  Notify(false);
 
   // schedule this object for deletion
   wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
 
   // schedule this object for deletion
   wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
@@ -269,7 +265,7 @@ bool wxSocketBase::Destroy()
       delete this;
   }
 
       delete this;
   }
 
-  return TRUE;
+  return true;
 }
 
 // --------------------------------------------------------------------------
 }
 
 // --------------------------------------------------------------------------
@@ -289,22 +285,22 @@ bool wxSocketBase::Close()
   if (m_socket)
   {
     // Disable callbacks
   if (m_socket)
   {
     // Disable callbacks
-    GSocket_UnsetCallback(m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
+    m_socket->UnsetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
                                     GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG);
 
     // Shutdown the connection
                                     GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG);
 
     // Shutdown the connection
-    GSocket_Shutdown(m_socket);
+    m_socket->Shutdown();
   }
 
   }
 
-  m_connected = FALSE;
-  m_establishing = FALSE;
-  return TRUE;
+  m_connected = false;
+  m_establishing = false;
+  return true;
 }
 
 wxSocketBase& wxSocketBase::Read(void* buffer, wxUint32 nbytes)
 {
   // Mask read events
 }
 
 wxSocketBase& wxSocketBase::Read(void* buffer, wxUint32 nbytes)
 {
   // Mask read events
-  m_reading = TRUE;
+  m_reading = true;
 
   m_lcount = _Read(buffer, nbytes);
 
 
   m_lcount = _Read(buffer, nbytes);
 
@@ -315,7 +311,7 @@ wxSocketBase& wxSocketBase::Read(void* buffer, wxUint32 nbytes)
     m_error = (m_lcount == 0);
 
   // Allow read events from now on
     m_error = (m_lcount == 0);
 
   // Allow read events from now on
-  m_reading = FALSE;
+  m_reading = false;
 
   return *this;
 }
 
   return *this;
 }
@@ -325,7 +321,7 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes)
   int total;
 
   // Try the pushback buffer first
   int total;
 
   // Try the pushback buffer first
-  total = GetPushback(buffer, nbytes, FALSE);
+  total = GetPushback(buffer, nbytes, false);
   nbytes -= total;
   buffer  = (char *)buffer + total;
 
   nbytes -= total;
   buffer  = (char *)buffer + total;
 
@@ -347,23 +343,23 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes)
   int ret;
   if (m_flags & wxSOCKET_NOWAIT)
   {
   int ret;
   if (m_flags & wxSOCKET_NOWAIT)
   {
-    GSocket_SetNonBlocking(m_socket, 1);
-    ret = GSocket_Read(m_socket, (char *)buffer, nbytes);
-    GSocket_SetNonBlocking(m_socket, 0);
+    m_socket->SetNonBlocking(1);
+    ret = m_socket->Read((char *)buffer, nbytes);
+    m_socket->SetNonBlocking(0);
 
     if (ret > 0)
       total += ret;
   }
   else
   {
 
     if (ret > 0)
       total += ret;
   }
   else
   {
-    bool more = TRUE;
+    bool more = true;
 
     while (more)
     {
       if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForRead() )
         break;
 
 
     while (more)
     {
       if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForRead() )
         break;
 
-      ret = GSocket_Read(m_socket, (char *)buffer, nbytes);
+      ret = m_socket->Read((char *)buffer, nbytes);
 
       if (ret > 0)
       {
 
       if (ret > 0)
       {
@@ -395,10 +391,10 @@ wxSocketBase& wxSocketBase::ReadMsg(void* buffer, wxUint32 nbytes)
   } msg;
 
   // Mask read events
   } msg;
 
   // Mask read events
-  m_reading = TRUE;
+  m_reading = true;
 
   total = 0;
 
   total = 0;
-  error = TRUE;
+  error = true;
   old_flags = m_flags;
   SetFlags((m_flags & wxSOCKET_BLOCK) | wxSOCKET_WAITALL);
 
   old_flags = m_flags;
   SetFlags((m_flags & wxSOCKET_BLOCK) | wxSOCKET_WAITALL);
 
@@ -471,12 +467,12 @@ wxSocketBase& wxSocketBase::ReadMsg(void* buffer, wxUint32 nbytes)
   }
 
   // everything was OK
   }
 
   // everything was OK
-  error = FALSE;
+  error = false;
 
 exit:
   m_error = error;
   m_lcount = total;
 
 exit:
   m_error = error;
   m_lcount = total;
-  m_reading = FALSE;
+  m_reading = false;
   SetFlags(old_flags);
 
   return *this;
   SetFlags(old_flags);
 
   return *this;
@@ -485,7 +481,7 @@ exit:
 wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes)
 {
   // Mask read events
 wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes)
 {
   // Mask read events
-  m_reading = TRUE;
+  m_reading = true;
 
   m_lcount = _Read(buffer, nbytes);
   Pushback(buffer, m_lcount);
 
   m_lcount = _Read(buffer, nbytes);
   Pushback(buffer, m_lcount);
@@ -497,7 +493,7 @@ wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes)
     m_error = (m_lcount == 0);
 
   // Allow read events again
     m_error = (m_lcount == 0);
 
   // Allow read events again
-  m_reading = FALSE;
+  m_reading = false;
 
   return *this;
 }
 
   return *this;
 }
@@ -505,7 +501,7 @@ wxSocketBase& wxSocketBase::Peek(void* buffer, wxUint32 nbytes)
 wxSocketBase& wxSocketBase::Write(const void *buffer, wxUint32 nbytes)
 {
   // Mask write events
 wxSocketBase& wxSocketBase::Write(const void *buffer, wxUint32 nbytes)
 {
   // Mask write events
-  m_writing = TRUE;
+  m_writing = true;
 
   m_lcount = _Write(buffer, nbytes);
 
 
   m_lcount = _Write(buffer, nbytes);
 
@@ -516,7 +512,7 @@ wxSocketBase& wxSocketBase::Write(const void *buffer, wxUint32 nbytes)
     m_error = (m_lcount == 0);
 
   // Allow write events again
     m_error = (m_lcount == 0);
 
   // Allow write events again
-  m_writing = FALSE;
+  m_writing = false;
 
   return *this;
 }
 
   return *this;
 }
@@ -538,23 +534,23 @@ wxUint32 wxSocketBase::_Write(const void *buffer, wxUint32 nbytes)
   int ret;
   if (m_flags & wxSOCKET_NOWAIT)
   {
   int ret;
   if (m_flags & wxSOCKET_NOWAIT)
   {
-    GSocket_SetNonBlocking(m_socket, 1);
-    ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
-    GSocket_SetNonBlocking(m_socket, 0);
+    m_socket->SetNonBlocking(1);
+    ret = m_socket->Write((const char *)buffer, nbytes);
+    m_socket->SetNonBlocking(0);
 
     if (ret > 0)
       total = ret;
   }
   else
   {
 
     if (ret > 0)
       total = ret;
   }
   else
   {
-    bool more = TRUE;
+    bool more = true;
 
     while (more)
     {
       if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
         break;
 
 
     while (more)
     {
       if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
         break;
 
-      ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
+      ret = m_socket->Write((const char *)buffer, nbytes);
 
       if (ret > 0)
       {
 
       if (ret > 0)
       {
@@ -585,9 +581,9 @@ wxSocketBase& wxSocketBase::WriteMsg(const void *buffer, wxUint32 nbytes)
   } msg;
 
   // Mask write events
   } msg;
 
   // Mask write events
-  m_writing = TRUE;
+  m_writing = true;
 
 
-  error = TRUE;
+  error = true;
   total = 0;
   SetFlags((m_flags & wxSOCKET_BLOCK) | wxSOCKET_WAITALL);
 
   total = 0;
   SetFlags((m_flags & wxSOCKET_BLOCK) | wxSOCKET_WAITALL);
 
@@ -619,12 +615,12 @@ wxSocketBase& wxSocketBase::WriteMsg(const void *buffer, wxUint32 nbytes)
     goto exit;
 
   // everything was OK
     goto exit;
 
   // everything was OK
-  error = FALSE;
+  error = false;
 
 exit:
   m_error = error;
   m_lcount = total;
 
 exit:
   m_error = error;
   m_lcount = total;
-  m_writing = FALSE;
+  m_writing = false;
 
   return *this;
 }
 
   return *this;
 }
@@ -634,7 +630,7 @@ wxSocketBase& wxSocketBase::Unread(const void *buffer, wxUint32 nbytes)
   if (nbytes != 0)
     Pushback(buffer, nbytes);
 
   if (nbytes != 0)
     Pushback(buffer, nbytes);
 
-  m_error = FALSE;
+  m_error = false;
   m_lcount = nbytes;
 
   return *this;
   m_lcount = nbytes;
 
   return *this;
@@ -647,7 +643,7 @@ wxSocketBase& wxSocketBase::Discard()
   wxUint32 total = 0;
 
   // Mask read events
   wxUint32 total = 0;
 
   // Mask read events
-  m_reading = TRUE;
+  m_reading = true;
 
   SetFlags(wxSOCKET_NOWAIT);
 
 
   SetFlags(wxSOCKET_NOWAIT);
 
@@ -660,10 +656,10 @@ wxSocketBase& wxSocketBase::Discard()
 
   delete[] buffer;
   m_lcount = total;
 
   delete[] buffer;
   m_lcount = total;
-  m_error  = FALSE;
+  m_error  = false;
 
   // Allow read events again
 
   // Allow read events again
-  m_reading = FALSE;
+  m_reading = false;
 
   return *this;
 }
 
   return *this;
 }
@@ -685,12 +681,12 @@ bool wxSocketBase::_Wait(long seconds,
   GSocketEventFlags result;
   long timeout;
 
   GSocketEventFlags result;
   long timeout;
 
-  // Set this to TRUE to interrupt ongoing waits
-  m_interrupt = FALSE;
+  // Set this to true to interrupt ongoing waits
+  m_interrupt = false;
 
   // Check for valid socket
   if (!m_socket)
 
   // Check for valid socket
   if (!m_socket)
-    return FALSE;
+    return false;
 
   // Check for valid timeout value.
   if (seconds != -1)
 
   // Check for valid timeout value.
   if (seconds != -1)
@@ -699,8 +695,8 @@ bool wxSocketBase::_Wait(long seconds,
     timeout = m_timeout * 1000;
 
 #if !defined(wxUSE_GUI) || !wxUSE_GUI
     timeout = m_timeout * 1000;
 
 #if !defined(wxUSE_GUI) || !wxUSE_GUI
-  GSocket_SetTimeout(m_socket, timeout);
-#endif 
+  m_socket->SetTimeout(timeout);
+#endif
 
   // Wait in an active polling loop.
   //
 
   // Wait in an active polling loop.
   //
@@ -713,42 +709,42 @@ bool wxSocketBase::_Wait(long seconds,
   // we are just polling). Also, if just polling, do not yield.
 
   wxStopWatch chrono;
   // we are just polling). Also, if just polling, do not yield.
 
   wxStopWatch chrono;
-  bool done = FALSE;
+  bool done = false;
 
   while (!done)
   {
 
   while (!done)
   {
-    result = GSocket_Select(m_socket, flags | GSOCK_LOST_FLAG);
+    result = m_socket->Select(flags | GSOCK_LOST_FLAG);
 
     // Incoming connection (server) or connection established (client)
     if (result & GSOCK_CONNECTION_FLAG)
     {
 
     // Incoming connection (server) or connection established (client)
     if (result & GSOCK_CONNECTION_FLAG)
     {
-      m_connected = TRUE;
-      m_establishing = FALSE;
-      return TRUE;
+      m_connected = true;
+      m_establishing = false;
+      return true;
     }
 
     // Data available or output buffer ready
     if ((result & GSOCK_INPUT_FLAG) || (result & GSOCK_OUTPUT_FLAG))
     {
     }
 
     // Data available or output buffer ready
     if ((result & GSOCK_INPUT_FLAG) || (result & GSOCK_OUTPUT_FLAG))
     {
-      return TRUE;
+      return true;
     }
 
     // Connection lost
     if (result & GSOCK_LOST_FLAG)
     {
     }
 
     // Connection lost
     if (result & GSOCK_LOST_FLAG)
     {
-      m_connected = FALSE;
-      m_establishing = FALSE;
+      m_connected = false;
+      m_establishing = false;
       return (flags & GSOCK_LOST_FLAG) != 0;
     }
 
     // Wait more?
     if ((!timeout) || (chrono.Time() > timeout) || (m_interrupt))
       return (flags & GSOCK_LOST_FLAG) != 0;
     }
 
     // Wait more?
     if ((!timeout) || (chrono.Time() > timeout) || (m_interrupt))
-      done = TRUE;
+      done = true;
     else
       PROCESS_EVENTS();
   }
 
     else
       PROCESS_EVENTS();
   }
 
-  return FALSE;
+  return false;
 }
 
 bool wxSocketBase::Wait(long seconds, long milliseconds)
 }
 
 bool wxSocketBase::Wait(long seconds, long milliseconds)
@@ -763,11 +759,11 @@ bool wxSocketBase::WaitForRead(long seconds, long milliseconds)
 {
   // Check pushback buffer before entering _Wait
   if (m_unread)
 {
   // Check pushback buffer before entering _Wait
   if (m_unread)
-    return TRUE;
+    return true;
 
   // Note that GSOCK_INPUT_LOST has to be explicitly passed to
 
   // Note that GSOCK_INPUT_LOST has to be explicitly passed to
-  // _Wait becuase of the semantics of WaitForRead: a return
-  // value of TRUE means that a GSocket_Read call will return
+  // _Wait because of the semantics of WaitForRead: a return
+  // value of true means that a GSocket_Read call will return
   // immediately, not that there is actually data to read.
 
   return _Wait(seconds, milliseconds, GSOCK_INPUT_FLAG |
   // immediately, not that there is actually data to read.
 
   return _Wait(seconds, milliseconds, GSOCK_INPUT_FLAG |
@@ -798,19 +794,19 @@ bool wxSocketBase::GetPeer(wxSockAddress& addr_man) const
   GAddress *peer;
 
   if (!m_socket)
   GAddress *peer;
 
   if (!m_socket)
-    return FALSE;
+    return false;
 
 
-  peer = GSocket_GetPeer(m_socket);
+  peer = m_socket->GetPeer();
 
     // copying a null address would just trigger an assert anyway
 
   if (!peer)
 
     // copying a null address would just trigger an assert anyway
 
   if (!peer)
-    return FALSE;
+    return false;
 
   addr_man.SetAddress(peer);
   GAddress_destroy(peer);
 
 
   addr_man.SetAddress(peer);
   GAddress_destroy(peer);
 
-  return TRUE;
+  return true;
 }
 
 bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const
 }
 
 bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const
@@ -818,13 +814,13 @@ bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const
   GAddress *local;
 
   if (!m_socket)
   GAddress *local;
 
   if (!m_socket)
-    return FALSE;
+    return false;
 
 
-  local = GSocket_GetLocal(m_socket);
+  local = m_socket->GetLocal();
   addr_man.SetAddress(local);
   GAddress_destroy(local);
 
   addr_man.SetAddress(local);
   GAddress_destroy(local);
 
-  return TRUE;
+  return true;
 }
 
 //
 }
 
 //
@@ -860,7 +856,7 @@ void wxSocketBase::RestoreState()
   m_notify     = state->m_notify;
   m_eventmask  = state->m_eventmask;
   m_clientData = state->m_clientData;
   m_notify     = state->m_notify;
   m_eventmask  = state->m_eventmask;
   m_clientData = state->m_clientData;
-  
+
   m_states.Erase(node);
   delete state;
 }
   m_states.Erase(node);
   delete state;
 }
@@ -874,7 +870,7 @@ void wxSocketBase::SetTimeout(long seconds)
   m_timeout = seconds;
 
   if (m_socket)
   m_timeout = seconds;
 
   if (m_socket)
-    GSocket_SetTimeout(m_socket, m_timeout * 1000);
+    m_socket->SetTimeout(m_timeout * 1000);
 }
 
 void wxSocketBase::SetFlags(wxSocketFlags flags)
 }
 
 void wxSocketBase::SetFlags(wxSocketFlags flags)
@@ -925,8 +921,8 @@ void wxSocketBase::OnRequest(wxSocketNotify notification)
   switch(notification)
   {
     case wxSOCKET_CONNECTION:
   switch(notification)
   {
     case wxSOCKET_CONNECTION:
-      m_establishing = FALSE;
-      m_connected = TRUE;
+      m_establishing = false;
+      m_connected = true;
       break;
 
     // If we are in the middle of a R/W operation, do not
       break;
 
     // If we are in the middle of a R/W operation, do not
@@ -934,18 +930,18 @@ void wxSocketBase::OnRequest(wxSocketNotify notification)
     // which are no longer valid.
 
     case wxSOCKET_INPUT:
     // which are no longer valid.
 
     case wxSOCKET_INPUT:
-      if (m_reading || !GSocket_Select(m_socket, GSOCK_INPUT_FLAG))
+      if (m_reading || !m_socket->Select(GSOCK_INPUT_FLAG))
         return;
       break;
 
     case wxSOCKET_OUTPUT:
         return;
       break;
 
     case wxSOCKET_OUTPUT:
-      if (m_writing || !GSocket_Select(m_socket, GSOCK_OUTPUT_FLAG))
+      if (m_writing || !m_socket->Select(GSOCK_OUTPUT_FLAG))
         return;
       break;
 
     case wxSOCKET_LOST:
         return;
       break;
 
     case wxSOCKET_LOST:
-      m_connected = FALSE;
-      m_establishing = FALSE;
+      m_connected = false;
+      m_establishing = false;
       break;
 
     default:
       break;
 
     default:
@@ -1057,7 +1053,7 @@ wxUint32 wxSocketBase::GetPushback(void *buffer, wxUint32 size, bool peek)
 // Ctor
 // --------------------------------------------------------------------------
 
 // Ctor
 // --------------------------------------------------------------------------
 
-wxSocketServer::wxSocketServer(wxSockAddress& addr_man,
+wxSocketServer::wxSocketServer(const wxSockAddress& addr_man,
                                wxSocketFlags flags)
               : wxSocketBase(flags, wxSOCKET_SERVER)
 {
                                wxSocketFlags flags)
               : wxSocketBase(flags, wxSOCKET_SERVER)
 {
@@ -1073,18 +1069,23 @@ wxSocketServer::wxSocketServer(wxSockAddress& addr_man,
 
         // Setup the socket as server
 
 
         // Setup the socket as server
 
-    GSocket_SetLocal(m_socket, addr_man.GetAddress());
-    if (GSocket_SetServer(m_socket) != GSOCK_NOERROR)
+    m_socket->SetLocal(addr_man.GetAddress());
+
+    if (GetFlags() & wxSOCKET_REUSEADDR) {
+        m_socket->SetReusable();
+    }
+
+    if (m_socket->SetServer() != GSOCK_NOERROR)
     {
     {
-        GSocket_destroy(m_socket);
+        delete m_socket;
         m_socket = NULL;
 
         wxLogTrace( wxTRACE_Socket, _T("*** GSocket_SetServer failed") );
         return;
     }
 
         m_socket = NULL;
 
         wxLogTrace( wxTRACE_Socket, _T("*** GSocket_SetServer failed") );
         return;
     }
 
-    GSocket_SetTimeout(m_socket, m_timeout * 1000);
-    GSocket_SetCallback(m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
+    m_socket->SetTimeout(m_timeout * 1000);
+    m_socket->SetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
                                   GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                   wx_socket_callback, (char *)this);
 }
                                   GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                   wx_socket_callback, (char *)this);
 }
@@ -1098,33 +1099,33 @@ bool wxSocketServer::AcceptWith(wxSocketBase& sock, bool wait)
   GSocket *child_socket;
 
   if (!m_socket)
   GSocket *child_socket;
 
   if (!m_socket)
-    return FALSE;
+    return false;
 
 
-  // If wait == FALSE, then the call should be nonblocking.
+  // If wait == false, then the call should be nonblocking.
   // When we are finished, we put the socket to blocking mode
   // again.
 
   if (!wait)
   // When we are finished, we put the socket to blocking mode
   // again.
 
   if (!wait)
-    GSocket_SetNonBlocking(m_socket, 1);
+    m_socket->SetNonBlocking(1);
 
 
-  child_socket = GSocket_WaitConnection(m_socket);
+  child_socket = m_socket->WaitConnection();
 
   if (!wait)
 
   if (!wait)
-    GSocket_SetNonBlocking(m_socket, 0);
+    m_socket->SetNonBlocking(0);
 
   if (!child_socket)
 
   if (!child_socket)
-    return FALSE;
+    return false;
 
   sock.m_type = wxSOCKET_BASE;
   sock.m_socket = child_socket;
 
   sock.m_type = wxSOCKET_BASE;
   sock.m_socket = child_socket;
-  sock.m_connected = TRUE;
+  sock.m_connected = true;
 
 
-  GSocket_SetTimeout(sock.m_socket, sock.m_timeout * 1000);
-  GSocket_SetCallback(sock.m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
+  sock.m_socket->SetTimeout(sock.m_timeout * 1000);
+  sock.m_socket->SetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
                                      GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                      wx_socket_callback, (char *)&sock);
 
                                      GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                      wx_socket_callback, (char *)&sock);
 
-  return TRUE;
+  return true;
 }
 
 wxSocketBase *wxSocketServer::Accept(bool wait)
 }
 
 wxSocketBase *wxSocketServer::Accept(bool wait)
@@ -1149,23 +1150,27 @@ bool wxSocketServer::WaitForAccept(long seconds, long milliseconds)
 
 bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen)
 {
 
 bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen)
 {
-    if (GSocket_GetSockOpt(m_socket, level, optname, optval, optlen) 
+    wxASSERT_MSG( m_socket, _T("Socket not initialised") );
+
+    if (m_socket->GetSockOpt(level, optname, optval, optlen)
         != GSOCK_NOERROR)
     {
         != GSOCK_NOERROR)
     {
-        return FALSE;
+        return false;
     }
     }
-    return TRUE;
+    return true;
 }
 
 }
 
-bool wxSocketBase::SetOption(int level, int optname, const void *optval, 
+bool wxSocketBase::SetOption(int level, int optname, const void *optval,
                               int optlen)
 {
                               int optlen)
 {
-    if (GSocket_SetSockOpt(m_socket, level, optname, optval, optlen) 
+    wxASSERT_MSG( m_socket, _T("Socket not initialised") );
+    
+    if (m_socket->SetSockOpt(level, optname, optval, optlen)
         != GSOCK_NOERROR)
     {
         != GSOCK_NOERROR)
     {
-        return FALSE;
+        return false;
     }
     }
-    return TRUE;
+    return true;
 }
 
 // ==========================================================================
 }
 
 // ==========================================================================
@@ -1197,53 +1202,53 @@ bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait)
   {
     // Shutdown and destroy the socket
     Close();
   {
     // Shutdown and destroy the socket
     Close();
-    GSocket_destroy(m_socket);
+    delete m_socket;
   }
 
   m_socket = GSocket_new();
   }
 
   m_socket = GSocket_new();
-  m_connected = FALSE;
-  m_establishing = FALSE;
+  m_connected = false;
+  m_establishing = false;
 
   if (!m_socket)
 
   if (!m_socket)
-    return FALSE;
+    return false;
 
 
-  GSocket_SetTimeout(m_socket, m_timeout * 1000);
-  GSocket_SetCallback(m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
+  m_socket->SetTimeout(m_timeout * 1000);
+  m_socket->SetCallback(GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
                                 GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                 wx_socket_callback, (char *)this);
 
                                 GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                 wx_socket_callback, (char *)this);
 
-  // If wait == FALSE, then the call should be nonblocking.
+  // If wait == false, then the call should be nonblocking.
   // When we are finished, we put the socket to blocking mode
   // again.
 
   if (!wait)
   // When we are finished, we put the socket to blocking mode
   // again.
 
   if (!wait)
-    GSocket_SetNonBlocking(m_socket, 1);
+    m_socket->SetNonBlocking(1);
 
 
-  GSocket_SetPeer(m_socket, addr_man.GetAddress());
-  err = GSocket_Connect(m_socket, GSOCK_STREAMED);
+  m_socket->SetPeer(addr_man.GetAddress());
+  err = m_socket->Connect(GSOCK_STREAMED);
 
   if (!wait)
 
   if (!wait)
-    GSocket_SetNonBlocking(m_socket, 0);
+    m_socket->SetNonBlocking(0);
 
   if (err != GSOCK_NOERROR)
   {
     if (err == GSOCK_WOULDBLOCK)
 
   if (err != GSOCK_NOERROR)
   {
     if (err == GSOCK_WOULDBLOCK)
-      m_establishing = TRUE;
+      m_establishing = true;
 
 
-    return FALSE;
+    return false;
   }
 
   }
 
-  m_connected = TRUE;
-  return TRUE;
+  m_connected = true;
+  return true;
 }
 
 bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds)
 {
   if (m_connected)                      // Already connected
 }
 
 bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds)
 {
   if (m_connected)                      // Already connected
-    return TRUE;
+    return true;
 
   if (!m_establishing || !m_socket)     // No connection in progress
 
   if (!m_establishing || !m_socket)     // No connection in progress
-    return FALSE;
+    return false;
 
   return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG |
                                       GSOCK_LOST_FLAG);
 
   return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG |
                                       GSOCK_LOST_FLAG);
@@ -1255,7 +1260,7 @@ bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds)
 
 /* NOTE: experimental stuff - might change */
 
 
 /* NOTE: experimental stuff - might change */
 
-wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr,
+wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr,
                                     wxSocketFlags flags )
                 : wxSocketBase( flags, wxSOCKET_DATAGRAM )
 {
                                     wxSocketFlags flags )
                 : wxSocketBase( flags, wxSOCKET_DATAGRAM )
 {
@@ -1268,20 +1273,19 @@ wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr,
     return;
   }
   // Setup the socket as non connection oriented
     return;
   }
   // Setup the socket as non connection oriented
-  GSocket_Unstreamed(m_socket);
-  GSocket_SetLocal(m_socket, addr.GetAddress());
-  if( GSocket_SetNonOriented(m_socket) != GSOCK_NOERROR )
+  m_socket->SetLocal(addr.GetAddress());
+  if( m_socket->SetNonOriented() != GSOCK_NOERROR )
   {
   {
-    GSocket_destroy(m_socket);
+    delete m_socket;
     m_socket = NULL;
     return;
   }
 
   // Initialize all stuff
     m_socket = NULL;
     return;
   }
 
   // Initialize all stuff
-  m_connected = FALSE;
-  m_establishing = FALSE;
-  GSocket_SetTimeout( m_socket, m_timeout );
-  GSocket_SetCallback( m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
+  m_connected = false;
+  m_establishing = false;
+  m_socket->SetTimeout( m_timeout );
+  m_socket->SetCallback( GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
                                  GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                  wx_socket_callback, (char*)this );
 
                                  GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG,
                                  wx_socket_callback, (char*)this );
 
@@ -1296,11 +1300,13 @@ wxDatagramSocket& wxDatagramSocket::RecvFrom( wxSockAddress& addr,
     return (*this);
 }
 
     return (*this);
 }
 
-wxDatagramSocket& wxDatagramSocket::SendTo( wxSockAddress& addr,
+wxDatagramSocket& wxDatagramSocket::SendTo( const wxSockAddress& addr,
                                             const void* buf,
                                             wxUint32 nBytes )
 {
                                             const void* buf,
                                             wxUint32 nBytes )
 {
-    GSocket_SetPeer(m_socket, addr.GetAddress());
+    wxASSERT_MSG( m_socket, _T("Socket not initialised") );
+    
+    m_socket->SetPeer(addr.GetAddress());
     Write(buf, nBytes);
     return (*this);
 }
     Write(buf, nBytes);
     return (*this);
 }
@@ -1315,7 +1321,7 @@ public:
     virtual bool OnInit()
     {
         // wxSocketBase will call GSocket_Init() itself when/if needed
     virtual bool OnInit()
     {
         // wxSocketBase will call GSocket_Init() itself when/if needed
-        return TRUE;
+        return true;
     }
 
     virtual void OnExit()
     }
 
     virtual void OnExit()