move enabled callbacks flag down to wxSocketImplUnix from wxSocketImplFDIO, this allows to get rid of the letter

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56999 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-11-28 15:01:41 +00:00
parent a9d859df6f
commit acd523a964
2 changed files with 27 additions and 39 deletions

View File

@@ -27,6 +27,7 @@ public:
m_fds[1] = -1; m_fds[1] = -1;
m_use_events = false; m_use_events = false;
m_enabledCallbacks = 0;
} }
virtual void Shutdown(); virtual void Shutdown();
@@ -42,6 +43,14 @@ public:
virtual void OnWriteWaiting(); virtual void OnWriteWaiting();
virtual void OnExceptionWaiting(); virtual void OnExceptionWaiting();
// Unix-specific functions
bool HasAnyEnabledCallbacks() const { return m_enabledCallbacks != 0; }
void EnableCallback(wxFDIODispatcherEntryFlags flag)
{ m_enabledCallbacks |= flag; }
void DisableCallback(wxFDIODispatcherEntryFlags flag)
{ m_enabledCallbacks &= ~flag; }
int GetEnabledCallbacks() const { return m_enabledCallbacks; }
private: private:
virtual wxSocketError DoHandleConnect(int ret); virtual wxSocketError DoHandleConnect(int ret);
virtual void DoClose() virtual void DoClose()
@@ -99,6 +108,7 @@ private:
int Send_Stream(const char *buffer, int size); int Send_Stream(const char *buffer, int size);
int Send_Dgram(const char *buffer, int size); int Send_Dgram(const char *buffer, int size);
protected: protected:
// true if socket should fire events // true if socket should fire events
bool m_use_events; bool m_use_events;
@@ -107,6 +117,13 @@ protected:
// with the socket // with the socket
int m_fds[2]; int m_fds[2];
// the events which are currently enabled for this socket, combination of
// wxFDIO_INPUT and wxFDIO_OUTPUT values
//
// TODO: this overlaps with m_detected but the semantics of the latter are
// very unclear so I don't dare to remove it right now
int m_enabledCallbacks;
private: private:
// notify the associated wxSocket about a change in socket state and shut // notify the associated wxSocket about a change in socket state and shut
// down the socket if the event is wxSOCKET_LOST // down the socket if the event is wxSOCKET_LOST

View File

@@ -29,26 +29,6 @@
// implementation // implementation
// ============================================================================ // ============================================================================
// ----------------------------------------------------------------------------
// wxSocketImplFDIO
// ----------------------------------------------------------------------------
class wxSocketImplFDIO : public wxSocketImplUnix
{
public:
wxSocketImplFDIO(wxSocketBase& wxsocket)
: wxSocketImplUnix(wxsocket)
{
}
int GetFlags() const { return m_flags; }
void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; }
void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; }
private:
int m_flags;
};
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxSocketSelectManager // wxSocketSelectManager
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -56,11 +36,6 @@ private:
class wxSocketSelectManager : public wxSocketFDBasedManager class wxSocketSelectManager : public wxSocketFDBasedManager
{ {
public: public:
virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket)
{
return new wxSocketImplFDIO(wxsocket);
}
virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event); virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event);
virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event); virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event);
}; };
@@ -68,7 +43,7 @@ public:
void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_, void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_,
wxSocketNotify event) wxSocketNotify event)
{ {
wxSocketImplFDIO * const socket = static_cast<wxSocketImplFDIO *>(socket_); wxSocketImplUnix * const socket = static_cast<wxSocketImplUnix *>(socket_);
const int fd = socket->m_fd; const int fd = socket->m_fd;
@@ -85,20 +60,20 @@ void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_,
// register it when it's used for the first time, update it if it had been // register it when it's used for the first time, update it if it had been
// previously registered // previously registered
const bool registerHandler = socket->GetFlags() == 0; const bool alreadyRegistered = socket->HasAnyEnabledCallbacks();
socket->AddFlag(d == FD_INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT); socket->EnableCallback(d == FD_INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT);
if ( registerHandler ) if ( alreadyRegistered )
dispatcher->RegisterFD(fd, socket, socket->GetFlags()); dispatcher->ModifyFD(fd, socket, socket->GetEnabledCallbacks());
else else
dispatcher->ModifyFD(fd, socket, socket->GetFlags()); dispatcher->RegisterFD(fd, socket, socket->GetEnabledCallbacks());
} }
void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_, void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_,
wxSocketNotify event) wxSocketNotify event)
{ {
wxSocketImplFDIO * const socket = static_cast<wxSocketImplFDIO *>(socket_); wxSocketImplUnix * const socket = static_cast<wxSocketImplUnix *>(socket_);
const SocketDir d = GetDirForEvent(socket, event); const SocketDir d = GetDirForEvent(socket, event);
@@ -115,16 +90,12 @@ void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_,
if ( !dispatcher ) if ( !dispatcher )
return; return;
socket->RemoveFlag(flag); socket->DisableCallback(flag);
if ( !socket->GetFlags() ) if ( !socket->HasAnyEnabledCallbacks() )
{
dispatcher->UnregisterFD(fd); dispatcher->UnregisterFD(fd);
}
else else
{ dispatcher->ModifyFD(fd, socket, socket->GetEnabledCallbacks());
dispatcher->ModifyFD(fd, socket, socket->GetFlags());
}
} }
// set the wxBase variable to point to our wxSocketManager implementation // set the wxBase variable to point to our wxSocketManager implementation