// Copyright 2018 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #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 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 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 data); struct PacketHeader header; std::array packet_data; std::function send_reply_callback; }; } // namespace Core::RPC