sm.h 2.6 KB

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