2007-05-14 19:43:39 -04:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// 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
|
|
|
|
};
|
|
|
|
|
2007-06-02 09:51:05 -04:00
|
|
|
// base class for wxSelectDispatcher and wxEpollDispatcher
|
|
|
|
class WXDLLIMPEXP_BASE wxFDIODispatcher
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum { TIMEOUT_INFINITE = -1 };
|
|
|
|
|
2007-07-14 16:18:38 -04:00
|
|
|
// 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();
|
|
|
|
|
2007-06-02 09:51:05 -04:00
|
|
|
// 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;
|
|
|
|
|
2007-07-14 15:41:46 -04:00
|
|
|
// unregister descriptor previously registered with RegisterFD()
|
|
|
|
virtual bool UnregisterFD(int fd) = 0;
|
2007-06-02 09:51:05 -04:00
|
|
|
|
2009-01-02 20:21:24 -05:00
|
|
|
// check if any events are currently available without dispatching them
|
|
|
|
virtual bool HasPending() const = 0;
|
|
|
|
|
2008-10-16 08:31:30 -04:00
|
|
|
// wait for an event for at most timeout milliseconds and process it;
|
2009-01-02 20:21:24 -05:00
|
|
|
// 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;
|
2007-06-02 09:51:05 -04:00
|
|
|
|
|
|
|
virtual ~wxFDIODispatcher() { }
|
|
|
|
};
|
|
|
|
|
|
|
|
//entry for wxFDIOHandlerMap
|
2007-05-14 19:43:39 -04:00
|
|
|
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
|
|
|
|
);
|
|
|
|
|
2007-06-02 09:51:05 -04:00
|
|
|
// FDIODispatcher that holds map fd <-> FDIOHandler, this should be used if
|
|
|
|
// this map isn't maintained elsewhere already as it is usually needed anyhow
|
2007-05-14 19:43:39 -04:00
|
|
|
//
|
2007-06-02 09:51:05 -04:00
|
|
|
// notice that all functions for FD management have implementation
|
2007-05-14 19:43:39 -04:00
|
|
|
// in the base class and should be called from the derived classes
|
2007-07-14 15:41:46 -04:00
|
|
|
class WXDLLIMPEXP_BASE wxMappedFDIODispatcher : public wxFDIODispatcher
|
|
|
|
{
|
2007-05-14 19:43:39 -04:00
|
|
|
public:
|
|
|
|
// find the handler for the given fd, return NULL if none
|
|
|
|
wxFDIOHandler *FindHandler(int fd) const;
|
2007-07-14 15:41:46 -04:00
|
|
|
|
2007-05-14 19:43:39 -04:00
|
|
|
// register handler for the given descriptor with the dispatcher, return
|
|
|
|
// true on success or false on error
|
2007-06-02 09:51:05 -04:00
|
|
|
virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags);
|
2007-05-14 19:43:39 -04:00
|
|
|
|
|
|
|
// modify descriptor flags or handler, return true on success
|
2007-06-02 09:51:05 -04:00
|
|
|
virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags);
|
2007-05-14 19:43:39 -04:00
|
|
|
|
2007-07-14 15:41:46 -04:00
|
|
|
// unregister descriptor previously registered with RegisterFD()
|
|
|
|
virtual bool UnregisterFD(int fd);
|
2007-05-14 19:43:39 -04:00
|
|
|
|
2007-06-02 09:51:05 -04:00
|
|
|
virtual ~wxMappedFDIODispatcher() { }
|
2007-05-14 19:43:39 -04:00
|
|
|
|
|
|
|
protected:
|
|
|
|
// the fd -> handler map containing all the registered handlers
|
|
|
|
wxFDIOHandlerMap m_handlers;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _WX_PRIVATE_FDIODISPATCHER_H_
|