Packets: Fix VariantParser invalid parser access bug
[senf.git] / Socket / SocketHandle.hh
index 6cb2c4b..9f41494 100644 (file)
@@ -1,9 +1,9 @@
-// $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
@@ -24,8 +24,8 @@
     \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
@@ -44,26 +44,28 @@ 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
     {
@@ -71,7 +73,7 @@ namespace senf {
         ///////////////////////////////////////////////////////////////////////////
         // Types
 
-        typedef SocketPolicy Policy;
+        typedef SPolicy Policy;
 
         /** \brief Check policy compatibility
 
@@ -81,18 +83,21 @@ namespace senf {
          */
         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>
@@ -112,7 +117,7 @@ namespace senf {
         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.
@@ -122,8 +127,8 @@ namespace senf {
 
                                              \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
@@ -135,12 +140,25 @@ namespace senf {
                                         /**< 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 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
@@ -162,8 +180,7 @@ namespace senf {
                                              \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
@@ -194,8 +211,8 @@ namespace senf {
 
         \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
 
@@ -231,7 +248,7 @@ namespace senf {
 
     /** \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)
@@ -258,4 +275,6 @@ namespace senf {
 // c-file-style: "senf"
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
 // End: