20 #ifndef RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
21 #define RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
23 #include <ripple/basics/ByteUtilities.h>
24 #include <ripple/protocol/messages.h>
25 #include <ripple/overlay/Compression.h>
26 #include <ripple/overlay/Message.h>
27 #include <ripple/overlay/impl/ZeroCopyStream.h>
28 #include <boost/asio/buffer.hpp>
29 #include <boost/asio/buffers_iterator.hpp>
30 #include <boost/system/error_code.hpp>
40 template <
class =
void>
46 case protocol::mtMANIFESTS:
return "manifests";
47 case protocol::mtPING:
return "ping";
48 case protocol::mtCLUSTER:
return "cluster";
49 case protocol::mtGET_SHARD_INFO:
return "get_shard_info";
50 case protocol::mtSHARD_INFO:
return "shard_info";
51 case protocol::mtGET_PEER_SHARD_INFO:
return "get_peer_shard_info";
52 case protocol::mtPEER_SHARD_INFO:
return "peer_shard_info";
53 case protocol::mtENDPOINTS:
return "endpoints";
54 case protocol::mtTRANSACTION:
return "tx";
55 case protocol::mtGET_LEDGER:
return "get_ledger";
56 case protocol::mtLEDGER_DATA:
return "ledger_data";
57 case protocol::mtPROPOSE_LEDGER:
return "propose";
58 case protocol::mtSTATUS_CHANGE:
return "status";
59 case protocol::mtHAVE_SET:
return "have_set";
60 case protocol::mtVALIDATORLIST:
return "validator_list";
61 case protocol::mtVALIDATION:
return "validation";
62 case protocol::mtGET_OBJECTS:
return "get_objects";
97 template<
typename BufferSequence>
101 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(bufs);
104 template <
class BufferSequence>
106 BufferSequence
const& bufs,
113 auto const compressed = (*iter & 0x80) == 0x80;
116 if ((*iter & 0xFC) == 0 || compressed)
125 uint8_t algorithm = (*iter & 0x70) >> 4;
131 for (
int i = 0; i != 4; ++i)
138 for (
int i = 0; i != 2; ++i)
142 for (
int i = 0; i != 4; ++i)
151 template <
class T,
class Buffers,
class Handler,
156 Buffers
const& buffers,
159 auto const m = std::make_shared<T>();
176 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
179 else if (!m->ParseFromZeroCopyStream(&stream))
183 handler.onMessage (m);
198 template <
class Buffers,
class Handler>
204 auto const size = boost::asio::buffer_size(buffers);
220 if (header->payload_wire_size >
megabytes(64))
222 result.
second = make_error_code(boost::system::errc::message_size);
228 if (header->total_wire_size > size)
233 switch (header->message_type)
235 case protocol::mtMANIFESTS:
236 success = detail::invoke<protocol::TMManifests>(*header, buffers, handler);
238 case protocol::mtPING:
239 success = detail::invoke<protocol::TMPing>(*header, buffers, handler);
241 case protocol::mtCLUSTER:
242 success = detail::invoke<protocol::TMCluster>(*header, buffers, handler);
244 case protocol::mtGET_SHARD_INFO:
245 success = detail::invoke<protocol::TMGetShardInfo>(*header, buffers, handler);
247 case protocol::mtSHARD_INFO:
248 success = detail::invoke<protocol::TMShardInfo>(*header, buffers, handler);
250 case protocol::mtGET_PEER_SHARD_INFO:
251 success = detail::invoke<protocol::TMGetPeerShardInfo>(*header, buffers, handler);
253 case protocol::mtPEER_SHARD_INFO:
254 success = detail::invoke<protocol::TMPeerShardInfo>(*header, buffers, handler);
256 case protocol::mtENDPOINTS:
257 success = detail::invoke<protocol::TMEndpoints>(*header, buffers, handler);
259 case protocol::mtTRANSACTION:
260 success = detail::invoke<protocol::TMTransaction>(*header, buffers, handler);
262 case protocol::mtGET_LEDGER:
263 success = detail::invoke<protocol::TMGetLedger>(*header, buffers, handler);
265 case protocol::mtLEDGER_DATA:
266 success = detail::invoke<protocol::TMLedgerData>(*header, buffers, handler);
268 case protocol::mtPROPOSE_LEDGER:
269 success = detail::invoke<protocol::TMProposeSet>(*header, buffers, handler);
271 case protocol::mtSTATUS_CHANGE:
272 success = detail::invoke<protocol::TMStatusChange>(*header, buffers, handler);
274 case protocol::mtHAVE_SET:
275 success = detail::invoke<protocol::TMHaveTransactionSet>(*header, buffers, handler);
277 case protocol::mtVALIDATION:
278 success = detail::invoke<protocol::TMValidation>(*header, buffers, handler);
280 case protocol::mtVALIDATORLIST:
281 success = detail::invoke<protocol::TMValidatorList> (*header, buffers, handler);
283 case protocol::mtGET_OBJECTS:
284 success = detail::invoke<protocol::TMGetObjectByHash>(*header, buffers, handler);
287 handler.onMessageUnknown (header->message_type);
292 result.
first = header->total_wire_size;
295 result.
second = make_error_code(boost::system::errc::bad_message);