Socket: image-map for Protocols.png added
[senf.git] / Socket / SocketProtocol.hh
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief SocketProtocol and ConcreteSocketProtocol public header
25
26     \idea We should optimize the protocol handling. Allocating a protocol instance for every socket
27         body seems quite wasteful. We could derive SocketPolicy from SocketBody (probably privately,
28         since private inheritance models more of 'has a' than 'is a'). This would allow to reduce
29         the number of heap-allocations per socket to one which is good.
30  */
31
32 // The private inheritance idea should indeed work very well: We just need to change the
33 // implementations of body() and protocol() and that of the ProtocolClient/ServerSocketHandle
34 // constructors and the SocketBody constructor. The body and the protocol would still be visible
35 // like several instances because of the private inheritance but we would save the backwards
36 // pointer.
37
38 /** \defgroup protocol_group The Protocol Classes
39
40     \htmlonly
41     <map name="protocols">
42       <area shape="rect" alt="SocketPolicy" href="structsenf_1_1SocketPolicy.html" title="SocketPolicy" coords="416,50,536,68" />
43       <area shape="rect" alt="ConcreteSocketProtocol" href="classsenf_1_1ConcreteSocketProtocol.html" title="ConcreteSocketProtocol" coords="268,65,456,88" />
44       <area shape="rect" alt="SocketProtocol" href="classsenf_1_1SocketProtocol.html" title="SocketProtocol" coords="1,2,120,26" />
45       <area shape="rect" alt="BSDSocketProtocol" href="classsenf_1_1BSDSocketProtocol.html" title="BSDSocketProtocol" coords="124,118,276,143" />
46       <area shape="rect" alt="AddressableBSDSocketProtocol" href="classsenf_1_1AddressableBSDSocketProtocol.html" title="AddressableBSDSocketProtocol" coords="82,200,314,224" />
47       <area shape="rect" alt="IPv4Protocol" href="classsenf_1_1IPv4Protocol.html" title="IPv4Protocol" coords="149,272,252,296" />
48       <area shape="rect" alt="IPv6Protocol" href="classsenf_1_1IPv6Protocol.html" title="IPv6Protocol" coords="149,335,251,359" />
49       <area shape="rect" alt="TCPProtocol" href="classsenf_1_1TCPProtocol.html" title="TCPProtocol" coords="151,398,248,420" />
50       <area shape="rect" alt="TCPv4SocketProtocol" href="classsenf_1_1TCPv4SocketProtocol.html" title="TCPv4SocketProtocol" coords="288,471,405,494" />
51       <area shape="rect" alt="TCPv6SocketProtocol" href="classsenf_1_1TCPv6SocketProtocol.html" title="TCPv6SocketProtocol" coords="424,470,540,494" />
52       <area shape="rect" alt="PacketProtocol" href="classsenf_1_1PacketProtocol.html" title="PacketProtocol" coords="560,469,680,495" />
53     </map>
54     <img src="Protocols.png" border="0" alt="Protocols" usemap="#protocols">
55     \endhtmlonly
56
57     The socket handle classes and templates only implement the most important socket API methods
58     using the policy framework. To access the complete API, the protocol interface is
59     provided. Access to the protocol interface is only possible via senf::ProtocolClientSocketHandle
60     and senf::ProtocolServerSocketHandle which have the necessary \c protocol() member. This member
61     returns a reference to the protocol class instance which contains members covering all the API
62     functions (mostly setsockopt/getsockopt related calls but there may be more, this is completely
63     up to the implementor of the protocol class) not found in the SocketHandle interface. The
64     protocol interface is specific to the protocol. It's implementation is quite free. The standard
65     protocols are implemented using a simple multiple-inheritance hierarchy as shown above.
66
67     Since the protocol class is protocol specific (how intelligent ...), the protocol class also
68     defines the complete socket policy to be used with it's protocol. Complete meaning, that every
69     policy axis must be assigned it's the most specific (that is derived) policy class to be used
70     with the protocol.
71
72     \see
73         \ref handle_group \n
74         \ref policy_group
75
76     \todo Complete the protocol interface implementations. Better distribution of members to
77         protocol facets and more precise distribution of functionality among the facets.
78  */
79
80 /** \defgroup concrete_protocol_group Protocol Implementations (Concrete Protocol Classes)
81     \ingroup protocol_group
82
83     Theese protocol classes define concrete and complete protocol implementations. They inherit from
84     ConcreteSocketProtocol and are used with the ProtocolClientSocketHandle and
85     ProtocolServerSocketHandle templates to instantiate socket handles. Appropriate typedefs are
86     always provided.
87
88     Every protocol defines both the protocol and the policy interface provided by that protocol. See
89     the documentation of the protocol classes listed below for more information on the supported
90     protocols. Every protocol class documents it's policy interface. Use the 'list all members' link
91     of the protocol class to find the complete policy interface.
92  */
93
94 /** \defgroup protocol_facets_group Protocol Facets
95     \ingroup protocol_group
96
97     The protocol facets are classes used as building blocks to build concrete protocol classes. Each
98     protocol facet will implement some functional part of the protocol interface. The protocol
99     facets all inherit from SocketProtocol by public \e virtual inheritance. This ensures the
100     accessibility of the socket body from all facets.
101  */
102
103 #ifndef HH_SocketProtocol_
104 #define HH_SocketProtocol_ 1
105
106 // Custom includes
107 #include <boost/utility.hpp>
108 // Hrmpf ... I have tried very hard, but I just can't find a nice, generic way to clean
109 // up this include
110 #include "SocketHandle.ih"
111
112 //#include "SocketProtocol.mpp"
113 ///////////////////////////////hh.p////////////////////////////////////////
114
115 namespace senf {
116
117     /// \addtogroup protocol_group
118     /// @{
119
120     class SocketPolicyBase;
121
122     /** \brief Socket Protocol base class
123
124         This is the base class of all socket protocol classes. Every protocol class must directly or
125         indirectly inherit from SocketProtocol
126
127         \attention SocketProtocol must \e always be inherited using public \e virtual inheritance.
128      */
129     class SocketProtocol : boost::noncopyable
130     {
131     public:
132         ///////////////////////////////////////////////////////////////////////////
133         // Types
134
135         ///////////////////////////////////////////////////////////////////////////
136         ///\name Structors and default members
137         ///@{
138
139         SocketProtocol();
140         virtual ~SocketProtocol() = 0;
141
142         // default default constructor
143         // no copy
144         // no conversion constructors
145
146         ///@}
147         ///////////////////////////////////////////////////////////////////////////
148
149         SocketBody & body() const;      ///< Access the socket body
150                                         /**< \todo we don't need body(), we should better provide a
151                                              handle() member which will return a simple FIleHandle
152                                              object (we cannot return some other derived class since
153                                              we don't know the Protocol or Policy at this point) */
154         virtual SocketPolicyBase const & policy() const = 0;
155                                         ///< Access the policy instance
156
157         ///////////////////////////////////////////////////////////////////////////
158         // Virtual interface
159
160         virtual std::auto_ptr<SocketProtocol> clone() const = 0;
161                                         ///< Polymorphically return a copy of this protocol class
162                                         /**< This member will create a new copy of the protocol
163                                              class on the heap.
164                                              \attention This member must be implemented in every \e
165                                                  leaf protocol class to return a new instance of the
166                                                  appropriate type. */
167         virtual unsigned available() const = 0;
168                                         ///< Return number of bytes available for reading without
169                                         ///< blocking
170                                         /**< This member will check in a (very, sigh) protocol
171                                              dependent way, how many bytes are guaranteed to be
172                                              readable from the socket without blocking even if the
173                                              socket is blocking. If the socket does not support
174                                              reading (viz. NotReadablePolicy is set), this member
175                                              should always return \c 0.*/
176
177         virtual bool eof() const = 0;   ///< Check for end-of-file condition
178                                         /**< This is another check which (like available()) is
179                                              extremely protocol dependent. This member will return
180                                              \c true only, if at end-of-file. If the protocol does
181                                              not support the notion of EOF, this member should
182                                              always return \c false. */
183         virtual void state(SocketStateMap & map, unsigned lod) const;
184                                         ///< Return socket state information
185                                         /**< This member is called to add state information to the
186                                              status \a map. The protocol map should provide as
187                                              detailed information as possible. The amount of
188                                              information to be added to the map is selected by the
189                                              \a lod value with a default value of 0. The
190                                              interpretation of the \a lod value is completely
191                                              implementation defined.
192
193                                              Every class derived from SocketProtocol should
194                                              reimplement state(). The reimplemented method should
195                                              call (all) baseclass-implementations of this
196                                              member.
197
198                                              The \a map Argument is a map which associates
199                                              std:string keys with std:string-like values. The map
200                                              keys are interpreted as hierarchical strings with '.'
201                                              as a separator (like hostnames or struct or class
202                                              members). They are automatically sorted correctly.
203
204                                              The values are std:string with one additional feature:
205                                              they allow assignment or conversion from *any* type as
206                                              long as that type is streamable. This simplifies
207                                              assigning non-string values to the map:
208
209                                              \code
210                                                map["socket.protocol.ip.address"] = peer();
211                                                map["socket.protocol.tcp.backlog"] = backlog();
212                                              \endcode
213
214                                              This will work even if peer() returns an ip-address
215                                              object or backlog() returns an integer. The values are
216                                              automatically converted to their string representation.
217
218                                              The operator "+=" also has been reimplemented to
219                                              simplify adding multiple values to a single entry: It
220                                              will automatically add a ", " separator if the string
221                                              is non-empty. */
222
223     protected:
224
225     private:
226         // backpointer to owning SocketBody instance
227         SocketBody * body_;
228         friend class SocketBody;
229    };
230
231
232     /** \brief Concrete Socket Protocol implementation base class
233
234         ConcreteSocketProtocol is the base class of a concrete socket protocol implementation. The
235         final protocol class must inherit from ConcreteSocketProtocol. The template argument \a
236         SocketPolicy must be set to the complete socket policy of the protocol.
237
238         A protocol implementation may define the protocol interface directly. It can also
239         (additionally) make use of multiple inheritance to combine a set of protocol facets into a
240         specific protocol implementation (i.e. TCPv4SocketProtocol inherits from
241         ConcreteSocketProtocol and from the protocol facets IPv4Protocol, TCPProtocol,
242         BSDSocketProtocol and AddressableBSDSocketProtocol). The protocol facets are not concrete
243         protocols themselves, they are combined to build concrete protocols. This structure will
244         remove a lot of code duplication. It is important to ensure, that the protocol facets do not
245         overlap, since otherwise there will be problems resolving overlapping members.
246         
247         \doc init_client init_server
248      */
249     template <class SocketPolicy>
250     class ConcreteSocketProtocol
251         : public virtual SocketProtocol
252     {
253     public:
254         ///////////////////////////////////////////////////////////////////////////
255         // Types
256
257         typedef SocketPolicy Policy;    ///< The protocols policy
258
259         ///////////////////////////////////////////////////////////////////////////
260         ///\name Structors and default members
261         ///@{
262
263         ~ConcreteSocketProtocol() = 0;
264
265         // no default constructor
266         // no copy
267         // no conversion constructors
268
269         ///@}
270         ///////////////////////////////////////////////////////////////////////////
271
272         Policy const & policy() const;
273
274     protected:
275
276     private:
277         Policy policy_;
278
279     };
280
281     /// @}
282 }
283
284 ///////////////////////////////hh.e////////////////////////////////////////
285 #include "SocketProtocol.cci"
286 //#include "SocketProtocol.ct"
287 #include "SocketProtocol.cti"
288 #endif
289
290 \f
291 // Local Variables:
292 // mode: c++
293 // fill-column: 100
294 // c-file-style: "senf"
295 // indent-tabs-mode: nil
296 // ispell-local-dictionary: "american"
297 // compile-command: "scons -u test"
298 // comment-column: 40
299 // End: