wxFDIO_ALL = wxFDIO_INPUT | wxFDIO_OUTPUT | wxFDIO_EXCEPTION
};
+// base class for wxSelectDispatcher and wxEpollDispatcher
+class WXDLLIMPEXP_BASE wxFDIODispatcher
+{
+public:
+ enum { TIMEOUT_INFINITE = -1 };
+
+ // register handler for the given descriptor with the dispatcher, return
+ // true on success or false on error
+ virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) = 0;
+
+ // modify descriptor flags or handler, return true on success
+ virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) = 0;
+
+ // unregister descriptor previously registered with RegisterFD(), the
+ // caller is responsible for deleting the returned handler pointer if
+ // necessary
+ virtual bool UnregisterFD(int fd, int flags) = 0;
+
+ // loops waiting for an event to happen on any of the descriptors
+ virtual void RunLoop(int timeout) = 0;
+
+ virtual ~wxFDIODispatcher() { }
+};
+
+//entry for wxFDIOHandlerMap
struct wxFDIOHandlerEntry
{
wxFDIOHandlerEntry()
wxFDIOHandlerMap
);
-// base class for wxSelectDispatcher and wxEpollDispatcher
+// FDIODispatcher that holds map fd <-> FDIOHandler, this should be used if
+// this map isn't maintained elsewhere already as it is usually needed anyhow
//
-// notice that all pure virtual functions for FD management have implementation
+// notice that all functions for FD management have implementation
// in the base class and should be called from the derived classes
-class WXDLLIMPEXP_BASE wxFDIODispatcher
-{
+class WXDLLIMPEXP_BASE wxMappedFDIODispatcher : public wxFDIODispatcher {
public:
- enum { TIMEOUT_INFINITE = -1 };
-
// find the handler for the given fd, return NULL if none
wxFDIOHandler *FindHandler(int fd) const;
-
// register handler for the given descriptor with the dispatcher, return
// true on success or false on error
- virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) = 0;
+ virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags);
// modify descriptor flags or handler, return true on success
- virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) = 0;
+ virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags);
// unregister descriptor previously registered with RegisterFD(), the
// caller is responsible for deleting the returned handler pointer if
// necessary
- virtual wxFDIOHandler *UnregisterFD(int fd, int flags) = 0;
+ virtual bool UnregisterFD(int fd, int flags);
- // loops waiting for an event to happen on any of the descriptors
- virtual void RunLoop(int timeout) = 0;
-
- virtual ~wxFDIODispatcher() { }
+ virtual ~wxMappedFDIODispatcher() { }
protected:
// the fd -> handler map containing all the registered handlers
static Callback ms_handlers[Max];
};
-class WXDLLIMPEXP_BASE wxSelectDispatcher : public wxFDIODispatcher
+class WXDLLIMPEXP_BASE wxSelectDispatcher : public wxMappedFDIODispatcher
{
public:
// returns the unique instance of this class, the pointer shouldn't be
// implement pure virtual methods of the base class
virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL);
virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL);
- virtual wxFDIOHandler *UnregisterFD(int fd, int flags = wxFDIO_ALL);
+ virtual bool UnregisterFD(int fd, int flags = wxFDIO_ALL);
virtual void RunLoop(int timeout = TIMEOUT_INFINITE);
protected:
// implement base class pure virtual methods
virtual bool RegisterFD(int fd, wxFDIOHandler* handler, int flags = wxFDIO_ALL);
virtual bool ModifyFD(int fd, wxFDIOHandler* handler, int flags = wxFDIO_ALL);
- virtual wxFDIOHandler *UnregisterFD(int fd, int flags = wxFDIO_ALL);
+ virtual bool UnregisterFD(int fd, int flags = wxFDIO_ALL);
virtual void RunLoop(int timeout = TIMEOUT_INFINITE);
private:
// implementation
// ============================================================================
-wxFDIOHandler *wxFDIODispatcher::FindHandler(int fd) const
+wxFDIOHandler *wxMappedFDIODispatcher::FindHandler(int fd) const
{
const wxFDIOHandlerMap::const_iterator it = m_handlers.find(fd);
}
-bool wxFDIODispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
+bool wxMappedFDIODispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
{
wxUnusedVar(flags);
return true;
}
-bool wxFDIODispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags)
+bool wxMappedFDIODispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags)
{
wxUnusedVar(flags);
return true;
}
-wxFDIOHandler *wxFDIODispatcher::UnregisterFD(int fd, int flags)
+bool wxMappedFDIODispatcher::UnregisterFD(int fd, int flags)
{
wxFDIOHandlerMap::iterator i = m_handlers.find(fd);
- wxCHECK_MSG( i != m_handlers.end(), NULL,
- _T("unregistering unregistered handler?") );
+ if( i == m_handlers.end())
+ return false;
- wxFDIOHandler * const handler = i->second.handler;
i->second.flags &= ~flags;
if ( !i->second.flags )
{
m_handlers.erase(i);
}
- return handler;
+ return true;
}
bool wxSelectDispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
{
- if ( !wxFDIODispatcher::RegisterFD(fd, handler, flags) )
+ if ( !wxMappedFDIODispatcher::RegisterFD(fd, handler, flags) )
return false;
if ( !m_sets.SetFD(fd, flags) )
bool wxSelectDispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags)
{
- if ( !wxFDIODispatcher::ModifyFD(fd, handler, flags) )
+ if ( !wxMappedFDIODispatcher::ModifyFD(fd, handler, flags) )
return false;
wxASSERT_MSG( fd <= m_maxFD, _T("logic error: registered fd > m_maxFD?") );
return m_sets.SetFD(fd, flags);
}
-wxFDIOHandler *wxSelectDispatcher::UnregisterFD(int fd, int flags)
+bool wxSelectDispatcher::UnregisterFD(int fd, int flags)
{
- wxFDIOHandler * const handler = wxFDIODispatcher::UnregisterFD(fd, flags);
-
m_sets.ClearFD(fd, flags);
// remove the handler if we don't need it any more
}
}
- return handler;
+ return true;
}
void wxSelectDispatcher::ProcessSets(const wxSelectSets& sets)
bool wxEpollDispatcher::RegisterFD(int fd, wxFDIOHandler* handler, int flags)
{
- if ( !wxFDIODispatcher::RegisterFD(fd, handler, flags) )
- return false;
-
epoll_event ev;
ev.events = GetEpollMask(flags, fd);
ev.data.ptr = handler;
bool wxEpollDispatcher::ModifyFD(int fd, wxFDIOHandler* handler, int flags)
{
- if ( !wxFDIODispatcher::ModifyFD(fd, handler, flags) )
- return false;
-
epoll_event ev;
ev.events = GetEpollMask(flags, fd);
ev.data.ptr = handler;
return true;
}
-wxFDIOHandler *wxEpollDispatcher::UnregisterFD(int fd, int flags)
+bool wxEpollDispatcher::UnregisterFD(int fd, int flags)
{
- wxFDIOHandler * const handler = wxFDIODispatcher::UnregisterFD(fd, flags);
- if ( !handler )
- return NULL;
-
epoll_event ev;
ev.events = 0;
ev.data.ptr = NULL;
fd, m_epollDescriptor);
}
- return handler;
+ return true;
}
void wxEpollDispatcher::RunLoop(int timeout)