1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/unix/private/sockunix.h
3 // Purpose: wxSocketImpl implementation for Unix systems
4 // Authors: Guilhem Lavaux, Vadim Zeitlin
7 // Copyright: (c) 1997 Guilhem Lavaux
8 // (c) 2008 Vadim Zeitlin
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_UNIX_GSOCKUNX_H_
13 #define _WX_UNIX_GSOCKUNX_H_
16 #include <sys/ioctl.h>
17 #include "wx/private/fdiodispatcher.h"
19 class wxSocketImplUnix
: public wxSocketImpl
,
23 wxSocketImplUnix(wxSocketBase
& wxsocket
)
24 : wxSocketImpl(wxsocket
)
30 m_enabledCallbacks
= 0;
33 virtual void Shutdown();
34 virtual wxSocketImpl
*WaitConnection(wxSocketBase
& wxsocket
);
36 int Read(char *buffer
, int size
);
37 int Write(const char *buffer
, int size
);
38 //attach or detach from main loop
39 void Notify(bool flag
);
41 // wxFDIOHandler methods
42 virtual void OnReadWaiting();
43 virtual void OnWriteWaiting();
44 virtual void OnExceptionWaiting();
46 // Unix-specific functions
47 bool HasAnyEnabledCallbacks() const { return m_enabledCallbacks
!= 0; }
48 void EnableCallback(wxFDIODispatcherEntryFlags flag
)
49 { m_enabledCallbacks
|= flag
; }
50 void DisableCallback(wxFDIODispatcherEntryFlags flag
)
51 { m_enabledCallbacks
&= ~flag
; }
52 int GetEnabledCallbacks() const { return m_enabledCallbacks
; }
55 virtual wxSocketError
DoHandleConnect(int ret
);
56 virtual void DoClose()
58 wxSocketManager
* const manager
= wxSocketManager::Get();
61 manager
->Uninstall_Callback(this, wxSOCKET_INPUT
);
62 manager
->Uninstall_Callback(this, wxSOCKET_OUTPUT
);
68 virtual void UnblockAndRegisterWithEventLoop()
71 ioctl(m_fd
, FIONBIO
, &trueArg
);
76 // enable or disable notifications for socket input/output events but only
77 // if m_use_events is true; do nothing otherwise
78 virtual void EnableEvents()
87 DoEnableEvents(false);
90 // really enable or disable socket input/output events, regardless of
92 void DoEnableEvents(bool enable
);
95 // enable or disable events for the given event if m_use_events; do nothing
98 // notice that these functions also update m_detected: EnableEvent() clears
99 // the corresponding bit in it and DisableEvent() sets it
100 void EnableEvent(wxSocketNotify event
);
101 void DisableEvent(wxSocketNotify event
);
104 wxSocketError
Input_Timeout();
105 wxSocketError
Output_Timeout();
106 int Recv_Stream(char *buffer
, int size
);
107 int Recv_Dgram(char *buffer
, int size
);
108 int Send_Stream(const char *buffer
, int size
);
109 int Send_Dgram(const char *buffer
, int size
);
113 // true if socket should fire events
116 // descriptors for input and output event notification channels associated
120 // the events which are currently enabled for this socket, combination of
121 // wxFDIO_INPUT and wxFDIO_OUTPUT values
123 // TODO: this overlaps with m_detected but the semantics of the latter are
124 // very unclear so I don't dare to remove it right now
125 int m_enabledCallbacks
;
128 // notify the associated wxSocket about a change in socket state and shut
129 // down the socket if the event is wxSOCKET_LOST
130 void OnStateChange(wxSocketNotify event
);
132 // give it access to our m_fds
133 friend class wxSocketFDBasedManager
;
136 // A version of wxSocketManager which uses FDs for socket IO
137 class wxSocketFDBasedManager
: public wxSocketManager
140 // no special initialization/cleanup needed when using FDs
141 virtual bool OnInit() { return true; }
142 virtual void OnExit() { }
144 // allocate/free the storage we need
145 virtual wxSocketImpl
*CreateSocket(wxSocketBase
& wxsocket
)
147 return new wxSocketImplUnix(wxsocket
);
151 // identifies either input or output direction
153 // NB: the values of this enum shouldn't change
160 // get the FD index corresponding to the given wxSocketNotify
161 SocketDir
GetDirForEvent(wxSocketImpl
*socket
, wxSocketNotify event
)
166 wxFAIL_MSG( "unexpected socket event" );
175 case wxSOCKET_OUTPUT
:
178 case wxSOCKET_CONNECTION
:
179 // FIXME: explain this?
180 return socket
->m_server
? FD_INPUT
: FD_OUTPUT
;
184 // access the FDs we store
185 int& FD(wxSocketImplUnix
*socket
, SocketDir d
)
187 return socket
->m_fds
[d
];
191 // Common base class for all ports using X11-like (and hence implemented in
192 // X11, Motif and GTK) AddInput() and RemoveInput() functions
193 class wxSocketInputBasedManager
: public wxSocketFDBasedManager
196 virtual void Install_Callback(wxSocketImpl
*socket_
, wxSocketNotify event
)
198 wxSocketImplUnix
* const
199 socket
= static_cast<wxSocketImplUnix
*>(socket_
);
201 wxCHECK_RET( socket
->m_fd
!= -1,
202 "shouldn't be called on invalid socket" );
204 const SocketDir d
= GetDirForEvent(socket
, event
);
206 int& fd
= FD(socket
, d
);
210 fd
= AddInput(socket
, socket
->m_fd
, d
);
213 virtual void Uninstall_Callback(wxSocketImpl
*socket_
, wxSocketNotify event
)
215 wxSocketImplUnix
* const
216 socket
= static_cast<wxSocketImplUnix
*>(socket_
);
218 const SocketDir d
= GetDirForEvent(socket
, event
);
220 int& fd
= FD(socket
, d
);
229 // these functions map directly to XtAdd/RemoveInput() or
230 // gdk_input_add/remove()
231 virtual int AddInput(wxFDIOHandler
*handler
, int fd
, SocketDir d
) = 0;
232 virtual void RemoveInput(int fd
) = 0;
235 #endif /* _WX_UNIX_GSOCKUNX_H_ */