6b2dfe28979d50c6ae9386b2bae7fa5197f7dc92
[senf.git] / Socket / Protocols / BSDSocketAddress.hh
1 // $Id$
2 //
3 // Copyright (C) 2008 
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.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 BSDSocketAddress public header */
25
26 #ifndef HH_BSDSocketAddress_
27 #define HH_BSDSocketAddress_ 1
28
29 // Custom includes
30 #include "../../Utils/safe_bool.hh"
31 #include <sys/socket.h>
32 #include <iostream>
33
34 //#include "BSDSocketAddress.mpp"
35 ///////////////////////////////hh.p////////////////////////////////////////
36
37 namespace senf {
38
39     /** \brief
40       */
41     class BSDSocketAddress
42         : public senf::comparable_safe_bool<BSDSocketAddress>
43     {
44     public:
45         
46         bool operator==(BSDSocketAddress const & other) const;
47         bool operator!=(BSDSocketAddress const & other) const;
48
49         bool boolean_test() const;
50         short family() const;
51
52         ///////////////////////////////////////////////////////////////////////////
53         ///\name Generic \c sockaddr interface
54         ///\{
55
56         struct sockaddr const * sockaddr_p() const;
57         socklen_t socklen() const;
58         socklen_t const * socklen_p() const;
59
60         ///\}
61
62     protected:
63         BSDSocketAddress(socklen_t len, short family);
64         BSDSocketAddress(BSDSocketAddress const & other);
65         BSDSocketAddress & operator=(BSDSocketAddress const & other);
66
67         struct sockaddr * sockaddr_p();
68         socklen_t * socklen_p();
69
70         void socklen(socklen_t len);
71
72     private:
73
74         socklen_t len_;
75     };
76
77     template <class Target>
78     Target & sockaddr_cast(BSDSocketAddress & source);
79
80     template <class Target>
81     Target const & sockaddr_cast(BSDSocketAddress const & source);
82
83     std::ostream & operator<<(std::ostream & os, BSDSocketAddress const & addr);
84
85     /** \brief
86       */
87     class GenericBSDSocketAddress
88         : public BSDSocketAddress
89     {
90     public:
91         ///////////////////////////////////////////////////////////////////////////
92         ///\name Structors and default members
93         ///@{
94
95         GenericBSDSocketAddress();
96         GenericBSDSocketAddress(BSDSocketAddress const & other);
97         GenericBSDSocketAddress& operator=(const BSDSocketAddress & other);
98
99         GenericBSDSocketAddress(const GenericBSDSocketAddress& other);
100         GenericBSDSocketAddress& operator=(const GenericBSDSocketAddress& other);
101         
102         ///@}
103         ///////////////////////////////////////////////////////////////////////////
104         ///\name Generic \c sockaddr interface
105         ///\{
106
107         struct sockaddr const * sockaddr_p() const;
108         struct sockaddr * sockaddr_p();
109
110         using BSDSocketAddress::socklen_p;
111
112         ///\}
113
114     protected:
115
116     private:
117         struct sockaddr_storage addr_;
118     };
119
120 }
121
122 ///////////////////////////////hh.e////////////////////////////////////////
123 #include "BSDSocketAddress.cci"
124 //#include "BSDSocketAddress.ct"
125 //#include "BSDSocketAddress.cti"
126 #endif
127
128 \f
129 // Local Variables:
130 // mode: c++
131 // fill-column: 100
132 // comment-column: 40
133 // c-file-style: "senf"
134 // indent-tabs-mode: nil
135 // ispell-local-dictionary: "american"
136 // compile-command: "scons -u test"
137 // End: