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