]>
git.saurik.com Git - wxWidgets.git/blob - 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
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>
18 // Under older (Open)Solaris versions FIONBIO is declared in this header only.
19 // In the newer versions it's included by sys/ioctl.h but it's simpler to just
20 // include it always instead of testing for whether it is or not.
22 #include <sys/filio.h>
25 #include "wx/private/fdiomanager.h"
27 class wxSocketImplUnix
: public wxSocketImpl
,
31 wxSocketImplUnix(wxSocketBase
& wxsocket
)
32 : wxSocketImpl(wxsocket
)
38 virtual wxSocketError
GetLastError() const;
40 virtual void ReenableEvents(wxSocketEventFlags flags
)
42 // enable the notifications about input/output being available again in
43 // case they were disabled by OnRead/WriteWaiting()
45 // notice that we'd like to enable the events here only if there is
46 // nothing more left on the socket right now as otherwise we're going
47 // to get a "ready for whatever" notification immediately (well, during
48 // the next event loop iteration) and disable the event back again
49 // which is rather inefficient but unfortunately doing it like this
50 // doesn't work because the existing code (e.g. src/common/sckipc.cpp)
51 // expects to keep getting notifications about the data available from
52 // the socket even if it didn't read all the data the last time, so we
53 // absolutely have to continue generating them
57 // wxFDIOHandler methods
58 virtual void OnReadWaiting();
59 virtual void OnWriteWaiting();
60 virtual void OnExceptionWaiting();
61 virtual bool IsOk() const { return m_fd
!= INVALID_SOCKET
; }
64 virtual void DoClose()
71 virtual void UnblockAndRegisterWithEventLoop()
74 ioctl(m_fd
, FIONBIO
, &trueArg
);
79 // enable or disable notifications for socket input/output events
80 void EnableEvents(int flags
= wxSOCKET_INPUT_FLAG
| wxSOCKET_OUTPUT_FLAG
)
81 { DoEnableEvents(flags
, true); }
82 void DisableEvents(int flags
= wxSOCKET_INPUT_FLAG
| wxSOCKET_OUTPUT_FLAG
)
83 { DoEnableEvents(flags
, false); }
85 // really enable or disable socket input/output events
86 void DoEnableEvents(int flags
, bool enable
);
89 // descriptors for input and output event notification channels associated
94 // notify the associated wxSocket about a change in socket state and shut
95 // down the socket if the event is wxSOCKET_LOST
96 void OnStateChange(wxSocketNotify event
);
98 // check if there is any input available, return 1 if yes, 0 if no or -1 on
103 // give it access to our m_fds
104 friend class wxSocketFDBasedManager
;
107 // A version of wxSocketManager which uses FDs for socket IO: it is used by
108 // Unix console applications and some X11-like ports (wxGTK and wxMotif but not
109 // wxX11 currently) which implement their own port-specific wxFDIOManagers
110 class wxSocketFDBasedManager
: public wxSocketManager
113 wxSocketFDBasedManager()
115 m_fdioManager
= NULL
;
118 virtual bool OnInit();
119 virtual void OnExit() { }
121 virtual wxSocketImpl
*CreateSocket(wxSocketBase
& wxsocket
)
123 return new wxSocketImplUnix(wxsocket
);
126 virtual void Install_Callback(wxSocketImpl
*socket_
, wxSocketNotify event
);
127 virtual void Uninstall_Callback(wxSocketImpl
*socket_
, wxSocketNotify event
);
130 // get the FD index corresponding to the given wxSocketNotify
131 wxFDIOManager::Direction
132 GetDirForEvent(wxSocketImpl
*socket
, wxSocketNotify event
);
134 // access the FDs we store
135 int& FD(wxSocketImplUnix
*socket
, wxFDIOManager::Direction d
)
137 return socket
->m_fds
[d
];
140 wxFDIOManager
*m_fdioManager
;
142 wxDECLARE_NO_COPY_CLASS(wxSocketFDBasedManager
);
145 #endif /* _WX_UNIX_GSOCKUNX_H_ */