Implement basic support of SystemSaveData and Cleanup IFileSystemProxy (#767)
* Implement basic support of SystemSaveData and Cleanup IFileSystemProxy - Implement `OpenSystemSaveData` as a `IFileSystem` in `SaveHelper`: On real device, system saves data are stored encrypted, and we can't create an empty system save data for now. That's why if a user put his own dump of system save in `RyuFs\nand\system\save\`, we extract content in associated folder and open it as a `IFileSystem`. If the system save data don't exist, a folder is created. - Cleanup `IFileSystemProxy` by adding a Helper class. - Implement `GetSavePath` in `VirtualFileSystem` and remove `GetGameSavePath` in `SaveHelper`. * remove the forgotten I * Fix align
This commit is contained in:
parent
9afb8ad485
commit
1ff89d6482
6 changed files with 280 additions and 195 deletions
|
@ -1,45 +1,44 @@
|
|||
using Ryujinx.HLE.HOS;
|
||||
using LibHac.Fs;
|
||||
using Ryujinx.HLE.HOS;
|
||||
using System.IO;
|
||||
|
||||
using static Ryujinx.HLE.FileSystem.VirtualFileSystem;
|
||||
|
||||
namespace Ryujinx.HLE.FileSystem
|
||||
{
|
||||
static class SaveHelper
|
||||
{
|
||||
public static string GetSavePath(SaveInfo saveMetaData, ServiceCtx context)
|
||||
public static IFileSystem OpenSystemSaveData(ServiceCtx context, ulong saveId)
|
||||
{
|
||||
string baseSavePath = NandPath;
|
||||
ulong currentTitleId = saveMetaData.TitleId;
|
||||
SaveInfo saveInfo = new SaveInfo(0, (long)saveId, SaveDataType.SystemSaveData, SaveSpaceId.NandSystem);
|
||||
string savePath = context.Device.FileSystem.GetSavePath(context, saveInfo, false);
|
||||
|
||||
switch (saveMetaData.SaveSpaceId)
|
||||
if (File.Exists(savePath))
|
||||
{
|
||||
case SaveSpaceId.NandUser:
|
||||
baseSavePath = UserNandPath;
|
||||
break;
|
||||
case SaveSpaceId.NandSystem:
|
||||
baseSavePath = SystemNandPath;
|
||||
break;
|
||||
case SaveSpaceId.SdCard:
|
||||
baseSavePath = Path.Combine(SdCardPath, "Nintendo");
|
||||
break;
|
||||
string tempDirectoryPath = $"{savePath}_temp";
|
||||
|
||||
Directory.CreateDirectory(tempDirectoryPath);
|
||||
|
||||
IFileSystem outputFolder = new LocalFileSystem(tempDirectoryPath);
|
||||
|
||||
using (LocalStorage systemSaveData = new LocalStorage(savePath, FileAccess.Read, FileMode.Open))
|
||||
{
|
||||
IFileSystem saveFs = new LibHac.Fs.Save.SaveDataFileSystem(context.Device.System.KeySet, systemSaveData, IntegrityCheckLevel.None, false);
|
||||
|
||||
saveFs.CopyFileSystem(outputFolder);
|
||||
}
|
||||
|
||||
File.Delete(savePath);
|
||||
|
||||
Directory.Move(tempDirectoryPath, savePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Directory.Exists(savePath))
|
||||
{
|
||||
Directory.CreateDirectory(savePath);
|
||||
}
|
||||
}
|
||||
|
||||
baseSavePath = Path.Combine(baseSavePath, "save");
|
||||
|
||||
if (saveMetaData.TitleId == 0 && saveMetaData.SaveDataType == SaveDataType.SaveData)
|
||||
{
|
||||
currentTitleId = context.Process.TitleId;
|
||||
}
|
||||
|
||||
string saveAccount = saveMetaData.UserId.IsNull ? "savecommon" : saveMetaData.UserId.ToString();
|
||||
|
||||
string savePath = Path.Combine(baseSavePath,
|
||||
saveMetaData.SaveId.ToString("x16"),
|
||||
saveAccount,
|
||||
saveMetaData.SaveDataType == SaveDataType.SaveData ? currentTitleId.ToString("x16") : string.Empty);
|
||||
|
||||
return savePath;
|
||||
return new LocalFileSystem(savePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue