1 /* ------------------------------------------------------------------------- 2 * Project: GSocket (Generic Socket) 3 * Name: gsocket.h 4 * Author: Guilhem Lavaux 5 * Guillermo Rodriguez Garcia <guille@iies.es> (maintainer) 6 * Copyright: (c) Guilhem Lavaux 7 * Licence: wxWindows Licence 8 * Purpose: GSocket include file (system independent) 9 * CVSID: $Id: gsocket.h 33948 2005-05-04 18:57:50Z JS $ 10 * ------------------------------------------------------------------------- 11 */ 12 13 #ifndef __GSOCKET_H 14 #define __GSOCKET_H 15 16 #ifndef __GSOCKET_STANDALONE__ 17 #include "wx/defs.h" 18 19 #include "wx/dlimpexp.h" /* for WXDLLIMPEXP_NET */ 20 21 #endif 22 23 #if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) 24 25 #include <stddef.h> 26 27 /* 28 Including sys/types.h under cygwin results in the warnings about "fd_set 29 having been defined in sys/types.h" when winsock.h is included later and 30 doesn't seem to be necessary anyhow. It's not needed under Mac neither. 31 */ 32 #if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__) 33 #include <sys/types.h> 34 #endif 35 36 #ifdef __WXWINCE__ 37 #include <stdlib.h> 38 #endif 39 40 class GSocket; 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 typedef struct _GAddress GAddress; 47 48 typedef enum { 49 GSOCK_NOFAMILY = 0, 50 GSOCK_INET, 51 GSOCK_INET6, 52 GSOCK_UNIX 53 } GAddressType; 54 55 typedef enum { 56 GSOCK_STREAMED, 57 GSOCK_UNSTREAMED 58 } GSocketStream; 59 60 typedef enum { 61 GSOCK_NOERROR = 0, 62 GSOCK_INVOP, 63 GSOCK_IOERR, 64 GSOCK_INVADDR, 65 GSOCK_INVSOCK, 66 GSOCK_NOHOST, 67 GSOCK_INVPORT, 68 GSOCK_WOULDBLOCK, 69 GSOCK_TIMEDOUT, 70 GSOCK_MEMERR, 71 GSOCK_OPTERR 72 } GSocketError; 73 74 /* See below for an explanation on how events work. 75 */ 76 typedef enum { 77 GSOCK_INPUT = 0, 78 GSOCK_OUTPUT = 1, 79 GSOCK_CONNECTION = 2, 80 GSOCK_LOST = 3, 81 GSOCK_MAX_EVENT = 4 82 } GSocketEvent; 83 84 enum { 85 GSOCK_INPUT_FLAG = 1 << GSOCK_INPUT, 86 GSOCK_OUTPUT_FLAG = 1 << GSOCK_OUTPUT, 87 GSOCK_CONNECTION_FLAG = 1 << GSOCK_CONNECTION, 88 GSOCK_LOST_FLAG = 1 << GSOCK_LOST 89 }; 90 91 typedef int GSocketEventFlags; 92 93 typedef void (*GSocketCallback)(GSocket *socket, GSocketEvent event, 94 char *cdata); 95 96 97 /* Functions tables for internal use by GSocket code: */ 98 99 /* Actually this is a misnomer now, but reusing this name means I don't 100 have to ifdef app traits or common socket code */ 101 class GSocketGUIFunctionsTable 102 { 103 public: 104 // needed since this class declares virtual members ~GSocketGUIFunctionsTable()105 virtual ~GSocketGUIFunctionsTable() { } 106 virtual bool OnInit() = 0; 107 virtual void OnExit() = 0; 108 virtual bool CanUseEventLoop() = 0; 109 virtual bool Init_Socket(GSocket *socket) = 0; 110 virtual void Destroy_Socket(GSocket *socket) = 0; 111 #ifndef __WINDOWS__ 112 virtual void Install_Callback(GSocket *socket, GSocketEvent event) = 0; 113 virtual void Uninstall_Callback(GSocket *socket, GSocketEvent event) = 0; 114 #endif 115 virtual void Enable_Events(GSocket *socket) = 0; 116 virtual void Disable_Events(GSocket *socket) = 0; 117 }; 118 119 120 /* Global initializers */ 121 122 /* Sets GUI functions callbacks. Must be called *before* GSocket_Init 123 if the app uses async sockets. */ 124 void GSocket_SetGUIFunctions(GSocketGUIFunctionsTable *guifunc); 125 126 /* GSocket_Init() must be called at the beginning */ 127 int GSocket_Init(void); 128 129 /* GSocket_Cleanup() must be called at the end */ 130 void GSocket_Cleanup(void); 131 132 133 /* Constructors / Destructors */ 134 135 GSocket *GSocket_new(void); 136 137 138 /* GAddress */ 139 140 GAddress *GAddress_new(void); 141 GAddress *GAddress_copy(GAddress *address); 142 void GAddress_destroy(GAddress *address); 143 144 void GAddress_SetFamily(GAddress *address, GAddressType type); 145 GAddressType GAddress_GetFamily(GAddress *address); 146 147 /* The use of any of the next functions will set the address family to 148 * the specific one. For example if you use GAddress_INET_SetHostName, 149 * address family will be implicitly set to AF_INET. 150 */ 151 152 GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname); 153 GSocketError GAddress_INET_SetAnyAddress(GAddress *address); 154 GSocketError GAddress_INET_SetHostAddress(GAddress *address, 155 unsigned long hostaddr); 156 GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port, 157 const char *protocol); 158 GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port); 159 160 GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, 161 size_t sbuf); 162 unsigned long GAddress_INET_GetHostAddress(GAddress *address); 163 unsigned short GAddress_INET_GetPort(GAddress *address); 164 165 /* TODO: Define specific parts (INET6, UNIX) */ 166 167 GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path); 168 GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf); 169 170 #ifdef __cplusplus 171 } 172 #endif /* __cplusplus */ 173 174 # if defined(__WINDOWS__) 175 # include "wx/msw/gsockmsw.h" 176 # elif defined(__WXMAC__) && !defined(__DARWIN__) 177 # include "wx/mac/gsockmac.h" 178 # else 179 # include "wx/unix/gsockunx.h" 180 # endif 181 182 #endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */ 183 184 #endif /* __GSOCKET_H */ 185