sm.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <memory>
  6. #include <string>
  7. #include <type_traits>
  8. #include <unordered_map>
  9. #include "common/concepts.h"
  10. #include "core/hle/kernel/client_port.h"
  11. #include "core/hle/kernel/object.h"
  12. #include "core/hle/kernel/server_port.h"
  13. #include "core/hle/result.h"
  14. #include "core/hle/service/service.h"
  15. namespace Core {
  16. class System;
  17. }
  18. namespace Kernel {
  19. class ClientPort;
  20. class KClientSession;
  21. class KernelCore;
  22. class ServerPort;
  23. class SessionRequestHandler;
  24. } // namespace Kernel
  25. namespace Service::SM {
  26. class Controller;
  27. /// Interface to "sm:" service
  28. class SM final : public ServiceFramework<SM> {
  29. public:
  30. explicit SM(std::shared_ptr<ServiceManager> service_manager_, Core::System& system_);
  31. ~SM() override;
  32. private:
  33. void Initialize(Kernel::HLERequestContext& ctx);
  34. void GetService(Kernel::HLERequestContext& ctx);
  35. void RegisterService(Kernel::HLERequestContext& ctx);
  36. void UnregisterService(Kernel::HLERequestContext& ctx);
  37. std::shared_ptr<ServiceManager> service_manager;
  38. Kernel::KernelCore& kernel;
  39. };
  40. class ServiceManager {
  41. public:
  42. static void InstallInterfaces(std::shared_ptr<ServiceManager> self, Core::System& system);
  43. explicit ServiceManager(Kernel::KernelCore& kernel_);
  44. ~ServiceManager();
  45. ResultVal<std::shared_ptr<Kernel::ServerPort>> RegisterService(std::string name,
  46. u32 max_sessions);
  47. ResultCode UnregisterService(const std::string& name);
  48. ResultVal<std::shared_ptr<Kernel::ClientPort>> GetServicePort(const std::string& name);
  49. template <Common::DerivedFrom<Kernel::SessionRequestHandler> T>
  50. std::shared_ptr<T> GetService(const std::string& service_name) const {
  51. auto service = registered_services.find(service_name);
  52. if (service == registered_services.end()) {
  53. LOG_DEBUG(Service, "Can't find service: {}", service_name);
  54. return nullptr;
  55. }
  56. auto port = service->second->GetServerPort();
  57. if (port == nullptr) {
  58. return nullptr;
  59. }
  60. return std::static_pointer_cast<T>(port->GetHLEHandler());
  61. }
  62. void InvokeControlRequest(Kernel::HLERequestContext& context);
  63. private:
  64. std::weak_ptr<SM> sm_interface;
  65. std::unique_ptr<Controller> controller_interface;
  66. /// Map of registered services, retrieved using GetServicePort.
  67. std::unordered_map<std::string, std::shared_ptr<Kernel::ClientPort>> registered_services;
  68. /// Kernel context
  69. Kernel::KernelCore& kernel;
  70. };
  71. } // namespace Service::SM