From 0dc19b1966a6c4f91530ff8d72ce79e9a9a6b7bf Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Fri, 20 Dec 2024 18:05:23 +0100 Subject: [PATCH 1/9] Add explicit getParticipantName and getRegistryUri C/C++ API Signed-off-by: Konrad Breitsprecher --- SilKit/IntegrationTests/CMakeLists.txt | 4 + .../IntegrationTests/Hourglass/MockCapi.cpp | 16 +++ .../IntegrationTests/Hourglass/MockCapi.hpp | 6 + SilKit/IntegrationTests/ITest_Parameters.cpp | 56 +++++++++ SilKit/include/silkit/capi/Parameters.h | 29 +++++ SilKit/include/silkit/capi/Participant.h | 32 ++++++ SilKit/include/silkit/capi/SilKit.h | 1 + .../impl/participant/ParameterProvider.hpp | 86 ++++++++++++++ .../detail/impl/participant/Participant.hpp | 20 ++++ .../silkit/participant/IParticipant.hpp | 6 + .../include/silkit/participant/parameters.hpp | 23 ++++ SilKit/source/capi/CMakeLists.txt | 2 + SilKit/source/capi/CapiParticipant.cpp | 50 +++++++++ SilKit/source/capi/Test_CapiGetParameter.cpp | 106 ++++++++++++++++++ .../core/internal/IParticipantInternal.hpp | 6 +- .../core/mock/participant/MockParticipant.hpp | 18 +-- .../source/core/participant/Participant.hpp | 6 +- .../core/participant/Participant_impl.hpp | 1 + 18 files changed, 454 insertions(+), 14 deletions(-) create mode 100644 SilKit/IntegrationTests/ITest_Parameters.cpp create mode 100644 SilKit/include/silkit/capi/Parameters.h create mode 100644 SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp create mode 100644 SilKit/include/silkit/participant/parameters.hpp create mode 100644 SilKit/source/capi/Test_CapiGetParameter.cpp diff --git a/SilKit/IntegrationTests/CMakeLists.txt b/SilKit/IntegrationTests/CMakeLists.txt index 0eb1b3a59..5e34ec3d4 100644 --- a/SilKit/IntegrationTests/CMakeLists.txt +++ b/SilKit/IntegrationTests/CMakeLists.txt @@ -118,6 +118,10 @@ add_silkit_test_to_executable(SilKitIntegrationTests SOURCES ITest_SimTask.cpp ) +add_silkit_test_to_executable(SilKitIntegrationTests + SOURCES ITest_Parameters.cpp +) + add_silkit_test_to_executable(SilKitFunctionalTests SOURCES FTest_WallClockCoupling.cpp ) diff --git a/SilKit/IntegrationTests/Hourglass/MockCapi.cpp b/SilKit/IntegrationTests/Hourglass/MockCapi.cpp index ccedbf562..06c9f7300 100644 --- a/SilKit/IntegrationTests/Hourglass/MockCapi.cpp +++ b/SilKit/IntegrationTests/Hourglass/MockCapi.cpp @@ -769,6 +769,22 @@ extern "C" return globalCapi->SilKit_Participant_GetLogger(outLogger, participant); } + SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant) + { + return globalCapi->SilKit_Participant_GetParticipantName(outParameterValue, inOutParameterValueSize, + participant); + } + + SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant) + { + return globalCapi->SilKit_Participant_GetGetRegistryUri(outParameterValue, inOutParameterValueSize, + participant); + } + // ParticipantConfiguration SilKit_ReturnCode SilKitCALL SilKit_ParticipantConfiguration_FromString( diff --git a/SilKit/IntegrationTests/Hourglass/MockCapi.hpp b/SilKit/IntegrationTests/Hourglass/MockCapi.hpp index 1b863ea8b..79b7d9256 100644 --- a/SilKit/IntegrationTests/Hourglass/MockCapi.hpp +++ b/SilKit/IntegrationTests/Hourglass/MockCapi.hpp @@ -407,6 +407,12 @@ class MockCapi MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetLogger, (SilKit_Logger * *outLogger, SilKit_Participant* participant)); + MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetParticipantName, + (void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant)); + + MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetGetRegistryUri, + (void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant)); + // ParticipantConfiguration MOCK_METHOD(SilKit_ReturnCode, SilKit_ParticipantConfiguration_FromString, diff --git a/SilKit/IntegrationTests/ITest_Parameters.cpp b/SilKit/IntegrationTests/ITest_Parameters.cpp new file mode 100644 index 000000000..195787370 --- /dev/null +++ b/SilKit/IntegrationTests/ITest_Parameters.cpp @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2026 Vector Informatik GmbH +// +// SPDX-License-Identifier: MIT + +#include +#include + +#include "gtest/gtest.h" + +#include "silkit/SilKit.hpp" +#include "silkit/vendor/CreateSilKitRegistry.hpp" + +namespace { + +class ITest_Parameters : public testing::Test +{ +protected: + const std::string _registryUriAnyPort{"silkit://127.0.0.1:0"}; +}; + +TEST_F(ITest_Parameters, participant_name_and_registry_uri_set_by_api) +{ + const std::string participantNameByApi{"P1"}; + + auto emptyParticipantConfig = SilKit::Config::ParticipantConfigurationFromString(""); + auto registry = SilKit::Vendor::Vector::CreateSilKitRegistry(emptyParticipantConfig); + auto registryUriByApi = registry->StartListening(_registryUriAnyPort); + + auto participant = SilKit::CreateParticipant(emptyParticipantConfig, participantNameByApi, registryUriByApi); + + EXPECT_EQ(participant->GetParticipantName(), participantNameByApi); + EXPECT_EQ(participant->GetRegistryUri(), registryUriByApi); +} + +TEST_F(ITest_Parameters, participant_name_and_registry_uri_set_by_configuration) +{ + const std::string participantNameByApi{"P2"}; + const std::string registryUriByApi{"silkit://127.0.0.42:0"}; + const std::string participantNameByConfig{"P1"}; + + auto emptyParticipantConfig = SilKit::Config::ParticipantConfigurationFromString(""); + auto registry = SilKit::Vendor::Vector::CreateSilKitRegistry(emptyParticipantConfig); + auto registryUriByConfig = registry->StartListening(_registryUriAnyPort); + + std::ostringstream ss; + ss << R"({ "ParticipantName": ")" << participantNameByConfig + << R"(", "Middleware": { "RegistryUri": ")" << registryUriByConfig << R"(" }})"; + + auto participantConfig = SilKit::Config::ParticipantConfigurationFromString(ss.str()); + auto participant = SilKit::CreateParticipant(participantConfig, participantNameByApi, registryUriByApi); + + EXPECT_EQ(participant->GetParticipantName(), participantNameByConfig); + EXPECT_EQ(participant->GetRegistryUri(), registryUriByConfig); +} + +} // namespace diff --git a/SilKit/include/silkit/capi/Parameters.h b/SilKit/include/silkit/capi/Parameters.h new file mode 100644 index 000000000..06063b504 --- /dev/null +++ b/SilKit/include/silkit/capi/Parameters.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH +// +// SPDX-License-Identifier: MIT + +#pragma once +#include +#include "SilKitMacros.h" + +#pragma pack(push) +#pragma pack(8) + +SILKIT_BEGIN_DECLS + +/*! Internal parameter provider. */ +typedef struct SilKit_ParamterProvider SilKit_ParamterProvider; + +/*! A parameter set by an API call and/or the participant configuration. */ +typedef int16_t SilKit_Parameter; + +/*! An undefined parameter */ +#define SilKit_Parameter_Undefined ((SilKit_Parameter)0) +/*! The name of the participant */ +#define SilKit_Parameter_ParticipantName ((SilKit_Parameter)1) +/*! The registry URI */ +#define SilKit_Parameter_ReistryUri ((SilKit_Parameter)2) + +SILKIT_END_DECLS + +#pragma pack(pop) diff --git a/SilKit/include/silkit/capi/Participant.h b/SilKit/include/silkit/capi/Participant.h index 31283c542..2f5c4524f 100644 --- a/SilKit/include/silkit/capi/Participant.h +++ b/SilKit/include/silkit/capi/Participant.h @@ -8,6 +8,7 @@ #include "silkit/capi/SilKitMacros.h" #include "silkit/capi/Types.h" #include "silkit/capi/Logger.h" +#include "silkit/capi/Parameters.h" #pragma pack(push) #pragma pack(8) @@ -63,6 +64,37 @@ SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetLogger(SilKit_Logge typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetLogger_t)(SilKit_Logger** outLogger, SilKit_Participant* participant); + +/*! \brief Retrieve the participant name from a participant. + * + * \param outParameterValue A buffer to copy the null-terminated participant name to. + * Passing a nullptr is valid and indicates a size-check via inOutParameterValueSize. + * \param inOutParameterValueSize The required/provided size of the value including null-termination. + * \param participant The participant to query. + */ +SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant); + +typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParticipantName_t)(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant); + +/*! \brief Retrieve the registry URI from a participant. + * + * \param outParameterValue A buffer to copy the null-terminated registry URI to. + * Passing a nullptr is valid and indicates a size-check via inOutParameterValueSize. + * \param inOutParameterValueSize The required/provided size of the value including null-termination. + * \param participant The participant to query. + */ +SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant); + +typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetGetRegistryUri_t)(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant); + SILKIT_END_DECLS #pragma pack(pop) diff --git a/SilKit/include/silkit/capi/SilKit.h b/SilKit/include/silkit/capi/SilKit.h index cfafcfb34..2ef3fa638 100644 --- a/SilKit/include/silkit/capi/SilKit.h +++ b/SilKit/include/silkit/capi/SilKit.h @@ -20,6 +20,7 @@ #include "silkit/capi/Version.h" #include "silkit/capi/NetworkSimulator.h" #include "silkit/capi/EventProducer.h" +#include "silkit/capi/Parameters.h" SILKIT_BEGIN_DECLS diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp new file mode 100644 index 000000000..0da5e707b --- /dev/null +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include +#include "silkit/capi/Parameters.h" +#include "silkit/participant/exception.hpp" + +namespace SilKit { +DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN +namespace Impl { + +class ParameterProvider +{ +public: + inline ParameterProvider(); + + inline ~ParameterProvider() = default; + + inline auto GetStringParameter(SilKit_Participant* participant, Parameter parameter) -> std::string; + +private: + using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(void*, size_t*, SilKit_Participant*); + inline auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string; + +}; + +} // namespace Impl +DETAIL_SILKIT_DETAIL_VN_NAMESPACE_CLOSE +} // namespace SilKit + + +// ================================================================================ +// Inline Implementations +// ================================================================================ + +#include "silkit/detail/impl/ThrowOnError.hpp" + +namespace SilKit { +DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN +namespace Impl { + +ParameterProvider::ParameterProvider() +{ +} + +auto ParameterProvider::QueryString(SilKit_Participant* participant, + StringQueryFunction stringQueryFunction) -> std::string +{ + std::vector buffer; + size_t size = 0; + + { + const auto returnCode = stringQueryFunction(nullptr, &size, participant); + ThrowOnError(returnCode); + } + + while (size > buffer.size()) + { + buffer.resize(size); + const auto returnCode = stringQueryFunction(buffer.data(), &size, participant); + ThrowOnError(returnCode); + } + + return std::string{buffer.data()}; +} + +auto ParameterProvider::GetStringParameter(SilKit_Participant* participant, Parameter parameter) -> std::string +{ + switch (parameter) + { + case Parameter::ParticipantName: + return QueryString(participant, &SilKit_Participant_GetParticipantName); + case Parameter::RegistryUri: + return QueryString(participant, &SilKit_Participant_GetGetRegistryUri); + default: + throw SilKit::SilKitError("Unknown parameter."); + } +} + +} // namespace Impl +DETAIL_SILKIT_DETAIL_VN_NAMESPACE_CLOSE +} // namespace SilKit diff --git a/SilKit/include/silkit/detail/impl/participant/Participant.hpp b/SilKit/include/silkit/detail/impl/participant/Participant.hpp index a3ebada3c..5ff1845d6 100644 --- a/SilKit/include/silkit/detail/impl/participant/Participant.hpp +++ b/SilKit/include/silkit/detail/impl/participant/Participant.hpp @@ -36,6 +36,8 @@ #include "silkit/detail/impl/netsim/NetworkSimulator.hpp" +#include "silkit/detail/impl/participant/ParameterProvider.hpp" + namespace SilKit { DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN namespace Impl { @@ -83,6 +85,10 @@ class Participant : public SilKit::IParticipant inline auto GetLogger() -> SilKit::Services::Logging::ILogger* override; + inline auto GetParticipantName() const -> std::string override; + + inline auto GetRegistryUri() const -> std::string override; + inline auto ExperimentalCreateNetworkSimulator() -> SilKit::Experimental::NetworkSimulation::INetworkSimulator*; inline auto ExperimentalCreateSystemController() @@ -124,6 +130,8 @@ class Participant : public SilKit::IParticipant std::unique_ptr _logger; std::unique_ptr _networkSimulator; + + std::unique_ptr _parameterProvider; }; } // namespace Impl @@ -143,6 +151,7 @@ Participant::Participant(SilKit_Participant* participant) : _participant{participant} { _logger = std::make_unique(_participant); + _parameterProvider = std::make_unique(); } Participant::~Participant() @@ -224,6 +233,17 @@ auto Participant::GetLogger() -> SilKit::Services::Logging::ILogger* return _logger.get(); } + +auto Participant::GetParticipantName() const -> std::string +{ + return _parameterProvider->GetStringParameter(_participant, SilKit::Parameter::ParticipantName); +} + +auto Participant::GetRegistryUri() const -> std::string +{ + return _parameterProvider->GetStringParameter(_participant, SilKit::Parameter::RegistryUri); +} + auto Participant::ExperimentalCreateSystemController() -> SilKit::Experimental::Services::Orchestration::ISystemController* { diff --git a/SilKit/include/silkit/participant/IParticipant.hpp b/SilKit/include/silkit/participant/IParticipant.hpp index c1e9516c7..4086b06c0 100644 --- a/SilKit/include/silkit/participant/IParticipant.hpp +++ b/SilKit/include/silkit/participant/IParticipant.hpp @@ -18,6 +18,8 @@ #include "silkit/services/rpc/RpcSpec.hpp" #include "silkit/services/rpc/RpcDatatypes.hpp" +#include "silkit/participant/parameters.hpp" + namespace SilKit { /*! \brief Communication interface to be used by SIL Kit participants @@ -82,6 +84,10 @@ class IParticipant //! \brief Return the ILogger at this SIL Kit participant. virtual auto GetLogger() -> Services::Logging::ILogger* = 0; + + virtual auto GetParticipantName() const -> std::string = 0; + + virtual auto GetRegistryUri() const -> std::string = 0; }; } // namespace SilKit diff --git a/SilKit/include/silkit/participant/parameters.hpp b/SilKit/include/silkit/participant/parameters.hpp new file mode 100644 index 000000000..e440c366c --- /dev/null +++ b/SilKit/include/silkit/participant/parameters.hpp @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "silkit/capi/Parameters.h" + +namespace SilKit { + +// note: never reuse old numbers! +//! \brief Available parameters to query +enum class Parameter : SilKit_Parameter +{ + //! An undefined parameter + Undefined = SilKit_Parameter_Undefined, + //! The name of the participant + ParticipantName = SilKit_Parameter_ParticipantName, + //! The registry URI + RegistryUri = SilKit_Parameter_ReistryUri, +}; + +} // namespace SilKit diff --git a/SilKit/source/capi/CMakeLists.txt b/SilKit/source/capi/CMakeLists.txt index 59e74758d..055d45a96 100644 --- a/SilKit/source/capi/CMakeLists.txt +++ b/SilKit/source/capi/CMakeLists.txt @@ -41,3 +41,5 @@ add_silkit_test_to_executable(SilKitUnitTests SOURCES Test_CapiLin.cpp LIBS S_Si add_silkit_test_to_executable(SilKitUnitTests SOURCES Test_CapiSymbols.cpp LIBS S_SilKitImpl) add_silkit_test_to_executable(SilKitUnitTests SOURCES Test_CapiNetSim.cpp LIBS S_SilKitImpl I_SilKit) add_silkit_test_to_executable(SilKitUnitTests SOURCES Test_CapiExceptions.cpp LIBS S_SilKitImpl) +add_silkit_test_to_executable(SilKitUnitTests SOURCES Test_CapiGetParameter.cpp LIBS S_SilKitImpl) + diff --git a/SilKit/source/capi/CapiParticipant.cpp b/SilKit/source/capi/CapiParticipant.cpp index 326e61117..d21187a5e 100644 --- a/SilKit/source/capi/CapiParticipant.cpp +++ b/SilKit/source/capi/CapiParticipant.cpp @@ -11,15 +11,39 @@ #include "silkit/SilKit.hpp" #include "silkit/services/logging/ILogger.hpp" #include "silkit/services/orchestration/all.hpp" +#include "silkit/participant/parameters.hpp" #include "CapiImpl.hpp" #include "TypeConversion.hpp" +#include #include #include #include #include +namespace +{ +auto CopyStringToOutBuffer(const std::string& value, void* outParameterValue, size_t* inOutParameterValueSize) + -> SilKit_ReturnCode +{ + const auto requiredSize = value.size() + 1; // include '\0' + + if (outParameterValue != nullptr) + { + const auto bufferSize = *inOutParameterValueSize; + if (bufferSize > 0) + { + const auto sizeToCopy = std::min(value.size(), bufferSize - 1); + value.copy(static_cast(outParameterValue), sizeToCopy); + static_cast(outParameterValue)[sizeToCopy] = '\0'; + } + } + + *inOutParameterValueSize = requiredSize; + return SilKit_ReturnCode_SUCCESS; +} +} // namespace SilKit_ReturnCode SilKitCALL SilKit_Participant_Create(SilKit_Participant** outParticipant, SilKit_ParticipantConfiguration* participantConfiguration, @@ -86,6 +110,32 @@ try } CAPI_CATCH_EXCEPTIONS +SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant) +try +{ + ASSERT_VALID_OUT_PARAMETER(inOutParameterValueSize); + ASSERT_VALID_POINTER_PARAMETER(participant); + + auto cppParticipant = reinterpret_cast(participant); + return CopyStringToOutBuffer(cppParticipant->GetParticipantName(), outParameterValue, inOutParameterValueSize); +} +CAPI_CATCH_EXCEPTIONS + +SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue, + size_t* inOutParameterValueSize, + SilKit_Participant* participant) +try +{ + ASSERT_VALID_OUT_PARAMETER(inOutParameterValueSize); + ASSERT_VALID_POINTER_PARAMETER(participant); + + auto cppParticipant = reinterpret_cast(participant); + return CopyStringToOutBuffer(cppParticipant->GetRegistryUri(), outParameterValue, inOutParameterValueSize); +} +CAPI_CATCH_EXCEPTIONS + SilKit_ReturnCode SilKitCALL SilKit_ParticipantConfiguration_FromString( SilKit_ParticipantConfiguration** outParticipantConfiguration, const char* participantConfigurationString) diff --git a/SilKit/source/capi/Test_CapiGetParameter.cpp b/SilKit/source/capi/Test_CapiGetParameter.cpp new file mode 100644 index 000000000..cc435364f --- /dev/null +++ b/SilKit/source/capi/Test_CapiGetParameter.cpp @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH +// +// SPDX-License-Identifier: MIT + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "silkit/capi/SilKit.h" + +#include "MockParticipant.hpp" + +namespace { + +using SilKit::Core::Tests::DummyParticipant; + +class MockParticipant : public SilKit::Core::Tests::DummyParticipant{}; + +class Test_CapiGetParameter : public testing::Test +{ +public: + MockParticipant mockParticipant; + Test_CapiGetParameter() {} +}; + +TEST_F(Test_CapiGetParameter, getparticipantname_bad_params) +{ + SilKit_ReturnCode returnCode; + auto cMockParticipant = (SilKit_Participant*)&mockParticipant; + char* parameterValue{nullptr}; + size_t parameterSize; + + returnCode = SilKit_Participant_GetParticipantName(nullptr, ¶meterSize, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + + returnCode = SilKit_Participant_GetParticipantName(parameterValue, nullptr, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_BADPARAMETER); + + returnCode = SilKit_Participant_GetParticipantName(parameterValue, ¶meterSize, nullptr); + EXPECT_EQ(returnCode, SilKit_ReturnCode_BADPARAMETER); +} + +TEST_F(Test_CapiGetParameter, getregistryuri_bad_params) +{ + SilKit_ReturnCode returnCode; + auto cMockParticipant = (SilKit_Participant*)&mockParticipant; + char* parameterValue{nullptr}; + size_t parameterSize; + + returnCode = SilKit_Participant_GetGetRegistryUri(nullptr, ¶meterSize, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + + returnCode = SilKit_Participant_GetGetRegistryUri(parameterValue, nullptr, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_BADPARAMETER); + + returnCode = SilKit_Participant_GetGetRegistryUri(parameterValue, ¶meterSize, nullptr); + EXPECT_EQ(returnCode, SilKit_ReturnCode_BADPARAMETER); +} + +TEST_F(Test_CapiGetParameter, getparticipantname_returns_required_size_and_null_terminated_value) +{ + auto cMockParticipant = (SilKit_Participant*)&mockParticipant; + const std::string value{"MockParticipant"}; + + size_t parameterSize{0}; + auto returnCode = SilKit_Participant_GetParticipantName(nullptr, ¶meterSize, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + EXPECT_EQ(parameterSize, value.size() + 1); + + char buffer[32]{}; + auto bufferSize = sizeof(buffer); + returnCode = SilKit_Participant_GetParticipantName(buffer, &bufferSize, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + EXPECT_EQ(bufferSize, value.size() + 1); + EXPECT_STREQ(buffer, value.c_str()); +} + +TEST_F(Test_CapiGetParameter, getregistryuri_returns_required_size_and_null_terminated_value) +{ + auto cMockParticipant = (SilKit_Participant*)&mockParticipant; + const std::string value{"silkit://mock.participant.silkit:0"}; + + size_t parameterSize{0}; + auto returnCode = SilKit_Participant_GetGetRegistryUri(nullptr, ¶meterSize, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + EXPECT_EQ(parameterSize, value.size() + 1); + + char buffer[64]{}; + auto bufferSize = sizeof(buffer); + returnCode = SilKit_Participant_GetGetRegistryUri(buffer, &bufferSize, cMockParticipant); + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + EXPECT_EQ(bufferSize, value.size() + 1); + EXPECT_STREQ(buffer, value.c_str()); +} + +TEST_F(Test_CapiGetParameter, getparticipantname_truncates_and_still_null_terminates) +{ + auto cMockParticipant = (SilKit_Participant*)&mockParticipant; + + char buffer[5]{}; + size_t bufferSize = sizeof(buffer); + const auto returnCode = SilKit_Participant_GetParticipantName(buffer, &bufferSize, cMockParticipant); + + EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); + EXPECT_EQ(buffer[sizeof(buffer) - 1], '\0'); +} + +} // namespace diff --git a/SilKit/source/core/internal/IParticipantInternal.hpp b/SilKit/source/core/internal/IParticipantInternal.hpp index 3da426d3d..352b41707 100644 --- a/SilKit/source/core/internal/IParticipantInternal.hpp +++ b/SilKit/source/core/internal/IParticipantInternal.hpp @@ -51,15 +51,15 @@ class IParticipantInternal : public IParticipant public: // ---------------------------------------- // Public methods - virtual auto GetParticipantName() const -> const std::string& = 0; + virtual auto GetParticipantName() const -> std::string = 0; /*! \brief Returns the URI of the registry this participant is connecting to. * - * The URI must be specified in the configuration (which has priority) or the CreateParticipant call. * * @return the URI of the registry + * The URI must be specified in the configuration (which has priority) or the CreateParticipant call. */ - virtual auto GetRegistryUri() const -> const std::string& = 0; + virtual auto GetRegistryUri() const -> std::string = 0; /*! \brief Connect to the registry and join the simulation. * diff --git a/SilKit/source/core/mock/participant/MockParticipant.hpp b/SilKit/source/core/mock/participant/MockParticipant.hpp index 611a852e0..bd9d5b802 100644 --- a/SilKit/source/core/mock/participant/MockParticipant.hpp +++ b/SilKit/source/core/mock/participant/MockParticipant.hpp @@ -349,6 +349,15 @@ class DummyParticipant : public IParticipantInternal return &logger; } + auto GetParticipantName() const -> std::string override + { + return _name; + } + auto GetRegistryUri() const -> std::string override + { + return _registryUri; + } + void RegisterSimulator(Core::ISimulator*, std::string, Experimental::NetworkSimulation::SimulatedNetworkType) override { @@ -621,15 +630,6 @@ class DummyParticipant : public IParticipantInternal callback(); } - auto GetParticipantName() const -> const std::string& override - { - return _name; - } - auto GetRegistryUri() const -> const std::string& override - { - return _registryUri; - } - virtual auto GetTimeProvider() -> Services::Orchestration::ITimeProvider* { return &mockTimeProvider; diff --git a/SilKit/source/core/participant/Participant.hpp b/SilKit/source/core/participant/Participant.hpp index 8f864b597..997efb514 100644 --- a/SilKit/source/core/participant/Participant.hpp +++ b/SilKit/source/core/participant/Participant.hpp @@ -15,6 +15,7 @@ #include "silkit/services/all.hpp" #include "silkit/services/logging/ILogger.hpp" +#include "silkit/participant/parameters.hpp" #include "ParticipantConfiguration.hpp" #include "ReplayScheduler.hpp" @@ -149,6 +150,7 @@ class Participant final : public IParticipantInternal auto GetMetricsManager() -> IMetricsManager* override; auto GetLogger() -> Services::Logging::ILogger* override; + auto CreateLifecycleService(Services::Orchestration::LifecycleConfiguration startConfiguration) -> Services::Orchestration::ILifecycleService* override; auto GetLifecycleService() -> Services::Orchestration::ILifecycleService* override; @@ -157,11 +159,11 @@ class Participant final : public IParticipantInternal auto CreateNetworkSimulator() -> Experimental::NetworkSimulation::INetworkSimulator* override; - auto GetParticipantName() const -> const std::string& override + auto GetParticipantName() const -> std::string override { return _participantConfig.participantName; } - auto GetRegistryUri() const -> const std::string& override + auto GetRegistryUri() const -> std::string override { return _participantConfig.middleware.registryUri; } diff --git a/SilKit/source/core/participant/Participant_impl.hpp b/SilKit/source/core/participant/Participant_impl.hpp index 0010dcc57..facfb4c09 100644 --- a/SilKit/source/core/participant/Participant_impl.hpp +++ b/SilKit/source/core/participant/Participant_impl.hpp @@ -1046,6 +1046,7 @@ auto Participant::GetLoggerInternal() -> Services::Logging::I return _logger.get(); } + template void Participant::SendMsg(const IServiceEndpoint* from, const Can::WireCanFrameEvent& msg) { From 7cbc023297f36b027f039aaecbf7a980b13c6d57 Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Fri, 19 Jun 2026 15:19:25 +0200 Subject: [PATCH 2/9] Removed unused parameter enum and c definitions Signed-off-by: Konrad Breitsprecher --- SilKit/include/silkit/capi/Parameters.h | 29 ------------------- SilKit/include/silkit/capi/Participant.h | 1 - SilKit/include/silkit/capi/SilKit.h | 1 - .../impl/participant/ParameterProvider.hpp | 23 +++++++-------- .../detail/impl/participant/Participant.hpp | 4 +-- .../silkit/participant/IParticipant.hpp | 3 +- .../include/silkit/participant/parameters.hpp | 23 --------------- SilKit/source/capi/CapiParticipant.cpp | 1 - .../source/core/participant/Participant.hpp | 1 - 9 files changed, 14 insertions(+), 72 deletions(-) delete mode 100644 SilKit/include/silkit/capi/Parameters.h delete mode 100644 SilKit/include/silkit/participant/parameters.hpp diff --git a/SilKit/include/silkit/capi/Parameters.h b/SilKit/include/silkit/capi/Parameters.h deleted file mode 100644 index 06063b504..000000000 --- a/SilKit/include/silkit/capi/Parameters.h +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH -// -// SPDX-License-Identifier: MIT - -#pragma once -#include -#include "SilKitMacros.h" - -#pragma pack(push) -#pragma pack(8) - -SILKIT_BEGIN_DECLS - -/*! Internal parameter provider. */ -typedef struct SilKit_ParamterProvider SilKit_ParamterProvider; - -/*! A parameter set by an API call and/or the participant configuration. */ -typedef int16_t SilKit_Parameter; - -/*! An undefined parameter */ -#define SilKit_Parameter_Undefined ((SilKit_Parameter)0) -/*! The name of the participant */ -#define SilKit_Parameter_ParticipantName ((SilKit_Parameter)1) -/*! The registry URI */ -#define SilKit_Parameter_ReistryUri ((SilKit_Parameter)2) - -SILKIT_END_DECLS - -#pragma pack(pop) diff --git a/SilKit/include/silkit/capi/Participant.h b/SilKit/include/silkit/capi/Participant.h index 2f5c4524f..04f05917a 100644 --- a/SilKit/include/silkit/capi/Participant.h +++ b/SilKit/include/silkit/capi/Participant.h @@ -8,7 +8,6 @@ #include "silkit/capi/SilKitMacros.h" #include "silkit/capi/Types.h" #include "silkit/capi/Logger.h" -#include "silkit/capi/Parameters.h" #pragma pack(push) #pragma pack(8) diff --git a/SilKit/include/silkit/capi/SilKit.h b/SilKit/include/silkit/capi/SilKit.h index 2ef3fa638..cfafcfb34 100644 --- a/SilKit/include/silkit/capi/SilKit.h +++ b/SilKit/include/silkit/capi/SilKit.h @@ -20,7 +20,6 @@ #include "silkit/capi/Version.h" #include "silkit/capi/NetworkSimulator.h" #include "silkit/capi/EventProducer.h" -#include "silkit/capi/Parameters.h" SILKIT_BEGIN_DECLS diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index 0da5e707b..44330bb0d 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -6,7 +6,6 @@ #include #include -#include "silkit/capi/Parameters.h" #include "silkit/participant/exception.hpp" namespace SilKit { @@ -20,9 +19,10 @@ class ParameterProvider inline ~ParameterProvider() = default; - inline auto GetStringParameter(SilKit_Participant* participant, Parameter parameter) -> std::string; + inline auto GetParticipantName(SilKit_Participant* participant) -> std::string; + inline auto GetRegistryUri(SilKit_Participant* participant) -> std::string; -private: + private: using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(void*, size_t*, SilKit_Participant*); inline auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string; @@ -68,17 +68,14 @@ auto ParameterProvider::QueryString(SilKit_Participant* participant, return std::string{buffer.data()}; } -auto ParameterProvider::GetStringParameter(SilKit_Participant* participant, Parameter parameter) -> std::string +auto ParameterProvider::GetParticipantName(SilKit_Participant* participant) -> std::string { - switch (parameter) - { - case Parameter::ParticipantName: - return QueryString(participant, &SilKit_Participant_GetParticipantName); - case Parameter::RegistryUri: - return QueryString(participant, &SilKit_Participant_GetGetRegistryUri); - default: - throw SilKit::SilKitError("Unknown parameter."); - } + return QueryString(participant, &SilKit_Participant_GetParticipantName); +} + +auto ParameterProvider::GetRegistryUri(SilKit_Participant* participant) -> std::string +{ + return QueryString(participant, &SilKit_Participant_GetGetRegistryUri); } } // namespace Impl diff --git a/SilKit/include/silkit/detail/impl/participant/Participant.hpp b/SilKit/include/silkit/detail/impl/participant/Participant.hpp index 5ff1845d6..ce7f0568c 100644 --- a/SilKit/include/silkit/detail/impl/participant/Participant.hpp +++ b/SilKit/include/silkit/detail/impl/participant/Participant.hpp @@ -236,12 +236,12 @@ auto Participant::GetLogger() -> SilKit::Services::Logging::ILogger* auto Participant::GetParticipantName() const -> std::string { - return _parameterProvider->GetStringParameter(_participant, SilKit::Parameter::ParticipantName); + return _parameterProvider->GetParticipantName(_participant); } auto Participant::GetRegistryUri() const -> std::string { - return _parameterProvider->GetStringParameter(_participant, SilKit::Parameter::RegistryUri); + return _parameterProvider->GetRegistryUri(_participant); } auto Participant::ExperimentalCreateSystemController() diff --git a/SilKit/include/silkit/participant/IParticipant.hpp b/SilKit/include/silkit/participant/IParticipant.hpp index 4086b06c0..9104e4bed 100644 --- a/SilKit/include/silkit/participant/IParticipant.hpp +++ b/SilKit/include/silkit/participant/IParticipant.hpp @@ -18,7 +18,6 @@ #include "silkit/services/rpc/RpcSpec.hpp" #include "silkit/services/rpc/RpcDatatypes.hpp" -#include "silkit/participant/parameters.hpp" namespace SilKit { @@ -85,8 +84,10 @@ class IParticipant //! \brief Return the ILogger at this SIL Kit participant. virtual auto GetLogger() -> Services::Logging::ILogger* = 0; + //! \brief Return the participant name of this SIL Kit participant. virtual auto GetParticipantName() const -> std::string = 0; + //! \brief Return the URI of the registry this SIL Kit participant connects to. virtual auto GetRegistryUri() const -> std::string = 0; }; diff --git a/SilKit/include/silkit/participant/parameters.hpp b/SilKit/include/silkit/participant/parameters.hpp deleted file mode 100644 index e440c366c..000000000 --- a/SilKit/include/silkit/participant/parameters.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH -// -// SPDX-License-Identifier: MIT - -#pragma once - -#include "silkit/capi/Parameters.h" - -namespace SilKit { - -// note: never reuse old numbers! -//! \brief Available parameters to query -enum class Parameter : SilKit_Parameter -{ - //! An undefined parameter - Undefined = SilKit_Parameter_Undefined, - //! The name of the participant - ParticipantName = SilKit_Parameter_ParticipantName, - //! The registry URI - RegistryUri = SilKit_Parameter_ReistryUri, -}; - -} // namespace SilKit diff --git a/SilKit/source/capi/CapiParticipant.cpp b/SilKit/source/capi/CapiParticipant.cpp index d21187a5e..ca9917deb 100644 --- a/SilKit/source/capi/CapiParticipant.cpp +++ b/SilKit/source/capi/CapiParticipant.cpp @@ -11,7 +11,6 @@ #include "silkit/SilKit.hpp" #include "silkit/services/logging/ILogger.hpp" #include "silkit/services/orchestration/all.hpp" -#include "silkit/participant/parameters.hpp" #include "CapiImpl.hpp" #include "TypeConversion.hpp" diff --git a/SilKit/source/core/participant/Participant.hpp b/SilKit/source/core/participant/Participant.hpp index 997efb514..75118627a 100644 --- a/SilKit/source/core/participant/Participant.hpp +++ b/SilKit/source/core/participant/Participant.hpp @@ -15,7 +15,6 @@ #include "silkit/services/all.hpp" #include "silkit/services/logging/ILogger.hpp" -#include "silkit/participant/parameters.hpp" #include "ParticipantConfiguration.hpp" #include "ReplayScheduler.hpp" From b45566b791f798fc2517b6be4be8d2c10eecbe6b Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Fri, 19 Jun 2026 15:30:51 +0200 Subject: [PATCH 3/9] Added code comments Signed-off-by: Konrad Breitsprecher --- .../silkit/detail/impl/participant/ParameterProvider.hpp | 2 ++ SilKit/source/capi/CapiParticipant.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index 44330bb0d..d0a8421ce 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -60,6 +60,8 @@ auto ParameterProvider::QueryString(SilKit_Participant* participant, while (size > buffer.size()) { + // Retry until the returned required size fits our buffer: + // the value may change between the initial size query and the copy call. buffer.resize(size); const auto returnCode = stringQueryFunction(buffer.data(), &size, participant); ThrowOnError(returnCode); diff --git a/SilKit/source/capi/CapiParticipant.cpp b/SilKit/source/capi/CapiParticipant.cpp index ca9917deb..b86f5298d 100644 --- a/SilKit/source/capi/CapiParticipant.cpp +++ b/SilKit/source/capi/CapiParticipant.cpp @@ -26,6 +26,7 @@ namespace auto CopyStringToOutBuffer(const std::string& value, void* outParameterValue, size_t* inOutParameterValueSize) -> SilKit_ReturnCode { + // Passing outParameterValue == nullptr performs a size-check only. const auto requiredSize = value.size() + 1; // include '\0' if (outParameterValue != nullptr) From 265bcf675c8b052fef907b6e4625d53a4dc80162 Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Fri, 19 Jun 2026 15:31:10 +0200 Subject: [PATCH 4/9] Added code comments Signed-off-by: Konrad Breitsprecher --- .../include/silkit/detail/impl/participant/ParameterProvider.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index d0a8421ce..98b28d21e 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -54,6 +54,7 @@ auto ParameterProvider::QueryString(SilKit_Participant* participant, size_t size = 0; { + //Initially only get the size of the string to be queried const auto returnCode = stringQueryFunction(nullptr, &size, participant); ThrowOnError(returnCode); } From 38f9e2b7b31dbf2051bcbdd08cf04300c600cbab Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Fri, 19 Jun 2026 15:50:26 +0200 Subject: [PATCH 5/9] Fix GetGet typo Signed-off-by: Konrad Breitsprecher --- SilKit/IntegrationTests/Hourglass/MockCapi.cpp | 4 ++-- SilKit/IntegrationTests/Hourglass/MockCapi.hpp | 2 +- SilKit/include/silkit/capi/Participant.h | 4 ++-- .../detail/impl/participant/ParameterProvider.hpp | 2 +- SilKit/source/capi/CapiParticipant.cpp | 2 +- SilKit/source/capi/Test_CapiGetParameter.cpp | 10 +++++----- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SilKit/IntegrationTests/Hourglass/MockCapi.cpp b/SilKit/IntegrationTests/Hourglass/MockCapi.cpp index 06c9f7300..50cce8b45 100644 --- a/SilKit/IntegrationTests/Hourglass/MockCapi.cpp +++ b/SilKit/IntegrationTests/Hourglass/MockCapi.cpp @@ -777,11 +777,11 @@ extern "C" participant); } - SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue, + SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(void* outParameterValue, size_t* inOutParameterValueSize, SilKit_Participant* participant) { - return globalCapi->SilKit_Participant_GetGetRegistryUri(outParameterValue, inOutParameterValueSize, + return globalCapi->SilKit_Participant_GetRegistryUri(outParameterValue, inOutParameterValueSize, participant); } diff --git a/SilKit/IntegrationTests/Hourglass/MockCapi.hpp b/SilKit/IntegrationTests/Hourglass/MockCapi.hpp index 79b7d9256..5e8c938af 100644 --- a/SilKit/IntegrationTests/Hourglass/MockCapi.hpp +++ b/SilKit/IntegrationTests/Hourglass/MockCapi.hpp @@ -410,7 +410,7 @@ class MockCapi MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetParticipantName, (void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant)); - MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetGetRegistryUri, + MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetRegistryUri, (void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant)); // ParticipantConfiguration diff --git a/SilKit/include/silkit/capi/Participant.h b/SilKit/include/silkit/capi/Participant.h index 04f05917a..3313d3a85 100644 --- a/SilKit/include/silkit/capi/Participant.h +++ b/SilKit/include/silkit/capi/Participant.h @@ -86,11 +86,11 @@ typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParticipantName_t)(v * \param inOutParameterValueSize The required/provided size of the value including null-termination. * \param participant The participant to query. */ -SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue, +SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(void* outParameterValue, size_t* inOutParameterValueSize, SilKit_Participant* participant); -typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetGetRegistryUri_t)(void* outParameterValue, +typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetRegistryUri_t)(void* outParameterValue, size_t* inOutParameterValueSize, SilKit_Participant* participant); diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index 98b28d21e..2ad90a5eb 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -78,7 +78,7 @@ auto ParameterProvider::GetParticipantName(SilKit_Participant* participant) -> s auto ParameterProvider::GetRegistryUri(SilKit_Participant* participant) -> std::string { - return QueryString(participant, &SilKit_Participant_GetGetRegistryUri); + return QueryString(participant, &SilKit_Participant_GetRegistryUri); } } // namespace Impl diff --git a/SilKit/source/capi/CapiParticipant.cpp b/SilKit/source/capi/CapiParticipant.cpp index b86f5298d..4df25b134 100644 --- a/SilKit/source/capi/CapiParticipant.cpp +++ b/SilKit/source/capi/CapiParticipant.cpp @@ -123,7 +123,7 @@ try } CAPI_CATCH_EXCEPTIONS -SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue, +SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(void* outParameterValue, size_t* inOutParameterValueSize, SilKit_Participant* participant) try diff --git a/SilKit/source/capi/Test_CapiGetParameter.cpp b/SilKit/source/capi/Test_CapiGetParameter.cpp index cc435364f..d4dae3a44 100644 --- a/SilKit/source/capi/Test_CapiGetParameter.cpp +++ b/SilKit/source/capi/Test_CapiGetParameter.cpp @@ -45,13 +45,13 @@ TEST_F(Test_CapiGetParameter, getregistryuri_bad_params) char* parameterValue{nullptr}; size_t parameterSize; - returnCode = SilKit_Participant_GetGetRegistryUri(nullptr, ¶meterSize, cMockParticipant); + returnCode = SilKit_Participant_GetRegistryUri(nullptr, ¶meterSize, cMockParticipant); EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); - returnCode = SilKit_Participant_GetGetRegistryUri(parameterValue, nullptr, cMockParticipant); + returnCode = SilKit_Participant_GetRegistryUri(parameterValue, nullptr, cMockParticipant); EXPECT_EQ(returnCode, SilKit_ReturnCode_BADPARAMETER); - returnCode = SilKit_Participant_GetGetRegistryUri(parameterValue, ¶meterSize, nullptr); + returnCode = SilKit_Participant_GetRegistryUri(parameterValue, ¶meterSize, nullptr); EXPECT_EQ(returnCode, SilKit_ReturnCode_BADPARAMETER); } @@ -79,13 +79,13 @@ TEST_F(Test_CapiGetParameter, getregistryuri_returns_required_size_and_null_term const std::string value{"silkit://mock.participant.silkit:0"}; size_t parameterSize{0}; - auto returnCode = SilKit_Participant_GetGetRegistryUri(nullptr, ¶meterSize, cMockParticipant); + auto returnCode = SilKit_Participant_GetRegistryUri(nullptr, ¶meterSize, cMockParticipant); EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); EXPECT_EQ(parameterSize, value.size() + 1); char buffer[64]{}; auto bufferSize = sizeof(buffer); - returnCode = SilKit_Participant_GetGetRegistryUri(buffer, &bufferSize, cMockParticipant); + returnCode = SilKit_Participant_GetRegistryUri(buffer, &bufferSize, cMockParticipant); EXPECT_EQ(returnCode, SilKit_ReturnCode_SUCCESS); EXPECT_EQ(bufferSize, value.size() + 1); EXPECT_STREQ(buffer, value.c_str()); From 8081fc52fb975ab19d03fb6ffe3333f574beddd1 Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Mon, 22 Jun 2026 09:44:37 +0200 Subject: [PATCH 6/9] Get rid of ParameterProvider class Signed-off-by: Konrad Breitsprecher --- .../impl/participant/ParameterProvider.hpp | 32 ++++++------------- .../detail/impl/participant/Participant.hpp | 7 ++-- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index 2ad90a5eb..65823d2e5 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -6,27 +6,18 @@ #include #include + #include "silkit/participant/exception.hpp" namespace SilKit { DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN namespace Impl { -class ParameterProvider -{ -public: - inline ParameterProvider(); - - inline ~ParameterProvider() = default; - - inline auto GetParticipantName(SilKit_Participant* participant) -> std::string; - inline auto GetRegistryUri(SilKit_Participant* participant) -> std::string; +using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(void*, size_t*, SilKit_Participant*); +inline auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string; - private: - using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(void*, size_t*, SilKit_Participant*); - inline auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string; - -}; +inline auto GetParticipantName(SilKit_Participant* participant) -> std::string; +inline auto GetRegistryUri(SilKit_Participant* participant) -> std::string; } // namespace Impl DETAIL_SILKIT_DETAIL_VN_NAMESPACE_CLOSE @@ -43,18 +34,13 @@ namespace SilKit { DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN namespace Impl { -ParameterProvider::ParameterProvider() -{ -} - -auto ParameterProvider::QueryString(SilKit_Participant* participant, - StringQueryFunction stringQueryFunction) -> std::string +auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string { std::vector buffer; size_t size = 0; { - //Initially only get the size of the string to be queried + // Initially only get the size of the string to be queried const auto returnCode = stringQueryFunction(nullptr, &size, participant); ThrowOnError(returnCode); } @@ -71,12 +57,12 @@ auto ParameterProvider::QueryString(SilKit_Participant* participant, return std::string{buffer.data()}; } -auto ParameterProvider::GetParticipantName(SilKit_Participant* participant) -> std::string +auto GetParticipantName(SilKit_Participant* participant) -> std::string { return QueryString(participant, &SilKit_Participant_GetParticipantName); } -auto ParameterProvider::GetRegistryUri(SilKit_Participant* participant) -> std::string +auto GetRegistryUri(SilKit_Participant* participant) -> std::string { return QueryString(participant, &SilKit_Participant_GetRegistryUri); } diff --git a/SilKit/include/silkit/detail/impl/participant/Participant.hpp b/SilKit/include/silkit/detail/impl/participant/Participant.hpp index ce7f0568c..3022b1cc8 100644 --- a/SilKit/include/silkit/detail/impl/participant/Participant.hpp +++ b/SilKit/include/silkit/detail/impl/participant/Participant.hpp @@ -130,8 +130,6 @@ class Participant : public SilKit::IParticipant std::unique_ptr _logger; std::unique_ptr _networkSimulator; - - std::unique_ptr _parameterProvider; }; } // namespace Impl @@ -151,7 +149,6 @@ Participant::Participant(SilKit_Participant* participant) : _participant{participant} { _logger = std::make_unique(_participant); - _parameterProvider = std::make_unique(); } Participant::~Participant() @@ -236,12 +233,12 @@ auto Participant::GetLogger() -> SilKit::Services::Logging::ILogger* auto Participant::GetParticipantName() const -> std::string { - return _parameterProvider->GetParticipantName(_participant); + return Impl::GetParticipantName(_participant); } auto Participant::GetRegistryUri() const -> std::string { - return _parameterProvider->GetRegistryUri(_participant); + return Impl::GetRegistryUri(_participant); } auto Participant::ExperimentalCreateSystemController() From 53b1d2cfd331a2d41d6668426f210d940dfa26cb Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Mon, 22 Jun 2026 09:49:55 +0200 Subject: [PATCH 7/9] Change signature of GetParameter CAPI to char* Signed-off-by: Konrad Breitsprecher --- .../IntegrationTests/Hourglass/MockCapi.cpp | 15 ++++----- .../IntegrationTests/Hourglass/MockCapi.hpp | 4 +-- SilKit/include/silkit/capi/Participant.h | 32 +++++++++---------- .../impl/participant/ParameterProvider.hpp | 2 +- SilKit/source/capi/CapiParticipant.cpp | 32 +++++++++---------- 5 files changed, 42 insertions(+), 43 deletions(-) diff --git a/SilKit/IntegrationTests/Hourglass/MockCapi.cpp b/SilKit/IntegrationTests/Hourglass/MockCapi.cpp index 50cce8b45..7de7df300 100644 --- a/SilKit/IntegrationTests/Hourglass/MockCapi.cpp +++ b/SilKit/IntegrationTests/Hourglass/MockCapi.cpp @@ -769,20 +769,19 @@ extern "C" return globalCapi->SilKit_Participant_GetLogger(outLogger, participant); } - SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue, - size_t* inOutParameterValueSize, + SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(char* outParticipantName, + size_t* inOutParticipantNameSize, SilKit_Participant* participant) { - return globalCapi->SilKit_Participant_GetParticipantName(outParameterValue, inOutParameterValueSize, + return globalCapi->SilKit_Participant_GetParticipantName(outParticipantName, inOutParticipantNameSize, participant); } - SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(void* outParameterValue, - size_t* inOutParameterValueSize, - SilKit_Participant* participant) + SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(char* outRegistryUri, + size_t* inOutRegistryUriSize, + SilKit_Participant* participant) { - return globalCapi->SilKit_Participant_GetRegistryUri(outParameterValue, inOutParameterValueSize, - participant); + return globalCapi->SilKit_Participant_GetRegistryUri(outRegistryUri, inOutRegistryUriSize, participant); } // ParticipantConfiguration diff --git a/SilKit/IntegrationTests/Hourglass/MockCapi.hpp b/SilKit/IntegrationTests/Hourglass/MockCapi.hpp index 5e8c938af..b6c8e4ff8 100644 --- a/SilKit/IntegrationTests/Hourglass/MockCapi.hpp +++ b/SilKit/IntegrationTests/Hourglass/MockCapi.hpp @@ -408,10 +408,10 @@ class MockCapi (SilKit_Logger * *outLogger, SilKit_Participant* participant)); MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetParticipantName, - (void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant)); + (char* outParticipantName, size_t* inOutParticipantNameSize, SilKit_Participant* participant)); MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetRegistryUri, - (void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant)); + (char* outRegistryUri, size_t* inOutRegistryUriSize, SilKit_Participant* participant)); // ParticipantConfiguration diff --git a/SilKit/include/silkit/capi/Participant.h b/SilKit/include/silkit/capi/Participant.h index 3313d3a85..36dc39bb6 100644 --- a/SilKit/include/silkit/capi/Participant.h +++ b/SilKit/include/silkit/capi/Participant.h @@ -66,33 +66,33 @@ typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetLogger_t)(SilKit_Log /*! \brief Retrieve the participant name from a participant. * - * \param outParameterValue A buffer to copy the null-terminated participant name to. - * Passing a nullptr is valid and indicates a size-check via inOutParameterValueSize. - * \param inOutParameterValueSize The required/provided size of the value including null-termination. + * \param outParticipantName A buffer to copy the null-terminated participant name to. + * Passing a nullptr is valid and indicates a size-check via inOutParticipantNameSize. + * \param inOutParticipantNameSize The required/provided size of the value including null-termination. * \param participant The participant to query. */ -SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue, - size_t* inOutParameterValueSize, +SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(char* outParticipantName, + size_t* inOutParticipantNameSize, SilKit_Participant* participant); -typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParticipantName_t)(void* outParameterValue, - size_t* inOutParameterValueSize, +typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParticipantName_t)(char* outParticipantName, + size_t* inOutParticipantNameSize, SilKit_Participant* participant); /*! \brief Retrieve the registry URI from a participant. * - * \param outParameterValue A buffer to copy the null-terminated registry URI to. - * Passing a nullptr is valid and indicates a size-check via inOutParameterValueSize. - * \param inOutParameterValueSize The required/provided size of the value including null-termination. + * \param outRegistryUri A buffer to copy the null-terminated registry URI to. + * Passing a nullptr is valid and indicates a size-check via inOutRegistryUriSize. + * \param inOutRegistryUriSize The required/provided size of the value including null-termination. * \param participant The participant to query. */ -SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(void* outParameterValue, - size_t* inOutParameterValueSize, - SilKit_Participant* participant); +SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(char* outRegistryUri, + size_t* inOutRegistryUriSize, + SilKit_Participant* participant); -typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetRegistryUri_t)(void* outParameterValue, - size_t* inOutParameterValueSize, - SilKit_Participant* participant); +typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetRegistryUri_t)(char* outRegistryUri, + size_t* inOutRegistryUriSize, + SilKit_Participant* participant); SILKIT_END_DECLS diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index 65823d2e5..bef17f61b 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -13,7 +13,7 @@ namespace SilKit { DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN namespace Impl { -using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(void*, size_t*, SilKit_Participant*); +using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(char*, size_t*, SilKit_Participant*); inline auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string; inline auto GetParticipantName(SilKit_Participant* participant) -> std::string; diff --git a/SilKit/source/capi/CapiParticipant.cpp b/SilKit/source/capi/CapiParticipant.cpp index 4df25b134..239e7193d 100644 --- a/SilKit/source/capi/CapiParticipant.cpp +++ b/SilKit/source/capi/CapiParticipant.cpp @@ -23,24 +23,24 @@ namespace { -auto CopyStringToOutBuffer(const std::string& value, void* outParameterValue, size_t* inOutParameterValueSize) +auto CopyStringToOutBuffer(const std::string& value, char* outStringBuffer, size_t* inOutStringBufferSize) -> SilKit_ReturnCode { - // Passing outParameterValue == nullptr performs a size-check only. + // Passing outStringBuffer == nullptr performs a size-check only. const auto requiredSize = value.size() + 1; // include '\0' - if (outParameterValue != nullptr) + if (outStringBuffer != nullptr) { - const auto bufferSize = *inOutParameterValueSize; + const auto bufferSize = *inOutStringBufferSize; if (bufferSize > 0) { const auto sizeToCopy = std::min(value.size(), bufferSize - 1); - value.copy(static_cast(outParameterValue), sizeToCopy); - static_cast(outParameterValue)[sizeToCopy] = '\0'; + value.copy(outStringBuffer, sizeToCopy); + outStringBuffer[sizeToCopy] = '\0'; } } - *inOutParameterValueSize = requiredSize; + *inOutStringBufferSize = requiredSize; return SilKit_ReturnCode_SUCCESS; } } // namespace @@ -110,29 +110,29 @@ try } CAPI_CATCH_EXCEPTIONS -SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue, - size_t* inOutParameterValueSize, +SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(char* outParticipantName, + size_t* inOutParticipantNameSize, SilKit_Participant* participant) try { - ASSERT_VALID_OUT_PARAMETER(inOutParameterValueSize); + ASSERT_VALID_OUT_PARAMETER(inOutParticipantNameSize); ASSERT_VALID_POINTER_PARAMETER(participant); auto cppParticipant = reinterpret_cast(participant); - return CopyStringToOutBuffer(cppParticipant->GetParticipantName(), outParameterValue, inOutParameterValueSize); + return CopyStringToOutBuffer(cppParticipant->GetParticipantName(), outParticipantName, inOutParticipantNameSize); } CAPI_CATCH_EXCEPTIONS -SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(void* outParameterValue, - size_t* inOutParameterValueSize, - SilKit_Participant* participant) +SilKit_ReturnCode SilKitCALL SilKit_Participant_GetRegistryUri(char* outRegistryUri, + size_t* inOutRegistryUriSize, + SilKit_Participant* participant) try { - ASSERT_VALID_OUT_PARAMETER(inOutParameterValueSize); + ASSERT_VALID_OUT_PARAMETER(inOutRegistryUriSize); ASSERT_VALID_POINTER_PARAMETER(participant); auto cppParticipant = reinterpret_cast(participant); - return CopyStringToOutBuffer(cppParticipant->GetRegistryUri(), outParameterValue, inOutParameterValueSize); + return CopyStringToOutBuffer(cppParticipant->GetRegistryUri(), outRegistryUri, inOutRegistryUriSize); } CAPI_CATCH_EXCEPTIONS From 9c4c793ca1d1a6b7209802080f1dc27dcd3eac2c Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Mon, 22 Jun 2026 10:40:18 +0200 Subject: [PATCH 8/9] Rem close-open of the impl namespace Signed-off-by: Konrad Breitsprecher --- .../detail/impl/participant/ParameterProvider.hpp | 12 +----------- SilKit/source/capi/CapiParticipant.cpp | 3 ++- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp index bef17f61b..2ed91d7f2 100644 --- a/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp +++ b/SilKit/include/silkit/detail/impl/participant/ParameterProvider.hpp @@ -8,6 +8,7 @@ #include #include "silkit/participant/exception.hpp" +#include "silkit/detail/impl/ThrowOnError.hpp" namespace SilKit { DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN @@ -19,21 +20,10 @@ inline auto QueryString(SilKit_Participant* participant, StringQueryFunction str inline auto GetParticipantName(SilKit_Participant* participant) -> std::string; inline auto GetRegistryUri(SilKit_Participant* participant) -> std::string; -} // namespace Impl -DETAIL_SILKIT_DETAIL_VN_NAMESPACE_CLOSE -} // namespace SilKit - - // ================================================================================ // Inline Implementations // ================================================================================ -#include "silkit/detail/impl/ThrowOnError.hpp" - -namespace SilKit { -DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN -namespace Impl { - auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string { std::vector buffer; diff --git a/SilKit/source/capi/CapiParticipant.cpp b/SilKit/source/capi/CapiParticipant.cpp index 239e7193d..322f95491 100644 --- a/SilKit/source/capi/CapiParticipant.cpp +++ b/SilKit/source/capi/CapiParticipant.cpp @@ -20,10 +20,11 @@ #include #include #include +#include namespace { -auto CopyStringToOutBuffer(const std::string& value, char* outStringBuffer, size_t* inOutStringBufferSize) +auto CopyStringToOutBuffer(std::string_view value, char* outStringBuffer, size_t* inOutStringBufferSize) -> SilKit_ReturnCode { // Passing outStringBuffer == nullptr performs a size-check only. From 4fe2315e40bd85fc9002ec72e5600ddfa6c6acc2 Mon Sep 17 00:00:00 2001 From: Konrad Breitsprecher Date: Mon, 22 Jun 2026 11:55:38 +0200 Subject: [PATCH 9/9] Use GetParticipantName in SystemController Signed-off-by: Konrad Breitsprecher --- Utilities/SilKitSystemController/SystemController.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Utilities/SilKitSystemController/SystemController.cpp b/Utilities/SilKitSystemController/SystemController.cpp index 8320dc958..147c68336 100644 --- a/Utilities/SilKitSystemController/SystemController.cpp +++ b/Utilities/SilKitSystemController/SystemController.cpp @@ -351,7 +351,7 @@ int main(int argc, char** argv) return -1; } - const auto participantName{commandlineParser.Get("name").Value()}; + const auto participantNameFromCli{commandlineParser.Get("name").Value()}; const auto nonInteractiveMode = (commandlineParser.Get("non-interactive").Value()); const bool hasLogOption{commandlineParser.Get("log").HasValue()}; @@ -365,7 +365,7 @@ int main(int argc, char** argv) const auto configurationFilename{commandlineParser.Get("configuration").Value()}; const auto requiredParticipantNames{commandlineParser.Get("participantNames").Values()}; - const auto connectUri{commandlineParser.Get("connect-uri").Value()}; + const auto connectUriFromCli{commandlineParser.Get("connect-uri").Value()}; const auto logLevel{commandlineParser.Get("log").Value()}; if (!IsValidLogLevel(logLevel)) @@ -413,9 +413,11 @@ int main(int argc, char** argv) try { - std::cout << "Creating participant '" << participantName << "' with registry " << connectUri << std::endl; + auto participant = SilKit::CreateParticipant(configuration, participantNameFromCli, connectUriFromCli); - auto participant = SilKit::CreateParticipant(configuration, participantName, connectUri); + // The name and URI might have changed due to the configuration, so we retrieve them from the participant after creation + const auto participantName{participant->GetParticipantName()}; + const auto connectUri{participant->GetRegistryUri()}; auto* logger{participant->GetLogger()}; {