dds-fmu 0.5.1
DDS-FMU communication integration
CustomKeyFilterFactory.hpp
1#pragma once
2
3/*
4 Copyright 2023, SINTEF Ocean
5 This Source Code Form is subject to the terms of the Mozilla Public
6 License, v. 2.0. If a copy of the MPL was not distributed with this
7 file, You can obtain one at http://mozilla.org/MPL/2.0/.
8*/
9
10#include <string>
11
12#include <fastdds/dds/topic/IContentFilter.hpp>
13#include <fastdds/dds/topic/IContentFilterFactory.hpp>
14#include <fastdds/dds/topic/TopicDataType.hpp>
15
16#include "Converter.hpp"
17#include "CustomKeyFilter.hpp"
18
19namespace ddsfmu {
20namespace detail {
21
31class CustomKeyFilterFactory : public eprosima::fastdds::dds::IContentFilterFactory {
32public:
49 eprosima::fastrtps::types::ReturnCode_t create_content_filter(
50 const char* filter_class_name, // Custom filter class name is 'CUSTOM_KEY_FILTER'.
51 const char* type_name, // Type name of dynamic type
52 const eprosima::fastdds::dds::TopicDataType* data_type, // This is a DynamicPubSubType*
53 const char* /*filter_expression*/, // This Custom Filter doesn't implement a filter expression.
54 const ParameterSeq& filter_parameters, // The GUID and key parameters
55 eprosima::fastdds::dds::IContentFilter*& filter_instance) override {
56 // Check the ContentFilteredTopic should be created by this factory.
57 if (std::string(filter_class_name) != "CUSTOM_KEY_FILTER") {
58 return ReturnCode_t::RETCODE_BAD_PARAMETER;
59 }
60
61 if (filter_parameters.length() < 1) { return ReturnCode_t::RETCODE_BAD_PARAMETER; }
62
63 if (filter_instance == nullptr) {
64 try {
65 filter_instance = new CustomKeyFilter(data_type, type_name, filter_parameters);
66 } catch (const std::runtime_error& err) {
67 std::cerr << err.what() << std::endl;
68 return ReturnCode_t::RETCODE_BAD_PARAMETER;
69 }
70 }
71
72 if (std::string(filter_parameters[0]) != "|GUID UNKNOWN|") {
73 try {
74 CustomKeyFilter* instance = dynamic_cast<CustomKeyFilter*>(filter_instance);
75
76 // Only adds a reader once. Once added, changing filter_parameters has not effect
77 if (!instance->has_reader_GUID(filter_parameters[0])) {
78 instance->add_type(data_type, type_name, filter_parameters);
79 }
80 } catch (const std::runtime_error& err) {
81 std::cerr << err.what() << std::endl;
82 return ReturnCode_t::RETCODE_BAD_PARAMETER;
83 }
84 }
85
86 //if (filter_instance != nullptr) { delete (dynamic_cast<CustomKeyFilter*>(filter_instance)); }
87 return ReturnCode_t::RETCODE_OK;
88 }
89
100 eprosima::fastrtps::types::ReturnCode_t delete_content_filter(
101 const char* filter_class_name,
102 eprosima::fastdds::dds::IContentFilter* filter_instance) override {
103 if (std::string(filter_class_name) != "CUSTOM_KEY_FILTER" || !filter_instance) {
104 return ReturnCode_t::RETCODE_BAD_PARAMETER;
105 }
106
107 delete (dynamic_cast<CustomKeyFilter*>(filter_instance));
108 return ReturnCode_t::RETCODE_OK;
109 }
110};
111
112}
113}
A custom content filter factory for dynamic types.
Definition: CustomKeyFilterFactory.hpp:31
eprosima::fastrtps::types::ReturnCode_t create_content_filter(const char *filter_class_name, const char *type_name, const eprosima::fastdds::dds::TopicDataType *data_type, const char *, const ParameterSeq &filter_parameters, eprosima::fastdds::dds::IContentFilter *&filter_instance) override
Create a ContentFilteredTopic using this factory.
Definition: CustomKeyFilterFactory.hpp:49
eprosima::fastrtps::types::ReturnCode_t delete_content_filter(const char *filter_class_name, eprosima::fastdds::dds::IContentFilter *filter_instance) override
Delete a ContentFilteredTopic created by this factory.
Definition: CustomKeyFilterFactory.hpp:100
Custom key filter for dynamic data topics.
Definition: CustomKeyFilter.hpp:99
bool has_reader_GUID(const std::string &guid)
Check if the filter has registered reader with given GUID.
Definition: CustomKeyFilter.hpp:124
bool add_type(const eprosima::fastdds::dds::TopicDataType *data_type, const std::string &type_name, const eprosima::fastdds::dds::LoanableTypedCollection< const char * > &parameters)
Registers a new data type with associated dynamic data type pointer.
Definition: CustomKeyFilter.cpp:13
Definition: auxiliaries.cpp:26