The files defining classes processing events on file descriptor only need this class and not wxFDIODispatcher itself so reduce build dependencies by extracting wxFDIOHandler in a separate header which they can include instead of the entire fdiodispatcher.h. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61686 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // 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"
 | |
| #include "wx/private/fdiohandler.h"
 | |
| 
 | |
| // 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
 | |
| };
 | |
| 
 | |
| // 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()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     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
 | |
| );
 | |
| 
 | |
| // 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 functions for FD management have implementation
 | |
| // in the base class and should be called from the derived classes
 | |
| class WXDLLIMPEXP_BASE wxMappedFDIODispatcher : public wxFDIODispatcher
 | |
| {
 | |
| public:
 | |
|     // 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);
 | |
| 
 | |
|     // modify descriptor flags or handler, return true on success
 | |
|     virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags);
 | |
| 
 | |
|     // unregister descriptor previously registered with RegisterFD()
 | |
|     virtual bool UnregisterFD(int fd);
 | |
| 
 | |
|     virtual ~wxMappedFDIODispatcher() { }
 | |
| 
 | |
| protected:
 | |
|     // the fd -> handler map containing all the registered handlers
 | |
|     wxFDIOHandlerMap m_handlers;
 | |
| };
 | |
| 
 | |
| #endif // _WX_PRIVATE_FDIODISPATCHER_H_
 |