7 #ifndef CPPWAMP_INTERNAL_ASIOLISTENER_HPP
8 #define CPPWAMP_INTERNAL_ASIOLISTENER_HPP
13 #include "../error.hpp"
14 #include "../rawsockoptions.hpp"
15 #include "asioendpoint.hpp"
24 template <
typename TEstablisher>
25 class AsioListener :
public AsioEndpoint<TEstablisher>
28 using Establisher = TEstablisher;
29 using CodecIds = std::set<int>;
31 AsioListener(Establisher&& est, CodecIds codecIds,
33 : Base(std::move(est)),
34 codecIds_(std::move(codecIds)),
36 maxRxLength_(maxRxLength)
40 using Base = AsioEndpoint<TEstablisher>;
43 using Handshake =
typename Base::Handshake;
45 virtual void onEstablished()
override {Base::receiveHandshake();}
47 virtual void onHandshakeReceived(Handshake hs)
override
49 auto peerCodec = hs.codecId();
51 if (!hs.hasMagicOctet())
53 else if (hs.reserved() != 0)
54 Base::sendHandshake(Handshake::eReservedBitsUsed());
55 else if (codecIds_.count(peerCodec))
57 maxTxLength_ = hs.maxLength();
58 Base::sendHandshake(Handshake().setMaxLength(maxRxLength_)
59 .setCodecId(peerCodec));
62 Base::sendHandshake(Handshake::eUnsupportedFormat());
65 virtual void onHandshakeSent(Handshake hs)
override
68 Base::complete(hs.codecId(), Handshake::byteLengthOf(maxTxLength_),
69 Handshake::byteLengthOf(maxRxLength_));
71 Base::fail(hs.errorCode());
84 #endif // CPPWAMP_INTERNAL_ASIOLISTENER_HPP