From 2a03f7b1d474420dd569fcaa0de37dfaa66ffb65 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Sun, 18 May 2025 02:26:39 -0500 Subject: [PATCH] infra: Update to Ryujinx.LibHac 0.20.0. This time it's pulled in via GitLab package registry. --- Directory.Packages.props | 2 +- nuget.config | 22 +++- .../FileSystem/EncryptedFileSystemCreator.cs | 4 +- src/Ryujinx.HLE/HOS/ModLoader.cs | 2 +- .../HOS/Services/Fs/IFileSystemProxy.cs | 111 +++++++++--------- .../Ldn/UserServiceCreator/INetworkClient.cs | 2 +- .../IUserLocalCommunicationService.cs | 6 +- .../UserServiceCreator/LdnDisabledClient.cs | 2 +- .../LdnMitm/LdnMitmClient.cs | 2 +- .../LdnRyu/LdnMasterProxyClient.cs | 4 +- .../IParentalControlService.cs | 8 +- .../QueryPlayStatisticsManager.cs | 2 +- .../Extensions/FileSystemExtensions.cs | 8 +- .../Loaders/Processes/ProcessLoader.cs | 8 +- .../Loaders/Processes/ProcessLoaderHelper.cs | 16 +-- .../Loaders/Processes/ProcessResult.cs | 8 +- src/Ryujinx.UI.Common/App/ApplicationData.cs | 2 +- .../App/ApplicationLibrary.cs | 6 +- src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 2 +- 19 files changed, 126 insertions(+), 91 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index bb7056283..3ec7c2ecd 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -39,7 +39,7 @@ - + diff --git a/nuget.config b/nuget.config index 765346e53..05fb0fce6 100644 --- a/nuget.config +++ b/nuget.config @@ -1,7 +1,21 @@ - - - - + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs b/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs index 64b02a282..d9f7d5dcf 100644 --- a/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs +++ b/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs @@ -9,7 +9,7 @@ namespace Ryujinx.HLE.FileSystem public class EncryptedFileSystemCreator : IEncryptedFileSystemCreator { public Result Create(ref SharedRef outEncryptedFileSystem, - ref SharedRef baseFileSystem, IEncryptedFileSystemCreator.KeyId idIndex, + ref readonly SharedRef baseFileSystem, IEncryptedFileSystemCreator.KeyId idIndex, in EncryptionSeed encryptionSeed) { if (idIndex < IEncryptedFileSystemCreator.KeyId.Save || idIndex > IEncryptedFileSystemCreator.KeyId.CustomStorage) @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.FileSystem } // TODO: Reenable when AesXtsFileSystem is fixed. - outEncryptedFileSystem = SharedRef.CreateMove(ref baseFileSystem); + outEncryptedFileSystem = SharedRef.CreateMove(ref baseFileSystem.Ref); return Result.Success; } diff --git a/src/Ryujinx.HLE/HOS/ModLoader.cs b/src/Ryujinx.HLE/HOS/ModLoader.cs index 265c11428..1b88c13d7 100644 --- a/src/Ryujinx.HLE/HOS/ModLoader.cs +++ b/src/Ryujinx.HLE/HOS/ModLoader.cs @@ -798,7 +798,7 @@ namespace Ryujinx.HLE.HOS { var buildId = p switch { - NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()).TrimEnd('0'), + NsoExecutable nso => Convert.ToHexString(nso.BuildId).TrimEnd('0'), NroExecutable nro => Convert.ToHexString(nro.Header.BuildId).TrimEnd('0'), _ => string.Empty, }; diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs b/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs index 24dd1e9be..dcd55d579 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs @@ -3,6 +3,7 @@ using LibHac.Common; using LibHac.Fs; using LibHac.Fs.Shim; using LibHac.FsSrv.Impl; +using LibHac.FsSrv.Sf; using LibHac.FsSystem; using LibHac.Ncm; using LibHac.Sf; @@ -12,10 +13,12 @@ using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy; +using Ryujinx.Memory; using System; using System.IO; using static Ryujinx.HLE.Utilities.StringUtils; using GameCardHandle = System.UInt32; +using IFile = Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy.IFile; using IFileSystem = LibHac.FsSrv.Sf.IFileSystem; using IStorage = LibHac.FsSrv.Sf.IStorage; @@ -29,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public IFileSystemProxy(ServiceCtx context) : base(context.Device.System.FsServer) { - var applicationClient = context.Device.System.LibHacHorizonManager.ApplicationClient; + HorizonClient applicationClient = context.Device.System.LibHacHorizonManager.ApplicationClient; _baseFileSystemProxy = applicationClient.Fs.Impl.GetFileSystemProxyServiceObject(); } @@ -106,8 +109,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs { BisPartitionId bisPartitionId = (BisPartitionId)context.RequestData.ReadInt32(); - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - using var fileSystem = new SharedRef(); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenBisFileSystem(ref fileSystem.Ref, in path, bisPartitionId); if (result.IsFailure()) @@ -125,7 +128,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenBisStorage(ServiceCtx context) { BisPartitionId bisPartitionId = (BisPartitionId)context.RequestData.ReadInt32(); - using var storage = new SharedRef(); + using SharedRef storage = new(); Result result = _baseFileSystemProxy.Get.OpenBisStorage(ref storage.Ref, bisPartitionId); if (result.IsFailure()) @@ -149,7 +152,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSdCardFileSystem() -> object public ResultCode OpenSdCardFileSystem(ServiceCtx context) { - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSdCardFileSystem(ref fileSystem.Ref); if (result.IsFailure()) @@ -257,7 +260,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { GameCardHandle handle = context.RequestData.ReadUInt32(); GameCardPartitionRaw partitionId = (GameCardPartitionRaw)context.RequestData.ReadInt32(); - using var storage = new SharedRef(); + using SharedRef storage = new(); Result result = _baseFileSystemProxy.Get.OpenGameCardStorage(ref storage.Ref, handle, partitionId); if (result.IsFailure()) @@ -276,7 +279,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { GameCardHandle handle = context.RequestData.ReadUInt32(); GameCardPartition partitionId = (GameCardPartition)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenGameCardFileSystem(ref fileSystem.Ref, handle, partitionId); if (result.IsFailure()) @@ -357,7 +360,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataFileSystem(ref fileSystem.Ref, spaceId, in attribute); if (result.IsFailure()) @@ -376,7 +379,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataFileSystemBySystemSaveDataId(ref fileSystem.Ref, spaceId, in attribute); if (result.IsFailure()) @@ -395,7 +398,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenReadOnlySaveDataFileSystem(ref fileSystem.Ref, spaceId, in attribute); if (result.IsFailure()) @@ -466,7 +469,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSaveDataInfoReader() -> object public ResultCode OpenSaveDataInfoReader(ServiceCtx context) { - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReader(ref infoReader.Ref); if (result.IsFailure()) @@ -484,7 +487,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenSaveDataInfoReaderBySaveDataSpaceId(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadByte(); - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReaderBySaveDataSpaceId(ref infoReader.Ref, spaceId); if (result.IsFailure()) @@ -501,7 +504,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSaveDataInfoReaderOnlyCacheStorage() -> object public ResultCode OpenSaveDataInfoReaderOnlyCacheStorage(ServiceCtx context) { - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReaderOnlyCacheStorage(ref infoReader.Ref); if (result.IsFailure()) @@ -520,7 +523,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); ulong saveDataId = context.RequestData.ReadUInt64(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInternalStorageFileSystem(ref fileSystem.Ref, spaceId, saveDataId); if (result.IsFailure()) @@ -567,7 +570,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs ulong bufferAddress = context.Request.ReceiveBuff[0].Position; ulong bufferLen = context.Request.ReceiveBuff[0].Size; - using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); + using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseFileSystemProxy.Get.FindSaveDataWithFilter(out long count, new OutBuffer(region.Memory.Span), spaceId, in filter); if (result.IsFailure()) { @@ -584,7 +587,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataFilter filter = context.RequestData.ReadStruct(); - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReaderWithFilter(ref infoReader.Ref, spaceId, in filter); if (result.IsFailure()) @@ -661,7 +664,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt32(); SaveDataMetaType metaType = (SaveDataMetaType)context.RequestData.ReadInt32(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var file = new SharedRef(); + using SharedRef file = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataMetaFile(ref file.Ref, spaceId, in attribute, metaType); if (result.IsFailure()) @@ -699,7 +702,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenImageDirectoryFileSystem(ServiceCtx context) { ImageDirectoryId directoryId = (ImageDirectoryId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenImageDirectoryFileSystem(ref fileSystem.Ref, directoryId); if (result.IsFailure()) @@ -716,7 +719,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenBaseFileSystem(ServiceCtx context) { BaseFileSystemId fileSystemId = (BaseFileSystemId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenBaseFileSystem(ref fileSystem.Ref, fileSystemId); if (result.IsFailure()) @@ -733,7 +736,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenContentStorageFileSystem(ServiceCtx context) { ContentStorageId contentStorageId = (ContentStorageId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenContentStorageFileSystem(ref fileSystem.Ref, contentStorageId); if (result.IsFailure()) @@ -750,24 +753,16 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenCloudBackupWorkStorageFileSystem(ServiceCtx context) { CloudBackupWorkStorageId storageId = (CloudBackupWorkStorageId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); - - Result result = _baseFileSystemProxy.Get.OpenCloudBackupWorkStorageFileSystem(ref fileSystem.Ref, storageId); - if (result.IsFailure()) - { - return (ResultCode)result.Value; - } - - MakeObject(context, new FileSystemProxy.IFileSystem(ref fileSystem.Ref)); - - return ResultCode.Success; + + Logger.Stub?.PrintStub(LogClass.ServiceFs, new { storageId }); + throw new NotImplementedException(); // reimplementing behavior from LibHac 0.19.0 } [CommandCmif(130)] public ResultCode OpenCustomStorageFileSystem(ServiceCtx context) { CustomStorageId customStorageId = (CustomStorageId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenCustomStorageFileSystem(ref fileSystem.Ref, customStorageId); if (result.IsFailure()) @@ -784,9 +779,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenDataStorageByCurrentProcess() -> object dataStorage public ResultCode OpenDataStorageByCurrentProcess(ServiceCtx context) { - var storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -809,9 +804,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs { Logger.Info?.Print(LogClass.Loader, $"Opened AddOnContent Data TitleID={titleId:X16}"); - var storage = context.Device.FileSystem.ModLoader.ApplyRomFsMods(titleId, aocStorage); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.ModLoader.ApplyRomFsMods(titleId, aocStorage); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -845,8 +840,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs LibHac.Fs.IStorage ncaStorage = new LocalStorage(ncaPath, FileAccess.Read, FileMode.Open); Nca nca = new(context.Device.System.KeySet, ncaStorage); LibHac.Fs.IStorage romfsStorage = nca.OpenStorage(NcaSectionType.Data, context.Device.System.FsIntegrityCheckLevel); - using var sharedStorage = new SharedRef(romfsStorage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + using SharedRef sharedStorage = new(romfsStorage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); } @@ -875,9 +870,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenPatchDataStorageByCurrentProcess() -> object public ResultCode OpenPatchDataStorageByCurrentProcess(ServiceCtx context) { - var storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -895,9 +890,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs throw new NotImplementedException($"Accessing storage from other programs is not supported (program index = {programIndex})."); } - var storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -908,7 +903,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenDataStorageByCurrentProcess() -> object dataStorage public ResultCode OpenDeviceOperator(ServiceCtx context) { - using var deviceOperator = new SharedRef(); + using SharedRef deviceOperator = new(); Result result = _baseFileSystemProxy.Get.OpenDeviceOperator(ref deviceOperator.Ref); if (result.IsFailure()) @@ -1023,9 +1018,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(609)] public ResultCode GetRightsIdByPath(ServiceCtx context) { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - Result result = _baseFileSystemProxy.Get.GetRightsIdByPath(out RightsId rightsId, in path); + Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out _, in path, ContentAttributes.None); if (result.IsFailure()) { return (ResultCode)result.Value; @@ -1039,9 +1034,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(610)] public ResultCode GetRightsIdAndKeyGenerationByPath(ServiceCtx context) { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path); + Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path, ContentAttributes.None); if (result.IsFailure()) { return (ResultCode)result.Value; @@ -1236,9 +1231,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode SetBisRootForHost(ServiceCtx context) { BisPartitionId partitionId = (BisPartitionId)context.RequestData.ReadInt32(); - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - - return (ResultCode)_baseFileSystemProxy.Get.SetBisRootForHost(partitionId, in path).Value; + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); + + Logger.Stub?.PrintStub(LogClass.ServiceFs, new { partitionId, path }); + + throw new NotImplementedException(); // reimplementing behavior from LibHac 0.19.0 } [CommandCmif(1001)] @@ -1253,7 +1250,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(1002)] public ResultCode SetSaveDataRootPath(ServiceCtx context) { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); return (ResultCode)_baseFileSystemProxy.Get.SetSaveDataRootPath(in path).Value; } @@ -1307,7 +1304,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(1008)] public ResultCode OpenRegisteredUpdatePartition(ServiceCtx context) { - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenRegisteredUpdatePartition(ref fileSystem.Ref); if (result.IsFailure()) @@ -1417,7 +1414,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenMultiCommitManager() -> object public ResultCode OpenMultiCommitManager(ServiceCtx context) { - using var commitManager = new SharedRef(); + using SharedRef commitManager = new(); Result result = _baseFileSystemProxy.Get.OpenMultiCommitManager(ref commitManager.Ref); if (result.IsFailure()) diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs index 028ab6cfc..4254ba887 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs @@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator NetworkError ConnectPrivate(ConnectPrivateRequest request); ResultCode Reject(DisconnectReason disconnectReason, uint nodeId); NetworkInfo[] Scan(ushort channel, ScanFilter scanFilter); - void SetGameVersion(byte[] versionString); + void SetGameVersion(ReadOnlySpan versionString); void SetStationAcceptPolicy(AcceptPolicy acceptPolicy); void SetAdvertiseData(byte[] data); bool CreateNetwork(CreateAccessPointRequest request, byte[] advertiseData); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs index a896f44ae..e7ba66d8a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs @@ -65,7 +65,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator // TODO: Call nn::arp::GetApplicationControlProperty here when implemented. ApplicationControlProperty controlProperty = context.Device.Processes.ActiveApplication.ApplicationControlProperties; - foreach (var localCommunicationId in controlProperty.LocalCommunicationId.ItemsRo) + foreach (ulong localCommunicationId in controlProperty.LocalCommunicationId) { if (localCommunicationId == localCommunicationIdChecked) { @@ -1105,7 +1105,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator } catch (Exception ex) { - Logger.Error?.Print(LogClass.ServiceLdn, "Could not locate LdnRyu server. Defaulting to stubbed wireless."); + Logger.Error?.Print(LogClass.ServiceLdn, "Could not locate RyuLDN server. Defaulting to stubbed wireless."); Logger.Error?.Print(LogClass.ServiceLdn, ex.Message); NetworkClient = new LdnDisabledClient(); } @@ -1119,7 +1119,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator } // TODO: Call nn::arp::GetApplicationLaunchProperty here when implemented. - NetworkClient.SetGameVersion(context.Device.Processes.ActiveApplication.ApplicationControlProperties.DisplayVersion.Items.ToArray()); + NetworkClient.SetGameVersion(context.Device.Processes.ActiveApplication.ApplicationControlProperties.DisplayVersion); resultCode = ResultCode.Success; diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs index cb9f47359..e7a874895 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs @@ -61,7 +61,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator public void SetAdvertiseData(byte[] data) { } - public void SetGameVersion(byte[] versionString) { } + public void SetGameVersion(ReadOnlySpan versionString) { } public void SetStationAcceptPolicy(AcceptPolicy acceptPolicy) { } diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs index 40697d122..50cf3116c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs @@ -85,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm _lanDiscovery.SetAdvertiseData(data); } - public void SetGameVersion(byte[] versionString) + public void SetGameVersion(ReadOnlySpan versionString) { // NOTE: This method is not implemented in ldn_mitm Logger.Stub?.PrintMsg(LogClass.ServiceLdn, "LdnMitmClient SetGameVersion"); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs index 054f38794..ed0bafbef 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs @@ -346,9 +346,9 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu } } - public void SetGameVersion(byte[] versionString) + public void SetGameVersion(ReadOnlySpan versionString) { - _gameVersion = versionString; + _gameVersion = versionString.ToArray(); if (_gameVersion.Length < 0x10) { diff --git a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs index 9b026a1c3..c6e89b417 100644 --- a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs @@ -55,7 +55,13 @@ namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory _titleId = titleId; // TODO: Call nn::arp::GetApplicationControlProperty here when implemented, if it return ResultCode.Success we assign fields. - _ratingAge = Array.ConvertAll(context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge.ItemsRo.ToArray(), Convert.ToInt32); + _ratingAge = new int[context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge.Length]; + + for (int i = 0; i < _ratingAge.Length; i++) + { + _ratingAge[i] = Convert.ToInt32(context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge[i]); + } + _parentalControlFlag = context.Device.Processes.ActiveApplication.ApplicationControlProperties.ParentalControlFlag; } } diff --git a/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs b/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs index 516261595..74729c70a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs @@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService // Check if input title ids are in the whitelist. foreach (ulong titleId in titleIds) { - if (!context.Device.Processes.ActiveApplication.ApplicationControlProperties.PlayLogQueryableApplicationId.ItemsRo.Contains(titleId)) + if (!context.Device.Processes.ActiveApplication.ApplicationControlProperties.PlayLogQueryableApplicationId.AsReadOnlySpan().Contains(titleId)) { return (ResultCode)Am.ResultCode.ObjectInvalid; } diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs index 06e0e89f8..f576945eb 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs @@ -90,7 +90,13 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions if (string.IsNullOrWhiteSpace(programName)) { - programName = Array.Find(nacpData.Value.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + foreach (ApplicationControlProperty.ApplicationTitle appTitle in nacpData.Value.Title) + { + if (appTitle.Name[0] != 0) + continue; + + programName = appTitle.NameString.ToString(); + } } } diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs index 798f574ab..002926fc9 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs @@ -177,7 +177,13 @@ namespace Ryujinx.HLE.Loaders.Processes if (string.IsNullOrWhiteSpace(programName)) { - programName = Array.Find(nacpData.Value.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in nacpData.Value.Title) + { + if (nacpTitles.Name[0] != 0) + continue; + + programName = nacpTitles.NameString.ToString(); + } } if (nacpData.Value.PresenceGroupId != 0) diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs index 5874c420d..5729052e8 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs @@ -179,7 +179,7 @@ namespace Ryujinx.HLE.Loaders.Processes KProcess process = new(context); - var processContextFactory = new ArmProcessContextFactory( + ArmProcessContextFactory processContextFactory = new( context.Device.System.TickSource, context.Device.Gpu, string.Empty, @@ -236,7 +236,7 @@ namespace Ryujinx.HLE.Loaders.Processes { context.Device.System.ServiceTable.WaitServicesReady(); - LibHac.Result resultCode = metaLoader.GetNpdm(out var npdm); + LibHac.Result resultCode = metaLoader.GetNpdm(out LibHac.Loader.Npdm npdm); if (resultCode.IsFailure()) { @@ -245,22 +245,22 @@ namespace Ryujinx.HLE.Loaders.Processes return ProcessResult.Failed; } - ref readonly var meta = ref npdm.Meta; + ref readonly Meta meta = ref npdm.Meta; ulong argsStart = 0; uint argsSize = 0; ulong codeStart = ((meta.Flags & 1) != 0 ? 0x8000000UL : 0x200000UL) + CodeStartOffset; uint codeSize = 0; - var buildIds = new string[executables.Length]; + string[] buildIds = new string[executables.Length]; for (int i = 0; i < executables.Length; i++) { buildIds[i] = (executables[i] switch { - NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()), - NroExecutable nro => Convert.ToHexString(nro.Header.BuildId), - _ => "", + NsoExecutable nso => Convert.ToHexString(nso.BuildId), + NroExecutable nro => Convert.ToHexString(nro.Header.BuildId), + _ => string.Empty }).ToUpper(); } @@ -374,7 +374,7 @@ namespace Ryujinx.HLE.Loaders.Processes displayVersion = device.System.ContentManager.GetCurrentFirmwareVersion()?.VersionString ?? string.Empty; } - var processContextFactory = new ArmProcessContextFactory( + ArmProcessContextFactory processContextFactory = new( context.Device.System.TickSource, context.Device.Gpu, $"{programId:x16}", diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs index 1804d045c..d9fa0b3ca 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs @@ -59,7 +59,13 @@ namespace Ryujinx.HLE.Loaders.Processes if (string.IsNullOrWhiteSpace(Name)) { - Name = Array.Find(ApplicationControlProperties.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + foreach (ApplicationControlProperty.ApplicationTitle appTitle in ApplicationControlProperties.Title) + { + if (appTitle.Name[0] != 0) + continue; + + Name = appTitle.NameString.ToString(); + } } DisplayVersion = ApplicationControlProperties.DisplayVersionString.ToString(); diff --git a/src/Ryujinx.UI.Common/App/ApplicationData.cs b/src/Ryujinx.UI.Common/App/ApplicationData.cs index 56cd068c5..837d24c30 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationData.cs +++ b/src/Ryujinx.UI.Common/App/ApplicationData.cs @@ -162,7 +162,7 @@ namespace Ryujinx.UI.App.Common NsoReader reader = new(); reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure(); - return Convert.ToHexString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", "").ToUpper()[..16]; + return Convert.ToHexString(reader.Header.ModuleId).Replace("-", "").ToUpper()[..16]; } } } diff --git a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs index 7be48fc81..45ce09905 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs +++ b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs @@ -1343,7 +1343,7 @@ namespace Ryujinx.UI.App.Common { _ = Enum.TryParse(DesiredLanguage.ToString(), out TitleLanguage desiredTitleLanguage); - if (controlData.Title.ItemsRo.Length > (int)desiredTitleLanguage) + if (controlData.Title.Length > (int)desiredTitleLanguage) { data.Name = controlData.Title[(int)desiredTitleLanguage].NameString.ToString(); data.Developer = controlData.Title[(int)desiredTitleLanguage].PublisherString.ToString(); @@ -1356,7 +1356,7 @@ namespace Ryujinx.UI.App.Common if (string.IsNullOrWhiteSpace(data.Name)) { - foreach (ref readonly var controlTitle in controlData.Title.ItemsRo) + foreach (ref readonly var controlTitle in controlData.Title) { if (!controlTitle.NameString.IsEmpty()) { @@ -1369,7 +1369,7 @@ namespace Ryujinx.UI.App.Common if (string.IsNullOrWhiteSpace(data.Developer)) { - foreach (ref readonly var controlTitle in controlData.Title.ItemsRo) + foreach (ref readonly var controlTitle in controlData.Title) { if (!controlTitle.PublisherString.IsEmpty()) { diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index cfaca7818..2241f5985 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -193,7 +193,7 @@ namespace Ryujinx.Ava.UI.Windows { if (application.ControlHolder.ByteSpan.Length > 0 && ViewModel.LastLdnGameData != null) { - IEnumerable ldnGameData = ViewModel.LastLdnGameData.Where(game => application.ControlHolder.Value.LocalCommunicationId.Items.Contains(Convert.ToUInt64(game.TitleId, 16))); + IEnumerable ldnGameData = ViewModel.LastLdnGameData.Where(game => application.ControlHolder.Value.LocalCommunicationId.AsSpan().Contains(Convert.ToUInt64(game.TitleId, 16))); application.PlayerCount = ldnGameData.Sum(game => game.PlayerCount); application.GameCount = ldnGameData.Count();