service.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 "core/hle/service/service.h"
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////
  8. // Namespace Service
  9. namespace Service {
  10. Manager* g_manager = NULL; ///< Service manager
  11. Manager::Manager() {
  12. }
  13. Manager::~Manager() {
  14. for(Interface* service : m_services) {
  15. DeleteService(service->GetPortName());
  16. }
  17. }
  18. /// Add a service to the manager (does not create it though)
  19. void Manager::AddService(Interface* service) {
  20. int index = m_services.size();
  21. u32 new_uid = GetUIDFromIndex(index);
  22. m_services.push_back(service);
  23. m_port_map[service->GetPortName()] = new_uid;
  24. service->m_uid = new_uid;
  25. }
  26. /// Removes a service from the manager, also frees memory
  27. void Manager::DeleteService(std::string port_name) {
  28. auto service = FetchFromPortName(port_name);
  29. m_services.erase(m_services.begin() + GetIndexFromUID(service->m_uid));
  30. m_port_map.erase(port_name);
  31. delete service;
  32. }
  33. /// Get a Service Interface from its UID
  34. Interface* Manager::FetchFromUID(u32 uid) {
  35. int index = GetIndexFromUID(uid);
  36. if (index < (int)m_services.size()) {
  37. return m_services[index];
  38. }
  39. return NULL;
  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 FetchFromUID(itr->second);
  48. }
  49. class Interface_SRV : public Interface {
  50. public:
  51. Interface_SRV() {
  52. }
  53. ~Interface_SRV() {
  54. }
  55. /**
  56. * Gets the string name used by CTROS for a service
  57. * @return String name of service
  58. */
  59. std::string GetName() const {
  60. return "ServiceManager";
  61. }
  62. /**
  63. * Gets the string name used by CTROS for a service
  64. * @return Port name of service
  65. */
  66. std::string GetPortName() const {
  67. return "srv:";
  68. }
  69. /**
  70. * Called when svcSendSyncRequest is called, loads command buffer and executes comand
  71. * @return Return result of svcSendSyncRequest passed back to user app
  72. */
  73. Syscall::Result Sync() {
  74. ERROR_LOG(HLE, "Unimplemented function Interface_SRV::Sync");
  75. return 0;
  76. }
  77. };
  78. /// Initialize ServiceManager
  79. void Init() {
  80. g_manager = new Manager;
  81. g_manager->AddService(new Interface_SRV);
  82. NOTICE_LOG(HLE, "Services initialized OK");
  83. }
  84. /// Shutdown ServiceManager
  85. void Shutdown() {
  86. delete g_manager;
  87. NOTICE_LOG(HLE, "Services shutdown OK");
  88. }
  89. }