sm.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Copyright 2017 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <string>
  6. #include <unordered_map>
  7. #include "core/hle/kernel/kernel.h"
  8. #include "core/hle/result.h"
  9. #include "core/hle/service/service.h"
  10. namespace Kernel {
  11. class ClientPort;
  12. class ClientSession;
  13. class ServerPort;
  14. class SessionRequestHandler;
  15. } // namespace Kernel
  16. namespace Service {
  17. namespace SM {
  18. class SRV;
  19. constexpr ResultCode ERR_SERVICE_NOT_REGISTERED(1, ErrorModule::SRV, ErrorSummary::WouldBlock,
  20. ErrorLevel::Temporary); // 0xD0406401
  21. constexpr ResultCode ERR_MAX_CONNECTIONS_REACHED(2, ErrorModule::SRV, ErrorSummary::WouldBlock,
  22. ErrorLevel::Temporary); // 0xD0406402
  23. constexpr ResultCode ERR_INVALID_NAME_SIZE(5, ErrorModule::SRV, ErrorSummary::WrongArgument,
  24. ErrorLevel::Permanent); // 0xD9006405
  25. constexpr ResultCode ERR_ACCESS_DENIED(6, ErrorModule::SRV, ErrorSummary::InvalidArgument,
  26. ErrorLevel::Permanent); // 0xD8E06406
  27. constexpr ResultCode ERR_NAME_CONTAINS_NUL(7, ErrorModule::SRV, ErrorSummary::WrongArgument,
  28. ErrorLevel::Permanent); // 0xD9006407
  29. class ServiceManager {
  30. public:
  31. static void InstallInterfaces(std::shared_ptr<ServiceManager> self);
  32. ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> RegisterService(std::string name,
  33. unsigned int max_sessions);
  34. ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name);
  35. ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ConnectToService(const std::string& name);
  36. private:
  37. std::weak_ptr<SRV> srv_interface;
  38. /// Map of registered services, retrieved using GetServicePort or ConnectToService.
  39. std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> registered_services;
  40. };
  41. extern std::shared_ptr<ServiceManager> g_service_manager;
  42. } // namespace SM
  43. } // namespace Service