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