]>
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>
17 #include "wx/private/fdiomanager.h"
19 class wxSocketImplUnix
: public wxSocketImpl
,
23 wxSocketImplUnix(wxSocketBase
& wxsocket
)
24 : wxSocketImpl(wxsocket
)
30 virtual wxSocketError
GetLastError() const;
32 virtual void ReenableEvents(wxSocketEventFlags flags
)
34 // enable the notifications about input/output being available again in
35 // case they were disabled by OnRead/WriteWaiting()
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
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
; }
56 virtual void DoClose()
63 virtual void UnblockAndRegisterWithEventLoop()
66 ioctl(m_fd
, FIONBIO
, &trueArg
);
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); }
77 // really enable or disable socket input/output events
78 void DoEnableEvents(int flags
, bool enable
);
81 // descriptors for input and output event notification channels associated
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
);
90 // check if there is any input available, return 1 if yes, 0 if no or -1 on
95 // give it access to our m_fds
96 friend class wxSocketFDBasedManager
;
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
105 wxSocketFDBasedManager()
107 m_fdioManager
= NULL
;
110 virtual bool OnInit();
111 virtual void OnExit() { }
113 virtual wxSocketImpl
*CreateSocket(wxSocketBase
& wxsocket
)
115 return new wxSocketImplUnix(wxsocket
);
118 virtual void Install_Callback(wxSocketImpl
*socket_
, wxSocketNotify event
);
119 virtual void Uninstall_Callback(wxSocketImpl
*socket_
, wxSocketNotify event
);
122 // get the FD index corresponding to the given wxSocketNotify
123 wxFDIOManager::Direction
124 GetDirForEvent(wxSocketImpl
*socket
, wxSocketNotify event
);
126 // access the FDs we store
127 int& FD(wxSocketImplUnix
*socket
, wxFDIOManager::Direction d
)
129 return socket
->m_fds
[d
];
132 wxFDIOManager
*m_fdioManager
;
134 wxDECLARE_NO_COPY_CLASS(wxSocketFDBasedManager
);
137 #endif /* _WX_UNIX_GSOCKUNX_H_ */