Skip to content

Commit 0dc19b1

Browse files
Add explicit getParticipantName and getRegistryUri C/C++ API
Signed-off-by: Konrad Breitsprecher <Konrad.Breitsprecher@vector.com>
1 parent dea679f commit 0dc19b1

18 files changed

Lines changed: 454 additions & 14 deletions

File tree

SilKit/IntegrationTests/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ add_silkit_test_to_executable(SilKitIntegrationTests
118118
SOURCES ITest_SimTask.cpp
119119
)
120120

121+
add_silkit_test_to_executable(SilKitIntegrationTests
122+
SOURCES ITest_Parameters.cpp
123+
)
124+
121125
add_silkit_test_to_executable(SilKitFunctionalTests
122126
SOURCES FTest_WallClockCoupling.cpp
123127
)

SilKit/IntegrationTests/Hourglass/MockCapi.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,22 @@ extern "C"
769769
return globalCapi->SilKit_Participant_GetLogger(outLogger, participant);
770770
}
771771

772+
SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue,
773+
size_t* inOutParameterValueSize,
774+
SilKit_Participant* participant)
775+
{
776+
return globalCapi->SilKit_Participant_GetParticipantName(outParameterValue, inOutParameterValueSize,
777+
participant);
778+
}
779+
780+
SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue,
781+
size_t* inOutParameterValueSize,
782+
SilKit_Participant* participant)
783+
{
784+
return globalCapi->SilKit_Participant_GetGetRegistryUri(outParameterValue, inOutParameterValueSize,
785+
participant);
786+
}
787+
772788
// ParticipantConfiguration
773789

774790
SilKit_ReturnCode SilKitCALL SilKit_ParticipantConfiguration_FromString(

SilKit/IntegrationTests/Hourglass/MockCapi.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,12 @@ class MockCapi
407407
MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetLogger,
408408
(SilKit_Logger * *outLogger, SilKit_Participant* participant));
409409

410+
MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetParticipantName,
411+
(void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant));
412+
413+
MOCK_METHOD(SilKit_ReturnCode, SilKit_Participant_GetGetRegistryUri,
414+
(void* outParameterValue, size_t* outParameterValueSize, SilKit_Participant* participant));
415+
410416
// ParticipantConfiguration
411417

412418
MOCK_METHOD(SilKit_ReturnCode, SilKit_ParticipantConfiguration_FromString,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// SPDX-FileCopyrightText: 2026 Vector Informatik GmbH
2+
//
3+
// SPDX-License-Identifier: MIT
4+
5+
#include <sstream>
6+
#include <string>
7+
8+
#include "gtest/gtest.h"
9+
10+
#include "silkit/SilKit.hpp"
11+
#include "silkit/vendor/CreateSilKitRegistry.hpp"
12+
13+
namespace {
14+
15+
class ITest_Parameters : public testing::Test
16+
{
17+
protected:
18+
const std::string _registryUriAnyPort{"silkit://127.0.0.1:0"};
19+
};
20+
21+
TEST_F(ITest_Parameters, participant_name_and_registry_uri_set_by_api)
22+
{
23+
const std::string participantNameByApi{"P1"};
24+
25+
auto emptyParticipantConfig = SilKit::Config::ParticipantConfigurationFromString("");
26+
auto registry = SilKit::Vendor::Vector::CreateSilKitRegistry(emptyParticipantConfig);
27+
auto registryUriByApi = registry->StartListening(_registryUriAnyPort);
28+
29+
auto participant = SilKit::CreateParticipant(emptyParticipantConfig, participantNameByApi, registryUriByApi);
30+
31+
EXPECT_EQ(participant->GetParticipantName(), participantNameByApi);
32+
EXPECT_EQ(participant->GetRegistryUri(), registryUriByApi);
33+
}
34+
35+
TEST_F(ITest_Parameters, participant_name_and_registry_uri_set_by_configuration)
36+
{
37+
const std::string participantNameByApi{"P2"};
38+
const std::string registryUriByApi{"silkit://127.0.0.42:0"};
39+
const std::string participantNameByConfig{"P1"};
40+
41+
auto emptyParticipantConfig = SilKit::Config::ParticipantConfigurationFromString("");
42+
auto registry = SilKit::Vendor::Vector::CreateSilKitRegistry(emptyParticipantConfig);
43+
auto registryUriByConfig = registry->StartListening(_registryUriAnyPort);
44+
45+
std::ostringstream ss;
46+
ss << R"({ "ParticipantName": ")" << participantNameByConfig
47+
<< R"(", "Middleware": { "RegistryUri": ")" << registryUriByConfig << R"(" }})";
48+
49+
auto participantConfig = SilKit::Config::ParticipantConfigurationFromString(ss.str());
50+
auto participant = SilKit::CreateParticipant(participantConfig, participantNameByApi, registryUriByApi);
51+
52+
EXPECT_EQ(participant->GetParticipantName(), participantNameByConfig);
53+
EXPECT_EQ(participant->GetRegistryUri(), registryUriByConfig);
54+
}
55+
56+
} // namespace
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH
2+
//
3+
// SPDX-License-Identifier: MIT
4+
5+
#pragma once
6+
#include <stdint.h>
7+
#include "SilKitMacros.h"
8+
9+
#pragma pack(push)
10+
#pragma pack(8)
11+
12+
SILKIT_BEGIN_DECLS
13+
14+
/*! Internal parameter provider. */
15+
typedef struct SilKit_ParamterProvider SilKit_ParamterProvider;
16+
17+
/*! A parameter set by an API call and/or the participant configuration. */
18+
typedef int16_t SilKit_Parameter;
19+
20+
/*! An undefined parameter */
21+
#define SilKit_Parameter_Undefined ((SilKit_Parameter)0)
22+
/*! The name of the participant */
23+
#define SilKit_Parameter_ParticipantName ((SilKit_Parameter)1)
24+
/*! The registry URI */
25+
#define SilKit_Parameter_ReistryUri ((SilKit_Parameter)2)
26+
27+
SILKIT_END_DECLS
28+
29+
#pragma pack(pop)

