11#ifndef RTI_ROUTING_ADAPTER_DETAIL_CONNECTION_FORWARDER_HPP_
12#define RTI_ROUTING_ADAPTER_DETAIL_CONNECTION_FORWARDER_HPP_
14#include <rti/core/Exception.hpp>
16#include <osapi/osapi_heap.h>
17#include <routingservice/routingservice_adapter_new.h>
19#include <rti/routing/adapter/detail/SessionForwarder.hpp>
20#include <rti/routing/adapter/detail/StreamReaderForwarder.hpp>
21#include <rti/routing/adapter/detail/StreamWriterForwarder.hpp>
22#include <rti/routing/adapter/detail/DiscoveryStreamReaderForwarder.hpp>
23#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
24#include <rti/routing/detail/ForwarderUtils.hpp>
26namespace rti {
namespace routing {
namespace adapter {
namespace detail {
28class ConnectionForwarder {
30 static RTI_RoutingServiceConnectionExt * create_native(
31 AdapterPlugin *adapter,
34 const RTI_RoutingServiceStreamReaderListenerExt *native_output_stream_listener,
35 const RTI_RoutingServiceStreamReaderListenerExt *native_input_stream_listener,
36 const RTI_RoutingServiceTypeInfo **,
38 const RTI_RoutingServiceProperties *native_properties,
39 RTI_RoutingServiceEnvironment *environment)
42 using rti::routing::detail::ScopedForwarder;
45 std::map<std::string, std::string> properties;
46 rti::routing::PropertyAdapter::add_properties_from_native(
50 ConnectionForwarder *forwarder =
new ConnectionForwarder(
51 native_output_stream_listener,
52 native_input_stream_listener);
53 ScopedForwarder<AdapterPlugin, ConnectionForwarder> scoped(
58 forwarder->connection_ = adapter->create_connection(
59 &forwarder->input_discovery_listener_,
60 &forwarder->output_discovery_listener_,
62 RTI_ROUTING_THROW_ON_NULL(forwarder->connection_);
65 forwarder->input_stream_discovery_forwarder_ =
66 new DiscoveryStreamReaderForwarder(
67 forwarder->connection_
68 ->input_stream_discovery_reader());
70 forwarder->output_stream_discovery_forwarder_ =
71 new DiscoveryStreamReaderForwarder(
72 forwarder->connection_
73 ->output_stream_discovery_reader());
82 return forwarder->native();
83 }
catch (
const std::exception& ex) {
84 RTI_RoutingServiceEnvironment_set_error(
90 RTI_RoutingServiceEnvironment_set_error(
92 "unexpected exception");
97 static void delete_native(
98 AdapterPlugin *adapter,
99 RTI_RoutingServiceConnectionExt *native_connection,
100 RTI_RoutingServiceEnvironment *environment)
102 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
103 native_connection->connection_data);
106 delete forwarder->input_stream_discovery_forwarder_;
107 delete forwarder->output_stream_discovery_forwarder_;
110 if (forwarder->connection_ != NULL) {
111 adapter->delete_connection(forwarder->connection_);
112 forwarder->connection_ = NULL;
114 }
catch(
const std::exception& ex) {
115 RTI_RoutingServiceEnvironment_set_error(
126 static RTI_RoutingServiceStreamReaderExt *
127 get_input_stream_discovery_reader(
128 void *native_connection_data,
129 RTI_RoutingServiceEnvironment *)
131 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
132 native_connection_data);
133 return forwarder->input_stream_discovery_forwarder_->native();
136 static RTI_RoutingServiceStreamReaderExt *
137 get_output_stream_discovery_reader(
138 void *native_connection_data,
139 RTI_RoutingServiceEnvironment *)
141 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
142 native_connection_data);
143 return forwarder->output_stream_discovery_forwarder_->native();
146 static RTI_RoutingServiceSessionExt * create_session(
147 void *native_connection_data,
148 const struct RTI_RoutingServiceProperties * native_properties,
149 RTI_RoutingServiceEnvironment *environment)
152 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
153 native_connection_data);
155 return SessionForwarder::create_native(
156 forwarder->connection_,
161 static void delete_session(
162 void *native_connection_data,
163 RTI_RoutingServiceSessionExt *native_session,
164 RTI_RoutingServiceEnvironment *environment)
166 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
> (
167 native_connection_data);
169 SessionForwarder::delete_native(
170 forwarder->connection_,
175 static RTI_RoutingServiceStreamReaderExt* create_stream_reader(
176 void *native_connection_data,
177 void *native_session_data,
178 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
179 const struct RTI_RoutingServiceProperties *native_properties,
180 const struct RTI_RoutingServiceStreamReaderListenerExt *native_listener,
181 RTI_RoutingServiceEnvironment *environment)
183 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
184 native_connection_data);
185 SessionForwarder *session_forwarder =
static_cast<SessionForwarder*
>(
186 native_session_data);
188 return StreamReaderForwarder::create_native(
189 forwarder->connection_,
190 session_forwarder->session(),
197 static void delete_stream_reader(
198 void *native_connection_data,
199 RTI_RoutingServiceStreamReaderExt *native_reader,
200 RTI_RoutingServiceEnvironment *environment)
202 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
203 native_connection_data);
204 StreamReaderForwarder::delete_native(
205 forwarder->connection_,
210 static RTI_RoutingServiceStreamWriterExt* create_stream_writer(
211 void *native_connection_data,
212 void *native_session_data,
213 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
214 const struct RTI_RoutingServiceProperties *native_properties,
215 const struct RTI_RoutingServiceStreamWriterListenerExt *,
216 RTI_RoutingServiceEnvironment *environment)
218 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
219 native_connection_data);
220 SessionForwarder *session_forwarder =
static_cast<SessionForwarder*
>(
221 native_session_data);
223 return StreamWriterForwarder::create_native(
224 forwarder->connection_,
225 session_forwarder->session(),
231 static void delete_stream_writer(
232 void *native_connection_data,
233 RTI_RoutingServiceStreamWriterExt *native_writer,
234 RTI_RoutingServiceEnvironment *environment)
236 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
237 native_connection_data);
238 StreamWriterForwarder::delete_native(
239 forwarder->connection_,
245 void *native_connection_data,
246 const struct RTI_RoutingServiceProperties *native_properties,
247 RTI_RoutingServiceEnvironment *environment)
249 ConnectionForwarder *forwarder =
250 static_cast<ConnectionForwarder*
> (native_connection_data);
252 rti::routing::detail::UpdatableEntityForwarder::update(
253 forwarder->connection_,
259 Connection * connection()
264 RTI_RoutingServiceConnectionExt* native()
266 return &this->native_;
269 RTI_RoutingServiceStreamReaderExt* native_input_discovery_reader()
271 return input_stream_discovery_forwarder_->native();
274 RTI_RoutingServiceStreamReaderExt* native_output_discovery_reader()
276 return output_stream_discovery_forwarder_->native();
282 const RTI_RoutingServiceStreamReaderListenerExt *native_output_stream_listener,
283 const RTI_RoutingServiceStreamReaderListenerExt *native_input_stream_listener) :
285 output_stream_discovery_forwarder_(NULL),
286 output_discovery_listener_(native_output_stream_listener),
287 input_stream_discovery_forwarder_(NULL),
288 input_discovery_listener_(native_input_stream_listener)
290 RTIOsapiMemory_zero(&native_,
sizeof(native_));
292 native_.connection_data =
static_cast<void*
>(
this);
293 native_.create_session = ConnectionForwarder::create_session;
294 native_.delete_session = ConnectionForwarder::delete_session;
295 native_.create_stream_reader =
296 ConnectionForwarder::create_stream_reader;
297 native_.delete_stream_reader =
298 ConnectionForwarder::delete_stream_reader;
299 native_.create_stream_writer =
300 ConnectionForwarder::create_stream_writer;
301 native_.delete_stream_writer =
302 ConnectionForwarder::delete_stream_writer;
303 native_.get_input_stream_discovery_reader =
304 ConnectionForwarder::get_input_stream_discovery_reader;
305 native_.get_output_stream_discovery_reader =
306 ConnectionForwarder::get_output_stream_discovery_reader;
307 native_.update = ConnectionForwarder::update;
310 ~ConnectionForwarder()
315 RTI_RoutingServiceConnectionExt native_;
316 Connection *connection_;
317 DiscoveryStreamReaderForwarder *output_stream_discovery_forwarder_;
319 DiscoveryStreamReaderForwarder *input_stream_discovery_forwarder_;
Listener representation used by StreamReader to notify RTI Routing Service when new data is available...