aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs
diff options
context:
space:
mode:
authorMary <1760003+Thog@users.noreply.github.com>2021-07-13 16:48:54 +0200
committerMary <1760003+Thog@users.noreply.github.com>2021-07-13 16:48:54 +0200
commit208ba1dde2b9a4d31446ace2bba8f0d641d2e300 (patch)
treec7478e7eb87061400bab37daf4f2f69cf387d9f2 /Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs
parent997380d48cb3b74e2438cee7fc3b017d6b59b714 (diff)
Revert LibHac update
Users are facing save destruction on failing extra data update apparently
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs102
1 files changed, 57 insertions, 45 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs b/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs
index 682283b0..0bf15a7f 100644
--- a/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs
@@ -1,9 +1,7 @@
using LibHac;
using LibHac.Common;
using LibHac.Fs;
-using LibHac.Fs.Fsa;
using LibHac.Fs.Shim;
-using LibHac.Ncm;
using Ryujinx.HLE.HOS.Services.Mii.Types;
using System.Runtime.CompilerServices;
@@ -16,6 +14,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii
private const ulong DatabaseTestSaveDataId = 0x8000000000000031;
private const ulong DatabaseSaveDataId = 0x8000000000000030;
+ private const ulong NsTitleId = 0x010000000000001F;
+ private const ulong SdbTitleId = 0x0100000000000039;
private static U8String DatabasePath = new U8String("mii:/MiiDatabase.dat");
private static U8String MountName = new U8String("mii");
@@ -23,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii
private NintendoFigurineDatabase _database;
private bool _isDirty;
- private HorizonClient _horizonClient;
+ private FileSystemClient _filesystemClient;
protected ulong UpdateCounter { get; private set; }
@@ -94,62 +94,74 @@ namespace Ryujinx.HLE.HOS.Services.Mii
return virtualIndex;
}
- public void InitializeDatabase(HorizonClient horizonClient)
+ public void InitializeDatabase(Switch device)
{
- _horizonClient = horizonClient;
+ _filesystemClient = device.FileSystem.FsClient;
// Ensure we have valid data in the database
_database.Format();
+ // TODO: Unmount is currently not implemented properly at dispose, implement that and decrement MountCounter.
+ MountCounter = 0;
+
MountSave();
}
private Result MountSave()
{
- if (MountCounter != 0)
- {
- MountCounter++;
- return Result.Success;
- }
-
- ulong saveDataId = IsTestModeEnabled ? DatabaseTestSaveDataId : DatabaseSaveDataId;
-
- Result result = _horizonClient.Fs.MountSystemSaveData(MountName, SaveDataSpaceId.System, saveDataId);
+ Result result = Result.Success;
- if (result.IsFailure())
+ if (MountCounter == 0)
{
- if (!ResultFs.TargetNotFound.Includes(result))
- return result;
+ ulong targetSaveDataId;
+ ulong targetTitleId;
if (IsTestModeEnabled)
{
- result = _horizonClient.Fs.CreateSystemSaveData(saveDataId, 0x10000, 0x10000,
- SaveDataFlags.KeepAfterResettingSystemSaveDataWithoutUserSaveData);
- if (result.IsFailure()) return result;
+ targetSaveDataId = DatabaseTestSaveDataId;
+ targetTitleId = SdbTitleId;
}
else
{
- result = _horizonClient.Fs.CreateSystemSaveData(saveDataId, SystemProgramId.Ns.Value, 0x10000,
- 0x10000, SaveDataFlags.KeepAfterResettingSystemSaveDataWithoutUserSaveData);
- if (result.IsFailure()) return result;
+ targetSaveDataId = DatabaseSaveDataId;
+
+ // Nintendo use NS TitleID when creating the production save even on sdb, let's follow that behaviour.
+ targetTitleId = NsTitleId;
}
- result = _horizonClient.Fs.MountSystemSaveData(MountName, SaveDataSpaceId.System, saveDataId);
- if (result.IsFailure()) return result;
- }
+ U8Span mountName = new U8Span(MountName);
- if (result == Result.Success)
- {
- MountCounter++;
+ result = _filesystemClient.MountSystemSaveData(mountName, SaveDataSpaceId.System, targetSaveDataId);
+
+ if (result.IsFailure())
+ {
+ if (ResultFs.TargetNotFound.Includes(result))
+ {
+ // TODO: We're currently always specifying the owner ID because FS doesn't have a way of
+ // knowing which process called it
+ result = _filesystemClient.CreateSystemSaveData(targetSaveDataId, targetTitleId, 0x10000,
+ 0x10000, SaveDataFlags.KeepAfterResettingSystemSaveDataWithoutUserSaveData);
+ if (result.IsFailure()) return result;
+
+ result = _filesystemClient.MountSystemSaveData(mountName, SaveDataSpaceId.System, targetSaveDataId);
+ if (result.IsFailure()) return result;
+ }
+ }
+
+ if (result == Result.Success)
+ {
+ MountCounter++;
+ }
}
+
return result;
}
public ResultCode DeleteFile()
{
- ResultCode result = (ResultCode)_horizonClient.Fs.DeleteFile(DatabasePath).Value;
+ ResultCode result = (ResultCode)_filesystemClient.DeleteFile(DatabasePath).Value;
- _horizonClient.Fs.Commit(MountName);
+ _filesystemClient.Commit(MountName);
return result;
}
@@ -167,17 +179,17 @@ namespace Ryujinx.HLE.HOS.Services.Mii
ResetDatabase();
- Result result = _horizonClient.Fs.OpenFile(out FileHandle handle, DatabasePath, OpenMode.Read);
+ Result result = _filesystemClient.OpenFile(out FileHandle handle, DatabasePath, OpenMode.Read);
if (result.IsSuccess())
{
- result = _horizonClient.Fs.GetFileSize(out long fileSize, handle);
+ result = _filesystemClient.GetFileSize(out long fileSize, handle);
if (result.IsSuccess())
{
if (fileSize == Unsafe.SizeOf<NintendoFigurineDatabase>())
{
- result = _horizonClient.Fs.ReadFile(handle, 0, _database.AsSpan());
+ result = _filesystemClient.ReadFile(handle, 0, _database.AsSpan());
if (result.IsSuccess())
{
@@ -199,7 +211,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii
}
}
- _horizonClient.Fs.CloseFile(handle);
+ _filesystemClient.CloseFile(handle);
return (ResultCode)result.Value;
}
@@ -213,32 +225,32 @@ namespace Ryujinx.HLE.HOS.Services.Mii
private Result ForceSaveDatabase()
{
- Result result = _horizonClient.Fs.CreateFile(DatabasePath, Unsafe.SizeOf<NintendoFigurineDatabase>());
+ Result result = _filesystemClient.CreateFile(DatabasePath, Unsafe.SizeOf<NintendoFigurineDatabase>());
if (result.IsSuccess() || ResultFs.PathAlreadyExists.Includes(result))
{
- result = _horizonClient.Fs.OpenFile(out FileHandle handle, DatabasePath, OpenMode.Write);
+ result = _filesystemClient.OpenFile(out FileHandle handle, DatabasePath, OpenMode.Write);
if (result.IsSuccess())
{
- result = _horizonClient.Fs.GetFileSize(out long fileSize, handle);
+ result = _filesystemClient.GetFileSize(out long fileSize, handle);
if (result.IsSuccess())
{
// If the size doesn't match, recreate the file
if (fileSize != Unsafe.SizeOf<NintendoFigurineDatabase>())
{
- _horizonClient.Fs.CloseFile(handle);
+ _filesystemClient.CloseFile(handle);
- result = _horizonClient.Fs.DeleteFile(DatabasePath);
+ result = _filesystemClient.DeleteFile(DatabasePath);
if (result.IsSuccess())
{
- result = _horizonClient.Fs.CreateFile(DatabasePath, Unsafe.SizeOf<NintendoFigurineDatabase>());
+ result = _filesystemClient.CreateFile(DatabasePath, Unsafe.SizeOf<NintendoFigurineDatabase>());
if (result.IsSuccess())
{
- result = _horizonClient.Fs.OpenFile(out handle, DatabasePath, OpenMode.Write);
+ result = _filesystemClient.OpenFile(out handle, DatabasePath, OpenMode.Write);
}
}
@@ -248,10 +260,10 @@ namespace Ryujinx.HLE.HOS.Services.Mii
}
}
- result = _horizonClient.Fs.WriteFile(handle, 0, _database.AsReadOnlySpan(), WriteOption.Flush);
+ result = _filesystemClient.WriteFile(handle, 0, _database.AsReadOnlySpan(), WriteOption.Flush);
}
- _horizonClient.Fs.CloseFile(handle);
+ _filesystemClient.CloseFile(handle);
}
}
@@ -259,7 +271,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii
{
_isDirty = false;
- result = _horizonClient.Fs.Commit(MountName);
+ result = _filesystemClient.Commit(MountName);
}
return result;