diff options
| author | Ac_K <Acoustik666@gmail.com> | 2019-09-19 02:45:11 +0200 |
|---|---|---|
| committer | jduncanator <1518948+jduncanator@users.noreply.github.com> | 2019-09-19 10:45:11 +1000 |
| commit | a0720b5681852f3d786d77bd3793b0359dea321c (patch) | |
| tree | 9d8f61e540d1d1d827999902dad95e5c0c1e076e /Ryujinx.HLE/HOS/Services/Nifm/StaticService | |
| parent | 4af3101b22e6957d6aa48a2768566d658699f4ed (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')
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 |
