]> git.saurik.com Git - wxWidgets.git/blob - include/wx/unix/private/sockunix.h
avoid causing idle event from GetValue(), fixes #11013
[wxWidgets.git] / include / wx / unix / private / sockunix.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/unix/private/sockunix.h
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 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_UNIX_GSOCKUNX_H_
13 #define _WX_UNIX_GSOCKUNX_H_
14
15 #include <unistd.h>
16 #include <sys/ioctl.h>
17 #include "wx/private/fdiomanager.h"
18
19 class wxSocketImplUnix : public wxSocketImpl,
20 public wxFDIOHandler
21 {
22 public:
23 wxSocketImplUnix(wxSocketBase& wxsocket)
24 : wxSocketImpl(wxsocket)
25 {
26 m_fds[0] =
27 m_fds[1] = -1;
28 }
29
30 virtual wxSocketError GetLastError() const;
31
32 virtual void ReenableEvents(wxSocketEventFlags flags)
33 {
34 // enable the notifications about input/output being available again in
35 // case they were disabled by OnRead/WriteWaiting()
36 //
37 // notice that we'd like to enable the events here only if there is
38 // nothing more left on the socket right now as otherwise we're going
39 // to get a "ready for whatever" notification immediately (well, during
40 // the next event loop iteration) and disable the event back again
41 // which is rather inefficient but unfortunately doing it like this
42 // doesn't work because the existing code (e.g. src/common/sckipc.cpp)
43 // expects to keep getting notifications about the data available from
44 // the socket even if it didn't read all the data the last time, so we
45 // absolutely have to continue generating them
46 EnableEvents(flags);
47 }
48
49 // wxFDIOHandler methods
50 virtual void OnReadWaiting();
51 virtual void OnWriteWaiting();
52 virtual void OnExceptionWaiting();
53 virtual bool IsOk() const { return m_fd != INVALID_SOCKET; }
54
55 private:
56 virtual void DoClose()
57 {
58 DisableEvents();
59
60 close(m_fd);
61 }
62
63 virtual void UnblockAndRegisterWithEventLoop()
64 {
65 int trueArg = 1;
66 ioctl(m_fd, FIONBIO, &trueArg);
67
68 EnableEvents();
69 }
70
71 // enable or disable notifications for socket input/output events
72 void EnableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG)
73 { DoEnableEvents(flags, true); }
74 void DisableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG)
75 { DoEnableEvents(flags, false); }
76
77 // really enable or disable socket input/output events
78 void DoEnableEvents(int flags, bool enable);
79
80 protected:
81 // descriptors for input and output event notification channels associated
82 // with the socket
83 int m_fds[2];
84
85 private:
86 // notify the associated wxSocket about a change in socket state and shut
87 // down the socket if the event is wxSOCKET_LOST
88 void OnStateChange(wxSocketNotify event);
89
90 // check if there is any input available, return 1 if yes, 0 if no or -1 on
91 // error
92 int CheckForInput();
93
94
95 // give it access to our m_fds
96 friend class wxSocketFDBasedManager;
97 };
98
99 // A version of wxSocketManager which uses FDs for socket IO: it is used by
100 // Unix console applications and some X11-like ports (wxGTK and wxMotif but not
101 // wxX11 currently) which implement their own port-specific wxFDIOManagers
102 class wxSocketFDBasedManager : public wxSocketManager
103 {
104 public:
105 wxSocketFDBasedManager()
106 {
107 m_fdioManager = NULL;
108 }
109
110 virtual bool OnInit();
111 virtual void OnExit() { }
112
113 virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket)
114 {
115 return new wxSocketImplUnix(wxsocket);
116 }
117
118 virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event);
119 virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event);
120
121 protected:
122 // get the FD index corresponding to the given wxSocketNotify
123 wxFDIOManager::Direction
124 GetDirForEvent(wxSocketImpl *socket, wxSocketNotify event);
125
126 // access the FDs we store
127 int& FD(wxSocketImplUnix *socket, wxFDIOManager::Direction d)
128 {
129 return socket->m_fds[d];
130 }
131
132 wxFDIOManager *m_fdioManager;
133
134 wxDECLARE_NO_COPY_CLASS(wxSocketFDBasedManager);
135 };
136
137 #endif /* _WX_UNIX_GSOCKUNX_H_ */