Skip to content

Commit c83981a

Browse files
authored
Automatic TypeObject representation registration for DynamicTypes (#778)
1 parent 91d96b8 commit c83981a

2 files changed

Lines changed: 19 additions & 24 deletions

File tree

code/Examples/C++/DDSHelloWorld/src/HelloWorldTypeObjectSupport.cxx

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,15 @@ void register_HelloWorld_type_objects()
4343
static std::once_flag once_flag;
4444
std::call_once(once_flag, []()
4545
{
46-
register_HelloWorld_type_identifier();
46+
TypeIdentifier type_id;
47+
register_HelloWorld_type_identifier(type_id);
4748

4849
});
4950
}
5051

51-
void register_HelloWorld_type_identifier()
52+
// TypeIdentifier is returned by reference: dependent structures/unions are registered in this same method
53+
void register_HelloWorld_type_identifier(
54+
TypeIdentifier& type_id)
5255
{
5356
{
5457
StructTypeFlag struct_flags_HelloWorld = TypeObjectUtils::build_struct_type_flag(eprosima::fastdds::dds::xtypes::ExtensibilityKind::NOT_APPLIED,
@@ -71,6 +74,7 @@ void register_HelloWorld_type_identifier()
7174
{
7275
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
7376
"index Structure member TypeIdentifier unknown to TypeObjectRegistry.");
77+
type_id = TypeIdentifier();
7478
return;
7579
}
7680
StructMemberFlag member_flags_index = TypeObjectUtils::build_struct_member_flag(eprosima::fastdds::dds::xtypes::TryConstructKind::NOT_APPLIED,
@@ -117,6 +121,7 @@ void register_HelloWorld_type_identifier()
117121
{
118122
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
119123
"Structure index member TypeIdentifier inconsistent.");
124+
type_id = TypeIdentifier();
120125
return;
121126
}
122127
MemberName name_index = "index";
@@ -133,8 +138,6 @@ void register_HelloWorld_type_identifier()
133138

134139
if (return_code_HelloWorld != eprosima::fastdds::dds::RETCODE_OK)
135140
{
136-
std::string type_id_kind_anonymous_string_unbounded("TI_STRING8_SMALL");
137-
if (type_id_kind_anonymous_string_unbounded == "TI_STRING8_SMALL")
138141
{
139142
SBound bound = 0;
140143
StringSTypeDefn string_sdefn = TypeObjectUtils::build_string_s_type_defn(bound);
@@ -146,31 +149,14 @@ void register_HelloWorld_type_identifier()
146149
"anonymous_string_unbounded already registered in TypeObjectRegistry for a different type.");
147150
}
148151
}
149-
else if (type_id_kind_anonymous_string_unbounded == "TI_STRING8_LARGE")
150-
{
151-
LBound bound = 255;
152-
StringLTypeDefn string_ldefn = TypeObjectUtils::build_string_l_type_defn(bound);
153-
if (eprosima::fastdds::dds::RETCODE_BAD_PARAMETER ==
154-
TypeObjectUtils::build_and_register_l_string_type_identifier(string_ldefn,
155-
"anonymous_string_unbounded"))
156-
{
157-
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
158-
"anonymous_string_unbounded already registered in TypeObjectRegistry for a different type.");
159-
}
160-
}
161-
else
162-
{
163-
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
164-
"anonymous_string_unbounded: Unknown String kind.");
165-
return;
166-
}
167152
return_code_HelloWorld =
168153
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->type_object_registry().get_type_identifiers(
169154
"anonymous_string_unbounded", type_ids_HelloWorld);
170155
if (return_code_HelloWorld != eprosima::fastdds::dds::RETCODE_OK)
171156
{
172157
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
173158
"anonymous_string_unbounded: Given String TypeIdentifier unknown to TypeObjectRegistry.");
159+
type_id = TypeIdentifier();
174160
return;
175161
}
176162
}
@@ -218,6 +204,7 @@ void register_HelloWorld_type_identifier()
218204
{
219205
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
220206
"Structure message member TypeIdentifier inconsistent.");
207+
type_id = TypeIdentifier();
221208
return;
222209
}
223210
MemberName name_message = "message";
@@ -229,7 +216,7 @@ void register_HelloWorld_type_identifier()
229216
}
230217
CompleteStructType struct_type_HelloWorld = TypeObjectUtils::build_complete_struct_type(struct_flags_HelloWorld, header_HelloWorld, member_seq_HelloWorld);
231218
if (eprosima::fastdds::dds::RETCODE_BAD_PARAMETER ==
232-
TypeObjectUtils::build_and_register_struct_type_object(struct_type_HelloWorld, type_name_HelloWorld.to_string()))
219+
TypeObjectUtils::build_and_register_struct_type_object(struct_type_HelloWorld, type_name_HelloWorld.to_string(), type_id))
233220
{
234221
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
235222
"HelloWorld already registered in TypeObjectRegistry for a different type.");
@@ -241,6 +228,7 @@ void register_HelloWorld_type_identifier()
241228
{
242229
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION,
243230
"HelloWorld: Given Struct TypeIdentifier unknown to TypeObjectRegistry.");
231+
type_id = TypeIdentifier();
244232
return;
245233
}
246234
}

code/Examples/C++/DDSHelloWorld/src/HelloWorldTypeObjectSupport.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#ifndef _FAST_DDS_GENERATED_HELLOWORLD_TYPE_OBJECT_SUPPORT_HPP_
2323
#define _FAST_DDS_GENERATED_HELLOWORLD_TYPE_OBJECT_SUPPORT_HPP_
2424

25+
#include <fastdds/dds/xtypes/type_representation/TypeObject.hpp>
26+
2527

2628
#if defined(_WIN32)
2729
#if defined(EPROSIMA_USER_DLL_EXPORT)
@@ -45,8 +47,13 @@ eProsima_user_DllExport void register_HelloWorld_type_objects();
4547
* Fully-descriptive TypeIdentifiers are directly registered.
4648
* Hash TypeIdentifiers require to fill the TypeObject information and hash it, consequently, the TypeObject is
4749
* indirectly registered as well.
50+
*
51+
* @param[out] TypeIdentifier of the registered type.
52+
* The returned TypeIdentifier corresponds to the complete TypeIdentifier in case of hashed TypeIdentifiers.
53+
* Invalid TypeIdentifier is returned in case of error.
4854
*/
49-
eProsima_user_DllExport void register_HelloWorld_type_identifier();
55+
eProsima_user_DllExport void register_HelloWorld_type_identifier(
56+
eprosima::fastdds::dds::xtypes::TypeIdentifier& type_id);
5057

5158

5259
#endif // DOXYGEN_SHOULD_SKIP_THIS_PUBLIC

0 commit comments

Comments
 (0)