]> git.saurik.com Git - wxWidgets.git/blob - include/wx/gsocket.h
CanPaste() should be const too
[wxWidgets.git] / include / wx / gsocket.h
1 /* -------------------------------------------------------------------------
2 * Project: GSocket (Generic Socket)
3 * Name: gsocket.h
4 * Author: Guilhem Lavaux
5 * Guillermo Rodriguez Garcia <guille@iies.es>
6 * Copyright: (c) Guilhem Lavaux
7 * (c) 2007,2008 Vadim Zeitlin <vadim@wxwidgets.org>
8 * Licence: wxWindows Licence
9 * Purpose: GSocket include file (system independent)
10 * CVSID: $Id$
11 * -------------------------------------------------------------------------
12 */
13
14 #ifndef _WX_GSOCKET_H_
15 #define _WX_GSOCKET_H_
16
17 #include "wx/defs.h"
18
19 #if wxUSE_SOCKETS
20
21 #include "wx/dlimpexp.h" /* for WXDLLIMPEXP_NET */
22
23 #include <stddef.h>
24
25 /*
26 Including sys/types.h under Cygwin results in the warnings about "fd_set
27 having been defined in sys/types.h" when winsock.h is included later and
28 doesn't seem to be necessary anyhow. It's not needed under Mac neither.
29 */
30 #if !defined(__WXMAC__) && !defined(__CYGWIN__) && !defined(__WXWINCE__)
31 #include <sys/types.h>
32 #endif
33
34 #ifdef __WXWINCE__
35 #include <stdlib.h>
36 #endif
37
38 enum GAddressType
39 {
40 GSOCK_NOFAMILY = 0,
41 GSOCK_INET,
42 GSOCK_INET6,
43 GSOCK_UNIX
44 };
45
46 enum GSocketStream
47 {
48 GSOCK_STREAMED,
49 GSOCK_UNSTREAMED
50 };
51
52 enum GSocketError
53 {
54 GSOCK_NOERROR = 0,
55 GSOCK_INVOP,
56 GSOCK_IOERR,
57 GSOCK_INVADDR,
58 GSOCK_INVSOCK,
59 GSOCK_NOHOST,
60 GSOCK_INVPORT,
61 GSOCK_WOULDBLOCK,
62 GSOCK_TIMEDOUT,
63 GSOCK_MEMERR,
64 GSOCK_OPTERR
65 };
66
67 /* See below for an explanation on how events work.
68 */
69 enum GSocketEvent
70 {
71 GSOCK_INPUT = 0,
72 GSOCK_OUTPUT = 1,
73 GSOCK_CONNECTION = 2,
74 GSOCK_LOST = 3,
75 GSOCK_MAX_EVENT = 4
76 };
77
78 enum
79 {
80 GSOCK_INPUT_FLAG = 1 << GSOCK_INPUT,
81 GSOCK_OUTPUT_FLAG = 1 << GSOCK_OUTPUT,
82 GSOCK_CONNECTION_FLAG = 1 << GSOCK_CONNECTION,
83 GSOCK_LOST_FLAG = 1 << GSOCK_LOST
84 };
85
86 typedef int GSocketEventFlags;
87
88 struct GAddress;
89 class GSocket;
90
91 typedef void (*GSocketCallback)(GSocket *socket, GSocketEvent event,
92 char *cdata);
93
94 /*
95 Class providing hooks abstracting the differences between console and GUI
96 applications for socket code.
97
98 We also have different implementations of this class for different platforms
99 allowing us to keep more things in the common code but the main reason for
100 its existence is that we want the same socket code work differently
101 depending on whether it's used from a console or a GUI program. This is
102 achieved by implementing the virtual methods of this class differently in
103 the objects returned by wxConsoleAppTraits::GetSocketFunctionsTable() and
104 the same method in wxGUIAppTraits.
105 */
106 class GSocketManager
107 {
108 public:
109 // set the manager to use, we don't take ownership of it
110 //
111 // this should be called before GSocket_Init(), i.e. before the first
112 // wxSocket object is created, otherwise the manager returned by
113 // wxAppTraits::GetSocketManager() will be used
114 static void Set(GSocketManager *manager);
115
116 // return the manager to use
117 //
118 // this initializes the manager at first use
119 static GSocketManager *Get()
120 {
121 if ( !ms_manager )
122 Init();
123
124 return ms_manager;
125 }
126
127 // called before the first wxSocket is created and should do the
128 // initializations needed in order to use the network
129 //
130 // return true if initialized successfully
131 virtual bool OnInit() = 0;
132
133 // undo the initializations of OnInit()
134 virtual void OnExit() = 0;
135
136
137 // do manager-specific socket initializations (and undo it): this is called
138 // in the beginning/end of the socket initialization/destruction
139 virtual bool Init_Socket(GSocket *socket) = 0;
140 virtual void Destroy_Socket(GSocket *socket) = 0;
141
142 virtual void Install_Callback(GSocket *socket, GSocketEvent event) = 0;
143 virtual void Uninstall_Callback(GSocket *socket, GSocketEvent event) = 0;
144
145 virtual void Enable_Events(GSocket *socket) = 0;
146 virtual void Disable_Events(GSocket *socket) = 0;
147
148 virtual ~GSocketManager() { }
149
150 private:
151 // get the manager to use if we don't have it yet
152 static void Init();
153
154 static GSocketManager *ms_manager;
155 };
156
157 #if defined(__WINDOWS__)
158 #include "wx/msw/gsockmsw.h"
159 #else
160 #include "wx/unix/gsockunx.h"
161 #endif
162
163
164 /* Global initializers */
165
166 /* GSocket_Init() must be called at the beginning (but after calling
167 * GSocketManager::Set() if a custom manager should be used) */
168 bool GSocket_Init();
169
170 /* GSocket_Cleanup() must be called at the end */
171 void GSocket_Cleanup();
172
173
174 /* Constructors / Destructors */
175
176 GSocket *GSocket_new();
177
178
179 /* GAddress */
180
181 // Represents a socket endpoint, i.e. -- in spite of its name -- not an address
182 // but an (address, port) pair
183 struct GAddress
184 {
185 struct sockaddr *m_addr;
186 size_t m_len;
187
188 GAddressType m_family;
189 int m_realfamily;
190
191 GSocketError m_error;
192 };
193
194 GAddress *GAddress_new();
195 GAddress *GAddress_copy(GAddress *address);
196 void GAddress_destroy(GAddress *address);
197
198 void GAddress_SetFamily(GAddress *address, GAddressType type);
199 GAddressType GAddress_GetFamily(GAddress *address);
200
201 /* The use of any of the next functions will set the address family to
202 * the specific one. For example if you use GAddress_INET_SetHostName,
203 * address family will be implicitly set to AF_INET.
204 */
205
206 GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname);
207 GSocketError GAddress_INET_SetBroadcastAddress(GAddress *address);
208 GSocketError GAddress_INET_SetAnyAddress(GAddress *address);
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 GSocketError _GAddress_translate_from(GAddress *address,
221 struct sockaddr *addr, int len);
222 GSocketError _GAddress_translate_to (GAddress *address,
223 struct sockaddr **addr, int *len);
224 GSocketError _GAddress_Init_INET(GAddress *address);
225
226 #if wxUSE_IPV6
227
228 GSocketError GAddress_INET6_SetHostName(GAddress *address, const char *hostname);
229 GSocketError GAddress_INET6_SetAnyAddress(GAddress *address);
230 GSocketError GAddress_INET6_SetHostAddress(GAddress *address,
231 struct in6_addr hostaddr);
232 GSocketError GAddress_INET6_SetPortName(GAddress *address, const char *port,
233 const char *protocol);
234 GSocketError GAddress_INET6_SetPort(GAddress *address, unsigned short port);
235
236 GSocketError GAddress_INET6_GetHostName(GAddress *address, char *hostname,
237 size_t sbuf);
238 GSocketError GAddress_INET6_GetHostAddress(GAddress *address,struct in6_addr *hostaddr);
239 unsigned short GAddress_INET6_GetPort(GAddress *address);
240
241 #endif // wxUSE_IPV6
242
243 // these functions are available under all platforms but only implemented under
244 // Unix ones, elsewhere they just return GSOCK_INVADDR
245 GSocketError _GAddress_Init_UNIX(GAddress *address);
246 GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path);
247 GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf);
248
249 #endif /* wxUSE_SOCKETS */
250
251 #endif /* _WX_GSOCKET_H_ */