Ryujinx/Ryujinx.HLE/HOS/Services/Nfp/IUser.cs
jduncanator 8406ec6272 Refactor Ryujinx.Common and HLE Stub Logging (#537)
* Refactor Ryujinx.Common and HLE Stub Logging

* Resolve review comments

* Rename missed loop variable

* Optimize PrintStub logging function

* Pass the call-sites Thread ID through to the logger

* Remove superfluous lock from ConsoleLog

* Process logged data objects in the logger target

Pass the data object all the way to the output logger targets, to allow them to "serialize" this in whatever appropriate format they're logging in.

* Use existing StringBuilder to build the properties string

* Add a ServiceNotImplemented Exception

Useful for printing debug information about unimplemented service calls

* Resolve Style Nits

* Resolve Merge Issues

* Fix typo and align declarations
2019-01-11 01:11:46 +01:00

125 lines
3.6 KiB
C#

using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.Input;
using System;
using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Nfp
{
class IUser : IpcService
{
private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
private const HidControllerId NpadId = HidControllerId.ControllerPlayer1;
private State _state = State.NonInitialized;
private DeviceState _deviceState = DeviceState.Initialized;
private KEvent _activateEvent;
private KEvent _deactivateEvent;
private KEvent _availabilityChangeEvent;
public IUser(Horizon system)
{
_commands = new Dictionary<int, ServiceProcessRequest>
{
{ 0, Initialize },
{ 17, AttachActivateEvent },
{ 18, AttachDeactivateEvent },
{ 19, GetState },
{ 20, GetDeviceState },
{ 21, GetNpadId },
{ 23, AttachAvailabilityChangeEvent }
};
_activateEvent = new KEvent(system);
_deactivateEvent = new KEvent(system);
_availabilityChangeEvent = new KEvent(system);
}
public long Initialize(ServiceCtx context)
{
Logger.PrintStub(LogClass.ServiceNfp);
_state = State.Initialized;
return 0;
}
public long AttachActivateEvent(ServiceCtx context)
{
Logger.PrintStub(LogClass.ServiceNfp);
if (context.Process.HandleTable.GenerateHandle(_activateEvent.ReadableEvent, out int handle) != KernelResult.Success)
{
throw new InvalidOperationException("Out of handles!");
}
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
return 0;
}
public long AttachDeactivateEvent(ServiceCtx context)
{
Logger.PrintStub(LogClass.ServiceNfp);
if (context.Process.HandleTable.GenerateHandle(_deactivateEvent.ReadableEvent, out int handle) != KernelResult.Success)
{
throw new InvalidOperationException("Out of handles!");
}
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
return 0;
}
public long GetState(ServiceCtx context)
{
context.ResponseData.Write((int)_state);
Logger.PrintStub(LogClass.ServiceNfp);
return 0;
}
public long GetDeviceState(ServiceCtx context)
{
context.ResponseData.Write((int)_deviceState);
Logger.PrintStub(LogClass.ServiceNfp);
return 0;
}
public long GetNpadId(ServiceCtx context)
{
context.ResponseData.Write((int)NpadId);
Logger.PrintStub(LogClass.ServiceNfp);
return 0;
}
public long AttachAvailabilityChangeEvent(ServiceCtx context)
{
Logger.PrintStub(LogClass.ServiceNfp);
if (context.Process.HandleTable.GenerateHandle(_availabilityChangeEvent.ReadableEvent, out int handle) != KernelResult.Success)
{
throw new InvalidOperationException("Out of handles!");
}
context.Response.HandleDesc = IpcHandleDesc.MakeCopy(handle);
return 0;
}
}
}