]> git.saurik.com Git - wxWidgets.git/blame - include/wx/unix/private/sockunix.h
Have wxPGTextCtrlEditor::UpdateControl() update wxTextCtrl font boldness based on...
[wxWidgets.git] / include / wx / unix / private / sockunix.h
CommitLineData
51fe4b60 1/////////////////////////////////////////////////////////////////////////////
60913641 2// Name: wx/unix/private/sockunix.h
51fe4b60
VZ
3// Purpose: wxSocketImpl implementation for Unix systems
4// Authors: Guilhem Lavaux, Vadim Zeitlin
5// Created: April 1997
6// RCS-ID: $Id$
7// Copyright: (c) 1997 Guilhem Lavaux
8// (c) 2008 Vadim Zeitlin
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
483249fc 11
2804f77d
VZ
12#ifndef _WX_UNIX_GSOCKUNX_H_
13#define _WX_UNIX_GSOCKUNX_H_
d422d01e 14
36b6a928 15#include <unistd.h>
51fe4b60 16#include <sys/ioctl.h>
a9d859df 17#include "wx/private/fdiodispatcher.h"
36b6a928 18
a9d859df
VZ
19class wxSocketImplUnix : public wxSocketImpl,
20 public wxFDIOHandler
ba2a81d7
DE
21{
22public:
9123889f
VZ
23 wxSocketImplUnix(wxSocketBase& wxsocket)
24 : wxSocketImpl(wxsocket)
25 {
26 m_fds[0] =
27 m_fds[1] = -1;
28
29 m_use_events = false;
acd523a9 30 m_enabledCallbacks = 0;
9123889f 31 }
53a161e1 32
eb97543d 33 virtual void Shutdown();
51fe4b60
VZ
34 virtual wxSocketImpl *WaitConnection(wxSocketBase& wxsocket);
35
07792edb
VZ
36 int Read(void *buffer, int size);
37 int Write(const void *buffer, int size);
2804f77d
VZ
38 //attach or detach from main loop
39 void Notify(bool flag);
a9d859df
VZ
40
41 // wxFDIOHandler methods
42 virtual void OnReadWaiting();
43 virtual void OnWriteWaiting();
44 virtual void OnExceptionWaiting();
8c029a5b 45
acd523a9
VZ
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; }
53
f0fbbe23 54private:
51fe4b60
VZ
55 virtual wxSocketError DoHandleConnect(int ret);
56 virtual void DoClose()
57 {
58 wxSocketManager * const manager = wxSocketManager::Get();
59 if ( manager )
60 {
61 manager->Uninstall_Callback(this, wxSOCKET_INPUT);
62 manager->Uninstall_Callback(this, wxSOCKET_OUTPUT);
63 }
64
65 close(m_fd);
66 }
67
68 virtual void UnblockAndRegisterWithEventLoop()
69 {
70 int trueArg = 1;
71 ioctl(m_fd, FIONBIO, &trueArg);
72
73 EnableEvents();
74 }
75
f0fbbe23
VZ
76 // enable or disable notifications for socket input/output events but only
77 // if m_use_events is true; do nothing otherwise
51fe4b60 78 virtual void EnableEvents()
f0fbbe23
VZ
79 {
80 if ( m_use_events )
81 DoEnableEvents(true);
82 }
83
84 void DisableEvents()
85 {
86 if ( m_use_events )
87 DoEnableEvents(false);
88 }
89
90 // really enable or disable socket input/output events, regardless of
91 // m_use_events value
92 void DoEnableEvents(bool enable);
93
94
95 // enable or disable events for the given event if m_use_events; do nothing
96 // otherwise
97 //
98 // notice that these functions also update m_detected: EnableEvent() clears
99 // the corresponding bit in it and DisableEvent() sets it
51fe4b60
VZ
100 void EnableEvent(wxSocketNotify event);
101 void DisableEvent(wxSocketNotify event);
f0fbbe23 102
07792edb
VZ
103 int Recv_Stream(void *buffer, int size);
104 int Recv_Dgram(void *buffer, int size);
105 int Send_Stream(const void *buffer, int size);
106 int Send_Dgram(const void *buffer, int size);
a324a7bc 107
acd523a9 108
51fe4b60
VZ
109protected:
110 // true if socket should fire events
111 bool m_use_events;
2804f77d 112
51fe4b60
VZ
113 // descriptors for input and output event notification channels associated
114 // with the socket
115 int m_fds[2];
53a161e1 116
acd523a9
VZ
117 // the events which are currently enabled for this socket, combination of
118 // wxFDIO_INPUT and wxFDIO_OUTPUT values
119 //
120 // TODO: this overlaps with m_detected but the semantics of the latter are
121 // very unclear so I don't dare to remove it right now
122 int m_enabledCallbacks;
123
53a161e1
VZ
124private:
125 // notify the associated wxSocket about a change in socket state and shut
51fe4b60
VZ
126 // down the socket if the event is wxSOCKET_LOST
127 void OnStateChange(wxSocketNotify event);
128
129 // give it access to our m_fds
130 friend class wxSocketFDBasedManager;
a324a7bc
GL
131};
132
51fe4b60
VZ
133// A version of wxSocketManager which uses FDs for socket IO
134class wxSocketFDBasedManager : public wxSocketManager
2804f77d
VZ
135{
136public:
137 // no special initialization/cleanup needed when using FDs
138 virtual bool OnInit() { return true; }
139 virtual void OnExit() { }
140
2804f77d
VZ
141protected:
142 // identifies either input or output direction
143 //
144 // NB: the values of this enum shouldn't change
145 enum SocketDir
146 {
147 FD_INPUT,
148 FD_OUTPUT
149 };
150
51fe4b60
VZ
151 // get the FD index corresponding to the given wxSocketNotify
152 SocketDir GetDirForEvent(wxSocketImpl *socket, wxSocketNotify event)
2804f77d
VZ
153 {
154 switch ( event )
155 {
156 default:
157 wxFAIL_MSG( "unexpected socket event" );
158 // fall through
159
51fe4b60 160 case wxSOCKET_LOST:
2804f77d
VZ
161 // fall through
162
51fe4b60 163 case wxSOCKET_INPUT:
2804f77d
VZ
164 return FD_INPUT;
165
51fe4b60 166 case wxSOCKET_OUTPUT:
2804f77d
VZ
167 return FD_OUTPUT;
168
51fe4b60 169 case wxSOCKET_CONNECTION:
2804f77d
VZ
170 // FIXME: explain this?
171 return socket->m_server ? FD_INPUT : FD_OUTPUT;
172 }
173 }
174
175 // access the FDs we store
a9d859df 176 int& FD(wxSocketImplUnix *socket, SocketDir d)
2804f77d 177 {
a9d859df 178 return socket->m_fds[d];
2804f77d
VZ
179 }
180};
181
182// Common base class for all ports using X11-like (and hence implemented in
183// X11, Motif and GTK) AddInput() and RemoveInput() functions
51fe4b60 184class wxSocketInputBasedManager : public wxSocketFDBasedManager
2804f77d
VZ
185{
186public:
a9d859df 187 virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event)
2804f77d 188 {
a9d859df
VZ
189 wxSocketImplUnix * const
190 socket = static_cast<wxSocketImplUnix *>(socket_);
191
2804f77d
VZ
192 wxCHECK_RET( socket->m_fd != -1,
193 "shouldn't be called on invalid socket" );
194
195 const SocketDir d = GetDirForEvent(socket, event);
196
197 int& fd = FD(socket, d);
198 if ( fd != -1 )
199 RemoveInput(fd);
200
a9d859df 201 fd = AddInput(socket, socket->m_fd, d);
2804f77d
VZ
202 }
203
a9d859df 204 virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event)
2804f77d 205 {
a9d859df
VZ
206 wxSocketImplUnix * const
207 socket = static_cast<wxSocketImplUnix *>(socket_);
208
2804f77d
VZ
209 const SocketDir d = GetDirForEvent(socket, event);
210
211 int& fd = FD(socket, d);
212 if ( fd != -1 )
213 {
214 RemoveInput(fd);
215 fd = -1;
216 }
217 }
218
219private:
220 // these functions map directly to XtAdd/RemoveInput() or
221 // gdk_input_add/remove()
a9d859df 222 virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) = 0;
2804f77d
VZ
223 virtual void RemoveInput(int fd) = 0;
224};
d422d01e 225
2804f77d 226#endif /* _WX_UNIX_GSOCKUNX_H_ */