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>
20#include <rti/routing/adapter/detail/SessionForwarder.hpp>
21#include <rti/routing/adapter/detail/StreamReaderForwarder.hpp>
22#include <rti/routing/adapter/detail/StreamWriterForwarder.hpp>
23#include <rti/routing/adapter/detail/DiscoveryStreamReaderForwarder.hpp>
24#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
25#include <rti/routing/detail/ForwarderUtils.hpp>
27namespace rti {
namespace routing {
namespace adapter {
namespace detail {
29class ConnectionForwarder {
31 static RTI_RoutingServiceConnectionExt * create_native(
32 AdapterPlugin *adapter,
35 const RTI_RoutingServiceStreamReaderListenerExt *native_output_stream_listener,
36 const RTI_RoutingServiceStreamReaderListenerExt *native_input_stream_listener,
37 const RTI_RoutingServiceTypeInfo **,
39 const RTI_RoutingServiceProperties *native_properties,
40 RTI_RoutingServiceEnvironment *environment)
43 using rti::routing::detail::ScopedForwarder;
46 std::map<std::string, std::string> properties;
47 rti::routing::PropertyAdapter::add_properties_from_native(
51 ConnectionForwarder *forwarder =
new ConnectionForwarder(
52 native_output_stream_listener,
53 native_input_stream_listener);
54 ScopedForwarder<AdapterPlugin, ConnectionForwarder> scoped(
59 forwarder->connection_ = adapter->create_connection(
60 &forwarder->input_discovery_listener_,
61 &forwarder->output_discovery_listener_,
63 RTI_ROUTING_THROW_ON_NULL(forwarder->connection_);
66 forwarder->input_stream_discovery_forwarder_ =
67 new DiscoveryStreamReaderForwarder(
68 forwarder->connection_
69 ->input_stream_discovery_reader());
71 forwarder->output_stream_discovery_forwarder_ =
72 new DiscoveryStreamReaderForwarder(
73 forwarder->connection_
74 ->output_stream_discovery_reader());
83 return forwarder->native();
84 }
catch (
const std::exception& ex) {
85 RTI_RoutingServiceEnvironment_set_error(
91 RTI_RoutingServiceEnvironment_set_error(
93 "unexpected exception");
98 static void delete_native(
99 AdapterPlugin *adapter,
100 RTI_RoutingServiceConnectionExt *native_connection,
101 RTI_RoutingServiceEnvironment *environment)
103 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
104 native_connection->connection_data);
107 delete forwarder->input_stream_discovery_forwarder_;
108 delete forwarder->output_stream_discovery_forwarder_;
111 if (forwarder->connection_ != NULL) {
112 adapter->delete_connection(forwarder->connection_);
113 forwarder->connection_ = NULL;
115 }
catch(
const std::exception& ex) {
116 RTI_RoutingServiceEnvironment_set_error(
127 static RTI_RoutingServiceStreamReaderExt *
128 get_input_stream_discovery_reader(
129 void *native_connection_data,
130 RTI_RoutingServiceEnvironment *)
132 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
133 native_connection_data);
134 return forwarder->input_stream_discovery_forwarder_->native();
137 static RTI_RoutingServiceStreamReaderExt *
138 get_output_stream_discovery_reader(
139 void *native_connection_data,
140 RTI_RoutingServiceEnvironment *)
142 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
143 native_connection_data);
144 return forwarder->output_stream_discovery_forwarder_->native();
147 static RTI_RoutingServiceSessionExt * create_session(
148 void *native_connection_data,
149 const struct RTI_RoutingServiceProperties * native_properties,
150 RTI_RoutingServiceEnvironment *environment)
153 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
154 native_connection_data);
156 return SessionForwarder::create_native(
157 forwarder->connection_,
162 static void delete_session(
163 void *native_connection_data,
164 RTI_RoutingServiceSessionExt *native_session,
165 RTI_RoutingServiceEnvironment *environment)
167 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
> (
168 native_connection_data);
170 SessionForwarder::delete_native(
171 forwarder->connection_,
176 static RTI_RoutingServiceStreamReaderExt* create_stream_reader(
177 void *native_connection_data,
178 void *native_session_data,
179 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
180 const struct RTI_RoutingServiceProperties *native_properties,
181 const struct RTI_RoutingServiceStreamReaderListenerExt *native_listener,
182 RTI_RoutingServiceEnvironment *environment)
184 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
185 native_connection_data);
186 SessionForwarder *session_forwarder =
static_cast<SessionForwarder*
>(
187 native_session_data);
189 return StreamReaderForwarder::create_native(
190 forwarder->connection_,
191 session_forwarder->session(),
198 static void delete_stream_reader(
199 void *native_connection_data,
200 RTI_RoutingServiceStreamReaderExt *native_reader,
201 RTI_RoutingServiceEnvironment *environment)
203 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
204 native_connection_data);
205 StreamReaderForwarder::delete_native(
206 forwarder->connection_,
211 static RTI_RoutingServiceStreamWriterExt* create_stream_writer(
212 void *native_connection_data,
213 void *native_session_data,
214 const struct RTI_RoutingServiceStreamInfo *native_stream_info,
215 const struct RTI_RoutingServiceProperties *native_properties,
216 const struct RTI_RoutingServiceStreamWriterListenerExt *,
217 RTI_RoutingServiceEnvironment *environment)
219 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
220 native_connection_data);
221 SessionForwarder *session_forwarder =
static_cast<SessionForwarder*
>(
222 native_session_data);
224 return StreamWriterForwarder::create_native(
225 forwarder->connection_,
226 session_forwarder->session(),
232 static void delete_stream_writer(
233 void *native_connection_data,
234 RTI_RoutingServiceStreamWriterExt *native_writer,
235 RTI_RoutingServiceEnvironment *environment)
237 ConnectionForwarder *forwarder =
static_cast<ConnectionForwarder*
>(
238 native_connection_data);
239 StreamWriterForwarder::delete_native(
240 forwarder->connection_,
246 void *native_connection_data,
247 const struct RTI_RoutingServiceProperties *native_properties,
248 RTI_RoutingServiceEnvironment *environment)
250 ConnectionForwarder *forwarder =
251 static_cast<ConnectionForwarder*
> (native_connection_data);
253 rti::routing::detail::UpdatableEntityForwarder::update(
254 forwarder->connection_,
260 Connection * connection()
265 RTI_RoutingServiceConnectionExt* native()
267 return &this->native_;
270 RTI_RoutingServiceStreamReaderExt* native_input_discovery_reader()
272 return input_stream_discovery_forwarder_->native();
275 RTI_RoutingServiceStreamReaderExt* native_output_discovery_reader()
277 return output_stream_discovery_forwarder_->native();
283 const RTI_RoutingServiceStreamReaderListenerExt *native_output_stream_listener,
284 const RTI_RoutingServiceStreamReaderListenerExt *native_input_stream_listener) :
286 output_stream_discovery_forwarder_(NULL),
287 output_discovery_listener_(native_output_stream_listener),
288 input_stream_discovery_forwarder_(NULL),
289 input_discovery_listener_(native_input_stream_listener)
291 RTIOsapiMemory_zero(&native_,
sizeof(native_));
293 native_.connection_data =
static_cast<void*
>(
this);
294 native_.create_session = ConnectionForwarder::create_session;
295 native_.delete_session = ConnectionForwarder::delete_session;
296 native_.create_stream_reader =
297 ConnectionForwarder::create_stream_reader;
298 native_.delete_stream_reader =
299 ConnectionForwarder::delete_stream_reader;
300 native_.create_stream_writer =
301 ConnectionForwarder::create_stream_writer;
302 native_.delete_stream_writer =
303 ConnectionForwarder::delete_stream_writer;
304 native_.get_input_stream_discovery_reader =
305 ConnectionForwarder::get_input_stream_discovery_reader;
306 native_.get_output_stream_discovery_reader =
307 ConnectionForwarder::get_output_stream_discovery_reader;
308 native_.update = ConnectionForwarder::update;
311 ~ConnectionForwarder()
316 RTI_RoutingServiceConnectionExt native_;
317 Connection *connection_;
318 DiscoveryStreamReaderForwarder *output_stream_discovery_forwarder_;
320 DiscoveryStreamReaderForwarder *input_stream_discovery_forwarder_;
RTI Routing Service C++ Adapter API.
Listener representation used by StreamReader to notify RTI Routing Service when new data is available...