3 #include <rosidl_typesupport_introspection_cpp/message_introspection.hpp> 4 #include <rosidl_typesupport_introspection_cpp/field_types.hpp> 5 #include <rosbag2_cpp/typesupport_helpers.hpp> 6 #include <rosbag2_cpp/types/introspection_message.hpp> 7 #include <rcutils/time.h> 20 _introspection_library = rosbag2_cpp::get_typesupport_library(type,
"rosidl_typesupport_introspection_cpp");
23 auto identifier = rosidl_typesupport_cpp::typesupport_identifier;
40 auto members =
static_cast<const rosidl_typesupport_introspection_cpp::MessageMembers *
>(type_support->data);
42 if (members->member_count_ >= 1 && members->members_)
44 const rosidl_typesupport_introspection_cpp::MessageMember& first_field = members->members_[0];
45 if (first_field.members_ ==
nullptr)
49 const auto* header_members =
static_cast<const rosidl_typesupport_introspection_cpp::MessageMembers*
>(first_field.members_->data);
50 if (strcmp(header_members->message_name_,
"Header") == 0 && strcmp(header_members->message_namespace_,
"std_msgs::" 62 using TypeSupport = rosidl_message_type_support_t;
64 using rosidl_typesupport_introspection_cpp::MessageMember;
65 using rosidl_typesupport_introspection_cpp::MessageMembers;
66 using rosidl_typesupport_introspection_cpp::ROS_TYPE_MESSAGE;
68 std::function<void(StringTreeNode * node, const TypeSupport*)> recursivelyCreateTree;
69 recursivelyCreateTree = [&](
StringTreeNode* node,
const TypeSupport* type_data) {
70 const auto* members =
static_cast<const MessageMembers*
>(type_data->data);
72 node->
children().reserve(members->member_count_);
74 for (
size_t i = 0;
i < members->member_count_;
i++)
76 const MessageMember& member = members->members_[
i];
83 if (member.type_id_ == ROS_TYPE_MESSAGE)
86 recursivelyCreateTree(new_node, member.members_);
120 using TypeSupport = rosidl_message_type_support_t;
122 std::function<void(const TypeSupport*, StringTreeLeaf&, bool)> recursiveParser;
125 recursiveParser = [&](
const TypeSupport* type_data,
StringTreeLeaf& tree_leaf,
bool skip_save) {
126 using namespace rosidl_typesupport_introspection_cpp;
127 const auto* members =
static_cast<const MessageMembers*
>(type_data->data);
131 const MessageMember& member = members->members_[
index];
133 auto new_tree_leaf = tree_leaf;
134 new_tree_leaf.node_ptr = tree_leaf.node_ptr->child(
index);
136 size_t array_size = 1;
138 if (member.is_array_)
140 if (member.array_size_ == 0)
142 array_size =
size_t(CastFromBuffer<uint32_t>(cdr));
146 array_size = member.array_size_;
150 if (array_size >
MAX_ARRAY_SIZE && (member.type_id_ == ROS_TYPE_INT8 || member.type_id_ == ROS_TYPE_UINT8))
155 flat_container->
blobs.push_back({ new_tree_leaf, std::move(blob) });
157 cdr.
jump(array_size);
162 if (member.is_array_)
164 new_tree_leaf.index_array.push_back(0);
165 new_tree_leaf.node_ptr = new_tree_leaf.node_ptr->child(0);
168 for (
size_t a = 0; a < array_size; a++)
170 if (member.is_array_)
172 new_tree_leaf.index_array.back() = a;
181 if (member.type_id_ != ROS_TYPE_MESSAGE && member.type_id_ != ROS_TYPE_STRING)
184 switch (member.type_id_)
187 value = double(CastFromBuffer<float>(cdr));
189 case ROS_TYPE_DOUBLE:
190 value = double(CastFromBuffer<double>(cdr));
194 value = double(CastFromBuffer<int64_t>(cdr));
197 value = double(CastFromBuffer<int32_t>(cdr));
200 value = double(CastFromBuffer<int16_t>(cdr));
203 value = double(CastFromBuffer<int8_t>(cdr));
206 case ROS_TYPE_UINT64:
207 value = double(CastFromBuffer<uint64_t>(cdr));
209 case ROS_TYPE_UINT32:
210 value = double(CastFromBuffer<uint32_t>(cdr));
212 case ROS_TYPE_UINT16:
213 value = double(CastFromBuffer<uint16_t>(cdr));
216 value = double(CastFromBuffer<uint8_t>(cdr));
219 case ROS_TYPE_BOOLEAN:
220 value = double(CastFromBuffer<bool>(cdr));
225 flat_container->
values.push_back({ new_tree_leaf, value });
228 else if (member.type_id_ == ROS_TYPE_STRING)
234 flat_container->
strings.push_back({ new_tree_leaf, std::move(str) });
238 static std::string tmp;
242 else if (member.type_id_ == ROS_TYPE_MESSAGE)
244 recursiveParser(member.members_, new_tree_leaf, skip_save);
250 flat_container->
blobs.clear();
251 flat_container->
strings.clear();
252 flat_container->
values.clear();
MaxArrayPolicy _discard_policy
TreeNode< T > * root()
Mutable pointer to the root of the tree.
const TopicInfo & topicInfo() const
const ChildrenVector & children() const
bool deserializeIntoFlatMessage(const rcutils_uint8_array_t *msg, FlatMessage *flat_container_output) const
Cdr & read_encapsulation()
The StringTreeLeaf is, as the name suggests, a leaf (terminal node) of a StringTree. It provides the pointer to the node and a list of numbers that represent the index that corresponds to the placeholder "#".
span_CONFIG_SIZE_TYPE size_t
Parser(const std::string &topic_name, const std::string &type_name)
MaxArrayPolicy maxArrayPolicy() const
static rcutils_allocator_t allocator
std::shared_ptr< rcpputils::SharedLibrary > _support_library
const StringTreeNode * node_ptr
TreeNode * addChild(const T &child)
std::vector< std::pair< StringTreeLeaf, std::string > > strings
const rosidl_message_type_support_t * type_support
char * getCurrentPosition()
Element of the tree. it has a single parent and N >= 0 children.
std::shared_ptr< rcpputils::SharedLibrary > _introspection_library
static const Endianness DEFAULT_ENDIAN
size_t maxArraySize() const
const StringTree * tree
Tree that the StringTreeLeaf(s) refer to.
std::vector< std::pair< StringTreeLeaf, double > > values
bool jump(size_t numBytes)
const rosidl_message_type_support_t * introspection_support
void setMaxArrayPolicy(MaxArrayPolicy discard_policy, size_t max_size)
std::vector< std::pair< StringTreeLeaf, BufferView > > blobs
bool TypeHasHeader(const rosidl_message_type_support_t *type_support)
T CastFromBuffer(eprosima::fastcdr::Cdr &cdr)
TopicInfo(const std::string &type)
Cdr & deserialize(uint8_t &octet_t)