IDeliveryCacheProgressService.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. public IDeliveryCacheProgressService(ServiceCtx context)
  15. {
  16. _event = new KEvent(context.Device.System.KernelContext);
  17. }
  18. [Command(0)]
  19. // GetEvent() -> handle<copy>
  20. public ResultCode GetEvent(ServiceCtx context)
  21. {
  22. if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out int handle) != KernelResult.Success)
  23. {
  24. throw new InvalidOperationException("Out of handles!");
  25. }
  26. context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
  27. Logger.Stub?.PrintStub(LogClass.ServiceBcat);
  28. return ResultCode.Success;
  29. }
  30. [Command(1)]
  31. // GetImpl() -> buffer<nn::bcat::detail::DeliveryCacheProgressImpl, 0x1a>
  32. public ResultCode GetImpl(ServiceCtx context)
  33. {
  34. DeliveryCacheProgressImpl deliveryCacheProgress = new DeliveryCacheProgressImpl
  35. {
  36. State = DeliveryCacheProgressImpl.Status.Done,
  37. Result = 0
  38. };
  39. WriteDeliveryCacheProgressImpl(context, context.Request.RecvListBuff[0], deliveryCacheProgress);
  40. Logger.Stub?.PrintStub(LogClass.ServiceBcat);
  41. return ResultCode.Success;
  42. }
  43. private void WriteDeliveryCacheProgressImpl(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, DeliveryCacheProgressImpl deliveryCacheProgress)
  44. {
  45. using (MemoryStream memory = new MemoryStream((int)ipcDesc.Size))
  46. using (BinaryWriter bufferWriter = new BinaryWriter(memory))
  47. {
  48. bufferWriter.WriteStruct(deliveryCacheProgress);
  49. context.Memory.Write((ulong)ipcDesc.Position, memory.ToArray());
  50. }
  51. }
  52. }
  53. }