Did somework on the generic dialogs,
[wxWidgets.git] / include / wx / gsocket.h
1 /* -------------------------------------------------------------------------
2 * Project: GSocket (Generic Socket)
3 * Name: gsocket.h
4 * Purpose: GSocket include file (system independent)
5 * CVSID: $Id$
6 * -------------------------------------------------------------------------
7 */
8 #ifndef __GSOCKET_H
9 #define __GSOCKET_H
10
11 #include "wx/setup.h"
12
13 #if wxUSE_SOCKETS
14
15 #include <stddef.h>
16 #include <sys/types.h>
17
18 #if !defined(__cplusplus)
19 typedef int bool;
20 #endif
21
22 #ifndef TRUE
23 #define TRUE 1
24 #endif
25
26 #ifndef FALSE
27 #define FALSE 0
28 #endif
29
30 typedef struct _GSocket GSocket;
31 typedef struct _GAddress GAddress;
32
33 typedef enum {
34 GSOCK_NOFAMILY = 0,
35 GSOCK_INET,
36 GSOCK_INET6,
37 GSOCK_UNIX
38 } GAddressType;
39
40 typedef enum {
41 GSOCK_STREAMED,
42 GSOCK_UNSTREAMED
43 } GSocketStream;
44
45 typedef enum {
46 GSOCK_NOERROR = 0,
47 GSOCK_INVOP,
48 GSOCK_IOERR,
49 GSOCK_INVADDR,
50 GSOCK_INVSOCK,
51 GSOCK_NOHOST,
52 GSOCK_INVPORT,
53 GSOCK_WOULDBLOCK,
54 GSOCK_TIMEOUT,
55 GSOCK_MEMERR
56 } GSocketError;
57
58 typedef enum {
59 GSOCK_INPUT = 0,
60 GSOCK_OUTPUT = 1,
61 GSOCK_CONNECTION = 2,
62 GSOCK_LOST = 3,
63 GSOCK_MAX_EVENT = 4
64 } GSocketEvent;
65
66 enum {
67 GSOCK_INPUT_FLAG = 1 << GSOCK_INPUT,
68 GSOCK_OUTPUT_FLAG = 1 << GSOCK_OUTPUT,
69 GSOCK_CONNECTION_FLAG = 1 << GSOCK_CONNECTION,
70 GSOCK_LOST_FLAG = 1 << GSOCK_LOST
71 };
72
73 typedef int GSocketEventFlags;
74
75 typedef void (*GSocketCallback)(GSocket *socket, GSocketEvent event,
76 char *cdata);
77
78 #ifdef __cplusplus
79 extern "C" {
80 #endif
81
82 /* Global initialisers */
83
84 /* GSocket_Init() must be called at the beginning */
85 bool GSocket_Init();
86 /* GSocket_Cleanup() must be called at the ending */
87 void GSocket_Cleanup();
88
89 /* Constructors / Destructors */
90
91 GSocket *GSocket_new();
92 void GSocket_destroy(GSocket *socket);
93
94 /* This will disable all IO calls to this socket but errors are still available */
95 void GSocket_Shutdown(GSocket *socket);
96
97 /* Address handling */
98
99 GSocketError GSocket_SetLocal(GSocket *socket, GAddress *address);
100 GSocketError GSocket_SetPeer(GSocket *socket, GAddress *address);
101 GAddress *GSocket_GetLocal(GSocket *socket);
102 GAddress *GSocket_GetPeer(GSocket *socket);
103
104 /* Non-oriented connections handlers */
105
106 GSocketError GSocket_SetNonOriented(GSocket *socket);
107
108 /* Server specific parts */
109
110 /*
111 GSocket_SetServer() setups the socket as a server. It uses the "Local" field
112 of GSocket. "Local" must be set by GSocket_SetLocal() before
113 GSocket_SetServer() is called. In the other case, it returns GSOCK_INVADDR.
114 */
115 GSocketError GSocket_SetServer(GSocket *socket);
116
117 /*
118 GSocket_WaitConnection() waits for an incoming client connection.
119 */
120 GSocket *GSocket_WaitConnection(GSocket *socket);
121
122 /* Client specific parts */
123
124 /*
125 GSocket_Connect() establishes a client connection to a server using the "Peer"
126 field of GSocket. "Peer" must be set by GSocket_SetPeer() before
127 GSocket_Connect() is called. In the other case, it returns GSOCK_INVADDR.
128 */
129 GSocketError GSocket_Connect(GSocket *socket, GSocketStream stream);
130
131 /* Generic IO */
132
133 /* Like recv(), send(), ... */
134 /*
135 NOTE: In case we read from a non-oriented connection, the incoming (outgoing)
136 connection address is stored in the "Local" ("Peer") field.
137 */
138 int GSocket_Read(GSocket *socket, char *buffer, int size);
139 int GSocket_Write(GSocket *socket, const char *buffer,
140 int size);
141 bool GSocket_DataAvailable(GSocket *socket);
142
143 /* Flags/Parameters */
144
145 /*
146 GSocket_SetTimeout() sets the timeout for reading and writing IO call. Time
147 is expressed in milliseconds.
148 */
149 void GSocket_SetTimeout(GSocket *socket, unsigned long millisec);
150
151 /*
152 GSocket_SetBlocking() puts the socket in non-blocking mode. This is useful
153 if we don't want to wait.
154 */
155 void GSocket_SetNonBlocking(GSocket *socket, bool non_block);
156
157 /*
158 GSocket_GetError() returns the last error occured on the socket stream.
159 */
160
161 GSocketError GSocket_GetError(GSocket *socket);
162
163 /* Callbacks */
164
165 /*
166 Only one fallback is possible for each event (INPUT, OUTPUT, CONNECTION, LOST)
167 INPUT: The function is called when there is at least a byte in the
168 input buffer
169 OUTPUT: The function is called when the system is sure the next write call
170 will not block
171 CONNECTION: Two cases is possible:
172 Client socket -> the connection is established
173 Server socket -> a client request a connection
174 LOST: the connection is lost
175
176 SetCallback accepts a combination of these flags so a same callback can
177 receive different events.
178
179 An event is generated only once and its state is reseted when the relative
180 IO call is requested.
181 For example: INPUT -> GSocket_Read()
182 CONNECTION -> GSocket_Accept()
183 */
184 void GSocket_SetCallback(GSocket *socket, GSocketEventFlags event,
185 GSocketCallback fallback, char *cdata);
186
187 /*
188 UnsetCallback will disables all fallbacks specified by "event".
189 NOTE: event may be a combination of flags
190 */
191 void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags event);
192
193 /* GAddress */
194
195 GAddress *GAddress_new();
196 GAddress *GAddress_copy(GAddress *address);
197 void GAddress_destroy(GAddress *address);
198
199 void GAddress_SetFamily(GAddress *address, GAddressType type);
200 GAddressType GAddress_GetFamily(GAddress *address);
201
202 /*
203 The use of any of the next functions will set the address family to the adapted
204 one. For example if you use GAddress_INET_SetHostName, address family will be AF_INET
205 implicitely
206 */
207
208 GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname);
209 GSocketError GAddress_INET_SetHostAddress(GAddress *address,
210 unsigned long hostaddr);
211 GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port,
212 const char *protocol);
213 GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port);
214
215 GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname,
216 size_t sbuf);
217 unsigned long GAddress_INET_GetHostAddress(GAddress *address);
218 unsigned short GAddress_INET_GetPort(GAddress *address);
219
220 /* TODO: Define specific parts (INET6, UNIX) */
221
222 GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path);
223 GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf);
224
225 /*
226 * System specific functions
227 */
228
229 /* On systems needing an event id */
230 void GSocket_SetEventID(GSocket *socket, unsigned long evt_id);
231
232 /* On systems which don't have background refresh */
233 void GSocket_DoEvent(unsigned long evt_id);
234
235 #ifdef __cplusplus
236 };
237 #endif /* __cplusplus */
238
239
240 #endif
241 /* wxUSE_SOCKETS */
242
243 #endif
244 /* __GSOCKET_H */