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); } [CommandHipc(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; } [CommandHipc(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; } [CommandHipc(10)] // EnumerateDeliveryCacheDirectory() -> (u32, buffer) public ResultCode EnumerateDeliveryCacheDirectory(ServiceCtx context) { ulong position = context.Request.ReceiveBuff[0].Position; ulong size = context.Request.ReceiveBuff[0].Size; byte[] data = new byte[size]; Result result = _base.Get.EnumerateDeliveryCacheDirectory(out int count, MemoryMarshal.Cast(data)); context.Memory.Write(position, data); context.ResponseData.Write(count); return (ResultCode)result.Value; } protected override void Dispose(bool isDisposing) { if (isDisposing) { _base.Destroy(); } } } }