/* -------------------------------------------------------------------------
* Project: GSocket (Generic Socket)
- * Name: gsocket.c
+ * Name: gsocket.cpp
* Author: Guillermo Rodriguez Garcia <guille@iies.es>
* Purpose: GSocket main MSW file
* Licence: The wxWindows licence
* -------------------------------------------------------------------------
*/
-/*
- * PLEASE don't put C++ comments here - this is a C source file.
- */
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
#ifdef _MSC_VER
/* RPCNOTIFICATION_ROUTINE in rasasync.h (included from winsock.h),
/* Table of GUI-related functions. We must call them indirectly because
* of wxBase and GUI separation: */
-static class GSocketGUIFunctionsTable *gs_gui_functions;
+static GSocketGUIFunctionsTable *gs_gui_functions;
+class GSocketGUIFunctionsTableNull: public GSocketGUIFunctionsTable
+{
+public:
+ virtual bool OnInit();
+ virtual void OnExit();
+ virtual bool CanUseEventLoop();
+ virtual bool Init_Socket(GSocket *socket);
+ virtual void Destroy_Socket(GSocket *socket);
+ virtual void Enable_Events(GSocket *socket);
+ virtual void Disable_Events(GSocket *socket);
+};
+
+bool GSocketGUIFunctionsTableNull::OnInit()
+{ return true; }
+void GSocketGUIFunctionsTableNull::OnExit()
+{}
+bool GSocketGUIFunctionsTableNull::CanUseEventLoop()
+{ return false; }
+bool GSocketGUIFunctionsTableNull::Init_Socket(GSocket *WXUNUSED(socket))
+{ return true; }
+void GSocketGUIFunctionsTableNull::Destroy_Socket(GSocket *WXUNUSED(socket))
+{}
+void GSocketGUIFunctionsTableNull::Enable_Events(GSocket *WXUNUSED(socket))
+{}
+void GSocketGUIFunctionsTableNull::Disable_Events(GSocket *WXUNUSED(socket))
+{}
/* Global initialisers */
-void GSocket_SetGUIFunctions(struct GSocketGUIFunctionsTable *guifunc)
+void GSocket_SetGUIFunctions(GSocketGUIFunctionsTable *guifunc)
{
gs_gui_functions = guifunc;
}
{
WSADATA wsaData;
- if (gs_gui_functions)
+ if (!gs_gui_functions)
{
- if ( !gs_gui_functions->OnInit() )
- {
- return 0;
- }
+ static GSocketGUIFunctionsTableNull table;
+ gs_gui_functions = &table;
+ }
+ if ( !gs_gui_functions->OnInit() )
+ {
+ return 0;
}
/* Initialize WinSocket */
m_local = NULL;
m_peer = NULL;
m_error = GSOCK_NOERROR;
- m_server = FALSE;
- m_stream = TRUE;
+ 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_establishing = false;
+ m_reusable = false;
assert(gs_gui_functions);
/* Per-socket GUI-specific initialization */
}
/* Initialize all fields */
- m_server = TRUE;
- m_stream = TRUE;
+ m_server = true;
+ m_stream = true;
/* Create the socket */
m_fd = socket(m_local->m_realfamily, SOCK_STREAM, 0);
/* Wait for a connection (with timeout) */
if (Input_Timeout() == GSOCK_TIMEDOUT)
{
- GSocket_destroy(connection);
+ delete connection;
/* m_error set by _GSocket_Input_Timeout */
return NULL;
}
else
m_error = GSOCK_IOERR;
- GSocket_destroy(connection);
+ delete connection;
return NULL;
}
/* Initialize all fields */
- connection->m_server = FALSE;
- connection->m_stream = TRUE;
+ connection->m_server = false;
+ connection->m_stream = true;
/* Setup the peer address field */
connection->m_peer = GAddress_new();
if (!connection->m_peer)
{
- GSocket_destroy(connection);
+ delete connection;
m_error = GSOCK_MEMERR;
return NULL;
}
if (err != GSOCK_NOERROR)
{
GAddress_destroy(connection->m_peer);
- GSocket_destroy(connection);
+ delete connection;
m_error = err;
return NULL;
}
* Returns TRUE if the flag was set correctly, FALSE if an error occured
* (ie, if the parameter was NULL)
*/
-int GSocket::SetReusable()
+bool GSocket::SetReusable()
{
/* socket must not be null, and must not be in use/already bound */
if (this && m_fd == INVALID_SOCKET) {
- m_reusable = TRUE;
- return TRUE;
+ m_reusable = true;
+ return true;
}
- return FALSE;
+ return false;
}
/* Client specific parts */
/* Streamed or dgram socket? */
m_stream = (stream == GSOCK_STREAMED);
- m_server = FALSE;
- m_establishing = FALSE;
+ m_server = false;
+ m_establishing = false;
/* Create the socket */
m_fd = socket(m_peer->m_realfamily,
*/
if ((err == WSAEWOULDBLOCK) && (m_non_blocking))
{
- m_establishing = TRUE;
+ m_establishing = true;
m_error = GSOCK_WOULDBLOCK;
return GSOCK_WOULDBLOCK;
}
}
/* Initialize all fields */
- m_stream = FALSE;
- m_server = FALSE;
+ m_stream = false;
+ m_server = false;
/* Create the socket */
m_fd = socket(m_local->m_realfamily, SOCK_DGRAM, 0);
*/
if ((m_detected & GSOCK_LOST_FLAG) != 0)
{
- m_establishing = FALSE;
+ m_establishing = false;
return (GSOCK_LOST_FLAG & flags);
}
else
{
m_detected = GSOCK_LOST_FLAG;
- m_establishing = FALSE;
+ m_establishing = false;
/* LOST event: Abort any further processing */
return (GSOCK_LOST_FLAG & flags);
int error;
SOCKLEN_T len = sizeof(error);
- m_establishing = FALSE;
+ m_establishing = false;
getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*)&error, &len);
/* Check for exceptions and errors (is this useful in Unices?) */
if (FD_ISSET(m_fd, &exceptfds))
{
- m_establishing = FALSE;
+ m_establishing = false;
m_detected = GSOCK_LOST_FLAG;
/* LOST event: Abort any further processing */
* operations do not clear this back to GSOCK_NOERROR, so use it only
* after an error.
*/
-GSocketError GSocket::GetError()
+GSocketError WXDLLIMPEXP_NET GSocket::GetError()
{
assert(this);