2007-03-16 11:45:12 -04:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: wx/private/selectdispatcher.h
|
|
|
|
// Purpose: wxSelectDispatcher class
|
|
|
|
// Authors: Lukasz Michalski
|
|
|
|
// Modified by:
|
|
|
|
// Created: December 2006
|
|
|
|
// Copyright: (c) Lukasz Michalski
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Licence: wxWindows licence
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#ifndef _WX_PRIVATE_SELECTDISPATCHER_H_
|
|
|
|
#define _WX_PRIVATE_SELECTDISPATCHER_H_
|
|
|
|
|
|
|
|
#include "wx/defs.h"
|
|
|
|
|
|
|
|
#include "wx/hashmap.h"
|
|
|
|
|
|
|
|
static const int wxSELECT_TIMEOUT_INFINITE = -1;
|
|
|
|
|
|
|
|
// handler used to process events on descriptors
|
|
|
|
class wxFDIOHandler
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// called when descriptor is available for non-blocking read
|
|
|
|
virtual void OnReadWaiting(int fd) = 0;
|
|
|
|
|
|
|
|
// called when descriptor is available for non-blocking write
|
|
|
|
virtual void OnWriteWaiting(int fd) = 0;
|
|
|
|
|
|
|
|
// called when there is exception on descriptor
|
|
|
|
virtual void OnExceptionWaiting(int fd) = 0;
|
2007-03-16 12:17:04 -04:00
|
|
|
|
|
|
|
// virtual dtor for the base class
|
|
|
|
virtual ~wxFDIOHandler() { }
|
2007-03-16 11:45:12 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
// those flags describes sets where descriptor should be added
|
|
|
|
enum wxSelectDispatcherEntryFlags
|
|
|
|
{
|
|
|
|
wxSelectInput = 1,
|
|
|
|
wxSelectOutput = 2,
|
|
|
|
wxSelectException = 4,
|
|
|
|
wxSelectAll = wxSelectInput | wxSelectOutput | wxSelectException
|
|
|
|
};
|
|
|
|
|
|
|
|
WX_DECLARE_HASH_MAP(
|
|
|
|
int,
|
|
|
|
wxFDIOHandler*,
|
|
|
|
wxIntegerHash,
|
|
|
|
wxIntegerEqual,
|
|
|
|
wxFDIOHandlerMap
|
|
|
|
);
|
|
|
|
|
|
|
|
class WXDLLIMPEXP_CORE wxSelectDispatcher
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// returns instance of the table
|
|
|
|
static wxSelectDispatcher& Get();
|
|
|
|
|
|
|
|
virtual ~wxSelectDispatcher()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// register descriptor in sets.
|
|
|
|
void RegisterFD(int fd, wxFDIOHandler* handler, int flags = wxSelectAll);
|
|
|
|
|
|
|
|
// unregister descriptor from sets and return handler for cleanup
|
|
|
|
wxFDIOHandler* UnregisterFD(int fd, int flags = wxSelectAll);
|
|
|
|
|
|
|
|
// return handler for descriptor or null if fd is not registered
|
|
|
|
wxFDIOHandler* FindHandler(int fd);
|
|
|
|
|
|
|
|
// calls select on registered descriptors and
|
|
|
|
void RunLoop(int timeout = wxSELECT_TIMEOUT_INFINITE);
|
|
|
|
|
|
|
|
protected:
|
2007-03-18 22:27:34 -04:00
|
|
|
wxSelectDispatcher() { m_maxFD = -1; }
|
2007-03-16 11:45:12 -04:00
|
|
|
|
|
|
|
private:
|
|
|
|
void ProcessSets(fd_set* readset, fd_set* writeset, fd_set* exeptset, int max_fd);
|
|
|
|
|
|
|
|
fd_set m_readset;
|
|
|
|
fd_set m_writeset;
|
|
|
|
fd_set m_exeptset;
|
|
|
|
|
|
|
|
int m_maxFD;
|
|
|
|
wxFDIOHandlerMap m_handlers;
|
|
|
|
|
|
|
|
static wxSelectDispatcher *ms_instance;
|
|
|
|
|
|
|
|
friend class wxSelectDispatcherModule;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _WX_PRIVATE_SOCKETEVTDISPATCH_H_
|