IPC services refactoring (#726)

* IPC services refactoring

- Use custom Attributes to handle services.
- Add a way to set the permissions and fix the bsd service to use it.
- Little cleanup.
- C#7.1 is required.

* fix var name

* fix syntax

* Change Permission to Parameter

* Delete BsdServicePermissionLevel.cs

* Fix Linq
This commit is contained in:
Ac_K 2019-07-10 17:59:54 +02:00 committed by gdkchan
parent e5b88de22a
commit 596b61ce1f
48 changed files with 175 additions and 299 deletions

View file

@ -11,6 +11,8 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Acc namespace Ryujinx.HLE.HOS.Services.Acc
{ {
[Service("acc:u0")]
[Service("acc:u1")]
class IAccountService : IpcService class IAccountService : IpcService
{ {
private bool _userRegistrationRequestPermitted = false; private bool _userRegistrationRequestPermitted = false;
@ -21,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Acc
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IAccountService() public IAccountService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
[Service("appletAE")]
class IAllSystemAppletProxiesService : IpcService class IAllSystemAppletProxiesService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IAllSystemAppletProxiesService() public IAllSystemAppletProxiesService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Am namespace Ryujinx.HLE.HOS.Services.Am
{ {
[Service("appletOE")]
class IApplicationProxyService : IpcService class IApplicationProxyService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IApplicationProxyService() public IApplicationProxyService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,15 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Apm namespace Ryujinx.HLE.HOS.Services.Apm
{ {
[Service("apm")]
[Service("apm:p")]
class IManager : IpcService class IManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IManager() public IManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -11,6 +11,7 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Aud namespace Ryujinx.HLE.HOS.Services.Aud
{ {
[Service("audout:u")]
class IAudioOutManager : IpcService class IAudioOutManager : IpcService
{ {
private const string DefaultAudioOutput = "DeviceOut"; private const string DefaultAudioOutput = "DeviceOut";
@ -23,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Services.Aud
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IAudioOutManager() public IAudioOutManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -9,6 +9,7 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Aud namespace Ryujinx.HLE.HOS.Services.Aud
{ {
[Service("audren:u")]
class IAudioRendererManager : IpcService class IAudioRendererManager : IpcService
{ {
private const int Rev0Magic = ('R' << 0) | private const int Rev0Magic = ('R' << 0) |
@ -24,7 +25,7 @@ namespace Ryujinx.HLE.HOS.Services.Aud
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IAudioRendererManager() public IAudioRendererManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Aud namespace Ryujinx.HLE.HOS.Services.Aud
{ {
[Service("hwopus")]
class IHardwareOpusDecoderManager : IpcService class IHardwareOpusDecoderManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IHardwareOpusDecoderManager() public IHardwareOpusDecoderManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,17 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Bcat namespace Ryujinx.HLE.HOS.Services.Bcat
{ {
[Service("bcat:a")]
[Service("bcat:m")]
[Service("bcat:u")]
[Service("bcat:s")]
class IServiceCreator : IpcService class IServiceCreator : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IServiceCreator() public IServiceCreator(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -8,9 +8,10 @@ using System.Text;
namespace Ryujinx.HLE.HOS.Services.Bsd namespace Ryujinx.HLE.HOS.Services.Bsd
{ {
[Service("bsd:s", true)]
[Service("bsd:u", false)]
class IClient : IpcService class IClient : IpcService
{ {
private static Dictionary<WsaError, LinuxError> _errorMap = new Dictionary<WsaError, LinuxError> private static Dictionary<WsaError, LinuxError> _errorMap = new Dictionary<WsaError, LinuxError>
{ {
// WSAEINTR // WSAEINTR
@ -95,15 +96,15 @@ namespace Ryujinx.HLE.HOS.Services.Bsd
{0, 0} {0, 0}
}; };
private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
private bool _isPrivileged; private bool _isPrivileged;
private List<BsdSocket> _sockets = new List<BsdSocket>(); private List<BsdSocket> _sockets = new List<BsdSocket>();
public IClient(bool isPrivileged) private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IClient(ServiceCtx context, bool isPrivileged)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Caps namespace Ryujinx.HLE.HOS.Services.Caps
{ {
[Service("caps:a")]
class IAlbumAccessorService : IpcService class IAlbumAccessorService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IAlbumAccessorService() public IAlbumAccessorService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Caps namespace Ryujinx.HLE.HOS.Services.Caps
{ {
[Service("caps:ss")]
class IScreenshotService : IpcService class IScreenshotService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IScreenshotService() public IScreenshotService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,19 +3,18 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Es namespace Ryujinx.HLE.HOS.Services.Es
{ {
[Service("es")]
class IeTicketService : IpcService class IeTicketService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
private bool _isInitialized; public IeTicketService(ServiceCtx context)
public IeTicketService()
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
//...
}; };
} }
} }

View file

@ -7,15 +7,20 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Friend namespace Ryujinx.HLE.HOS.Services.Friend
{ {
[Service("friend:a", FriendServicePermissionLevel.Admin)]
[Service("friend:m", FriendServicePermissionLevel.Manager)]
[Service("friend:s", FriendServicePermissionLevel.System)]
[Service("friend:u", FriendServicePermissionLevel.User)]
[Service("friend:v", FriendServicePermissionLevel.Overlay)]
class IServiceCreator : IpcService class IServiceCreator : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands;
private FriendServicePermissionLevel _permissionLevel; private FriendServicePermissionLevel _permissionLevel;
private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IServiceCreator(FriendServicePermissionLevel permissionLevel) public IServiceCreator(ServiceCtx context, FriendServicePermissionLevel permissionLevel)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -15,13 +15,14 @@ using static Ryujinx.HLE.Utilities.StringUtils;
namespace Ryujinx.HLE.HOS.Services.FspSrv namespace Ryujinx.HLE.HOS.Services.FspSrv
{ {
[Service("fsp-srv")]
class IFileSystemProxy : IpcService class IFileSystemProxy : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IFileSystemProxy() public IFileSystemProxy(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -8,6 +8,7 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Hid namespace Ryujinx.HLE.HOS.Services.Hid
{ {
[Service("hid")]
class IHidServer : IpcService class IHidServer : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
@ -40,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IHidServer(Horizon system) public IHidServer(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
@ -149,9 +150,9 @@ namespace Ryujinx.HLE.HOS.Services.Hid
{ 1001, GetNpadCommunicationMode } { 1001, GetNpadCommunicationMode }
}; };
_npadStyleSetUpdateEvent = new KEvent(system); _npadStyleSetUpdateEvent = new KEvent(context.Device.System);
_xpadIdEvent = new KEvent(system); _xpadIdEvent = new KEvent(context.Device.System);
_palmaOperationCompleteEvent = new KEvent(system); _palmaOperationCompleteEvent = new KEvent(context.Device.System);
_npadJoyHoldType = HidNpadJoyHoldType.Vertical; _npadJoyHoldType = HidNpadJoyHoldType.Vertical;
_npadStyleSet = HidNpadStyle.FullKey | HidNpadStyle.Dual | HidNpadStyle.Left | HidNpadStyle.Right | HidNpadStyle.Handheld; _npadStyleSet = HidNpadStyle.FullKey | HidNpadStyle.Dual | HidNpadStyle.Left | HidNpadStyle.Right | HidNpadStyle.Handheld;

View file

@ -7,6 +7,7 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Hid.Irs namespace Ryujinx.HLE.HOS.Services.Hid.Irs
{ {
[Service("irs")]
class IIrSensorServer : IpcService class IIrSensorServer : IpcService
{ {
private int _irsensorSharedMemoryHandle = 0; private int _irsensorSharedMemoryHandle = 0;
@ -15,7 +16,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IIrSensorServer() public IIrSensorServer(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -95,6 +95,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldr
} }
} }
[Service("ldr:ro")]
class IRoInterface : IpcService class IRoInterface : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
@ -112,7 +113,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldr
private bool _isInitialized; private bool _isInitialized;
public IRoInterface() public IRoInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Lm namespace Ryujinx.HLE.HOS.Services.Lm
{ {
[Service("lm")]
class ILogService : IpcService class ILogService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ILogService() public ILogService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,13 +4,14 @@ using Ryujinx.HLE.FileSystem;
namespace Ryujinx.HLE.HOS.Services.Lr namespace Ryujinx.HLE.HOS.Services.Lr
{ {
[Service("lr")]
class ILocationResolverManager : IpcService class ILocationResolverManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ILocationResolverManager() public ILocationResolverManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,13 +4,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Mm namespace Ryujinx.HLE.HOS.Services.Mm
{ {
[Service("mm:u")]
class IRequest : IpcService class IRequest : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IRequest() public IRequest(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest>() _commands = new Dictionary<int, ServiceProcessRequest>()
{ {

View file

@ -3,17 +3,18 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Ncm namespace Ryujinx.HLE.HOS.Services.Ncm
{ {
[Service("ncm")]
class IContentManager : IpcService class IContentManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IContentManager() public IContentManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
//...
}; };
} }
} }

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
{ {
[Service("nfp:user")]
class IUserManager : IpcService class IUserManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IUserManager() public IUserManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Nifm namespace Ryujinx.HLE.HOS.Services.Nifm
{ {
[Service("nifm:u")]
class IStaticService : IpcService class IStaticService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IStaticService() public IStaticService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,13 +4,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Ns namespace Ryujinx.HLE.HOS.Services.Ns
{ {
[Service("aoc:u")]
class IAddOnContentManager : IpcService class IAddOnContentManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IAddOnContentManager() public IAddOnContentManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -6,13 +6,14 @@ using System.Text;
namespace Ryujinx.HLE.HOS.Services.Ns namespace Ryujinx.HLE.HOS.Services.Ns
{ {
[Service("ns:am")]
class IApplicationManagerInterface : IpcService class IApplicationManagerInterface : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IApplicationManagerInterface() public IApplicationManagerInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,15 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Ns namespace Ryujinx.HLE.HOS.Services.Ns
{ {
[Service("ns:am2")]
[Service("ns:ec")]
class IServiceGetterInterface : IpcService class IServiceGetterInterface : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IServiceGetterInterface() public IServiceGetterInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
@ -19,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns
public long GetApplicationManagerInterface(ServiceCtx context) public long GetApplicationManagerInterface(ServiceCtx context)
{ {
MakeObject(context, new IApplicationManagerInterface()); MakeObject(context, new IApplicationManagerInterface(context));
return 0; return 0;
} }

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Ns namespace Ryujinx.HLE.HOS.Services.Ns
{ {
[Service("ns:su")]
class ISystemUpdateInterface : IpcService class ISystemUpdateInterface : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ISystemUpdateInterface() public ISystemUpdateInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Ns namespace Ryujinx.HLE.HOS.Services.Ns
{ {
[Service("ns:vm")]
class IVulnerabilityManagerInterface : IpcService class IVulnerabilityManagerInterface : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IVulnerabilityManagerInterface() public IVulnerabilityManagerInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -14,6 +14,8 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Nv namespace Ryujinx.HLE.HOS.Services.Nv
{ {
[Service("nvdrv")]
[Service("nvdrv:a")]
class INvDrvServices : IpcService class INvDrvServices : IpcService
{ {
private delegate int IoctlProcessor(ServiceCtx context, int cmd); private delegate int IoctlProcessor(ServiceCtx context, int cmd);
@ -38,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv
private KEvent _event; private KEvent _event;
public INvDrvServices(Horizon system) public INvDrvServices(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest>() _commands = new Dictionary<int, ServiceProcessRequest>()
{ {
@ -53,7 +55,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv
{ 13, FinishInitialize } { 13, FinishInitialize }
}; };
_event = new KEvent(system); _event = new KEvent(context.Device.System);
} }
static INvDrvServices() static INvDrvServices()

View file

@ -3,13 +3,17 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Pctl namespace Ryujinx.HLE.HOS.Services.Pctl
{ {
[Service("pctl")]
[Service("pctl:a")]
[Service("pctl:r")]
[Service("pctl:s")]
class IParentalControlServiceFactory : IpcService class IParentalControlServiceFactory : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IParentalControlServiceFactory() public IParentalControlServiceFactory(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -6,13 +6,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Pl namespace Ryujinx.HLE.HOS.Services.Pl
{ {
[Service("pl:u")]
class ISharedFontManager : IpcService class ISharedFontManager : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ISharedFontManager() public ISharedFontManager(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Pm namespace Ryujinx.HLE.HOS.Services.Pm
{ {
[Service("pm:shell")]
class IShellInterface : IpcService class IShellInterface : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IShellInterface() public IShellInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,13 +4,15 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Prepo namespace Ryujinx.HLE.HOS.Services.Prepo
{ {
[Service("prepo:a")]
[Service("prepo:u")]
class IPrepoService : IpcService class IPrepoService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IPrepoService() public IPrepoService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,6 +4,7 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Psm namespace Ryujinx.HLE.HOS.Services.Psm
{ {
[Service("psm")]
class IPsmServer : IpcService class IPsmServer : IpcService
{ {
enum ChargerType enum ChargerType
@ -17,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Psm
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IPsmServer() public IPsmServer(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -0,0 +1,17 @@
using System;
namespace Ryujinx.HLE.HOS.Services
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ServiceAttribute : Attribute
{
public readonly string Name;
public readonly object Parameter;
public ServiceAttribute(string name, object parameter = null)
{
Name = name;
Parameter = parameter;
}
}
}

View file

@ -0,0 +1,7 @@
namespace Ryujinx.HLE.HOS.Services
{
public static class ServiceConfiguration
{
public static bool IgnoreMissingServices { get; set; }
}
}

View file

@ -1,236 +0,0 @@
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Services.Acc;
using Ryujinx.HLE.HOS.Services.Am;
using Ryujinx.HLE.HOS.Services.Apm;
using Ryujinx.HLE.HOS.Services.Aud;
using Ryujinx.HLE.HOS.Services.Bsd;
using Ryujinx.HLE.HOS.Services.Caps;
using Ryujinx.HLE.HOS.Services.Es;
using Ryujinx.HLE.HOS.Services.FspSrv;
using Ryujinx.HLE.HOS.Services.Hid;
using Ryujinx.HLE.HOS.Services.Hid.Irs;
using Ryujinx.HLE.HOS.Services.Ldr;
using Ryujinx.HLE.HOS.Services.Lm;
using Ryujinx.HLE.HOS.Services.Mm;
using Ryujinx.HLE.HOS.Services.Ncm;
using Ryujinx.HLE.HOS.Services.Nfc.Nfp;
using Ryujinx.HLE.HOS.Services.Ns;
using Ryujinx.HLE.HOS.Services.Nv;
using Ryujinx.HLE.HOS.Services.Pctl;
using Ryujinx.HLE.HOS.Services.Pl;
using Ryujinx.HLE.HOS.Services.Pm;
using Ryujinx.HLE.HOS.Services.Prepo;
using Ryujinx.HLE.HOS.Services.Psm;
using Ryujinx.HLE.HOS.Services.Set;
using Ryujinx.HLE.HOS.Services.Sfdnsres;
using Ryujinx.HLE.HOS.Services.Sm;
using Ryujinx.HLE.HOS.Services.Spl;
using Ryujinx.HLE.HOS.Services.Ssl;
using Ryujinx.HLE.HOS.Services.Vi;
using System;
namespace Ryujinx.HLE.HOS.Services
{
public static class ServiceConfiguration
{
public static bool IgnoreMissingServices { get; set; }
}
static class ServiceFactory
{
public static IpcService MakeService(Horizon system, string name)
{
switch (name)
{
case "acc:u0":
return new IAccountService();
case "acc:u1":
return new IAccountService();
case "aoc:u":
return new IAddOnContentManager();
case "apm":
return new IManager();
case "apm:p":
return new IManager();
case "appletAE":
return new IAllSystemAppletProxiesService();
case "appletOE":
return new IApplicationProxyService();
case "audout:u":
return new IAudioOutManager();
case "audren:u":
return new IAudioRendererManager();
case "bcat:a":
return new Bcat.IServiceCreator();
case "bcat:m":
return new Bcat.IServiceCreator();
case "bcat:u":
return new Bcat.IServiceCreator();
case "bcat:s":
return new Bcat.IServiceCreator();
case "bsd:s":
return new IClient(true);
case "bsd:u":
return new IClient(false);
case "caps:a":
return new IAlbumAccessorService();
case "caps:ss":
return new IScreenshotService();
case "csrng":
return new IRandomInterface();
case "es":
return new IeTicketService();
case "friend:a":
return new Friend.IServiceCreator(Friend.FriendServicePermissionLevel.Admin);
case "friend:u":
return new Friend.IServiceCreator(Friend.FriendServicePermissionLevel.User);
case "friend:v":
return new Friend.IServiceCreator(Friend.FriendServicePermissionLevel.Overlay);
case "friend:m":
return new Friend.IServiceCreator(Friend.FriendServicePermissionLevel.Manager);
case "friend:s":
return new Friend.IServiceCreator(Friend.FriendServicePermissionLevel.System);
case "fsp-srv":
return new IFileSystemProxy();
case "hid":
return new IHidServer(system);
case "irs":
return new IIrSensorServer();
case "ldr:ro":
return new IRoInterface();
case "hwopus":
return new IHardwareOpusDecoderManager();
case "lm":
return new ILogService();
case "mm:u":
return new IRequest();
case "ncm":
return new IContentManager();
case "nfp:user":
return new IUserManager();
case "nifm:u":
return new Nifm.IStaticService();
case "ns:am":
return new IApplicationManagerInterface();
case "ns:am2":
case "ns:ec":
return new IServiceGetterInterface();
case "ns:su":
return new ISystemUpdateInterface();
case "ns:vm":
return new IVulnerabilityManagerInterface();
case "nvdrv":
return new INvDrvServices(system);
case "nvdrv:a":
return new INvDrvServices(system);
case "pctl:s":
return new IParentalControlServiceFactory();
case "pctl:r":
return new IParentalControlServiceFactory();
case "pctl:a":
return new IParentalControlServiceFactory();
case "pctl":
return new IParentalControlServiceFactory();
case "pl:u":
return new ISharedFontManager();
case "pm:shell":
return new IShellInterface();
case "prepo:a":
return new IPrepoService();
case "prepo:u":
return new IPrepoService();
case "psm":
return new IPsmServer();
case "set":
return new ISettingsServer();
case "set:sys":
return new ISystemSettingsServer();
case "sfdnsres":
return new IResolver();
case "sm:":
return new IUserInterface();
case "ssl":
return new ISslService();
case "time:a":
return new Time.IStaticService();
case "time:s":
return new Time.IStaticService();
case "time:u":
return new Time.IStaticService();
case "vi:m":
return new IManagerRootService();
case "vi:s":
return new ISystemRootService();
case "vi:u":
return new IApplicationRootService();
}
if (ServiceConfiguration.IgnoreMissingServices)
{
Logger.PrintWarning(LogClass.Service, $"Missing service {name} ignored");
return new DummyService(name);
}
throw new NotImplementedException(name);
}
}
}

View file

@ -8,13 +8,14 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Set namespace Ryujinx.HLE.HOS.Services.Set
{ {
[Service("set")]
class ISettingsServer : IpcService class ISettingsServer : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ISettingsServer() public ISettingsServer(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -11,13 +11,14 @@ using System.Text;
namespace Ryujinx.HLE.HOS.Services.Set namespace Ryujinx.HLE.HOS.Services.Set
{ {
[Service("set:sys")]
class ISystemSettingsServer : IpcService class ISystemSettingsServer : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ISystemSettingsServer() public ISystemSettingsServer(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -10,13 +10,14 @@ using static Ryujinx.HLE.HOS.ErrorCode;
namespace Ryujinx.HLE.HOS.Services.Sfdnsres namespace Ryujinx.HLE.HOS.Services.Sfdnsres
{ {
[Service("sfdnsres")]
class IResolver : IpcService class IResolver : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IResolver() public IResolver(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -6,11 +6,16 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Reflection;
namespace Ryujinx.HLE.HOS.Services.Sm namespace Ryujinx.HLE.HOS.Services.Sm
{ {
[Service("sm:")]
class IUserInterface : IpcService class IUserInterface : IpcService
{ {
private Dictionary<string, Type> _services;
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
@ -19,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm
private bool _isInitialized; private bool _isInitialized;
public IUserInterface() public IUserInterface(ServiceCtx context = null)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {
@ -30,6 +35,11 @@ namespace Ryujinx.HLE.HOS.Services.Sm
}; };
_registeredServices = new ConcurrentDictionary<string, KPort>(); _registeredServices = new ConcurrentDictionary<string, KPort>();
_services = Assembly.GetExecutingAssembly().GetTypes()
.SelectMany(type => type.GetCustomAttributes(typeof(ServiceAttribute), true)
.Select(service => (((ServiceAttribute)service).Name, type)))
.ToDictionary(service => service.Name, service => service.type);
} }
public static void InitializePort(Horizon system) public static void InitializePort(Horizon system)
@ -75,7 +85,26 @@ namespace Ryujinx.HLE.HOS.Services.Sm
} }
else else
{ {
session.ClientSession.Service = ServiceFactory.MakeService(context.Device.System, name); if (_services.TryGetValue(name, out Type type))
{
ServiceAttribute serviceAttribute = (ServiceAttribute)type.GetCustomAttributes(typeof(ServiceAttribute)).First(service => ((ServiceAttribute)service).Name == name);
session.ClientSession.Service = serviceAttribute.Parameter != null ? (IpcService)Activator.CreateInstance(type, context, serviceAttribute.Parameter)
: (IpcService)Activator.CreateInstance(type, context);
}
else
{
if (ServiceConfiguration.IgnoreMissingServices)
{
Logger.PrintWarning(LogClass.Service, $"Missing service {name} ignored");
session.ClientSession.Service = new DummyService(name);
}
else
{
throw new NotImplementedException(name);
}
}
} }
if (context.Process.HandleTable.GenerateHandle(session.ClientSession, out int handle) != KernelResult.Success) if (context.Process.HandleTable.GenerateHandle(session.ClientSession, out int handle) != KernelResult.Success)

View file

@ -5,6 +5,7 @@ using System.Security.Cryptography;
namespace Ryujinx.HLE.HOS.Services.Spl namespace Ryujinx.HLE.HOS.Services.Spl
{ {
[Service("csrng")]
class IRandomInterface : IpcService, IDisposable class IRandomInterface : IpcService, IDisposable
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
@ -13,7 +14,7 @@ namespace Ryujinx.HLE.HOS.Services.Spl
private RNGCryptoServiceProvider _rng; private RNGCryptoServiceProvider _rng;
public IRandomInterface() public IRandomInterface(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,13 +4,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Ssl namespace Ryujinx.HLE.HOS.Services.Ssl
{ {
[Service("ssl")]
class ISslService : IpcService class ISslService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ISslService() public ISslService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -5,6 +5,9 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Time namespace Ryujinx.HLE.HOS.Services.Time
{ {
[Service("time:a")]
[Service("time:s")]
[Service("time:u")]
class IStaticService : IpcService class IStaticService : IpcService
{ {
private int _timeSharedMemoryNativeHandle = 0; private int _timeSharedMemoryNativeHandle = 0;
@ -15,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Time
private static readonly DateTime StartupDate = DateTime.UtcNow; private static readonly DateTime StartupDate = DateTime.UtcNow;
public IStaticService() public IStaticService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Vi namespace Ryujinx.HLE.HOS.Services.Vi
{ {
[Service("vi:u")]
class IApplicationRootService : IpcService class IApplicationRootService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IApplicationRootService() public IApplicationRootService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Vi namespace Ryujinx.HLE.HOS.Services.Vi
{ {
[Service("vi:m")]
class IManagerRootService : IpcService class IManagerRootService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public IManagerRootService() public IManagerRootService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -3,13 +3,14 @@ using System.Collections.Generic;
namespace Ryujinx.HLE.HOS.Services.Vi namespace Ryujinx.HLE.HOS.Services.Vi
{ {
[Service("vi:s")]
class ISystemRootService : IpcService class ISystemRootService : IpcService
{ {
private Dictionary<int, ServiceProcessRequest> _commands; private Dictionary<int, ServiceProcessRequest> _commands;
public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands; public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
public ISystemRootService() public ISystemRootService(ServiceCtx context)
{ {
_commands = new Dictionary<int, ServiceProcessRequest> _commands = new Dictionary<int, ServiceProcessRequest>
{ {

View file

@ -4,6 +4,7 @@
<TargetFramework>netcoreapp2.1</TargetFramework> <TargetFramework>netcoreapp2.1</TargetFramework>
<RuntimeIdentifiers>win10-x64;osx-x64;linux-x64</RuntimeIdentifiers> <RuntimeIdentifiers>win10-x64;osx-x64;linux-x64</RuntimeIdentifiers>
<Configurations>Debug;Release;Profile Debug;Profile Release</Configurations> <Configurations>Debug;Release;Profile Debug;Profile Release</Configurations>
<LangVersion>7.1</LangVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">