From 7ab3fccd4d13bf3ed07a7fa207cfee61b43c56f3 Mon Sep 17 00:00:00 2001 From: Alex Barney Date: Wed, 29 Apr 2020 21:58:19 -0700 Subject: Add BCAT delivery cache support (#1154) * Initial bcat delivery cache support * Use LibHac 0.11.0 * Add option to open the BCAT savedata directory --- .../ServiceCreator/IDeliveryCacheFileService.cs | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheFileService.cs (limited to 'Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheFileService.cs') diff --git a/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheFileService.cs b/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheFileService.cs new file mode 100644 index 00000000..a621283f --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheFileService.cs @@ -0,0 +1,76 @@ +using LibHac; +using LibHac.Bcat; +using Ryujinx.Common; +using System; + +namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator +{ + class IDeliveryCacheFileService : IpcService, IDisposable + { + private LibHac.Bcat.Detail.Ipc.IDeliveryCacheFileService _base; + + public IDeliveryCacheFileService(LibHac.Bcat.Detail.Ipc.IDeliveryCacheFileService baseService) + { + _base = baseService; + } + + [Command(0)] + // Open(nn::bcat::DirectoryName, nn::bcat::FileName) + public ResultCode Open(ServiceCtx context) + { + DirectoryName directoryName = context.RequestData.ReadStruct(); + FileName fileName = context.RequestData.ReadStruct(); + + Result result = _base.Open(ref directoryName, ref fileName); + + return (ResultCode)result.Value; + } + + [Command(1)] + // Read(u64) -> (u64, buffer) + public ResultCode Read(ServiceCtx context) + { + long position = context.Request.ReceiveBuff[0].Position; + long size = context.Request.ReceiveBuff[0].Size; + + long offset = context.RequestData.ReadInt64(); + + byte[] data = new byte[size]; + + Result result = _base.Read(out long bytesRead, offset, data); + + context.Memory.WriteBytes(position, data); + + context.ResponseData.Write(bytesRead); + + return (ResultCode)result.Value; + } + + [Command(2)] + // GetSize() -> u64 + public ResultCode GetSize(ServiceCtx context) + { + Result result = _base.GetSize(out long size); + + context.ResponseData.Write(size); + + return (ResultCode)result.Value; + } + + [Command(3)] + // GetDigest() -> nn::bcat::Digest + public ResultCode GetDigest(ServiceCtx context) + { + Result result = _base.GetDigest(out Digest digest); + + context.ResponseData.WriteStruct(digest); + + return (ResultCode)result.Value; + } + + public void Dispose() + { + _base?.Dispose(); + } + } +} -- cgit v1.2.3