IGeneralService.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService;
  3. using System;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.NetworkInformation;
  7. using System.Net.Sockets;
  8. namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
  9. {
  10. class IGeneralService : IpcService, IDisposable
  11. {
  12. private GeneralServiceDetail _generalServiceDetail;
  13. public IGeneralService()
  14. {
  15. _generalServiceDetail = new GeneralServiceDetail
  16. {
  17. ClientId = GeneralServiceManager.Count,
  18. IsAnyInternetRequestAccepted = true // NOTE: Why not accept any internet request?
  19. };
  20. GeneralServiceManager.Add(_generalServiceDetail);
  21. }
  22. [Command(1)]
  23. // GetClientId() -> buffer<nn::nifm::ClientId, 0x1a, 4>
  24. public ResultCode GetClientId(ServiceCtx context)
  25. {
  26. long position = context.Request.RecvListBuff[0].Position;
  27. long size = context.Request.RecvListBuff[0].Size;
  28. context.Memory.WriteInt32(position, _generalServiceDetail.ClientId);
  29. return ResultCode.Success;
  30. }
  31. [Command(4)]
  32. // CreateRequest(u32 version) -> object<nn::nifm::detail::IRequest>
  33. public ResultCode CreateRequest(ServiceCtx context)
  34. {
  35. uint version = context.RequestData.ReadUInt32();
  36. MakeObject(context, new IRequest(context.Device.System, version));
  37. // Doesn't occur in our case.
  38. // return ResultCode.ObjectIsNull;
  39. Logger.PrintStub(LogClass.ServiceNifm, new { version });
  40. return ResultCode.Success;
  41. }
  42. [Command(12)]
  43. // GetCurrentIpAddress() -> nn::nifm::IpV4Address
  44. public ResultCode GetCurrentIpAddress(ServiceCtx context)
  45. {
  46. if (!NetworkInterface.GetIsNetworkAvailable())
  47. {
  48. return ResultCode.NoInternetConnection;
  49. }
  50. IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
  51. IPAddress address = host.AddressList.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
  52. context.ResponseData.Write(BitConverter.ToUInt32(address.GetAddressBytes()));
  53. Logger.PrintInfo(LogClass.ServiceNifm, $"Console's local IP is \"{address}\".");
  54. return ResultCode.Success;
  55. }
  56. [Command(21)]
  57. // IsAnyInternetRequestAccepted(buffer<nn::nifm::ClientId, 0x19, 4>) -> bool
  58. public ResultCode IsAnyInternetRequestAccepted(ServiceCtx context)
  59. {
  60. long position = context.Request.PtrBuff[0].Position;
  61. long size = context.Request.PtrBuff[0].Size;
  62. int clientId = context.Memory.ReadInt32(position);
  63. context.ResponseData.Write(GeneralServiceManager.Get(clientId).IsAnyInternetRequestAccepted);
  64. return ResultCode.Success;
  65. }
  66. public void Dispose()
  67. {
  68. GeneralServiceManager.Remove(_generalServiceDetail.ClientId);
  69. }
  70. }
  71. }