Commit aee508be authored by Dominik Charousset's avatar Dominik Charousset Committed by GitHub

Merge pull request #14

Fix mixin for string_application
parents 68451a12 36c7ac33
...@@ -121,11 +121,14 @@ private: ...@@ -121,11 +121,14 @@ private:
std::shared_ptr<std::vector<char>> buf_; std::shared_ptr<std::vector<char>> buf_;
}; };
class stream_string_application : public string_application { template <class Base, class Subtype>
class stream_string_application : public Base {
public: public:
using header_type = typename Base::header_type;
stream_string_application(actor_system& sys, stream_string_application(actor_system& sys,
std::shared_ptr<std::vector<char>> buf) std::shared_ptr<std::vector<char>> buf)
: string_application(sys, std::move(buf)), await_payload_(false) { : Base(sys, std::move(buf)), await_payload_(false) {
// nop // nop
} }
...@@ -133,20 +136,20 @@ public: ...@@ -133,20 +136,20 @@ public:
error init(Parent& parent) { error init(Parent& parent) {
parent.transport().configure_read( parent.transport().configure_read(
net::receive_policy::exactly(sizeof(header_type))); net::receive_policy::exactly(sizeof(header_type)));
return string_application::init(parent); return Base::init(parent);
} }
template <class Parent> template <class Parent>
void handle_data(Parent& parent, span<char> data) { void handle_data(Parent& parent, span<char> data) {
if (await_payload_) { if (await_payload_) {
handle_packet(parent, header_, data); Base::handle_packet(parent, header_, data);
await_payload_ = false; await_payload_ = false;
} else { } else {
if (data.size() != sizeof(header_type)) if (data.size() != sizeof(header_type))
CAF_FAIL(""); CAF_FAIL("");
memcpy(&header_, data.data(), sizeof(header_type)); memcpy(&header_, data.data(), sizeof(header_type));
if (header_.payload == 0) if (header_.payload == 0)
handle_packet(parent, header_, span<char>{}); Base::handle_packet(parent, header_, span<char>{});
else else
parent.configure_read(net::receive_policy::exactly(header_.payload)); parent.configure_read(net::receive_policy::exactly(header_.payload));
await_payload_ = true; await_payload_ = true;
...@@ -185,6 +188,8 @@ private: ...@@ -185,6 +188,8 @@ private:
CAF_TEST_FIXTURE_SCOPE(endpoint_manager_tests, fixture) CAF_TEST_FIXTURE_SCOPE(endpoint_manager_tests, fixture)
CAF_TEST(receive) { CAF_TEST(receive) {
using application_type = extend<string_application>::with<
stream_string_application>;
std::vector<char> read_buf(1024); std::vector<char> read_buf(1024);
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 1u); CAF_CHECK_EQUAL(mpx->num_socket_managers(), 1u);
auto buf = std::make_shared<std::vector<char>>(); auto buf = std::make_shared<std::vector<char>>();
...@@ -194,12 +199,12 @@ CAF_TEST(receive) { ...@@ -194,12 +199,12 @@ CAF_TEST(receive) {
sec::unavailable_or_would_block); sec::unavailable_or_would_block);
CAF_MESSAGE("adding both endpoint managers"); CAF_MESSAGE("adding both endpoint managers");
auto mgr1 = make_endpoint_manager(mpx, sys, policy::scribe{sockets.first}, auto mgr1 = make_endpoint_manager(mpx, sys, policy::scribe{sockets.first},
stream_string_application{sys, buf}); application_type{sys, buf});
CAF_CHECK_EQUAL(mgr1->init(), none); CAF_CHECK_EQUAL(mgr1->init(), none);
mpx->handle_updates(); mpx->handle_updates();
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 2u); CAF_CHECK_EQUAL(mpx->num_socket_managers(), 2u);
auto mgr2 = make_endpoint_manager(mpx, sys, policy::scribe{sockets.second}, auto mgr2 = make_endpoint_manager(mpx, sys, policy::scribe{sockets.second},
stream_string_application{sys, buf}); application_type{sys, buf});
CAF_CHECK_EQUAL(mgr2->init(), none); CAF_CHECK_EQUAL(mgr2->init(), none);
mpx->handle_updates(); mpx->handle_updates();
CAF_CHECK_EQUAL(mpx->num_socket_managers(), 3u); CAF_CHECK_EQUAL(mpx->num_socket_managers(), 3u);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment