using LibHac; using LibHac.Bcat; using LibHac.Common; using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator { class IDeliveryCacheStorageService : DisposableIpcService { private SharedRef _base; public IDeliveryCacheStorageService(ServiceCtx context, ref SharedRef baseService) { _base = SharedRef.CreateMove(ref baseService); } [CommandCmif(0)] // CreateFileService() -> object public ResultCode CreateFileService(ServiceCtx context) { using var service = new SharedRef(); Result result = _base.Get.CreateFileService(ref service.Ref); if (result.IsSuccess()) { MakeObject(context, new IDeliveryCacheFileService(ref service.Ref)); } return (ResultCode)result.Value; } [CommandCmif(1)] // CreateDirectoryService() -> object public ResultCode CreateDirectoryService(ServiceCtx context) { using var service = new SharedRef(); Result result = _base.Get.CreateDirectoryService(ref service.Ref); if (result.IsSuccess()) { MakeObject(context, new IDeliveryCacheDirectoryService(ref service.Ref)); } return (ResultCode)result.Value; } [CommandCmif(10)] // EnumerateDeliveryCacheDirectory() -> (u32, buffer) public ResultCode EnumerateDeliveryCacheDirectory(ServiceCtx context) { ulong bufferAddress = context.Request.ReceiveBuff[0].Position; ulong bufferLen = context.Request.ReceiveBuff[0].Size; using (var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true)) { Result result = _base.Get.EnumerateDeliveryCacheDirectory(out int count, MemoryMarshal.Cast(region.Memory.Span)); context.ResponseData.Write(count); return (ResultCode)result.Value; } } protected override void Dispose(bool isDisposing) { if (isDisposing) { _base.Destroy(); } } } }