doclib: Add helper script to build image map from dia files
[senf.git] / Socket / SocketPolicy.hh
index 5d48e6d..209c374 100644 (file)
@@ -1,9 +1,9 @@
 // $Id:SocketPolicy.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
 /** \file
     \brief Policy Framework public header
 
-    \todo We should probably remove BufferingPolicy from the interface, it does not make much sense
-        (how did I come to include it ??)
-
-    \todo Do we want to support separate read and write policies. This allows to treat pipes within
-        this framework however, is this worth the effort?
-
-    \idea Creating a new Socket will create 4 (!) new instances (The handle, the body, the policy
-        and the protocol) of which 3 (argh) (body, policy and protocol) live on the heap. This is
-        expensive. We should convert all the policy classes to singletons and assign the same
-        instance to all socket bodies with the same policy. This would reduce the number of heap
-        allocations per socket handle to two.
+    \idea Creating a new Socket will create 3 new instances (The handle, the body, the policy) of
+        which 2 (argh) (body, policy) live on the heap. This is expensive. We should convert all the
+        policy classes to singletons and assign the same instance to all socket bodies with the same
+        policy. This would reduce the number of heap allocations per socket handle to one (which is
+        already optimized using the pool_alloc_mixin)
  */
 
 /** \defgroup policy_group The Policy Framework
 
-    \image html SocketPolicy.png
-
+    <div class="diamap" name="SocketPolicy">
+    <span coords="39,229,182,257">\ref WritePolicyBase</span>
+    <span coords="17,76,210,105">\ref AddressingPolicyBase</span>
+    <span coords="29,114,194,143">\ref FramingPolicyBase</span>
+    <span coords="368,0,463,28">\ref PolicyBase</span>
+    <span coords="275,2,691,185">\ref SocketPolicy</span>
+    <span coords="0,152,227,181">\ref CommunicationPolicyBase</span>
+    <span coords="41,191,180,219">\ref ReadPolicyBase</span>
+    </div>
+    \htmlonly <img src="SocketPolicy.png" border="0" alt="SocketPolicy" usemap="#SocketPolicy"> \endhtmlonly
+        
     \section policy_group_introduction Introduction to the Policy Framework
 
     The policy framework conceptually implements a list of parallel inheritance hierarchies each
@@ -60,9 +63,6 @@
 
     <dt><em>writePolicy</em></dt><dd>configures the writability of the socket</dd>
 
-    <dt><em>bufferingPolicy</em></dt><dd>configures, if and how buffering is configured for a
-    socket</dd> </dl>
-
     The template senf::SocketPolicy combines these policy axis to form a concrete socket policy. In
     a concrete policy, each of these policy axis is assigned a value, the policy value. This value
     is identified by a class type, a policy class. E.g. possible values for <em>framingPolicy</em>
     separately but at the same time for each policy axis:
 
     \code
-    // This defines an incomplete policy where addressingPolicy, writePolicy and bufferingPolicy
+    // This defines an incomplete policy where addressingPolicy and writePolicy
     // are unspecified
     typedef senf::MakeSocketPolicy<
         senf::StreamFramingPolicy,
     //     StreamFramingPolicy,
     //     ConnectedCommunicationPolicy,
     //     ReadablePolicy,
-    //     WritablePolicy,
-    //     SocketBufferingPolicy>::policy
+    //     WritablePolicy>::policy
     senf::TCPv4ClientSocketHandle tcpHandle (...);
 
     MyReadableHandle myHandle (tcpHandle); // Conversion to more basic socket handle
     
     In the following discussion we will use the following conventions:
     \li \e Axis is one or \c AddressingPolicy, \c FramingPolicy, \c CommunicationPolicy, \c
-        ReadPolicy, \c WritePolicy or \c BufferingPolicy
+        ReadPolicy or \c WritePolicy
     \li \e socketPolicy is any socket policy (that is, an instantiation of the SocketPolicy
         template)
     \li \e trait is an any policy class (that is, any class derived from one of the axis base
     derives from SocketPolicyBase. This is simpler than checking the template directly).</dd>
 
     <dt>\c template \c SocketPolicy < \e addressingPolicy, \e framingPolicy, \e communicationPolicy,
-    \e readPolicy, \e writePolicy, \e bufferingPolicy ></dt> <dd>This is the central SocketPolicy
+    \e readPolicy, \e writePolicy ></dt> <dd>This is the central SocketPolicy
     template. It combines a complete set of policy classes, one for each axis.</dd>
 
     <dt>\c template \c MakeSocketPolicy < \e args ></dt> <dd>\c MakeSocketPolicy is a template
 
     \section policy_implement Implementing Policy Classes
 
-    To define a new policy class, derive from the corresponding base class for your policy
-    axes. The only policy axis which might possibly need to be extended are the addressing policy
-    (AddressingPolicyBase) and the buffering policy (BufferingPolicyBase). See the Documentation of
-    these classes for more information on which members can be implemented.
+    To define a new policy class, derive from the corresponding base class for your policy axes. The
+    only policy axis which might possibly need to be extended is the addressing policy
+    (AddressingPolicyBase). See the Documentation of these classes for more information on which
+    members can be implemented.
 
     All members you define must be static. For any of the policy classes, you must only define those
     members which are supported by your implementation. If you leave out a member you automatically
     \code
       struct ExampleAddressingPolicy
       {
-          template <class Policy>
-          void connect(senf::SocketHandle<Policy> handle, Address & addr,
+          template <class SPolicy>
+          void connect(senf::SocketHandle<SPolicy> handle, Address & addr,
                        typename senf::IfCommmunicationPolicyIs<
-                           Policy, senf::ConnectedCommunicationPolicy>::type * = 0);
+                           SPolicy, senf::ConnectedCommunicationPolicy>::type * = 0);
       };
     \endcode
 
 
 // Custom includes
 
-#include "GenericSockAddr.hh"
-
 //#include "SocketPolicy.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
 
@@ -271,8 +268,7 @@ namespace senf {
         (FramingPolicy)                         \
         (CommunicationPolicy)                   \
         (ReadPolicy)                            \
-        (WritePolicy)                           \
-        (BufferingPolicy)
+        (WritePolicy)
 
     // Wer define these classes explicitly (and not with some macro
     // magic) because
@@ -298,7 +294,7 @@ namespace senf {
     {
         virtual ~AddressingPolicyBase() {}
 
-        typedef GenericSockAddr Address;
+        class Address { Address(); };
     };
 
     /** \brief Policy defining the framing format
@@ -323,13 +319,12 @@ namespace senf {
         <table class="senf">
         <tr><td>method</td> <td><tt>void listen(FileHandle, unsigned backlog)</tt></td> <td>Switch socket into listening state</td></tr>
         <tr><td>method</td> <td><tt>int accept(FileHandle, Address &)</tt></td>         <td>Accept a new connection</td></tr>
+        <tr><td>method</td> <td><tt>int accept(FileHandle)</tt></td>                    <td>Accept a new connection</td></tr>
         </table>
 
         The \c listen member is straight forward. The \c accept() member must return a new file
         descriptor (which will be used to create a new SocketHandle of the correct
-        type). Additionally, accept() should only be defined, if the Addressing policy is not \c
-        NoAddressingPolicy (which together with ConnectedCommunicationPolicy would identify a
-        point-to-point link with fixed communication partners).
+        type). 
 
         \note This Policy only has two meaningful states: ConnectedCommunicationPolicy and
         UnconnectedCommunicationPolicy. It is probably not sensible to define a new
@@ -352,7 +347,7 @@ namespace senf {
         </table>
 
         The second member should only be enabled if the communication policy is
-        UnconnectedCommunication (otherwise it does not make sense since the communication partner
+        UnconnectedCommunicationPolicy (otherwise it does not make sense since the communication partner
         is fixed) (see AddressingPolicyBase on how to do this).
 
         \note This Policy only has two meaningful states: ReadablePolicy and NotReadablePolicy. It
@@ -375,7 +370,7 @@ namespace senf {
         </table>
 
         The second member should only be enabled if the communication policy is
-        UnconnectedCommunication (otherwise it does not make sense since the communication partner
+        UnconnectedCommunicationPolicy (otherwise it does not make sense since the communication partner
         is fixed) (see AddressingPolicyBase on how to do this).
 
         \note This Policy only has two meaningful states: WritablePolicy and NotWritablePolicy. It
@@ -388,18 +383,6 @@ namespace senf {
         virtual ~WritePolicyBase() {}
     };
 
-    /** \brief Policy defining the buffering interface
-
-        The BufferingPolicy defines the buffer handling of the socket. It may provide the following
-        members:
-
-        \see policy_group
-     */
-    struct BufferingPolicyBase
-    {
-        virtual ~BufferingPolicyBase() {}
-    };
-
     // The implementation file will for each Policy declared above
     // define the following (SomePolicy is one of the above):
     //
@@ -497,10 +480,15 @@ namespace senf {
     {
         /** \brief Check dynamic policy compatibility
 
-            This method will check the socket policy \a other against this policy. It will check,
-            whether \a other is a base policy (or the same) of this policy. This check is done
-            against the \e dynamic type of \a other using RTTI. It will throw \c std::bad_cast, if
-            the policy is not compatible.
+            This check will validate, that a socket with \a other as it's policy is convertible to a
+            socket with the current SocketPolicy as it's policy. This is true, if for each policy
+            axis, the policy class of that axis as defined in the \a other policy is convertible to
+            the policy class of that same axis in the current SocketPolicy instance (as is defined
+            by the template arguments). This again is true, if the \a other policy class is derived
+            from (or is the same as) the policy class taken from the current SocketPolicy instance.
+
+            In other words, this call checks, that the current SocketPolicy (as defined via the
+            template arguments) is more generic than the \a other socket policy.
 
             \param[in] other SocketPolicy to check
             \throws std::bad_cast if \a other is not a compatible policy
@@ -557,4 +545,6 @@ namespace senf {
 // c-file-style: "senf"
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
 // End: