-// $Id$
+// $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
+
+//#include "SocketHandle.mpp"
+#include "SocketHandle.ih"
// Custom includes
#include <memory> // std::auto_ptr
#include "FileHandle.hh"
#include "SocketPolicy.hh"
-//#include "SocketHandle.mpp"
-#include "SocketHandle.ih"
///////////////////////////////hh.p////////////////////////////////////////
-#include "SocketHandle.ih"
namespace senf {
/** \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 >
{};
///////////////////////////////////////////////////////////////////////////
///\name Structors and default members
///@{
+ // default default constructor
// default copy constructor
// default copy assignment
// default destructor
+ // here to implement
+ SocketHandle();
+
// conversion constructors
template <class OtherPolicy>
void state(SocketStateMap & map, unsigned lod=0);
///< Inquire state information of socket handle
/**< The map argument (a string to string mapping) will be
- filled with information coverning the current state of
+ filled with information covering the current state of
the socket. The information provided depends on the
socket protocol. The amount of information returned can
be controlled using the \p lod value.
\param map string to string mapping to be filled with
state information
- \param lod level of detail requesten. The interpretation
- of this value is protocol specific
+ \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. This is very important since
/**< Formats the complete state map value and returns it as
a single multi-line string.
+ \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 & 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
\param isChecked has to be \c true
\todo Answer, why the heck I need the \c isChecked
- parameter ??
- */
+ parameter ?? */
SocketBody & body(); ///< Access socket body
/**< This member replaces the corresponding FileHandle
/**< This member replaces the corresponding FileHandle
member and returns an appropriately cast body
reference */
- SocketProtocol const & protocol() const;
+ SocketProtocol & protocol() const;
///< Access protocol class
void assign(FileHandle other); /**< \internal */
\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
/** \brief dynamically check cast validity
- This function will check, wether the given cast is valid. This is the same as checking, that
+ This function will check, whether the given cast is valid. This is the same as checking, that
dynamic_socket_cast does not throw.
This member is needed, since there is no 'null' SocketHandle (comparable to a null pointer)
// c-file-style: "senf"
// indent-tabs-mode: nil
// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
// End: