sm.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 Kernel {
  16. class ClientPort;
  17. class ClientSession;
  18. class KernelCore;
  19. class ServerPort;
  20. class SessionRequestHandler;
  21. } // namespace Kernel
  22. namespace Service::SM {
  23. class Controller;
  24. /// Interface to "sm:" service
  25. class SM final : public ServiceFramework<SM> {
  26. public:
  27. explicit SM(std::shared_ptr<ServiceManager> service_manager, Kernel::KernelCore& kernel);
  28. ~SM() override;
  29. private:
  30. void Initialize(Kernel::HLERequestContext& ctx);
  31. void GetService(Kernel::HLERequestContext& ctx);
  32. void RegisterService(Kernel::HLERequestContext& ctx);
  33. void UnregisterService(Kernel::HLERequestContext& ctx);
  34. std::shared_ptr<ServiceManager> service_manager;
  35. Kernel::KernelCore& kernel;
  36. };
  37. class ServiceManager {
  38. public:
  39. static void InstallInterfaces(std::shared_ptr<ServiceManager> self, Kernel::KernelCore& kernel);
  40. explicit ServiceManager(Kernel::KernelCore& kernel_);
  41. ~ServiceManager();
  42. ResultVal<std::shared_ptr<Kernel::ServerPort>> RegisterService(std::string name,
  43. u32 max_sessions);
  44. ResultCode UnregisterService(const std::string& name);
  45. ResultVal<std::shared_ptr<Kernel::ClientPort>> GetServicePort(const std::string& name);
  46. ResultVal<std::shared_ptr<Kernel::ClientSession>> ConnectToService(const std::string& name);
  47. template <Common::DerivedFrom<Kernel::SessionRequestHandler> T>
  48. std::shared_ptr<T> GetService(const std::string& service_name) const {
  49. auto service = registered_services.find(service_name);
  50. if (service == registered_services.end()) {
  51. LOG_DEBUG(Service, "Can't find service: {}", service_name);
  52. return nullptr;
  53. }
  54. auto port = service->second->GetServerPort();
  55. if (port == nullptr) {
  56. return nullptr;
  57. }
  58. return std::static_pointer_cast<T>(port->GetHLEHandler());
  59. }
  60. void InvokeControlRequest(Kernel::HLERequestContext& context);
  61. private:
  62. std::weak_ptr<SM> sm_interface;
  63. std::unique_ptr<Controller> controller_interface;
  64. /// Map of registered services, retrieved using GetServicePort or ConnectToService.
  65. std::unordered_map<std::string, std::shared_ptr<Kernel::ClientPort>> registered_services;
  66. /// Kernel context
  67. Kernel::KernelCore& kernel;
  68. };
  69. } // namespace Service::SM