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
This commit is contained in:
parent
4af3101b22
commit
a0720b5681
393 changed files with 2540 additions and 1299 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService
|
||||
{
|
||||
class GeneralServiceDetail
|
||||
{
|
||||
public int ClientId;
|
||||
public bool IsAnyInternetRequestAccepted;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
90
Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs
Normal file
90
Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue