service: npns: Add ListenTo and GetReceiveEvent for QLaunch

This commit is contained in:
Narr the Reg 2024-02-23 12:32:58 -06:00
parent 0fb26acccc
commit 624c90a439
1 changed files with 34 additions and 8 deletions

View File

@ -3,22 +3,26 @@
#include <memory> #include <memory>
#include "core/hle/kernel/k_event.h"
#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/npns/npns.h" #include "core/hle/service/npns/npns.h"
#include "core/hle/service/server_manager.h" #include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Service::NPNS { namespace Service::NPNS {
class NPNS_S final : public ServiceFramework<NPNS_S> { class INpnsSystem final : public ServiceFramework<INpnsSystem> {
public: public:
explicit NPNS_S(Core::System& system_) : ServiceFramework{system_, "npns:s"} { explicit INpnsSystem(Core::System& system_)
: ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{1, nullptr, "ListenAll"}, {1, nullptr, "ListenAll"},
{2, nullptr, "ListenTo"}, {2, C<&INpnsSystem::ListenTo>, "ListenTo"},
{3, nullptr, "Receive"}, {3, nullptr, "Receive"},
{4, nullptr, "ReceiveRaw"}, {4, nullptr, "ReceiveRaw"},
{5, nullptr, "GetReceiveEvent"}, {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
{6, nullptr, "ListenUndelivered"}, {6, nullptr, "ListenUndelivered"},
{7, nullptr, "GetStateChangeEVent"}, {7, nullptr, "GetStateChangeEVent"},
{11, nullptr, "SubscribeTopic"}, {11, nullptr, "SubscribeTopic"},
@ -59,12 +63,34 @@ public:
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);
get_receive_event = service_context.CreateEvent("npns:s:GetReceiveEvent");
} }
~INpnsSystem() override {
service_context.CloseEvent(get_receive_event);
}
private:
Result ListenTo(u32 program_id) {
LOG_WARNING(Service_AM, "(STUBBED) called, program_id={}", program_id);
R_SUCCEED();
}
Result GetReceiveEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
LOG_WARNING(Service_AM, "(STUBBED) called");
*out_event = &get_receive_event->GetReadableEvent();
R_SUCCEED();
}
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* get_receive_event;
}; };
class NPNS_U final : public ServiceFramework<NPNS_U> { class INpnsUser final : public ServiceFramework<INpnsUser> {
public: public:
explicit NPNS_U(Core::System& system_) : ServiceFramework{system_, "npns:u"} { explicit INpnsUser(Core::System& system_) : ServiceFramework{system_, "npns:u"} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{1, nullptr, "ListenAll"}, {1, nullptr, "ListenAll"},
@ -97,8 +123,8 @@ public:
void LoopProcess(Core::System& system) { void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system); auto server_manager = std::make_unique<ServerManager>(system);
server_manager->RegisterNamedService("npns:s", std::make_shared<NPNS_S>(system)); server_manager->RegisterNamedService("npns:s", std::make_shared<INpnsSystem>(system));
server_manager->RegisterNamedService("npns:u", std::make_shared<NPNS_U>(system)); server_manager->RegisterNamedService("npns:u", std::make_shared<INpnsUser>(system));
ServerManager::RunServer(std::move(server_manager)); ServerManager::RunServer(std::move(server_manager));
} }