| | |
| | |
| | |
| |
|
| | #pragma once |
| |
|
| | #include <array> |
| | #include <functional> |
| | #include <span> |
| | #include "common/common_types.h" |
| |
|
| | namespace Core::RPC { |
| |
|
| | enum class PacketType : u32 { |
| | Undefined = 0, |
| | ReadMemory = 1, |
| | WriteMemory = 2, |
| | }; |
| |
|
| | struct PacketHeader { |
| | u32 version; |
| | u32 id; |
| | PacketType packet_type; |
| | u32 packet_size; |
| | }; |
| |
|
| | constexpr u32 CURRENT_VERSION = 1; |
| | constexpr u32 MIN_PACKET_SIZE = sizeof(PacketHeader); |
| | constexpr u32 MAX_PACKET_DATA_SIZE = 32; |
| | constexpr u32 MAX_PACKET_SIZE = MIN_PACKET_SIZE + MAX_PACKET_DATA_SIZE; |
| | constexpr u32 MAX_READ_SIZE = MAX_PACKET_DATA_SIZE; |
| |
|
| | class Packet { |
| | public: |
| | explicit Packet(const PacketHeader& header, u8* data, |
| | std::function<void(Packet&)> send_reply_callback); |
| | ~Packet(); |
| |
|
| | u32 GetVersion() const { |
| | return header.version; |
| | } |
| |
|
| | u32 GetId() const { |
| | return header.id; |
| | } |
| |
|
| | PacketType GetPacketType() const { |
| | return header.packet_type; |
| | } |
| |
|
| | u32 GetPacketDataSize() const { |
| | return header.packet_size; |
| | } |
| |
|
| | const PacketHeader& GetHeader() const { |
| | return header; |
| | } |
| |
|
| | std::span<u8, MAX_PACKET_DATA_SIZE> GetPacketData() { |
| | return packet_data; |
| | } |
| |
|
| | void SetPacketDataSize(u32 size) { |
| | header.packet_size = size; |
| | } |
| |
|
| | void SendReply() { |
| | send_reply_callback(*this); |
| | } |
| |
|
| | private: |
| | void HandleReadMemory(u32 address, u32 data_size); |
| | void HandleWriteMemory(u32 address, std::span<const u8> data); |
| |
|
| | struct PacketHeader header; |
| | std::array<u8, MAX_PACKET_DATA_SIZE> packet_data; |
| |
|
| | std::function<void(Packet&)> send_reply_callback; |
| | }; |
| |
|
| | } |
| |
|