aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs
diff options
context:
space:
mode:
authorAlex Barney <thealexbarney@gmail.com>2020-04-29 21:58:19 -0700
committerGitHub <noreply@github.com>2020-04-30 14:58:19 +1000
commit7ab3fccd4d13bf3ed07a7fa207cfee61b43c56f3 (patch)
tree744caac5f15b69f1c411c0dc4f491f9f56a57278 /Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs
parent23170da5a0092c2a9d2d5d0b49da5ee1f53637ac (diff)
Add BCAT delivery cache support (#1154)
* Initial bcat delivery cache support * Use LibHac 0.11.0 * Add option to open the BCAT savedata directory
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs')
-rw-r--r--Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs71
1 files changed, 46 insertions, 25 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs b/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs
index cad44370..344eb54e 100644
--- a/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs
+++ b/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs
@@ -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();
}
}
-} \ No newline at end of file
+}