mirror of
https://github.com/Lime3DS/Lime3DS.git
synced 2025-03-14 01:32:25 +01:00
Merge 279f469f42a61bdf54987650c79a9ee5625e7525 into 26ce7e4f2844a445bf77b4b14977d62e6434df08
This commit is contained in:
commit
87f9f5c28e
@ -499,6 +499,10 @@ target_link_libraries(citra_core PUBLIC citra_common PRIVATE audio_core network
|
|||||||
target_link_libraries(citra_core PRIVATE Boost::boost Boost::serialization Boost::iostreams httplib)
|
target_link_libraries(citra_core PRIVATE Boost::boost Boost::serialization Boost::iostreams httplib)
|
||||||
target_link_libraries(citra_core PUBLIC dds-ktx PRIVATE cryptopp fmt lodepng open_source_archives)
|
target_link_libraries(citra_core PUBLIC dds-ktx PRIVATE cryptopp fmt lodepng open_source_archives)
|
||||||
|
|
||||||
|
if (NOT ANDROID)
|
||||||
|
target_link_libraries(citra_core PUBLIC input_common)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_WEB_SERVICE)
|
if (ENABLE_WEB_SERVICE)
|
||||||
target_link_libraries(citra_core PRIVATE web_service)
|
target_link_libraries(citra_core PRIVATE web_service)
|
||||||
endif()
|
endif()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2018 Citra Emulator Project
|
// Copyright Citra Emulator Project / Lime3DS Emulator Project
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
@ -15,6 +15,8 @@ enum class PacketType : u32 {
|
|||||||
Undefined = 0,
|
Undefined = 0,
|
||||||
ReadMemory = 1,
|
ReadMemory = 1,
|
||||||
WriteMemory = 2,
|
WriteMemory = 2,
|
||||||
|
SendKey = 3,
|
||||||
|
SendSignal = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PacketHeader {
|
struct PacketHeader {
|
||||||
@ -69,9 +71,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void HandleReadMemory(u32 address, u32 data_size);
|
|
||||||
void HandleWriteMemory(u32 address, std::span<const u8> data);
|
|
||||||
|
|
||||||
struct PacketHeader header;
|
struct PacketHeader header;
|
||||||
std::array<u8, MAX_PACKET_DATA_SIZE> packet_data;
|
std::array<u8, MAX_PACKET_DATA_SIZE> packet_data;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2019 Citra Emulator Project
|
// Copyright Citra Emulator Project / Lime3DS Emulator Project
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
@ -8,6 +8,11 @@
|
|||||||
#include "core/rpc/packet.h"
|
#include "core/rpc/packet.h"
|
||||||
#include "core/rpc/rpc_server.h"
|
#include "core/rpc/rpc_server.h"
|
||||||
|
|
||||||
|
#ifndef ANDROID
|
||||||
|
#include "input_common/keyboard.h"
|
||||||
|
#include "input_common/main.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Core::RPC {
|
namespace Core::RPC {
|
||||||
|
|
||||||
RPCServer::RPCServer(Core::System& system_) : system{system_} {
|
RPCServer::RPCServer(Core::System& system_) : system{system_} {
|
||||||
@ -45,6 +50,25 @@ void RPCServer::HandleWriteMemory(Packet& packet, u32 address, std::span<const u
|
|||||||
packet.SendReply();
|
packet.SendReply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ANDROID
|
||||||
|
void RPCServer::HandleSendKey(Packet& packet, u32 key_code, u8 state) {
|
||||||
|
if (state == 0) {
|
||||||
|
InputCommon::GetKeyboard()->ReleaseKey(key_code);
|
||||||
|
} else if (state == 1) {
|
||||||
|
InputCommon::GetKeyboard()->PressKey(key_code);
|
||||||
|
}
|
||||||
|
packet.SetPacketDataSize(0);
|
||||||
|
packet.SendReply();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RPCServer::HandleSendSignal(Packet& packet, u32 signal_code, u32 signal_parameter) {
|
||||||
|
system.SendSignal(static_cast<Core::System::Signal>(signal_code), signal_parameter);
|
||||||
|
|
||||||
|
packet.SetPacketDataSize(0);
|
||||||
|
packet.SendReply();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool RPCServer::ValidatePacket(const PacketHeader& packet_header) {
|
bool RPCServer::ValidatePacket(const PacketHeader& packet_header) {
|
||||||
if (packet_header.version <= CURRENT_VERSION) {
|
if (packet_header.version <= CURRENT_VERSION) {
|
||||||
switch (packet_header.packet_type) {
|
switch (packet_header.packet_type) {
|
||||||
@ -54,6 +78,20 @@ bool RPCServer::ValidatePacket(const PacketHeader& packet_header) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef ANDROID
|
||||||
|
case PacketType::SendKey:
|
||||||
|
if (packet_header.packet_size >= (sizeof(u32) + sizeof(u8))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PacketType::SendSignal:
|
||||||
|
if (packet_header.packet_size >= sizeof(u32)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -66,26 +104,49 @@ void RPCServer::HandleSingleRequest(std::unique_ptr<Packet> request_packet) {
|
|||||||
const auto packet_data = request_packet->GetPacketData();
|
const auto packet_data = request_packet->GetPacketData();
|
||||||
|
|
||||||
if (ValidatePacket(request_packet->GetHeader())) {
|
if (ValidatePacket(request_packet->GetHeader())) {
|
||||||
// Currently, all request types use the address/data_size wire format
|
|
||||||
u32 address = 0;
|
u32 address = 0;
|
||||||
u32 data_size = 0;
|
u32 data_size = 0;
|
||||||
std::memcpy(&address, packet_data.data(), sizeof(address));
|
|
||||||
std::memcpy(&data_size, packet_data.data() + sizeof(address), sizeof(data_size));
|
#ifndef ANDROID
|
||||||
|
u32 key_code = 0;
|
||||||
|
u8 key_state = 0;
|
||||||
|
u32 signal_code = 0;
|
||||||
|
u32 signal_parameter = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (request_packet->GetPacketType()) {
|
switch (request_packet->GetPacketType()) {
|
||||||
case PacketType::ReadMemory:
|
case PacketType::ReadMemory:
|
||||||
|
std::memcpy(&address, packet_data.data(), sizeof(address));
|
||||||
|
std::memcpy(&data_size, packet_data.data() + sizeof(address), sizeof(data_size));
|
||||||
if (data_size > 0 && data_size <= MAX_READ_SIZE) {
|
if (data_size > 0 && data_size <= MAX_READ_SIZE) {
|
||||||
HandleReadMemory(*request_packet, address, data_size);
|
HandleReadMemory(*request_packet, address, data_size);
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case PacketType::WriteMemory:
|
case PacketType::WriteMemory:
|
||||||
|
std::memcpy(&address, packet_data.data(), sizeof(address));
|
||||||
|
std::memcpy(&data_size, packet_data.data() + sizeof(address), sizeof(data_size));
|
||||||
if (data_size > 0 && data_size <= MAX_PACKET_DATA_SIZE - (sizeof(u32) * 2)) {
|
if (data_size > 0 && data_size <= MAX_PACKET_DATA_SIZE - (sizeof(u32) * 2)) {
|
||||||
const auto data = packet_data.subspan(sizeof(u32) * 2, data_size);
|
const auto data = packet_data.subspan(sizeof(u32) * 2, data_size);
|
||||||
HandleWriteMemory(*request_packet, address, data);
|
HandleWriteMemory(*request_packet, address, data);
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef ANDROID
|
||||||
|
case PacketType::SendKey:
|
||||||
|
std::memcpy(&key_code, packet_data.data(), sizeof(key_code));
|
||||||
|
std::memcpy(&key_state, packet_data.data() + sizeof(key_code), sizeof(key_state));
|
||||||
|
HandleSendKey(*request_packet, key_code, key_state);
|
||||||
|
success = true;
|
||||||
|
break;
|
||||||
|
case PacketType::SendSignal:
|
||||||
|
std::memcpy(&signal_code, packet_data.data(), sizeof(signal_code));
|
||||||
|
std::memcpy(&signal_parameter, packet_data.data() + sizeof(signal_code),
|
||||||
|
sizeof(signal_parameter));
|
||||||
|
HandleSendSignal(*request_packet, signal_code, signal_parameter);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2018 Citra Emulator Project
|
// Copyright Citra Emulator Project / Lime3DS Emulator Project
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
@ -29,6 +29,12 @@ public:
|
|||||||
private:
|
private:
|
||||||
void HandleReadMemory(Packet& packet, u32 address, u32 data_size);
|
void HandleReadMemory(Packet& packet, u32 address, u32 data_size);
|
||||||
void HandleWriteMemory(Packet& packet, u32 address, std::span<const u8> data);
|
void HandleWriteMemory(Packet& packet, u32 address, std::span<const u8> data);
|
||||||
|
|
||||||
|
#ifndef ANDROID
|
||||||
|
void HandleSendKey(Packet& packet, u32 key_code, u8 state);
|
||||||
|
void HandleSendSignal(Packet& packet, u32 signal_code, u32 signal_parameter);
|
||||||
|
#endif
|
||||||
|
|
||||||
bool ValidatePacket(const PacketHeader& packet_header);
|
bool ValidatePacket(const PacketHeader& packet_header);
|
||||||
void HandleSingleRequest(std::unique_ptr<Packet> request);
|
void HandleSingleRequest(std::unique_ptr<Packet> request);
|
||||||
void HandleRequestsLoop(std::stop_token stop_token);
|
void HandleRequestsLoop(std::stop_token stop_token);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user