aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/OsHle/Services/Am/IApplicationFunctions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/OsHle/Services/Am/IApplicationFunctions.cs')
-rw-r--r--Ryujinx.HLE/OsHle/Services/Am/IApplicationFunctions.cs117
1 files changed, 117 insertions, 0 deletions
diff --git a/Ryujinx.HLE/OsHle/Services/Am/IApplicationFunctions.cs b/Ryujinx.HLE/OsHle/Services/Am/IApplicationFunctions.cs
new file mode 100644
index 00000000..e25b524a
--- /dev/null
+++ b/Ryujinx.HLE/OsHle/Services/Am/IApplicationFunctions.cs
@@ -0,0 +1,117 @@
+using Ryujinx.HLE.Logging;
+using Ryujinx.HLE.OsHle.Ipc;
+using System.Collections.Generic;
+
+namespace Ryujinx.HLE.OsHle.Services.Am
+{
+ class IApplicationFunctions : IpcService
+ {
+ private Dictionary<int, ServiceProcessRequest> m_Commands;
+
+ public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => m_Commands;
+
+ public IApplicationFunctions()
+ {
+ m_Commands = new Dictionary<int, ServiceProcessRequest>()
+ {
+ { 1, PopLaunchParameter },
+ { 20, EnsureSaveData },
+ { 21, GetDesiredLanguage },
+ { 22, SetTerminateResult },
+ { 23, GetDisplayVersion },
+ { 40, NotifyRunning },
+ { 50, GetPseudoDeviceId },
+ { 66, InitializeGamePlayRecording },
+ { 67, SetGamePlayRecordingState }
+ };
+ }
+
+ public long PopLaunchParameter(ServiceCtx Context)
+ {
+ //Only the first 0x18 bytes of the Data seems to be actually used.
+ MakeObject(Context, new IStorage(StorageHelper.MakeLaunchParams()));
+
+ return 0;
+ }
+
+ public long EnsureSaveData(ServiceCtx Context)
+ {
+ long UIdLow = Context.RequestData.ReadInt64();
+ long UIdHigh = Context.RequestData.ReadInt64();
+
+ Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
+
+ Context.ResponseData.Write(0L);
+
+ return 0;
+ }
+
+ public long GetDesiredLanguage(ServiceCtx Context)
+ {
+ Context.ResponseData.Write(Context.Ns.Os.SystemState.DesiredLanguageCode);
+
+ return 0;
+ }
+
+ public long SetTerminateResult(ServiceCtx Context)
+ {
+ int ErrorCode = Context.RequestData.ReadInt32();
+
+ string Result = GetFormattedErrorCode(ErrorCode);
+
+ Context.Ns.Log.PrintInfo(LogClass.ServiceAm, $"Result = 0x{ErrorCode:x8} ({Result}).");
+
+ return 0;
+ }
+
+ private string GetFormattedErrorCode(int ErrorCode)
+ {
+ int Module = (ErrorCode >> 0) & 0x1ff;
+ int Description = (ErrorCode >> 9) & 0x1fff;
+
+ return $"{(2000 + Module):d4}-{Description:d4}";
+ }
+
+ public long GetDisplayVersion(ServiceCtx Context)
+ {
+ //FIXME: Need to check correct version on a switch.
+ Context.ResponseData.Write(1L);
+ Context.ResponseData.Write(0L);
+
+ return 0;
+ }
+
+ public long NotifyRunning(ServiceCtx Context)
+ {
+ Context.ResponseData.Write(1);
+
+ return 0;
+ }
+
+ public long GetPseudoDeviceId(ServiceCtx Context)
+ {
+ Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
+
+ Context.ResponseData.Write(0L);
+ Context.ResponseData.Write(0L);
+
+ return 0;
+ }
+
+ public long InitializeGamePlayRecording(ServiceCtx Context)
+ {
+ Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
+
+ return 0;
+ }
+
+ public long SetGamePlayRecordingState(ServiceCtx Context)
+ {
+ int State = Context.RequestData.ReadInt32();
+
+ Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
+
+ return 0;
+ }
+ }
+}