aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;