@@ -41,10 +41,17 @@ void DynamicSubscription::handle_message(std::shared_ptr<void> &, const rclcpp::
4141}
4242
4343void DynamicSubscription::handle_serialized_message (
44- const std::shared_ptr<rclcpp::SerializedMessage> &, const rclcpp::MessageInfo &)
44+ const std::shared_ptr<rclcpp::SerializedMessage> & message,
45+ const rclcpp::MessageInfo & message_info)
4546{
46- throw rclcpp::exceptions::UnimplementedError (
47- " handle_serialized_message is not implemented for DynamicSubscription" );
47+ using PlainCallback = std::function<void (std::shared_ptr<SerializedMessage>)>;
48+ using InfoCallback = std::function<
49+ void (std::shared_ptr<SerializedMessage>, const MessageInfo &)>;
50+ if (std::holds_alternative<PlainCallback>(callback_)) {
51+ std::get<PlainCallback>(callback_)(message);
52+ } else {
53+ std::get<InfoCallback>(callback_)(message, message_info);
54+ }
4855}
4956
5057void DynamicSubscription::handle_loaned_message (void *, const rclcpp::MessageInfo &)
@@ -106,8 +113,25 @@ void DynamicSubscription::handle_dynamic_message(
106113 const rclcpp::dynamic_typesupport::DynamicMessage::SharedPtr & message,
107114 const rclcpp::MessageInfo & message_info)
108115{
109- (void ) message_info;
110- callback_ (message, ts_->get_rosidl_runtime_c_type_description ());
116+ using PlainCallback = std::function<void (dynamic_typesupport::DynamicMessage::SharedPtr)>;
117+ using InfoCallback = std::function<
118+ void (dynamic_typesupport::DynamicMessage::SharedPtr, const MessageInfo &)>;
119+ if (std::holds_alternative<PlainCallback>(callback_)) {
120+ std::get<PlainCallback>(callback_)(message);
121+ } else {
122+ std::get<InfoCallback>(callback_)(message, message_info);
123+ }
124+ }
125+
126+ bool DynamicSubscription::is_callback_serialized (
127+ const rclcpp::AnyDynamicSubscriptionCallback & callback)
128+ {
129+ using PlainCallback = std::function<void (std::shared_ptr<SerializedMessage>)>;
130+ using InfoCallback =
131+ std::function<void (std::shared_ptr<SerializedMessage>, const MessageInfo &)>;
132+ return
133+ std::holds_alternative<PlainCallback>(callback) ||
134+ std::holds_alternative<InfoCallback>(callback);
111135}
112136
113137} // namespace rclcpp
0 commit comments