diff options
author | Ac_K <Acoustik666@gmail.com> | 2021-03-19 00:04:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-19 00:04:49 +0100 |
commit | db56b2166d3591eb5d16923b1fcf02733c12420b (patch) | |
tree | c7d918613efcd7e7695cb12cee453d47e5034c5a /Ryujinx.HLE | |
parent | ca848d635930928df96f0adcdb8f46abf1c2231a (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.cs | 13 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs | 42 |
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; |