1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/gsocketiohandler.cpp
3 // Purpose: implementation of wxFDIOHandler for wxSocket
4 // Author: Angel Vidal, Lukasz Michalski
7 // Copyright: (c) 2006 Angel vidal
8 // (c) 2007 Vadim Zeitlin <vadim@wxwidgets.org>
9 // License: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // for compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
23 #if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
25 #include "wx/apptrait.h"
26 #include "wx/unix/private.h"
27 #include "wx/private/gsocketiohandler.h"
29 // ============================================================================
31 // ============================================================================
33 // ----------------------------------------------------------------------------
35 // ----------------------------------------------------------------------------
37 class wxSocketImplFDIO
: public wxSocketImplUnix
40 wxSocketImplFDIO(wxSocketBase
& wxsocket
)
41 : wxSocketImplUnix(wxsocket
)
46 virtual ~wxSocketImplFDIO()
51 wxSocketIOHandler
*m_handler
;
54 // ----------------------------------------------------------------------------
55 // wxSocketSelectManager
56 // ----------------------------------------------------------------------------
58 class wxSocketSelectManager
: public wxSocketFDBasedManager
61 virtual wxSocketImpl
*CreateSocket(wxSocketBase
& wxsocket
)
63 return new wxSocketImplFDIO(wxsocket
);
66 virtual void Install_Callback(wxSocketImpl
*socket
, wxSocketNotify event
);
67 virtual void Uninstall_Callback(wxSocketImpl
*socket
, wxSocketNotify event
);
70 void wxSocketSelectManager::Install_Callback(wxSocketImpl
*socket_
,
73 wxSocketImplFDIO
* const socket
= static_cast<wxSocketImplFDIO
*>(socket_
);
75 const int fd
= socket
->m_fd
;
80 const SocketDir d
= GetDirForEvent(socket
, event
);
82 wxFDIODispatcher
* const dispatcher
= wxFDIODispatcher::Get();
86 wxSocketIOHandler
*& handler
= socket
->m_handler
;
88 // we should register the new handlers but modify the existing ones in place
92 registerHandler
= false;
94 else // no existing handler
96 registerHandler
= true;
97 handler
= new wxSocketIOHandler(socket
);
103 handler
->AddFlag(wxFDIO_INPUT
);
107 handler
->AddFlag(wxFDIO_OUTPUT
);
110 if ( registerHandler
)
111 dispatcher
->RegisterFD(fd
, handler
, handler
->GetFlags());
113 dispatcher
->ModifyFD(fd
, handler
, handler
->GetFlags());
116 void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl
*socket_
,
117 wxSocketNotify event
)
119 wxSocketImplFDIO
* const socket
= static_cast<wxSocketImplFDIO
*>(socket_
);
121 const SocketDir d
= GetDirForEvent(socket
, event
);
123 const int fd
= FD(socket
, d
);
129 const wxFDIODispatcherEntryFlags
130 flag
= d
== FD_INPUT
? wxFDIO_INPUT
: wxFDIO_OUTPUT
;
132 wxFDIODispatcher
* const dispatcher
= wxFDIODispatcher::Get();
136 wxSocketIOHandler
*& handler
= socket
->m_handler
;
139 handler
->RemoveFlag(flag
);
141 if ( !handler
->GetFlags() )
143 dispatcher
->UnregisterFD(fd
);
145 socket
->m_handler
= NULL
;
149 dispatcher
->ModifyFD(fd
, handler
, handler
->GetFlags());
154 dispatcher
->UnregisterFD(fd
);
158 wxSocketManager
*wxAppTraits::GetSocketManager()
160 static wxSocketSelectManager s_manager
;
165 #endif // wxUSE_SOCKETS