|
|
@@ -1,47 +1,68 @@
|
|
|
-using Ryujinx.HLE.HOS.Services.Arp;
|
|
|
+using LibHac;
|
|
|
+using LibHac.Bcat;
|
|
|
using System;
|
|
|
-using System.Text;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
|
|
|
namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
|
|
{
|
|
|
- class IDeliveryCacheStorageService : IpcService
|
|
|
+ class IDeliveryCacheStorageService : IpcService, IDisposable
|
|
|
{
|
|
|
- private const int DeliveryCacheDirectoriesLimit = 100;
|
|
|
- private const int DeliveryCacheDirectoryNameLength = 32;
|
|
|
+ private LibHac.Bcat.Detail.Ipc.IDeliveryCacheStorageService _base;
|
|
|
|
|
|
- private string[] _deliveryCacheDirectories = new string[0];
|
|
|
+ public IDeliveryCacheStorageService(ServiceCtx context, LibHac.Bcat.Detail.Ipc.IDeliveryCacheStorageService baseService)
|
|
|
+ {
|
|
|
+ _base = baseService;
|
|
|
+ }
|
|
|
|
|
|
- public IDeliveryCacheStorageService(ServiceCtx context, ApplicationLaunchProperty applicationLaunchProperty)
|
|
|
+ [Command(0)]
|
|
|
+ // CreateFileService() -> object<nn::bcat::detail::ipc::IDeliveryCacheFileService>
|
|
|
+ public ResultCode CreateFileService(ServiceCtx context)
|
|
|
{
|
|
|
- // TODO: Read directories.meta file from the save data (loaded in IServiceCreator) in _deliveryCacheDirectories.
|
|
|
+ Result result = _base.CreateFileService(out LibHac.Bcat.Detail.Ipc.IDeliveryCacheFileService service);
|
|
|
+
|
|
|
+ if (result.IsSuccess())
|
|
|
+ {
|
|
|
+ MakeObject(context, new IDeliveryCacheFileService(service));
|
|
|
+ }
|
|
|
+
|
|
|
+ return (ResultCode)result.Value;
|
|
|
+ }
|
|
|
+
|
|
|
+ [Command(1)]
|
|
|
+ // CreateDirectoryService() -> object<nn::bcat::detail::ipc::IDeliveryCacheDirectoryService>
|
|
|
+ public ResultCode CreateDirectoryService(ServiceCtx context)
|
|
|
+ {
|
|
|
+ Result result = _base.CreateDirectoryService(out LibHac.Bcat.Detail.Ipc.IDeliveryCacheDirectoryService service);
|
|
|
+
|
|
|
+ if (result.IsSuccess())
|
|
|
+ {
|
|
|
+ MakeObject(context, new IDeliveryCacheDirectoryService(service));
|
|
|
+ }
|
|
|
+
|
|
|
+ return (ResultCode)result.Value;
|
|
|
}
|
|
|
|
|
|
[Command(10)]
|
|
|
// EnumerateDeliveryCacheDirectory() -> (u32, buffer<nn::bcat::DirectoryName, 6>)
|
|
|
public ResultCode EnumerateDeliveryCacheDirectory(ServiceCtx context)
|
|
|
{
|
|
|
- long outputPosition = context.Request.ReceiveBuff[0].Position;
|
|
|
- long outputSize = context.Request.ReceiveBuff[0].Size;
|
|
|
+ long position = context.Request.ReceiveBuff[0].Position;
|
|
|
+ long size = context.Request.ReceiveBuff[0].Size;
|
|
|
|
|
|
- for (int index = 0; index < _deliveryCacheDirectories.Length; index++)
|
|
|
- {
|
|
|
- if (index == DeliveryCacheDirectoriesLimit - 1)
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
+ byte[] data = new byte[size];
|
|
|
|
|
|
- byte[] directoryNameBuffer = Encoding.ASCII.GetBytes(_deliveryCacheDirectories[index]);
|
|
|
+ Result result = _base.EnumerateDeliveryCacheDirectory(out int count, MemoryMarshal.Cast<byte, DirectoryName>(data));
|
|
|
|
|
|
- Array.Resize(ref directoryNameBuffer, DeliveryCacheDirectoryNameLength);
|
|
|
+ context.Memory.WriteBytes(position, data);
|
|
|
|
|
|
- directoryNameBuffer[DeliveryCacheDirectoryNameLength - 1] = 0x00;
|
|
|
-
|
|
|
- context.Memory.WriteBytes(outputPosition + index * DeliveryCacheDirectoryNameLength, directoryNameBuffer);
|
|
|
- }
|
|
|
+ context.ResponseData.Write(count);
|
|
|
|
|
|
- context.ResponseData.Write(_deliveryCacheDirectories.Length);
|
|
|
+ return (ResultCode)result.Value;
|
|
|
+ }
|
|
|
|
|
|
- return ResultCode.Success;
|
|
|
+ public void Dispose()
|
|
|
+ {
|
|
|
+ _base?.Dispose();
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+}
|