11#ifndef RTI_ROUTING_TRANSF_DETAIL_TRANSFORMATION_FORWARDER_HPP_
12#define RTI_ROUTING_TRANSF_DETAIL_TRANSFORMATION_FORWARDER_HPP_
14#include <rti/core/Exception.hpp>
16#include <dds/core/xtypes/DynamicData.hpp>
17#include <dds/sub/SampleInfo.hpp>
19#include <rti/routing/transf/Transformation.hpp>
20#include <rti/routing/TypeInfo.hpp>
21#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
22#include <rti/routing/detail/ForwarderUtils.hpp>
24#include "rti/apputils/ServiceException.hpp"
27namespace rti {
namespace routing {
namespace transf {
namespace detail {
30class TransformationForwarder{
32 static RTI_RoutingServiceTransformation create_native(
33 TransformationPlugin *plugin,
34 const struct RTI_RoutingServiceTypeInfo *native_input_type_info,
35 const struct RTI_RoutingServiceTypeInfo *native_output_type_info,
36 const struct RTI_RoutingServiceProperties *native_properties,
37 RTI_RoutingServiceEnvironment *environment)
40 using rti::routing::detail::ScopedForwarder;
42 TypeInfo input_type_info(*native_input_type_info);
43 TypeInfo output_type_info(*native_output_type_info);
45 std::map<std::string, std::string> properties;
46 rti::routing::PropertyAdapter::add_properties_from_native(
50 TransformationForwarder *forwarder =
new TransformationForwarder();
51 ScopedForwarder<TransformationPlugin, TransformationForwarder> scoped(
55 forwarder->transformation_ = plugin->create_transformation(
59 RTI_ROUTING_THROW_ON_NULL(forwarder->transformation_);
62 return forwarder->native();
63 }
catch(
const rti::apputils::FatalServiceException& ex) {
64 RTI_RoutingServiceEnvironment_fatal_error(
68 }
catch(
const std::exception& ex) {
69 RTI_RoutingServiceEnvironment_set_error(
74 RTI_RoutingServiceEnvironment_set_error(
76 "unexpected exception");
82 static void delete_native(
83 TransformationPlugin *plugin,
84 RTI_RoutingServiceTransformation native_transformation,
85 RTI_RoutingServiceEnvironment *environment)
87 TransformationForwarder *forwarder =
88 static_cast<TransformationForwarder*
>(native_transformation);
90 if (forwarder->transformation_ != NULL) {
91 plugin->delete_transformation(
92 forwarder->transformation_);
93 forwarder->transformation_ = NULL;
95 }
catch(
const rti::apputils::FatalServiceException& ex) {
96 RTI_RoutingServiceEnvironment_fatal_error(
99 }
catch(
const std::exception& ex) {
100 RTI_RoutingServiceEnvironment_set_error(
104 RTI_RoutingServiceEnvironment_set_error(
106 "unexpected exception");
112 static void transform(
113 RTI_RoutingServiceTransformation native_transformation,
114 RTI_RoutingServiceSample **out_sample_lst,
115 RTI_RoutingServiceSampleInfo **out_info_lst,
117 RTI_RoutingServiceSample *in_sample_lst,
118 RTI_RoutingServiceSampleInfo *in_info_lst,
120 RTI_RoutingServiceEnvironment *environment)
122 TransformationForwarder *forwarder =
123 static_cast<TransformationForwarder*
> (native_transformation);
124 if (forwarder->transformation_ == NULL) {
131 forwarder->in_sample_seq_.resize(in_count);
132 forwarder->in_info_seq_.resize(in_count);
133 for (
int i = 0; i < in_count; i++) {
134 forwarder->in_sample_seq_[i] = in_sample_lst[i];
135 if (in_info_lst != NULL) {
136 forwarder->in_info_seq_[i] = in_info_lst[i];
140 forwarder->transformation_->transform(
141 forwarder->out_sample_seq_,
142 forwarder->out_info_seq_,
143 forwarder->in_sample_seq_,
144 forwarder->in_info_seq_);
145 if (!forwarder->out_info_seq_.empty()
146 && (forwarder->out_info_seq_.size()
147 != forwarder->out_sample_seq_.size())) {
148 throw dds::core::PreconditionNotMetError(
149 "sample and info sequences length mismatch");
151 }
catch (
const rti::apputils::FatalServiceException& ex) {
152 RTI_RoutingServiceEnvironment_fatal_error(
156 }
catch (
const std::exception& ex) {
157 RTI_RoutingServiceEnvironment_set_error(
162 RTI_RoutingServiceEnvironment_set_error(
164 "unexpected exception");
169 *out_count =
static_cast<int>(forwarder->out_sample_seq_.size());
170 if (*out_count > 0) {
171 *out_sample_lst = &forwarder->out_sample_seq_[0];
172 *out_info_lst = &forwarder->out_info_seq_[0];
176 static void return_loan(
177 RTI_RoutingServiceTransformation native_transformation,
178 RTI_RoutingServiceSample *,
179 RTI_RoutingServiceSampleInfo *,
181 RTI_RoutingServiceEnvironment *environment)
183 TransformationForwarder *forwarder =
184 static_cast<TransformationForwarder*
>(native_transformation);
185 if (forwarder->transformation_ == NULL) {
190 forwarder->transformation_->return_loan(
191 forwarder->out_sample_seq_,
192 forwarder->out_info_seq_);
193 }
catch (
const rti::apputils::FatalServiceException& ex) {
194 RTI_RoutingServiceEnvironment_fatal_error(
197 }
catch (
const std::exception& ex) {
198 RTI_RoutingServiceEnvironment_set_error(
202 RTI_RoutingServiceEnvironment_set_error(
204 "unexpected exception");
207 forwarder->out_sample_seq_.clear();
208 forwarder->out_info_seq_.clear();
213 RTI_RoutingServiceTransformation native_stream_reader,
214 const struct RTI_RoutingServiceProperties *native_properties,
215 RTI_RoutingServiceEnvironment *environment)
218 TransformationForwarder *stream_reader_forwarder =
219 static_cast<TransformationForwarder*
> (native_stream_reader);
221 rti::routing::detail::UpdatableEntityForwarder::update(
222 stream_reader_forwarder->transformation_,
227 RTI_RoutingServiceTransformation native()
235 TransformationForwarder()
236 : transformation_(NULL)
241 ~TransformationForwarder()
248 Transformation *transformation_;
249 std::vector<Transformation::SamplePtr> out_sample_seq_;
250 std::vector<Transformation::InfoPtr> out_info_seq_;
251 std::vector<Transformation::SamplePtr> in_sample_seq_;
252 std::vector<Transformation::InfoPtr> in_info_seq_;