]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/private/fdiodispatcher.h
implement event loop for console applications (heavily modified patch 1715735)
[wxWidgets.git] / include / wx / private / fdiodispatcher.h
diff --git a/include/wx/private/fdiodispatcher.h b/include/wx/private/fdiodispatcher.h
new file mode 100644 (file)
index 0000000..26b5164
--- /dev/null
@@ -0,0 +1,101 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wx/private/fdiodispatcher.h
+// Purpose:     classes for dispatching IO notifications for file descriptors
+// Authors:     Lukasz Michalski
+// Created:     December 2006
+// Copyright:   (c) Lukasz Michalski
+// RCS-ID:      $Id$
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_PRIVATE_FDIODISPATCHER_H_
+#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() { }
+};
+
+// those flags describes sets where descriptor should be added
+enum wxFDIODispatcherEntryFlags
+{
+    wxFDIO_INPUT = 1,
+    wxFDIO_OUTPUT = 2,
+    wxFDIO_EXCEPTION = 4,
+    wxFDIO_ALL = wxFDIO_INPUT | wxFDIO_OUTPUT | wxFDIO_EXCEPTION
+};
+
+struct wxFDIOHandlerEntry
+{
+    wxFDIOHandlerEntry()
+    {
+    }
+
+    wxFDIOHandlerEntry(wxFDIOHandler *handler_, int flags_)
+        : handler(handler_),
+          flags(flags_)
+    {
+    }
+
+    wxFDIOHandler *handler;
+    int flags;
+};
+
+// this hash is used to map file descriptors to their handlers
+WX_DECLARE_HASH_MAP(
+  int,
+  wxFDIOHandlerEntry,
+  wxIntegerHash,
+  wxIntegerEqual,
+  wxFDIOHandlerMap
+);
+
+// base class for wxSelectDispatcher and wxEpollDispatcher
+//
+// notice that all pure virtual functions for FD management have implementation
+// in the base class and should be called from the derived classes
+class WXDLLIMPEXP_BASE 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;
+
+    // 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 wxFDIOHandler *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() { }
+
+protected:
+    // the fd -> handler map containing all the registered handlers
+    wxFDIOHandlerMap m_handlers;
+};
+
+#endif // _WX_PRIVATE_FDIODISPATCHER_H_