aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2023-03-31 21:16:46 +0200
committerGitHub <noreply@github.com>2023-03-31 21:16:46 +0200
commit4c2d9ff3ff9d7afb1fd0bd764bee5931fa5f053c (patch)
tree1245f5ec356551bd20a9594d114d06a53c41d036 /Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs
parent8198b99935f562ffb2fb9a75175a8df24d235152 (diff)
HLE: Refactoring of ApplicationLoader (#4480)1.1.689
* HLE: Refactoring of ApplicationLoader * Fix SDL2 Headless * Addresses gdkchan feedback * Fixes LoadUnpackedNca RomFS loading * remove useless casting * Cleanup and fixe empty application name * Remove ProcessInfo * Fixes typo * ActiveProcess to ActiveApplication * Update check * Clean using. * Use the correct filepath when loading Homebrew.npdm * Fix NRE in ProcessResult if MetaLoader is null * Add more checks for valid processId & return success * Add missing logging statement for npdm error * Return result for LoadKip() * Move error logging out of PFS load extension method This avoids logging "Could not find Main NCA" followed by "Loading main..." when trying to start hbl. * Fix GUIs not checking load results * Fix style and formatting issues * Fix formatting and wording * gtk: Refactor LoadApplication() --------- Co-authored-by: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs')
-rw-r--r--Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs b/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs
new file mode 100644
index 00000000..c639ee52
--- /dev/null
+++ b/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs
@@ -0,0 +1,61 @@
+using LibHac.Common;
+using LibHac.Fs;
+using LibHac.Fs.Fsa;
+using LibHac.Loader;
+using LibHac.Util;
+using Ryujinx.Common;
+using System;
+
+namespace Ryujinx.HLE.Loaders.Processes.Extensions
+{
+ public static class MetaLoaderExtensions
+ {
+ public static ulong GetProgramId(this MetaLoader metaLoader)
+ {
+ metaLoader.GetNpdm(out var npdm).ThrowIfFailure();
+
+ return npdm.Aci.ProgramId.Value;
+ }
+
+ public static string GetProgramName(this MetaLoader metaLoader)
+ {
+ metaLoader.GetNpdm(out var npdm).ThrowIfFailure();
+
+ return StringUtils.Utf8ZToString(npdm.Meta.ProgramName);
+ }
+
+ public static bool IsProgram64Bit(this MetaLoader metaLoader)
+ {
+ metaLoader.GetNpdm(out var npdm).ThrowIfFailure();
+
+ return (npdm.Meta.Flags & 1) != 0;
+ }
+
+ public static void LoadDefault(this MetaLoader metaLoader)
+ {
+ byte[] npdmBuffer = EmbeddedResources.Read("Ryujinx.HLE/Homebrew.npdm");
+
+ metaLoader.Load(npdmBuffer).ThrowIfFailure();
+ }
+
+ public static void LoadFromFile(this MetaLoader metaLoader, IFileSystem fileSystem, string path = "")
+ {
+ if (string.IsNullOrEmpty(path))
+ {
+ path = ProcessConst.MainNpdmPath;
+ }
+
+ using var npdmFile = new UniqueRef<IFile>();
+
+ fileSystem.OpenFile(ref npdmFile.Ref, path.ToU8Span(), OpenMode.Read).ThrowIfFailure();
+
+ npdmFile.Get.GetSize(out long fileSize).ThrowIfFailure();
+
+ Span<byte> npdmBuffer = new byte[fileSize];
+
+ npdmFile.Get.Read(out _, 0, npdmBuffer).ThrowIfFailure();
+
+ metaLoader.Load(npdmBuffer).ThrowIfFailure();
+ }
+ }
+} \ No newline at end of file