m_fds[1] = -1;
m_use_events = false;
+ m_enabledCallbacks = 0;
}
virtual void Shutdown();
virtual void OnWriteWaiting();
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:
virtual wxSocketError DoHandleConnect(int ret);
virtual void DoClose()
int Send_Stream(const char *buffer, int size);
int Send_Dgram(const char *buffer, int size);
+
protected:
// true if socket should fire events
bool m_use_events;
// with the socket
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:
// notify the associated wxSocket about a change in socket state and shut
// down the socket if the event is wxSOCKET_LOST
// 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
// ----------------------------------------------------------------------------
class wxSocketSelectManager : public wxSocketFDBasedManager
{
public:
- virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket)
- {
- return new wxSocketImplFDIO(wxsocket);
- }
-
virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event);
virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event);
};
void wxSocketSelectManager::Install_Callback(wxSocketImpl *socket_,
wxSocketNotify event)
{
- wxSocketImplFDIO * const socket = static_cast<wxSocketImplFDIO *>(socket_);
+ wxSocketImplUnix * const socket = static_cast<wxSocketImplUnix *>(socket_);
const int fd = socket->m_fd;
// register it when it's used for the first time, update it if it had been
// 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 )
- dispatcher->RegisterFD(fd, socket, socket->GetFlags());
+ if ( alreadyRegistered )
+ dispatcher->ModifyFD(fd, socket, socket->GetEnabledCallbacks());
else
- dispatcher->ModifyFD(fd, socket, socket->GetFlags());
+ dispatcher->RegisterFD(fd, socket, socket->GetEnabledCallbacks());
}
void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_,
wxSocketNotify event)
{
- wxSocketImplFDIO * const socket = static_cast<wxSocketImplFDIO *>(socket_);
+ wxSocketImplUnix * const socket = static_cast<wxSocketImplUnix *>(socket_);
const SocketDir d = GetDirForEvent(socket, event);
if ( !dispatcher )
return;
- socket->RemoveFlag(flag);
+ socket->DisableCallback(flag);
- if ( !socket->GetFlags() )
- {
+ if ( !socket->HasAnyEnabledCallbacks() )
dispatcher->UnregisterFD(fd);
- }
else
- {
- dispatcher->ModifyFD(fd, socket, socket->GetFlags());
- }
+ dispatcher->ModifyFD(fd, socket, socket->GetEnabledCallbacks());
}
// set the wxBase variable to point to our wxSocketManager implementation