Statistics
| Revision:

root / tmp / org.txm.statsengine.r.core.win32 / res / win32 / library / BH / include / boost / asio / detail / socket_option.hpp @ 2486

History | View | Annotate | Download (6.3 kB)

1 2486 sjacqu01
//
2 2486 sjacqu01
// detail/socket_option.hpp
3 2486 sjacqu01
// ~~~~~~~~~~~~~~~~~~~~~~~~
4 2486 sjacqu01
//
5 2486 sjacqu01
// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 2486 sjacqu01
//
7 2486 sjacqu01
// Distributed under the Boost Software License, Version 1.0. (See accompanying
8 2486 sjacqu01
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 2486 sjacqu01
//
10 2486 sjacqu01
11 2486 sjacqu01
#ifndef BOOST_ASIO_DETAIL_SOCKET_OPTION_HPP
12 2486 sjacqu01
#define BOOST_ASIO_DETAIL_SOCKET_OPTION_HPP
13 2486 sjacqu01
14 2486 sjacqu01
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 2486 sjacqu01
# pragma once
16 2486 sjacqu01
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17 2486 sjacqu01
18 2486 sjacqu01
#include <boost/asio/detail/config.hpp>
19 2486 sjacqu01
#include <cstddef>
20 2486 sjacqu01
#include <stdexcept>
21 2486 sjacqu01
#include <boost/asio/detail/socket_types.hpp>
22 2486 sjacqu01
#include <boost/asio/detail/throw_exception.hpp>
23 2486 sjacqu01
24 2486 sjacqu01
#include <boost/asio/detail/push_options.hpp>
25 2486 sjacqu01
26 2486 sjacqu01
namespace boost {
27 2486 sjacqu01
namespace asio {
28 2486 sjacqu01
namespace detail {
29 2486 sjacqu01
namespace socket_option {
30 2486 sjacqu01
31 2486 sjacqu01
// Helper template for implementing boolean-based options.
32 2486 sjacqu01
template <int Level, int Name>
33 2486 sjacqu01
class boolean
34 2486 sjacqu01
{
35 2486 sjacqu01
public:
36 2486 sjacqu01
  // Default constructor.
37 2486 sjacqu01
  boolean()
38 2486 sjacqu01
    : value_(0)
39 2486 sjacqu01
  {
40 2486 sjacqu01
  }
41 2486 sjacqu01
42 2486 sjacqu01
  // Construct with a specific option value.
43 2486 sjacqu01
  explicit boolean(bool v)
44 2486 sjacqu01
    : value_(v ? 1 : 0)
45 2486 sjacqu01
  {
46 2486 sjacqu01
  }
47 2486 sjacqu01
48 2486 sjacqu01
  // Set the current value of the boolean.
49 2486 sjacqu01
  boolean& operator=(bool v)
50 2486 sjacqu01
  {
51 2486 sjacqu01
    value_ = v ? 1 : 0;
52 2486 sjacqu01
    return *this;
53 2486 sjacqu01
  }
54 2486 sjacqu01
55 2486 sjacqu01
  // Get the current value of the boolean.
56 2486 sjacqu01
  bool value() const
57 2486 sjacqu01
  {
58 2486 sjacqu01
    return !!value_;
59 2486 sjacqu01
  }
60 2486 sjacqu01
61 2486 sjacqu01
  // Convert to bool.
62 2486 sjacqu01
  operator bool() const
63 2486 sjacqu01
  {
64 2486 sjacqu01
    return !!value_;
65 2486 sjacqu01
  }
66 2486 sjacqu01
67 2486 sjacqu01
  // Test for false.
68 2486 sjacqu01
  bool operator!() const
69 2486 sjacqu01
  {
70 2486 sjacqu01
    return !value_;
71 2486 sjacqu01
  }
72 2486 sjacqu01
73 2486 sjacqu01
  // Get the level of the socket option.
74 2486 sjacqu01
  template <typename Protocol>
75 2486 sjacqu01
  int level(const Protocol&) const
76 2486 sjacqu01
  {
77 2486 sjacqu01
    return Level;
78 2486 sjacqu01
  }
79 2486 sjacqu01
80 2486 sjacqu01
  // Get the name of the socket option.
81 2486 sjacqu01
  template <typename Protocol>
82 2486 sjacqu01
  int name(const Protocol&) const
83 2486 sjacqu01
  {
84 2486 sjacqu01
    return Name;
85 2486 sjacqu01
  }
86 2486 sjacqu01
87 2486 sjacqu01
  // Get the address of the boolean data.
88 2486 sjacqu01
  template <typename Protocol>
89 2486 sjacqu01
  int* data(const Protocol&)
90 2486 sjacqu01
  {
91 2486 sjacqu01
    return &value_;
92 2486 sjacqu01
  }
93 2486 sjacqu01
94 2486 sjacqu01
  // Get the address of the boolean data.
95 2486 sjacqu01
  template <typename Protocol>
96 2486 sjacqu01
  const int* data(const Protocol&) const
97 2486 sjacqu01
  {
98 2486 sjacqu01
    return &value_;
99 2486 sjacqu01
  }
100 2486 sjacqu01
101 2486 sjacqu01
  // Get the size of the boolean data.
102 2486 sjacqu01
  template <typename Protocol>
103 2486 sjacqu01
  std::size_t size(const Protocol&) const
104 2486 sjacqu01
  {
105 2486 sjacqu01
    return sizeof(value_);
106 2486 sjacqu01
  }
107 2486 sjacqu01
108 2486 sjacqu01
  // Set the size of the boolean data.
109 2486 sjacqu01
  template <typename Protocol>
110 2486 sjacqu01
  void resize(const Protocol&, std::size_t s)
111 2486 sjacqu01
  {
112 2486 sjacqu01
    // On some platforms (e.g. Windows Vista), the getsockopt function will
113 2486 sjacqu01
    // return the size of a boolean socket option as one byte, even though a
114 2486 sjacqu01
    // four byte integer was passed in.
115 2486 sjacqu01
    switch (s)
116 2486 sjacqu01
    {
117 2486 sjacqu01
    case sizeof(char):
118 2486 sjacqu01
      value_ = *reinterpret_cast<char*>(&value_) ? 1 : 0;
119 2486 sjacqu01
      break;
120 2486 sjacqu01
    case sizeof(value_):
121 2486 sjacqu01
      break;
122 2486 sjacqu01
    default:
123 2486 sjacqu01
      {
124 2486 sjacqu01
        std::length_error ex("boolean socket option resize");
125 2486 sjacqu01
        boost::asio::detail::throw_exception(ex);
126 2486 sjacqu01
      }
127 2486 sjacqu01
    }
128 2486 sjacqu01
  }
129 2486 sjacqu01
130 2486 sjacqu01
private:
131 2486 sjacqu01
  int value_;
132 2486 sjacqu01
};
133 2486 sjacqu01
134 2486 sjacqu01
// Helper template for implementing integer options.
135 2486 sjacqu01
template <int Level, int Name>
136 2486 sjacqu01
class integer
137 2486 sjacqu01
{
138 2486 sjacqu01
public:
139 2486 sjacqu01
  // Default constructor.
140 2486 sjacqu01
  integer()
141 2486 sjacqu01
    : value_(0)
142 2486 sjacqu01
  {
143 2486 sjacqu01
  }
144 2486 sjacqu01
145 2486 sjacqu01
  // Construct with a specific option value.
146 2486 sjacqu01
  explicit integer(int v)
147 2486 sjacqu01
    : value_(v)
148 2486 sjacqu01
  {
149 2486 sjacqu01
  }
150 2486 sjacqu01
151 2486 sjacqu01
  // Set the value of the int option.
152 2486 sjacqu01
  integer& operator=(int v)
153 2486 sjacqu01
  {
154 2486 sjacqu01
    value_ = v;
155 2486 sjacqu01
    return *this;
156 2486 sjacqu01
  }
157 2486 sjacqu01
158 2486 sjacqu01
  // Get the current value of the int option.
159 2486 sjacqu01
  int value() const
160 2486 sjacqu01
  {
161 2486 sjacqu01
    return value_;
162 2486 sjacqu01
  }
163 2486 sjacqu01
164 2486 sjacqu01
  // Get the level of the socket option.
165 2486 sjacqu01
  template <typename Protocol>
166 2486 sjacqu01
  int level(const Protocol&) const
167 2486 sjacqu01
  {
168 2486 sjacqu01
    return Level;
169 2486 sjacqu01
  }
170 2486 sjacqu01
171 2486 sjacqu01
  // Get the name of the socket option.
172 2486 sjacqu01
  template <typename Protocol>
173 2486 sjacqu01
  int name(const Protocol&) const
174 2486 sjacqu01
  {
175 2486 sjacqu01
    return Name;
176 2486 sjacqu01
  }
177 2486 sjacqu01
178 2486 sjacqu01
  // Get the address of the int data.
179 2486 sjacqu01
  template <typename Protocol>
180 2486 sjacqu01
  int* data(const Protocol&)
181 2486 sjacqu01
  {
182 2486 sjacqu01
    return &value_;
183 2486 sjacqu01
  }
184 2486 sjacqu01
185 2486 sjacqu01
  // Get the address of the int data.
186 2486 sjacqu01
  template <typename Protocol>
187 2486 sjacqu01
  const int* data(const Protocol&) const
188 2486 sjacqu01
  {
189 2486 sjacqu01
    return &value_;
190 2486 sjacqu01
  }
191 2486 sjacqu01
192 2486 sjacqu01
  // Get the size of the int data.
193 2486 sjacqu01
  template <typename Protocol>
194 2486 sjacqu01
  std::size_t size(const Protocol&) const
195 2486 sjacqu01
  {
196 2486 sjacqu01
    return sizeof(value_);
197 2486 sjacqu01
  }
198 2486 sjacqu01
199 2486 sjacqu01
  // Set the size of the int data.
200 2486 sjacqu01
  template <typename Protocol>
201 2486 sjacqu01
  void resize(const Protocol&, std::size_t s)
202 2486 sjacqu01
  {
203 2486 sjacqu01
    if (s != sizeof(value_))
204 2486 sjacqu01
    {
205 2486 sjacqu01
      std::length_error ex("integer socket option resize");
206 2486 sjacqu01
      boost::asio::detail::throw_exception(ex);
207 2486 sjacqu01
    }
208 2486 sjacqu01
  }
209 2486 sjacqu01
210 2486 sjacqu01
private:
211 2486 sjacqu01
  int value_;
212 2486 sjacqu01
};
213 2486 sjacqu01
214 2486 sjacqu01
// Helper template for implementing linger options.
215 2486 sjacqu01
template <int Level, int Name>
216 2486 sjacqu01
class linger
217 2486 sjacqu01
{
218 2486 sjacqu01
public:
219 2486 sjacqu01
  // Default constructor.
220 2486 sjacqu01
  linger()
221 2486 sjacqu01
  {
222 2486 sjacqu01
    value_.l_onoff = 0;
223 2486 sjacqu01
    value_.l_linger = 0;
224 2486 sjacqu01
  }
225 2486 sjacqu01
226 2486 sjacqu01
  // Construct with specific option values.
227 2486 sjacqu01
  linger(bool e, int t)
228 2486 sjacqu01
  {
229 2486 sjacqu01
    enabled(e);
230 2486 sjacqu01
    timeout BOOST_ASIO_PREVENT_MACRO_SUBSTITUTION(t);
231 2486 sjacqu01
  }
232 2486 sjacqu01
233 2486 sjacqu01
  // Set the value for whether linger is enabled.
234 2486 sjacqu01
  void enabled(bool value)
235 2486 sjacqu01
  {
236 2486 sjacqu01
    value_.l_onoff = value ? 1 : 0;
237 2486 sjacqu01
  }
238 2486 sjacqu01
239 2486 sjacqu01
  // Get the value for whether linger is enabled.
240 2486 sjacqu01
  bool enabled() const
241 2486 sjacqu01
  {
242 2486 sjacqu01
    return value_.l_onoff != 0;
243 2486 sjacqu01
  }
244 2486 sjacqu01
245 2486 sjacqu01
  // Set the value for the linger timeout.
246 2486 sjacqu01
  void timeout BOOST_ASIO_PREVENT_MACRO_SUBSTITUTION(int value)
247 2486 sjacqu01
  {
248 2486 sjacqu01
#if defined(WIN32)
249 2486 sjacqu01
    value_.l_linger = static_cast<u_short>(value);
250 2486 sjacqu01
#else
251 2486 sjacqu01
    value_.l_linger = value;
252 2486 sjacqu01
#endif
253 2486 sjacqu01
  }
254 2486 sjacqu01
255 2486 sjacqu01
  // Get the value for the linger timeout.
256 2486 sjacqu01
  int timeout BOOST_ASIO_PREVENT_MACRO_SUBSTITUTION() const
257 2486 sjacqu01
  {
258 2486 sjacqu01
    return static_cast<int>(value_.l_linger);
259 2486 sjacqu01
  }
260 2486 sjacqu01
261 2486 sjacqu01
  // Get the level of the socket option.
262 2486 sjacqu01
  template <typename Protocol>
263 2486 sjacqu01
  int level(const Protocol&) const
264 2486 sjacqu01
  {
265 2486 sjacqu01
    return Level;
266 2486 sjacqu01
  }
267 2486 sjacqu01
268 2486 sjacqu01
  // Get the name of the socket option.
269 2486 sjacqu01
  template <typename Protocol>
270 2486 sjacqu01
  int name(const Protocol&) const
271 2486 sjacqu01
  {
272 2486 sjacqu01
    return Name;
273 2486 sjacqu01
  }
274 2486 sjacqu01
275 2486 sjacqu01
  // Get the address of the linger data.
276 2486 sjacqu01
  template <typename Protocol>
277 2486 sjacqu01
  detail::linger_type* data(const Protocol&)
278 2486 sjacqu01
  {
279 2486 sjacqu01
    return &value_;
280 2486 sjacqu01
  }
281 2486 sjacqu01
282 2486 sjacqu01
  // Get the address of the linger data.
283 2486 sjacqu01
  template <typename Protocol>
284 2486 sjacqu01
  const detail::linger_type* data(const Protocol&) const
285 2486 sjacqu01
  {
286 2486 sjacqu01
    return &value_;
287 2486 sjacqu01
  }
288 2486 sjacqu01
289 2486 sjacqu01
  // Get the size of the linger data.
290 2486 sjacqu01
  template <typename Protocol>
291 2486 sjacqu01
  std::size_t size(const Protocol&) const
292 2486 sjacqu01
  {
293 2486 sjacqu01
    return sizeof(value_);
294 2486 sjacqu01
  }
295 2486 sjacqu01
296 2486 sjacqu01
  // Set the size of the int data.
297 2486 sjacqu01
  template <typename Protocol>
298 2486 sjacqu01
  void resize(const Protocol&, std::size_t s)
299 2486 sjacqu01
  {
300 2486 sjacqu01
    if (s != sizeof(value_))
301 2486 sjacqu01
    {
302 2486 sjacqu01
      std::length_error ex("linger socket option resize");
303 2486 sjacqu01
      boost::asio::detail::throw_exception(ex);
304 2486 sjacqu01
    }
305 2486 sjacqu01
  }
306 2486 sjacqu01
307 2486 sjacqu01
private:
308 2486 sjacqu01
  detail::linger_type value_;
309 2486 sjacqu01
};
310 2486 sjacqu01
311 2486 sjacqu01
} // namespace socket_option
312 2486 sjacqu01
} // namespace detail
313 2486 sjacqu01
} // namespace asio
314 2486 sjacqu01
} // namespace boost
315 2486 sjacqu01
316 2486 sjacqu01
#include <boost/asio/detail/pop_options.hpp>
317 2486 sjacqu01
318 2486 sjacqu01
#endif // BOOST_ASIO_DETAIL_SOCKET_OPTION_HPP