1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/private/fdiodispatcher.h 3 // Purpose: classes for dispatching IO notifications for file descriptors 4 // Authors: Lukasz Michalski 5 // Created: December 2006 6 // Copyright: (c) Lukasz Michalski 7 // Licence: wxWindows licence 8 ///////////////////////////////////////////////////////////////////////////// 9 10 #ifndef _WX_PRIVATE_FDIODISPATCHER_H_ 11 #define _WX_PRIVATE_FDIODISPATCHER_H_ 12 13 #include "wx/hashmap.h" 14 #include "wx/private/fdiohandler.h" 15 16 // those flags describes sets where descriptor should be added 17 enum wxFDIODispatcherEntryFlags 18 { 19 wxFDIO_INPUT = 1, 20 wxFDIO_OUTPUT = 2, 21 wxFDIO_EXCEPTION = 4, 22 wxFDIO_ALL = wxFDIO_INPUT | wxFDIO_OUTPUT | wxFDIO_EXCEPTION 23 }; 24 25 // base class for wxSelectDispatcher and wxEpollDispatcher 26 class WXDLLIMPEXP_BASE wxFDIODispatcher 27 { 28 public: 29 enum { TIMEOUT_INFINITE = -1 }; 30 31 // return the global dispatcher to be used for IO events, can be NULL only 32 // if wxSelectDispatcher wasn't compiled into the library at all as 33 // creating it never fails 34 // 35 // don't delete the returned pointer 36 static wxFDIODispatcher *Get(); 37 38 // if we have any registered handlers, check for any pending events to them 39 // and dispatch them -- this is used from wxX11 and wxDFB event loops 40 // implementation 41 static void DispatchPending(); 42 43 // register handler for the given descriptor with the dispatcher, return 44 // true on success or false on error 45 virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) = 0; 46 47 // modify descriptor flags or handler, return true on success 48 virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) = 0; 49 50 // unregister descriptor previously registered with RegisterFD() 51 virtual bool UnregisterFD(int fd) = 0; 52 53 // check if any events are currently available without dispatching them 54 virtual bool HasPending() const = 0; 55 56 // wait for an event for at most timeout milliseconds and process it; 57 // return the number of events processed (possibly 0 if timeout expired) or 58 // -1 if an error occurred 59 virtual int Dispatch(int timeout = TIMEOUT_INFINITE) = 0; 60 ~wxFDIODispatcher()61 virtual ~wxFDIODispatcher() { } 62 }; 63 64 //entry for wxFDIOHandlerMap 65 struct wxFDIOHandlerEntry 66 { wxFDIOHandlerEntrywxFDIOHandlerEntry67 wxFDIOHandlerEntry() 68 { 69 } 70 wxFDIOHandlerEntrywxFDIOHandlerEntry71 wxFDIOHandlerEntry(wxFDIOHandler *handler_, int flags_) 72 : handler(handler_), 73 flags(flags_) 74 { 75 } 76 77 wxFDIOHandler *handler; 78 int flags; 79 }; 80 81 // this hash is used to map file descriptors to their handlers 82 WX_DECLARE_HASH_MAP( 83 int, 84 wxFDIOHandlerEntry, 85 wxIntegerHash, 86 wxIntegerEqual, 87 wxFDIOHandlerMap 88 ); 89 90 // FDIODispatcher that holds map fd <-> FDIOHandler, this should be used if 91 // this map isn't maintained elsewhere already as it is usually needed anyhow 92 // 93 // notice that all functions for FD management have implementation 94 // in the base class and should be called from the derived classes 95 class WXDLLIMPEXP_BASE wxMappedFDIODispatcher : public wxFDIODispatcher 96 { 97 public: 98 // find the handler for the given fd, return NULL if none 99 wxFDIOHandler *FindHandler(int fd) const; 100 101 // register handler for the given descriptor with the dispatcher, return 102 // true on success or false on error 103 virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags); 104 105 // modify descriptor flags or handler, return true on success 106 virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags); 107 108 // unregister descriptor previously registered with RegisterFD() 109 virtual bool UnregisterFD(int fd); 110 ~wxMappedFDIODispatcher()111 virtual ~wxMappedFDIODispatcher() { } 112 113 protected: 114 // the fd -> handler map containing all the registered handlers 115 wxFDIOHandlerMap m_handlers; 116 }; 117 118 #endif // _WX_PRIVATE_FDIODISPATCHER_H_ 119