// $Id:SocketHandle.hh 218 2007-03-20 14:39:32Z tho $
//
// Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-// Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// 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
// it under the terms of the GNU General Public License as published by
\brief SocketHandle public header
*/
-#ifndef HH_SocketHandle_
-#define HH_SocketHandle_ 1
+#ifndef HH_SENF_Socket_SocketHandle_
+#define HH_SENF_Socket_SocketHandle_ 1
// Custom includes
#include <memory> // std::auto_ptr
/** \brief basic SocketHandle supporting protocol and policy abstraction
- The senf::SocketHandle class introduces the two abstraction layers of the socket
+ The %senf::SocketHandle class introduces the two abstraction layers of the socket
library. senf::SocketHandle does \e not provide socket functions it only provides the
infrastructure necessary to support both, the protocol and the policy interface.
- senf::SocketHandle takes the socket policy as a template argument. senf::SocketHandle also
+ %SocketHandle takes the socket policy as a template argument. %SocketHandle also
introduces the protocol class. However, the class has no public constructors (see the
derived classes senf::ProtocolClientSocketHandle and senf::ProtocolServerSocketHandle).
- The most important functionality provided by senf::SocketHandle is the conversion
+ The most important functionality provided by %SocketHandle is the conversion
constructor. This allows to implicitly convert between compatible socket handle types as
specified by the socket policy. The conversion constructor is defined in such a way, that
only valid conversions are possible (see the implementation source for a more complete
discussion).
+ \tparam SPolicy socket policy
+
\note This class is \e not meant to be used as a base-class outside the library
implementation; The protected interface is for internal use only.
\todo Create a SocketHandleBase class and move some non-Policy dependent code there
*/
- template <class SocketPolicy>
+ template <class SPolicy>
class SocketHandle
: public FileHandle
{
///////////////////////////////////////////////////////////////////////////
// Types
- typedef SocketPolicy Policy;
+ typedef SPolicy Policy;
/** \brief Check policy compatibility
*/
template <class OtherPolicy>
struct IsCompatible
- : public boost::enable_if< SocketPolicyIsBaseOf<SocketPolicy,OtherPolicy>,
- SocketHandle >
+ : public boost::enable_if< SocketPolicyIsBaseOf<Policy,OtherPolicy>, SocketHandle >
{};
///////////////////////////////////////////////////////////////////////////
\param map string to string mapping to be filled with
state information
- \param lod level of detail requested. The
+ \param lod level of %detail requested. The
interpretation of this value is protocol specific
\implementation This member will be re-implemented in
/**< Formats the complete state map value and returns it as
a single multi-line string.
- \param lod level of detail requested. The
+ \param lod level of %detail requested. The
interpretation of this value is protocol specific
\implementation This member will be re-implemented in
every derived class. See the state()
documentation. */
+ template <class Facet>
+ Facet const & facet(); ///< Access a protocol facet
+ /**< This member will try to access the given protocol facet
+ of the socket. If \a Facet is a valid facet of the
+ protocol, it is returned, otherwise \c std::bad_cast
+ will be thrown.
+ \throws std::bad_cast if \a Facet is not a protocol
+ facet of this socket
+ \returns the \a Facet protocol facet of this socket */
+
protected:
- explicit SocketHandle(std::auto_ptr<SocketProtocol> protocol, bool isServer);
+ explicit SocketHandle(std::auto_ptr<SocketBody> body);
///< Initialize SocketHandle providing the protocol
/**< \param protocol Protocol class of the protocol
implemented by this socket handle
\related senf::SocketHandle
*/
- template <class Policy>
- std::ostream & operator<<(std::ostream & os, SocketHandle<Policy> handle);
+ template <class SPolicy>
+ std::ostream & operator<<(std::ostream & os, SocketHandle<SPolicy> handle);
/** \brief static socket (down-)cast