1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Socket handling classes
4 // Author: Guilhem Lavaux
8 // Copyright: (c) Guilhem Lavaux
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_NETWORK_SOCKET_H
13 #define _WX_NETWORK_SOCKET_H
16 #pragma interface "socket.h"
19 // ---------------------------------------------------------------------------
20 // Windows(tm) specific
21 // ---------------------------------------------------------------------------
22 #if defined(__WINDOWS__) && defined(WXSOCK_INTERNAL)
24 #include <wx/msw/private.h>
26 struct wxSockInternal
{
30 struct wxSockHandlerInternal
{
32 UINT firstAvailableMsg
;
34 #endif // defined(__WINDOWS__) && defined(WXSOCK_INTERNAL)
36 // ---------------------------------------------------------------------------
38 // ---------------------------------------------------------------------------
39 #if defined(__UNIX__) && defined(WXSOCK_INTERNAL)
40 #include <sys/types.h>
41 #include <sys/socket.h>
42 #include <netinet/in.h>
44 // ---------------------------------------------------------------------------
46 // ---------------------------------------------------------------------------
47 #if defined(__WXXT__) || defined(__WXMOTIF__)
48 #include <X11/Intrinsic.h>
50 struct wxSockInternal
{
51 XtInputId sock_inputid
, sock_outputid
, sock_exceptid
;
55 // ---------------------------------------------------------------------------
57 // ---------------------------------------------------------------------------
58 #if defined(__WXGTK__)
61 struct wxSockInternal
{
62 gint sock_inputid
, sock_outputid
, sock_exceptid
;
66 #endif // defined(__UNIX__) && defined(WXSOCK_INTERNAL)
68 // ---------------------------------------------------------------------------
69 // wxSocket headers (generic)
70 // ---------------------------------------------------------------------------
72 #include <wx/wxprec.h>
76 #include "wx/sckaddr.h"
78 class WXDLLEXPORT wxSocketEvent
;
79 class WXDLLEXPORT wxSocketHandler
;
80 class WXDLLEXPORT wxSocketBase
: public wxEvtHandler
82 DECLARE_CLASS(wxSocketBase
)
84 friend void wxMacSocketOnRequestProc(void *refcon
, short event
) ;
86 #if defined(__WXGTK__) && defined(WXSOCK_INTERNAL)
87 friend void wxPrereadSocket(wxSocketBase
*sock
);
91 enum wxSockFlags
{ NONE
=0, NOWAIT
=1, WAITALL
=2, SPEED
=4 };
93 enum { REQ_READ
=0x1, REQ_PEEK
=0x2, REQ_WRITE
=0x4, REQ_LOST
=0x8,
94 REQ_ACCEPT
=0x10, REQ_CONNECT
=0x20};
95 enum { EVT_READ
=0, EVT_PEEK
=1, EVT_WRITE
=2, EVT_LOST
=3, EVT_ACCEPT
=4,
98 typedef int wxRequestNotify
;
99 typedef int wxRequestEvent
;
100 typedef void (*wxSockCbk
)(wxSocketBase
& sock
,wxRequestEvent evt
,char *cdata
);
103 wxList req_list
[EVT_WRITE
+1];
105 // Internal use for SaveState() and RestoreState()
106 class wxSockState
: public wxObject
{
112 wxRequestNotify cbk_set
;
119 enum wxSockType
{ SOCK_CLIENT
, SOCK_SERVER
, SOCK_INTERNAL
, SOCK_UNINIT
};
122 wxSockType m_type
; // wxSocket type
123 bool m_connected
, m_connecting
; // State of the socket
124 int m_fd
; // Socket file descriptors
125 int m_waitflags
; // Wait flags
126 wxList m_states
; // States list
127 wxSockCbk m_cbk
; // C callback
128 char *m_cdata
; // C callback data
129 int m_id
; // Socket id (for event handler)
130 wxSocketHandler
*m_handler
; // the current socket handler
131 wxRequestNotify m_neededreq
; // Specify which requet signals we need
133 char *m_unread
; // The unread buf
134 size_t m_unrd_size
; // The size of the unread buf
135 bool m_processing
; // To prevent some endless loop
136 unsigned long m_timeout
;
138 size_t m_lcount
; // Last IO request size
139 int m_error
; // Last IO error
142 struct wxSockInternal
*m_internal
; // System specific variables
146 virtual ~wxSocketBase();
147 virtual bool Close();
150 wxSocketBase
& Peek(char* buffer
, size_t nbytes
);
151 wxSocketBase
& Read(char* buffer
, size_t nbytes
);
152 wxSocketBase
& Write(const char *buffer
, size_t nbytes
);
153 wxSocketBase
& WriteMsg(const char *buffer
, size_t nbytes
);
154 wxSocketBase
& ReadMsg(char* buffer
, size_t nbytes
);
155 wxSocketBase
& Unread(const char *buffer
, size_t nbytes
);
158 // Try not to use this two methods (they sould be protected)
159 void CreatePushbackAfter(const char *buffer
, size_t size
);
160 void CreatePushbackBefore(const char *buffer
, size_t size
);
163 inline bool Ok() const { return (m_fd
< 0 ? 0 : 1); };
164 inline bool Error() const { return (m_error
!= 0); };
165 inline bool IsConnected() const { return m_connected
; };
166 inline bool IsDisconnected() const { return !IsConnected(); };
167 inline bool IsNoWait() const { return m_flags
& NOWAIT
; };
169 inline size_t LastCount() const { return m_lcount
; }
170 inline int LastError() const { return m_error
; }
172 void SetFlags(wxSockFlags _flags
);
173 inline void SetTimeout(unsigned long sec
) { m_timeout
= sec
; }
175 // seconds = -1 means infinite wait
176 // seconds = 0 means no wait
177 // seconds > 0 means specified wait
178 bool Wait(long seconds
= -1, long microseconds
= 0);
179 bool WaitForRead(long seconds
= -1, long microseconds
= 0);
180 bool WaitForWrite(long seconds
= -1, long microseconds
= 0);
181 bool WaitForLost(long seconds
= -1, long microseconds
= 0);
183 // Save the current state of Socket
187 // Setup external callback
188 wxSockCbk
Callback(wxSockCbk cbk_
);
189 char *CallbackData(char *data
);
191 // Setup event handler
192 void SetEventHandler(wxEvtHandler
& evt_hdlr
, int id
= -1);
194 // Method called when it happens something on the socket
195 void SetNotify(wxRequestNotify flags
);
196 virtual void OnRequest(wxRequestEvent req_evt
);
198 // Public internal callback
199 virtual void OldOnNotify(wxRequestEvent
WXUNUSED(evt
));
201 // Some info on the socket...
202 virtual bool GetPeer(wxSockAddress
& addr_man
) const;
203 virtual bool GetLocal(wxSockAddress
& addr_man
) const;
205 // Install or uninstall callbacks
206 void Notify(bool notify
);
208 // So you can know what the socket driver is looking for ...
209 inline wxRequestNotify
NeededReq() const { return m_neededreq
; }
211 static wxRequestNotify
EventToNotify(wxRequestEvent evt
);
214 friend class wxSocketServer
;
215 friend class wxSocketHandler
;
221 wxSocketBase(wxSockFlags flags
, wxSockType type
);
227 bool _Wait(long seconds
, long microseconds
, int type
);
230 inline virtual void SetHandler(wxSocketHandler
*handler
)
231 { m_handler
= handler
; }
233 // Activate or disactivate callback
234 void SetupCallbacks();
235 void DestroyCallbacks();
238 size_t GetPushback(char *buffer
, size_t size
, bool peek
);
240 // To prevent many read or write on the same socket at the same time
241 // ==> cause strange things :-)
242 void WantSpeedBuffer(char *buffer
, size_t size
, wxRequestEvent req
);
243 void WantBuffer(char *buffer
, size_t size
, wxRequestEvent req
);
245 virtual bool DoRequests(wxRequestEvent req
);
248 ////////////////////////////////////////////////////////////////////////
250 class WXDLLEXPORT wxSocketServer
: public wxSocketBase
252 DECLARE_CLASS(wxSocketServer
)
255 // 'service' can be a name or a port-number
257 wxSocketServer(wxSockAddress
& addr_man
, wxSockFlags flags
= wxSocketBase::NONE
);
259 wxSocketBase
* Accept();
260 bool AcceptWith(wxSocketBase
& sock
);
261 virtual void OnRequest(wxRequestEvent flags
);
264 ////////////////////////////////////////////////////////////////////////
266 class WXDLLEXPORT wxSocketClient
: public wxSocketBase
268 DECLARE_CLASS(wxSocketClient
)
271 wxSocketClient(wxSockFlags flags
= wxSocketBase::NONE
);
272 virtual ~wxSocketClient();
274 virtual bool Connect(wxSockAddress
& addr_man
, bool wait
= TRUE
);
276 bool WaitOnConnect(long seconds
= -1, long microseconds
= 0);
278 virtual void OnRequest(wxRequestEvent flags
);
281 ////////////////////////////////////////////////////////////////////////
283 class WXDLLEXPORT wxSocketHandler
: public wxObject
285 DECLARE_CLASS(wxSocketHandler
)
287 #if defined(__WINDOWS__)
289 struct wxSockHandlerInternal
*internal
;
294 enum SockStatus
{ SOCK_NONE
, SOCK_DATA
, SOCK_CONNECT
, SOCK_DISCONNECT
,
296 static wxSocketHandler
*master
;
299 virtual ~wxSocketHandler();
301 void Register(wxSocketBase
* sock
);
302 void UnRegister(wxSocketBase
* sock
);
304 unsigned long Count() const;
306 // seconds = -1 means indefinite wait
307 // seconds = 0 means no wait
308 // seconds > 0 means specified wait
310 int Wait(long seconds
= -1, long microseconds
= 0);
313 wxSocketServer
*CreateServer
314 (wxSockAddress
& addr
,
315 wxSocketBase::wxSockFlags flags
= wxSocketBase::NONE
);
316 wxSocketClient
*CreateClient
317 (wxSocketBase::wxSockFlags flags
= wxSocketBase::NONE
);
319 // Create or reuse a socket handler
320 static wxSocketHandler
& Master() { return *master
; }
322 #if defined(WXSOCK_INTERNAL) && defined(__WINDOWS__)
324 friend LRESULT APIENTRY _EXPORT
wxSocketHandlerWndProc(HWND hWnd
,
325 UINT message
, WPARAM wParam
, LPARAM lParam
);
327 UINT
NewMessage(wxSocketBase
*sock
);
328 void DestroyMessage(UINT msg
);
330 HWND
GetHWND() const;
334 class WXDLLEXPORT wxSocketEvent
: public wxEvent
{
335 DECLARE_DYNAMIC_CLASS(wxSocketEvent
)
337 wxSocketEvent(int id
= 0);
339 wxSocketBase::wxRequestEvent
SocketEvent() const { return m_skevt
; }
341 wxSocketBase::wxRequestEvent m_skevt
;
344 typedef void (wxEvtHandler::*wxSocketEventFunction
)(wxSocketEvent
&);
346 #define wxEVT_SOCKET wxEVT_FIRST+301
348 #define EVT_SOCKET(id, func) { wxEVT_SOCKET, id, 0, \
349 (wxObjectEventFunction) (wxEventFunction) (wxSocketEventFunction) & func, \