RTI Routing Service Version 7.7.0
StreamWriterForwarder.hpp
1/*
2 * (c) Copyright, Real-Time Innovations, 2017.
3 * All rights reserved.
4 *
5 * No duplications, whole or partial, manual or electronic, may be made
6 * without express written permission. Any such copies, or
7 * revisions thereof, must display this notice unaltered.
8 * This code contains trade secrets of Real-Time Innovations, Inc.
9 */
10
11#ifndef RTI_ROUTING_ADAPTER_DETAIL_STREAM_WRITER_FORWARDER_HPP_
12#define RTI_ROUTING_ADAPTER_DETAIL_STREAM_WRITER_FORWARDER_HPP_
13
14#include <rti/core/Exception.hpp>
15
16#include <rti/apputils/ServiceException.hpp>
17
18#include <rti/routing/adapter/StreamWriter.hpp>
19#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
20#include <rti/routing/detail/ForwarderUtils.hpp>
21
22namespace rti { namespace routing { namespace adapter { namespace detail {
23
24
25class StreamWriterForwarder {
26public:
27
28 static RTI_RoutingServiceStreamWriterExt* create_native(
29 Connection *connection,
30 Session *session,
31 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
32 const struct RTI_RoutingServiceProperties *native_properties,
33 RTI_RoutingServiceEnvironment *environment)
34 {
35 try {
36 using rti::routing::detail::ScopedForwarder;
37
38 StreamInfo stream_info(*native_stream_info);
39
40 std::map<std::string, std::string> properties;
41 rti::routing::PropertyAdapter::add_properties_from_native(
42 properties,
43 native_properties);
44
45 StreamWriterForwarder *forwarder = new StreamWriterForwarder(
46 NULL);
47 ScopedForwarder<Connection, StreamWriterForwarder> scoped(
48 connection,
49 forwarder,
50 environment);
51 forwarder->stream_writer_ = connection->create_stream_writer(
52 session,
53 stream_info,
54 properties);
55 RTI_ROUTING_THROW_ON_NULL(forwarder->stream_writer_);
56
57 scoped.release();
58
59 // TRUST-134: the forwarder is not leaked here. It might be leaked
60 // if delete_native() were not to be called, but Routing Service
61 // will make sure that is not the case
62
63 /* coverity[leaked_storage : FALSE] */
64 return forwarder->native();
65 } catch(const rti::apputils::FatalServiceException& ex) {
66 RTI_RoutingServiceEnvironment_fatal_error(
67 environment,
68 ex.what());
69 return NULL;
70 } catch(const std::exception& ex) {
71 RTI_RoutingServiceEnvironment_set_error(
72 environment,
73 ex.what());
74 return NULL;
75 } catch (...) {
76 RTI_RoutingServiceEnvironment_set_error(
77 environment,
78 "unexpected exception");
79 return NULL;
80 }
81
82 }
83
84 static void delete_native(
85 Connection *connection,
86 RTI_RoutingServiceStreamWriterExt *native_stream_writer,
87 RTI_RoutingServiceEnvironment *environment)
88 {
89 StreamWriterForwarder *stream_writer_forwarder =
90 static_cast<StreamWriterForwarder*>(
91 native_stream_writer->stream_writer_data);
92 try {
93 if (stream_writer_forwarder->stream_writer_ != NULL) {
94 connection->delete_stream_writer(
95 stream_writer_forwarder->stream_writer_);
96 stream_writer_forwarder->stream_writer_ = NULL;
97 }
98 } catch(const rti::apputils::FatalServiceException& ex) {
99 RTI_RoutingServiceEnvironment_fatal_error(
100 environment,
101 ex.what());
102 } catch(const std::exception& ex) {
103 RTI_RoutingServiceEnvironment_set_error(
104 environment,
105 ex.what());
106 } catch (...) {
107 }
108
109 delete stream_writer_forwarder;
110 }
111
112
113 static int write(
114 void *native_stream_writer_data,
115 const RTI_RoutingServiceSample *sample_array,
116 const RTI_RoutingServiceSampleInfo *sample_info_array,
117 int array_length,
118 RTI_RoutingServiceEnvironment *environment)
119 {
120
121 StreamWriterForwarder *forwarder =
122 static_cast<StreamWriterForwarder*>(native_stream_writer_data);
123
124 try {
125 RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE(
126 forwarder->sample_seq_,
127 sample_array,
128 array_length);
129 if (sample_info_array != NULL) {
130 RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE(
131 forwarder->info_seq_,
132 sample_info_array,
133 array_length);
134 } else {
135 forwarder->info_seq_.clear();
136 }
137 return forwarder->stream_writer_->write(
138 forwarder->sample_seq_,
139 forwarder->info_seq_);
140 } catch (const rti::apputils::FatalServiceException& ex) {
141 RTI_RoutingServiceEnvironment_fatal_error(
142 environment,
143 ex.what());
144 } catch (const std::exception& ex) {
145 RTI_RoutingServiceEnvironment_set_error(
146 environment,
147 ex.what());
148 } catch (...) {
149 RTI_RoutingServiceEnvironment_set_error(
150 environment,
151 "unexpected exception");
152 }
153
154 return 0;
155 }
156
157 static void update(
158 void *native_stream_writer_data,
159 const struct RTI_RoutingServiceProperties * native_properties,
160 RTI_RoutingServiceEnvironment * environment)
161 {
162
163 StreamWriterForwarder *stream_writer_forwarder =
164 static_cast<StreamWriterForwarder*> (native_stream_writer_data);
165
166 rti::routing::detail::UpdatableEntityForwarder::update(
167 stream_writer_forwarder->stream_writer_,
168 native_properties,
169 environment);
170 }
171
172 RTI_RoutingServiceStreamWriterExt* native()
173 {
174 return &this->native_;
175 }
176
177private:
178
179 StreamWriterForwarder(
180 StreamWriter *stream_writer) :
181 stream_writer_(stream_writer)
182 {
183 RTIOsapiMemory_zero(&native_, sizeof(native_));
184 native_.stream_writer_data =
185 static_cast<void*>(this);
186 native_.write =
187 StreamWriterForwarder::write;
188 native_.update =
189 StreamWriterForwarder::update;
190
191 }
192
193 ~StreamWriterForwarder()
194 {
195 }
196
197private:
198 RTI_RoutingServiceStreamWriterExt native_;
199 StreamWriter *stream_writer_;
200 std::vector<StreamWriter::SamplePtr> sample_seq_;
201 std::vector<StreamWriter::InfoPtr> info_seq_;
202
203};
204
205}}}}
206
207#endif // RTI_ROUTING_ADAPTER_DETAIL_STREAM_WRITER_FORWARDER_HPP_