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 <rti/apputils/ServiceException.hpp>
18#include <osapi/osapi_heap.h>
19#include <routingservice/routingservice_adapter_new.h>
21#include <rti/routing/adapter/detail/SessionForwarder.hpp>
22#include <rti/routing/adapter/detail/StreamReaderForwarder.hpp>
23#include <rti/routing/adapter/detail/StreamWriterForwarder.hpp>
24#include <rti/routing/adapter/detail/DiscoveryStreamReaderForwarder.hpp>
25#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
26#include <rti/routing/detail/ForwarderUtils.hpp>
28namespace rti {
namespace routing {
namespace adapter {
namespace detail {
30class ConnectionForwarder {
32 static RTI_RoutingServiceConnectionExt * create_native(
33 AdapterPlugin *adapter,
36 const RTI_RoutingServiceStreamReaderListenerExt *native_output_stream_listener,
37 const RTI_RoutingServiceStreamReaderListenerExt *native_input_stream_listener,
38 const RTI_RoutingServiceTypeInfo **,
40 const RTI_RoutingServiceProperties *native_properties,
41 RTI_RoutingServiceEnvironment *environment)
44 using rti::routing::detail::ScopedForwarder;
47 std::map<std::string, std::string> properties;
48 rti::routing::PropertyAdapter::add_properties_from_native(
52 ConnectionForwarder *forwarder =
new ConnectionForwarder(
53 native_output_stream_listener,
54 native_input_stream_listener);
55 ScopedForwarder<AdapterPlugin, ConnectionForwarder> scoped(
60 forwarder->connection_ = adapter->create_connection(
61 &forwarder->input_discovery_listener_,
62 &forwarder->output_discovery_listener_,
64 RTI_ROUTING_THROW_ON_NULL(forwarder->connection_);
67 forwarder->input_stream_discovery_forwarder_ =
68 new DiscoveryStreamReaderForwarder(
69 forwarder->connection_
70 ->input_stream_discovery_reader());
72 forwarder->output_stream_discovery_forwarder_ =
73 new DiscoveryStreamReaderForwarder(
74 forwarder->connection_
75 ->output_stream_discovery_reader());
84 return forwarder->native();
85 }
catch (
const rti::apputils::FatalServiceException& ex) {
86 RTI_RoutingServiceEnvironment_fatal_error(
90 }
catch (
const std::exception& ex) {
91 RTI_RoutingServiceEnvironment_set_error(
96 RTI_RoutingServiceEnvironment_set_error(
98 "unexpected exception");
103 static void delete_native(
104 AdapterPlugin *adapter,
105 RTI_RoutingServiceConnectionExt *native_connection,
106 RTI_RoutingServiceEnvironment *environment)
108 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
109 native_connection->connection_data);
112 delete forwarder->input_stream_discovery_forwarder_;
113 delete forwarder->output_stream_discovery_forwarder_;
116 if (forwarder->connection_ != NULL) {
117 adapter->delete_connection(forwarder->connection_);
118 forwarder->connection_ = NULL;
120 }
catch(
const rti::apputils::FatalServiceException& ex) {
121 RTI_RoutingServiceEnvironment_fatal_error(
124 }
catch(
const std::exception& ex) {
125 RTI_RoutingServiceEnvironment_set_error(
135 static RTI_RoutingServiceStreamReaderExt *
136 get_input_stream_discovery_reader(
137 void *native_connection_data,
138 RTI_RoutingServiceEnvironment *)
140 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
141 native_connection_data);
142 return forwarder->input_stream_discovery_forwarder_->native();
145 static RTI_RoutingServiceStreamReaderExt *
146 get_output_stream_discovery_reader(
147 void *native_connection_data,
148 RTI_RoutingServiceEnvironment *)
150 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
151 native_connection_data);
152 return forwarder->output_stream_discovery_forwarder_->native();
155 static RTI_RoutingServiceSessionExt * create_session(
156 void *native_connection_data,
157 const struct RTI_RoutingServiceProperties * native_properties,
158 RTI_RoutingServiceEnvironment *environment)
161 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
162 native_connection_data);
164 return SessionForwarder::create_native(
165 forwarder->connection_,
170 static void delete_session(
171 void *native_connection_data,
172 RTI_RoutingServiceSessionExt *native_session,
173 RTI_RoutingServiceEnvironment *environment)
175 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
> (
176 native_connection_data);
178 SessionForwarder::delete_native(
179 forwarder->connection_,
184 static RTI_RoutingServiceStreamReaderExt* create_stream_reader(
185 void *native_connection_data,
186 void *native_session_data,
187 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
188 const struct RTI_RoutingServiceProperties *native_properties,
189 const struct RTI_RoutingServiceStreamReaderListenerExt *native_listener,
190 RTI_RoutingServiceEnvironment *environment)
192 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
193 native_connection_data);
194 SessionForwarder *session_forwarder =
static_cast<SessionForwarder*
>(
195 native_session_data);
197 return StreamReaderForwarder::create_native(
198 forwarder->connection_,
199 session_forwarder->session(),
206 static void delete_stream_reader(
207 void *native_connection_data,
208 RTI_RoutingServiceStreamReaderExt *native_reader,
209 RTI_RoutingServiceEnvironment *environment)
211 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
212 native_connection_data);
213 StreamReaderForwarder::delete_native(
214 forwarder->connection_,
219 static RTI_RoutingServiceStreamWriterExt* create_stream_writer(
220 void *native_connection_data,
221 void *native_session_data,
222 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
223 const struct RTI_RoutingServiceProperties *native_properties,
224 const struct RTI_RoutingServiceStreamWriterListenerExt *,
225 RTI_RoutingServiceEnvironment *environment)
227 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
228 native_connection_data);
229 SessionForwarder *session_forwarder =
static_cast<SessionForwarder*
>(
230 native_session_data);
232 return StreamWriterForwarder::create_native(
233 forwarder->connection_,
234 session_forwarder->session(),
240 static void delete_stream_writer(
241 void *native_connection_data,
242 RTI_RoutingServiceStreamWriterExt *native_writer,
243 RTI_RoutingServiceEnvironment *environment)
245 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
246 native_connection_data);
247 StreamWriterForwarder::delete_native(
248 forwarder->connection_,
254 void *native_connection_data,
255 const struct RTI_RoutingServiceProperties *native_properties,
256 RTI_RoutingServiceEnvironment *environment)
258 ConnectionForwarder *forwarder =
259 static_cast<ConnectionForwarder*
> (native_connection_data);
261 rti::routing::detail::UpdatableEntityForwarder::update(
262 forwarder->connection_,
268 Connection * connection()
273 RTI_RoutingServiceConnectionExt* native()
275 return &this->native_;
278 RTI_RoutingServiceStreamReaderExt* native_input_discovery_reader()
280 return input_stream_discovery_forwarder_->native();
283 RTI_RoutingServiceStreamReaderExt* native_output_discovery_reader()
285 return output_stream_discovery_forwarder_->native();
291 const RTI_RoutingServiceStreamReaderListenerExt *native_output_stream_listener,
292 const RTI_RoutingServiceStreamReaderListenerExt *native_input_stream_listener) :
294 output_stream_discovery_forwarder_(NULL),
295 output_discovery_listener_(native_output_stream_listener),
296 input_stream_discovery_forwarder_(NULL),
297 input_discovery_listener_(native_input_stream_listener)
299 RTIOsapiMemory_zero(&native_,
sizeof(native_));
301 native_.connection_data =
static_cast<void*
>(
this);
302 native_.create_session = ConnectionForwarder::create_session;
303 native_.delete_session = ConnectionForwarder::delete_session;
304 native_.create_stream_reader =
305 ConnectionForwarder::create_stream_reader;
306 native_.delete_stream_reader =
307 ConnectionForwarder::delete_stream_reader;
308 native_.create_stream_writer =
309 ConnectionForwarder::create_stream_writer;
310 native_.delete_stream_writer =
311 ConnectionForwarder::delete_stream_writer;
312 native_.get_input_stream_discovery_reader =
313 ConnectionForwarder::get_input_stream_discovery_reader;
314 native_.get_output_stream_discovery_reader =
315 ConnectionForwarder::get_output_stream_discovery_reader;
316 native_.update = ConnectionForwarder::update;
319 ~ConnectionForwarder()
324 RTI_RoutingServiceConnectionExt native_;
325 Connection *connection_;
326 DiscoveryStreamReaderForwarder *output_stream_discovery_forwarder_;
328 DiscoveryStreamReaderForwarder *input_stream_discovery_forwarder_;
Listener representation used by StreamReader to notify RTI Routing Service when new data is available...