From 23ec6b3d8f33e2e0d76e646049f1fc1d36e70cf3 Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Mon, 5 Jun 2017 23:31:59 -0700 Subject: Service: Make service registration part of the sm implementation Also enhances the GetServiceHandle implementation to be more accurate. --- src/core/hle/service/sm/sm.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/core/hle/service/sm/sm.cpp (limited to 'src/core/hle/service/sm/sm.cpp') diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp new file mode 100644 index 000000000..40df0f0dd --- /dev/null +++ b/src/core/hle/service/sm/sm.cpp @@ -0,0 +1,58 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include "core/hle/kernel/client_session.h" +#include "core/hle/kernel/server_port.h" +#include "core/hle/result.h" +#include "core/hle/service/sm/sm.h" + +namespace Service { +namespace SM { + +static ResultCode ValidateServiceName(const std::string& name) { + if (name.size() <= 0 || name.size() > 8) { + return ERR_INVALID_NAME_SIZE; + } + if (name.find('\0') != std::string::npos) { + return ERR_NAME_CONTAINS_NUL; + } + return RESULT_SUCCESS; +} + +ResultVal> ServiceManager::RegisterService( + std::string name, unsigned int max_sessions) { + + CASCADE_CODE(ValidateServiceName(name)); + Kernel::SharedPtr server_port; + Kernel::SharedPtr client_port; + std::tie(server_port, client_port) = Kernel::ServerPort::CreatePortPair(max_sessions, name); + + registered_services.emplace(name, std::move(client_port)); + return MakeResult>(std::move(server_port)); +} + +ResultVal> ServiceManager::GetServicePort( + const std::string& name) { + + CASCADE_CODE(ValidateServiceName(name)); + auto it = registered_services.find(name); + if (it == registered_services.end()) { + return ERR_SERVICE_NOT_REGISTERED; + } + + return MakeResult>(it->second); +} + +ResultVal> ServiceManager::ConnectToService( + const std::string& name) { + + CASCADE_RESULT(auto client_port, GetServicePort(name)); + return client_port->Connect(); +} + +std::unique_ptr g_service_manager; + +} // namespace SM +} // namespace Service -- cgit v1.2.3