#define _WX_PRIVATE_FDIODISPATCHER_H_
#include "wx/hashmap.h"
-
-// handler used to process events on descriptors
-class wxFDIOHandler
-{
-public:
- // called when descriptor is available for non-blocking read
- virtual void OnReadWaiting() = 0;
-
- // called when descriptor is available for non-blocking write
- virtual void OnWriteWaiting() = 0;
-
- // called when there is exception on descriptor
- virtual void OnExceptionWaiting() = 0;
-
- // virtual dtor for the base class
- virtual ~wxFDIOHandler() { }
-};
+#include "wx/private/fdiohandler.h"
// those flags describes sets where descriptor should be added
enum wxFDIODispatcherEntryFlags
wxFDIO_ALL = wxFDIO_INPUT | wxFDIO_OUTPUT | wxFDIO_EXCEPTION
};
+// base class for wxSelectDispatcher and wxEpollDispatcher
+class WXDLLIMPEXP_BASE wxFDIODispatcher
+{
+public:
+ enum { TIMEOUT_INFINITE = -1 };
+
+ // return the global dispatcher to be used for IO events, can be NULL only
+ // if wxSelectDispatcher wasn't compiled into the library at all as
+ // creating it never fails
+ //
+ // don't delete the returned pointer
+ static wxFDIODispatcher *Get();
+
+ // if we have any registered handlers, check for any pending events to them
+ // and dispatch them -- this is used from wxX11 and wxDFB event loops
+ // implementation
+ static void DispatchPending();
+
+ // 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()
+ virtual bool UnregisterFD(int fd) = 0;
+
+ // check if any events are currently available without dispatching them
+ virtual bool HasPending() const = 0;
+
+ // wait for an event for at most timeout milliseconds and process it;
+ // return the number of events processed (possibly 0 if timeout expired) or
+ // -1 if an error occurred
+ virtual int Dispatch(int timeout = TIMEOUT_INFINITE) = 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;
+ // unregister descriptor previously registered with RegisterFD()
+ virtual bool UnregisterFD(int fd);
- // 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