| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/unix/private/sockunix.h
- // Purpose: wxSocketImpl implementation for Unix systems
- // Authors: Guilhem Lavaux, Vadim Zeitlin
- // Created: April 1997
- // Copyright: (c) 1997 Guilhem Lavaux
- // (c) 2008 Vadim Zeitlin
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_UNIX_GSOCKUNX_H_
- #define _WX_UNIX_GSOCKUNX_H_
- #include <unistd.h>
- #include <sys/ioctl.h>
- // Under older (Open)Solaris versions FIONBIO is declared in this header only.
- // In the newer versions it's included by sys/ioctl.h but it's simpler to just
- // include it always instead of testing for whether it is or not.
- #ifdef __SOLARIS__
- #include <sys/filio.h>
- #endif
- #include "wx/private/fdiomanager.h"
- class wxSocketImplUnix : public wxSocketImpl,
- public wxFDIOHandler
- {
- public:
- wxSocketImplUnix(wxSocketBase& wxsocket)
- : wxSocketImpl(wxsocket)
- {
- m_fds[0] =
- m_fds[1] = -1;
- }
- virtual wxSocketError GetLastError() const;
- virtual void ReenableEvents(wxSocketEventFlags flags)
- {
- // enable the notifications about input/output being available again in
- // case they were disabled by OnRead/WriteWaiting()
- //
- // notice that we'd like to enable the events here only if there is
- // nothing more left on the socket right now as otherwise we're going
- // to get a "ready for whatever" notification immediately (well, during
- // the next event loop iteration) and disable the event back again
- // which is rather inefficient but unfortunately doing it like this
- // doesn't work because the existing code (e.g. src/common/sckipc.cpp)
- // expects to keep getting notifications about the data available from
- // the socket even if it didn't read all the data the last time, so we
- // absolutely have to continue generating them
- EnableEvents(flags);
- }
- // wxFDIOHandler methods
- virtual void OnReadWaiting();
- virtual void OnWriteWaiting();
- virtual void OnExceptionWaiting();
- virtual bool IsOk() const { return m_fd != INVALID_SOCKET; }
- private:
- virtual void DoClose()
- {
- DisableEvents();
- close(m_fd);
- }
- virtual void UnblockAndRegisterWithEventLoop()
- {
- int trueArg = 1;
- ioctl(m_fd, FIONBIO, &trueArg);
- EnableEvents();
- }
- // enable or disable notifications for socket input/output events
- void EnableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG)
- { DoEnableEvents(flags, true); }
- void DisableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG)
- { DoEnableEvents(flags, false); }
- // really enable or disable socket input/output events
- void DoEnableEvents(int flags, bool enable);
- protected:
- // descriptors for input and output event notification channels associated
- // with the socket
- int m_fds[2];
- private:
- // notify the associated wxSocket about a change in socket state and shut
- // down the socket if the event is wxSOCKET_LOST
- void OnStateChange(wxSocketNotify event);
- // check if there is any input available, return 1 if yes, 0 if no or -1 on
- // error
- int CheckForInput();
- // give it access to our m_fds
- friend class wxSocketFDBasedManager;
- };
- // A version of wxSocketManager which uses FDs for socket IO: it is used by
- // Unix console applications and some X11-like ports (wxGTK and wxMotif but not
- // wxX11 currently) which implement their own port-specific wxFDIOManagers
- class wxSocketFDBasedManager : public wxSocketManager
- {
- public:
- wxSocketFDBasedManager()
- {
- m_fdioManager = NULL;
- }
- virtual bool OnInit();
- virtual void OnExit() { }
- virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket)
- {
- return new wxSocketImplUnix(wxsocket);
- }
- virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event);
- virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event);
- protected:
- // get the FD index corresponding to the given wxSocketNotify
- wxFDIOManager::Direction
- GetDirForEvent(wxSocketImpl *socket, wxSocketNotify event);
- // access the FDs we store
- int& FD(wxSocketImplUnix *socket, wxFDIOManager::Direction d)
- {
- return socket->m_fds[d];
- }
- wxFDIOManager *m_fdioManager;
- wxDECLARE_NO_COPY_CLASS(wxSocketFDBasedManager);
- };
- #endif /* _WX_UNIX_GSOCKUNX_H_ */
|