// 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/polyfill_thread.h" #include "common/threadsafe_queue.h" #include "core/rpc/server.h" namespace Core { class System; } namespace Core::RPC { class Packet; struct PacketHeader; class RPCServer { public: explicit RPCServer(Core::System& system); ~RPCServer(); void QueueRequest(std::unique_ptr request); private: void HandleReadMemory(Packet& packet, u32 address, u32 data_size); void HandleWriteMemory(Packet& packet, u32 address, std::span data); bool ValidatePacket(const PacketHeader& packet_header); void HandleSingleRequest(std::unique_ptr request); void HandleRequestsLoop(std::stop_token stop_token); private: Core::System& system; Server server; Common::SPSCQueue, true> request_queue; std::jthread request_handler_thread; }; } // namespace Core::RPC