From c2356a7653d46ad2e3320dfd0f7816d63f8ff1a7 Mon Sep 17 00:00:00 2001
From: Ac_K <Acoustik666@gmail.com>
Date: Thu, 19 Nov 2020 23:56:23 +0100
Subject: [PATCH] olsc: Add service olsc:u and stub some calls (#1734)

---
 Ryujinx.Common/Logging/LogClass.cs            |  1 +
 .../Olsc/IOlscServiceForApplication.cs        | 53 +++++++++++++++++++
 Ryujinx.HLE/HOS/Services/Olsc/ResultCode.cs   | 13 +++++
 3 files changed, 67 insertions(+)
 create mode 100644 Ryujinx.HLE/HOS/Services/Olsc/IOlscServiceForApplication.cs
 create mode 100644 Ryujinx.HLE/HOS/Services/Olsc/ResultCode.cs

diff --git a/Ryujinx.Common/Logging/LogClass.cs b/Ryujinx.Common/Logging/LogClass.cs
index 5d7077e1d0..dc5bf7fefe 100644
--- a/Ryujinx.Common/Logging/LogClass.cs
+++ b/Ryujinx.Common/Logging/LogClass.cs
@@ -42,6 +42,7 @@ namespace Ryujinx.Common.Logging
         ServiceNs,
         ServiceNsd,
         ServiceNv,
+        ServiceOlsc,
         ServicePctl,
         ServicePl,
         ServicePrepo,
diff --git a/Ryujinx.HLE/HOS/Services/Olsc/IOlscServiceForApplication.cs b/Ryujinx.HLE/HOS/Services/Olsc/IOlscServiceForApplication.cs
new file mode 100644
index 0000000000..757ed7e217
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Olsc/IOlscServiceForApplication.cs
@@ -0,0 +1,53 @@
+using Ryujinx.Common;
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Services.Account.Acc;
+
+namespace Ryujinx.HLE.HOS.Services.Olsc
+{
+    [Service("olsc:u")] // 10.0.0+
+    class IOlscServiceForApplication : IpcService
+    {
+        private bool _initialized;
+
+        public IOlscServiceForApplication(ServiceCtx context) { }
+
+        [Command(0)]
+        // Initialize(pid)
+        public ResultCode Initialize(ServiceCtx context)
+        {
+            // NOTE: Service call arp:r GetApplicationInstanceUnregistrationNotifier with the pid and initialize some internal struct.
+            //       Since we will not support online savedata backup. It's fine to stub it for now.
+
+            _initialized = true;
+
+            Logger.Stub?.PrintStub(LogClass.ServiceOlsc);
+
+            return ResultCode.Success;
+        }
+
+        [Command(14)]
+        // SetSaveDataBackupSettingEnabled(nn::account::Uid, bool)
+        public ResultCode SetSaveDataBackupSettingEnabled(ServiceCtx context)
+        {
+            UserId userId                       = context.RequestData.ReadStruct<UserId>();
+            ulong  saveDataBackupSettingEnabled = context.RequestData.ReadUInt64();
+
+            if (!_initialized)
+            {
+                return ResultCode.NotInitialized;
+            }
+
+            if (userId.IsNull)
+            {
+                return ResultCode.NullArgument;
+            }
+
+            // NOTE: Service store the UserId and the boolean in an internal SaveDataBackupSettingDatabase object.
+            //       Since we will not support online savedata backup. It's fine to stub it for now.
+
+            Logger.Stub?.PrintStub(LogClass.ServiceOlsc, new { userId, saveDataBackupSettingEnabled });
+
+            return ResultCode.Success;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Olsc/ResultCode.cs b/Ryujinx.HLE/HOS/Services/Olsc/ResultCode.cs
new file mode 100644
index 0000000000..141d1ae941
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Olsc/ResultCode.cs
@@ -0,0 +1,13 @@
+namespace Ryujinx.HLE.HOS.Services.Olsc
+{
+    enum ResultCode
+    {
+        ModuleId       = 179,
+        ErrorCodeShift = 9,
+
+        Success = 0,
+
+        NullArgument   = (100 << ErrorCodeShift) | ModuleId,
+        NotInitialized = (101 << ErrorCodeShift) | ModuleId
+    }
+}