Skip to content

Commit 8dc51c1

Browse files
committed
Pulled changes from 0.9
2 parents 3312a7b + b3dc290 commit 8dc51c1

File tree

379 files changed

+31510
-3069
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

379 files changed

+31510
-3069
lines changed

.gitignore

+2-4
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ CMakeCache.txt
55
CMakeFiles
66
Makefile
77
Testing
8-
build
9-
_build
10-
bin
118
*.gch
12-
9+
libs/mime/test/mime-roundtrip
10+
*.a

CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
cmake_minimum_required(VERSION 2.6)
77
project(CPP-NETLIB)
88
find_package( Boost 1.41.0 )
9+
set(CMAKE_VERBOSE_MAKEFILE true)
910
if (Boost_FOUND)
1011
set(Boost_USE_STATIC_LIBS ON)
1112
set(Boost_USE_MULTI_THREADED ON)
1213
include_directories(${Boost_INCLUDE_DIRS})
1314
endif()
1415
enable_testing()
16+
add_subdirectory(libs/network/build)
1517
add_subdirectory(libs/network/test)
1618
add_subdirectory(libs/mime/test)
1719
add_subdirectory(libs/network/example)
20+

Jamroot

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import os ;
99
local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
1010

1111
use-project /boost : $(BOOST_ROOT) ;
12+
use-project /cpp-netlib : libs/network/build ;
1213

1314
using testing ;
1415

boost/network/constants.hpp

