Refactoring commands handling (#728)
* Refactoring commands handling - Use Reflection to handle commands ID. - Add all symbols (from SwIPC so not all time accurate). - Re-sort some services commands methods. - Some cleanup. - Keep some empty constructor for consistency. * Fix order in IProfile
This commit is contained in:
parent
f723f6f39a
commit
560ccbeb2d
99 changed files with 1035 additions and 1983 deletions
|
@ -1,23 +1,12 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
[Service("appletAE")]
|
||||
class IAllSystemAppletProxiesService : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IAllSystemAppletProxiesService(ServiceCtx context)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 100, OpenSystemAppletProxy }
|
||||
};
|
||||
}
|
||||
public IAllSystemAppletProxiesService(ServiceCtx context) { }
|
||||
|
||||
[Command(100)]
|
||||
// OpenSystemAppletProxy(u64, pid, handle<copy>) -> object<nn::am::service::ISystemAppletProxy>
|
||||
public long OpenSystemAppletProxy(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ISystemAppletProxy());
|
||||
|
|
|
@ -1,20 +1,7 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IApplicationCreator : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IApplicationCreator()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
// ...
|
||||
};
|
||||
}
|
||||
public IApplicationCreator() { }
|
||||
}
|
||||
}
|
|
@ -1,31 +1,13 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IApplicationFunctions : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IApplicationFunctions()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 1, PopLaunchParameter },
|
||||
{ 20, EnsureSaveData },
|
||||
{ 21, GetDesiredLanguage },
|
||||
{ 22, SetTerminateResult },
|
||||
{ 23, GetDisplayVersion },
|
||||
{ 40, NotifyRunning },
|
||||
{ 50, GetPseudoDeviceId },
|
||||
{ 66, InitializeGamePlayRecording },
|
||||
{ 67, SetGamePlayRecordingState }
|
||||
};
|
||||
}
|
||||
public IApplicationFunctions() { }
|
||||
|
||||
[Command(1)]
|
||||
// PopLaunchParameter(u32) -> object<nn::am::service::IStorage>
|
||||
public long PopLaunchParameter(ServiceCtx context)
|
||||
{
|
||||
// Only the first 0x18 bytes of the Data seems to be actually used.
|
||||
|
@ -34,6 +16,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(20)]
|
||||
// EnsureSaveData(nn::account::Uid) -> u64
|
||||
public long EnsureSaveData(ServiceCtx context)
|
||||
{
|
||||
long uIdLow = context.RequestData.ReadInt64();
|
||||
|
@ -46,6 +30,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(21)]
|
||||
// GetDesiredLanguage() -> nn::settings::LanguageCode
|
||||
public long GetDesiredLanguage(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write(context.Device.System.State.DesiredLanguageCode);
|
||||
|
@ -53,6 +39,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(22)]
|
||||
// SetTerminateResult(u32)
|
||||
public long SetTerminateResult(ServiceCtx context)
|
||||
{
|
||||
int errorCode = context.RequestData.ReadInt32();
|
||||
|
@ -72,6 +60,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return $"{(2000 + module):d4}-{description:d4}";
|
||||
}
|
||||
|
||||
[Command(23)]
|
||||
// GetDisplayVersion() -> nn::oe::DisplayVersion
|
||||
public long GetDisplayVersion(ServiceCtx context)
|
||||
{
|
||||
// FIXME: Need to check correct version on a switch.
|
||||
|
@ -81,6 +71,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(40)]
|
||||
// NotifyRunning() -> b8
|
||||
public long NotifyRunning(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write(1);
|
||||
|
@ -88,6 +80,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(50)] // 2.0.0+
|
||||
// GetPseudoDeviceId() -> nn::util::Uuid
|
||||
public long GetPseudoDeviceId(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -98,6 +92,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(66)] // 3.0.0+
|
||||
// InitializeGamePlayRecording(u64, handle<copy>)
|
||||
public long InitializeGamePlayRecording(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -105,6 +101,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(67)] // 3.0.0+
|
||||
// SetGamePlayRecordingState(u32)
|
||||
public long SetGamePlayRecordingState(ServiceCtx context)
|
||||
{
|
||||
int state = context.RequestData.ReadInt32();
|
||||
|
@ -114,4 +112,4 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,29 +1,11 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IApplicationProxy : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IApplicationProxy()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, GetCommonStateGetter },
|
||||
{ 1, GetSelfController },
|
||||
{ 2, GetWindowController },
|
||||
{ 3, GetAudioController },
|
||||
{ 4, GetDisplayController },
|
||||
{ 11, GetLibraryAppletCreator },
|
||||
{ 20, GetApplicationFunctions },
|
||||
{ 1000, GetDebugFunctions }
|
||||
};
|
||||
}
|
||||
public IApplicationProxy() { }
|
||||
|
||||
[Command(0)]
|
||||
// GetCommonStateGetter() -> object<nn::am::service::ICommonStateGetter>
|
||||
public long GetCommonStateGetter(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ICommonStateGetter(context.Device.System));
|
||||
|
@ -31,6 +13,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1)]
|
||||
// GetSelfController() -> object<nn::am::service::ISelfController>
|
||||
public long GetSelfController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ISelfController(context.Device.System));
|
||||
|
@ -38,6 +22,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(2)]
|
||||
// GetWindowController() -> object<nn::am::service::IWindowController>
|
||||
public long GetWindowController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IWindowController());
|
||||
|
@ -45,6 +31,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(3)]
|
||||
// GetAudioController() -> object<nn::am::service::IAudioController>
|
||||
public long GetAudioController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IAudioController());
|
||||
|
@ -52,6 +40,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(4)]
|
||||
// GetDisplayController() -> object<nn::am::service::IDisplayController>
|
||||
public long GetDisplayController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IDisplayController());
|
||||
|
@ -59,6 +49,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(11)]
|
||||
// GetLibraryAppletCreator() -> object<nn::am::service::ILibraryAppletCreator>
|
||||
public long GetLibraryAppletCreator(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ILibraryAppletCreator());
|
||||
|
@ -66,6 +58,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(20)]
|
||||
// GetApplicationFunctions() -> object<nn::am::service::IApplicationFunctions>
|
||||
public long GetApplicationFunctions(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IApplicationFunctions());
|
||||
|
@ -73,6 +67,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1000)]
|
||||
// GetDebugFunctions() -> object<nn::am::service::IDebugFunctions>
|
||||
public long GetDebugFunctions(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IDebugFunctions());
|
||||
|
|
|
@ -1,23 +1,12 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
[Service("appletOE")]
|
||||
class IApplicationProxyService : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IApplicationProxyService(ServiceCtx context)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, OpenApplicationProxy }
|
||||
};
|
||||
}
|
||||
public IApplicationProxyService(ServiceCtx context) { }
|
||||
|
||||
[Command(0)]
|
||||
// OpenApplicationProxy(u64, pid, handle<copy>) -> object<nn::am::service::IApplicationProxy>
|
||||
public long OpenApplicationProxy(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IApplicationProxy());
|
||||
|
|
|
@ -1,27 +1,13 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IAudioController : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IAudioController()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, SetExpectedMasterVolume },
|
||||
{ 1, GetMainAppletExpectedMasterVolume },
|
||||
{ 2, GetLibraryAppletExpectedMasterVolume },
|
||||
{ 3, ChangeMainAppletMasterVolume },
|
||||
{ 4, SetTransparentVolumeRate }
|
||||
};
|
||||
}
|
||||
public IAudioController() { }
|
||||
|
||||
[Command(0)]
|
||||
// SetExpectedMasterVolume(f32, f32)
|
||||
public long SetExpectedMasterVolume(ServiceCtx context)
|
||||
{
|
||||
float appletVolume = context.RequestData.ReadSingle();
|
||||
|
@ -32,6 +18,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1)]
|
||||
// GetMainAppletExpectedMasterVolume() -> f32
|
||||
public long GetMainAppletExpectedMasterVolume(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write(1f);
|
||||
|
@ -41,6 +29,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(2)]
|
||||
// GetLibraryAppletExpectedMasterVolume() -> f32
|
||||
public long GetLibraryAppletExpectedMasterVolume(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write(1f);
|
||||
|
@ -50,6 +40,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(3)]
|
||||
// ChangeMainAppletMasterVolume(f32, u64)
|
||||
public long ChangeMainAppletMasterVolume(ServiceCtx context)
|
||||
{
|
||||
float unknown0 = context.RequestData.ReadSingle();
|
||||
|
@ -60,6 +52,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(4)]
|
||||
// SetTransparentVolumeRate(f32)
|
||||
public long SetTransparentVolumeRate(ServiceCtx context)
|
||||
{
|
||||
float unknown0 = context.RequestData.ReadSingle();
|
||||
|
@ -69,4 +63,4 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,7 +3,6 @@ using Ryujinx.HLE.HOS.Ipc;
|
|||
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using static Ryujinx.HLE.HOS.ErrorCode;
|
||||
|
||||
|
@ -11,29 +10,15 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
{
|
||||
class ICommonStateGetter : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
private KEvent _displayResolutionChangeEvent;
|
||||
|
||||
public ICommonStateGetter(Horizon system)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, GetEventHandle },
|
||||
{ 1, ReceiveMessage },
|
||||
{ 5, GetOperationMode },
|
||||
{ 6, GetPerformanceMode },
|
||||
{ 8, GetBootMode },
|
||||
{ 9, GetCurrentFocusState },
|
||||
{ 60, GetDefaultDisplayResolution },
|
||||
{ 61, GetDefaultDisplayResolutionChangeEvent }
|
||||
};
|
||||
|
||||
_displayResolutionChangeEvent = new KEvent(system);
|
||||
}
|
||||
|
||||
[Command(0)]
|
||||
// GetEventHandle() -> handle<copy>
|
||||
public long GetEventHandle(ServiceCtx context)
|
||||
{
|
||||
KEvent Event = context.Device.System.AppletState.MessageEvent;
|
||||
|
@ -48,6 +33,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1)]
|
||||
// ReceiveMessage() -> nn::am::AppletMessage
|
||||
public long ReceiveMessage(ServiceCtx context)
|
||||
{
|
||||
if (!context.Device.System.AppletState.TryDequeueMessage(out MessageInfo message))
|
||||
|
@ -60,6 +47,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(5)]
|
||||
// GetOperationMode() -> u8
|
||||
public long GetOperationMode(ServiceCtx context)
|
||||
{
|
||||
OperationMode mode = context.Device.System.State.DockedMode
|
||||
|
@ -71,6 +60,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(6)]
|
||||
// GetPerformanceMode() -> u32
|
||||
public long GetPerformanceMode(ServiceCtx context)
|
||||
{
|
||||
Apm.PerformanceMode mode = context.Device.System.State.DockedMode
|
||||
|
@ -82,6 +73,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(8)]
|
||||
// GetBootMode() -> u8
|
||||
public long GetBootMode(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write((byte)0); //Unknown value.
|
||||
|
@ -91,6 +84,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(9)]
|
||||
// GetCurrentFocusState() -> u8
|
||||
public long GetCurrentFocusState(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write((byte)context.Device.System.AppletState.FocusState);
|
||||
|
@ -98,6 +93,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(60)] // 3.0.0+
|
||||
// GetDefaultDisplayResolution() -> (u32, u32)
|
||||
public long GetDefaultDisplayResolution(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write(1280);
|
||||
|
@ -106,6 +103,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(61)] // 3.0.0+
|
||||
// GetDefaultDisplayResolutionChangeEvent() -> handle<copy>
|
||||
public long GetDefaultDisplayResolutionChangeEvent(ServiceCtx context)
|
||||
{
|
||||
if (context.Process.HandleTable.GenerateHandle(_displayResolutionChangeEvent.ReadableEvent, out int handle) != KernelResult.Success)
|
||||
|
@ -120,4 +119,4 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,20 +1,7 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IDebugFunctions : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IDebugFunctions()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
// ...
|
||||
};
|
||||
}
|
||||
public IDebugFunctions() { }
|
||||
}
|
||||
}
|
|
@ -1,20 +1,7 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IDisplayController : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IDisplayController()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
// ...
|
||||
};
|
||||
}
|
||||
public IDisplayController() { }
|
||||
}
|
||||
}
|
|
@ -1,20 +1,7 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IGlobalStateController : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IGlobalStateController()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
// ...
|
||||
};
|
||||
}
|
||||
public IGlobalStateController() { }
|
||||
}
|
||||
}
|
|
@ -3,30 +3,21 @@ using Ryujinx.HLE.HOS.Ipc;
|
|||
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IHomeMenuFunctions : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
private KEvent _channelEvent;
|
||||
|
||||
public IHomeMenuFunctions(Horizon system)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 10, RequestToGetForeground },
|
||||
{ 21, GetPopFromGeneralChannelEvent }
|
||||
};
|
||||
|
||||
// TODO: Signal this Event somewhere in future.
|
||||
_channelEvent = new KEvent(system);
|
||||
}
|
||||
|
||||
[Command(10)]
|
||||
// RequestToGetForeground()
|
||||
public long RequestToGetForeground(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -34,6 +25,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(21)]
|
||||
// GetPopFromGeneralChannelEvent() -> handle<copy>
|
||||
public long GetPopFromGeneralChannelEvent(ServiceCtx context)
|
||||
{
|
||||
if (context.Process.HandleTable.GenerateHandle(_channelEvent.ReadableEvent, out int handle) != KernelResult.Success)
|
||||
|
@ -48,4 +41,4 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,32 +3,20 @@ using Ryujinx.HLE.HOS.Ipc;
|
|||
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class ILibraryAppletAccessor : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
private KEvent _stateChangedEvent;
|
||||
|
||||
public ILibraryAppletAccessor(Horizon system)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, GetAppletStateChangedEvent },
|
||||
{ 10, Start },
|
||||
{ 30, GetResult },
|
||||
{ 100, PushInData },
|
||||
{ 101, PopOutData }
|
||||
};
|
||||
|
||||
_stateChangedEvent = new KEvent(system);
|
||||
}
|
||||
|
||||
[Command(0)]
|
||||
// GetAppletStateChangedEvent() -> handle<copy>
|
||||
public long GetAppletStateChangedEvent(ServiceCtx context)
|
||||
{
|
||||
_stateChangedEvent.ReadableEvent.Signal();
|
||||
|
@ -45,6 +33,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(10)]
|
||||
// Start()
|
||||
public long Start(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -52,6 +42,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(30)]
|
||||
// GetResult()
|
||||
public long GetResult(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -59,6 +51,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(100)]
|
||||
// PushInData(object<nn::am::service::IStorage>)
|
||||
public long PushInData(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -66,6 +60,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(101)]
|
||||
// PopOutData() -> object<nn::am::service::IStorage>
|
||||
public long PopOutData(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IStorage(StorageHelper.MakeLaunchParams()));
|
||||
|
|
|
@ -1,23 +1,11 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class ILibraryAppletCreator : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public ILibraryAppletCreator()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, CreateLibraryApplet },
|
||||
{ 10, CreateStorage }
|
||||
};
|
||||
}
|
||||
public ILibraryAppletCreator() { }
|
||||
|
||||
[Command(0)]
|
||||
// CreateLibraryApplet(u32, u32) -> object<nn::am::service::ILibraryAppletAccessor>
|
||||
public long CreateLibraryApplet(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ILibraryAppletAccessor(context.Device.System));
|
||||
|
@ -25,6 +13,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(10)]
|
||||
// CreateStorage(u64) -> object<nn::am::service::IStorage>
|
||||
public long CreateStorage(ServiceCtx context)
|
||||
{
|
||||
long size = context.RequestData.ReadInt64();
|
||||
|
|
|
@ -3,16 +3,11 @@ using Ryujinx.HLE.HOS.Ipc;
|
|||
using Ryujinx.HLE.HOS.Kernel.Common;
|
||||
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class ISelfController : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
private KEvent _libraryAppletLaunchableEvent;
|
||||
|
||||
private KEvent _accumulatedSuspendedTickChangedEvent;
|
||||
|
@ -22,54 +17,11 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
|
||||
public ISelfController(Horizon system)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, Exit },
|
||||
{ 1, LockExit },
|
||||
{ 2, UnlockExit },
|
||||
//{ 3, EnterFatalSection }, // 2.0.0+
|
||||
//{ 4, LeaveFatalSection }, // 2.0.0+
|
||||
{ 9, GetLibraryAppletLaunchableEvent },
|
||||
{ 10, SetScreenShotPermission },
|
||||
{ 11, SetOperationModeChangedNotification },
|
||||
{ 12, SetPerformanceModeChangedNotification },
|
||||
{ 13, SetFocusHandlingMode },
|
||||
{ 14, SetRestartMessageEnabled },
|
||||
//{ 15, SetScreenShotAppletIdentityInfo }, // 2.0.0+
|
||||
{ 16, SetOutOfFocusSuspendingEnabled }, // 2.0.0+
|
||||
//{ 17, SetControllerFirmwareUpdateSection }, // 3.0.0+
|
||||
//{ 18, SetRequiresCaptureButtonShortPressedMessage }, // 3.0.0+
|
||||
{ 19, SetScreenShotImageOrientation }, // 3.0.0+
|
||||
//{ 20, SetDesirableKeyboardLayout }, // 4.0.0+
|
||||
//{ 40, CreateManagedDisplayLayer },
|
||||
//{ 41, IsSystemBufferSharingEnabled }, // 4.0.0+
|
||||
//{ 42, GetSystemSharedLayerHandle }, // 4.0.0+
|
||||
//{ 43, GetSystemSharedBufferHandle }, // 5.0.0+
|
||||
{ 50, SetHandlesRequestToDisplay },
|
||||
//{ 51, ApproveToDisplay },
|
||||
//{ 60, OverrideAutoSleepTimeAndDimmingTime },
|
||||
//{ 61, SetMediaPlaybackState },
|
||||
{ 62, SetIdleTimeDetectionExtension },
|
||||
{ 63, GetIdleTimeDetectionExtension },
|
||||
//{ 64, SetInputDetectionSourceSet },
|
||||
//{ 65, ReportUserIsActive }, // 2.0.0+
|
||||
//{ 66, GetCurrentIlluminance }, // 3.0.0+
|
||||
//{ 67, IsIlluminanceAvailable }, // 3.0.0+
|
||||
//{ 68, SetAutoSleepDisabled }, // 5.0.0+
|
||||
//{ 69, IsAutoSleepDisabled }, // 5.0.0+
|
||||
//{ 70, ReportMultimediaError }, // 4.0.0+
|
||||
//{ 71, GetCurrentIlluminanceEx }, // 5.0.0+
|
||||
//{ 80, SetWirelessPriorityMode }, // 4.0.0+
|
||||
//{ 90, GetAccumulatedSuspendedTickValue }, // 6.0.0+
|
||||
{ 91, GetAccumulatedSuspendedTickChangedEvent }, // 6.0.0+
|
||||
//{ 100, SetAlbumImageTakenNotificationEnabled }, // 7.0.0+
|
||||
//{ 110, SetApplicationAlbumUserData }, // 8.0.0+
|
||||
//{ 1000, GetDebugStorageChannel }, // 7.0.0+
|
||||
};
|
||||
|
||||
_libraryAppletLaunchableEvent = new KEvent(system);
|
||||
}
|
||||
|
||||
[Command(0)]
|
||||
// Exit()
|
||||
public long Exit(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -77,6 +29,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1)]
|
||||
// LockExit()
|
||||
public long LockExit(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -84,6 +38,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(2)]
|
||||
// UnlockExit()
|
||||
public long UnlockExit(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -91,6 +47,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(9)]
|
||||
// GetLibraryAppletLaunchableEvent() -> handle<copy>
|
||||
public long GetLibraryAppletLaunchableEvent(ServiceCtx context)
|
||||
{
|
||||
_libraryAppletLaunchableEvent.ReadableEvent.Signal();
|
||||
|
@ -107,6 +65,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(10)]
|
||||
// SetScreenShotPermission(u32)
|
||||
public long SetScreenShotPermission(ServiceCtx context)
|
||||
{
|
||||
bool enable = context.RequestData.ReadByte() != 0;
|
||||
|
@ -116,6 +76,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(11)]
|
||||
// SetOperationModeChangedNotification(b8)
|
||||
public long SetOperationModeChangedNotification(ServiceCtx context)
|
||||
{
|
||||
bool enable = context.RequestData.ReadByte() != 0;
|
||||
|
@ -125,6 +87,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(12)]
|
||||
// SetPerformanceModeChangedNotification(b8)
|
||||
public long SetPerformanceModeChangedNotification(ServiceCtx context)
|
||||
{
|
||||
bool enable = context.RequestData.ReadByte() != 0;
|
||||
|
@ -134,6 +98,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(13)]
|
||||
// SetFocusHandlingMode(b8, b8, b8)
|
||||
public long SetFocusHandlingMode(ServiceCtx context)
|
||||
{
|
||||
bool flag1 = context.RequestData.ReadByte() != 0;
|
||||
|
@ -145,6 +111,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(14)]
|
||||
// SetRestartMessageEnabled(b8)
|
||||
public long SetRestartMessageEnabled(ServiceCtx context)
|
||||
{
|
||||
bool enable = context.RequestData.ReadByte() != 0;
|
||||
|
@ -154,6 +122,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(16)] // 2.0.0+
|
||||
// SetOutOfFocusSuspendingEnabled(b8)
|
||||
public long SetOutOfFocusSuspendingEnabled(ServiceCtx context)
|
||||
{
|
||||
bool enable = context.RequestData.ReadByte() != 0;
|
||||
|
@ -163,6 +133,7 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(19)] // 3.0.0+
|
||||
public long SetScreenShotImageOrientation(ServiceCtx context)
|
||||
{
|
||||
int orientation = context.RequestData.ReadInt32();
|
||||
|
@ -172,6 +143,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(50)]
|
||||
// SetHandlesRequestToDisplay(b8)
|
||||
public long SetHandlesRequestToDisplay(ServiceCtx context)
|
||||
{
|
||||
bool enable = context.RequestData.ReadByte() != 0;
|
||||
|
@ -181,6 +154,7 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(62)]
|
||||
// SetIdleTimeDetectionExtension(u32)
|
||||
public long SetIdleTimeDetectionExtension(ServiceCtx context)
|
||||
{
|
||||
|
@ -191,6 +165,7 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(63)]
|
||||
// GetIdleTimeDetectionExtension() -> u32
|
||||
public long GetIdleTimeDetectionExtension(ServiceCtx context)
|
||||
{
|
||||
|
@ -201,6 +176,7 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(91)] // 6.0.0+
|
||||
// GetAccumulatedSuspendedTickChangedEvent() -> handle<copy>
|
||||
public long GetAccumulatedSuspendedTickChangedEvent(ServiceCtx context)
|
||||
{
|
||||
|
@ -221,4 +197,4 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,26 +1,16 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IStorage : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public byte[] Data { get; private set; }
|
||||
|
||||
public IStorage(byte[] data)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, Open }
|
||||
};
|
||||
|
||||
Data = data;
|
||||
}
|
||||
|
||||
[Command(0)]
|
||||
// Open() -> object<nn::am::service::IStorageAccessor>
|
||||
public long Open(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IStorageAccessor(this));
|
||||
|
|
|
@ -1,29 +1,18 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IStorageAccessor : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
private IStorage _storage;
|
||||
|
||||
public IStorageAccessor(IStorage storage)
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, GetSize },
|
||||
{ 10, Write },
|
||||
{ 11, Read }
|
||||
};
|
||||
|
||||
_storage = storage;
|
||||
}
|
||||
|
||||
[Command(0)]
|
||||
// GetSize() -> u64
|
||||
public long GetSize(ServiceCtx context)
|
||||
{
|
||||
context.ResponseData.Write((long)_storage.Data.Length);
|
||||
|
@ -31,6 +20,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(10)]
|
||||
// Write(u64, buffer<bytes, 0x21>)
|
||||
public long Write(ServiceCtx context)
|
||||
{
|
||||
// TODO: Error conditions.
|
||||
|
@ -55,6 +46,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(11)]
|
||||
// Read(u64) -> buffer<bytes, 0x22>
|
||||
public long Read(ServiceCtx context)
|
||||
{
|
||||
// TODO: Error conditions.
|
||||
|
|
|
@ -1,31 +1,11 @@
|
|||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class ISystemAppletProxy : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public ISystemAppletProxy()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 0, GetCommonStateGetter },
|
||||
{ 1, GetSelfController },
|
||||
{ 2, GetWindowController },
|
||||
{ 3, GetAudioController },
|
||||
{ 4, GetDisplayController },
|
||||
{ 11, GetLibraryAppletCreator },
|
||||
{ 20, GetHomeMenuFunctions },
|
||||
{ 21, GetGlobalStateController },
|
||||
{ 22, GetApplicationCreator },
|
||||
{ 1000, GetDebugFunctions }
|
||||
};
|
||||
}
|
||||
public ISystemAppletProxy() { }
|
||||
|
||||
[Command(0)]
|
||||
// GetCommonStateGetter() -> object<nn::am::service::ICommonStateGetter>
|
||||
public long GetCommonStateGetter(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ICommonStateGetter(context.Device.System));
|
||||
|
@ -33,6 +13,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1)]
|
||||
// GetSelfController() -> object<nn::am::service::ISelfController>
|
||||
public long GetSelfController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ISelfController(context.Device.System));
|
||||
|
@ -40,6 +22,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(2)]
|
||||
// GetWindowController() -> object<nn::am::service::IWindowController>
|
||||
public long GetWindowController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IWindowController());
|
||||
|
@ -47,6 +31,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(3)]
|
||||
// GetAudioController() -> object<nn::am::service::IAudioController>
|
||||
public long GetAudioController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IAudioController());
|
||||
|
@ -54,6 +40,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(4)]
|
||||
// GetDisplayController() -> object<nn::am::service::IDisplayController>
|
||||
public long GetDisplayController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IDisplayController());
|
||||
|
@ -61,6 +49,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(11)]
|
||||
// GetLibraryAppletCreator() -> object<nn::am::service::ILibraryAppletCreator>
|
||||
public long GetLibraryAppletCreator(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new ILibraryAppletCreator());
|
||||
|
@ -68,6 +58,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(20)]
|
||||
// GetHomeMenuFunctions() -> object<nn::am::service::IHomeMenuFunctions>
|
||||
public long GetHomeMenuFunctions(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IHomeMenuFunctions(context.Device.System));
|
||||
|
@ -75,6 +67,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(21)]
|
||||
// GetGlobalStateController() -> object<nn::am::service::IGlobalStateController>
|
||||
public long GetGlobalStateController(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IGlobalStateController());
|
||||
|
@ -82,6 +76,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(22)]
|
||||
// GetApplicationCreator() -> object<nn::am::service::IApplicationCreator>
|
||||
public long GetApplicationCreator(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IApplicationCreator());
|
||||
|
@ -89,6 +85,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(1000)]
|
||||
// GetDebugFunctions() -> object<nn::am::service::IDebugFunctions>
|
||||
public long GetDebugFunctions(ServiceCtx context)
|
||||
{
|
||||
MakeObject(context, new IDebugFunctions());
|
||||
|
|
|
@ -1,24 +1,13 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Ipc;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ryujinx.HLE.HOS.Services.Am
|
||||
{
|
||||
class IWindowController : IpcService
|
||||
{
|
||||
private Dictionary<int, ServiceProcessRequest> _commands;
|
||||
|
||||
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
|
||||
|
||||
public IWindowController()
|
||||
{
|
||||
_commands = new Dictionary<int, ServiceProcessRequest>
|
||||
{
|
||||
{ 1, GetAppletResourceUserId },
|
||||
{ 10, AcquireForegroundRights }
|
||||
};
|
||||
}
|
||||
public IWindowController() { }
|
||||
|
||||
[Command(1)]
|
||||
// GetAppletResourceUserId() -> nn::applet::AppletResourceUserId
|
||||
public long GetAppletResourceUserId(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
@ -28,6 +17,8 @@ namespace Ryujinx.HLE.HOS.Services.Am
|
|||
return 0;
|
||||
}
|
||||
|
||||
[Command(10)]
|
||||
// AcquireForegroundRights()
|
||||
public long AcquireForegroundRights(ServiceCtx context)
|
||||
{
|
||||
Logger.PrintStub(LogClass.ServiceAm);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue