Procházet zdrojové kódy

set: Improve implementation (#703)

* settings: Fix GetAvailableLanguageCodes* implementations

Make the implementation match settings. Also add GetAvailableLanguageCodesCount2

* set: define all missing commands in ISettingsServer for a better workflow

* set: Implement MakeLanguageCode

* set: stub GetQuestFlag

* Address comments
Thomas Guillemard před 6 roky
rodič
revize
2cd5d2d184

+ 61 - 16
Ryujinx.HLE/HOS/Services/Set/ISettingsServer.cs

@@ -1,7 +1,11 @@
+using Ryujinx.Common.Logging;
 using Ryujinx.HLE.HOS.Ipc;
 using Ryujinx.HLE.HOS.SystemState;
+using System;
 using System.Collections.Generic;
 
+using static Ryujinx.HLE.HOS.ErrorCode;
+
 namespace Ryujinx.HLE.HOS.Services.Set
 {
     class ISettingsServer : IpcService
@@ -14,13 +18,20 @@ namespace Ryujinx.HLE.HOS.Services.Set
         {
             _commands = new Dictionary<int, ServiceProcessRequest>
             {
-                { 0, GetLanguageCode               },
-                { 1, GetAvailableLanguageCodes     },
-                { 3, GetAvailableLanguageCodeCount },
-                { 5, GetAvailableLanguageCodes2    }
+                { 0, GetLanguageCode                },
+                { 1, GetAvailableLanguageCodes      },
+                { 2, MakeLanguageCode               }, // 4.0.0+
+                { 3, GetAvailableLanguageCodeCount  },
+              //{ 4, GetRegionCode                  },
+                { 5, GetAvailableLanguageCodes2     },
+                { 6, GetAvailableLanguageCodeCount2 },
+              //{ 7, GetKeyCodeMap                  }, // 4.0.0+
+                { 8, GetQuestFlag                   }, // 5.0.0+
+              //{ 9, GetKeyCodeMap2                 }, // 6.0.0+
             };
         }
 
+        // GetLanguageCode() -> nn::settings::LanguageCode
         public static long GetLanguageCode(ServiceCtx context)
         {
             context.ResponseData.Write(context.Device.System.State.DesiredLanguageCode);
@@ -28,40 +39,74 @@ namespace Ryujinx.HLE.HOS.Services.Set
             return 0;
         }
 
+        // GetAvailableLanguageCodes() -> (u32, buffer<nn::settings::LanguageCode, 0xa>)
         public static long GetAvailableLanguageCodes(ServiceCtx context)
         {
-            GetAvailableLanguagesCodesImpl(
-                context,
-                context.Request.RecvListBuff[0].Position,
-                context.Request.RecvListBuff[0].Size);
+            return GetAvailableLanguagesCodesImpl(
+                    context,
+                    context.Request.RecvListBuff[0].Position,
+                    context.Request.RecvListBuff[0].Size,
+                    0xF);
+        }
+
+        // MakeLanguageCode(nn::settings::Language language_index) -> nn::settings::LanguageCode
+        public static long MakeLanguageCode(ServiceCtx context)
+        {
+            int languageIndex = context.RequestData.ReadInt32();
+
+            if ((uint)languageIndex >= (uint)SystemStateMgr.LanguageCodes.Length)
+            {
+                return MakeError(ErrorModule.Settings, SettingsError.LanguageOutOfRange);
+            }
+
+            context.ResponseData.Write(SystemStateMgr.GetLanguageCode(languageIndex));
 
             return 0;
         }
 
+        // GetAvailableLanguageCodeCount() -> u32
         public static long GetAvailableLanguageCodeCount(ServiceCtx context)
         {
-            context.ResponseData.Write(SystemStateMgr.LanguageCodes.Length);
+            context.ResponseData.Write(Math.Min(SystemStateMgr.LanguageCodes.Length, 0xF));
 
             return 0;
         }
 
+        // GetAvailableLanguageCodes2() -> (u32, buffer<nn::settings::LanguageCode, 6>)
         public static long GetAvailableLanguageCodes2(ServiceCtx context)
         {
-            GetAvailableLanguagesCodesImpl(
-                context,
-                context.Request.ReceiveBuff[0].Position,
-                context.Request.ReceiveBuff[0].Size);
+            return GetAvailableLanguagesCodesImpl(
+                    context,
+                    context.Request.ReceiveBuff[0].Position,
+                    context.Request.ReceiveBuff[0].Size,
+                    SystemStateMgr.LanguageCodes.Length);
+        }
+
+        // GetAvailableLanguageCodeCount2() -> u32
+        public static long GetAvailableLanguageCodeCount2(ServiceCtx context)
+        {
+            context.ResponseData.Write(SystemStateMgr.LanguageCodes.Length);
+
+            return 0;
+        }
+
+        // GetQuestFlag() -> bool
+        public static long GetQuestFlag(ServiceCtx context)
+        {
+            context.ResponseData.Write(false);
+
+            Logger.PrintStub(LogClass.ServiceSet);
 
             return 0;
         }
 
-        public static long GetAvailableLanguagesCodesImpl(ServiceCtx context, long position, long size)
+        public static long GetAvailableLanguagesCodesImpl(ServiceCtx context, long position, long size, int maxSize)
         {
             int count = (int)(size / 8);
 
-            if (count > SystemStateMgr.LanguageCodes.Length)
+            if (count > maxSize)
             {
-                count = SystemStateMgr.LanguageCodes.Length;
+                count = maxSize;
             }
 
             for (int index = 0; index < count; index++)

+ 7 - 0
Ryujinx.HLE/HOS/Services/Set/SettingsError.cs

@@ -0,0 +1,7 @@
+namespace Ryujinx.HLE.HOS.Services.Set
+{
+    static class SettingsError
+    {
+        public const int LanguageOutOfRange = 625;
+    }
+}