/** \defgroup handle_group The Handle Hierarchy
- \htmlonly
- <map name="FhHierarchy">
- <area shape="rect" alt="FileHandle" href="classsenf_1_1FileHandle.html" title="FileHandle" coords="247,1,345,27" />
- <area shape="rect" alt="SocketHandle" href="classsenf_1_1SocketHandle.html" title="SocketHandle" coords="235,61,355,87" />
- <area shape="rect" alt="ClientSocketHandle" href="classsenf_1_1ClientSocketHandle.html" title="ClientSocketHandle" coords="32,140,198,167" />
- <area shape="rect" alt="ServerSocketHandle" href="classsenf_1_1ServerSocketHandle.html" title="ServerSocketHandle" coords="386,140,558,168" />
- <area shape="rect" alt="ProtocolServerSocketHandle" href="classsenf_1_1ProtocolServerSocketHandle.html" title="ProtocolServerSocketHandle" coords="354,202,590,228" />
- <area shape="rect" alt="ProtocolClientSocketHandle" href="classsenf_1_1ProtocolClientSocketHandle.html" title="ProtocolClientSocketHandle" coords="1,202,230,228" />
- </map>
- <center>
- <img src="FhHierarchy.png" border="0" alt="FhHierarchy" usemap="#FhHierarchy">
- </center>
- \endhtmlonly
+ <div class="diamap" name="FhHierarchy">
+ <span coords="233,47,438,89">\ref SocketHandle</span>
+ <span coords="32,126,281,168">\ref ClientSocketHandle</span>
+ <span coords="0,187,326,229">\ref ProtocolClientSocketHandle</span>
+ <span coords="350,187,684,229">\ref ProtocolServerSocketHandle</span>
+ <span coords="243,0,343,28">\ref FileHandle</span>
+ <span coords="382,126,638,168">\ref ServerSocketHandle</span>
+ </div>
+ \htmlonly <img src="FhHierarchy.png" border="0" alt="FhHierarchy" usemap="#FhHierarchy"> \endhtmlonly
The senf::FileHandle class is the base of a hierarchy of socket handle classes (realized as
templates). These classes provide an interface to the complete socket API. While going down the
the SocketHandle classes should not be changed.
*/
-#ifndef HH_FileHandle_
-#define HH_FileHandle_ 1
+#ifndef HH_SENF_Socket_FileHandle_
+#define HH_SENF_Socket_FileHandle_ 1
// Custom includes
#include <memory> // std::auto_ptr
#include "../Utils/safe_bool.hh"
+#include "../Scheduler/ClockService.hh"
//#include "FileHandle.mpp"
///////////////////////////////hh.p////////////////////////////////////////
bool readable() const; ///< Check, whether a read on the handle would not block
///< (ignoring blocking state)
- void waitReadable() const; ///< Wait, until read on the handle would not block (ignoring
+ bool waitReadable(senf::ClockService::clock_type timeout = -1) const;
+ ///< Wait, until read on the handle would not block (ignoring
///< blocking state)
+ /**< \param[in] timeout max time to wait, default is to wait
+ forever.
+ \returns \c true, if handle became readable or \c false on
+ timeout. */
bool writeable() const; ///< Check, whether a write on the handle would not block
///< (ignoring blocking state)
- void waitWriteable() const; ///< Wait, until a write on the handle would not block
+ bool waitWriteable(senf::ClockService::clock_type timeout = -1) const;
+ ///< Wait, until a write on the handle would not block
///< (ignoring blocking state)
+ /**< \param[in] timeout max time to wait, default is to wait
+ forever.
+ \returns \c true, if handle became writable or \c false on
+ timeout. */
+ bool oobReadable() const; ///< Check, whether a read of prioritized data on the handle
+ ///< would not block (ignoring blocking state)
+ bool waitOOBReadable(senf::ClockService::clock_type timeout = -1) const;
+ ///< Wait, until read of prioritized data on the handle does
+ ///< not block (ignoring blocking state)
+ /**< \param[in] timeout max time to wait, default is to wait
+ forever.
+ \returns \c true, if handle became readable for
+ out-of-band data or \c false on timeout. */
bool blocking() const; ///< Return current blocking state
void blocking(bool status); ///< Set blocking state
friend class FileBody;
};
- /** \brief Adapt FileHandle to senf::Scheduler
+ /** \brief Adapt FileHandle to senf::scheduler
\related senf::FileHandle
\internal