| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | // Copyright 2014 Citra Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "common/common.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-15 22:40:19 -04:00
										 |  |  | #include "common/string_util.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "core/hle/service/service.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/ac_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  | #include "core/hle/service/am_net.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-28 23:08:37 -04:00
										 |  |  | #include "core/hle/service/apt_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-16 22:06:54 -08:00
										 |  |  | #include "core/hle/service/boss_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  | #include "core/hle/service/cfg_i.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/cfg_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  | #include "core/hle/service/csnd_snd.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/dsp_dsp.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-01 20:06:13 -07:00
										 |  |  | #include "core/hle/service/err_f.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-28 23:08:37 -04:00
										 |  |  | #include "core/hle/service/fs_user.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-10 22:41:17 -08:00
										 |  |  | #include "core/hle/service/frd_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-28 23:08:37 -04:00
										 |  |  | #include "core/hle/service/gsp_gpu.h"
 | 
					
						
							|  |  |  | #include "core/hle/service/hid_user.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  | #include "core/hle/service/ir_rst.h"
 | 
					
						
							|  |  |  | #include "core/hle/service/ir_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/mic_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-28 23:08:37 -04:00
										 |  |  | #include "core/hle/service/ndm_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/nwm_uds.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  | #include "core/hle/service/pm_app.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/ptm_u.h"
 | 
					
						
							|  |  |  | #include "core/hle/service/soc_u.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-15 22:40:19 -04:00
										 |  |  | #include "core/hle/service/srv.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  | #include "core/hle/service/ssl_c.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Service { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-06 00:35:49 -04:00
										 |  |  | Manager* g_manager = nullptr;  ///< Service manager
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-13 00:38:48 -04:00
										 |  |  | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Service Manager class
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | Manager::Manager() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Manager::~Manager() { | 
					
						
							|  |  |  |     for(Interface* service : m_services) { | 
					
						
							|  |  |  |         DeleteService(service->GetPortName()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Add a service to the manager (does not create it though)
 | 
					
						
							|  |  |  | void Manager::AddService(Interface* service) { | 
					
						
							| 
									
										
										
										
											2014-05-20 18:13:25 -04:00
										 |  |  |     m_port_map[service->GetPortName()] = Kernel::g_object_pool.Create(service); | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  |     m_services.push_back(service); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Removes a service from the manager, also frees memory
 | 
					
						
							| 
									
										
										
										
											2014-09-06 13:30:27 -04:00
										 |  |  | void Manager::DeleteService(const std::string& port_name) { | 
					
						
							| 
									
										
										
										
											2014-05-18 21:43:29 -04:00
										 |  |  |     Interface* service = FetchFromPortName(port_name); | 
					
						
							|  |  |  |     m_services.erase(std::remove(m_services.begin(), m_services.end(), service), m_services.end()); | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  |     m_port_map.erase(port_name); | 
					
						
							|  |  |  |     delete service; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 18:24:24 -04:00
										 |  |  | /// Get a Service Interface from its Handle
 | 
					
						
							|  |  |  | Interface* Manager::FetchFromHandle(Handle handle) { | 
					
						
							| 
									
										
										
										
											2014-10-23 01:20:01 -02:00
										 |  |  |     return Kernel::g_object_pool.Get<Interface>(handle); | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Get a Service Interface from its port
 | 
					
						
							| 
									
										
										
										
											2014-09-06 13:30:27 -04:00
										 |  |  | Interface* Manager::FetchFromPortName(const std::string& port_name) { | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  |     auto itr = m_port_map.find(port_name); | 
					
						
							|  |  |  |     if (itr == m_port_map.end()) { | 
					
						
							| 
									
										
										
										
											2014-06-06 00:35:49 -04:00
										 |  |  |         return nullptr; | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 18:24:24 -04:00
										 |  |  |     return FetchFromHandle(itr->second); | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-13 00:38:48 -04:00
										 |  |  | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Module interface
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | /// Initialize ServiceManager
 | 
					
						
							|  |  |  | void Init() { | 
					
						
							|  |  |  |     g_manager = new Manager; | 
					
						
							| 
									
										
										
										
											2014-11-19 08:49:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-15 22:40:19 -04:00
										 |  |  |     g_manager->AddService(new SRV::Interface); | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  |     g_manager->AddService(new AC_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  |     g_manager->AddService(new AM_NET::Interface); | 
					
						
							| 
									
										
										
										
											2014-04-15 22:42:35 -04:00
										 |  |  |     g_manager->AddService(new APT_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-16 22:06:54 -08:00
										 |  |  |     g_manager->AddService(new BOSS_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  |     g_manager->AddService(new CFG_I::Interface); | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  |     g_manager->AddService(new CFG_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  |     g_manager->AddService(new CSND_SND::Interface); | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  |     g_manager->AddService(new DSP_DSP::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-01 20:06:13 -07:00
										 |  |  |     g_manager->AddService(new ERR_F::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-10 22:41:17 -08:00
										 |  |  |     g_manager->AddService(new FRD_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-06-26 17:58:44 -04:00
										 |  |  |     g_manager->AddService(new FS_User::Interface); | 
					
						
							| 
									
										
										
										
											2014-04-16 00:03:41 -04:00
										 |  |  |     g_manager->AddService(new GSP_GPU::Interface); | 
					
						
							| 
									
										
										
										
											2014-04-16 20:58:36 -04:00
										 |  |  |     g_manager->AddService(new HID_User::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  |     g_manager->AddService(new IR_RST::Interface); | 
					
						
							|  |  |  |     g_manager->AddService(new IR_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  |     g_manager->AddService(new MIC_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-05-29 23:26:58 -04:00
										 |  |  |     g_manager->AddService(new NDM_U::Interface); | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  |     g_manager->AddService(new NWM_UDS::Interface); | 
					
						
							| 
									
										
										
										
											2014-11-12 13:13:08 -08:00
										 |  |  |     g_manager->AddService(new PM_APP::Interface); | 
					
						
							| 
									
										
										
										
											2014-10-29 18:38:33 -07:00
										 |  |  |     g_manager->AddService(new PTM_U::Interface); | 
					
						
							|  |  |  |     g_manager->AddService(new SOC_U::Interface); | 
					
						
							|  |  |  |     g_manager->AddService(new SSL_C::Interface); | 
					
						
							| 
									
										
										
										
											2014-04-16 00:03:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-05 23:53:49 -02:00
										 |  |  |     LOG_DEBUG(Service, "initialized OK"); | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Shutdown ServiceManager
 | 
					
						
							|  |  |  | void Shutdown() { | 
					
						
							|  |  |  |     delete g_manager; | 
					
						
							| 
									
										
										
										
											2014-12-05 23:53:49 -02:00
										 |  |  |     LOG_DEBUG(Service, "shutdown OK"); | 
					
						
							| 
									
										
										
										
											2014-04-12 21:55:36 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |