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/routing/adapter/StreamWriter.hpp>
17#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
18#include <rti/routing/detail/ForwarderUtils.hpp>
20namespace rti {
namespace routing {
namespace adapter {
namespace detail {
23class StreamWriterForwarder {
26 static RTI_RoutingServiceStreamWriterExt* create_native(
27 Connection *connection,
29 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
30 const struct RTI_RoutingServiceProperties *native_properties,
31 RTI_RoutingServiceEnvironment *environment)
34 using rti::routing::detail::ScopedForwarder;
36 StreamInfo stream_info(*native_stream_info);
38 std::map<std::string, std::string> properties;
39 rti::routing::PropertyAdapter::add_properties_from_native(
43 StreamWriterForwarder *forwarder =
new StreamWriterForwarder(
45 ScopedForwarder<Connection, StreamWriterForwarder> scoped(
49 forwarder->stream_writer_ = connection->create_stream_writer(
53 RTI_ROUTING_THROW_ON_NULL(forwarder->stream_writer_);
62 return forwarder->native();
63 }
catch(
const std::exception& ex) {
64 RTI_RoutingServiceEnvironment_set_error(
70 RTI_RoutingServiceEnvironment_set_error(
72 "unexpected exception");
78 static void delete_native(
79 Connection *connection,
80 RTI_RoutingServiceStreamWriterExt *native_stream_writer,
81 RTI_RoutingServiceEnvironment *environment)
83 StreamWriterForwarder *stream_writer_forwarder =
84 static_cast<StreamWriterForwarder*
>(
85 native_stream_writer->stream_writer_data);
87 if (stream_writer_forwarder->stream_writer_ != NULL) {
88 connection->delete_stream_writer(
89 stream_writer_forwarder->stream_writer_);
90 stream_writer_forwarder->stream_writer_ = NULL;
92 }
catch(
const std::exception& ex) {
93 RTI_RoutingServiceEnvironment_set_error(
100 delete stream_writer_forwarder;
105 void *native_stream_writer_data,
106 const RTI_RoutingServiceSample *sample_array,
107 const RTI_RoutingServiceSampleInfo *sample_info_array,
109 RTI_RoutingServiceEnvironment *environment)
112 StreamWriterForwarder *forwarder =
113 static_cast<StreamWriterForwarder*
>(native_stream_writer_data);
116 RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE(
117 forwarder->sample_seq_,
120 if (sample_info_array != NULL) {
121 RTI_ROUTING_SAMPLE_VECTOR_COPY_FROM_NATIVE(
122 forwarder->info_seq_,
126 forwarder->info_seq_.clear();
128 return forwarder->stream_writer_->write(
129 forwarder->sample_seq_,
130 forwarder->info_seq_);
131 }
catch (
const std::exception& ex) {
132 RTI_RoutingServiceEnvironment_set_error(
137 RTI_RoutingServiceEnvironment_set_error(
139 "unexpected exception");
146 void *native_stream_writer_data,
147 const struct RTI_RoutingServiceProperties * native_properties,
148 RTI_RoutingServiceEnvironment * environment)
151 StreamWriterForwarder *stream_writer_forwarder =
152 static_cast<StreamWriterForwarder*
> (native_stream_writer_data);
154 rti::routing::detail::UpdatableEntityForwarder::update(
155 stream_writer_forwarder->stream_writer_,
160 RTI_RoutingServiceStreamWriterExt* native()
162 return &this->native_;
167 StreamWriterForwarder(
168 StreamWriter *stream_writer) :
169 stream_writer_(stream_writer)
171 RTIOsapiMemory_zero(&native_,
sizeof(native_));
172 native_.stream_writer_data =
173 static_cast<void*
>(
this);
175 StreamWriterForwarder::write;
177 StreamWriterForwarder::update;
181 ~StreamWriterForwarder()
186 RTI_RoutingServiceStreamWriterExt native_;
187 StreamWriter *stream_writer_;
188 std::vector<StreamWriter::SamplePtr> sample_seq_;
189 std::vector<StreamWriter::InfoPtr> info_seq_;