From 596b61ce1fc9ac0397c3ea74a1033a3be5608512 Mon Sep 17 00:00:00 2001 From: Ac_K Date: Wed, 10 Jul 2019 17:59:54 +0200 Subject: 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 --- Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs | 33 +++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'Ryujinx.HLE/HOS/Services/Sm') diff --git a/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs index 914862f1..4a663bd7 100644 --- a/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs +++ b/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs @@ -6,11 +6,16 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Reflection; namespace Ryujinx.HLE.HOS.Services.Sm { + [Service("sm:")] class IUserInterface : IpcService { + private Dictionary _services; + private Dictionary _commands; public override IReadOnlyDictionary Commands => _commands; @@ -19,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm private bool _isInitialized; - public IUserInterface() + public IUserInterface(ServiceCtx context = null) { _commands = new Dictionary { @@ -30,6 +35,11 @@ namespace Ryujinx.HLE.HOS.Services.Sm }; _registeredServices = new ConcurrentDictionary(); + + _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) @@ -75,7 +85,26 @@ namespace Ryujinx.HLE.HOS.Services.Sm } 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) -- cgit v1.2.3