1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
using Ryujinx.Common.Logging;
using Ryujinx.Cpu;
using Ryujinx.HLE.HOS.Services.Caps.Types;
namespace Ryujinx.HLE.HOS.Services.Caps
{
[Service("caps:u")]
class IAlbumApplicationService : IpcService
{
public IAlbumApplicationService(ServiceCtx context) { }
[CommandCmif(32)] // 7.0.0+
// SetShimLibraryVersion(pid, u64, nn::applet::AppletResourceUserId)
public ResultCode SetShimLibraryVersion(ServiceCtx context)
{
return context.Device.System.CaptureManager.SetShimLibraryVersion(context);
}
[CommandCmif(102)]
// GetAlbumFileList0AafeAruidDeprecated(pid, u16 content_type, u64 start_time, u64 end_time, nn::applet::AppletResourceUserId) -> (u64 count, buffer<ApplicationAlbumFileEntry, 0x6>)
public ResultCode GetAlbumFileList0AafeAruidDeprecated(ServiceCtx context)
{
// NOTE: ApplicationAlbumFileEntry size is 0x30.
return GetAlbumFileList(context);
}
[CommandCmif(142)]
// GetAlbumFileList3AaeAruid(pid, u16 content_type, u64 start_time, u64 end_time, nn::applet::AppletResourceUserId) -> (u64 count, buffer<ApplicationAlbumFileEntry, 0x6>)
public ResultCode GetAlbumFileList3AaeAruid(ServiceCtx context)
{
// NOTE: ApplicationAlbumFileEntry size is 0x20.
return GetAlbumFileList(context);
}
private ResultCode GetAlbumFileList(ServiceCtx context)
{
ResultCode resultCode = ResultCode.Success;
ulong count = 0;
ContentType contentType = (ContentType)context.RequestData.ReadUInt16();
ulong startTime = context.RequestData.ReadUInt64();
ulong endTime = context.RequestData.ReadUInt64();
context.RequestData.ReadUInt16(); // Alignment.
ulong appletResourceUserId = context.RequestData.ReadUInt64();
ulong applicationAlbumFileEntryPosition = context.Request.ReceiveBuff[0].Position;
ulong applicationAlbumFileEntrySize = context.Request.ReceiveBuff[0].Size;
MemoryHelper.FillWithZeros(context.Memory, applicationAlbumFileEntryPosition, (int)applicationAlbumFileEntrySize);
if (contentType > ContentType.Unknown || contentType == ContentType.ExtraMovie)
{
resultCode = ResultCode.InvalidContentType;
}
// TODO: Service checks if the pid is present in an internal list and returns ResultCode.BlacklistedPid if it is.
// The list contents needs to be determined.
// Service populate the buffer with a ApplicationAlbumFileEntry related to the pid.
Logger.Stub?.PrintStub(LogClass.ServiceCaps, new { contentType, startTime, endTime, appletResourceUserId });
context.ResponseData.Write(count);
return resultCode;
}
}
}
|