SilKit/include/silkit/capi/Participant.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "silkit/capi/SilKitMacros.h"
99
#include "silkit/capi/Types.h"
1010
#include "silkit/capi/Logger.h"
11+
#include "silkit/capi/Parameters.h"
1112

1213
#pragma pack(push)
1314
#pragma pack(8)
@@ -63,6 +64,37 @@ SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetLogger(SilKit_Logge
6364
typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetLogger_t)(SilKit_Logger** outLogger,
6465
SilKit_Participant* participant);
6566

67+
68+
/*! \brief Retrieve the participant name from a participant.
69+
*
70+
* \param outParameterValue A buffer to copy the null-terminated participant name to.
71+
* Passing a nullptr is valid and indicates a size-check via inOutParameterValueSize.
72+
* \param inOutParameterValueSize The required/provided size of the value including null-termination.
73+
* \param participant The participant to query.
74+
*/
75+
SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetParticipantName(void* outParameterValue,
76+
size_t* inOutParameterValueSize,
77+
SilKit_Participant* participant);
78+
79+
typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetParticipantName_t)(void* outParameterValue,
80+
size_t* inOutParameterValueSize,
81+
SilKit_Participant* participant);
82+
83+
/*! \brief Retrieve the registry URI from a participant.
84+
*
85+
* \param outParameterValue A buffer to copy the null-terminated registry URI to.
86+
* Passing a nullptr is valid and indicates a size-check via inOutParameterValueSize.
87+
* \param inOutParameterValueSize The required/provided size of the value including null-termination.
88+
* \param participant The participant to query.
89+
*/
90+
SilKitAPI SilKit_ReturnCode SilKitCALL SilKit_Participant_GetGetRegistryUri(void* outParameterValue,
91+
size_t* inOutParameterValueSize,
92+
SilKit_Participant* participant);
93+
94+
typedef SilKit_ReturnCode(SilKitFPTR* SilKit_Participant_GetGetRegistryUri_t)(void* outParameterValue,
95+
size_t* inOutParameterValueSize,
96+
SilKit_Participant* participant);
97+
6698
SILKIT_END_DECLS
6799

68100
#pragma pack(pop)

SilKit/include/silkit/capi/SilKit.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "silkit/capi/Version.h"
2121
#include "silkit/capi/NetworkSimulator.h"
2222
#include "silkit/capi/EventProducer.h"
23+
#include "silkit/capi/Parameters.h"
2324

