From c5f872c70a6b10c98c5710b8ecde04fb6b8ac340 Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Thu, 16 Jan 2020 15:08:39 -0700 Subject: [PATCH] Update to LibHac 0.8.2 (#889) * Update to LibHac 0.8.2 This brings support for temporary savedata, ignores case in key names when loading from a file, and prints the rights ID correctly when missing a title key. * Auto-format IFileSystemProxy --- .../HOS/Services/Fs/IFileSystemProxy.cs | 68 +++++++++---------- Ryujinx.HLE/Ryujinx.HLE.csproj | 2 +- Ryujinx/Ui/SaveImporter.cs | 3 +- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs b/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs index 4e967886..02743a47 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs @@ -37,9 +37,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenFileSystemWithId(ServiceCtx context) { FileSystemType fileSystemType = (FileSystemType)context.RequestData.ReadInt32(); - long titleId = context.RequestData.ReadInt64(); - string switchPath = ReadUtf8String(context); - string fullPath = context.Device.FileSystem.SwitchPathToSystemPath(switchPath); + long titleId = context.RequestData.ReadInt64(); + string switchPath = ReadUtf8String(context); + string fullPath = context.Device.FileSystem.SwitchPathToSystemPath(switchPath); if (!File.Exists(fullPath)) { @@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs } FileStream fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read); - string extension = Path.GetExtension(fullPath); + string extension = Path.GetExtension(fullPath); if (extension == ".nca") { @@ -129,8 +129,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs [Command(22)] public ResultCode CreateSaveDataFileSystem(ServiceCtx context) { - SaveDataAttribute attribute = context.RequestData.ReadStruct(); - SaveDataCreateInfo createInfo = context.RequestData.ReadStruct(); + SaveDataAttribute attribute = context.RequestData.ReadStruct(); + SaveDataCreationInfo creationInfo = context.RequestData.ReadStruct(); SaveMetaCreateInfo metaCreateInfo = context.RequestData.ReadStruct(); // TODO: There's currently no program registry for FS to reference. @@ -140,14 +140,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs attribute.TitleId = new TitleId(context.Process.TitleId); } - if (createInfo.OwnerId == TitleId.Zero) + if (creationInfo.OwnerId == TitleId.Zero) { - createInfo.OwnerId = new TitleId(context.Process.TitleId); + creationInfo.OwnerId = new TitleId(context.Process.TitleId); } Logger.PrintInfo(LogClass.ServiceFs, $"Creating save with title ID {attribute.TitleId.Value:x16}"); - Result result = _baseFileSystemProxy.CreateSaveDataFileSystem(ref attribute, ref createInfo, ref metaCreateInfo); + Result result = _baseFileSystemProxy.CreateSaveDataFileSystem(ref attribute, ref creationInfo, ref metaCreateInfo); return (ResultCode)result.Value; } @@ -155,10 +155,10 @@ namespace Ryujinx.HLE.HOS.Services.Fs [Command(23)] public ResultCode CreateSaveDataFileSystemBySystemSaveDataId(ServiceCtx context) { - SaveDataAttribute attribute = context.RequestData.ReadStruct(); - SaveDataCreateInfo createInfo = context.RequestData.ReadStruct(); + SaveDataAttribute attribute = context.RequestData.ReadStruct(); + SaveDataCreationInfo creationInfo = context.RequestData.ReadStruct(); - Result result = _baseFileSystemProxy.CreateSaveDataFileSystemBySystemSaveDataId(ref attribute, ref createInfo); + Result result = _baseFileSystemProxy.CreateSaveDataFileSystemBySystemSaveDataId(ref attribute, ref creationInfo); return (ResultCode)result.Value; } @@ -166,8 +166,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs [Command(25)] public ResultCode DeleteSaveDataFileSystemBySaveDataSpaceId(ServiceCtx context) { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); + SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); + ulong saveDataId = context.RequestData.ReadUInt64(); Result result = _baseFileSystemProxy.DeleteSaveDataFileSystemBySaveDataSpaceId(spaceId, saveDataId); @@ -177,7 +177,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs [Command(28)] public ResultCode DeleteSaveDataFileSystemBySaveDataAttribute(ServiceCtx context) { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); + SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); Result result = _baseFileSystemProxy.DeleteSaveDataFileSystemBySaveDataAttribute(spaceId, ref attribute); @@ -189,7 +189,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenGameCardStorage(u32, u32) -> object public ResultCode OpenGameCardStorage(ServiceCtx context) { - GameCardHandle handle = new GameCardHandle(context.RequestData.ReadInt32()); + GameCardHandle handle = new GameCardHandle(context.RequestData.ReadInt32()); GameCardPartitionRaw partitionId = (GameCardPartitionRaw)context.RequestData.ReadInt32(); Result result = _baseFileSystemProxy.OpenGameCardStorage(out LibHac.Fs.IStorage storage, handle, partitionId); @@ -205,10 +205,10 @@ namespace Ryujinx.HLE.HOS.Services.Fs [Command(35)] public ResultCode CreateSaveDataFileSystemWithHashSalt(ServiceCtx context) { - SaveDataAttribute attribute = context.RequestData.ReadStruct(); - SaveDataCreateInfo createInfo = context.RequestData.ReadStruct(); + SaveDataAttribute attribute = context.RequestData.ReadStruct(); + SaveDataCreationInfo creationInfo = context.RequestData.ReadStruct(); SaveMetaCreateInfo metaCreateInfo = context.RequestData.ReadStruct(); - HashSalt hashSalt = context.RequestData.ReadStruct(); + HashSalt hashSalt = context.RequestData.ReadStruct(); // TODO: There's currently no program registry for FS to reference. // Workaround that by setting the application ID and owner ID if they're not already set @@ -217,12 +217,12 @@ namespace Ryujinx.HLE.HOS.Services.Fs attribute.TitleId = new TitleId(context.Process.TitleId); } - if (createInfo.OwnerId == TitleId.Zero) + if (creationInfo.OwnerId == TitleId.Zero) { - createInfo.OwnerId = new TitleId(context.Process.TitleId); + creationInfo.OwnerId = new TitleId(context.Process.TitleId); } - Result result = _baseFileSystemProxy.CreateSaveDataFileSystemWithHashSalt(ref attribute, ref createInfo, ref metaCreateInfo, ref hashSalt); + Result result = _baseFileSystemProxy.CreateSaveDataFileSystemWithHashSalt(ref attribute, ref creationInfo, ref metaCreateInfo, ref hashSalt); return (ResultCode)result.Value; } @@ -231,7 +231,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSaveDataFileSystem(u8 save_data_space_id, nn::fssrv::sf::SaveStruct saveStruct) -> object saveDataFs public ResultCode OpenSaveDataFileSystem(ServiceCtx context) { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); + SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); // TODO: There's currently no program registry for FS to reference. @@ -242,7 +242,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs } Result result = _baseFileSystemProxy.OpenSaveDataFileSystem(out LibHac.Fs.IFileSystem fileSystem, spaceId, ref attribute); - + if (result.IsSuccess()) { MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); @@ -255,7 +255,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSaveDataFileSystemBySystemSaveDataId(u8 save_data_space_id, nn::fssrv::sf::SaveStruct saveStruct) -> object systemSaveDataFs public ResultCode OpenSaveDataFileSystemBySystemSaveDataId(ServiceCtx context) { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); + SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); Result result = _baseFileSystemProxy.OpenSaveDataFileSystemBySystemSaveDataId(out LibHac.Fs.IFileSystem fileSystem, spaceId, ref attribute); @@ -324,10 +324,10 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode FindSaveDataWithFilter(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - SaveDataFilter filter = context.RequestData.ReadStruct(); + SaveDataFilter filter = context.RequestData.ReadStruct(); long bufferPosition = context.Request.ReceiveBuff[0].Position; - long bufferLen = context.Request.ReceiveBuff[0].Size; + long bufferLen = context.Request.ReceiveBuff[0].Size; byte[] infoBuffer = new byte[bufferLen]; @@ -343,7 +343,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenSaveDataInfoReaderWithFilter(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - SaveDataFilter filter = context.RequestData.ReadStruct(); + SaveDataFilter filter = context.RequestData.ReadStruct(); Result result = _baseFileSystemProxy.OpenSaveDataInfoReaderWithFilter(out LibHac.FsService.ISaveDataInfoReader infoReader, spaceId, ref filter); @@ -369,8 +369,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenDataStorageByDataId(ServiceCtx context) { StorageId storageId = (StorageId)context.RequestData.ReadByte(); - byte[] padding = context.RequestData.ReadBytes(7); - long titleId = context.RequestData.ReadInt64(); + byte[] padding = context.RequestData.ReadBytes(7); + long titleId = context.RequestData.ReadInt64(); NcaContentType contentType = NcaContentType.Data; @@ -398,8 +398,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs { try { - LibHac.Fs.IStorage ncaStorage = new LocalStorage(ncaPath, FileAccess.Read, FileMode.Open); - Nca nca = new Nca(context.Device.System.KeySet, ncaStorage); + LibHac.Fs.IStorage ncaStorage = new LocalStorage(ncaPath, FileAccess.Read, FileMode.Open); + Nca nca = new Nca(context.Device.System.KeySet, ncaStorage); LibHac.Fs.IStorage romfsStorage = nca.OpenStorage(NcaSectionType.Data, context.Device.System.FsIntegrityCheckLevel); MakeObject(context, new FileSystemProxy.IStorage(romfsStorage)); @@ -412,12 +412,12 @@ namespace Ryujinx.HLE.HOS.Services.Fs return ResultCode.Success; } else - { + { throw new FileNotFoundException($"No Nca found in Path `{ncaPath}`."); } } else - { + { throw new DirectoryNotFoundException($"Path for title id {titleId:x16} on Storage {storageId} was not found in Path {installPath}."); } } diff --git a/Ryujinx.HLE/Ryujinx.HLE.csproj b/Ryujinx.HLE/Ryujinx.HLE.csproj index 15c0c8c0..4fb4835d 100644 --- a/Ryujinx.HLE/Ryujinx.HLE.csproj +++ b/Ryujinx.HLE/Ryujinx.HLE.csproj @@ -52,7 +52,7 @@ - + diff --git a/Ryujinx/Ui/SaveImporter.cs b/Ryujinx/Ui/SaveImporter.cs index b0a5f643..467cc416 100644 --- a/Ryujinx/Ui/SaveImporter.cs +++ b/Ryujinx/Ui/SaveImporter.cs @@ -3,7 +3,6 @@ using LibHac.Common; using LibHac.Fs; using LibHac.Fs.Shim; using LibHac.FsSystem; -using LibHac.FsSystem.Save; using LibHac.Ncm; using Ryujinx.HLE.Utilities; using System; @@ -131,7 +130,7 @@ namespace Ryujinx.Ui { SaveDataAttribute attribute = new SaveDataAttribute { - Type = SaveDataType.SaveData, + Type = SaveDataType.Account, UserId = userId, TitleId = new TitleId(titleId) };