102 lines
2.9 KiB
C
102 lines
2.9 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"
|
||
|
|
||
|
// 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_
|