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"
23 // ---------------------------------------------------------------------------
24 // wxSocket headers (generic)
25 // ---------------------------------------------------------------------------
27 # include "wx/wxprec.h"
29 # include "wx/event.h"
30 # include "wx/string.h"
33 #include "wx/sckaddr.h"
34 #include "wx/gsocket.h"
36 // ------------------------------------------------------------------------
38 // ------------------------------------------------------------------------
41 wxSOCKET_INPUT
= GSOCK_INPUT
,
42 wxSOCKET_OUTPUT
= GSOCK_OUTPUT
,
43 wxSOCKET_CONNECTION
= GSOCK_CONNECTION
,
44 wxSOCKET_LOST
= GSOCK_LOST
48 wxSOCKET_INPUT_FLAG
= GSOCK_INPUT_FLAG
,
49 wxSOCKET_OUTPUT_FLAG
= GSOCK_OUTPUT_FLAG
,
50 wxSOCKET_CONNECTION_FLAG
= GSOCK_CONNECTION_FLAG
,
51 wxSOCKET_LOST_FLAG
= GSOCK_LOST_FLAG
,
54 typedef GSocketEventFlags wxSocketEventFlags
;
57 wxSOCKET_NOERROR
= GSOCK_NOERROR
,
58 wxSOCKET_INPOP
= GSOCK_INVOP
,
59 wxSOCKET_IOERR
= GSOCK_IOERR
,
60 wxSOCKET_INVADDR
= GSOCK_INVADDR
,
61 wxSOCKET_INVSOCK
= GSOCK_INVSOCK
,
62 wxSOCKET_NOHOST
= GSOCK_NOHOST
,
63 wxSOCKET_INVPORT
= GSOCK_INVPORT
,
64 wxSOCKET_WOULDBLOCK
= GSOCK_WOULDBLOCK
,
65 wxSOCKET_TIMEDOUT
= GSOCK_TIMEDOUT
,
66 wxSOCKET_MEMERR
= GSOCK_MEMERR
69 // ------------------------------------------------------------------------
71 // ------------------------------------------------------------------------
73 class WXDLLEXPORT wxTimer
;
74 class WXDLLEXPORT wxSocketEvent
;
75 class WXDLLEXPORT wxSocketBase
: public wxEvtHandler
77 DECLARE_CLASS(wxSocketBase
)
80 enum { NONE
=0, NOWAIT
=1, WAITALL
=2, SPEED
=4 };
81 typedef int wxSockFlags
;
84 enum wxSockType
{ SOCK_CLIENT
, SOCK_SERVER
, SOCK_INTERNAL
, SOCK_UNINIT
};
85 typedef void (*wxSockCbk
)(wxSocketBase
& sock
,wxSocketNotify evt
,char *cdata
);
88 GSocket
*m_socket
; // wxSocket socket
89 wxSockFlags m_flags
; // wxSocket flags
90 wxSockType m_type
; // wxSocket type
91 wxSocketEventFlags m_neededreq
; // Specify which requet signals we need
92 wxUint32 m_lcount
; // Last IO request size
93 unsigned long m_timeout
; // IO timeout value
95 char *m_unread
; // Pushback buffer
96 wxUint32 m_unrd_size
; // Pushback buffer size
97 wxUint32 m_unrd_cur
; // Pushback pointer
99 wxSockCbk m_cbk
; // C callback
100 char *m_cdata
; // C callback data
102 bool m_connected
; // Connected ?
103 bool m_notify_state
; // Notify state
104 int m_id
; // Socket id (for event handler)
106 // Defering variables
108 DEFER_READ
, DEFER_WRITE
, NO_DEFER
109 } m_defering
; // Defering state
110 char *m_defer_buffer
; // Defering target buffer
111 wxUint32 m_defer_nbytes
; // Defering buffer size
112 wxTimer
*m_defer_timer
; // Timer for defering mode
114 wxList m_states
; // Stack of states
118 virtual ~wxSocketBase();
119 virtual bool Close();
122 wxSocketBase
& Peek(char* buffer
, wxUint32 nbytes
);
123 wxSocketBase
& Read(char* buffer
, wxUint32 nbytes
);
124 wxSocketBase
& Write(const char *buffer
, wxUint32 nbytes
);
125 wxSocketBase
& Unread(const char *buffer
, wxUint32 nbytes
);
126 wxSocketBase
& ReadMsg(char *buffer
, wxUint32 nbytes
);
127 wxSocketBase
& WriteMsg(const char *buffer
, wxUint32 nbytes
);
130 // Try not to use this two methods (they sould be protected)
131 void CreatePushbackAfter(const char *buffer
, wxUint32 size
);
132 void CreatePushbackBefore(const char *buffer
, wxUint32 size
);
135 inline bool Ok() const { return (m_socket
!= NULL
); };
136 inline bool Error() const
137 { return (GSocket_GetError(m_socket
) != GSOCK_NOERROR
); };
138 inline bool IsConnected() const { return m_connected
; };
139 inline bool IsDisconnected() const { return !IsConnected(); };
140 inline bool IsNoWait() const { return ((m_flags
& NOWAIT
) != 0); };
142 inline wxUint32
LastCount() const { return m_lcount
; }
143 inline wxSocketError
LastError() const { return (wxSocketError
)GSocket_GetError(m_socket
); }
144 inline wxSockType
GetType() const { return m_type
; }
146 void SetFlags(wxSockFlags _flags
);
147 wxSockFlags
GetFlags() const;
148 void SetTimeout(unsigned long sec
);
150 // seconds = -1 means infinite wait
151 // seconds = 0 means no wait
152 // seconds > 0 means specified wait
153 bool Wait(long seconds
= -1, long milliseconds
= 0);
154 bool WaitForRead(long seconds
= -1, long milliseconds
= 0);
155 bool WaitForWrite(long seconds
= -1, long milliseconds
= 0);
156 bool WaitForLost(long seconds
= -1, long milliseconds
= 0);
158 // Save the current state of Socket
162 // Setup external callback
163 wxSockCbk
Callback(wxSockCbk cbk_
);
164 char *CallbackData(char *data
);
166 // Setup event handler
167 void SetEventHandler(wxEvtHandler
& evt_hdlr
, int id
= -1);
169 // Method called when it happens something on the socket
170 void SetNotify(wxSocketEventFlags flags
);
171 virtual void OnRequest(wxSocketNotify req_evt
);
173 // Public internal callback
174 virtual void OldOnNotify(wxSocketNotify
WXUNUSED(evt
));
176 // Some info on the socket...
177 virtual bool GetPeer(wxSockAddress
& addr_man
) const;
178 virtual bool GetLocal(wxSockAddress
& addr_man
) const;
180 // Install or uninstall callbacks
181 void Notify(bool notify
);
183 // So you can know what the socket driver is looking for ...
184 inline wxSocketEventFlags
NeededReq() const { return m_neededreq
; }
186 static wxSocketEventFlags
EventToNotify(wxSocketNotify evt
);
189 friend class wxSocketServer
;
190 friend class wxSocketHandler
;
191 friend class wxSocketInternal
;
197 wxSocketBase(wxSockFlags flags
, wxSockType type
);
203 bool _Wait(long seconds
, long milliseconds
, int type
);
205 int DeferRead(char *buffer
, wxUint32 nbytes
);
206 int DeferWrite(const char *buffer
, wxUint32 nbytes
);
207 void DoDefer(wxSocketNotify evt
);
210 wxUint32
GetPushback(char *buffer
, wxUint32 size
, bool peek
);
213 ////////////////////////////////////////////////////////////////////////
215 class WXDLLEXPORT wxSocketServer
: public wxSocketBase
217 DECLARE_CLASS(wxSocketServer
)
220 // 'service' can be a name or a port-number
222 wxSocketServer(wxSockAddress
& addr_man
, wxSockFlags flags
= wxSocketBase::NONE
);
224 wxSocketBase
* Accept();
225 bool AcceptWith(wxSocketBase
& sock
);
228 ////////////////////////////////////////////////////////////////////////
230 class WXDLLEXPORT wxSocketClient
: public wxSocketBase
232 DECLARE_CLASS(wxSocketClient
)
235 wxSocketClient(wxSockFlags flags
= wxSocketBase::NONE
);
236 virtual ~wxSocketClient();
238 virtual bool Connect(wxSockAddress
& addr_man
, bool wait
= TRUE
);
240 bool WaitOnConnect(long seconds
= -1, long milliseconds
= 0);
242 virtual void OnRequest(wxSocketNotify flags
);
245 class WXDLLEXPORT wxSocketEvent
: public wxEvent
{
246 DECLARE_DYNAMIC_CLASS(wxSocketEvent
)
248 wxSocketEvent(int id
= 0);
250 wxSocketNotify
SocketEvent() const { return m_skevt
; }
251 wxSocketBase
*Socket() const { return m_socket
; }
253 void CopyObject(wxObject
& obj_d
) const;
256 wxSocketNotify m_skevt
;
257 wxSocketBase
*m_socket
;
260 typedef void (wxEvtHandler::*wxSocketEventFunction
)(wxSocketEvent
&);
262 #define EVT_SOCKET(id, func) { wxEVT_SOCKET, id, -1, \
263 (wxObjectEventFunction) (wxEventFunction) (wxSocketEventFunction) & func, \
270 // _WX_NETWORK_SOCKET_H