DeliveryCacheFileService.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using LibHac.Bcat;
  2. using LibHac.Common;
  3. using Ryujinx.Horizon.Common;
  4. using Ryujinx.Horizon.Sdk.Bcat;
  5. using Ryujinx.Horizon.Sdk.Sf;
  6. using Ryujinx.Horizon.Sdk.Sf.Hipc;
  7. using System;
  8. using System.Threading;
  9. namespace Ryujinx.Horizon.Bcat.Ipc
  10. {
  11. partial class DeliveryCacheFileService : IDeliveryCacheFileService, IDisposable
  12. {
  13. private SharedRef<LibHac.Bcat.Impl.Ipc.IDeliveryCacheFileService> _libHacService;
  14. private int _disposalState;
  15. public DeliveryCacheFileService(ref SharedRef<LibHac.Bcat.Impl.Ipc.IDeliveryCacheFileService> libHacService)
  16. {
  17. _libHacService = SharedRef<LibHac.Bcat.Impl.Ipc.IDeliveryCacheFileService>.CreateMove(ref libHacService);
  18. }
  19. [CmifCommand(0)]
  20. public Result Open(DirectoryName directoryName, FileName fileName)
  21. {
  22. return _libHacService.Get.Open(ref directoryName, ref fileName).ToHorizonResult();
  23. }
  24. [CmifCommand(1)]
  25. public Result Read(long offset, out long bytesRead, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<byte> data)
  26. {
  27. return _libHacService.Get.Read(out bytesRead, offset, data).ToHorizonResult();
  28. }
  29. [CmifCommand(2)]
  30. public Result GetSize(out long size)
  31. {
  32. return _libHacService.Get.GetSize(out size).ToHorizonResult();
  33. }
  34. [CmifCommand(3)]
  35. public Result GetDigest(out Digest digest)
  36. {
  37. return _libHacService.Get.GetDigest(out digest).ToHorizonResult();
  38. }
  39. public void Dispose()
  40. {
  41. if (Interlocked.Exchange(ref _disposalState, 1) == 0)
  42. {
  43. _libHacService.Destroy();
  44. }
  45. }
  46. }
  47. }