aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs
diff options
context:
space:
mode:
authorAlex Barney <thealexbarney@gmail.com>2020-01-05 04:49:44 -0700
committerThog <me@thog.eu>2020-01-05 12:49:44 +0100
commit63b24b4af2804f173764c98586a19c39db04ad4d (patch)
tree7994f00e4bc06edc430004a7caa1bdf0231b2668 /Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs
parente0e12b1672e49ab5810bf88bf8274990605ed67a (diff)
Rename "RyuFs" directory to "Ryujinx" and use the same savedata system the Switch uses (#801)
* Use savedata FS commands from LibHac * Add EnsureSaveData. Use ApplicationControlProperty struct * Add a function to migrate to the new directory layout * LibHac update * Change backup structure * Don't create UI files in the save path * Update RyuFs paths * Add GetProgramIndexForAccessLog Ryujinx only runs one program at a time, so always return values reflecting that * Load control NCA when loading from an NSP * Skip over UI stats when exiting * Set TitleName and TitleId in more cases. Fix TitleID naming style * Completely comment out GUI play stats code * rebase * Update LibHac * Update LibHac * Revert UI changes * Do migration automatically at startup * Rename RyuFs directory to Ryujinx * Update RyuFs text * Store savedata paths in the GUI * Make "Open Save Directory" work * Use a dummy NACP in EnsureSaveData if one is not loaded * Remove manual migration button * Respond to feedback * Don't read the installer config to get a version string * Delete nuget.config * Exclude 'sdcard' and 'bis' during migration Co-authored-by: Thog <thog@protonmail.com>
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs40
1 files changed, 33 insertions, 7 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs b/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs
index 464d0b47..904264aa 100644
--- a/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs
+++ b/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs
@@ -1,13 +1,19 @@
+using LibHac;
+using LibHac.Account;
+using LibHac.Common;
+using LibHac.Ncm;
+using LibHac.Ns;
+using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Threading;
-using Ryujinx.HLE.HOS.Services.Am.AppletAE;
using Ryujinx.HLE.HOS.Services.Am.AppletAE.Storage;
using Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService;
-using Ryujinx.HLE.Utilities;
using System;
+using static LibHac.Fs.ApplicationSaveDataManagement;
+
namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy
{
class IApplicationFunctions : IpcService
@@ -24,7 +30,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
public ResultCode PopLaunchParameter(ServiceCtx context)
{
// Only the first 0x18 bytes of the Data seems to be actually used.
- MakeObject(context, new IStorage(StorageHelper.MakeLaunchParams()));
+ MakeObject(context, new AppletAE.IStorage(StorageHelper.MakeLaunchParams()));
return ResultCode.Success;
}
@@ -33,13 +39,33 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
// EnsureSaveData(nn::account::Uid) -> u64
public ResultCode EnsureSaveData(ServiceCtx context)
{
- UInt128 userId = new UInt128(context.RequestData.ReadBytes(0x10));
+ Uid userId = context.RequestData.ReadStruct<Uid>();
+ TitleId titleId = new TitleId(context.Process.TitleId);
- context.ResponseData.Write(0L);
+ BlitStruct<ApplicationControlProperty> controlHolder = context.Device.System.ControlData;
- Logger.PrintStub(LogClass.ServiceAm, new { userId });
+ ref ApplicationControlProperty control = ref controlHolder.Value;
- return ResultCode.Success;
+ if (Util.IsEmpty(controlHolder.ByteSpan))
+ {
+ // If the current application doesn't have a loaded control property, create a dummy one
+ // and set the savedata sizes so a user savedata will be created.
+ control = ref new BlitStruct<ApplicationControlProperty>(1).Value;
+
+ // The set sizes don't actually matter as long as they're non-zero because we use directory savedata.
+ control.UserAccountSaveDataSize = 0x4000;
+ control.UserAccountSaveDataJournalSize = 0x4000;
+
+ Logger.PrintWarning(LogClass.ServiceAm,
+ "No control file was found for this game. Using a dummy one instead. This may cause inaccuracies in some games.");
+ }
+
+ Result result = EnsureApplicationSaveData(context.Device.System.FsClient, out long requiredSize, titleId,
+ ref context.Device.System.ControlData.Value, ref userId);
+
+ context.ResponseData.Write(requiredSize);
+
+ return (ResultCode)result.Value;
}
[Command(21)]