IDeliveryCacheProgressService.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Ryujinx.Common;
  2. using Ryujinx.Common.Logging;
  3. using Ryujinx.HLE.HOS.Ipc;
  4. using Ryujinx.HLE.HOS.Kernel.Common;
  5. using Ryujinx.HLE.HOS.Kernel.Threading;
  6. using Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator.Types;
  7. using System;
  8. using System.IO;
  9. namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
  10. {
  11. class IDeliveryCacheProgressService : IpcService
  12. {
  13. private KEvent _event;
  14. private int _eventHandle;
  15. public IDeliveryCacheProgressService(ServiceCtx context)
  16. {
  17. _event = new KEvent(context.Device.System.KernelContext);
  18. }
  19. [Command(0)]
  20. // GetEvent() -> handle<copy>
  21. public ResultCode GetEvent(ServiceCtx context)
  22. {
  23. if (_eventHandle == 0)
  24. {
  25. if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out _eventHandle) != KernelResult.Success)
  26. {
  27. throw new InvalidOperationException("Out of handles!");
  28. }
  29. }
  30. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_eventHandle);
  31. Logger.Stub?.PrintStub(LogClass.ServiceBcat);
  32. return ResultCode.Success;
  33. }
  34. [Command(1)]
  35. // GetImpl() -> buffer<nn::bcat::detail::DeliveryCacheProgressImpl, 0x1a>
  36. public ResultCode GetImpl(ServiceCtx context)
  37. {
  38. DeliveryCacheProgressImpl deliveryCacheProgress = new DeliveryCacheProgressImpl
  39. {
  40. State = DeliveryCacheProgressImpl.Status.Done,
  41. Result = 0
  42. };
  43. WriteDeliveryCacheProgressImpl(context, context.Request.RecvListBuff[0], deliveryCacheProgress);
  44. Logger.Stub?.PrintStub(LogClass.ServiceBcat);
  45. return ResultCode.Success;
  46. }
  47. private void WriteDeliveryCacheProgressImpl(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, DeliveryCacheProgressImpl deliveryCacheProgress)
  48. {
  49. using (MemoryStream memory = new MemoryStream((int)ipcDesc.Size))
  50. using (BinaryWriter bufferWriter = new BinaryWriter(memory))
  51. {
  52. bufferWriter.WriteStruct(deliveryCacheProgress);
  53. context.Memory.Write((ulong)ipcDesc.Position, memory.ToArray());
  54. }
  55. }
  56. }
  57. }