|
@@ -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:u", std::make_shared<NPNS_U>(system));
|
|
|
|
|
|
|
+ server_manager->RegisterNamedService("npns:s", std::make_shared<INpnsSystem>(system));
|
|
|
|
|
+ server_manager->RegisterNamedService("npns:u", std::make_shared<INpnsUser>(system));
|
|
|
ServerManager::RunServer(std::move(server_manager));
|
|
ServerManager::RunServer(std::move(server_manager));
|
|
|
}
|
|
}
|
|
|
|
|
|