service.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2
  3. // Refer to the license.txt file included.
  4. #include "common/common.h"
  5. #include "common/log.h"
  6. #include "common/string_util.h"
  7. #include "core/hle/hle.h"
  8. #include "core/hle/service/service.h"
  9. #include "core/hle/service/apt.h"
  10. #include "core/hle/service/gsp.h"
  11. #include "core/hle/service/hid.h"
  12. #include "core/hle/service/srv.h"
  13. #include "core/hle/kernel/kernel.h"
  14. namespace Service {
  15. Manager* g_manager = NULL; ///< Service manager
  16. ////////////////////////////////////////////////////////////////////////////////////////////////////
  17. // Service Manager class
  18. Manager::Manager() {
  19. }
  20. Manager::~Manager() {
  21. for(Interface* service : m_services) {
  22. DeleteService(service->GetPortName());
  23. }
  24. }
  25. /// Add a service to the manager (does not create it though)
  26. void Manager::AddService(Interface* service) {
  27. m_port_map[service->GetPortName()] = Kernel::g_object_pool.Create(service);
  28. m_services.push_back(service);
  29. }
  30. /// Removes a service from the manager, also frees memory
  31. void Manager::DeleteService(std::string port_name) {
  32. Interface* service = FetchFromPortName(port_name);
  33. m_services.erase(std::remove(m_services.begin(), m_services.end(), service), m_services.end());
  34. m_port_map.erase(port_name);
  35. delete service;
  36. }
  37. /// Get a Service Interface from its Handle
  38. Interface* Manager::FetchFromHandle(Handle handle) {
  39. return Kernel::g_object_pool.GetFast<Interface>(handle);
  40. }
  41. /// Get a Service Interface from its port
  42. Interface* Manager::FetchFromPortName(std::string port_name) {
  43. auto itr = m_port_map.find(port_name);
  44. if (itr == m_port_map.end()) {
  45. return NULL;
  46. }
  47. return FetchFromHandle(itr->second);
  48. }
  49. ////////////////////////////////////////////////////////////////////////////////////////////////////
  50. // Module interface
  51. /// Initialize ServiceManager
  52. void Init() {
  53. g_manager = new Manager;
  54. g_manager->AddService(new SRV::Interface);
  55. g_manager->AddService(new APT_U::Interface);
  56. g_manager->AddService(new GSP_GPU::Interface);
  57. g_manager->AddService(new HID_User::Interface);
  58. NOTICE_LOG(HLE, "Services initialized OK");
  59. }
  60. /// Shutdown ServiceManager
  61. void Shutdown() {
  62. delete g_manager;
  63. NOTICE_LOG(HLE, "Services shutdown OK");
  64. }
  65. }