20 #ifndef RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
21 #define RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
23 #include <ripple/basics/ByteUtilities.h>
24 #include <ripple/overlay/Compression.h>
25 #include <ripple/overlay/Message.h>
26 #include <ripple/overlay/impl/ZeroCopyStream.h>
27 #include <ripple/protocol/messages.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:
48 case protocol::mtPING:
50 case protocol::mtCLUSTER:
52 case protocol::mtGET_SHARD_INFO:
53 return "get_shard_info";
54 case protocol::mtSHARD_INFO:
56 case protocol::mtGET_PEER_SHARD_INFO:
57 return "get_peer_shard_info";
58 case protocol::mtPEER_SHARD_INFO:
59 return "peer_shard_info";
60 case protocol::mtENDPOINTS:
62 case protocol::mtTRANSACTION:
64 case protocol::mtGET_LEDGER:
66 case protocol::mtLEDGER_DATA:
68 case protocol::mtPROPOSE_LEDGER:
70 case protocol::mtSTATUS_CHANGE:
72 case protocol::mtHAVE_SET:
74 case protocol::mtVALIDATORLIST:
75 return "validator_list";
76 case protocol::mtVALIDATION:
78 case protocol::mtGET_OBJECTS:
115 template <
typename BufferSequence>
119 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(
123 template <
class BufferSequence>
124 boost::optional<MessageHeader>
131 auto const compressed = (*iter & 0x80) == 0x80;
134 if ((*iter & 0xFC) == 0 || compressed)
143 uint8_t algorithm = (*iter & 0x70) >> 4;
150 for (
int i = 0; i != 4; ++i)
157 for (
int i = 0; i != 2; ++i)
161 for (
int i = 0; i != 4; ++i)
179 auto const m = std::make_shared<T>();
196 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
199 else if (!m->ParseFromZeroCopyStream(&stream))
203 handler.onMessage(m);
218 template <
class Buffers,
class Handler>
224 auto const size = boost::asio::buffer_size(buffers);
240 if (header->payload_wire_size >
megabytes(64))
242 result.
second = make_error_code(boost::system::errc::message_size);
248 if (header->total_wire_size > size)
253 switch (header->message_type)
255 case protocol::mtMANIFESTS:
256 success = detail::invoke<protocol::TMManifests>(
257 *header, buffers, handler);
259 case protocol::mtPING:
261 detail::invoke<protocol::TMPing>(*header, buffers, handler);
263 case protocol::mtCLUSTER:
265 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
267 case protocol::mtGET_SHARD_INFO:
268 success = detail::invoke<protocol::TMGetShardInfo>(
269 *header, buffers, handler);
271 case protocol::mtSHARD_INFO:
272 success = detail::invoke<protocol::TMShardInfo>(
273 *header, buffers, handler);
275 case protocol::mtGET_PEER_SHARD_INFO:
276 success = detail::invoke<protocol::TMGetPeerShardInfo>(
277 *header, buffers, handler);
279 case protocol::mtPEER_SHARD_INFO:
280 success = detail::invoke<protocol::TMPeerShardInfo>(
281 *header, buffers, handler);
283 case protocol::mtENDPOINTS:
284 success = detail::invoke<protocol::TMEndpoints>(
285 *header, buffers, handler);
287 case protocol::mtTRANSACTION:
288 success = detail::invoke<protocol::TMTransaction>(
289 *header, buffers, handler);
291 case protocol::mtGET_LEDGER:
292 success = detail::invoke<protocol::TMGetLedger>(
293 *header, buffers, handler);
295 case protocol::mtLEDGER_DATA:
296 success = detail::invoke<protocol::TMLedgerData>(
297 *header, buffers, handler);
299 case protocol::mtPROPOSE_LEDGER:
300 success = detail::invoke<protocol::TMProposeSet>(
301 *header, buffers, handler);
303 case protocol::mtSTATUS_CHANGE:
304 success = detail::invoke<protocol::TMStatusChange>(
305 *header, buffers, handler);
307 case protocol::mtHAVE_SET:
308 success = detail::invoke<protocol::TMHaveTransactionSet>(
309 *header, buffers, handler);
311 case protocol::mtVALIDATION:
312 success = detail::invoke<protocol::TMValidation>(
313 *header, buffers, handler);
315 case protocol::mtVALIDATORLIST:
316 success = detail::invoke<protocol::TMValidatorList>(
317 *header, buffers, handler);
319 case protocol::mtGET_OBJECTS:
320 success = detail::invoke<protocol::TMGetObjectByHash>(
321 *header, buffers, handler);
324 handler.onMessageUnknown(header->message_type);
329 result.
first = header->total_wire_size;
332 result.
second = make_error_code(boost::system::errc::bad_message);