using LibHac.Common; using LibHac.Ncm; using LibHac.Ns; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Utilities.AppLibrary; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; namespace Ryujinx.Ava.Utilities { public readonly struct AppletMetadata { private readonly ContentManager _contentManager; public string Name { get; } public ulong ProgramId { get; } public string Version { get; } public AppletMetadata(ContentManager contentManager, string name, ulong programId, string version = "1.0.0") : this(name, programId, version) { _contentManager = contentManager; } public AppletMetadata(string name, ulong programId, string version = "1.0.0") { Name = name; ProgramId = programId; Version = version; } public string GetContentPath(ContentManager contentManager) => (contentManager ?? _contentManager) .GetInstalledContentPath(ProgramId, StorageId.BuiltInSystem, NcaContentType.Program); public bool CanStart(ContentManager contentManager, out ApplicationData appData, out BlitStruct appControl) { contentManager ??= _contentManager; if (contentManager == null) { appData = null; appControl = new BlitStruct(0); return false; } appData = new() { Name = Name, Id = ProgramId, Path = GetContentPath(contentManager) }; if (string.IsNullOrEmpty(appData.Path)) { appControl = new BlitStruct(0); return false; } appControl = StructHelpers.CreateCustomNacpData(Name, Version); return true; } } }