2425
SILKIT_BEGIN_DECLS
2526

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// SPDX-FileCopyrightText: 2024 Vector Informatik GmbH
2+
//
3+
// SPDX-License-Identifier: MIT
4+
5+
#pragma once
6+
7+
#include <string>
8+
#include <vector>
9+
#include "silkit/capi/Parameters.h"
10+
#include "silkit/participant/exception.hpp"
11+
12+
namespace SilKit {
13+
DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN
14+
namespace Impl {
15+
16+
class ParameterProvider
17+
{
18+
public:
19+
inline ParameterProvider();
20+
21+
inline ~ParameterProvider() = default;
22+
23+
inline auto GetStringParameter(SilKit_Participant* participant, Parameter parameter) -> std::string;
24+
25+
private:
26+
using StringQueryFunction = SilKit_ReturnCode(SilKitCALL*)(void*, size_t*, SilKit_Participant*);
27+
inline auto QueryString(SilKit_Participant* participant, StringQueryFunction stringQueryFunction) -> std::string;
28+
29+
};
30+
31+
} // namespace Impl
32+
DETAIL_SILKIT_DETAIL_VN_NAMESPACE_CLOSE
33+
} // namespace SilKit
34+
35+
36+
// ================================================================================
37+
// Inline Implementations
38+
// ================================================================================
39+
40+
#include "silkit/detail/impl/ThrowOnError.hpp"
41+
42+
namespace SilKit {
43+
DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN
44+
namespace Impl {
45+
46+
ParameterProvider::ParameterProvider()
47+
{
48+
}
49+
50+
auto ParameterProvider::QueryString(SilKit_Participant* participant,
51+
StringQueryFunction stringQueryFunction) -> std::string
52+
{
53+
std::vector<char> buffer;
54+
size_t size = 0;
55+
56+
{
57+
const auto returnCode = stringQueryFunction(nullptr, &size, participant);
58+
ThrowOnError(returnCode);
59+
}
60+
61+
while (size > buffer.size())
62+
{
63+
buffer.resize(size);
64+
const auto returnCode = stringQueryFunction(buffer.data(), &size, participant);
65+
ThrowOnError(returnCode);
66+
}
67+
68+
return std::string{buffer.data()};
69+
}
70+
71+
auto ParameterProvider::GetStringParameter(SilKit_Participant* participant, Parameter parameter) -> std::string
72+
{
73+
switch (parameter)
74+
{
75+
case Parameter::ParticipantName:
76+
return QueryString(participant, &SilKit_Participant_GetParticipantName);
77+
case Parameter::RegistryUri:
78+
return QueryString(participant, &SilKit_Participant_GetGetRegistryUri);
79+
default:
80+
throw SilKit::SilKitError("Unknown parameter.");
81+
}
82+
}
83+
84+
} // namespace Impl
85+
DETAIL_SILKIT_DETAIL_VN_NAMESPACE_CLOSE
86+
} // namespace SilKit

SilKit/include/silkit/detail/impl/participant/Participant.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636

3737
#include "silkit/detail/impl/netsim/NetworkSimulator.hpp"
3838

39+
#include "silkit/detail/impl/participant/ParameterProvider.hpp"
40+
3941
namespace SilKit {
4042
DETAIL_SILKIT_DETAIL_VN_NAMESPACE_BEGIN
4143
namespace Impl {
@@ -83,6 +85,10 @@ class Participant : public SilKit::IParticipant
8385

8486
inline auto GetLogger() -> SilKit::Services::Logging::ILogger* override;
8587

88+
inline auto GetParticipantName() const -> std::string override;
89+
90+
inline auto GetRegistryUri() const -> std::string override;
91+
8692
inline auto ExperimentalCreateNetworkSimulator() -> SilKit::Experimental::NetworkSimulation::INetworkSimulator*;
8793

8894
inline auto ExperimentalCreateSystemController()
@@ -124,6 +130,8 @@ class Participant : public SilKit::IParticipant
124130
std::unique_ptr<Impl::Services::Logging::Logger> _logger;
125131

126132
std::unique_ptr<Impl::Experimental::NetworkSimulation::NetworkSimulator> _networkSimulator;
133+
134+
std::unique_ptr<Impl::ParameterProvider> _parameterProvider;
127135
};
128136

129137
} // namespace Impl
@@ -143,6 +151,7 @@ Participant::Participant(SilKit_Participant* participant)
143151
: _participant{participant}
144152
{
145153
_logger = std::make_unique<Services::Logging::Logger>(_participant);
154+
_parameterProvider = std::make_unique<ParameterProvider>();
146155
}
147156

148157
Participant::~Participant()
@@ -224,6 +233,17 @@ auto Participant::GetLogger() -> SilKit::Services::Logging::ILogger*
224233
return _logger.get();
225234
}
226235

236+
237+
auto Participant::GetParticipantName() const -> std::string
238+
{
239+
return _parameterProvider->GetStringParameter(_participant, SilKit::Parameter::ParticipantName);
240+
}
241+
242+
auto Participant::GetRegistryUri() const -> std::string
243+
{
244+
return _parameterProvider->GetStringParameter(_participant, SilKit::Parameter::RegistryUri);
245+
}
246+
227247
auto Participant::ExperimentalCreateSystemController()
228248
-> SilKit::Experimental::Services::Orchestration::ISystemController*
229249
{

SilKit/include/silkit/participant/IParticipant.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include "silkit/services/rpc/RpcSpec.hpp"
1919
#include "silkit/services/rpc/RpcDatatypes.hpp"
2020

21+
#include "silkit/participant/parameters.hpp"
22+
2123
namespace SilKit {
2224

2325
/*! \brief Communication interface to be used by SIL Kit participants
@@ -82,6 +84,10 @@ class IParticipant
8284

8385
//! \brief Return the ILogger at this SIL Kit participant.
8486
virtual auto GetLogger() -> Services::Logging::ILogger* = 0;
87+
88+
virtual auto GetParticipantName() const -> std::string = 0;
89+
90+
virtual auto GetRegistryUri() const -> std::string = 0;
8591
};
8692

8793
} // namespace SilKit

0 commit comments

Comments
 (0)