X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FGenericAddressingPolicy.hh;h=cc5c527110750cd6aa776d922d0f264dc117c5a3;hb=9ca82f3198ce01fa2daf50aa8f46e0eb630d275c;hp=fa7f5d193e5f3bab12d7a796fd93c9a8e5737492;hpb=ac6a813d9d99f7add4e13aff7a4bcd314d5604a6;p=senf.git
diff --git a/Socket/GenericAddressingPolicy.hh b/Socket/GenericAddressingPolicy.hh
index fa7f5d1..cc5c527 100644
--- a/Socket/GenericAddressingPolicy.hh
+++ b/Socket/GenericAddressingPolicy.hh
@@ -20,6 +20,10 @@
// Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+/** \file
+ \brief GenericAddressingPolicy public header
+ */
+
#ifndef HH_GenericAddressingPolicy_
#define HH_GenericAddressingPolicy_ 1
@@ -34,7 +38,13 @@
namespace senf {
+ /// \addtogroup policy_impl_group
+ /// @{
+
+ /** \brief Non-template implemenatation class of GenericAddressingPolicy template
+ \internal
+ */
struct GenericAddressingPolicy_Base
{
static void do_local(FileHandle handle, struct sockaddr * addr, unsigned len);
@@ -43,6 +53,30 @@ namespace senf {
static void do_connect(FileHandle handle, struct sockaddr const * addr, unsigned len);
};
+ /** \brief Template for generic AddressingPolicy implementation based on the BSD socket API
+
+ This template provides an implementation template to implement generic addressing policy
+ classes which rely on the standard BSD socket API for their implementation
+ (connect/bind/getsockname/getpeername).
+
+ The \a Address template parameter specifies the address type of the addressing policy. This
+ type must have two members: \c sockaddr_p() and \c sockaddr_len(). The first must return a
+ struct sockaddr * to the address, the second must return the size of the address in
+ bytes. The pointer returned by \c sockaddr_p() must be non-const if called on a non-const
+ address. The underlying socket address stored at that pointer might be
+ modified.
+
+ This template class is inherited into addressing policy classes via private
+ inheritance. Then the members supported by the respective addressing policy are made
+ available via \c using declarations (See INet4AddressingPolicy for an Example).
+
+ \idea We could explicitly provide open_sockaddr_p() and close_sockaddr_p()
+ members. sockaddr_p could always return a const * whereas open_sockaddr_p should return a
+ non-const pointer. The close operation would then explicitly signal, that the new value
+ should be incorporated into the class. With our current implementation, the close member
+ would be a no-op, however this ould free us from using the sockaddr values as a direct
+ sotrage representation of the address.
+ */
template
struct GenericAddressingPolicy
: private GenericAddressingPolicy_Base
@@ -50,14 +84,35 @@ namespace senf {
template
static void peer(SocketHandle handle, Address & addr,
typename IfCommunicationPolicyIs::type * = 0);
+ ///< Return address of remote peer on connected sockets
+ /**< This member is only available if the socket handles
+ communication policy is ConnectedCommunicationPolicy.
+
+ \param[in] handle socket handle to get peer address of
+ \param[out] addr address of remote peer */
static void local(FileHandle handle, Address & addr);
+ ///< Return local of socket
+ /**< \param[in] handle socket handle to check
+ \param[out] addr local socket address */
template
static void connect(SocketHandle handle, Address const & addr,
typename IfCommunicationPolicyIs::type * = 0);
+ ///< Connect to remote host
+ /**< This member is only available if the socket handles
+ communication policy is ConnectedCommunicationPolicy.
+
+ \param[in] handle socket handle
+ \param[in] address address of remote peer to connect
+ to */
static void bind(FileHandle handle, Address const & addr);
+ ///< Set local socket address
+ /**< \param[in] handle socket handle
+ \param[in] addr local socket address */
};
+ /// @}
+
}
///////////////////////////////hh.e////////////////////////////////////////
@@ -71,4 +126,5 @@ namespace senf {
// Local Variables:
// mode: c++
// c-file-style: "senf"
+// fill-column: 100
// End: