Added further Policy Framework clarification
[senf.git] / Socket / ClientSocketHandle.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 ClientSocketHandle public header
25  */
26
27 #ifndef HH_ClientSocketHandle_
28 #define HH_ClientSocketHandle_ 1
29
30 // Custom includes
31 #include <boost/call_traits.hpp>
32 #include "SocketHandle.hh"
33
34 //#include "ClientSocketHandle.mpp"
35 ///////////////////////////////hh.p////////////////////////////////////////
36
37 namespace senf {
38
39     /// \addtogroup handle_group
40     /// @{
41
42     template <class Policy> class ServerSocketHandle;
43
44     /** \brief Generic SocketHandle with client interface
45
46         This class provides the client side policy interface of the socket
47         abstraction. ClientSocketHandle defines the complete policy interface. It does not implement
48         any functionality itself however. All calls are forward to the following policy classes:
49
50         <table class="senf">
51         <tr><th>ClientSocketHandle member</th> <th>Policy member</th></tr>
52         <tr><td>read()</td>       <td>ReadPolicy::read (\ref senf::ReadPolicyBase)</td></tr>
53         <tr><td>readfrom()</td>   <td>ReadPolicy::readfrom (\ref senf::ReadPolicyBase)</td></tr>
54         <tr><td>write()</td>      <td>WritePolicy::write (\ref senf::WritePolicyBase)</td></tr>
55         <tr><td>writeto()</td>    <td>WritePolicy::writeto (\ref senf::WritePolicyBase)</td></tr>
56         <tr><td>connect()</td>    <td>AddressingPolicy::connect (\ref senf::AddressingPolicyBase)</td></tr>
57         <tr><td>bind()</td>       <td>AddressingPolicy::bind (\ref senf::AddressingPolicyBase)</td></tr>
58         <tr><td>peer()</td>       <td>AddressingPolicy::peer (\ref senf::AddressingPolicyBase)</td></tr>
59         <tr><td>local()</td>      <td>AddressingPolicy::local (\ref senf::AddressingPolicyBase)</td></tr>
60         <tr><td>rcvbuf()</td>     <td>BufferingPolicy::sndbuf (\ref senf::BufferingPolicyBase)</td></tr>
61         <tr><td>sndbuf()</td>     <td>BufferingPolicy::rcvbuf (\ref senf::BufferingPolicyBase)</td></tr>
62         </table>
63
64         It is important to note, that not all members are always accessible. Which are depends on
65         the \c Policy template argument. If any of the policy axis is left unspecified the
66         corresponding members will not be callable (you will get a compile time error). Even if
67         every policy axis is defined, some members might (and will) not exist if they are
68         meaningless for the protocol of the socket. This depends on the exact policy.
69
70         To find out, which members are available, you have to check the documentation of the policy
71         classes. You can also find a summary of all members available in the leaf protocol class
72         documentation.
73
74         \todo Move all not template-parameter dependent code into a non-template base class
75
76         \idea Give SocketHandle (and therefore ClientSocketHandle and ServerSocketHandle) a \c
77         protocol() template member and an additional template arg \c Policies. This arg should be a
78         typelist of Poclicy classes which can be accessed. You use protocol<ProtocolClass>() to
79         access a protocol class. \c Policies can of course be underspecified or even empty.
80
81         \idea add more flexible read/write members for a) boost::arrays and arrays of other types b)
82         std::vector (which uses contiguous memory ..) c) other random-access containers (we should
83         use some configurable trait class to identify containers with contiguous storage). Probably
84         we should just use a generic Boost.Range interface. Here we again come to the point: make
85         all except the most basic members be non-member algorithms ? this would make the
86         configuration of such extenden members more flexible.
87
88         \see \ref policy_group \n
89              \ref protocol_group
90       */
91     template <class Policy>
92     class ClientSocketHandle
93         : public SocketHandle<Policy>
94     {
95     public:
96         ///////////////////////////////////////////////////////////////////////////
97         // Types
98
99         /// Address type from the addressing policy
100         typedef typename Policy::AddressingPolicy::Address Address;
101         /// 'Best' type for passing address as parameter
102         /** Depending on the type of \c Address, this will be either <tt>Address</tt> or <tt>Address
103             const &</tt>. See <a
104             href="http://www.boost.org/libs/utility/call_traits.htm">call_traits documentation in
105             the Boost.Utility library\endlink.</a>
106          */
107         typedef typename boost::call_traits<Address>::param_type AddressParam;
108         /// Corresponding server socket handle with the same policy
109         /** This class will probably only be usable, if the \c CommunicationPolicy is \c
110             ConnectedCommunicationPolicy and the \c AddressingPolicy is not \c
111             NoAddressingPolicy. */
112         typedef ServerSocketHandle<Policy> ServerSocketHandle;
113
114         ///////////////////////////////////////////////////////////////////////////
115         ///\name Structors and default members
116         ///@{
117
118         // no default constructor
119         // default copy constructor
120         // default copy assignment
121         // default destructor
122
123         // conversion constructors
124         template <class OtherPolicy>
125         ClientSocketHandle(ClientSocketHandle<OtherPolicy> other,
126                            typename SocketHandle<Policy>::template IsCompatible<OtherPolicy>::type * = 0);
127
128         template <class OtherPolicy>
129         typename SocketHandle<Policy>::template IsCompatible<OtherPolicy>::type const &
130         operator=(ClientSocketHandle<OtherPolicy> other);
131
132         ///@}
133         ///////////////////////////////////////////////////////////////////////////
134
135         ///////////////////////////////////////////////////////////////////////////
136         ///\name Reading and Writing
137         ///@{
138
139         /** \brief Read data from socket
140
141             If the sockets \c FramingPolicy is \c DatagramFramingPolicy, every read() command will
142             return a single datagram. If the sockets FramingPolicy is StreamFraming, the operation will
143             return as much data as possible from the socket buffer. However it cannot be guaranteed,
144             that the socket buffer will be empty after read() returns.
145
146             \attention If the space available for the data read is limited, the read will return no
147             more than that amount of data. For a datagram socket, a full datagram is still dequed
148             from the socket buffer, the remainder of the datagram will be lost.
149
150             There are three variants of read which differ in how they return the read string.
151
152             \throws senf::SystemException
153
154
155             This variant will read up to \c limit bytes from the
156             socket and return them as a \c std::string object.
157
158             On a blocking socket, this member will \e always return some data (as long as the socket
159             has not been closed at the other end) and will block, if no data is available now. If
160             you do not want to block, you \e must make the socket non-blocking (using
161             FileHandle::blocking()).
162
163             \param[in] limit Maximum number of bytes to read or 0 if unlimited.
164             \returns data read
165
166             \implementation The read() family of members will use standard POSIX \c read calls, not
167             \c recv.
168         */
169         std::string  read         (unsigned limit=0);
170         void         read         (std::string & buffer, unsigned limit=0);
171                                         ///< Read data into string buffer
172                                         /**< On a blocking socket, this member will \e always return
173                                            some data (as long as the socket has not been closed at
174                                            the other end) and will block, if no data is available
175                                            now. If you do not want to block, you \e must make the
176                                            socket non-blocking (using FileHandle::blocking()).
177                                            \param[out] buffer data read
178                                            \param[in] limit Maximum number of buytes to read or 0
179                                            if unlimited
180                                            \see \ref read() */
181         unsigned     read         (char * buffer, unsigned size);
182                                         ///< Read data into memory area
183                                         /**< This variant will read data into the memory area at \c
184                                            buffer of size \c size. This is the most performant
185                                            version of read().
186                                            \param[in] buffer address of buffer to store data at
187                                            \param[in] size size of memory buffer
188                                            \returns Number of bytes read
189                                            \see \ref read() */
190
191         /** \brief Read data from unconnected socket returning address
192
193             This member behaves like read() but should only be available, if the sockets \c
194             CommunicationPolicy is \c UnconnectedCommunicationPolicy and the \c AddressingPolicy is
195             not \c NoAddressingPolicy. The readfrom() family will in addition to the data return the
196             address of the sender.
197
198             \throws senf::SystemException
199
200             This variant will return the data read and the address as a std::pair.
201
202             \returns \c std::pair of data read (a string) and the peers address
203
204             \fixme Add \c limit argument
205
206             \implementation The readfrom() family of members will use \c recvfrom from the BSD
207             socket API.
208          */
209         std::pair<std::string, Address>
210                      readfrom     ();
211         void         readfrom     (std::string & buffer, Address & from);
212                                         ///< Read data into string buffer
213                                         /**< This variant will return the result in the locations
214                                            passed in
215                                            \param[out] buffer data read
216                                            \param[out] from peer address
217                                            \see \ref readfrom() */
218         unsigned     readfrom     (char * buffer, unsigned size, Address & from);
219                                         ///< Read data into memory byffer
220                                         /**< This variant will read data into the memory area at \c
221                                            buffer of size \c size. This is the most performant
222                                            version of readfrom().
223                                            \param[in] buffer address of buffer to store data at
224                                            \param[in] size size of bnuffer
225                                            \param[out] from peer address
226                                            \returns Number of bytes read
227                                            \see \ref readfrom() */
228
229
230         /** \brief Write data to socket
231
232             The write() family of members will write out the data to the socket.  If the sockets \c
233             FramingPolicy is \c DatagramFramingPolicy, every write() call will result in one
234             datagram.
235
236             A single write call might depending on the circumstances write only part of the data.
237
238             There are two variants of thie member
239
240             \throws senf::SystemException
241
242
243             This variant will write out the string \c data.
244
245             \param[in] data Data to write
246             \returns number of bytes written
247             \implementation The write() family of members will use POSIX \c write calls, not \c
248                 send.
249          */
250         unsigned     write        (std::string const & data);
251         unsigned     write        (char const * buffer, unsigned size);
252                                         ///< Write data to socket from memory buffer
253                                         /**< \param[in] buffer address of buffer to write
254                                            \param[in] size amount of data to write
255                                            \returns Number of bytes written
256                                            \see \ref write() */
257
258         /** \brief Write data to unconnected socket
259
260             This member behaves like write() but should only be available, if the sockets \c
261             CommunicationPolicy is \c UnconnectedCommunicationPolicy and the \c AddressingPolicy is
262             not \c NoAddressingPolicy. The writeto() family of members takes the target address as
263             an additional argument.
264
265             There are two variants of this member.
266
267             \throw senf::SystemException
268
269
270             This variant will send the string \c data to the peer \c addr.
271
272             \param[in] addr Address of peer to send data to
273             \param[in] data data to send
274             \returns Number of bytes written
275          */
276         unsigned     writeto      (AddressParam addr, std::string const & data);
277         unsigned     writeto      (AddressParam addr, char const * buffer, unsigned size);
278                                         ///< Write data from memory buffer to unconnected socket
279                                         /**< \param[in] addr Address o fpeer to send data to
280                                            \param[in] buffer address of buffer to write
281                                            \param[in] size amount of data to write
282                                            \returns Number of bytes written
283                                            \see \ref writeto() */
284
285         ///////////////////////////////////////////////////////////////////////////
286         ///\name Addressing
287         ///@{
288
289         /** \brief Connect to remote peer
290
291             This member will establish a connection for addressable connection-oriented protocols
292             (that is, the CommunicationPolicy is ConnectedCommunicationPolicy and the
293             AddressingPolicy is not NoAddressingPolicy).
294
295             \param[in] addr Address to connect to
296
297             \throws senf::SystemException
298          */
299         void         connect      (AddressParam addr);
300
301         /** \brief Set local address
302
303             For addressable protocols (AddressingPolicy is not NoAddressingPolicy), bind() will set
304             the local address of the socket.
305
306             \param[in] addr Local socket address to asign
307
308             \throws senf::SystemException
309          */
310         void         bind         (AddressParam addr);
311
312         /** \brief Query remote address
313
314             This member will return the address of the communication partner in addressable
315             connection-oriented protocols (that is, the CommunicationPolicy is
316             ConnectedCommunicationPolicy and the AddressingPolicy is not NoAddressingPolicy).
317
318             There are two Variants of this member, one will return the address by value, the other
319             takes a reference argument to elide the copy operation.
320
321             \throws senf::SystemException
322          */
323         Address      peer         ();
324         void         peer         (Address & addr);
325                                         ///< Query remote address
326                                         /**< \see \ref peer() */
327
328         /** \brief Query local address
329
330             This member will return the address of the local socket in addressable protocols
331             (AddressingPolicy is not NoAddressingPolicy).
332
333             There are two Variants of this member, one will return the address by value, the other
334             takes a reference argument to elide the copy operation.
335
336             \throws senf::SystemException
337          */
338         Address      local        ();
339         void         local        (Address & addr);
340                                         ///< Query local address
341                                         /**< \see \ref local() */
342
343         ///@}
344
345         ///////////////////////////////////////////////////////////////////////////
346         ///\name Buffering
347         ///@{
348
349         unsigned     rcvbuf      ();    ///< Check size of receive buffer
350                                         /**< \returns size of receive buffer in bytes */
351         void         rcvbuf      (unsigned size);
352                                         ///< Set size of receive buffer
353                                         /**< \param[in] size size of receive buffer in bytes */
354
355         unsigned     sndbuf      ();    ///< Check size of send buffer
356                                         /**< \returns size of send buffer in bytes */
357         void         sndbuf      (unsigned size);
358                                         ///< Set size of send buffer
359                                         /**< \param[in] size size of send buffer in bytes */
360
361         ///@}
362
363         static ClientSocketHandle cast_static(FileHandle handle);
364         static ClientSocketHandle cast_dynamic(FileHandle handle);
365
366         // we need to override both since SocketHandle is *not* polymorphic
367         void state(SocketStateMap & map, unsigned lod=0);
368         std::string dumpState(unsigned lod=0);
369
370     protected:
371         ClientSocketHandle(FileHandle other, bool isChecked);
372         explicit ClientSocketHandle(std::auto_ptr<SocketProtocol> protocol,
373                                     int fd = -1);
374
375     private:
376         unsigned available();
377
378         friend class senf::ServerSocketHandle<Policy>;
379     };
380
381     /// @}
382 }
383
384 ///////////////////////////////hh.e////////////////////////////////////////
385 //#include "ClientSocketHandle.cci"
386 #include "ClientSocketHandle.ct"
387 #include "ClientSocketHandle.cti"
388 #endif
389
390 \f
391 // Local Variables:
392 // mode: c++
393 // fill-column: 100
394 // c-file-style: "senf"
395 // indent-tabs-mode: nil
396 // ispell-local-dictionary: "american"
397 // End: