mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-03-26 02:10:17 +00:00
* Add default values to ApplicationData directly * Refactor application loading It should now be possible to load multi game XCIs. Included updates won't be detected for now. Opening a game from the command line currently only opens the first one. * Only include program NCAs where at least one tuple item is not null * Get application data by title id and add programIndex check back * Refactor application loading again and remove duplicate code * Actually use patch ncas for updates * Fix number of applications found with multi game xcis * Don't load bundled updates from multi game xcis * Change ApplicationData.TitleId type to ulong & Add TitleIdString property * Use cnmt files and ContentCollection to load programs * Ava: Add updates and DLCs from gamecarts * Get the cnmt file from its NCA * Ava: Identify bundled updates in updater window * Fix the (hopefully) last few bugs * Add idOffset parameter to GetNcaByType * Handle missing file for dlc.json * Ava: Shorten error message for invalid files * Gtk: Add additional string for bundled updates in TitleUpdateWindow * Hopefully fix DLC issues * Apply formatting * Finally fix DLC issues * Adjust property names and fileSize field * Read the correct update file * Fix wrong casing for application id strings * Rename TitleId to ApplicationId * Address review comments * Fix formatting issues * Apply suggestions from code review Co-authored-by: gdkchan <gab.dark.100@gmail.com> * Gracefully fail when loading pfs for update and dlc window * Fix applications with multiple programs * Fix DLCWindow crash on GTK * Fix some GUI issues * Remove IsXci again --------- Co-authored-by: gdkchan <gab.dark.100@gmail.com>
61 lines
1.9 KiB
C#
61 lines
1.9 KiB
C#
using LibHac.Common.Keys;
|
|
using LibHac.Fs.Fsa;
|
|
using LibHac.Ncm;
|
|
using LibHac.Tools.FsSystem.NcaUtils;
|
|
using LibHac.Tools.Ncm;
|
|
using Ryujinx.HLE.Loaders.Processes.Extensions;
|
|
using System;
|
|
|
|
namespace Ryujinx.HLE.FileSystem
|
|
{
|
|
/// <summary>
|
|
/// Thin wrapper around <see cref="Cnmt"/>
|
|
/// </summary>
|
|
public class ContentCollection
|
|
{
|
|
private readonly IFileSystem _pfs;
|
|
private readonly Cnmt _cnmt;
|
|
|
|
public ulong Id => _cnmt.TitleId;
|
|
public TitleVersion Version => _cnmt.TitleVersion;
|
|
public ContentMetaType Type => _cnmt.Type;
|
|
public ulong ApplicationId => _cnmt.ApplicationTitleId;
|
|
public ulong PatchId => _cnmt.PatchTitleId;
|
|
public TitleVersion RequiredSystemVersion => _cnmt.MinimumSystemVersion;
|
|
public TitleVersion RequiredApplicationVersion => _cnmt.MinimumApplicationVersion;
|
|
public byte[] Digest => _cnmt.Hash;
|
|
|
|
public ulong ProgramBaseId => Id & ~0x1FFFUL;
|
|
public bool IsSystemTitle => _cnmt.Type < ContentMetaType.Application;
|
|
|
|
public ContentCollection(IFileSystem pfs, Cnmt cnmt)
|
|
{
|
|
_pfs = pfs;
|
|
_cnmt = cnmt;
|
|
}
|
|
|
|
public Nca GetNcaByType(KeySet keySet, ContentType type, int programIndex = 0)
|
|
{
|
|
// TODO: Replace this with a check for IdOffset as soon as LibHac supports it:
|
|
// && entry.IdOffset == programIndex
|
|
|
|
foreach (var entry in _cnmt.ContentEntries)
|
|
{
|
|
if (entry.Type != type)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
string ncaId = BitConverter.ToString(entry.NcaId).Replace("-", null).ToLower();
|
|
Nca nca = _pfs.GetNca(keySet, $"/{ncaId}.nca");
|
|
|
|
if (nca.GetProgramIndex() == programIndex)
|
|
{
|
|
return nca;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|