Skip to content

Commit f47a62d

Browse files
committed
Added first test for XMPP client.
1 parent 71e9a7c commit f47a62d

File tree

13 files changed

+265
-57
lines changed

13 files changed

+265
-57
lines changed

boost/network/detail/xml_wrappers/traits/parser_backend.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010

1111
# include <boost/network/tags.hpp>
12-
# include <boost/unordered_map.hpp>
1312

1413

1514
namespace boost {

boost/network/protocol/xmpp/client.hpp

Lines changed: 68 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,30 @@
88
# define __BOOST_NETWORK_PROTOCOL_XMPP_CLIENT_INC__
99

1010

11-
# include <boost/utility/noncopyable.hpp>
11+
# include <boost/noncopyable.hpp>
1212
# include <boost/network/traits/string.hpp>
1313
# include <boost/cstdint.hpp>
14+
# include <boost/bind.hpp>
1415
# include <boost/network/protocol/xmpp/message.hpp>
1516
# include <boost/network/protocol/xmpp/presence.hpp>
1617
# include <boost/network/protocol/xmpp/iq.hpp>
18+
# include <boost/asio/io_service.hpp>
19+
# include <boost/asio/ip/tcp.hpp>
1720

1821

1922
namespace boost {
2023
namespace network {
2124
namespace xmpp {
2225
template <
23-
class Handler,
24-
class Tag
26+
class Tag,
27+
class Handler
2528
>
2629
class basic_client : boost::noncopyable {
30+
31+
private:
32+
33+
typedef basic_client<Tag, Handler> this_type;
34+
2735
public:
2836

2937
typedef typename string<Tag>::type string_type;
@@ -32,7 +40,7 @@ class basic_client : boost::noncopyable {
3240
typedef basic_presence<Tag> presence_type;
3341
typedef basic_iq<Tag> iq_type;
3442

35-
explicit basic_client(Handler handler);
43+
explicit basic_client(Handler &handler);
3644

3745
~basic_client();
3846

@@ -50,53 +58,59 @@ class basic_client : boost::noncopyable {
5058

5159
void send_iq(const iq_type &iq);
5260

53-
string_type jid() const;
61+
void set_jid(const string_type &jid);
62+
63+
string_type get_jid() const;
5464

5565
private:
5666

57-
void handle_stream_start();
58-
void handle_stream_stanza();
59-
void handle_stream_end();
67+
void write_stanza(const basic_stanza<Tag> &stanza);
68+
void close_socket();
69+
70+
Handler &handler_;
71+
72+
// io_service
73+
boost::asio::io_service io_service_;
6074

6175
// tcp socket
76+
boost::asio::ip::tcp::socket socket_;
77+
6278
// tls
6379
// sasl
6480

6581
// parameters, such as jid, domain, port etc.
6682
string_type jid_;
6783

68-
// io_service
69-
boost::asio::io_service io_service_;
70-
7184
// xml parser
7285

73-
Handler handler_;
74-
7586
};
7687

7788

7889
template <
7990
class Tag,
8091
class Handler
8192
>
82-
basic_client<Tag, Hander>::basic_client(Handler handler) {
93+
basic_client<Tag, Handler>::basic_client(Handler &handler)
94+
: handler_(handler), socket_(io_service_) {
8395
// set the handlers
8496
}
8597

98+
8699
template <
87100
class Tag,
88101
class Handler
89102
>
90-
basic_client<Tag, Hander>::~basic_client() {
103+
basic_client<Tag, Handler>::~basic_client() {
91104

92105
}
93106

107+
94108
template <
95109
class Tag,
96110
class Handler
97111
>
98-
void basic_client<Tag, Hander>::connect(const string_type &proxy_host,
99-
const string_type &proxy_port) {
112+
void basic_client<Tag, Handler>::connect(const string_type &proxy_host,
113+
const string_type &proxy_port) {
100114
// get the JID domain
101115
// default port is 52222
102116
// open socket
@@ -108,60 +122,84 @@ template <
108122
class Tag,
109123
class Handler
110124
>
111-
void basic_client<Tag, Hander>::disconnect() {
125+
void basic_client<Tag, Handler>::disconnect() {
112126
// close socket
113127
// signal connection handler
128+
io_service_.post(
129+
boost::bind(&this_type::close_socket, this));
114130
}
115131

116132
template <
117133
class Tag,
118134
class Handler
119135
>
120-
void basic_client<Tag, Hander>::authenticate(const string_type &jid,
121-
const string_type &password) {
136+
void basic_client<Tag, Handler>::authenticate(const string_type &jid,
137+
const string_type &password) {
122138

123139
}
124140

125141
template <
126142
class Tag,
127143
class Handler
128144
>
129-
void basic_client<Tag, Hander>::send_message(const message_type &message) {
130-
145+
void basic_client<Tag, Handler>::send_message(const message_type &message) {
146+
io_service_.post(
147+
boost::bind(&this_type::write_stanza, this, boost::ref(message)));
131148
}
132149

133150
template <
134151
class Tag,
135152
class Handler
136153
>
137-
void basic_client<Tag, Hander>::send_presence(const presence_type &presence) {
138-
154+
void basic_client<Tag, Handler>::send_presence(const presence_type &presence) {
155+
io_service_.post(
156+
boost::bind(&this_type::write_stanza, this, boost::ref(presence)));
139157
}
140158

141159
template <
142160
class Tag,
143161
class Handler
144162
>
145-
void basic_client<Tag, Hander>::send_iq(const iq_type &iq) {
146-
163+
void basic_client<Tag, Handler>::send_iq(const iq_type &iq) {
164+
io_service_.post(
165+
boost::bind(&this_type::write_stanza, this, boost::ref(iq)));
147166
}
148167

149168
template <
150169
class Tag,
151170
class Handler
152171
>
153-
basic_client<Tag, Handler>::string_type
154-
basic_client<Tag, Hander>::jid() const {
172+
typename basic_client<Tag, Handler>::string_type
173+
basic_client<Tag, Handler>::get_jid() const {
155174
return jid_;
156175
}
157176

158177

178+
template <
179+
class Tag,
180+
class Handler
181+
>
182+
void basic_client<Tag, Handler>::write_stanza(const basic_stanza<Tag> &stanza) {
183+
184+
}
185+
186+
187+
template <
188+
class Tag,
189+
class Handler
190+
>
191+
void basic_client<Tag, Handler>::close_socket() {
192+
socket_.close();
193+
}
194+
195+
159196
template <
160197
class Handler
161198
>
162-
struct client : basic_client<tags::default_> {
199+
struct client : basic_client<tags::default_, Handler> {
163200

164-
explicit client(Handler handler) : basic_client<tags::default_>(handler) {
201+
explicit client(Handler &handler)
202+
: basic_client<tags::default_, Handler>(handler) {
165203

166204
}
167205

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright (c) Glyn Matthews 2010.
2+
// Distributed under the Boost Software License, Version 1.0.
3+
// (See accompanying file LICENSE_1_0.txt or copy at
4+
// http://www.boost.org/LICENSE_1_0.txt)
5+
6+
7+
#ifndef __BOOST_NETWORK_PROTOCOL_XMPP_DETAIL_STANZA_PARSER_INC__
8+
# define __BOOST_NETWORK_PROTOCOL_XMPP_DETAIL_STANZA_PARSER_INC__
9+
10+
11+
# include <boost/network/detail/xml_wrappers/traits/parser_backend.hpp>
12+
# include <boost/network/detail/xml_wrappers/parser_backends/expat_parser.hpp>
13+
# include <boost/network/protocol/xmpp/stanza.hpp>
14+
# include <boost/network/traits/string.hpp>
15+
16+
17+
18+
namespace boost {
19+
namespace network {
20+
namespace xmpp {
21+
namespace detail {
22+
template <
23+
class Tag
24+
>
25+
class basic_stanza_parser {
26+
public:
27+
28+
typedef basic_stanza<Tag> stanza_type;
29+
typedef typename string<Tag>::type string_type;
30+
typedef typename boost::network::detail::parser_backend<Tag>::type parser_type;
31+
32+
basic_stanza_parser() {
33+
34+
}
35+
36+
~basic_stanza_parser() {
37+
38+
}
39+
40+
bool feed(const string_type &chunk) {
41+
parser_.feed(chunk);
42+
}
43+
44+
bool feed(const string_type &chunk, stanza_type &stanza) {
45+
parser_.feed(chunk, &stanza.element());
46+
}
47+
48+
private:
49+
50+
parser_type parser_;
51+
52+
};
53+
} // namespace detail
54+
} // namespace xmpp
55+
} // namespace network
56+
} // namespace boost
57+
58+
59+
#endif // __BOOST_NETWORK_PROTOCOL_XMPP_DETAIL_STANZA_PARSER_INC__

boost/network/protocol/xmpp/iq.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class basic_iq
2929
typedef typename base_type::headers_container_type headers_container_type;
3030

3131
basic_iq() {
32-
set_name("iq");
32+
static const char name[] = {'i', 'q'};
33+
base_type::set_name(string_type(name, name + sizeof(name)));
3334
}
3435

3536
basic_iq(const basic_iq &other)

boost/network/protocol/xmpp/message.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class basic_message
2929
typedef typename base_type::headers_container_type headers_container_type;
3030

3131
basic_message() {
32-
set_name("message");
32+
static const char name[] = {'m', 'e', 's', 's', 'a', 'g', 'e'};
33+
base_type::set_name(string_type(name, name + sizeof(name)));
3334
}
3435

3536
basic_message(const basic_message &other)

boost/network/protocol/xmpp/presence.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class basic_presence
2929
typedef typename base_type::headers_container_type headers_container_type;
3030

3131
basic_presence() {
32-
set_name("presence");
32+
static const char name[] = {'p', 'r', 'e', 's', 'e', 'n', 'c', 'e'};
33+
base_type::set_name(string_type(name, name + sizeof(name)));
3334
}
3435

3536
basic_presence(const basic_presence &other)

boost/network/protocol/xmpp/stanza.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,14 @@ class basic_stanza
2727

2828
typedef typename base_type::string_type string_type;
2929

30-
explicit basic_stanza(const string_type &name) {
30+
explicit basic_stanza() {
3131

3232
}
3333

34+
explicit basic_stanza(const string_type &name) {
35+
element_.set_name(name);
36+
}
37+
3438
void set_name(const string_type &name) {
3539
element_.set_name(name);
3640
}
@@ -48,6 +52,10 @@ class basic_stanza
4852
return attr? *attr : string_type();
4953
}
5054

55+
detail::basic_element<Tag> &element() {
56+
return element_;
57+
}
58+
5159
private:
5260

5361
detail::basic_element<Tag> element_;

libs/network/test/CMakeLists.txt

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,20 @@ if (Boost_FOUND)
7878
set_target_properties(cpp-netlib-xml_element_tests
7979
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../../../build/tests)
8080

81+
add_executable(cpp-netlib-xmpp_message_tests xmpp/xmpp_message_tests.cpp)
82+
add_executable(cpp-netlib-xmpp_presence_tests xmpp/xmpp_presence_tests.cpp)
83+
add_executable(cpp-netlib-xmpp_iq_tests xmpp/xmpp_iq_tests.cpp)
84+
target_link_libraries(cpp-netlib-xmpp_message_tests ${Boost_LIBRARIES})
85+
target_link_libraries(cpp-netlib-xmpp_presence_tests ${Boost_LIBRARIES})
86+
target_link_libraries(cpp-netlib-xmpp_iq_tests ${Boost_LIBRARIES})
87+
set_target_properties(cpp-netlib-xmpp_message_tests
88+
cpp-netlib-xmpp_presence_tests
89+
cpp-netlib-xmpp_iq_tests
90+
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../../../build/tests)
91+
add_test(cpp-netlib-xmpp_message_tests ../../../build/tests/cpp-netlib-xmpp_message_tests)
92+
add_test(cpp-netlib-xmpp_presence_tests ../../../build/tests/cpp-netlib-xmpp_presence_tests)
93+
add_test(cpp-netlib-xmpp_iq_tests ../../../build/tests/cpp-netlib-xmpp_iq_tests)
94+
8195
if (EXPAT_FOUND)
8296
include_directories( ${EXPAT_INCLUDE_DIRS} )
8397
add_executable(cpp-netlib-expat_element_parser_tests xml_wrappers/expat_element_parser_tests.cpp)
@@ -87,8 +101,18 @@ if (Boost_FOUND)
87101
# add_executable(cpp-netlib-expat_stanza_parser_tests xml_wrappers/expat_stanza_parser_tests.cpp)
88102
# target_link_libraries(cpp-netlib-expat_stanza_parser_tests ${Boost_LIBRARIES} ${EXPAT_LIBRARIES})
89103
# add_test(cpp-netlib-expat_stanza_parser_tests ../../../build/tests/cpp-netlib-expat_stanza_parser_tests)
104+
105+
add_executable(cpp-netlib-xmpp_stanza_tests xmpp/xmpp_stanza_tests.cpp)
106+
target_link_libraries(cpp-netlib-xmpp_stanza_tests ${Boost_LIBRARIES} ${EXPAT_LIBRARIES})
107+
add_test(cpp-netlib-xmpp_stanza_tests ../../../build/tests/cpp-netlib-xmpp_stanza_tests)
90108

109+
add_executable(cpp-netlib-xmpp_client_tests xmpp/xmpp_client_tests.cpp)
110+
target_link_libraries(cpp-netlib-xmpp_client_tests ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${EXPAT_LIBRARIES})
111+
add_test(cpp-netlib-xmpp_client_tests ../../../build/tests/cpp-netlib-xmpp_client_tests)
112+
91113
set_target_properties(cpp-netlib-expat_element_parser_tests
114+
cpp-netlib-xmpp_stanza_tests
115+
cpp-netlib-xmpp_client_tests
92116
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../../../build/tests)
93117
endif()
94118

@@ -105,18 +129,4 @@ if (Boost_FOUND)
105129
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../../../build/tests)
106130
endif()
107131

108-
add_executable(cpp-netlib-xmpp_message_tests xmpp/xmpp_message_tests.cpp)
109-
add_executable(cpp-netlib-xmpp_presence_tests xmpp/xmpp_presence_tests.cpp)
110-
add_executable(cpp-netlib-xmpp_iq_tests xmpp/xmpp_iq_tests.cpp)
111-
target_link_libraries(cpp-netlib-xmpp_message_tests ${Boost_LIBRARIES})
112-
target_link_libraries(cpp-netlib-xmpp_presence_tests ${Boost_LIBRARIES})
113-
target_link_libraries(cpp-netlib-xmpp_iq_tests ${Boost_LIBRARIES})
114-
set_target_properties(cpp-netlib-xmpp_message_tests
115-
cpp-netlib-xmpp_presence_tests
116-
cpp-netlib-xmpp_iq_tests
117-
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../../../build/tests)
118-
add_test(cpp-netlib-xmpp_message_tests ../../../build/tests/cpp-netlib-xmpp_message_tests)
119-
add_test(cpp-netlib-xmpp_presence_tests ../../../build/tests/cpp-netlib-xmpp_presence_tests)
120-
add_test(cpp-netlib-xmpp_iq_tests ../../../build/tests/cpp-netlib-xmpp_iq_tests)
121-
122132
endif()

0 commit comments

Comments
 (0)