From 74a150dff12a28346b620ac6b9d38480076c57fa Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Wed, 2 Sep 2020 22:11:28 +0100 Subject: [PATCH] Rework service API to be cleaner with significantly less boilerplate This patch reduces the burden of adding services significantly, rather than having to create an enum entry and add strings in the constructor it will all be determined at runtime through RTTI. A macro is also used in the service creation case to reduce clutter. --- app/src/main/cpp/skyline/kernel/svc.cpp | 2 +- .../main/cpp/skyline/kernel/types/KSession.h | 3 +- .../account/IAccountServiceForApplication.cpp | 2 +- .../account/IManagerForApplication.cpp | 2 +- .../cpp/skyline/services/account/IProfile.cpp | 2 +- .../am/IAllSystemAppletProxiesService.cpp | 2 +- .../services/am/IApplicationProxyService.cpp | 2 +- .../am/applet/ILibraryAppletAccessor.cpp | 2 +- .../am/controller/IAppletCommonFunctions.cpp | 2 +- .../am/controller/IApplicationFunctions.cpp | 2 +- .../am/controller/IAudioController.cpp | 2 +- .../am/controller/ICommonStateGetter.cpp | 2 +- .../am/controller/IDebugFunctions.cpp | 2 +- .../am/controller/IDisplayController.cpp | 2 +- .../am/controller/ILibraryAppletCreator.cpp | 2 +- .../am/controller/ISelfController.cpp | 4 +- .../am/controller/IWindowController.cpp | 2 +- .../services/am/proxy/IApplicationProxy.cpp | 2 +- .../services/am/proxy/ILibraryAppletProxy.cpp | 2 +- .../services/am/proxy/IOverlayAppletProxy.cpp | 2 +- .../services/am/proxy/ISystemAppletProxy.cpp | 2 +- .../skyline/services/am/proxy/base_proxy.cpp | 2 +- .../skyline/services/am/proxy/base_proxy.h | 2 +- .../skyline/services/am/storage/IStorage.cpp | 2 +- .../services/am/storage/IStorageAccessor.cpp | 2 +- .../services/aocsrv/IAddOnContentManager.cpp | 2 +- .../cpp/skyline/services/apm/IManager.cpp | 2 +- .../cpp/skyline/services/apm/ISession.cpp | 2 +- .../skyline/services/audio/IAudioDevice.cpp | 2 +- .../cpp/skyline/services/audio/IAudioOut.cpp | 2 +- .../services/audio/IAudioOutManager.cpp | 2 +- .../audio/IAudioRenderer/IAudioRenderer.cpp | 2 +- .../services/audio/IAudioRendererManager.cpp | 2 +- .../main/cpp/skyline/services/base_service.h | 142 +++------------ .../skyline/services/fatalsrv/IService.cpp | 2 +- .../services/friends/IFriendService.cpp | 2 +- .../services/friends/INotificationService.cpp | 2 +- .../services/friends/IServiceCreator.cpp | 2 +- .../main/cpp/skyline/services/fssrv/IFile.cpp | 2 +- .../skyline/services/fssrv/IFileSystem.cpp | 2 +- .../services/fssrv/IFileSystemProxy.cpp | 2 +- .../cpp/skyline/services/fssrv/IStorage.cpp | 2 +- .../hid/IActiveVibrationDeviceList.cpp | 2 +- .../skyline/services/hid/IAppletResource.cpp | 2 +- .../cpp/skyline/services/hid/IHidServer.cpp | 2 +- .../services/hosbinder/IHOSBinderDriver.cpp | 4 +- .../cpp/skyline/services/lm/ILogService.cpp | 2 +- .../main/cpp/skyline/services/lm/ILogger.cpp | 2 +- .../main/cpp/skyline/services/nfp/IUser.cpp | 2 +- .../cpp/skyline/services/nfp/IUserManager.cpp | 2 +- .../skyline/services/nifm/IGeneralService.cpp | 2 +- .../cpp/skyline/services/nifm/IRequest.cpp | 2 +- .../skyline/services/nifm/IStaticService.cpp | 2 +- .../skyline/services/nvdrv/INvDrvServices.cpp | 2 +- .../services/nvdrv/devices/nvhost_as_gpu.cpp | 4 +- .../services/nvdrv/devices/nvhost_channel.cpp | 6 +- .../services/nvdrv/devices/nvhost_ctrl.cpp | 4 +- .../services/pctl/IParentalControlService.cpp | 2 +- .../pctl/IParentalControlServiceFactory.cpp | 2 +- .../services/pl/IPlatformServiceManager.cpp | 2 +- .../skyline/services/prepo/IPrepoService.cpp | 2 +- .../main/cpp/skyline/services/serviceman.cpp | 165 +++++++----------- .../main/cpp/skyline/services/serviceman.h | 32 ++-- .../services/settings/ISettingsServer.cpp | 2 +- .../settings/ISystemSettingsServer.cpp | 2 +- .../skyline/services/sm/IUserInterface.cpp | 16 +- .../skyline/services/socket/bsd/IClient.cpp | 2 +- .../cpp/skyline/services/ssl/ISslContext.cpp | 2 +- .../cpp/skyline/services/ssl/ISslService.cpp | 2 +- .../services/timesrv/IStaticService.cpp | 2 +- .../skyline/services/timesrv/ISteadyClock.cpp | 2 +- .../skyline/services/timesrv/ISystemClock.cpp | 2 +- .../services/timesrv/ITimeZoneService.cpp | 2 +- .../visrv/IApplicationDisplayService.cpp | 12 +- .../services/visrv/IDisplayService.cpp | 6 +- .../skyline/services/visrv/IDisplayService.h | 8 +- .../services/visrv/IManagerDisplayService.cpp | 6 +- .../services/visrv/IManagerRootService.cpp | 2 +- .../services/visrv/ISystemDisplayService.cpp | 2 +- 79 files changed, 204 insertions(+), 338 deletions(-) diff --git a/app/src/main/cpp/skyline/kernel/svc.cpp b/app/src/main/cpp/skyline/kernel/svc.cpp index 7eb51f36..adf2dbb6 100644 --- a/app/src/main/cpp/skyline/kernel/svc.cpp +++ b/app/src/main/cpp/skyline/kernel/svc.cpp @@ -588,7 +588,7 @@ namespace skyline::kernel::svc { KHandle handle{}; if (port.compare("sm:") >= 0) { - handle = state.os->serviceManager.NewSession(service::Service::sm_IUserInterface); + handle = state.process->NewHandle(std::static_pointer_cast(state.os->serviceManager.smUserInterface)).handle; } else { state.logger->Warn("svcConnectToNamedPort: Connecting to invalid port: '{}'", port); state.ctx->registers.w0 = constant::status::NotFound; diff --git a/app/src/main/cpp/skyline/kernel/types/KSession.h b/app/src/main/cpp/skyline/kernel/types/KSession.h index 3d5fc3ab..9ec36699 100644 --- a/app/src/main/cpp/skyline/kernel/types/KSession.h +++ b/app/src/main/cpp/skyline/kernel/types/KSession.h @@ -16,7 +16,6 @@ namespace skyline::kernel::type { std::shared_ptr serviceObject; //!< A shared pointer to the service class std::unordered_map> domainTable; //!< This maps from a virtual handle to it's service KHandle handleIndex{0x1}; //!< The currently allocated handle index - service::Service serviceType; //!< The type of the service enum class ServiceStatus { Open, Closed } serviceStatus{ServiceStatus::Open}; //!< If the session is open or closed bool isDomain{}; //!< Holds if this is a domain session or not @@ -24,7 +23,7 @@ namespace skyline::kernel::type { * @param state The state of the device * @param serviceObject A shared pointer to the service class */ - KSession(const DeviceState &state, std::shared_ptr &serviceObject) : serviceObject(serviceObject), serviceType(serviceObject->serviceType), KSyncObject(state, KType::KSession) {} + KSession(const DeviceState &state, std::shared_ptr &serviceObject) : serviceObject(serviceObject), KSyncObject(state, KType::KSession) {} /** * This converts this session into a domain session (https://switchbrew.org/wiki/IPC_Marshalling#Domains) diff --git a/app/src/main/cpp/skyline/services/account/IAccountServiceForApplication.cpp b/app/src/main/cpp/skyline/services/account/IAccountServiceForApplication.cpp index 5abd0fa7..8031ab4c 100644 --- a/app/src/main/cpp/skyline/services/account/IAccountServiceForApplication.cpp +++ b/app/src/main/cpp/skyline/services/account/IAccountServiceForApplication.cpp @@ -7,7 +7,7 @@ #include "IAccountServiceForApplication.h" namespace skyline::service::account { - IAccountServiceForApplication::IAccountServiceForApplication(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::account_IAccountServiceForApplication, "account:IAccountServiceForApplication", { + IAccountServiceForApplication::IAccountServiceForApplication(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x1, SFUNC(IAccountServiceForApplication::GetUserExistence)}, {0x2, SFUNC(IAccountServiceForApplication::ListAllUsers)}, {0x3, SFUNC(IAccountServiceForApplication::ListOpenUsers)}, diff --git a/app/src/main/cpp/skyline/services/account/IManagerForApplication.cpp b/app/src/main/cpp/skyline/services/account/IManagerForApplication.cpp index a13e09ea..14da079f 100644 --- a/app/src/main/cpp/skyline/services/account/IManagerForApplication.cpp +++ b/app/src/main/cpp/skyline/services/account/IManagerForApplication.cpp @@ -4,6 +4,6 @@ #include "IManagerForApplication.h" namespace skyline::service::account { - IManagerForApplication::IManagerForApplication(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::account_IManagerForApplication, "account:IManagerForApplication", { + IManagerForApplication::IManagerForApplication(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/account/IProfile.cpp b/app/src/main/cpp/skyline/services/account/IProfile.cpp index 3f79bed3..3e1abcb6 100644 --- a/app/src/main/cpp/skyline/services/account/IProfile.cpp +++ b/app/src/main/cpp/skyline/services/account/IProfile.cpp @@ -5,7 +5,7 @@ #include "IProfile.h" namespace skyline::service::account { - IProfile::IProfile(const DeviceState &state, ServiceManager &manager, const UserId &userId) : userId(userId), BaseService(state, manager, Service::account_IProfile, "account:IProfile", { + IProfile::IProfile(const DeviceState &state, ServiceManager &manager, const UserId &userId) : userId(userId), BaseService(state, manager, { {0x0, SFUNC(IProfile::Get)}, {0x1, SFUNC(IProfile::GetBase)} }) {} diff --git a/app/src/main/cpp/skyline/services/am/IAllSystemAppletProxiesService.cpp b/app/src/main/cpp/skyline/services/am/IAllSystemAppletProxiesService.cpp index 2802f685..f27d6920 100644 --- a/app/src/main/cpp/skyline/services/am/IAllSystemAppletProxiesService.cpp +++ b/app/src/main/cpp/skyline/services/am/IAllSystemAppletProxiesService.cpp @@ -8,7 +8,7 @@ #include "IAllSystemAppletProxiesService.h" namespace skyline::service::am { - IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IAllSystemAppletProxiesService, "am:IAllSystemAppletProxiesService", { + IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x64, SFUNC(IAllSystemAppletProxiesService::OpenSystemAppletProxy)}, {0xC8, SFUNC(IAllSystemAppletProxiesService::OpenLibraryAppletProxy)}, {0xC9, SFUNC(IAllSystemAppletProxiesService::OpenLibraryAppletProxy)}, diff --git a/app/src/main/cpp/skyline/services/am/IApplicationProxyService.cpp b/app/src/main/cpp/skyline/services/am/IApplicationProxyService.cpp index 0153f686..ffdc0b17 100644 --- a/app/src/main/cpp/skyline/services/am/IApplicationProxyService.cpp +++ b/app/src/main/cpp/skyline/services/am/IApplicationProxyService.cpp @@ -5,7 +5,7 @@ #include "IApplicationProxyService.h" namespace skyline::service::am { - IApplicationProxyService::IApplicationProxyService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IApplicationProxyService, "am:IApplicationProxyService", { + IApplicationProxyService::IApplicationProxyService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IApplicationProxyService::OpenApplicationProxy)} }) {} diff --git a/app/src/main/cpp/skyline/services/am/applet/ILibraryAppletAccessor.cpp b/app/src/main/cpp/skyline/services/am/applet/ILibraryAppletAccessor.cpp index 22cfdb69..c50c3915 100644 --- a/app/src/main/cpp/skyline/services/am/applet/ILibraryAppletAccessor.cpp +++ b/app/src/main/cpp/skyline/services/am/applet/ILibraryAppletAccessor.cpp @@ -7,7 +7,7 @@ #include "ILibraryAppletAccessor.h" namespace skyline::service::am { - ILibraryAppletAccessor::ILibraryAppletAccessor(const DeviceState &state, ServiceManager &manager) : stateChangeEvent(std::make_shared(state)), BaseService(state, manager, Service::am_ILibraryAppletAccessor, "am:ILibraryAppletAccessor", { + ILibraryAppletAccessor::ILibraryAppletAccessor(const DeviceState &state, ServiceManager &manager) : stateChangeEvent(std::make_shared(state)), BaseService(state, manager, { {0x0, SFUNC(ILibraryAppletAccessor::GetAppletStateChangedEvent)}, {0xA, SFUNC(ILibraryAppletAccessor::Start)}, {0x1E, SFUNC(ILibraryAppletAccessor::GetResult)}, diff --git a/app/src/main/cpp/skyline/services/am/controller/IAppletCommonFunctions.cpp b/app/src/main/cpp/skyline/services/am/controller/IAppletCommonFunctions.cpp index e172f454..954a67e5 100644 --- a/app/src/main/cpp/skyline/services/am/controller/IAppletCommonFunctions.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/IAppletCommonFunctions.cpp @@ -4,6 +4,6 @@ #include "IAppletCommonFunctions.h" namespace skyline::service::am { - IAppletCommonFunctions::IAppletCommonFunctions(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IAppletCommonFunctions, "am:IAppletCommonFunctions", { + IAppletCommonFunctions::IAppletCommonFunctions(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/am/controller/IApplicationFunctions.cpp b/app/src/main/cpp/skyline/services/am/controller/IApplicationFunctions.cpp index f7f1f6d5..ba145af4 100644 --- a/app/src/main/cpp/skyline/services/am/controller/IApplicationFunctions.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/IApplicationFunctions.cpp @@ -7,7 +7,7 @@ #include "IApplicationFunctions.h" namespace skyline::service::am { - IApplicationFunctions::IApplicationFunctions(const DeviceState &state, ServiceManager &manager) : gpuErrorEvent(std::make_shared(state)), BaseService(state, manager, Service::am_IApplicationFunctions, "am:IApplicationFunctions", { + IApplicationFunctions::IApplicationFunctions(const DeviceState &state, ServiceManager &manager) : gpuErrorEvent(std::make_shared(state)), BaseService(state, manager, { {0x1, SFUNC(IApplicationFunctions::PopLaunchParameter)}, {0x14, SFUNC(IApplicationFunctions::EnsureSaveData)}, {0x15, SFUNC(IApplicationFunctions::GetDesiredLanguage)}, diff --git a/app/src/main/cpp/skyline/services/am/controller/IAudioController.cpp b/app/src/main/cpp/skyline/services/am/controller/IAudioController.cpp index 1bec0df0..1f07c516 100644 --- a/app/src/main/cpp/skyline/services/am/controller/IAudioController.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/IAudioController.cpp @@ -4,7 +4,7 @@ #include "IAudioController.h" namespace skyline::service::am { - IAudioController::IAudioController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IAudioController, "am:IAudioController", { + IAudioController::IAudioController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IAudioController::SetExpectedMasterVolume)}, {0x1, SFUNC(IAudioController::GetMainAppletExpectedMasterVolume)}, {0x2, SFUNC(IAudioController::GetLibraryAppletExpectedMasterVolume)} diff --git a/app/src/main/cpp/skyline/services/am/controller/ICommonStateGetter.cpp b/app/src/main/cpp/skyline/services/am/controller/ICommonStateGetter.cpp index b6109185..c871e5de 100644 --- a/app/src/main/cpp/skyline/services/am/controller/ICommonStateGetter.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/ICommonStateGetter.cpp @@ -10,7 +10,7 @@ namespace skyline::service::am { messageEvent->Signal(); } - ICommonStateGetter::ICommonStateGetter(const DeviceState &state, ServiceManager &manager) : messageEvent(std::make_shared(state)), BaseService(state, manager, Service::am_ICommonStateGetter, "am:ICommonStateGetter", { + ICommonStateGetter::ICommonStateGetter(const DeviceState &state, ServiceManager &manager) : messageEvent(std::make_shared(state)), BaseService(state, manager, { {0x0, SFUNC(ICommonStateGetter::GetEventHandle)}, {0x1, SFUNC(ICommonStateGetter::ReceiveMessage)}, {0x5, SFUNC(ICommonStateGetter::GetOperationMode)}, diff --git a/app/src/main/cpp/skyline/services/am/controller/IDebugFunctions.cpp b/app/src/main/cpp/skyline/services/am/controller/IDebugFunctions.cpp index f2ddcbae..078fc25c 100644 --- a/app/src/main/cpp/skyline/services/am/controller/IDebugFunctions.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/IDebugFunctions.cpp @@ -4,6 +4,6 @@ #include "IDebugFunctions.h" namespace skyline::service::am { - IDebugFunctions::IDebugFunctions(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IDebugFunctions, "am:IDebugFunctions", { + IDebugFunctions::IDebugFunctions(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/am/controller/IDisplayController.cpp b/app/src/main/cpp/skyline/services/am/controller/IDisplayController.cpp index 51d1b502..4c179952 100644 --- a/app/src/main/cpp/skyline/services/am/controller/IDisplayController.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/IDisplayController.cpp @@ -4,6 +4,6 @@ #include "IDisplayController.h" namespace skyline::service::am { - IDisplayController::IDisplayController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IDisplayController, "am:IDisplayController", { + IDisplayController::IDisplayController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/am/controller/ILibraryAppletCreator.cpp b/app/src/main/cpp/skyline/services/am/controller/ILibraryAppletCreator.cpp index 4e182cf2..cf0c8c84 100644 --- a/app/src/main/cpp/skyline/services/am/controller/ILibraryAppletCreator.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/ILibraryAppletCreator.cpp @@ -6,7 +6,7 @@ #include "ILibraryAppletCreator.h" namespace skyline::service::am { - ILibraryAppletCreator::ILibraryAppletCreator(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_ILibraryAppletCreator, "am:ILibraryAppletCreator", { + ILibraryAppletCreator::ILibraryAppletCreator(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(ILibraryAppletCreator::CreateLibraryApplet)}, {0xA, SFUNC(ILibraryAppletCreator::CreateStorage)} }) {} diff --git a/app/src/main/cpp/skyline/services/am/controller/ISelfController.cpp b/app/src/main/cpp/skyline/services/am/controller/ISelfController.cpp index 3446b13b..01881d28 100644 --- a/app/src/main/cpp/skyline/services/am/controller/ISelfController.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/ISelfController.cpp @@ -7,7 +7,7 @@ #include "ISelfController.h" namespace skyline::service::am { - ISelfController::ISelfController(const DeviceState &state, ServiceManager &manager) : libraryAppletLaunchableEvent(std::make_shared(state)), accumulatedSuspendedTickChangedEvent(std::make_shared(state)), BaseService(state, manager, Service::am_ISelfController, "am:ISelfController", { + ISelfController::ISelfController(const DeviceState &state, ServiceManager &manager) : libraryAppletLaunchableEvent(std::make_shared(state)), accumulatedSuspendedTickChangedEvent(std::make_shared(state)), BaseService(state, manager, { {0x1, SFUNC(ISelfController::LockExit)}, {0x2, SFUNC(ISelfController::UnlockExit)}, {0x9, SFUNC(ISelfController::GetLibraryAppletLaunchableEvent)}, @@ -46,7 +46,7 @@ namespace skyline::service::am { void ISelfController::CreateManagedDisplayLayer(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { state.logger->Debug("Creating Managed Layer on Default Display"); - auto hosBinder = state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver); + auto hosBinder = state.os->serviceManager.GetService("dispdrv"); if (hosBinder->layerStatus != hosbinder::LayerStatus::Uninitialized) throw exception("The application is creating more than one layer"); hosBinder->layerStatus = hosbinder::LayerStatus::Managed; diff --git a/app/src/main/cpp/skyline/services/am/controller/IWindowController.cpp b/app/src/main/cpp/skyline/services/am/controller/IWindowController.cpp index 00de6be3..81f40a2b 100644 --- a/app/src/main/cpp/skyline/services/am/controller/IWindowController.cpp +++ b/app/src/main/cpp/skyline/services/am/controller/IWindowController.cpp @@ -5,7 +5,7 @@ #include "IWindowController.h" namespace skyline::service::am { - IWindowController::IWindowController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::am_IWindowController, "am:IWindowController", { + IWindowController::IWindowController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x1, SFUNC(IWindowController::GetAppletResourceUserId)}, {0xA, SFUNC(IWindowController::AcquireForegroundRights)} }) {} diff --git a/app/src/main/cpp/skyline/services/am/proxy/IApplicationProxy.cpp b/app/src/main/cpp/skyline/services/am/proxy/IApplicationProxy.cpp index ad5b0942..e8b2b794 100644 --- a/app/src/main/cpp/skyline/services/am/proxy/IApplicationProxy.cpp +++ b/app/src/main/cpp/skyline/services/am/proxy/IApplicationProxy.cpp @@ -5,7 +5,7 @@ #include "IApplicationProxy.h" namespace skyline::service::am { - IApplicationProxy::IApplicationProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, Service::am_IApplicationProxy, "am:IApplicationProxy", { + IApplicationProxy::IApplicationProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, { {0x0, SFUNC(BaseProxy::GetCommonStateGetter)}, {0x1, SFUNC(BaseProxy::GetSelfController)}, {0x2, SFUNC(BaseProxy::GetWindowController)}, diff --git a/app/src/main/cpp/skyline/services/am/proxy/ILibraryAppletProxy.cpp b/app/src/main/cpp/skyline/services/am/proxy/ILibraryAppletProxy.cpp index 552ecc86..4bf624bb 100644 --- a/app/src/main/cpp/skyline/services/am/proxy/ILibraryAppletProxy.cpp +++ b/app/src/main/cpp/skyline/services/am/proxy/ILibraryAppletProxy.cpp @@ -4,7 +4,7 @@ #include "ILibraryAppletProxy.h" namespace skyline::service::am { - ILibraryAppletProxy::ILibraryAppletProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, Service::am_ILibraryAppletProxy, "am:ILibraryAppletProxy", { + ILibraryAppletProxy::ILibraryAppletProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, { {0x0, SFUNC(BaseProxy::GetCommonStateGetter)}, {0x1, SFUNC(BaseProxy::GetSelfController)}, {0x2, SFUNC(BaseProxy::GetWindowController)}, diff --git a/app/src/main/cpp/skyline/services/am/proxy/IOverlayAppletProxy.cpp b/app/src/main/cpp/skyline/services/am/proxy/IOverlayAppletProxy.cpp index 46565ee9..c181d2f4 100644 --- a/app/src/main/cpp/skyline/services/am/proxy/IOverlayAppletProxy.cpp +++ b/app/src/main/cpp/skyline/services/am/proxy/IOverlayAppletProxy.cpp @@ -4,7 +4,7 @@ #include "IOverlayAppletProxy.h" namespace skyline::service::am { - IOverlayAppletProxy::IOverlayAppletProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, Service::am_IOverlayAppletProxy, "am:IOverlayAppletProxy", { + IOverlayAppletProxy::IOverlayAppletProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, { {0x0, SFUNC(BaseProxy::GetCommonStateGetter)}, {0x1, SFUNC(BaseProxy::GetSelfController)}, {0x2, SFUNC(BaseProxy::GetWindowController)}, diff --git a/app/src/main/cpp/skyline/services/am/proxy/ISystemAppletProxy.cpp b/app/src/main/cpp/skyline/services/am/proxy/ISystemAppletProxy.cpp index a6dec342..d3fa68d4 100644 --- a/app/src/main/cpp/skyline/services/am/proxy/ISystemAppletProxy.cpp +++ b/app/src/main/cpp/skyline/services/am/proxy/ISystemAppletProxy.cpp @@ -4,7 +4,7 @@ #include "ISystemAppletProxy.h" namespace skyline::service::am { - ISystemAppletProxy::ISystemAppletProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, Service::am_ISystemAppletProxy, "am:ISystemAppletProxy", { + ISystemAppletProxy::ISystemAppletProxy(const DeviceState &state, ServiceManager &manager) : BaseProxy(state, manager, { {0x0, SFUNC(BaseProxy::GetCommonStateGetter)}, {0x1, SFUNC(BaseProxy::GetSelfController)}, {0x2, SFUNC(BaseProxy::GetWindowController)}, diff --git a/app/src/main/cpp/skyline/services/am/proxy/base_proxy.cpp b/app/src/main/cpp/skyline/services/am/proxy/base_proxy.cpp index 509c0aec..8b823aaa 100644 --- a/app/src/main/cpp/skyline/services/am/proxy/base_proxy.cpp +++ b/app/src/main/cpp/skyline/services/am/proxy/base_proxy.cpp @@ -12,7 +12,7 @@ #include "base_proxy.h" namespace skyline::service::am { - BaseProxy::BaseProxy(const DeviceState &state, ServiceManager &manager, const Service serviceType, const std::string &serviceName, const std::unordered_map> &vTable) : BaseService(state, manager, serviceType, serviceName, vTable) {} + BaseProxy::BaseProxy(const DeviceState &state, ServiceManager &manager, const std::unordered_map> &vTable) : BaseService(state, manager, vTable) {} void BaseProxy::GetCommonStateGetter(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { manager.RegisterService(SRVREG(ICommonStateGetter), session, response); diff --git a/app/src/main/cpp/skyline/services/am/proxy/base_proxy.h b/app/src/main/cpp/skyline/services/am/proxy/base_proxy.h index fabac5a7..bc43688d 100644 --- a/app/src/main/cpp/skyline/services/am/proxy/base_proxy.h +++ b/app/src/main/cpp/skyline/services/am/proxy/base_proxy.h @@ -12,7 +12,7 @@ namespace skyline::service::am { */ class BaseProxy : public BaseService { public: - BaseProxy(const DeviceState &state, ServiceManager &manager, const Service serviceType, const std::string &serviceName, const std::unordered_map> &vTable); + BaseProxy(const DeviceState &state, ServiceManager &manager, const std::unordered_map> &vTable); /** * @brief This returns #ICommonStateGetter (https://switchbrew.org/wiki/Applet_Manager_services#ICommonStateGetter) diff --git a/app/src/main/cpp/skyline/services/am/storage/IStorage.cpp b/app/src/main/cpp/skyline/services/am/storage/IStorage.cpp index 28c86032..922dbbc4 100644 --- a/app/src/main/cpp/skyline/services/am/storage/IStorage.cpp +++ b/app/src/main/cpp/skyline/services/am/storage/IStorage.cpp @@ -5,7 +5,7 @@ #include "IStorage.h" namespace skyline::service::am { - IStorage::IStorage(const DeviceState &state, ServiceManager &manager, size_t size) : content(size), BaseService(state, manager, Service::am_IStorage, "am:IStorage", { + IStorage::IStorage(const DeviceState &state, ServiceManager &manager, size_t size) : content(size), BaseService(state, manager, { {0x0, SFUNC(IStorage::Open)} }) {} diff --git a/app/src/main/cpp/skyline/services/am/storage/IStorageAccessor.cpp b/app/src/main/cpp/skyline/services/am/storage/IStorageAccessor.cpp index 76b3361a..81859244 100644 --- a/app/src/main/cpp/skyline/services/am/storage/IStorageAccessor.cpp +++ b/app/src/main/cpp/skyline/services/am/storage/IStorageAccessor.cpp @@ -6,7 +6,7 @@ #include "IStorageAccessor.h" namespace skyline::service::am { - IStorageAccessor::IStorageAccessor(const DeviceState &state, ServiceManager &manager, std::shared_ptr parent) : parent(parent), BaseService(state, manager, Service::am_IStorageAccessor, "am:IStorageAccessor", { + IStorageAccessor::IStorageAccessor(const DeviceState &state, ServiceManager &manager, std::shared_ptr parent) : parent(parent), BaseService(state, manager, { {0x0, SFUNC(IStorageAccessor::GetSize)}, {0xA, SFUNC(IStorageAccessor::Write)}, {0xB, SFUNC(IStorageAccessor::Read)} diff --git a/app/src/main/cpp/skyline/services/aocsrv/IAddOnContentManager.cpp b/app/src/main/cpp/skyline/services/aocsrv/IAddOnContentManager.cpp index 1b59712e..461507d5 100644 --- a/app/src/main/cpp/skyline/services/aocsrv/IAddOnContentManager.cpp +++ b/app/src/main/cpp/skyline/services/aocsrv/IAddOnContentManager.cpp @@ -4,6 +4,6 @@ #include "IAddOnContentManager.h" namespace skyline::service::aocsrv { - IAddOnContentManager::IAddOnContentManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::aocsrv_IAddOnContentManager, "aocsrv:IAddOnContentManager", { + IAddOnContentManager::IAddOnContentManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/apm/IManager.cpp b/app/src/main/cpp/skyline/services/apm/IManager.cpp index 9c724671..5077a453 100644 --- a/app/src/main/cpp/skyline/services/apm/IManager.cpp +++ b/app/src/main/cpp/skyline/services/apm/IManager.cpp @@ -5,7 +5,7 @@ #include "IManager.h" namespace skyline::service::apm { - IManager::IManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::apm_IManager, "apm:IManager", { + IManager::IManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IManager::OpenSession)} }) {} diff --git a/app/src/main/cpp/skyline/services/apm/ISession.cpp b/app/src/main/cpp/skyline/services/apm/ISession.cpp index 360e476c..5d6e5e02 100644 --- a/app/src/main/cpp/skyline/services/apm/ISession.cpp +++ b/app/src/main/cpp/skyline/services/apm/ISession.cpp @@ -4,7 +4,7 @@ #include "ISession.h" namespace skyline::service::apm { - ISession::ISession(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::apm_ISession, "apm:ISession", { + ISession::ISession(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(ISession::SetPerformanceConfiguration)}, {0x1, SFUNC(ISession::GetPerformanceConfiguration)} }) {} diff --git a/app/src/main/cpp/skyline/services/audio/IAudioDevice.cpp b/app/src/main/cpp/skyline/services/audio/IAudioDevice.cpp index 75bdcebc..3265c4c2 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioDevice.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioDevice.cpp @@ -6,7 +6,7 @@ #include "IAudioDevice.h" namespace skyline::service::audio { - IAudioDevice::IAudioDevice(const DeviceState &state, ServiceManager &manager) : systemEvent(std::make_shared(state)), BaseService(state, manager, Service::audio_IAudioDevice, "audio:IAudioDevice", { + IAudioDevice::IAudioDevice(const DeviceState &state, ServiceManager &manager) : systemEvent(std::make_shared(state)), BaseService(state, manager, { {0x0, SFUNC(IAudioDevice::ListAudioDeviceName)}, {0x1, SFUNC(IAudioDevice::SetAudioDeviceOutputVolume)}, {0x3, SFUNC(IAudioDevice::GetActiveAudioDeviceName)}, diff --git a/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp b/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp index 33db3619..5e271ca3 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp @@ -5,7 +5,7 @@ #include "IAudioOut.h" namespace skyline::service::audio { - IAudioOut::IAudioOut(const DeviceState &state, ServiceManager &manager, u8 channelCount, u32 sampleRate) : sampleRate(sampleRate), channelCount(channelCount), releaseEvent(std::make_shared(state)), BaseService(state, manager, Service::audio_IAudioOut, "audio:IAudioOut", { + IAudioOut::IAudioOut(const DeviceState &state, ServiceManager &manager, u8 channelCount, u32 sampleRate) : sampleRate(sampleRate), channelCount(channelCount), releaseEvent(std::make_shared(state)), BaseService(state, manager, { {0x0, SFUNC(IAudioOut::GetAudioOutState)}, {0x1, SFUNC(IAudioOut::StartAudioOut)}, {0x2, SFUNC(IAudioOut::StopAudioOut)}, diff --git a/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp b/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp index 119abe1d..e64d1d85 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioOutManager.cpp @@ -6,7 +6,7 @@ #include "IAudioOut.h" namespace skyline::service::audio { - IAudioOutManager::IAudioOutManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::audio_IAudioOutManager, "audio:IAudioOutManager", { + IAudioOutManager::IAudioOutManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IAudioOutManager::ListAudioOuts)}, {0x1, SFUNC(IAudioOutManager::OpenAudioOut)}, {0x2, SFUNC(IAudioOutManager::ListAudioOuts)}, diff --git a/app/src/main/cpp/skyline/services/audio/IAudioRenderer/IAudioRenderer.cpp b/app/src/main/cpp/skyline/services/audio/IAudioRenderer/IAudioRenderer.cpp index aea6af15..3c6581c3 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioRenderer/IAudioRenderer.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioRenderer/IAudioRenderer.cpp @@ -6,7 +6,7 @@ namespace skyline::service::audio::IAudioRenderer { IAudioRenderer::IAudioRenderer(const DeviceState &state, ServiceManager &manager, AudioRendererParameters ¶meters) - : systemEvent(std::make_shared(state)), parameters(parameters), BaseService(state, manager, Service::audio_IAudioRenderer, "audio:IAudioRenderer", { + : systemEvent(std::make_shared(state)), parameters(parameters), BaseService(state, manager, { {0x0, SFUNC(IAudioRenderer::GetSampleRate)}, {0x1, SFUNC(IAudioRenderer::GetSampleCount)}, {0x2, SFUNC(IAudioRenderer::GetMixBufferCount)}, diff --git a/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp b/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp index 18a3f9a1..0055484c 100644 --- a/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioRendererManager.cpp @@ -7,7 +7,7 @@ #include "IAudioRendererManager.h" namespace skyline::service::audio { - IAudioRendererManager::IAudioRendererManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::audio_IAudioRendererManager, "audio:IAudioRendererManager", { + IAudioRendererManager::IAudioRendererManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IAudioRendererManager::OpenAudioRenderer)}, {0x1, SFUNC(IAudioRendererManager::GetAudioRendererWorkBufferSize)}, {0x2, SFUNC(IAudioRendererManager::GetAudioDeviceService)}, diff --git a/app/src/main/cpp/skyline/services/base_service.h b/app/src/main/cpp/skyline/services/base_service.h index 7c3627a4..9c0a09bb 100644 --- a/app/src/main/cpp/skyline/services/base_service.h +++ b/app/src/main/cpp/skyline/services/base_service.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include #include @@ -16,119 +17,7 @@ namespace skyline::kernel::type { namespace skyline::service { using namespace kernel; - - /** - * @brief This contains an enum for every service that's present - */ - enum class Service { - sm_IUserInterface, - fatalsrv_IService, - settings_ISettingsServer, - settings_ISystemSettingsServer, - apm_IManager, - apm_ISession, - am_IAllSystemAppletProxiesService, - am_IApplicationProxyService, - am_IApplicationProxy, - am_ILibraryAppletProxy, - am_ISystemAppletProxy, - am_IOverlayAppletProxy, - am_ICommonStateGetter, - am_IApplicationFunctions, - am_ISelfController, - am_IWindowController, - am_IAudioController, - am_IDisplayController, - am_ILibraryAppletCreator, - am_ILibraryAppletAccessor, - am_IDebugFunctions, - am_IAppletCommonFunctions, - am_IStorage, - am_IStorageAccessor, - audio_IAudioOutManager, - audio_IAudioOut, - audio_IAudioRendererManager, - audio_IAudioRenderer, - audio_IAudioDevice, - hid_IHidServer, - hid_IAppletResource, - hid_IActiveVibrationDeviceList, - timesrv_IStaticService, - timesrv_ISystemClock, - timesrv_ITimeZoneService, - timesrv_ISteadyClock, - fssrv_IFileSystemProxy, - fssrv_IFileSystem, - fssrv_IFile, - fssrv_IStorage, - nvdrv_INvDrvServices, - visrv_IManagerRootService, - visrv_IApplicationDisplayService, - visrv_ISystemDisplayService, - visrv_IManagerDisplayService, - hosbinder_IHOSBinderDriver, - pl_IPlatformServiceManager, - aocsrv_IAddOnContentManager, - pctl_IParentalControlServiceFactory, - pctl_IParentalControlService, - lm_ILogService, - lm_ILogger, - account_IAccountServiceForApplication, - account_IManagerForApplication, - account_IProfile, - friends_IServiceCreator, - friends_IFriendService, - friends_INotificationService, - nfp_IUserManager, - nfp_IUser, - nifm_IStaticService, - nifm_IGeneralService, - nifm_IRequest, - socket_IClient, - ssl_ISslService, - ssl_ISslContext, - prepo_IPrepoService - }; - - /** - * @brief A map from every service's name as a std::string to the corresponding serviceEnum - */ - const static std::unordered_map ServiceString{ - {"fatal:u", Service::fatalsrv_IService}, - {"set", Service::settings_ISettingsServer}, - {"set:sys", Service::settings_ISystemSettingsServer}, - {"apm", Service::apm_IManager}, - {"appletOE", Service::am_IApplicationProxyService}, - {"appletAE", Service::am_IAllSystemAppletProxiesService}, - {"audout:u", Service::audio_IAudioOutManager}, - {"audren:u", Service::audio_IAudioRendererManager}, - {"hid", Service::hid_IHidServer}, - {"time:s", Service::timesrv_IStaticService}, - {"time:a", Service::timesrv_IStaticService}, - {"time:u", Service::timesrv_IStaticService}, - {"fsp-srv", Service::fssrv_IFileSystemProxy}, - {"nvdrv", Service::nvdrv_INvDrvServices}, - {"nvdrv:a", Service::nvdrv_INvDrvServices}, - {"nvdrv:s", Service::nvdrv_INvDrvServices}, - {"nvdrv:t", Service::nvdrv_INvDrvServices}, - {"vi:m", Service::visrv_IManagerRootService}, - {"vi:u", Service::visrv_IManagerRootService}, - {"vi:s", Service::visrv_IManagerRootService}, - {"pl:u", Service::pl_IPlatformServiceManager}, - {"aoc:u", Service::aocsrv_IAddOnContentManager}, - {"pctl", Service::pctl_IParentalControlServiceFactory}, - {"pctl:a", Service::pctl_IParentalControlServiceFactory}, - {"pctl:s", Service::pctl_IParentalControlServiceFactory}, - {"pctl:r", Service::pctl_IParentalControlServiceFactory}, - {"lm", Service::lm_ILogService}, - {"acc:u0", Service::account_IAccountServiceForApplication}, - {"friend:u", Service::friends_IServiceCreator}, - {"nfp:user", Service::nfp_IUserManager}, - {"nifm:u", Service::nifm_IStaticService}, - {"bsd:u", Service::socket_IClient}, - {"ssl", Service::ssl_ISslService}, - {"prepo:u", Service::prepo_IPrepoService} - }; + using ServiceName = u64; //!< Service names are a maximum of 8 bytes so we use a u64 to reference them class ServiceManager; @@ -142,17 +31,26 @@ namespace skyline::service { std::unordered_map> vTable; //!< This holds the mapping from a function's CmdId to the actual function public: - Service serviceType; //!< The type of this service - std::string serviceName; //!< The name of this service - /** * @param state The state of the device - * @param hasLoop If the service has a loop or not - * @param serviceType The type of the service - * @param serviceName The name of the service * @param vTable The functions of the service */ - BaseService(const DeviceState &state, ServiceManager &manager, Service serviceType, const std::string &serviceName, const std::unordered_map> &vTable) : state(state), manager(manager), serviceType(serviceType), serviceName(serviceName), vTable(vTable) {} + BaseService(const DeviceState &state, ServiceManager &manager, const std::unordered_map> &vTable) : state(state), manager(manager), vTable(vTable) {} + + /** + * @note To be able to extract the name of the underlying class and ensure correct destruction order + */ + virtual ~BaseService() = default; + + std::string GetName() { + int status{}; + size_t length{}; + auto mangledName{typeid(*this).name()}; + + std::unique_ptr demangled{ abi::__cxa_demangle(mangledName, nullptr, &length, &status), std::free}; + + return (status == 0) ? std::string(demangled.get() + std::char_traits::length("skyline::service::")) : mangledName; + } /** * @brief This handles all IPC commands with type request to a service @@ -164,14 +62,14 @@ namespace skyline::service { try { function = vTable.at(request.payload->value); } catch (std::out_of_range &) { - state.logger->Warn("Cannot find function in service '{0}' (Type: {1}): 0x{2:X} ({2})", serviceName, serviceType, static_cast(request.payload->value)); + state.logger->Warn("Cannot find function in service '{0}': 0x{1:X} ({1})", GetName(), static_cast(request.payload->value)); return; } try { function(session, request, response); } catch (std::exception &e) { - throw exception("{} (Service: {})", e.what(), serviceName); + throw exception("{} (Service: {})", e.what(), GetName()); } }; }; diff --git a/app/src/main/cpp/skyline/services/fatalsrv/IService.cpp b/app/src/main/cpp/skyline/services/fatalsrv/IService.cpp index 938a16f3..873e2217 100644 --- a/app/src/main/cpp/skyline/services/fatalsrv/IService.cpp +++ b/app/src/main/cpp/skyline/services/fatalsrv/IService.cpp @@ -4,7 +4,7 @@ #include "IService.h" namespace skyline::service::fatalsrv { - IService::IService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::fatalsrv_IService, "fatalsrv:IService", { + IService::IService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IService::ThrowFatal)}, {0x1, SFUNC(IService::ThrowFatal)}, {0x2, SFUNC(IService::ThrowFatal)} diff --git a/app/src/main/cpp/skyline/services/friends/IFriendService.cpp b/app/src/main/cpp/skyline/services/friends/IFriendService.cpp index d8d51208..2e6a2124 100644 --- a/app/src/main/cpp/skyline/services/friends/IFriendService.cpp +++ b/app/src/main/cpp/skyline/services/friends/IFriendService.cpp @@ -4,6 +4,6 @@ #include "IFriendService.h" namespace skyline::service::friends { - IFriendService::IFriendService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::friends_IFriendService, "friends:IFriendService", { + IFriendService::IFriendService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/friends/INotificationService.cpp b/app/src/main/cpp/skyline/services/friends/INotificationService.cpp index 241a32cc..508c1ea8 100644 --- a/app/src/main/cpp/skyline/services/friends/INotificationService.cpp +++ b/app/src/main/cpp/skyline/services/friends/INotificationService.cpp @@ -5,7 +5,7 @@ #include "INotificationService.h" namespace skyline::service::friends { - INotificationService::INotificationService(const DeviceState &state, ServiceManager &manager) : notificationEvent(std::make_shared(state)), BaseService(state, manager, Service::friends_INotificationService, "friends:INotificationService", { + INotificationService::INotificationService(const DeviceState &state, ServiceManager &manager) : notificationEvent(std::make_shared(state)), BaseService(state, manager, { {0x0, SFUNC(INotificationService::GetEvent)}, }) {} diff --git a/app/src/main/cpp/skyline/services/friends/IServiceCreator.cpp b/app/src/main/cpp/skyline/services/friends/IServiceCreator.cpp index 89f43f88..f33fd508 100644 --- a/app/src/main/cpp/skyline/services/friends/IServiceCreator.cpp +++ b/app/src/main/cpp/skyline/services/friends/IServiceCreator.cpp @@ -6,7 +6,7 @@ #include "IServiceCreator.h" namespace skyline::service::friends { - IServiceCreator::IServiceCreator(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::friends_IServiceCreator, "friends:IServiceCreator", { + IServiceCreator::IServiceCreator(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IServiceCreator::CreateFriendService)}, {0x1, SFUNC(IServiceCreator::CreateNotificationService)}, }) {} diff --git a/app/src/main/cpp/skyline/services/fssrv/IFile.cpp b/app/src/main/cpp/skyline/services/fssrv/IFile.cpp index b9b9d89f..c6bb8304 100644 --- a/app/src/main/cpp/skyline/services/fssrv/IFile.cpp +++ b/app/src/main/cpp/skyline/services/fssrv/IFile.cpp @@ -5,7 +5,7 @@ #include "IFile.h" namespace skyline::service::fssrv { - IFile::IFile(std::shared_ptr &backing, const DeviceState &state, ServiceManager &manager) : backing(backing), BaseService(state, manager, Service::fssrv_IFile, "fssrv:IFile", { + IFile::IFile(std::shared_ptr &backing, const DeviceState &state, ServiceManager &manager) : backing(backing), BaseService(state, manager, { {0x0, SFUNC(IFile::Read)}, {0x1, SFUNC(IFile::Write)}, {0x2, SFUNC(IFile::Flush)}, diff --git a/app/src/main/cpp/skyline/services/fssrv/IFileSystem.cpp b/app/src/main/cpp/skyline/services/fssrv/IFileSystem.cpp index 9b1f3dc1..e3f4b3a0 100644 --- a/app/src/main/cpp/skyline/services/fssrv/IFileSystem.cpp +++ b/app/src/main/cpp/skyline/services/fssrv/IFileSystem.cpp @@ -7,7 +7,7 @@ #include "IFileSystem.h" namespace skyline::service::fssrv { - IFileSystem::IFileSystem(std::shared_ptr backing, const DeviceState &state, ServiceManager &manager) : backing(backing), BaseService(state, manager, Service::fssrv_IFileSystem, "fssrv:IFileSystem", { + IFileSystem::IFileSystem(std::shared_ptr backing, const DeviceState &state, ServiceManager &manager) : backing(backing), BaseService(state, manager, { {0x0, SFUNC(IFileSystem::CreateFile)}, {0x7, SFUNC(IFileSystem::GetEntryType)}, {0x8, SFUNC(IFileSystem::OpenFile)}, diff --git a/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp b/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp index bb3162fb..97a49553 100644 --- a/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp +++ b/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp @@ -8,7 +8,7 @@ #include "IStorage.h" namespace skyline::service::fssrv { - IFileSystemProxy::IFileSystemProxy(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::fssrv_IFileSystemProxy, "fssrv:IFileSystemProxy", { + IFileSystemProxy::IFileSystemProxy(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x1, SFUNC(IFileSystemProxy::SetCurrentProcess)}, {0x12, SFUNC(IFileSystemProxy::OpenSdCardFileSystem)}, {0x33, SFUNC(IFileSystemProxy::OpenSaveDataFileSystem)}, diff --git a/app/src/main/cpp/skyline/services/fssrv/IStorage.cpp b/app/src/main/cpp/skyline/services/fssrv/IStorage.cpp index dae528cb..79bd2f54 100644 --- a/app/src/main/cpp/skyline/services/fssrv/IStorage.cpp +++ b/app/src/main/cpp/skyline/services/fssrv/IStorage.cpp @@ -5,7 +5,7 @@ #include "IStorage.h" namespace skyline::service::fssrv { - IStorage::IStorage(std::shared_ptr &backing, const DeviceState &state, ServiceManager &manager) : backing(backing), BaseService(state, manager, Service::fssrv_IStorage, "fssrv:IStorage", { + IStorage::IStorage(std::shared_ptr &backing, const DeviceState &state, ServiceManager &manager) : backing(backing), BaseService(state, manager, { {0x0, SFUNC(IStorage::Read)}, {0x4, SFUNC(IStorage::GetSize)} }) {} diff --git a/app/src/main/cpp/skyline/services/hid/IActiveVibrationDeviceList.cpp b/app/src/main/cpp/skyline/services/hid/IActiveVibrationDeviceList.cpp index 2286fc65..1737ffb7 100644 --- a/app/src/main/cpp/skyline/services/hid/IActiveVibrationDeviceList.cpp +++ b/app/src/main/cpp/skyline/services/hid/IActiveVibrationDeviceList.cpp @@ -7,7 +7,7 @@ using namespace skyline::input; namespace skyline::service::hid { - IActiveVibrationDeviceList::IActiveVibrationDeviceList(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid_IActiveVibrationDeviceList, "hid:IActiveVibrationDeviceList", { + IActiveVibrationDeviceList::IActiveVibrationDeviceList(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IActiveVibrationDeviceList::ActivateVibrationDevice)} }) {} diff --git a/app/src/main/cpp/skyline/services/hid/IAppletResource.cpp b/app/src/main/cpp/skyline/services/hid/IAppletResource.cpp index 2cbc5865..20430a58 100644 --- a/app/src/main/cpp/skyline/services/hid/IAppletResource.cpp +++ b/app/src/main/cpp/skyline/services/hid/IAppletResource.cpp @@ -5,7 +5,7 @@ #include "IAppletResource.h" namespace skyline::service::hid { - IAppletResource::IAppletResource(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid_IAppletResource, "hid:IAppletResource", { + IAppletResource::IAppletResource(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IAppletResource::GetSharedMemoryHandle)} }) {} diff --git a/app/src/main/cpp/skyline/services/hid/IHidServer.cpp b/app/src/main/cpp/skyline/services/hid/IHidServer.cpp index 833e9481..cbb68b47 100644 --- a/app/src/main/cpp/skyline/services/hid/IHidServer.cpp +++ b/app/src/main/cpp/skyline/services/hid/IHidServer.cpp @@ -8,7 +8,7 @@ using namespace skyline::input; namespace skyline::service::hid { - IHidServer::IHidServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid_IHidServer, "hid:IHidServer", { + IHidServer::IHidServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IHidServer::CreateAppletResource)}, {0x64, SFUNC(IHidServer::SetSupportedNpadStyleSet)}, {0x64, SFUNC(IHidServer::GetSupportedNpadStyleSet)}, diff --git a/app/src/main/cpp/skyline/services/hosbinder/IHOSBinderDriver.cpp b/app/src/main/cpp/skyline/services/hosbinder/IHOSBinderDriver.cpp index 51bf92d4..92a0a1e2 100644 --- a/app/src/main/cpp/skyline/services/hosbinder/IHOSBinderDriver.cpp +++ b/app/src/main/cpp/skyline/services/hosbinder/IHOSBinderDriver.cpp @@ -11,7 +11,7 @@ #include "display.h" namespace skyline::service::hosbinder { - IHOSBinderDriver::IHOSBinderDriver(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hosbinder_IHOSBinderDriver, "hosbinder_IHOSBinderDriver", { + IHOSBinderDriver::IHOSBinderDriver(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IHOSBinderDriver::TransactParcel)}, {0x1, SFUNC(IHOSBinderDriver::AdjustRefcount)}, {0x2, SFUNC(IHOSBinderDriver::GetNativeHandle)}, @@ -124,7 +124,7 @@ namespace skyline::service::hosbinder { auto gbpBuffer = reinterpret_cast(pointer); std::shared_ptr nvBuffer{}; - auto nvmap = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->GetDevice(nvdrv::device::NvDeviceType::nvmap); + auto nvmap = state.os->serviceManager.GetService("nvdrv")->GetDevice(nvdrv::device::NvDeviceType::nvmap); if (gbpBuffer->nvmapHandle) { nvBuffer = nvmap->handleTable.at(gbpBuffer->nvmapHandle); diff --git a/app/src/main/cpp/skyline/services/lm/ILogService.cpp b/app/src/main/cpp/skyline/services/lm/ILogService.cpp index 405249cd..dc31c7cc 100644 --- a/app/src/main/cpp/skyline/services/lm/ILogService.cpp +++ b/app/src/main/cpp/skyline/services/lm/ILogService.cpp @@ -5,7 +5,7 @@ #include "ILogService.h" namespace skyline::service::lm { - ILogService::ILogService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::lm_ILogService, "lm:ILogService", { + ILogService::ILogService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(ILogService::OpenLogger)} }) {} diff --git a/app/src/main/cpp/skyline/services/lm/ILogger.cpp b/app/src/main/cpp/skyline/services/lm/ILogger.cpp index 8df21f16..ca84ad2f 100644 --- a/app/src/main/cpp/skyline/services/lm/ILogger.cpp +++ b/app/src/main/cpp/skyline/services/lm/ILogger.cpp @@ -5,7 +5,7 @@ #include "ILogger.h" namespace skyline::service::lm { - ILogger::ILogger(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::lm_ILogger, "lm:ILogger", { + ILogger::ILogger(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(ILogger::Log)}, {0x1, SFUNC(ILogger::SetDestination)} }) {} diff --git a/app/src/main/cpp/skyline/services/nfp/IUser.cpp b/app/src/main/cpp/skyline/services/nfp/IUser.cpp index 152d2eb5..70c97700 100644 --- a/app/src/main/cpp/skyline/services/nfp/IUser.cpp +++ b/app/src/main/cpp/skyline/services/nfp/IUser.cpp @@ -5,7 +5,7 @@ #include "IUserManager.h" namespace skyline::service::nfp { - IUser::IUser(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::nfp_IUser, "nfp:IUser", { + IUser::IUser(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IUser::Initialize)} }) {} diff --git a/app/src/main/cpp/skyline/services/nfp/IUserManager.cpp b/app/src/main/cpp/skyline/services/nfp/IUserManager.cpp index 5f1de14f..29bee8ef 100644 --- a/app/src/main/cpp/skyline/services/nfp/IUserManager.cpp +++ b/app/src/main/cpp/skyline/services/nfp/IUserManager.cpp @@ -5,7 +5,7 @@ #include "IUserManager.h" namespace skyline::service::nfp { - IUserManager::IUserManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::nfp_IUserManager, "nfp:IUserManager", { + IUserManager::IUserManager(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IUserManager::CreateUserInterface)} }) {} diff --git a/app/src/main/cpp/skyline/services/nifm/IGeneralService.cpp b/app/src/main/cpp/skyline/services/nifm/IGeneralService.cpp index 4d625508..bc89fb30 100644 --- a/app/src/main/cpp/skyline/services/nifm/IGeneralService.cpp +++ b/app/src/main/cpp/skyline/services/nifm/IGeneralService.cpp @@ -5,7 +5,7 @@ #include "IGeneralService.h" namespace skyline::service::nifm { - IGeneralService::IGeneralService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::nifm_IGeneralService, "nifm:IGeneralService", { + IGeneralService::IGeneralService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x4, SFUNC(IGeneralService::CreateRequest)} }) {} diff --git a/app/src/main/cpp/skyline/services/nifm/IRequest.cpp b/app/src/main/cpp/skyline/services/nifm/IRequest.cpp index cac94efb..b5fba72a 100644 --- a/app/src/main/cpp/skyline/services/nifm/IRequest.cpp +++ b/app/src/main/cpp/skyline/services/nifm/IRequest.cpp @@ -5,7 +5,7 @@ #include "IRequest.h" namespace skyline::service::nifm { - IRequest::IRequest(const DeviceState &state, ServiceManager &manager) : event0(std::make_shared(state)), event1(std::make_shared(state)), BaseService(state, manager, Service::nifm_IRequest, "nifm:IRequest", { + IRequest::IRequest(const DeviceState &state, ServiceManager &manager) : event0(std::make_shared(state)), event1(std::make_shared(state)), BaseService(state, manager, { {0x0, SFUNC(IRequest::GetRequestState)}, {0x1, SFUNC(IRequest::GetResult)}, {0x2, SFUNC(IRequest::GetSystemEventReadableHandles)}, diff --git a/app/src/main/cpp/skyline/services/nifm/IStaticService.cpp b/app/src/main/cpp/skyline/services/nifm/IStaticService.cpp index 123a0eaf..5b885769 100644 --- a/app/src/main/cpp/skyline/services/nifm/IStaticService.cpp +++ b/app/src/main/cpp/skyline/services/nifm/IStaticService.cpp @@ -5,7 +5,7 @@ #include "IStaticService.h" namespace skyline::service::nifm { - IStaticService::IStaticService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::nifm_IStaticService, "nifm:IStaticService", { + IStaticService::IStaticService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x4, SFUNC(IStaticService::CreateGeneralService)}, {0x5, SFUNC(IStaticService::CreateGeneralService)} }) {} diff --git a/app/src/main/cpp/skyline/services/nvdrv/INvDrvServices.cpp b/app/src/main/cpp/skyline/services/nvdrv/INvDrvServices.cpp index a9bf634a..c26eed81 100644 --- a/app/src/main/cpp/skyline/services/nvdrv/INvDrvServices.cpp +++ b/app/src/main/cpp/skyline/services/nvdrv/INvDrvServices.cpp @@ -54,7 +54,7 @@ namespace skyline::service::nvdrv { return fdIndex++; } - INvDrvServices::INvDrvServices(const DeviceState &state, ServiceManager &manager) : hostSyncpoint(state), BaseService(state, manager, Service::nvdrv_INvDrvServices, "INvDrvServices", { + INvDrvServices::INvDrvServices(const DeviceState &state, ServiceManager &manager) : hostSyncpoint(state), BaseService(state, manager, { {0x0, SFUNC(INvDrvServices::Open)}, {0x1, SFUNC(INvDrvServices::Ioctl)}, {0x2, SFUNC(INvDrvServices::Close)}, diff --git a/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_as_gpu.cpp b/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_as_gpu.cpp index 0391aaf5..547c9dfb 100644 --- a/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_as_gpu.cpp +++ b/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_as_gpu.cpp @@ -70,7 +70,7 @@ namespace skyline::service::nvdrv::device { if (!region.nvmapHandle) return; - auto nvmap = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->GetDevice(nvdrv::device::NvDeviceType::nvmap)->handleTable.at(region.nvmapHandle); + auto nvmap = state.os->serviceManager.GetService("nvdrv")->GetDevice(nvdrv::device::NvDeviceType::nvmap)->handleTable.at(region.nvmapHandle); u64 mapPhysicalAddress = region.bufferOffset + nvmap->address; u64 mapSize = region.mappingSize ? region.mappingSize : nvmap->size; @@ -133,7 +133,7 @@ namespace skyline::service::nvdrv::device { for (auto entry : entries) { try { - auto nvmap = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->GetDevice(nvdrv::device::NvDeviceType::nvmap)->handleTable.at(entry.nvmapHandle); + auto nvmap = state.os->serviceManager.GetService("nvdrv")->GetDevice(nvdrv::device::NvDeviceType::nvmap)->handleTable.at(entry.nvmapHandle); u64 mapAddress = static_cast(entry.gpuOffset) << MinAlignmentShift; u64 mapPhysicalAddress = nvmap->address + (static_cast(entry.mapOffset) << MinAlignmentShift); diff --git a/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_channel.cpp b/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_channel.cpp index 57c09198..73ec9aa8 100644 --- a/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_channel.cpp +++ b/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_channel.cpp @@ -19,7 +19,7 @@ namespace skyline::service::nvdrv::device { {0x481A, NFUNC(NvHostChannel::AllocGpfifoEx2)}, {0x4714, NFUNC(NvHostChannel::SetUserData)}, }) { - auto &hostSyncpoint = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->hostSyncpoint; + auto &hostSyncpoint = state.os->serviceManager.GetService("nvdrv")->hostSyncpoint; channelFence.id = hostSyncpoint.AllocateSyncpoint(false); channelFence.UpdateValue(hostSyncpoint); @@ -48,7 +48,7 @@ namespace skyline::service::nvdrv::device { Fence fence; } &args = state.process->GetReference(buffer.output.at(0).address); - auto &hostSyncpoint = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->hostSyncpoint; + auto &hostSyncpoint = state.os->serviceManager.GetService("nvdrv")->hostSyncpoint; if (args.flags.fenceWait) { if (args.flags.incrementWithValue) { @@ -104,7 +104,7 @@ namespace skyline::service::nvdrv::device { u32 reserved[3]; } &args = state.process->GetReference(buffer.input.at(0).address); - channelFence.UpdateValue(state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->hostSyncpoint); + channelFence.UpdateValue(state.os->serviceManager.GetService("nvdrv")->hostSyncpoint); args.fence = channelFence; } diff --git a/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_ctrl.cpp b/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_ctrl.cpp index 596c6339..f0a7a6e9 100644 --- a/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_ctrl.cpp +++ b/app/src/main/cpp/skyline/services/nvdrv/devices/nvhost_ctrl.cpp @@ -95,7 +95,7 @@ namespace skyline::service::nvdrv::device { return; } - auto &hostSyncpoint = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->hostSyncpoint; + auto &hostSyncpoint = state.os->serviceManager.GetService("nvdrv")->hostSyncpoint; // Check if the syncpoint has already expired using the last known values if (hostSyncpoint.HasSyncpointExpired(args.fence.id, args.fence.value)) { @@ -173,7 +173,7 @@ namespace skyline::service::nvdrv::device { event.state = NvHostEvent::State::Cancelled; - auto &hostSyncpoint = state.os->serviceManager.GetService(Service::nvdrv_INvDrvServices)->hostSyncpoint; + auto &hostSyncpoint = state.os->serviceManager.GetService("nvdrv")->hostSyncpoint; hostSyncpoint.UpdateMin(event.fence.id); } diff --git a/app/src/main/cpp/skyline/services/pctl/IParentalControlService.cpp b/app/src/main/cpp/skyline/services/pctl/IParentalControlService.cpp index ecf7ebf7..0c65d369 100644 --- a/app/src/main/cpp/skyline/services/pctl/IParentalControlService.cpp +++ b/app/src/main/cpp/skyline/services/pctl/IParentalControlService.cpp @@ -4,6 +4,6 @@ #include "IParentalControlService.h" namespace skyline::service::pctl { - IParentalControlService::IParentalControlService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::pctl_IParentalControlService, "pctl:IParentalControlService", { + IParentalControlService::IParentalControlService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/pctl/IParentalControlServiceFactory.cpp b/app/src/main/cpp/skyline/services/pctl/IParentalControlServiceFactory.cpp index 7b4ea242..b27239d6 100644 --- a/app/src/main/cpp/skyline/services/pctl/IParentalControlServiceFactory.cpp +++ b/app/src/main/cpp/skyline/services/pctl/IParentalControlServiceFactory.cpp @@ -5,7 +5,7 @@ #include "IParentalControlServiceFactory.h" namespace skyline::service::pctl { - IParentalControlServiceFactory::IParentalControlServiceFactory(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::pctl_IParentalControlServiceFactory, "pctl:IParentalControlServiceFactory", { + IParentalControlServiceFactory::IParentalControlServiceFactory(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IParentalControlServiceFactory::CreateService)}, {0x1, SFUNC(IParentalControlServiceFactory::CreateService)} }) {} diff --git a/app/src/main/cpp/skyline/services/pl/IPlatformServiceManager.cpp b/app/src/main/cpp/skyline/services/pl/IPlatformServiceManager.cpp index f541f2b8..3825756f 100644 --- a/app/src/main/cpp/skyline/services/pl/IPlatformServiceManager.cpp +++ b/app/src/main/cpp/skyline/services/pl/IPlatformServiceManager.cpp @@ -29,7 +29,7 @@ namespace skyline::service::pl { {FontStandard, FontStandardLength} }}; - IPlatformServiceManager::IPlatformServiceManager(const DeviceState &state, ServiceManager &manager) : fontSharedMem(std::make_shared(state, NULL, constant::FontSharedMemSize, memory::Permission{true, false, false})), BaseService(state, manager, Service::pl_IPlatformServiceManager, "pl:IPlatformServiceManager", { + IPlatformServiceManager::IPlatformServiceManager(const DeviceState &state, ServiceManager &manager) : fontSharedMem(std::make_shared(state, NULL, constant::FontSharedMemSize, memory::Permission{true, false, false})), BaseService(state, manager, { {0x1, SFUNC(IPlatformServiceManager::GetLoadState)}, {0x2, SFUNC(IPlatformServiceManager::GetSize)}, {0x3, SFUNC(IPlatformServiceManager::GetSharedMemoryAddressOffset)}, diff --git a/app/src/main/cpp/skyline/services/prepo/IPrepoService.cpp b/app/src/main/cpp/skyline/services/prepo/IPrepoService.cpp index 2b4486e4..75446c71 100644 --- a/app/src/main/cpp/skyline/services/prepo/IPrepoService.cpp +++ b/app/src/main/cpp/skyline/services/prepo/IPrepoService.cpp @@ -4,7 +4,7 @@ #include "IPrepoService.h" namespace skyline::service::prepo { - IPrepoService::IPrepoService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::prepo_IPrepoService, "prepo:IPrepoService", { + IPrepoService::IPrepoService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x2775, SFUNC(IPrepoService::SaveReportWithUser)}, }) {} diff --git a/app/src/main/cpp/skyline/services/serviceman.cpp b/app/src/main/cpp/skyline/services/serviceman.cpp index c81f651c..7e20220f 100644 --- a/app/src/main/cpp/skyline/services/serviceman.cpp +++ b/app/src/main/cpp/skyline/services/serviceman.cpp @@ -29,106 +29,64 @@ #include "prepo/IPrepoService.h" #include "serviceman.h" -namespace skyline::service { - ServiceManager::ServiceManager(const DeviceState &state) : state(state) {} +#define SERVICE_CASE(class, name) \ + case util::MakeMagic(name): { \ + std::shared_ptr serviceObject = std::make_shared(state, *this); \ + serviceMap[util::MakeMagic(name)] = serviceObject; \ + return serviceObject; \ + } - std::shared_ptr ServiceManager::CreateService(Service serviceType) { - auto serviceIter = serviceMap.find(serviceType); +namespace skyline::service { + ServiceManager::ServiceManager(const DeviceState &state) : state(state), smUserInterface(std::make_shared(state, *this)) {} + + std::shared_ptr ServiceManager::CreateService(ServiceName name) { + auto serviceIter = serviceMap.find(name); if (serviceIter != serviceMap.end()) return (*serviceIter).second; - std::shared_ptr serviceObj; - switch (serviceType) { - case Service::sm_IUserInterface: - serviceObj = std::make_shared(state, *this); - break; - case Service::fatalsrv_IService: - serviceObj = std::make_shared(state, *this); - break; - case Service::settings_ISettingsServer: - serviceObj = std::make_shared(state, *this); - break; - case Service::settings_ISystemSettingsServer: - serviceObj = std::make_shared(state, *this); - break; - case Service::apm_IManager: - serviceObj = std::make_shared(state, *this); - break; - case Service::am_IApplicationProxyService: - serviceObj = std::make_shared(state, *this); - break; - case Service::am_IAllSystemAppletProxiesService: - serviceObj = std::make_shared(state, *this); - break; - case Service::audio_IAudioOutManager: - serviceObj = std::make_shared(state, *this); - break; - case Service::audio_IAudioRendererManager: - serviceObj = std::make_shared(state, *this); - break; - case Service::hid_IHidServer: - serviceObj = std::make_shared(state, *this); - break; - case Service::timesrv_IStaticService: - serviceObj = std::make_shared(state, *this); - break; - case Service::fssrv_IFileSystemProxy: - serviceObj = std::make_shared(state, *this); - break; - case Service::nvdrv_INvDrvServices: - serviceObj = std::make_shared(state, *this); - break; - case Service::visrv_IManagerRootService: - serviceObj = std::make_shared(state, *this); - break; - case Service::pl_IPlatformServiceManager: - serviceObj = std::make_shared(state, *this); - break; - case Service::aocsrv_IAddOnContentManager: - serviceObj = std::make_shared(state, *this); - break; - case Service::pctl_IParentalControlServiceFactory: - serviceObj = std::make_shared(state, *this); - break; - case Service::lm_ILogService: - serviceObj = std::make_shared(state, *this); - break; - case Service::account_IAccountServiceForApplication: - serviceObj = std::make_shared(state, *this); - break; - case Service::friends_IServiceCreator: - serviceObj = std::make_shared(state, *this); - break; - case Service::nfp_IUserManager: - serviceObj = std::make_shared(state, *this); - break; - case Service::nifm_IStaticService: - serviceObj = std::make_shared(state, *this); - break; - case Service::socket_IClient: - serviceObj = std::make_shared(state, *this); - break; - case Service::ssl_ISslService: - serviceObj = std::make_shared(state, *this); - break; - case Service::prepo_IPrepoService: - serviceObj = std::make_shared(state, *this); - break; + switch (name) { + SERVICE_CASE(fatalsrv::IService, "fatal:u") + SERVICE_CASE(settings::ISettingsServer, "set") + SERVICE_CASE(settings::ISystemSettingsServer, "set:sys") + SERVICE_CASE(apm::IManager, "apm") + SERVICE_CASE(am::IApplicationProxyService, "appletOE") + SERVICE_CASE(am::IAllSystemAppletProxiesService, "appletAE") + SERVICE_CASE(audio::IAudioOutManager, "audout:u") + SERVICE_CASE(audio::IAudioRendererManager, "audren:u") + SERVICE_CASE(hid::IHidServer, "hid") + SERVICE_CASE(timesrv::IStaticService, "time:s") + SERVICE_CASE(timesrv::IStaticService, "time:a") + SERVICE_CASE(timesrv::IStaticService, "time:u") + SERVICE_CASE(fssrv::IFileSystemProxy, "fsp-srv") + SERVICE_CASE(nvdrv::INvDrvServices, "nvdrv") + SERVICE_CASE(nvdrv::INvDrvServices, "nvdrv:a") + SERVICE_CASE(nvdrv::INvDrvServices, "nvdrv:s") + SERVICE_CASE(nvdrv::INvDrvServices, "nvdrv:t") + SERVICE_CASE(visrv::IManagerRootService, "vi:m") + SERVICE_CASE(visrv::IManagerRootService, "vi:u") + SERVICE_CASE(visrv::IManagerRootService, "vi:s") + SERVICE_CASE(pl::IPlatformServiceManager, "pl:u") + SERVICE_CASE(aocsrv::IAddOnContentManager, "aoc:u") + SERVICE_CASE(pctl::IParentalControlServiceFactory, "pctl") + SERVICE_CASE(pctl::IParentalControlServiceFactory, "pctl:a") + SERVICE_CASE(pctl::IParentalControlServiceFactory, "pctl:s") + SERVICE_CASE(pctl::IParentalControlServiceFactory, "pctl:r") + SERVICE_CASE(lm::ILogService, "lm") + SERVICE_CASE(account::IAccountServiceForApplication, "acc:u0") + SERVICE_CASE(friends::IServiceCreator, "friend") + SERVICE_CASE(nfp::IUserManager, "nfp:user") + SERVICE_CASE(nifm::IStaticService, "nifm:u") + SERVICE_CASE(socket::IClient, "bsd:u") + SERVICE_CASE(ssl::ISslService, "ssl") + SERVICE_CASE(prepo::IPrepoService, "prepo:u") default: - throw exception("CreateService called on missing object, type: {}", serviceType); + throw exception("CreateService called with an unknown service name: {}", name); } - serviceMap[serviceType] = serviceObj; - return serviceObj; } - KHandle ServiceManager::NewSession(Service serviceType) { + std::shared_ptr ServiceManager::NewService(ServiceName name, type::KSession &session, ipc::IpcResponse &response) { std::lock_guard serviceGuard(mutex); - return state.process->NewHandle(CreateService(serviceType)).handle; - } - - std::shared_ptr ServiceManager::NewService(const std::string &serviceName, type::KSession &session, ipc::IpcResponse &response) { - std::lock_guard serviceGuard(mutex); - auto serviceObject = CreateService(ServiceString.at(serviceName)); + auto serviceObject = CreateService(name); KHandle handle{}; if (session.isDomain) { session.domainTable[++session.handleIndex] = serviceObject; @@ -138,13 +96,14 @@ namespace skyline::service { handle = state.process->NewHandle(serviceObject).handle; response.moveHandles.push_back(handle); } - state.logger->Debug("Service has been created: \"{}\" (0x{:X})", serviceName, handle); + state.logger->Debug("Service has been created: \"{}\" (0x{:X})", serviceObject->GetName(), handle); return serviceObject; } - void ServiceManager::RegisterService(std::shared_ptr serviceObject, type::KSession &session, ipc::IpcResponse &response, bool submodule) { // NOLINT(performance-unnecessary-value-param) + void ServiceManager::RegisterService(std::shared_ptr serviceObject, type::KSession &session, ipc::IpcResponse &response, bool submodule, ServiceName name) { // NOLINT(performance-unnecessary-value-param) std::lock_guard serviceGuard(mutex); KHandle handle{}; + if (session.isDomain) { session.domainTable[session.handleIndex] = serviceObject; response.domainObjects.push_back(session.handleIndex); @@ -153,9 +112,11 @@ namespace skyline::service { handle = state.process->NewHandle(serviceObject).handle; response.moveHandles.push_back(handle); } + if (!submodule) - serviceMap[serviceObject->serviceType] = serviceObject; - state.logger->Debug("Service has been registered: \"{}\" (0x{:X})", serviceObject->serviceName, handle); + serviceMap[name] = serviceObject; + + state.logger->Debug("Service has been registered: \"{}\" (0x{:X})", serviceObject->GetName(), handle); } void ServiceManager::CloseSession(KHandle handle) { @@ -163,10 +124,14 @@ namespace skyline::service { auto session = state.process->GetHandle(handle); if (session->serviceStatus == type::KSession::ServiceStatus::Open) { if (session->isDomain) { - for (const auto &[objectId, service] : session->domainTable) - serviceMap.erase(service->serviceType); + for (const auto &domainEntry : session->domainTable) + std::erase_if(serviceMap, [domainEntry](const auto &entry) { + return entry.second == domainEntry.second; + }); } else { - serviceMap.erase(session->serviceObject->serviceType); + std::erase_if(serviceMap, [session](const auto &entry) { + return entry.second == session->serviceObject; + }); } session->serviceStatus = type::KSession::ServiceStatus::Closed; } @@ -192,7 +157,9 @@ namespace skyline::service { service->HandleRequest(*session, request, response); break; case ipc::DomainCommand::CloseVHandle: - serviceMap.erase(service->serviceType); + std::erase_if(serviceMap, [service](const auto &entry) { + return entry.second == service; + }); session->domainTable.erase(request.domain->objectId); break; } diff --git a/app/src/main/cpp/skyline/services/serviceman.h b/app/src/main/cpp/skyline/services/serviceman.h index a21ff366..fddb9fcc 100644 --- a/app/src/main/cpp/skyline/services/serviceman.h +++ b/app/src/main/cpp/skyline/services/serviceman.h @@ -10,40 +10,36 @@ namespace skyline::service { /** * @brief The ServiceManager class manages passing IPC requests to the right Service and running event loops of Services + * @todo This implementation varies significantly from HOS, this should be rectified much later on */ class ServiceManager { private: const DeviceState &state; //!< The state of the device - std::unordered_map> serviceMap; //!< A mapping from a Service to the underlying object + std::unordered_map> serviceMap; //!< A mapping from a Service to the underlying object Mutex mutex; //!< This mutex is used to ensure concurrent access to services doesn't cause crashes /** * @brief Creates an instance of the service if it doesn't already exist, otherwise returns an existing instance - * @param serviceType The type of service requested + * @param name The name of the service to create * @return A shared pointer to an instance of the service */ - std::shared_ptr CreateService(Service serviceType); + std::shared_ptr CreateService(ServiceName name); public: + std::shared_ptr smUserInterface; //!< This is used by applications to open connections to services + /** * @param state The state of the device */ ServiceManager(const DeviceState &state); - /** - * @brief Creates a new service and returns it's handle - * @param serviceType The type of the service - * @return Handle to KService object of the service - */ - KHandle NewSession(Service serviceType); - /** * @brief Creates a new service using it's type enum and writes it's handle or virtual handle (If it's a domain request) to IpcResponse - * @param serviceName The name of the service + * @param name The service's name * @param session The session object of the command * @param response The response object to write the handle or virtual handle to */ - std::shared_ptr NewService(const std::string &serviceName, type::KSession &session, ipc::IpcResponse &response); + std::shared_ptr NewService(ServiceName name, type::KSession &session, ipc::IpcResponse &response); /** * @brief Registers a service object in the manager and writes it's handle or virtual handle (If it's a domain request) to IpcResponse @@ -51,8 +47,9 @@ namespace skyline::service { * @param session The session object of the command * @param response The response object to write the handle or virtual handle to * @param submodule If the registered service is a submodule or not + * @param name The name of the service to register if it's not a submodule - it will be added to the service map */ - void RegisterService(std::shared_ptr serviceObject, type::KSession &session, ipc::IpcResponse &response, bool submodule = true); + void RegisterService(std::shared_ptr serviceObject, type::KSession &session, ipc::IpcResponse &response, bool submodule = true, ServiceName name = {}); /** * @param serviceType The type of the service @@ -61,8 +58,13 @@ namespace skyline::service { * @note This only works for services created with `NewService` as sub-interfaces used with `RegisterService` can have multiple instances */ template - inline std::shared_ptr GetService(Service serviceType) { - return std::static_pointer_cast(serviceMap.at(serviceType)); + std::shared_ptr GetService(ServiceName name) { + return std::static_pointer_cast(serviceMap.at(name)); + } + + template + constexpr std::shared_ptr GetService(std::string_view name) { + return GetService(util::MakeMagic(name)); } /** diff --git a/app/src/main/cpp/skyline/services/settings/ISettingsServer.cpp b/app/src/main/cpp/skyline/services/settings/ISettingsServer.cpp index 5483ea99..5a3d4642 100644 --- a/app/src/main/cpp/skyline/services/settings/ISettingsServer.cpp +++ b/app/src/main/cpp/skyline/services/settings/ISettingsServer.cpp @@ -5,7 +5,7 @@ #include "ISettingsServer.h" namespace skyline::service::settings { - ISettingsServer::ISettingsServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::settings_ISettingsServer, "settings:ISettingsServer", { + ISettingsServer::ISettingsServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x1, SFUNC(ISettingsServer::GetAvailableLanguageCodes)}, {0x2, SFUNC(ISettingsServer::MakeLanguageCode)}, {0x5, SFUNC(ISettingsServer::GetAvailableLanguageCodes2)} diff --git a/app/src/main/cpp/skyline/services/settings/ISystemSettingsServer.cpp b/app/src/main/cpp/skyline/services/settings/ISystemSettingsServer.cpp index fe694c52..3d1c1287 100644 --- a/app/src/main/cpp/skyline/services/settings/ISystemSettingsServer.cpp +++ b/app/src/main/cpp/skyline/services/settings/ISystemSettingsServer.cpp @@ -5,7 +5,7 @@ #include "ISystemSettingsServer.h" namespace skyline::service::settings { - ISystemSettingsServer::ISystemSettingsServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::settings_ISystemSettingsServer, "settings:ISystemSettingsServer", { + ISystemSettingsServer::ISystemSettingsServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x3, SFUNC(ISystemSettingsServer::GetFirmwareVersion)}}) {} void ISystemSettingsServer::GetFirmwareVersion(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { diff --git a/app/src/main/cpp/skyline/services/sm/IUserInterface.cpp b/app/src/main/cpp/skyline/services/sm/IUserInterface.cpp index edfa4866..98f65641 100644 --- a/app/src/main/cpp/skyline/services/sm/IUserInterface.cpp +++ b/app/src/main/cpp/skyline/services/sm/IUserInterface.cpp @@ -4,7 +4,7 @@ #include "IUserInterface.h" namespace skyline::service::sm { - IUserInterface::IUserInterface(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::sm_IUserInterface, "sm:IUserInterface", { + IUserInterface::IUserInterface(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IUserInterface::Initialize)}, {0x1, SFUNC(IUserInterface::GetService)} }) {} @@ -12,18 +12,18 @@ namespace skyline::service::sm { void IUserInterface::Initialize(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {} void IUserInterface::GetService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - std::string serviceName(request.PopString()); - serviceName.resize(std::min(8UL, serviceName.size())); + auto name = request.Pop(); - if (serviceName.empty()) { - response.errorCode = constant::status::ServiceInvName; - } else { + if (name) { try { - manager.NewService(serviceName, session, response); + manager.NewService(name, session, response); } catch (std::out_of_range &) { response.errorCode = constant::status::ServiceNotReg; - state.logger->Warn("Service has not been implemented: \"{}\"", serviceName); + std::string_view stringName(reinterpret_cast(&name), sizeof(u64)); + state.logger->Warn("Service has not been implemented: \"{}\"", stringName); } + } else { + response.errorCode = constant::status::ServiceInvName; } } } diff --git a/app/src/main/cpp/skyline/services/socket/bsd/IClient.cpp b/app/src/main/cpp/skyline/services/socket/bsd/IClient.cpp index 6a03d3a6..119f1a86 100644 --- a/app/src/main/cpp/skyline/services/socket/bsd/IClient.cpp +++ b/app/src/main/cpp/skyline/services/socket/bsd/IClient.cpp @@ -4,7 +4,7 @@ #include "IClient.h" namespace skyline::service::socket { - IClient::IClient(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::socket_IClient, "socket:IClient", { + IClient::IClient(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IClient::RegisterClient)}, {0x1, SFUNC(IClient::StartMonitoring)}, }) {} diff --git a/app/src/main/cpp/skyline/services/ssl/ISslContext.cpp b/app/src/main/cpp/skyline/services/ssl/ISslContext.cpp index 03afb05f..3877b48d 100644 --- a/app/src/main/cpp/skyline/services/ssl/ISslContext.cpp +++ b/app/src/main/cpp/skyline/services/ssl/ISslContext.cpp @@ -4,6 +4,6 @@ #include "ISslContext.h" namespace skyline::service::ssl { - ISslContext::ISslContext(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::ssl_ISslContext, "ssl:ISslContext", { + ISslContext::ISslContext(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { }) {} } diff --git a/app/src/main/cpp/skyline/services/ssl/ISslService.cpp b/app/src/main/cpp/skyline/services/ssl/ISslService.cpp index 459b0a72..e6142876 100644 --- a/app/src/main/cpp/skyline/services/ssl/ISslService.cpp +++ b/app/src/main/cpp/skyline/services/ssl/ISslService.cpp @@ -5,7 +5,7 @@ #include "ISslService.h" namespace skyline::service::ssl { - ISslService::ISslService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::ssl_ISslService, "ssl:ISslService", { + ISslService::ISslService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(ISslService::CreateContext)}, {0x5, SFUNC(ISslService::SetInterfaceVersion)} }) {} diff --git a/app/src/main/cpp/skyline/services/timesrv/IStaticService.cpp b/app/src/main/cpp/skyline/services/timesrv/IStaticService.cpp index f7c5a37f..9fa8cb6b 100644 --- a/app/src/main/cpp/skyline/services/timesrv/IStaticService.cpp +++ b/app/src/main/cpp/skyline/services/timesrv/IStaticService.cpp @@ -7,7 +7,7 @@ #include "IStaticService.h" namespace skyline::service::timesrv { - IStaticService::IStaticService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::timesrv_IStaticService, "timesrv:IStaticService", { + IStaticService::IStaticService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(IStaticService::GetStandardUserSystemClock)}, {0x1, SFUNC(IStaticService::GetStandardNetworkSystemClock)}, {0x2, SFUNC(IStaticService::GetStandardSteadyClock)}, diff --git a/app/src/main/cpp/skyline/services/timesrv/ISteadyClock.cpp b/app/src/main/cpp/skyline/services/timesrv/ISteadyClock.cpp index a729d753..edd26cb1 100644 --- a/app/src/main/cpp/skyline/services/timesrv/ISteadyClock.cpp +++ b/app/src/main/cpp/skyline/services/timesrv/ISteadyClock.cpp @@ -4,7 +4,7 @@ #include "ISteadyClock.h" namespace skyline::service::timesrv { - ISteadyClock::ISteadyClock(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::timesrv_ISteadyClock, "timesrv:ISteadyClock", { + ISteadyClock::ISteadyClock(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x0, SFUNC(ISteadyClock::GetCurrentTimePoint)} }) {} diff --git a/app/src/main/cpp/skyline/services/timesrv/ISystemClock.cpp b/app/src/main/cpp/skyline/services/timesrv/ISystemClock.cpp index 5cb30fdb..44ca58a1 100644 --- a/app/src/main/cpp/skyline/services/timesrv/ISystemClock.cpp +++ b/app/src/main/cpp/skyline/services/timesrv/ISystemClock.cpp @@ -5,7 +5,7 @@ #include "ISystemClock.h" namespace skyline::service::timesrv { - ISystemClock::ISystemClock(const SystemClockType clockType, const DeviceState &state, ServiceManager &manager) : type(clockType), BaseService(state, manager, Service::timesrv_ISystemClock, "timesrv:ISystemClock", { + ISystemClock::ISystemClock(const SystemClockType clockType, const DeviceState &state, ServiceManager &manager) : type(clockType), BaseService(state, manager, { {0x0, SFUNC(ISystemClock::GetCurrentTime)}, {0x2, SFUNC(ISystemClock::GetSystemClockContext)} }) {} diff --git a/app/src/main/cpp/skyline/services/timesrv/ITimeZoneService.cpp b/app/src/main/cpp/skyline/services/timesrv/ITimeZoneService.cpp index 62a1c9cc..1c90ce3e 100644 --- a/app/src/main/cpp/skyline/services/timesrv/ITimeZoneService.cpp +++ b/app/src/main/cpp/skyline/services/timesrv/ITimeZoneService.cpp @@ -4,7 +4,7 @@ #include "ITimeZoneService.h" namespace skyline::service::timesrv { - ITimeZoneService::ITimeZoneService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::timesrv_ITimeZoneService, "timesrv:ITimeZoneService", { + ITimeZoneService::ITimeZoneService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x65, SFUNC(ITimeZoneService::ToCalendarTimeWithMyRule)} }) {} diff --git a/app/src/main/cpp/skyline/services/visrv/IApplicationDisplayService.cpp b/app/src/main/cpp/skyline/services/visrv/IApplicationDisplayService.cpp index bcbdc2d3..ec0bea41 100644 --- a/app/src/main/cpp/skyline/services/visrv/IApplicationDisplayService.cpp +++ b/app/src/main/cpp/skyline/services/visrv/IApplicationDisplayService.cpp @@ -9,7 +9,7 @@ #include "IManagerDisplayService.h" namespace skyline::service::visrv { - IApplicationDisplayService::IApplicationDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, Service::visrv_IApplicationDisplayService, "visrv:IApplicationDisplayService", { + IApplicationDisplayService::IApplicationDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, { {0x64, SFUNC(IApplicationDisplayService::GetRelayService)}, {0x65, SFUNC(IApplicationDisplayService::GetSystemDisplayService)}, {0x66, SFUNC(IApplicationDisplayService::GetManagerDisplayService)}, @@ -25,11 +25,11 @@ namespace skyline::service::visrv { }) {} void IApplicationDisplayService::GetRelayService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - manager.RegisterService(SRVREG(hosbinder::IHOSBinderDriver), session, response, false); + manager.RegisterService(SRVREG(hosbinder::IHOSBinderDriver), session, response, false, util::MakeMagic("dispdrv")); } void IApplicationDisplayService::GetIndirectDisplayTransactionService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - manager.RegisterService(SRVREG(hosbinder::IHOSBinderDriver), session, response, false); + manager.RegisterService(SRVREG(hosbinder::IHOSBinderDriver), session, response, false, util::MakeMagic("dispdrv")); } void IApplicationDisplayService::GetSystemDisplayService(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { @@ -43,14 +43,14 @@ namespace skyline::service::visrv { void IApplicationDisplayService::OpenDisplay(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { std::string displayName(request.PopString()); state.logger->Debug("Setting display as: {}", displayName); - state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver)->SetDisplay(displayName); + state.os->serviceManager.GetService("dispdrv")->SetDisplay(displayName); response.Push(0); // There's only one display } void IApplicationDisplayService::CloseDisplay(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { state.logger->Debug("Closing the display"); - state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver)->CloseDisplay(); + state.os->serviceManager.GetService("dispdrv")->CloseDisplay(); } void IApplicationDisplayService::OpenLayer(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { @@ -80,7 +80,7 @@ namespace skyline::service::visrv { u64 layerId = request.Pop(); state.logger->Debug("Closing Layer: {}", layerId); - auto hosBinder = state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver); + auto hosBinder = state.os->serviceManager.GetService("dispdrv"); if (hosBinder->layerStatus == hosbinder::LayerStatus::Uninitialized) state.logger->Warn("The application is destroying an uninitialized layer"); hosBinder->layerStatus = hosbinder::LayerStatus::Uninitialized; diff --git a/app/src/main/cpp/skyline/services/visrv/IDisplayService.cpp b/app/src/main/cpp/skyline/services/visrv/IDisplayService.cpp index db5fdcc1..0c0dcc47 100644 --- a/app/src/main/cpp/skyline/services/visrv/IDisplayService.cpp +++ b/app/src/main/cpp/skyline/services/visrv/IDisplayService.cpp @@ -7,7 +7,7 @@ #include "IDisplayService.h" namespace skyline::service::visrv { - IDisplayService::IDisplayService(const DeviceState &state, ServiceManager &manager, const Service serviceType, const std::string &serviceName, const std::unordered_map> &vTable) : BaseService(state, manager, serviceType, serviceName, vTable) {} + IDisplayService::IDisplayService(const DeviceState &state, ServiceManager &manager, const std::unordered_map> &vTable) : BaseService(state, manager, vTable) {} void IDisplayService::CreateStrayLayer(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { request.Skip(); @@ -15,7 +15,7 @@ namespace skyline::service::visrv { state.logger->Debug("Creating Stray Layer on Display: {}", displayId); - auto hosBinder = state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver); + auto hosBinder = state.os->serviceManager.GetService("dispdrv"); if (hosBinder->layerStatus == hosbinder::LayerStatus::Stray) throw exception("The application is creating more than one stray layer"); hosBinder->layerStatus = hosbinder::LayerStatus::Stray; @@ -37,7 +37,7 @@ namespace skyline::service::visrv { auto layerId = request.Pop(); state.logger->Debug("Destroying Stray Layer: {}", layerId); - auto hosBinder = state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver); + auto hosBinder = state.os->serviceManager.GetService("dispdrv"); if (hosBinder->layerStatus == hosbinder::LayerStatus::Uninitialized) state.logger->Warn("The application is destroying an uninitialized layer"); hosBinder->layerStatus = hosbinder::LayerStatus::Uninitialized; diff --git a/app/src/main/cpp/skyline/services/visrv/IDisplayService.h b/app/src/main/cpp/skyline/services/visrv/IDisplayService.h index 45065a6b..e62016ca 100644 --- a/app/src/main/cpp/skyline/services/visrv/IDisplayService.h +++ b/app/src/main/cpp/skyline/services/visrv/IDisplayService.h @@ -8,9 +8,9 @@ #include namespace skyline::service::visrv { -/** - * @brief This is the base class for all IDisplayService variants with common functions - */ + /** + * @brief This is the base class for all IDisplayService variants with common functions + */ class IDisplayService : public BaseService { protected: /** @@ -27,7 +27,7 @@ namespace skyline::service::visrv { static_assert(sizeof(LayerParcel) == 0x28); public: - IDisplayService(const DeviceState &state, ServiceManager &manager, const Service serviceType, const std::string &serviceName, const std::unordered_map> &vTable); + IDisplayService(const DeviceState &state, ServiceManager &manager, const std::unordered_map> &vTable); /** * @brief This creates a stray layer using a display's ID and returns a layer ID and the corresponding buffer ID diff --git a/app/src/main/cpp/skyline/services/visrv/IManagerDisplayService.cpp b/app/src/main/cpp/skyline/services/visrv/IManagerDisplayService.cpp index 340e55ed..2fb614a8 100644 --- a/app/src/main/cpp/skyline/services/visrv/IManagerDisplayService.cpp +++ b/app/src/main/cpp/skyline/services/visrv/IManagerDisplayService.cpp @@ -7,7 +7,7 @@ #include "IManagerDisplayService.h" namespace skyline::service::visrv { - IManagerDisplayService::IManagerDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, Service::visrv_IManagerDisplayService, "visrv:IManagerDisplayService", { + IManagerDisplayService::IManagerDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, { {0x7DA, SFUNC(IManagerDisplayService::CreateManagedLayer)}, {0x7DB, SFUNC(IManagerDisplayService::DestroyManagedLayer)}, {0x7DC, SFUNC(IDisplayService::CreateStrayLayer)}, @@ -19,7 +19,7 @@ namespace skyline::service::visrv { auto displayId = request.Pop(); state.logger->Debug("Creating Managed Layer on Display: {}", displayId); - auto hosBinder = state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver); + auto hosBinder = state.os->serviceManager.GetService("dispdrv"); if (hosBinder->layerStatus != hosbinder::LayerStatus::Uninitialized) throw exception("The application is creating more than one layer"); hosBinder->layerStatus = hosbinder::LayerStatus::Managed; @@ -31,7 +31,7 @@ namespace skyline::service::visrv { auto layerId = request.Pop(); state.logger->Debug("Destroying Managed Layer: {}", layerId); - auto hosBinder = state.os->serviceManager.GetService(Service::hosbinder_IHOSBinderDriver); + auto hosBinder = state.os->serviceManager.GetService("dispdrv"); if (hosBinder->layerStatus == hosbinder::LayerStatus::Uninitialized) state.logger->Warn("The application is destroying an uninitialized layer"); diff --git a/app/src/main/cpp/skyline/services/visrv/IManagerRootService.cpp b/app/src/main/cpp/skyline/services/visrv/IManagerRootService.cpp index a88adf70..be9a46b4 100644 --- a/app/src/main/cpp/skyline/services/visrv/IManagerRootService.cpp +++ b/app/src/main/cpp/skyline/services/visrv/IManagerRootService.cpp @@ -6,7 +6,7 @@ #include "IApplicationDisplayService.h" namespace skyline::service::visrv { - IManagerRootService::IManagerRootService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::visrv_IManagerRootService, "visrv:IManagerRootService", { + IManagerRootService::IManagerRootService(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, { {0x2, SFUNC(IManagerRootService::GetDisplayService)} }) {} diff --git a/app/src/main/cpp/skyline/services/visrv/ISystemDisplayService.cpp b/app/src/main/cpp/skyline/services/visrv/ISystemDisplayService.cpp index 5aeeb4e7..d4a84dff 100644 --- a/app/src/main/cpp/skyline/services/visrv/ISystemDisplayService.cpp +++ b/app/src/main/cpp/skyline/services/visrv/ISystemDisplayService.cpp @@ -4,7 +4,7 @@ #include "ISystemDisplayService.h" namespace skyline::service::visrv { - ISystemDisplayService::ISystemDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, Service::visrv_ISystemDisplayService, "visrv:ISystemDisplayService", { + ISystemDisplayService::ISystemDisplayService(const DeviceState &state, ServiceManager &manager) : IDisplayService(state, manager, { {0x89D, SFUNC(ISystemDisplayService::SetLayerZ)}, {0x908, SFUNC(IDisplayService::CreateStrayLayer)} }) {}