aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Nifm/StaticService
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2019-09-19 02:45:11 +0200
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-09-19 10:45:11 +1000
commita0720b5681852f3d786d77bd3793b0359dea321c (patch)
tree9d8f61e540d1d1d827999902dad95e5c0c1e076e /Ryujinx.HLE/HOS/Services/Nifm/StaticService
parent4af3101b22e6957d6aa48a2768566d658699f4ed (diff)
Refactoring HOS folder structure (#771)
* Refactoring HOS folder structure Refactoring HOS folder structure: - Added some subfolders when needed (Following structure decided in private). - Added some `Types` folders when needed. - Little cleanup here and there. - Add services placeholders for every HOS services (close #766 and #753). * Remove Types namespaces
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Nifm/StaticService')
-rw-r--r--Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs30
-rw-r--r--Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/Types/GeneralServiceDetail.cs8
-rw-r--r--Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs93
-rw-r--r--Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs90
4 files changed, 221 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs
new file mode 100644
index 00000000..bbb218bb
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService
+{
+ static class GeneralServiceManager
+ {
+ private static List<GeneralServiceDetail> _generalServices = new List<GeneralServiceDetail>();
+
+ public static int Count
+ {
+ get => _generalServices.Count;
+ }
+
+ public static void Add(GeneralServiceDetail generalServiceDetail)
+ {
+ _generalServices.Add(generalServiceDetail);
+ }
+
+ public static void Remove(int index)
+ {
+ _generalServices.RemoveAt(index);
+ }
+
+ public static GeneralServiceDetail Get(int clientId)
+ {
+ return _generalServices.First(item => item.ClientId == clientId);
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/Types/GeneralServiceDetail.cs b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/Types/GeneralServiceDetail.cs
new file mode 100644
index 00000000..3cf55345
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/Types/GeneralServiceDetail.cs
@@ -0,0 +1,8 @@
+namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService
+{
+ class GeneralServiceDetail
+ {
+ public int ClientId;
+ public bool IsAnyInternetRequestAccepted;
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs
new file mode 100644
index 00000000..4a07b298
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs
@@ -0,0 +1,93 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService;
+using System;
+using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Net.Sockets;
+
+namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
+{
+ class IGeneralService : IpcService, IDisposable
+ {
+ private GeneralServiceDetail _generalServiceDetail;
+
+ public IGeneralService()
+ {
+ _generalServiceDetail = new GeneralServiceDetail
+ {
+ ClientId = GeneralServiceManager.Count,
+ IsAnyInternetRequestAccepted = true // NOTE: Why not accept any internet request?
+ };
+
+ GeneralServiceManager.Add(_generalServiceDetail);
+ }
+
+ [Command(1)]
+ // GetClientId() -> buffer<nn::nifm::ClientId, 0x1a, 4>
+ public ResultCode GetClientId(ServiceCtx context)
+ {
+ long position = context.Request.RecvListBuff[0].Position;
+ long size = context.Request.RecvListBuff[0].Size;
+
+ context.Memory.WriteInt32(position, _generalServiceDetail.ClientId);
+
+ return ResultCode.Success;
+ }
+
+ [Command(4)]
+ // CreateRequest(u32 version) -> object<nn::nifm::detail::IRequest>
+ public ResultCode CreateRequest(ServiceCtx context)
+ {
+ uint version = context.RequestData.ReadUInt32();
+
+ MakeObject(context, new IRequest(context.Device.System, version));
+
+ // Doesn't occur in our case.
+ // return ResultCode.ObjectIsNull;
+
+ Logger.PrintStub(LogClass.ServiceNifm, new { version });
+
+ return ResultCode.Success;
+ }
+
+ [Command(12)]
+ // GetCurrentIpAddress() -> nn::nifm::IpV4Address
+ public ResultCode GetCurrentIpAddress(ServiceCtx context)
+ {
+ if (!NetworkInterface.GetIsNetworkAvailable())
+ {
+ return ResultCode.NoInternetConnection;
+ }
+
+ IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
+
+ IPAddress address = host.AddressList.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
+
+ context.ResponseData.Write(BitConverter.ToUInt32(address.GetAddressBytes()));
+
+ Logger.PrintInfo(LogClass.ServiceNifm, $"Console's local IP is \"{address}\".");
+
+ return ResultCode.Success;
+ }
+
+ [Command(21)]
+ // IsAnyInternetRequestAccepted(buffer<nn::nifm::ClientId, 0x19, 4>) -> bool
+ public ResultCode IsAnyInternetRequestAccepted(ServiceCtx context)
+ {
+ long position = context.Request.PtrBuff[0].Position;
+ long size = context.Request.PtrBuff[0].Size;
+
+ int clientId = context.Memory.ReadInt32(position);
+
+ context.ResponseData.Write(GeneralServiceManager.Get(clientId).IsAnyInternetRequestAccepted);
+
+ return ResultCode.Success;
+ }
+
+ public void Dispose()
+ {
+ GeneralServiceManager.Remove(_generalServiceDetail.ClientId);
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs
new file mode 100644
index 00000000..c878c2d6
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs
@@ -0,0 +1,90 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Ipc;
+using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Kernel.Threading;
+using System;
+
+namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
+{
+ class IRequest : IpcService
+ {
+ private KEvent _event0;
+ private KEvent _event1;
+
+ private uint _version;
+
+ public IRequest(Horizon system, uint version)
+ {
+ _event0 = new KEvent(system);
+ _event1 = new KEvent(system);
+
+ _version = version;
+ }
+
+ [Command(0)]
+ // GetRequestState() -> u32
+ public ResultCode GetRequestState(ServiceCtx context)
+ {
+ context.ResponseData.Write(1);
+
+ Logger.PrintStub(LogClass.ServiceNifm);
+
+ return ResultCode.Success;
+ }
+
+ [Command(1)]
+ // GetResult()
+ public ResultCode GetResult(ServiceCtx context)
+ {
+ Logger.PrintStub(LogClass.ServiceNifm);
+
+ return ResultCode.Success;
+ }
+
+ [Command(2)]
+ // GetSystemEventReadableHandles() -> (handle<copy>, handle<copy>)
+ public ResultCode GetSystemEventReadableHandles(ServiceCtx context)
+ {
+ if (context.Process.HandleTable.GenerateHandle(_event0.ReadableEvent, out int handle0) != KernelResult.Success)
+ {
+ throw new InvalidOperationException("Out of handles!");
+ }
+
+ if (context.Process.HandleTable.GenerateHandle(_event1.ReadableEvent, out int handle1) != KernelResult.Success)
+ {
+ throw new InvalidOperationException("Out of handles!");
+ }
+
+ context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle0, handle1);
+
+ return ResultCode.Success;
+ }
+
+ [Command(3)]
+ // Cancel()
+ public ResultCode Cancel(ServiceCtx context)
+ {
+ Logger.PrintStub(LogClass.ServiceNifm);
+
+ return ResultCode.Success;
+ }
+
+ [Command(4)]
+ // Submit()
+ public ResultCode Submit(ServiceCtx context)
+ {
+ Logger.PrintStub(LogClass.ServiceNifm);
+
+ return ResultCode.Success;
+ }
+
+ [Command(11)]
+ // SetConnectionConfirmationOption(i8)
+ public ResultCode SetConnectionConfirmationOption(ServiceCtx context)
+ {
+ Logger.PrintStub(LogClass.ServiceNifm);
+
+ return ResultCode.Success;
+ }
+ }
+} \ No newline at end of file