From 8ffa27b311060061a5e9b240d92c7df1c81ac011 Mon Sep 17 00:00:00 2001
From: Liam <byteslice@airmail.cc>
Date: Wed, 21 Feb 2024 16:23:13 -0500
Subject: [PATCH] olsc: rewrite IOlscServiceForApplication

---
 src/core/hle/service/olsc/olsc.cpp            | 14 +++++---
 .../olsc/olsc_service_for_application.cpp     | 35 ++++++++-----------
 .../olsc/olsc_service_for_application.h       |  8 +++--
 3 files changed, 29 insertions(+), 28 deletions(-)

diff --git a/src/core/hle/service/olsc/olsc.cpp b/src/core/hle/service/olsc/olsc.cpp
index 26d93cf208..18e5ad43f8 100644
--- a/src/core/hle/service/olsc/olsc.cpp
+++ b/src/core/hle/service/olsc/olsc.cpp
@@ -12,10 +12,16 @@ namespace Service::OLSC {
 void LoopProcess(Core::System& system) {
     auto server_manager = std::make_unique<ServerManager>(system);
 
-    server_manager->RegisterNamedService("olsc:u",
-                                         std::make_shared<IOlscServiceForApplication>(system));
-    server_manager->RegisterNamedService("olsc:s",
-                                         std::make_shared<IOlscServiceForSystemService>(system));
+    const auto OlscFactoryForApplication = [&] {
+        return std::make_shared<IOlscServiceForApplication>(system);
+    };
+
+    const auto OlscFactoryForSystemService = [&] {
+        return std::make_shared<IOlscServiceForSystemService>(system);
+    };
+
+    server_manager->RegisterNamedService("olsc:u", OlscFactoryForApplication);
+    server_manager->RegisterNamedService("olsc:s", OlscFactoryForSystemService);
 
     ServerManager::RunServer(std::move(server_manager));
 }
diff --git a/src/core/hle/service/olsc/olsc_service_for_application.cpp b/src/core/hle/service/olsc/olsc_service_for_application.cpp
index ae3ed1e3fa..01360f5ef2 100644
--- a/src/core/hle/service/olsc/olsc_service_for_application.cpp
+++ b/src/core/hle/service/olsc/olsc_service_for_application.cpp
@@ -1,7 +1,7 @@
 // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 // SPDX-License-Identifier: GPL-2.0-or-later
 
-#include "core/hle/service/ipc_helpers.h"
+#include "core/hle/service/cmif_serialization.h"
 #include "core/hle/service/olsc/olsc_service_for_application.h"
 
 namespace Service::OLSC {
@@ -10,10 +10,10 @@ IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_)
     : ServiceFramework{system_, "olsc:u"} {
     // clang-format off
         static const FunctionInfo functions[] = {
-            {0, &IOlscServiceForApplication::Initialize, "Initialize"},
+            {0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
             {10, nullptr, "VerifySaveDataBackupLicenseAsync"},
-            {13, &IOlscServiceForApplication::GetSaveDataBackupSetting, "GetSaveDataBackupSetting"},
-            {14, &IOlscServiceForApplication::SetSaveDataBackupSettingEnabled, "SetSaveDataBackupSettingEnabled"},
+            {13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
+            {14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
             {15, nullptr, "SetCustomData"},
             {16, nullptr, "DeleteSaveDataBackupSetting"},
             {18, nullptr, "GetSaveDataBackupInfoCache"},
@@ -40,31 +40,24 @@ IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_)
 
 IOlscServiceForApplication::~IOlscServiceForApplication() = default;
 
-void IOlscServiceForApplication::Initialize(HLERequestContext& ctx) {
+Result IOlscServiceForApplication::Initialize(ClientProcessId process_id) {
     LOG_WARNING(Service_OLSC, "(STUBBED) called");
-
     initialized = true;
-
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(ResultSuccess);
+    R_SUCCEED();
 }
 
-void IOlscServiceForApplication::GetSaveDataBackupSetting(HLERequestContext& ctx) {
+Result IOlscServiceForApplication::GetSaveDataBackupSetting(Out<u8> out_save_data_backup_setting) {
     LOG_WARNING(Service_OLSC, "(STUBBED) called");
-
     // backup_setting is set to 0 since real value is unknown
-    constexpr u64 backup_setting = 0;
-
-    IPC::ResponseBuilder rb{ctx, 4};
-    rb.Push(ResultSuccess);
-    rb.Push(backup_setting);
+    *out_save_data_backup_setting = 0;
+    R_SUCCEED();
 }
 
-void IOlscServiceForApplication::SetSaveDataBackupSettingEnabled(HLERequestContext& ctx) {
-    LOG_WARNING(Service_OLSC, "(STUBBED) called");
-
-    IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(ResultSuccess);
+Result IOlscServiceForApplication::SetSaveDataBackupSettingEnabled(bool enabled,
+                                                                   NS::Uid account_id) {
+    LOG_WARNING(Service_OLSC, "(STUBBED) called, enabled={}, account_id={}", enabled,
+                account_id.uuid.FormattedString());
+    R_SUCCEED();
 }
 
 } // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/olsc_service_for_application.h b/src/core/hle/service/olsc/olsc_service_for_application.h
index 29074054bd..3f9ac7536a 100644
--- a/src/core/hle/service/olsc/olsc_service_for_application.h
+++ b/src/core/hle/service/olsc/olsc_service_for_application.h
@@ -1,6 +1,8 @@
 // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 // SPDX-License-Identifier: GPL-2.0-or-later
 
+#include "core/hle/service/cmif_types.h"
+#include "core/hle/service/ns/ns_types.h"
 #include "core/hle/service/service.h"
 
 namespace Service::OLSC {
@@ -11,9 +13,9 @@ public:
     ~IOlscServiceForApplication() override;
 
 private:
-    void Initialize(HLERequestContext& ctx);
-    void GetSaveDataBackupSetting(HLERequestContext& ctx);
-    void SetSaveDataBackupSettingEnabled(HLERequestContext& ctx);
+    Result Initialize(ClientProcessId process_id);
+    Result GetSaveDataBackupSetting(Out<u8> out_save_data_backup_setting);
+    Result SetSaveDataBackupSettingEnabled(bool enabled, NS::Uid account_id);
 
     bool initialized{};
 };