diff options
| author | Alex Barney <thealexbarney@gmail.com> | 2020-04-29 21:58:19 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-30 14:58:19 +1000 |
| commit | 7ab3fccd4d13bf3ed07a7fa207cfee61b43c56f3 (patch) | |
| tree | 744caac5f15b69f1c411c0dc4f491f9f56a57278 /Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheStorageService.cs | |
| parent | 23170da5a0092c2a9d2d5d0b49da5ee1f53637ac (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.cs | 71 |
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 +} |
