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:
Ac_K 2019-09-19 02:45:11 +02:00 committed by jduncanator
parent 4af3101b22
commit a0720b5681
393 changed files with 2540 additions and 1299 deletions

View file

@ -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);
}
}
}

View file

@ -0,0 +1,8 @@
namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService
{
class GeneralServiceDetail
{
public int ClientId;
public bool IsAnyInternetRequestAccepted;
}
}

View file

@ -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);
}
}
}

View 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;
}
}
}