From 9881b5106126c1dfcea901943d2f2d47ef63757f Mon Sep 17 00:00:00 2001 From: 3096 Date: Fri, 14 Aug 2020 20:58:09 -0700 Subject: [PATCH 1/3] add register plugin --- .clang-format | 2 +- libeiffel | 2 +- source/core/plugin_handler.cpp | 33 ++++++++++++++++++++++++++++ source/core/plugin_handler.hpp | 39 ++++++++++++++++++++++++++++++++++ source/ipc/sl_service.cpp | 18 ++++++++++++---- source/ipc/sl_service.hpp | 16 +++++++++----- 6 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 source/core/plugin_handler.cpp create mode 100644 source/core/plugin_handler.hpp diff --git a/.clang-format b/.clang-format index 7a5d829..77be22e 100644 --- a/.clang-format +++ b/.clang-format @@ -3,4 +3,4 @@ BasedOnStyle: Google ColumnLimit: 119 IndentWidth: 4 DerivePointerAlignment: false -NamespaceIndentation: Inner +NamespaceIndentation: All diff --git a/libeiffel b/libeiffel index fefa49b..fdf3cfe 160000 --- a/libeiffel +++ b/libeiffel @@ -1 +1 @@ -Subproject commit fefa49b63cc8a88175097ef999426101897fe892 +Subproject commit fdf3cfe9481cbdd991021cb35d38ea29762d7ac6 diff --git a/source/core/plugin_handler.cpp b/source/core/plugin_handler.cpp new file mode 100644 index 0000000..5265440 --- /dev/null +++ b/source/core/plugin_handler.cpp @@ -0,0 +1,33 @@ +#include "plugin_handler.hpp" + +#include + +namespace efl::core { + + PluginHandler::PluginHandler() {} + + PluginHandler::~PluginHandler() {} + + ams::Result PluginHandler::GetPluginMeta(SlPluginMeta* out_pluginMeta, std::string_view name) { + auto& records = GetInstance().m_ActivePluginMetas; + auto foundPluginEntry = records.find(name); + if (foundPluginEntry != records.end()) { + *out_pluginMeta = foundPluginEntry->second; + } else { + return EFL_U_RESULT_PLUGIN_NOT_ACTIVE; + } + return 0; + } + + ams::Result PluginHandler::GetPluginSharedMemInfo(SharedMemory* out_sharedMem, std::string_view name) { + auto& records = GetInstance().m_ActivePluginSharedMems; + auto foundPluginEntry = records.find(name); + if (foundPluginEntry != records.end()) { + *out_sharedMem = foundPluginEntry->second; + } else { + return EFL_U_RESULT_SHARED_MEM_NOT_REGISTERED; + } + return 0; + } + +} // namespace efl::core diff --git a/source/core/plugin_handler.hpp b/source/core/plugin_handler.hpp new file mode 100644 index 0000000..8a9a04e --- /dev/null +++ b/source/core/plugin_handler.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include + +#include +#include +#include + +namespace efl::core { + + using PluginName = std::array; + + class PluginHandler { + private: + PluginHandler(); + PluginHandler(const PluginHandler&) = delete; + ~PluginHandler(); + static inline auto& GetInstance() { + static PluginHandler s_Instance; + return s_Instance; + } + + std::unordered_map m_ActivePluginMetas; + std::unordered_map m_ActivePluginSharedMems; + + public: + static inline void SetPluginMeta(SlPluginMeta& pluginMeta) { + GetInstance().m_ActivePluginMetas[pluginMeta.name] = pluginMeta; + } + + static inline void SetPluginSharedMem(PluginName& name, SharedMemory& sharedMem) { + GetInstance().m_ActivePluginSharedMems[name.data()] = sharedMem; + } + + static ams::Result GetPluginMeta(SlPluginMeta* out_pluginMeta, std::string_view name); + static ams::Result GetPluginSharedMemInfo(SharedMemory* out_sharedMem, std::string_view name); + }; + +} // namespace efl::core diff --git a/source/ipc/sl_service.cpp b/source/ipc/sl_service.cpp index 0003c63..7874906 100644 --- a/source/ipc/sl_service.cpp +++ b/source/ipc/sl_service.cpp @@ -2,8 +2,7 @@ #include "../util.hpp" -namespace efl { -namespace ipc { +namespace efl::ipc { SlService::SlService() {} @@ -15,5 +14,16 @@ namespace ipc { return 0; }; -}; // namespace ipc -}; // namespace efl + ams::Result SlService::RegisterPlugin(SlPluginMeta meta) { + core::PluginHandler::SetPluginMeta(meta); + LOG("registered plugin: %s", meta.name); + return 0; + }; + + ams::Result SlService::RegisterSharedMem(core::PluginName name, SharedMemory sharedMem) { + core::PluginHandler::SetPluginSharedMem(name, sharedMem); + LOG("registered plugin shared mem: %s", name); + return 0; + }; + +}; // namespace efl::ipc diff --git a/source/ipc/sl_service.hpp b/source/ipc/sl_service.hpp index 9fa38d3..be1181f 100644 --- a/source/ipc/sl_service.hpp +++ b/source/ipc/sl_service.hpp @@ -4,15 +4,17 @@ #include +#include "../core/plugin_handler.hpp" #include "../logger/types.hpp" -namespace efl { -namespace ipc { +namespace efl::ipc { class SlService final : public ams::sf::IServiceObject { protected: enum class CommandId { Log = EFL_SL_CMD_LOG, + RegisterPlugin = EFL_SL_CMD_REGISTER_PLUGIN, + RegisterSharedMem = EFL_SL_CMD_REGISTER_SHARED_MEM, }; public: @@ -20,15 +22,19 @@ namespace ipc { virtual ~SlService(); private: - ams::Result Log(const ams::sf::InBuffer&, efl::logger::LogLevel, const ams::sf::InBuffer&); + ams::Result Log(const ams::sf::InBuffer& module_name, efl::logger::LogLevel level, + const ams::sf::InBuffer& buf); + ams::Result RegisterPlugin(SlPluginMeta meta); + ams::Result RegisterSharedMem(core::PluginName name, SharedMemory sharedMem); public: DEFINE_SERVICE_DISPATCH_TABLE{ MAKE_SERVICE_COMMAND_META(Log), + MAKE_SERVICE_COMMAND_META(RegisterPlugin), + MAKE_SERVICE_COMMAND_META(RegisterSharedMem), }; static constexpr auto SERVICE_NAME = ams::sm::ServiceName::Encode(EIFFEL_SKYLINE_SERVICE_NAME); }; -}; // namespace ipc -}; // namespace efl +}; // namespace efl::ipc From 9379bc62799e247b18c896c617e5774c5d01787a Mon Sep 17 00:00:00 2001 From: 3096 Date: Tue, 18 Aug 2020 01:21:44 -0700 Subject: [PATCH 2/3] efl:u - get plugin meta & shared mem info --- libeiffel | 2 +- source/core/plugin_handler.cpp | 18 ++++++++--------- source/core/plugin_handler.hpp | 16 ++++++++-------- source/ipc/server.cpp | 9 +++++---- source/ipc/server.hpp | 8 +++----- source/ipc/sl_service.cpp | 9 +++++---- source/ipc/sl_service.hpp | 2 +- source/ipc/user_service.cpp | 21 ++++++++++++++++++++ source/ipc/user_service.hpp | 35 ++++++++++++++++++++++++++++++++++ 9 files changed, 88 insertions(+), 32 deletions(-) create mode 100644 source/ipc/user_service.cpp create mode 100644 source/ipc/user_service.hpp diff --git a/libeiffel b/libeiffel index fdf3cfe..55e67db 160000 --- a/libeiffel +++ b/libeiffel @@ -1 +1 @@ -Subproject commit fdf3cfe9481cbdd991021cb35d38ea29762d7ac6 +Subproject commit 55e67db370274f2c67375d1ac25a425a92e650e6 diff --git a/source/core/plugin_handler.cpp b/source/core/plugin_handler.cpp index 5265440..ecc8d23 100644 --- a/source/core/plugin_handler.cpp +++ b/source/core/plugin_handler.cpp @@ -8,10 +8,10 @@ namespace efl::core { PluginHandler::~PluginHandler() {} - ams::Result PluginHandler::GetPluginMeta(SlPluginMeta* out_pluginMeta, std::string_view name) { - auto& records = GetInstance().m_ActivePluginMetas; - auto foundPluginEntry = records.find(name); - if (foundPluginEntry != records.end()) { + ams::Result PluginHandler::GetPluginMeta(SlPluginMeta* out_pluginMeta, PluginName& name) { + auto& activePluginMetas = GetInstance().m_ActivePluginMetas; + auto foundPluginEntry = activePluginMetas.find(name.data()); + if (foundPluginEntry != activePluginMetas.end()) { *out_pluginMeta = foundPluginEntry->second; } else { return EFL_U_RESULT_PLUGIN_NOT_ACTIVE; @@ -19,11 +19,11 @@ namespace efl::core { return 0; } - ams::Result PluginHandler::GetPluginSharedMemInfo(SharedMemory* out_sharedMem, std::string_view name) { - auto& records = GetInstance().m_ActivePluginSharedMems; - auto foundPluginEntry = records.find(name); - if (foundPluginEntry != records.end()) { - *out_sharedMem = foundPluginEntry->second; + ams::Result PluginHandler::GetPluginSharedMemInfo(SlPluginSharedMemInfo* out_sharedMemInfo, PluginName& name) { + auto& activePluginSharedMemInfos = GetInstance().m_ActivePluginSharedMemInfos; + auto foundPluginEntry = activePluginSharedMemInfos.find(name.data()); + if (foundPluginEntry != activePluginSharedMemInfos.end()) { + *out_sharedMemInfo = foundPluginEntry->second; } else { return EFL_U_RESULT_SHARED_MEM_NOT_REGISTERED; } diff --git a/source/core/plugin_handler.hpp b/source/core/plugin_handler.hpp index 8a9a04e..98773bb 100644 --- a/source/core/plugin_handler.hpp +++ b/source/core/plugin_handler.hpp @@ -3,8 +3,8 @@ #include #include -#include -#include +#include +#include namespace efl::core { @@ -20,20 +20,20 @@ namespace efl::core { return s_Instance; } - std::unordered_map m_ActivePluginMetas; - std::unordered_map m_ActivePluginSharedMems; + std::map m_ActivePluginMetas; + std::map m_ActivePluginSharedMemInfos; public: static inline void SetPluginMeta(SlPluginMeta& pluginMeta) { GetInstance().m_ActivePluginMetas[pluginMeta.name] = pluginMeta; } - static inline void SetPluginSharedMem(PluginName& name, SharedMemory& sharedMem) { - GetInstance().m_ActivePluginSharedMems[name.data()] = sharedMem; + static inline void SetPluginSharedMem(PluginName& name, SlPluginSharedMemInfo& sharedMemInfo) { + GetInstance().m_ActivePluginSharedMemInfos[name.data()] = sharedMemInfo; } - static ams::Result GetPluginMeta(SlPluginMeta* out_pluginMeta, std::string_view name); - static ams::Result GetPluginSharedMemInfo(SharedMemory* out_sharedMem, std::string_view name); + static ams::Result GetPluginMeta(SlPluginMeta* out_pluginMeta, PluginName& name); + static ams::Result GetPluginSharedMemInfo(SlPluginSharedMemInfo* out_sharedMemInfo, PluginName& name); }; } // namespace efl::core diff --git a/source/ipc/server.cpp b/source/ipc/server.cpp index 2ed28b2..61e0bc9 100644 --- a/source/ipc/server.cpp +++ b/source/ipc/server.cpp @@ -1,14 +1,15 @@ #include "server.hpp" #include "sl_service.hpp" +#include "user_service.hpp" -namespace efl { -namespace ipc { +namespace efl::ipc { Server::Server() { R_ABORT_UNLESS( m_serverManager.RegisterServer(SlService::SERVICE_NAME, EIFFEL_SERVICE_MAX_SESSIONS)); + R_ABORT_UNLESS( + m_serverManager.RegisterServer(UserService::SERVICE_NAME, EIFFEL_SERVICE_MAX_SESSIONS)); } -}; // namespace ipc -}; // namespace efl +}; // namespace efl::ipc diff --git a/source/ipc/server.hpp b/source/ipc/server.hpp index 2610afd..9897a24 100644 --- a/source/ipc/server.hpp +++ b/source/ipc/server.hpp @@ -2,12 +2,11 @@ #include -namespace efl { -namespace ipc { +namespace efl::ipc { class Server { private: - static constexpr auto NUM_SERVERS = 1; + static constexpr auto NUM_SERVERS = 2; static constexpr auto EIFFEL_SERVICE_MAX_SESSIONS = 5; Server(); @@ -23,5 +22,4 @@ namespace ipc { static inline void Loop() { GetInstance().m_serverManager.LoopProcess(); } }; -} // namespace ipc -} // namespace efl +} // namespace efl::ipc diff --git a/source/ipc/sl_service.cpp b/source/ipc/sl_service.cpp index 7874906..802ddfd 100644 --- a/source/ipc/sl_service.cpp +++ b/source/ipc/sl_service.cpp @@ -16,13 +16,14 @@ namespace efl::ipc { ams::Result SlService::RegisterPlugin(SlPluginMeta meta) { core::PluginHandler::SetPluginMeta(meta); - LOG("registered plugin: %s", meta.name); + LOG("%s", meta.name); return 0; }; - ams::Result SlService::RegisterSharedMem(core::PluginName name, SharedMemory sharedMem) { - core::PluginHandler::SetPluginSharedMem(name, sharedMem); - LOG("registered plugin shared mem: %s", name); + ams::Result SlService::RegisterSharedMem(core::PluginName name, SlPluginSharedMemInfo sharedMemInfo) { + core::PluginHandler::SetPluginSharedMem(name, sharedMemInfo); + LOG("%s - handle %d size 0x%lx perm: %x", name.data(), sharedMemInfo.handle, sharedMemInfo.size, + sharedMemInfo.perm); return 0; }; diff --git a/source/ipc/sl_service.hpp b/source/ipc/sl_service.hpp index be1181f..e58e3b2 100644 --- a/source/ipc/sl_service.hpp +++ b/source/ipc/sl_service.hpp @@ -25,7 +25,7 @@ namespace efl::ipc { ams::Result Log(const ams::sf::InBuffer& module_name, efl::logger::LogLevel level, const ams::sf::InBuffer& buf); ams::Result RegisterPlugin(SlPluginMeta meta); - ams::Result RegisterSharedMem(core::PluginName name, SharedMemory sharedMem); + ams::Result RegisterSharedMem(core::PluginName name, SlPluginSharedMemInfo sharedMemInfo); public: DEFINE_SERVICE_DISPATCH_TABLE{ diff --git a/source/ipc/user_service.cpp b/source/ipc/user_service.cpp new file mode 100644 index 0000000..b2ffd17 --- /dev/null +++ b/source/ipc/user_service.cpp @@ -0,0 +1,21 @@ +#include "user_service.hpp" + +#include "../util.hpp" + +namespace efl::ipc { + + UserService::UserService() {} + + UserService::~UserService() {} + + ams::Result UserService::GetPluginMeta(ams::sf::Out out, core::PluginName name) { + LOG("%s", name.data()); + return core::PluginHandler::GetPluginMeta(out.GetPointer(), name); + }; + + ams::Result UserService::GetPluginSharedMemInfo(ams::sf::Out out, core::PluginName name) { + LOG("%s", name.data()); + return core::PluginHandler::GetPluginSharedMemInfo(out.GetPointer(), name); + }; + +}; // namespace efl::ipc diff --git a/source/ipc/user_service.hpp b/source/ipc/user_service.hpp new file mode 100644 index 0000000..b44bb0a --- /dev/null +++ b/source/ipc/user_service.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include + +#include "../core/plugin_handler.hpp" + +namespace efl::ipc { + + class UserService final : public ams::sf::IServiceObject { + protected: + enum class CommandId { + GetPluginMeta = EFL_U_CMD_GET_PLUGIN_META, + GetPluginSharedMemInfo = EFL_U_CMD_GET_PLUGIN_SHARED_MEM_INFO, + }; + + public: + explicit UserService(); + virtual ~UserService(); + + private: + ams::Result GetPluginMeta(ams::sf::Out out, core::PluginName name); + ams::Result GetPluginSharedMemInfo(ams::sf::Out out, core::PluginName name); + + public: + DEFINE_SERVICE_DISPATCH_TABLE{ + MAKE_SERVICE_COMMAND_META(GetPluginMeta), + MAKE_SERVICE_COMMAND_META(GetPluginSharedMemInfo), + }; + + static constexpr auto SERVICE_NAME = ams::sm::ServiceName::Encode(EIFFEL_USER_SERVICE_NAME); + }; + +}; // namespace efl::ipc From e01c9359d99169e2d2c97deb308db4fe6ca964d5 Mon Sep 17 00:00:00 2001 From: 3096 Date: Tue, 25 Aug 2020 21:53:02 -0700 Subject: [PATCH 3/3] properly pass shmem handle --- libeiffel | 2 +- source/core/plugin_handler.cpp | 6 +++--- source/core/plugin_handler.hpp | 8 +++++--- source/ipc/sl_service.cpp | 12 +++++++----- source/ipc/sl_service.hpp | 2 +- source/ipc/user_service.cpp | 11 +++++++++-- source/ipc/user_service.hpp | 7 ++++--- 7 files changed, 30 insertions(+), 18 deletions(-) diff --git a/libeiffel b/libeiffel index 55e67db..c7ad1cb 160000 --- a/libeiffel +++ b/libeiffel @@ -1 +1 @@ -Subproject commit 55e67db370274f2c67375d1ac25a425a92e650e6 +Subproject commit c7ad1cb13c54bdb7e279675042afbfede44a024a diff --git a/source/core/plugin_handler.cpp b/source/core/plugin_handler.cpp index ecc8d23..451591b 100644 --- a/source/core/plugin_handler.cpp +++ b/source/core/plugin_handler.cpp @@ -22,11 +22,11 @@ namespace efl::core { ams::Result PluginHandler::GetPluginSharedMemInfo(SlPluginSharedMemInfo* out_sharedMemInfo, PluginName& name) { auto& activePluginSharedMemInfos = GetInstance().m_ActivePluginSharedMemInfos; auto foundPluginEntry = activePluginSharedMemInfos.find(name.data()); - if (foundPluginEntry != activePluginSharedMemInfos.end()) { - *out_sharedMemInfo = foundPluginEntry->second; - } else { + if (foundPluginEntry == activePluginSharedMemInfos.end()) { return EFL_U_RESULT_SHARED_MEM_NOT_REGISTERED; } + *out_sharedMemInfo = foundPluginEntry->second; + activePluginSharedMemInfos.erase(foundPluginEntry); // temp: keep it after proper cleanup impl return 0; } diff --git a/source/core/plugin_handler.hpp b/source/core/plugin_handler.hpp index 98773bb..067c8e0 100644 --- a/source/core/plugin_handler.hpp +++ b/source/core/plugin_handler.hpp @@ -2,9 +2,9 @@ #include +#include #include #include -#include namespace efl::core { @@ -23,13 +23,15 @@ namespace efl::core { std::map m_ActivePluginMetas; std::map m_ActivePluginSharedMemInfos; + // TODO: need to clean everything when game is closed + public: static inline void SetPluginMeta(SlPluginMeta& pluginMeta) { GetInstance().m_ActivePluginMetas[pluginMeta.name] = pluginMeta; } - static inline void SetPluginSharedMem(PluginName& name, SlPluginSharedMemInfo& sharedMemInfo) { - GetInstance().m_ActivePluginSharedMemInfos[name.data()] = sharedMemInfo; + static inline void SetPluginSharedMem(SlPluginName name, SlPluginSharedMemInfo& sharedMemInfo) { + GetInstance().m_ActivePluginSharedMemInfos[name] = sharedMemInfo; } static ams::Result GetPluginMeta(SlPluginMeta* out_pluginMeta, PluginName& name); diff --git a/source/ipc/sl_service.cpp b/source/ipc/sl_service.cpp index 802ddfd..3f558b9 100644 --- a/source/ipc/sl_service.cpp +++ b/source/ipc/sl_service.cpp @@ -10,7 +10,9 @@ namespace efl::ipc { ams::Result SlService::Log(const ams::sf::InBuffer& module_name, efl::logger::LogLevel level, const ams::sf::InBuffer& buf) { - LOG("[%s][%s] %s", module_name.GetPointer(), logger::GetLogLevelString(level), buf.GetPointer()); + // TODO: impl proper handling of logs + printf("LOG: [%s][%s] %s", module_name.GetPointer(), logger::GetLogLevelString(level), + buf.GetPointer()); // this is just for debug return 0; }; @@ -20,10 +22,10 @@ namespace efl::ipc { return 0; }; - ams::Result SlService::RegisterSharedMem(core::PluginName name, SlPluginSharedMemInfo sharedMemInfo) { - core::PluginHandler::SetPluginSharedMem(name, sharedMemInfo); - LOG("%s - handle %d size 0x%lx perm: %x", name.data(), sharedMemInfo.handle, sharedMemInfo.size, - sharedMemInfo.perm); + ams::Result SlService::RegisterSharedMem(EiffelSlRegisterSharedMemIn in, ams::sf::CopyHandle handle) { + auto sharedMemInfo = SlPluginSharedMemInfo{handle.GetValue(), in.size, in.perm}; + core::PluginHandler::SetPluginSharedMem(in.name, sharedMemInfo); + LOG("%s - size 0x%lx perm: %x", in.name, in.size, in.perm); return 0; }; diff --git a/source/ipc/sl_service.hpp b/source/ipc/sl_service.hpp index e58e3b2..b61627f 100644 --- a/source/ipc/sl_service.hpp +++ b/source/ipc/sl_service.hpp @@ -25,7 +25,7 @@ namespace efl::ipc { ams::Result Log(const ams::sf::InBuffer& module_name, efl::logger::LogLevel level, const ams::sf::InBuffer& buf); ams::Result RegisterPlugin(SlPluginMeta meta); - ams::Result RegisterSharedMem(core::PluginName name, SlPluginSharedMemInfo sharedMemInfo); + ams::Result RegisterSharedMem(EiffelSlRegisterSharedMemIn in, ams::sf::CopyHandle handle); public: DEFINE_SERVICE_DISPATCH_TABLE{ diff --git a/source/ipc/user_service.cpp b/source/ipc/user_service.cpp index b2ffd17..d75ea37 100644 --- a/source/ipc/user_service.cpp +++ b/source/ipc/user_service.cpp @@ -13,9 +13,16 @@ namespace efl::ipc { return core::PluginHandler::GetPluginMeta(out.GetPointer(), name); }; - ams::Result UserService::GetPluginSharedMemInfo(ams::sf::Out out, core::PluginName name) { + // TODO: use copy handle instead when cleaning up handles is implemented + ams::Result UserService::GetPluginSharedMem(ams::sf::OutMoveHandle out_handle, + ams::sf::Out out, core::PluginName name) { LOG("%s", name.data()); - return core::PluginHandler::GetPluginSharedMemInfo(out.GetPointer(), name); + auto rc = core::PluginHandler::GetPluginSharedMemInfo(out.GetPointer(), name); + if (R_SUCCEEDED(rc)) { + *(out_handle.GetHandlePointer()) = out.GetPointer()->handle; + } + out.GetPointer()->handle = INVALID_HANDLE; // for libeiffel to fill in + return rc; }; }; // namespace efl::ipc diff --git a/source/ipc/user_service.hpp b/source/ipc/user_service.hpp index b44bb0a..73ad06a 100644 --- a/source/ipc/user_service.hpp +++ b/source/ipc/user_service.hpp @@ -12,7 +12,7 @@ namespace efl::ipc { protected: enum class CommandId { GetPluginMeta = EFL_U_CMD_GET_PLUGIN_META, - GetPluginSharedMemInfo = EFL_U_CMD_GET_PLUGIN_SHARED_MEM_INFO, + GetPluginSharedMem = EFL_U_CMD_GET_PLUGIN_SHARED_MEM, }; public: @@ -21,12 +21,13 @@ namespace efl::ipc { private: ams::Result GetPluginMeta(ams::sf::Out out, core::PluginName name); - ams::Result GetPluginSharedMemInfo(ams::sf::Out out, core::PluginName name); + ams::Result GetPluginSharedMem(ams::sf::OutMoveHandle out_handle, ams::sf::Out out, + core::PluginName name); public: DEFINE_SERVICE_DISPATCH_TABLE{ MAKE_SERVICE_COMMAND_META(GetPluginMeta), - MAKE_SERVICE_COMMAND_META(GetPluginSharedMemInfo), + MAKE_SERVICE_COMMAND_META(GetPluginSharedMem), }; static constexpr auto SERVICE_NAME = ams::sm::ServiceName::Encode(EIFFEL_USER_SERVICE_NAME);