RTI Routing Service Version 7.2.0
SessionForwarder.hpp
1/*
2 * (c) Copyright, Real-Time Innovations, 2017.
3 * All rights reserved.
4 *
5 * No duplications, whole or partial, manual or electronic, may be made
6 * without express written permission. Any such copies, or
7 * revisions thereof, must display this notice unaltered.
8 * This code contains trade secrets of Real-Time Innovations, Inc.
9 */
10
11#ifndef RTI_ROUTING_ADAPTER_DETAIL_SESSION_FORWARDER_HPP_
12#define RTI_ROUTING_ADAPTER_DETAIL_SESSION_FORWARDER_HPP_
13
14#include <rti/core/Exception.hpp>
15
16#include <rti/routing/adapter/Connection.hpp>
17#include <rti/routing/detail/UpdatableEntityForwarder.hpp>
18#include <rti/routing/detail/ForwarderUtils.hpp>
19
20namespace rti { namespace routing { namespace adapter { namespace detail {
21
22
23class SessionForwarder {
24public:
25 static RTI_RoutingServiceSessionExt* create_native(
26 Connection *connection,
27 const RTI_RoutingServiceProperties *native_properties,
28 RTI_RoutingServiceEnvironment *environment)
29 {
30
31 try {
32 using rti::routing::detail::ScopedForwarder;
33
34 // Set properties
35 std::map<std::string, std::string> properties;
36 rti::routing::PropertyAdapter::add_properties_from_native(
37 properties,
38 native_properties);
39
40 SessionForwarder *forwarder = new SessionForwarder();
41 ScopedForwarder<Connection, SessionForwarder> scoped(
42 connection,
43 forwarder,
44 environment);
45 // Create session: Note we don't check for NULL because a Session
46 // is not required
47 forwarder->session_ = connection->create_session(properties);
48
49 scoped.release();
50
51 // TRUST-134: the forwarder is not leaked here. It might be leaked
52 // if delete_native() were not to be called, but Routing Service
53 // will make sure that is not the case
54
55 /* coverity[leaked_storage : FALSE] */
56 return forwarder->native();
57 } catch(const std::exception& ex) {
58 RTI_RoutingServiceEnvironment_set_error(
59 environment,
60 "%s",
61 ex.what());
62 return NULL;
63 } catch (...) {
64 RTI_RoutingServiceEnvironment_set_error(
65 environment,
66 "unexpected exception");
67 return NULL;
68 }
69 }
70
71 static void delete_native(
72 Connection *connection,
73 RTI_RoutingServiceSessionExt *native_session,
74 RTI_RoutingServiceEnvironment *environment)
75 {
76 SessionForwarder *forwarder = static_cast<SessionForwarder*>(
77 native_session->session_data);
78 try {
79 // delete session
80 if (forwarder->session_ != NULL) {
81 connection->delete_session(forwarder->session_);
82 forwarder->session_ = NULL;
83 }
84
85 } catch(const std::exception& ex) {
86 RTI_RoutingServiceEnvironment_set_error(
87 environment,
88 "%s",
89 ex.what());
90 } catch (...) {
91 }
92
93 delete forwarder;
94 }
95
96 Session * session()
97 {
98 return session_;
99 }
100
101 RTI_RoutingServiceSessionExt* native()
102 {
103 return &this->native_;
104 }
105
106 static void update(
107 void *native_session_data,
108 const struct RTI_RoutingServiceProperties * native_properties,
109 RTI_RoutingServiceEnvironment * environment)
110 {
111 SessionForwarder *forwarder =
112 static_cast<SessionForwarder*> (native_session_data);
113
114 rti::routing::detail::UpdatableEntityForwarder::update(
115 forwarder->session_,
116 native_properties,
117 environment);
118 }
119
120private:
121 SessionForwarder() : session_(NULL)
122 {
123 RTIOsapiMemory_zero(&native_, sizeof(native_));
124 native_.session_data =
125 static_cast<void*>(this);
126 native_.update =
127 SessionForwarder::update;
128 }
129
130 ~SessionForwarder()
131 {
132 }
133
134private:
135 RTI_RoutingServiceSessionExt native_;
136 Session *session_;
137
138};
139
140}}}}
141
142#endif // RTI_ROUTING_ADAPTER_DETAIL_SESSION_FORWARDER_HPP_