Sfoglia il codice sorgente

service: npns: Add ListenTo and GetReceiveEvent for QLaunch

Narr the Reg 2 anni fa
parent
commit
624c90a439
1 ha cambiato i file con 34 aggiunte e 8 eliminazioni
  1. 34 8
      src/core/hle/service/npns/npns.cpp

+ 34 - 8
src/core/hle/service/npns/npns.cpp

@@ -3,22 +3,26 @@
 
 #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/server_manager.h"
 #include "core/hle/service/service.h"
 
 namespace Service::NPNS {
 
-class NPNS_S final : public ServiceFramework<NPNS_S> {
+class INpnsSystem final : public ServiceFramework<INpnsSystem> {
 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
         static const FunctionInfo functions[] = {
             {1, nullptr, "ListenAll"},
-            {2, nullptr, "ListenTo"},
+            {2, C<&INpnsSystem::ListenTo>, "ListenTo"},
             {3, nullptr, "Receive"},
             {4, nullptr, "ReceiveRaw"},
-            {5, nullptr, "GetReceiveEvent"},
+            {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
             {6, nullptr, "ListenUndelivered"},
             {7, nullptr, "GetStateChangeEVent"},
             {11, nullptr, "SubscribeTopic"},
@@ -59,12 +63,34 @@ public:
         // clang-format on
 
         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:
-    explicit NPNS_U(Core::System& system_) : ServiceFramework{system_, "npns:u"} {
+    explicit INpnsUser(Core::System& system_) : ServiceFramework{system_, "npns:u"} {
         // clang-format off
         static const FunctionInfo functions[] = {
             {1, nullptr, "ListenAll"},
@@ -97,8 +123,8 @@ public:
 void LoopProcess(Core::System& 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));
 }