11#ifndef RTI_ROUTING_ADAPTER_DETAIL_STREAM_WRITER_FORWARDER_HPP_
12#define RTI_ROUTING_ADAPTER_DETAIL_STREAM_WRITER_FORWARDER_HPP_
14#include <rti/core/Exception.hpp>
16#include <rti/apputils/ServiceException.hpp>
18#include <rti/routing/adapter/StreamWriter.hpp>
19#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
20#include <rti/routing/detail/ForwarderUtils.hpp>
22namespace rti {
namespace routing {
namespace adapter {
namespace detail {
25class StreamWriterForwarder {
28 static RTI_RoutingServiceStreamWriterExt* create_native(
29 Connection *connection,
31 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
32 const struct RTI_RoutingServiceProperties *native_properties,
33 RTI_RoutingServiceEnvironment *environment)
36 using rti::routing::detail::ScopedForwarder;
38 StreamInfo stream_info(*native_stream_info);
40 std::map<std::string, std::string> properties;
41 rti::routing::PropertyAdapter::add_properties_from_native(
45 StreamWriterForwarder *forwarder =
new StreamWriterForwarder(
47 ScopedForwarder<Connection, StreamWriterForwarder> scoped(
51 forwarder->stream_writer_ = connection->create_stream_writer(
55 RTI_ROUTING_THROW_ON_NULL(forwarder->stream_writer_);
64 return forwarder->native();
65 }
catch(
const rti::apputils::FatalServiceException& ex) {
66 RTI_RoutingServiceEnvironment_fatal_error(
70 }
catch(
const std::exception& ex) {
71 RTI_RoutingServiceEnvironment_set_error(
76 RTI_RoutingServiceEnvironment_set_error(
78 "unexpected exception");
84 static void delete_native(
85 Connection *connection,
86 RTI_RoutingServiceStreamWriterExt *native_stream_writer,
87 RTI_RoutingServiceEnvironment *environment)
89 StreamWriterForwarder *stream_writer_forwarder =
90 static_cast<StreamWriterForwarder*
>(
91 native_stream_writer->stream_writer_data);
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;
98 }
catch(
const rti::apputils::FatalServiceException& ex) {
99 RTI_RoutingServiceEnvironment_fatal_error(
102 }
catch(
const std::exception& ex) {
103 RTI_RoutingServiceEnvironment_set_error(
109 delete stream_writer_forwarder;
114 void *native_stream_writer_data,
115 const RTI_RoutingServiceSample *sample_array,
116 const RTI_RoutingServiceSampleInfo *sample_info_array,
118 RTI_RoutingServiceEnvironment *environment)
121 StreamWriterForwarder *forwarder =
122 static_cast<StreamWriterForwarder*
>(native_stream_writer_data);
125 RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE(
126 forwarder->sample_seq_,
129 if (sample_info_array != NULL) {
130 RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE(
131 forwarder->info_seq_,
135 forwarder->info_seq_.clear();
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(
144 }
catch (
const std::exception& ex) {
145 RTI_RoutingServiceEnvironment_set_error(
149 RTI_RoutingServiceEnvironment_set_error(
151 "unexpected exception");
158 void *native_stream_writer_data,
159 const struct RTI_RoutingServiceProperties * native_properties,
160 RTI_RoutingServiceEnvironment * environment)
163 StreamWriterForwarder *stream_writer_forwarder =
164 static_cast<StreamWriterForwarder*
> (native_stream_writer_data);
166 rti::routing::detail::UpdatableEntityForwarder::update(
167 stream_writer_forwarder->stream_writer_,
172 RTI_RoutingServiceStreamWriterExt* native()
174 return &this->native_;
179 StreamWriterForwarder(
180 StreamWriter *stream_writer) :
181 stream_writer_(stream_writer)
183 RTIOsapiMemory_zero(&native_,
sizeof(native_));
184 native_.stream_writer_data =
185 static_cast<void*
>(
this);
187 StreamWriterForwarder::write;
189 StreamWriterForwarder::update;
193 ~StreamWriterForwarder()
198 RTI_RoutingServiceStreamWriterExt native_;
199 StreamWriter *stream_writer_;
200 std::vector<StreamWriter::SamplePtr> sample_seq_;
201 std::vector<StreamWriter::InfoPtr> info_seq_;