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>
41 template <
class =
void>
47 case protocol::mtMANIFESTS:
49 case protocol::mtPING:
51 case protocol::mtCLUSTER:
53 case protocol::mtGET_SHARD_INFO:
54 return "get_shard_info";
55 case protocol::mtSHARD_INFO:
57 case protocol::mtGET_PEER_SHARD_INFO:
58 return "get_peer_shard_info";
59 case protocol::mtPEER_SHARD_INFO:
60 return "peer_shard_info";
61 case protocol::mtENDPOINTS:
63 case protocol::mtTRANSACTION:
65 case protocol::mtGET_LEDGER:
67 case protocol::mtLEDGER_DATA:
69 case protocol::mtPROPOSE_LEDGER:
71 case protocol::mtSTATUS_CHANGE:
73 case protocol::mtHAVE_SET:
75 case protocol::mtVALIDATORLIST:
76 return "validator_list";
77 case protocol::mtVALIDATORLISTCOLLECTION:
78 return "validator_list_collection";
79 case protocol::mtVALIDATION:
81 case protocol::mtGET_OBJECTS:
83 case protocol::mtSQUELCH:
120 template <
typename BufferSequence>
124 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(
128 template <
typename BufferSequence>
132 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::end(
145 template <
class BufferSequence>
148 boost::system::error_code& ec,
149 BufferSequence
const& bufs,
170 ec = make_error_code(boost::system::errc::success);
176 ec = make_error_code(boost::system::errc::protocol_error);
184 ec = make_error_code(boost::system::errc::protocol_error);
188 for (
int i = 0; i != 4; ++i)
196 for (
int i = 0; i != 2; ++i)
199 for (
int i = 0; i != 4; ++i)
208 if ((*iter & 0xFC) == 0)
214 ec = make_error_code(boost::system::errc::success);
220 for (
int i = 0; i != 4; ++i)
226 for (
int i = 0; i != 2; ++i)
232 ec = make_error_code(boost::system::errc::no_message);
244 auto const m = std::make_shared<T>();
261 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
264 else if (!m->ParseFromZeroCopyStream(&stream))
279 auto const m = parseMessageContent<T>(header, buffers);
284 handler.onMessageBegin(
290 handler.onMessage(m);
310 template <
class Buffers,
class Handler>
313 Buffers
const& buffers,
319 auto const size = boost::asio::buffer_size(buffers);
341 result.
second = make_error_code(boost::system::errc::message_size);
346 if (!handler.compressionEnabled() &&
349 result.
second = make_error_code(boost::system::errc::protocol_error);
355 if (header->total_wire_size > size)
357 hint = header->total_wire_size - size;
363 switch (header->message_type)
365 case protocol::mtMANIFESTS:
366 success = detail::invoke<protocol::TMManifests>(
367 *header, buffers, handler);
369 case protocol::mtPING:
371 detail::invoke<protocol::TMPing>(*header, buffers, handler);
373 case protocol::mtCLUSTER:
375 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
377 case protocol::mtGET_SHARD_INFO:
378 success = detail::invoke<protocol::TMGetShardInfo>(
379 *header, buffers, handler);
381 case protocol::mtSHARD_INFO:
382 success = detail::invoke<protocol::TMShardInfo>(
383 *header, buffers, handler);
385 case protocol::mtGET_PEER_SHARD_INFO:
386 success = detail::invoke<protocol::TMGetPeerShardInfo>(
387 *header, buffers, handler);
389 case protocol::mtPEER_SHARD_INFO:
390 success = detail::invoke<protocol::TMPeerShardInfo>(
391 *header, buffers, handler);
393 case protocol::mtENDPOINTS:
394 success = detail::invoke<protocol::TMEndpoints>(
395 *header, buffers, handler);
397 case protocol::mtTRANSACTION:
398 success = detail::invoke<protocol::TMTransaction>(
399 *header, buffers, handler);
401 case protocol::mtGET_LEDGER:
402 success = detail::invoke<protocol::TMGetLedger>(
403 *header, buffers, handler);
405 case protocol::mtLEDGER_DATA:
406 success = detail::invoke<protocol::TMLedgerData>(
407 *header, buffers, handler);
409 case protocol::mtPROPOSE_LEDGER:
410 success = detail::invoke<protocol::TMProposeSet>(
411 *header, buffers, handler);
413 case protocol::mtSTATUS_CHANGE:
414 success = detail::invoke<protocol::TMStatusChange>(
415 *header, buffers, handler);
417 case protocol::mtHAVE_SET:
418 success = detail::invoke<protocol::TMHaveTransactionSet>(
419 *header, buffers, handler);
421 case protocol::mtVALIDATION:
422 success = detail::invoke<protocol::TMValidation>(
423 *header, buffers, handler);
425 case protocol::mtVALIDATORLIST:
426 success = detail::invoke<protocol::TMValidatorList>(
427 *header, buffers, handler);
429 case protocol::mtVALIDATORLISTCOLLECTION:
430 success = detail::invoke<protocol::TMValidatorListCollection>(
431 *header, buffers, handler);
433 case protocol::mtGET_OBJECTS:
434 success = detail::invoke<protocol::TMGetObjectByHash>(
435 *header, buffers, handler);
437 case protocol::mtSQUELCH:
439 detail::invoke<protocol::TMSquelch>(*header, buffers, handler);
442 handler.onMessageUnknown(header->message_type);
447 result.
first = header->total_wire_size;
450 result.
second = make_error_code(boost::system::errc::bad_message);