// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
/** \file
\brief IOEvent public header */
-#ifndef HH_IOEvent_
-#define HH_IOEvent_ 1
+#ifndef HH_SENF_PPI_IOEvent_
+#define HH_SENF_PPI_IOEvent_ 1
// Custom includes
+#include "../Scheduler/Scheduler.hh"
#include "Events.hh"
-#include "Scheduler/Scheduler.hh"
+#include "../Utils/Exception.hh"
//#include "IOEvent.mpp"
///////////////////////////////hh.p////////////////////////////////////////
namespace senf {
namespace ppi {
+ /** \brief IOEvent event information
+
+ Information passed to the IOEvent event handler
+ */
struct IOEventInfo
{
- unsigned events;
+ unsigned events; ///< Type of event signaled
+ /**< The value is a combination of the flags from
+ IOEvent::EventFlags */
};
- /** \brief
+ /** \brief FileHandle based I/O read/write event
+
+ An IOEvent is signaled, whenever the FileHandle \a handle becomes readable or writable. The
+ type of event is specified using the \a events mask with values from EventFlags.
+
+ There are two types of flags:
+
+ \li <em>Event flags</em> (\ref Read, \ref Prio, \ref Write) specify the type of event. The
+ callback will be called whenever one of the specified events occurs on the filehandle
+ \li <em>Error flags</em> (\ref Hup, \ref Err) specify some type of error condition on the
+ filehandle. If you specify an error flag when registering the event, the error condition
+ will be passed to the callback, otherwise an ErrorException or HangupException will be
+ thrown.
+
+ \see IOEventInfo
- \fixme Implement error/EOF handling
+ \ingroup event_group
*/
class IOEvent
: public EventImplementation<IOEventInfo>
///////////////////////////////////////////////////////////////////////////
// Types
- enum EventFlags { Read = Scheduler::EV_READ,
- Write = Scheduler::EV_WRITE };
+ // This is stupid, however there is no way to import the Scheduler::EventId enum together
+ // with the enumeration symbols
+
+ enum EventFlags {
+ Read = scheduler::FdEvent::EV_READ /**< FileHandle is readable */
+ , Prio = scheduler::FdEvent::EV_PRIO /**< FileHandle priority data is readable */
+ , Write = scheduler::FdEvent::EV_WRITE /**< FileHandle is writable */
+ , Hup = scheduler::FdEvent::EV_HUP /**< Hangup condition on FileHandle */
+ , Err = scheduler::FdEvent::EV_ERR /**< Some other error condition on FileHandle */
+ };
///////////////////////////////////////////////////////////////////////////
///\name Structors and default members
///@}
///////////////////////////////////////////////////////////////////////////
+ /** \brief Unhandled error condition */
+ struct ErrorException : public senf::Exception
+ { ErrorException() : senf::Exception("senf::ppi::IOEvent::ErrorException"){} };
+
+ /** \brief Unhandled hangup condition */
+ struct HangupException : public senf::Exception
+ { HangupException() : senf::Exception("senf::ppi::IOEvent::HangupException"){} };
+
protected:
private:
virtual void v_enable();
virtual void v_disable();
- void cb(int, Scheduler::EventId event);
+ void cb(int event);
int fd_;
- unsigned events_;
+ scheduler::FdEvent event_;
};