7 #ifndef CPPWAMP_INTERNAL_ASIOENDPOINT_HPP
8 #define CPPWAMP_INTERNAL_ASIOENDPOINT_HPP
13 #include <boost/asio/buffer.hpp>
14 #include <boost/asio/read.hpp>
15 #include <boost/asio/strand.hpp>
16 #include <boost/asio/write.hpp>
17 #include "../error.hpp"
18 #include "asiotransport.hpp"
19 #include "rawsockhandshake.hpp"
25 class FakeMsgTypeAsioConnector;
26 class FakeMsgTypeAsioListener;
32 template <
typename TEstablisher,
33 template<
typename>
class TTransport = AsioTransport>
37 using Establisher = TEstablisher;
38 using Socket =
typename Establisher::Socket;
39 using Transport = TTransport<Socket>;
40 using TransportPtr = std::shared_ptr<Transport>;
41 using Handler = std::function<void (std::error_code,
int codecId,
44 explicit AsioEndpoint(Establisher&& est)
45 : strand_(est.strand()),
50 virtual ~AsioEndpoint() {}
52 void establish(Handler&& handler)
54 handler_ = std::move(handler);
63 socket_ = std::move(socket);
68 catch (
const boost::system::system_error& e)
83 using Handshake = internal::RawsockHandshake;
84 using SocketPtr =
typename Establisher::SocketPtr;
86 void sendHandshake(Handshake hs)
88 handshake_ = hs.toBigEndian();
89 using boost::asio::buffer;
90 using boost::asio::async_write;
91 async_write(*socket_, buffer(&handshake_,
sizeof(handshake_)),
99 void receiveHandshake()
102 using boost::asio::buffer;
103 using boost::asio::async_read;
104 async_read(*socket_, buffer(&handshake_,
sizeof(handshake_)),
108 onHandshakeReceived(Handshake::fromBigEndian(handshake_));
112 void complete(
int codecId,
size_t maxTxLength,
size_t maxRxLength)
114 auto transport = Transport::create(std::move(socket_), maxTxLength,
117 postHandler(ec, codecId, std::move(transport));
125 postHandler(make_error_code(errc), 0,
nullptr);
133 auto ec = make_error_code(
static_cast<std::errc
>(asioEc.value()));
135 postHandler(ec, 0,
nullptr);
141 virtual void onEstablished() = 0;
143 virtual void onHandshakeReceived(Handshake hs) = 0;
145 virtual void onHandshakeSent(Handshake hs) = 0;
148 template <
typename... TArgs>
149 void postHandler(TArgs&&... args)
151 boost::asio::post(strand_, std::bind(std::move(handler_),
152 std::forward<TArgs>(args)...));
162 friend class wamp::FakeMsgTypeAsioConnector;
163 friend class wamp::FakeMsgTypeAsioListener;
170 #endif // CPPWAMP_INTERNAL_ASIOENDPOINT_HPP