+41
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ namespace boost { namespace network {
2626
return dot_;
2727
}
2828

29+
static char dot_char() { return '.'; }
30+
2931
static char const * http_slash() {
3032
static char http_slash_[] = { 'H', 'T', 'T', 'P', '/', 0 };
3133
return http_slash_;
@@ -36,11 +38,15 @@ namespace boost { namespace network {
3638
return space_;
3739
}
3840

41+
static char space_char() { return ' '; }
42+
3943
static char const * slash() {
4044
static char slash_[] = {'/', 0};
4145
return slash_;
4246
}
4347

48+
static char slash_char() { return '/'; }
49+
4450
static char const * host() {
4551
static char host_[] = {'H', 'o', 's', 't', 0};
4652
return host_;
@@ -50,6 +56,8 @@ namespace boost { namespace network {
5056
static char colon_[] = {':', 0};
5157
return colon_;
5258
}
59+
60+
static char colon_char() { return ':'; }
5361

5462
static char const * accept() {
5563
static char accept_[] = {'A', 'c', 'c', 'e', 'p', 't', 0};
@@ -91,10 +99,43 @@ namespace boost { namespace network {
9199
return cpp_netlib_slash_;
92100
}
93101

102+
static char question_mark_char() {
103+
return '?';
104+
}
105+
106+
static char hash_char() {
107+
return '#';
108+
}
109+
110+
static char const * connection() {
111+
static char connection_[] = {
112+
'C','o','n','n','e','c','t','i','o','n',0
113+
};
114+
return connection_;
115+
}
116+
117+
static char const * close() {
118+
static char close_[] = {
119+
'C','l','o','s','e', 0
120+
};
121+
return close_;
122+
}
123+
124+
static char const * https() {
125+
static char https_[] = "https";
126+
return https_;
127+
}
128+
94129
};
95130

96131
template <class Tag>
97132
struct constants_wide {
133+
134+
static wchar_t const * https() {
135+
static wchar_t https_[] = L"https";
136+
return https_;
137+
}
138+
98139
};
99140
}
100141

boost/network/detail/debug.hpp

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef BOOST_NETWORK_DEBUG_HPP_20110410
2+
#define BOOST_NETWORK_DEBUG_HPP_20110410
3+
4+
// (c) Copyright 2011 Dean Michael Berris.
5+
// Distributed under the Boost Software License, Version 1.0.
6+
// (See accompanying file LICENSE_1_0.txt or copy at
7+
// http://www.boost.org/LICENSE_1_0.txt)
8+
9+
/** BOOST_NETWORK_MESSAGE is a debugging macro used by cpp-netlib to
10+
print out network-related errors through standard error. This is
11+
only useful when BOOST_NETWORK_DEBUG is turned on. Otherwise
12+
the macro amounts to a no-op.
13+
*/
14+
#ifdef BOOST_NETWORK_DEBUG
15+
# include <iostream>
16+
# ifndef BOOST_NETWORK_MESSAGE
17+
# define BOOST_NETWORK_MESSAGE(msg) std::cerr << "[DEBUG " << __FILE__ << ':' << __LINE__ << "]: " << msg << std::endl;
18+
# endif
19+
#else
20+
# ifndef BOOST_NETWORK_MESSAGE
21+
# define BOOST_NETWORK_MESSAGE(msg)
22+
# endif
23+
#endif
24+
25+
#endif /* end of include guard: BOOST_NETWORK_DEBUG_HPP_20110410 */

boost/network/detail/directive_base.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace boost { namespace network { namespace detail {
1818
//explicit directive_base(basic_message<tag> & message_)
1919
// : _message(message_)
2020
protected:
21-
virtual ~directive_base()
21+
~directive_base()
2222
{ }; // can only be extended
2323

2424
// mutable basic_message<tag> & _message;

boost/network/detail/wrapper_base.hpp

+6-9
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,30 @@
99

1010
namespace boost { namespace network {
1111

12-
template <class Tag>
13-
struct basic_message;
14-
1512
namespace detail {
1613

17-
template <class Tag>
14+
template <class Tag, class Message>
1815
struct wrapper_base {
19-
explicit wrapper_base(basic_message<Tag> & message_)
16+
explicit wrapper_base(Message & message_)
2017
: _message(message_)
2118
{};
2219

2320
protected:
2421
~wrapper_base() {}; // for extending only
2522

26-
basic_message<Tag> & _message;
23+
Message & _message;
2724
};
2825

29-
template <class Tag>
26+
template <class Tag, class Message>
3027
struct wrapper_base_const {
31-
explicit wrapper_base_const(basic_message<Tag> const & message_)
28+
explicit wrapper_base_const(Message const & message_)
3229
: _message(message_)
3330
{}
3431

3532
protected:
3633
~wrapper_base_const() {}; // for extending only
3734

38-
basic_message<Tag> const & _message;
35+
Message const & _message;
3936
};
4037

4138
} // namespace detail

boost/network/message.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ namespace boost { namespace network {
4444
typedef Tag tag;
4545

4646
typedef typename headers_container<Tag>::type headers_container_type;
47+
typedef typename headers_container_type::value_type header_type;
4748
typedef typename string<Tag>::type string_type;
4849

4950
basic_message()
@@ -125,7 +126,7 @@ namespace boost { namespace network {
125126
private:
126127

127128
friend struct detail::directive_base<Tag> ;
128-
friend struct detail::wrapper_base<Tag> ;
129+
friend struct detail::wrapper_base<Tag, basic_message<Tag> > ;
129130

130131
mutable headers_container_type _headers;
131132
mutable string_type _body;

boost/network/message/directives.hpp

-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77
#ifndef __NETWORK_MESSAGE_DIRECTIVES_HPP__
88
#define __NETWORK_MESSAGE_DIRECTIVES_HPP__
99

10-
/** Include all the various directive headers.
11-
*/
12-
1310
#include <boost/network/message/directives/detail/string_directive.hpp>
1411
#include <boost/network/message/directives/header.hpp>
1512
#include <boost/network/message/directives/remove_header.hpp>

boost/network/message/directives/detail/string_directive.hpp

+37-120
Original file line numberDiff line numberDiff line change
@@ -10,134 +10,51 @@
1010
#include <boost/variant/variant.hpp>
1111
#include <boost/variant/apply_visitor.hpp>
1212
#include <boost/variant/static_visitor.hpp>
13+
#include <boost/network/support/is_pod.hpp>
14+
#include <boost/utility/enable_if.hpp>
1315
#include <boost/mpl/if.hpp>
1416
#include <boost/mpl/or.hpp>
15-
#include <boost/network/message/directives/detail/string_value.hpp>
1617

17-
namespace boost { namespace network { namespace detail {
18-
19-
/** This directive template technically implements a decorator pattern
20-
* which takes a concrete implementation and uses that as a base. This
21-
* particular directive template requires the Base type to just include
22-
* a nested template named `string_visitor` that takes a single template
23-
* class parameter which is supposed to be a Message class/struct.
24-
*
25-
* A typical directive implementation of the visitor will take a reference
26-
* to a message as the constructor parameter and then performs operations
27-
* on that message.
28-
*
29-
* To create your own string directive, you can use the preprocessor macro
30-
* BOOST_NETWORK_STRING_DIRECTIVE which takes three parameters: the name of
31-
* the directive, a name for the variable to use in the directive visitor,
32-
* and the body to be implemented in the visitor. An example directive for
33-
* setting the source of a message would look something like this given the
34-
* BOOST_NETWORK_STRING_DIRECTIVE macro:
35-
*
36-
* BOOST_NETWORK_STRING_DIRECTIVE(source, source_,
37-
* message.source(source_)
38-
* , message.source=source_);
39-
*
40-
*/
41-
template <class Base>
42-
struct string_directive : public Base {
43-
boost::variant<
44-
string<tags::default_string>::type,
45-
string<tags::default_wstring>::type,
46-
boost::shared_future<string<tags::default_string>::type>,
47-
boost::shared_future<string<tags::default_wstring>::type>
48-
> string_;
49-
50-
explicit string_directive(string<tags::default_string>::type const & input)
51-
: string_(input) {}
52-
explicit string_directive(string<tags::default_wstring>::type const & input)
53-
: string_(input) {}
54-
explicit string_directive(boost::shared_future<string<tags::default_string>::type> const & input)
55-
: string_(input) {}
56-
explicit string_directive(boost::shared_future<string<tags::default_wstring>::type> const & input)
57-
: string_(input) {}
58-
59-
string_directive(string_directive const & other)
60-
: string_(other.string_) {}
61-
62-
template <class Tag, template <class> class Message>
63-
void operator()(Message<Tag> const & message) const {
64-
apply_visitor(typename Base::template string_visitor<Message<Tag> >(message), string_);
65-
}
66-
};
18+
/**
19+
*
20+
* To create your own string directive, you can use the preprocessor macro
21+
* BOOST_NETWORK_STRING_DIRECTIVE which takes three parameters: the name of
22+
* the directive, a name for the variable to use in the directive visitor,
23+
* and the body to be implemented in the visitor. An example directive for
24+
* setting the source of a message would look something like this given the
25+
* BOOST_NETWORK_STRING_DIRECTIVE macro:
26+
*
27+
* BOOST_NETWORK_STRING_DIRECTIVE(source, source_,
28+
* message.source(source_)
29+
* , message.source=source_);
30+
*
31+
*/
6732

33+
#ifndef BOOST_NETWORK_STRING_DIRECTIVE
6834
#define BOOST_NETWORK_STRING_DIRECTIVE(name, value, body, pod_body) \
69-
struct name##_directive_base { \
70-
\
71-
template <class Message> \
72-
struct normal_visitor : boost::static_visitor<> { \
73-
Message const & message; \
74-
explicit normal_visitor(Message const & message) : \
75-
message(message) {} \
76-
void operator()( \
77-
typename boost::network::detail::string_value< \
78-
typename Message::tag \
79-
>::type const & value \
80-
) const { \
81-
body; \
82-
} \
83-
template <class T> void operator()(T const &) const { \
84-
} \
85-
}; \
86-
\
87-
template <class Message> \
88-
struct pod_visitor : boost::static_visitor<> { \
89-
Message const & message; \
90-
explicit pod_visitor(Message const & message) : \
91-
message(message) {} \
92-
void operator()( \
93-
typename boost::network::detail::string_value< \
94-
typename Message::tag \
95-
>::type const & value \
96-
) const { \
97-
pod_body; \
98-
} \
99-
template <class T> void operator()(T const &) const { \
100-
} \
101-
}; \
102-
\
103-
template <class Message> \
104-
struct string_visitor : \
105-
mpl::if_< \
106-
is_base_of< \
107-
tags::pod, \
108-
typename Message::tag \
109-
>, \
110-
pod_visitor<Message>, \
111-
normal_visitor<Message> \
112-
>::type \
113-
{ \
114-
typedef typename mpl::if_< \
115-
is_base_of< \
116-
tags::pod, \
117-
typename Message::tag \
118-
>, \
119-
pod_visitor<Message>, \
120-
normal_visitor<Message> \
121-
>::type base; \
122-
explicit string_visitor(Message const & message): \
123-
base(message) {} \
124-
string_visitor(string_visitor const & other): \
125-
base(other) {} \
126-
using base::operator(); \
127-
}; \
35+
template <class ValueType> \
36+
struct name##_directive { \
37+
ValueType const & value; \
38+
explicit name##_directive(ValueType const & value_) \
39+
: value(value_) {} \
40+
name##_directive(name##_directive const & other) \
41+
: value(other.value) {} \
42+
template <class Tag, template <class> class Message> \
43+
typename enable_if<is_pod<Tag>, void>::type \
44+
operator()(Message<Tag> & message) const { \
45+
pod_body; \
46+
} \
47+
template <class Tag, template <class> class Message> \
48+
typename enable_if<mpl::not_<is_pod<Tag> >, void>::type \
49+
operator()(Message<Tag> & message) const { \
50+
body; \
51+
} \
12852
}; \
12953
\
130-
typedef boost::network::detail::string_directive<name##_directive_base> \
131-
name##_directive; \
132-
template <class T> inline name##_directive const \
54+
template <class T> inline name##_directive<T> \
13355
name (T const & input) { \
134-
return name##_directive(input); \
56+
return name##_directive<T>(input); \
13557
}
136-
137-
} /* detail */
138-
139-
} /* network */
140-
141-
} /* boost */
58+
#endif /* BOOST_NETWORK_STRING_DIRECTIVE */
14259

14360
#endif /* BOOST_NETWORK_MESSAGE_DIRECTIVES_DETAIL_STRING_DIRECTIVE_HPP_20100915 */

0 commit comments

Comments
 (0)