diff options
| -rw-r--r-- | src/core/hle/kernel/client_port.h | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_port.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/sm/sm.h | 19 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h index f3dfebbb1..a82b29417 100644 --- a/src/core/hle/kernel/client_port.h +++ b/src/core/hle/kernel/client_port.h | |||
| @@ -7,13 +7,13 @@ | |||
| 7 | #include <string> | 7 | #include <string> |
| 8 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 9 | #include "core/hle/kernel/object.h" | 9 | #include "core/hle/kernel/object.h" |
| 10 | #include "core/hle/kernel/server_port.h" | ||
| 10 | #include "core/hle/result.h" | 11 | #include "core/hle/result.h" |
| 11 | 12 | ||
| 12 | namespace Kernel { | 13 | namespace Kernel { |
| 13 | 14 | ||
| 14 | class ClientSession; | 15 | class ClientSession; |
| 15 | class KernelCore; | 16 | class KernelCore; |
| 16 | class ServerPort; | ||
| 17 | 17 | ||
| 18 | class ClientPort final : public Object { | 18 | class ClientPort final : public Object { |
| 19 | public: | 19 | public: |
| @@ -30,6 +30,10 @@ public: | |||
| 30 | return HANDLE_TYPE; | 30 | return HANDLE_TYPE; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | SharedPtr<ServerPort> GetServerPort() const { | ||
| 34 | return server_port; | ||
| 35 | } | ||
| 36 | |||
| 33 | /** | 37 | /** |
| 34 | * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's | 38 | * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's |
| 35 | * list of pending sessions, and signals the ServerPort, causing any threads | 39 | * list of pending sessions, and signals the ServerPort, causing any threads |
diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h index 62fb51349..e52f8245f 100644 --- a/src/core/hle/kernel/server_port.h +++ b/src/core/hle/kernel/server_port.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 12 | #include "core/hle/kernel/object.h" | 12 | #include "core/hle/kernel/object.h" |
| 13 | #include "core/hle/kernel/wait_object.h" | 13 | #include "core/hle/kernel/wait_object.h" |
| 14 | #include "core/hle/result.h" | ||
| 14 | 15 | ||
| 15 | namespace Kernel { | 16 | namespace Kernel { |
| 16 | 17 | ||
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index da2c51082..4f8145dda 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h | |||
| @@ -6,9 +6,12 @@ | |||
| 6 | 6 | ||
| 7 | #include <memory> | 7 | #include <memory> |
| 8 | #include <string> | 8 | #include <string> |
| 9 | #include <type_traits> | ||
| 9 | #include <unordered_map> | 10 | #include <unordered_map> |
| 10 | 11 | ||
| 12 | #include "core/hle/kernel/client_port.h" | ||
| 11 | #include "core/hle/kernel/object.h" | 13 | #include "core/hle/kernel/object.h" |
| 14 | #include "core/hle/kernel/server_port.h" | ||
| 12 | #include "core/hle/result.h" | 15 | #include "core/hle/result.h" |
| 13 | #include "core/hle/service/service.h" | 16 | #include "core/hle/service/service.h" |
| 14 | 17 | ||
| @@ -48,6 +51,22 @@ public: | |||
| 48 | ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name); | 51 | ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name); |
| 49 | ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ConnectToService(const std::string& name); | 52 | ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ConnectToService(const std::string& name); |
| 50 | 53 | ||
| 54 | template <typename T> | ||
| 55 | std::shared_ptr<T> GetService(const std::string& service_name) const { | ||
| 56 | static_assert(std::is_base_of_v<Kernel::SessionRequestHandler, T>, | ||
| 57 | "Not a base of ServiceFrameworkBase"); | ||
| 58 | auto service = registered_services.find(service_name); | ||
| 59 | if (service == registered_services.end()) { | ||
| 60 | LOG_DEBUG(Service, "Can't find service: {}", service_name); | ||
| 61 | return nullptr; | ||
| 62 | } | ||
| 63 | auto port = service->second->GetServerPort(); | ||
| 64 | if (port == nullptr) { | ||
| 65 | return nullptr; | ||
| 66 | } | ||
| 67 | return std::static_pointer_cast<T>(port->hle_handler); | ||
| 68 | } | ||
| 69 | |||
| 51 | void InvokeControlRequest(Kernel::HLERequestContext& context); | 70 | void InvokeControlRequest(Kernel::HLERequestContext& context); |
| 52 | 71 | ||
| 53 | private: | 72 | private: |