aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Am/AppletOE
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Am/AppletOE')
-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)]