| |
| |
| |
|
|
| #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; |
| }; |
|
|
| } |
|
|