/* -------------------------------------------------------------------------
* Project: GSocket (Generic Socket)
* Name: gsocket.h
- * Author: Guilhem Lavaux
+ * Author: Guilhem Lavaux
* Guillermo Rodriguez Garcia <guille@iies.es> (maintainer)
* Purpose: GSocket include file (system independent)
* CVSID: $Id$
#ifndef __GSOCKET_H
#define __GSOCKET_H
+/* DFE: Define this and compile gsocket.cpp instead of gsocket.c and
+ compile existing GUI gsock*.c as C++ to try out the new GSocket. */
+/* #define wxUSE_GSOCKET_CPLUSPLUS 1 */
+#undef wxUSE_GSOCKET_CPLUSPLUS
+#if !defined(__cplusplus) && defined(wxUSE_GSOCKET_CPLUSPLUS)
+#error "You need to compile this file (probably a GUI gsock peice) as C++"
+#endif
+
#ifndef __GSOCKET_STANDALONE__
#include "wx/setup.h"
+#include "wx/platform.h"
+
+#include "wx/dlimpexp.h" /* for WXDLLIMPEXP_NET */
+
#endif
#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__)
#include <stddef.h>
-#include <sys/types.h>
-#if !defined(__cplusplus)
-typedef unsigned int bool;
+/*
+ Including sys/types.h under cygwin results in the warnings about "fd_set
+ having been defined in sys/types.h" when winsock.h is included later and
+ doesn't seem to be necessary anyhow. It's not needed under Mac neither.
+ */
+#if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__)
+#include <sys/types.h>
#endif
-#ifndef TRUE
-#define TRUE 1
+#ifdef __WXWINCE__
+#include <stdlib.h>
#endif
-#ifndef FALSE
-#define FALSE 0
+#ifdef wxUSE_GSOCKET_CPLUSPLUS
+typedef class GSocketBSD GSocket;
#endif
-
#ifdef __cplusplus
extern "C" {
#endif
+#ifndef wxUSE_GSOCKET_CPLUSPLUS
typedef struct _GSocket GSocket;
+#endif
typedef struct _GAddress GAddress;
typedef enum {
GSOCK_INVPORT,
GSOCK_WOULDBLOCK,
GSOCK_TIMEDOUT,
- GSOCK_MEMERR
+ GSOCK_MEMERR,
+ GSOCK_OPTERR,
} GSocketError;
/* See below for an explanation on how events work.
char *cdata);
+/* Functions tables for internal use by GSocket code: */
+
+#ifndef __WINDOWS__
+struct GSocketBaseFunctionsTable
+{
+ void (*Detected_Read)(GSocket *socket);
+ void (*Detected_Write)(GSocket *socket);
+};
+#endif
+
+struct GSocketGUIFunctionsTable
+{
+ int (*GUI_Init)(void);
+ void (*GUI_Cleanup)(void);
+ int (*GUI_Init_Socket)(GSocket *socket);
+ void (*GUI_Destroy_Socket)(GSocket *socket);
+#ifndef __WINDOWS__
+ void (*Install_Callback)(GSocket *socket, GSocketEvent event);
+ void (*Uninstall_Callback)(GSocket *socket, GSocketEvent event);
+#endif
+ void (*Enable_Events)(GSocket *socket);
+ void (*Disable_Events)(GSocket *socket);
+};
+
+
/* Global initializers */
+/* Sets GUI functions callbacks. Must be called *before* GSocket_Init
+ if the app uses async sockets. */
+void GSocket_SetGUIFunctions(struct GSocketGUIFunctionsTable *guifunc);
+
/* GSocket_Init() must be called at the beginning */
-bool GSocket_Init();
+int GSocket_Init(void);
/* GSocket_Cleanup() must be called at the end */
-void GSocket_Cleanup();
+void GSocket_Cleanup(void);
/* Constructors / Destructors */
-GSocket *GSocket_new();
+GSocket *GSocket_new(void);
void GSocket_destroy(GSocket *socket);
+#ifndef wxUSE_GSOCKET_CPLUSPLUS
/* GSocket_Shutdown:
* Disallow further read/write operations on this socket, close
* Sets up this socket as a server. The local address must have been
* set with GSocket_SetLocal() before GSocket_SetServer() is called.
* Returns GSOCK_NOERROR on success, one of the following otherwise:
- *
+ *
* Error codes:
* GSOCK_INVSOCK - the socket is in use.
* GSOCK_INVADDR - the local address has not been set.
- * GSOCK_IOERR - low-level error.
+ * GSOCK_IOERR - low-level error.
*/
GSocketError GSocket_SetServer(GSocket *socket);
* GSOCK_TIMEDOUT - timeout, no incoming connections.
* GSOCK_WOULDBLOCK - the call would block and the socket is nonblocking.
* GSOCK_MEMERR - couldn't allocate memory.
- * GSOCK_IOERR - low-level error.
+ * GSOCK_IOERR - low-level error.
*/
GSocket *GSocket_WaitConnection(GSocket *socket);
* GSOCK_TIMEDOUT - timeout, the connection failed.
* GSOCK_WOULDBLOCK - connection in progress (nonblocking sockets only)
* GSOCK_MEMERR - couldn't allocate memory.
- * GSOCK_IOERR - low-level error.
+ * GSOCK_IOERR - low-level error.
*/
GSocketError GSocket_Connect(GSocket *socket, GSocketStream stream);
+/* GSocket_SetReusable:
+* Simply sets the m_resuable flag on the socket. GSocket_SetServer will
+* make the appropriate setsockopt() call.
+* Implemented as a GSocket function because clients (ie, wxSocketServer)
+* don't have access to the GSocket struct information.
+* Returns TRUE if the flag was set correctly, FALSE if an error occured
+* (ie, if the parameter was NULL)
+*/
+int GSocket_SetReusable(GSocket *socket);
/* Datagram sockets */
* Error codes:
* GSOCK_INVSOCK - the socket is in use.
* GSOCK_INVADDR - the local address has not been set.
- * GSOCK_IOERR - low-level error.
+ * GSOCK_IOERR - low-level error.
*/
GSocketError GSocket_SetNonOriented(GSocket *socket);
*/
GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags);
+GSocketError GSocket_GetSockOpt(GSocket *socket, int level, int optname,
+ void *optval, int *optlen);
+
+GSocketError GSocket_SetSockOpt(GSocket *socket, int level, int optname,
+ const void *optval, int optlen);
/* Attributes */
* Sets the socket to non-blocking mode. All IO calls will return
* immediately.
*/
-void GSocket_SetNonBlocking(GSocket *socket, bool non_block);
+void GSocket_SetNonBlocking(GSocket *socket, int non_block);
/* GSocket_SetTimeout:
* Sets the timeout for blocking calls. Time is expressed in
*/
void GSocket_SetTimeout(GSocket *socket, unsigned long millisec);
+#endif /* ndef wxUSE_GSOCKET_CPLUSPLUS */
+
/* GSocket_GetError:
* Returns the last error occured for this socket. Note that successful
* operations do not clear this back to GSOCK_NOERROR, so use it only
* after an error.
*/
-GSocketError GSocket_GetError(GSocket *socket);
+GSocketError WXDLLIMPEXP_NET GSocket_GetError(GSocket *socket);
+#ifndef wxUSE_GSOCKET_CPLUSPLUS
/* Callbacks */
* operation, there is still data available, the callback function will
* be called again.
* GSOCK_OUTPUT:
- * The socket is available for writing. That is, the next write call
+ * The socket is available for writing. That is, the next write call
* won't block. This event is generated only once, when the connection is
* first established, and then only if a call failed with GSOCK_WOULDBLOCK,
* when the output buffer empties again. This means that the app should
*/
void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags flags);
+#endif /* ndef wxUSE_GSOCKET_CPLUSPLUS */
+
/* GAddress */
-GAddress *GAddress_new();
+GAddress *GAddress_new(void);
GAddress *GAddress_copy(GAddress *address);
void GAddress_destroy(GAddress *address);
GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf);
#ifdef __cplusplus
-};
+}
#endif /* __cplusplus */
+#ifdef wxUSE_GSOCKET_CPLUSPLUS
+#include "wx/unix/gsockunx.h"
+#endif
#endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */