aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs
diff options
context:
space:
mode:
authorThog <me@thog.eu>2020-05-15 03:56:14 +0200
committerGitHub <noreply@github.com>2020-05-15 03:56:14 +0200
commit0ff00bd6d35390eb132eecd3ba307ba4bbfdd56d (patch)
treebee57b671535e00762fe23d40cda454466876b86 /Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs
parent378259a40a938cad6a53b7d2910bb1d2d0fdb58a (diff)
am: Implement common web applets (#1188)
* am: Implemnet common web applets This implement parsing of input and output of web applets while making those close directly. TODO for the future: Use and hook a web browser. * Address Ac_K's comments
Diffstat (limited to 'Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs')
-rw-r--r--Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs105
1 files changed, 105 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs b/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs
new file mode 100644
index 00000000..f9693c34
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs
@@ -0,0 +1,105 @@
+using Ryujinx.Common;
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Services.Am.AppletAE;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.HLE.HOS.Applets.Browser
+{
+ internal class BrowserApplet : IApplet
+ {
+ public event EventHandler AppletStateChanged;
+
+ private AppletSession _normalSession;
+ private AppletSession _interactiveSession;
+
+ private CommonArguments _commonArguments;
+ private List<BrowserArgument> _arguments;
+ private ShimKind _shimKind;
+
+ public BrowserApplet(Horizon system) {}
+
+ public ResultCode GetResult()
+ {
+ return ResultCode.Success;
+ }
+
+ public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession)
+ {
+ _normalSession = normalSession;
+ _interactiveSession = interactiveSession;
+
+ _commonArguments = IApplet.ReadStruct<CommonArguments>(_normalSession.Pop());
+
+ Logger.PrintStub(LogClass.ServiceAm, $"WebApplet version: 0x{_commonArguments.AppletVersion:x8}");
+
+ ReadOnlySpan<byte> webArguments = _normalSession.Pop();
+
+ (_shimKind, _arguments) = BrowserArgument.ParseArguments(webArguments);
+
+ Logger.PrintStub(LogClass.ServiceAm, $"Web Arguments: {_arguments.Count}");
+
+ foreach (BrowserArgument argument in _arguments)
+ {
+ Logger.PrintStub(LogClass.ServiceAm, $"{argument.Type}: {argument.GetValue()}");
+ }
+
+ if ((_commonArguments.AppletVersion >= 0x80000 && _shimKind == ShimKind.Web) || (_commonArguments.AppletVersion >= 0x30000 && _shimKind == ShimKind.Share))
+ {
+ List<BrowserOutput> result = new List<BrowserOutput>();
+
+ result.Add(new BrowserOutput(BrowserOutputType.ExitReason, (uint)WebExitReason.ExitButton));
+
+ _normalSession.Push(BuildResponseNew(result));
+ }
+ else
+ {
+ WebCommonReturnValue result = new WebCommonReturnValue()
+ {
+ ExitReason = WebExitReason.ExitButton,
+ };
+
+ _normalSession.Push(BuildResponseOld(result));
+ }
+
+ AppletStateChanged?.Invoke(this, null);
+
+ return ResultCode.Success;
+ }
+
+ private byte[] BuildResponseOld(WebCommonReturnValue result)
+ {
+ using (MemoryStream stream = new MemoryStream())
+ using (BinaryWriter writer = new BinaryWriter(stream))
+ {
+ writer.WriteStruct(result);
+
+ return stream.ToArray();
+ }
+ }
+ private byte[] BuildResponseNew(List<BrowserOutput> outputArguments)
+ {
+ using (MemoryStream stream = new MemoryStream())
+ using (BinaryWriter writer = new BinaryWriter(stream))
+ {
+ writer.WriteStruct(new WebArgHeader
+ {
+ Count = (ushort)outputArguments.Count,
+ ShimKind = _shimKind
+ });
+
+ foreach (BrowserOutput output in outputArguments)
+ {
+ output.Write(writer);
+ }
+
+ writer.Write(new byte[0x2000 - writer.BaseStream.Position]);
+
+ return stream.ToArray();
+ }
+ }
+ }
+}