aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2021-03-19 00:04:49 +0100
committerGitHub <noreply@github.com>2021-03-19 00:04:49 +0100
commitdb56b2166d3591eb5d16923b1fcf02733c12420b (patch)
treec7d918613efcd7e7695cb12cee453d47e5034c5a /Ryujinx.HLE
parentca848d635930928df96f0adcdb8f46abf1c2231a (diff)
ErrorApplet: Implement ApplicationErrorArg (#2123)
This PR implement `ApplicationErrorArg` to the Error Applet. It's used by the guest to throw some specific error messages. The code was done for (and merged) LDN2 build since long time ago and have been tested a bunch of times because of that! In a way to reduce the differences between LDN and master build it's fine to add it to master.
Diffstat (limited to 'Ryujinx.HLE')
-rw-r--r--Ryujinx.HLE/HOS/Applets/Error/ApplicationErrorArg.cs13
-rw-r--r--Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs42
2 files changed, 55 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Applets/Error/ApplicationErrorArg.cs b/Ryujinx.HLE/HOS/Applets/Error/ApplicationErrorArg.cs
new file mode 100644
index 00000000..931c5912
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Applets/Error/ApplicationErrorArg.cs
@@ -0,0 +1,13 @@
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.HLE.HOS.Applets.Error
+{
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ unsafe struct ApplicationErrorArg
+ {
+ public uint ErrorNumber;
+ public ulong LanguageCode;
+ public fixed byte MessageText[0x800];
+ public fixed byte DetailsText[0x800];
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs b/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs
index c78cbf31..c8bdf3e1 100644
--- a/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs
+++ b/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs
@@ -8,6 +8,7 @@ using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.Services.Am.AppletAE;
using Ryujinx.HLE.HOS.SystemState;
using System;
+using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
@@ -53,6 +54,12 @@ namespace Ryujinx.HLE.HOS.Applets.Error
break;
}
+ case ErrorType.ApplicationErrorArg:
+ {
+ ParseApplicationErrorArg();
+
+ break;
+ }
default: throw new NotImplementedException($"ErrorApplet type {_errorCommonHeader.Type} is not implemented.");
}
@@ -163,6 +170,41 @@ namespace Ryujinx.HLE.HOS.Applets.Error
}
}
+ private void ParseApplicationErrorArg()
+ {
+ ApplicationErrorArg applicationErrorArg = IApplet.ReadStruct<ApplicationErrorArg>(_errorStorage);
+
+ byte[] messageTextBuffer = new byte[0x800];
+ byte[] detailsTextBuffer = new byte[0x800];
+ unsafe
+ {
+ Marshal.Copy((IntPtr)applicationErrorArg.MessageText, messageTextBuffer, 0, 0x800);
+ Marshal.Copy((IntPtr)applicationErrorArg.DetailsText, detailsTextBuffer, 0, 0x800);
+ }
+
+ string messageText = Encoding.ASCII.GetString(messageTextBuffer.TakeWhile(b => !b.Equals(0)).ToArray());
+ string detailsText = Encoding.ASCII.GetString(detailsTextBuffer.TakeWhile(b => !b.Equals(0)).ToArray());
+
+ List<string> buttons = new List<string>();
+
+ // TODO: Handle the LanguageCode to return the translated "OK" and "Details".
+
+ if (detailsText.Trim() != "")
+ {
+ buttons.Add("Details");
+ }
+
+ buttons.Add("OK");
+
+ bool showDetails = _horizon.Device.UiHandler.DisplayErrorAppletDialog($"Error Number: {applicationErrorArg.ErrorNumber}", "\n" + messageText, buttons.ToArray());
+ if (showDetails)
+ {
+ buttons.RemoveAt(0);
+
+ _horizon.Device.UiHandler.DisplayErrorAppletDialog($"Error Number: {applicationErrorArg.ErrorNumber} (Details)", "\n" + detailsText, buttons.ToArray());
+ }
+ }
+
public ResultCode GetResult()
{
return ResultCode.Success;