PPI: Implement IOEvent error handling
[senf.git] / PPI / IOEvent.hh
1 // $Id$
2 //
3 // Copyright (C) 2007 
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief IOEvent public header */
25
26 #ifndef HH_IOEvent_
27 #define HH_IOEvent_ 1
28
29 // Custom includes
30 #include "Scheduler/Scheduler.hh"
31 #include "Events.hh"
32
33 //#include "IOEvent.mpp"
34 ///////////////////////////////hh.p////////////////////////////////////////
35
36 namespace senf {
37 namespace ppi {
38
39     /** \brief IOEvent event information
40
41         Information passed to the IOEvent event handler
42      */
43     struct IOEventInfo
44     {
45         unsigned events;                ///< Type of event signaled
46                                         /**< The value is a combination of the flags from
47                                              IOEvent::EventFlags */
48     };
49
50     /** \brief FileHandle based I/O read/write event
51
52         An IOEvent is signaled, whenever the FileHandle \a handle becomes readable or writable. The
53         type of event is specified using the \a events mask with values from EventFlags.
54
55         \see IOEventInfo
56
57         \ingroup event_group
58       */
59     class IOEvent
60         : public EventImplementation<IOEventInfo>
61     {
62     public:
63         ///////////////////////////////////////////////////////////////////////////
64         // Types
65
66         // This is stupid, however there is no way to import the Scheduler::EventId enum together
67         // with the enumeration symbols
68
69         enum EventFlags { Read  = Scheduler::EV_READ, 
70                           Prio = Scheduler::EV_PRIO,
71                           Write = Scheduler::EV_WRITE,
72                           Hup = Scheduler::EV_HUP,
73                           Err = Scheduler::EV_ERR };
74
75         ///////////////////////////////////////////////////////////////////////////
76         ///\name Structors and default members
77         ///@{
78
79         template <class Handle>
80         IOEvent(Handle handle, unsigned events);
81
82         ///@}
83         ///////////////////////////////////////////////////////////////////////////
84
85         /** \brief Unhandled error condition */
86         struct ErrorException : public std::exception
87         { virtual char const * what() const throw() 
88                 { return "senf::ppi::IOEvent::ErrorException"; } };
89
90         /** \brief Unhandled hangup condition */
91         struct HangupException : public std::exception
92         { virtual char const * what() const throw() 
93                 { return "senf::ppi::IOEvent::HangupException"; } };
94
95     protected:
96
97     private:
98         virtual void v_enable();
99          virtual void v_disable();
100         
101         void cb(int, Scheduler::EventId event);
102
103         int fd_;
104         unsigned events_;
105     };
106
107     
108 }}
109
110 ///////////////////////////////hh.e////////////////////////////////////////
111 //#include "IOEvent.cci"
112 //#include "IOEvent.ct"
113 #include "IOEvent.cti"
114 #endif
115
116 \f
117 // Local Variables:
118 // mode: c++
119 // fill-column: 100
120 // comment-column: 40
121 // c-file-style: "senf"
122 // indent-tabs-mode: nil
123 // ispell-local-dictionary: "american"
124 // compile-command: "scons -u test"
125 // End: