RLPXFrameReader.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. This file is part of cpp-ethereum.
  3. cpp-ethereum is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. cpp-ethereum is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. /** @file RLPXFrameReader.h
  15. * @author Alex Leverington <nessence@gmail.com>
  16. * @date 2015
  17. */
  18. #pragma once
  19. #include <libdevcore/Guards.h>
  20. #include "RLPXFrameCoder.h"
  21. #include "RLPXPacket.h"
  22. namespace ba = boost::asio;
  23. namespace bi = boost::asio::ip;
  24. namespace dev
  25. {
  26. namespace p2p
  27. {
  28. /**
  29. * RLPFrameReader
  30. * Reads and assembles RLPX frame byte buffers into RLPX packets. Additionally
  31. * buffers incomplete packets which are pieced into multiple frames (has sequence).
  32. */
  33. class RLPXFrameReader
  34. {
  35. public:
  36. RLPXFrameReader(uint16_t _protocolType): m_protocolType(_protocolType) {}
  37. /// Processes a single frame returning complete packets.
  38. std::vector<RLPXPacket> demux(RLPXFrameCoder& _coder, RLPXFrameInfo const& _info, bytesRef _frame);
  39. protected:
  40. uint16_t m_protocolType;
  41. std::map<uint16_t, std::pair<RLPXPacket, uint32_t>> m_incomplete; ///< Sequence: Incomplete packet and bytes remaining.
  42. };
  43. }
  44. }