15 #include "rcl/error_handling.h"
16 #include "rcl/type_description_conversions.h"
18 #include "rosidl_runtime_c/string_functions.h"
19 #include "rosidl_runtime_c/type_description/field__functions.h"
20 #include "rosidl_runtime_c/type_description/individual_type_description__functions.h"
21 #include "rosidl_runtime_c/type_description/type_description__functions.h"
22 #include "rosidl_runtime_c/type_description/type_source__functions.h"
23 #include "type_description_interfaces/msg/detail/field__functions.h"
24 #include "type_description_interfaces/msg/individual_type_description.h"
26 static bool individual_type_description_runtime_to_msg(
27 const rosidl_runtime_c__type_description__IndividualTypeDescription * in,
28 type_description_interfaces__msg__IndividualTypeDescription * out)
30 RCL_CHECK_ARGUMENT_FOR_NULL(in,
false);
31 RCL_CHECK_ARGUMENT_FOR_NULL(out,
false);
34 rosidl_runtime_c__String__copy(&in->type_name, &out->type_name) &&
35 type_description_interfaces__msg__Field__Sequence__init(
42 for (
size_t i = 0; i < in->fields.size; ++i) {
43 if (!rosidl_runtime_c__String__copy(
44 &(in->fields.data[i].name),
45 &(out->fields.data[i].name)))
50 if (in->fields.data[i].default_value.size) {
51 if (!rosidl_runtime_c__String__copy(
52 &(in->fields.data[i].default_value),
53 &(out->fields.data[i].default_value)))
60 out->fields.data[i].type.type_id = in->fields.data[i].type.type_id;
62 out->fields.data[i].type.capacity = in->fields.data[i].type.capacity;
64 out->fields.data[i].type.string_capacity =
65 in->fields.data[i].type.string_capacity;
68 if (in->fields.data[i].type.nested_type_name.size) {
69 if (!rosidl_runtime_c__String__copy(
70 &(in->fields.data[i].type.nested_type_name),
71 &(out->fields.data[i].type.nested_type_name)))
81 type_description_interfaces__msg__IndividualTypeDescription__fini(out);
85 static bool individual_type_description_msg_to_runtime(
86 const type_description_interfaces__msg__IndividualTypeDescription * in,
87 rosidl_runtime_c__type_description__IndividualTypeDescription * out)
89 RCL_CHECK_ARGUMENT_FOR_NULL(in,
false);
90 RCL_CHECK_ARGUMENT_FOR_NULL(out,
false);
93 rosidl_runtime_c__String__copy(&in->type_name, &out->type_name) &&
94 rosidl_runtime_c__type_description__Field__Sequence__init(
95 &out->fields, in->fields.size);
100 for (
size_t i = 0; i < in->fields.size; ++i) {
101 if (!rosidl_runtime_c__String__copy(
102 &(in->fields.data[i].name),
103 &(out->fields.data[i].name)))
108 if (in->fields.data[i].default_value.size) {
109 if (!rosidl_runtime_c__String__copy(
110 &(in->fields.data[i].default_value),
111 &(out->fields.data[i].default_value)))
118 out->fields.data[i].type.type_id = in->fields.data[i].type.type_id;
120 out->fields.data[i].type.capacity = in->fields.data[i].type.capacity;
122 out->fields.data[i].type.string_capacity =
123 in->fields.data[i].type.string_capacity;
126 if (in->fields.data[i].type.nested_type_name.size) {
127 if (!rosidl_runtime_c__String__copy(
128 &(in->fields.data[i].type.nested_type_name),
129 &(out->fields.data[i].type.nested_type_name)))
139 rosidl_runtime_c__type_description__IndividualTypeDescription__init(out);
143 type_description_interfaces__msg__TypeDescription *
144 rcl_convert_type_description_runtime_to_msg(
145 const rosidl_runtime_c__type_description__TypeDescription * runtime_description)
147 RCL_CHECK_ARGUMENT_FOR_NULL(runtime_description, NULL);
150 type_description_interfaces__msg__TypeDescription * out =
151 type_description_interfaces__msg__TypeDescription__create();
152 RCL_CHECK_ARGUMENT_FOR_NULL(out, NULL);
155 if (!type_description_interfaces__msg__IndividualTypeDescription__Sequence__init(
156 &out->referenced_type_descriptions,
157 runtime_description->referenced_type_descriptions.size))
163 if (!individual_type_description_runtime_to_msg(
164 &runtime_description->type_description,
165 &out->type_description))
171 for (
size_t i = 0; i < runtime_description->referenced_type_descriptions.size; ++i) {
172 if (!individual_type_description_runtime_to_msg(
173 &runtime_description->referenced_type_descriptions.data[i],
174 &out->referenced_type_descriptions.data[i]))
183 type_description_interfaces__msg__TypeDescription__destroy(out);
187 rosidl_runtime_c__type_description__TypeDescription *
188 rcl_convert_type_description_msg_to_runtime(
189 const type_description_interfaces__msg__TypeDescription * description_msg)
191 RCL_CHECK_ARGUMENT_FOR_NULL(description_msg, NULL);
194 rosidl_runtime_c__type_description__TypeDescription * out =
195 rosidl_runtime_c__type_description__TypeDescription__create();
196 RCL_CHECK_ARGUMENT_FOR_NULL(out, NULL);
199 if (!rosidl_runtime_c__type_description__IndividualTypeDescription__Sequence__init(
200 &out->referenced_type_descriptions,
201 description_msg->referenced_type_descriptions.size))
206 if (!individual_type_description_msg_to_runtime(
207 &description_msg->type_description,
208 &out->type_description))
213 for (
size_t i = 0; i < description_msg->referenced_type_descriptions.size; ++i) {
214 if (!individual_type_description_msg_to_runtime(
215 &description_msg->referenced_type_descriptions.data[i],
216 &out->referenced_type_descriptions.data[i]))
225 rosidl_runtime_c__type_description__TypeDescription__destroy(out);
229 type_description_interfaces__msg__TypeSource__Sequence *
230 rcl_convert_type_source_sequence_runtime_to_msg(
231 const rosidl_runtime_c__type_description__TypeSource__Sequence * runtime_type_sources)
233 RCL_CHECK_ARGUMENT_FOR_NULL(runtime_type_sources, NULL);
236 type_description_interfaces__msg__TypeSource__Sequence * out =
237 type_description_interfaces__msg__TypeSource__Sequence__create(runtime_type_sources->size);
238 RCL_CHECK_ARGUMENT_FOR_NULL(out, NULL);
241 for (
size_t i = 0; i < runtime_type_sources->size; ++i) {
243 if (!rosidl_runtime_c__String__copy(
244 &(runtime_type_sources->data[i].type_name), &(out->data[i].type_name)))
249 if (!rosidl_runtime_c__String__copy(
250 &(runtime_type_sources->data[i].encoding), &(out->data[i].encoding)))
255 if (runtime_type_sources->data[i].raw_file_contents.size > 0) {
256 if (!rosidl_runtime_c__String__copy(
257 &(runtime_type_sources->data[i].raw_file_contents), &(out->data[i].raw_file_contents)))
267 type_description_interfaces__msg__TypeSource__Sequence__destroy(out);
271 rosidl_runtime_c__type_description__TypeSource__Sequence *
272 rcl_convert_type_source_sequence_msg_to_runtime(
273 const type_description_interfaces__msg__TypeSource__Sequence * type_sources_msg)
275 RCL_CHECK_ARGUMENT_FOR_NULL(type_sources_msg, NULL);
278 rosidl_runtime_c__type_description__TypeSource__Sequence * out =
279 rosidl_runtime_c__type_description__TypeSource__Sequence__create(type_sources_msg->size);
280 RCL_CHECK_ARGUMENT_FOR_NULL(out, NULL);
283 for (
size_t i = 0; i < type_sources_msg->size; ++i) {
285 if (!rosidl_runtime_c__String__copy(
286 &(type_sources_msg->data[i].type_name), &(out->data[i].type_name)))
291 if (!rosidl_runtime_c__String__copy(
292 &(type_sources_msg->data[i].encoding), &(out->data[i].encoding)))
297 if (!rosidl_runtime_c__String__copy(
298 &(type_sources_msg->data[i].raw_file_contents), &(out->data[i].raw_file_contents)))
307 rosidl_runtime_c__type_description__TypeSource__Sequence__destroy(out);