11 #ifndef RTI_ROUTING_ENTITY_LISTENER_HPP_
12 #define RTI_ROUTING_ENTITY_LISTENER_HPP_
14 #include "routingservice/routingservice_service_impl.h"
16 #include <rti/service/ServiceException.hpp>
17 #include <rti/service/log/LogConfig.hpp>
18 #include <rti/routing/StreamInfo.hpp>
20 namespace rti {
namespace routing {
24 struct EntityKind_def {
29 SERVICE = RTI_ROUTING_SERVICE_SERVICE_ENTITY,
30 DOMAIN_ROUTE = RTI_ROUTING_SERVICE_DOMAIN_ROUTE_ENTITY,
31 CONNECTION = RTI_ROUTING_SERVICE_CONNECTION_ENTITY,
32 SESSION = RTI_ROUTING_SERVICE_SESSION_ENTITY,
33 AUTO_TOPIC_ROUTE = RTI_ROUTING_SERVICE_AUTO_TOPIC_ROUTE_ENTITY,
34 TOPIC_ROUTE = RTI_ROUTING_SERVICE_TOPIC_ROUTE_ENTITY,
35 INPUT = RTI_ROUTING_SERVICE_INPUT_ENTITY,
36 OUTPUT = RTI_ROUTING_SERVICE_OUTPUT_ENTITY,
44 typedef dds::core::safe_enum<EntityKind_def> EntityKind;
49 struct EntityStateKind_def {
54 INVALID = RTI_SERVICE_INVALID_ENTITY_STATE,
55 ENABLED = RTI_SERVICE_ENABLED_ENTITY_STATE,
56 DISABLED = RTI_SERVICE_DISABLED_ENTITY_STATE,
57 STARTED = RTI_SERVICE_STARTED_ENTITY_STATE,
58 STOPPED = RTI_SERVICE_STOPPED_ENTITY_STATE,
59 RUNNING = RTI_SERVICE_RUNNING_ENTITY_STATE,
60 PAUSED = RTI_SERVICE_PAUSED_ENTITY_STATE
65 typedef dds::core::safe_enum<EntityStateKind_def> EntityStateKind;
71 const std::string to_string(
const rti::routing::EntityStateKind& kind)
73 static const char * ENTITY_STATE_KIND_AS_STRING[] = {
83 return ENTITY_STATE_KIND_AS_STRING[kind.underlying()];
87 const char* to_action_native_string(
const rti::routing::EntityStateKind& kind)
89 static const char * ENTITY_STATE_ACTION_AS_STRING[] = {
100 return ENTITY_STATE_ACTION_AS_STRING[kind.underlying()];
104 const std::string to_action_string(
const rti::routing::EntityStateKind& kind)
106 return to_action_native_string(kind);
109 class EntityListener {
115 friend EntityListener::Context from_native(
116 const RTI_RoutingServiceEntityListenerContext*);
118 const rti::routing::EntityKind& entity_kind()
const
123 const std::string& entity_name()
const
128 const rti::routing::EntityStateKind& entity_state_kind()
const
130 return entity_state_kind_;
139 rti::routing::EntityKind entity_kind_;
140 std::string entity_name_;
141 rti::routing::EntityStateKind entity_state_kind_;
145 virtual void on_before_create(
146 const EntityListener::Context&)
150 virtual void on_after_create(
151 const EntityListener::Context&)
155 virtual void on_before_state_change(
156 const EntityListener::Context&)
160 virtual void on_after_state_change(
161 const EntityListener::Context&)
165 virtual void on_before_delete(
166 const EntityListener::Context&)
170 virtual void on_after_delete(
171 const EntityListener::Context&)
175 virtual void on_before_stream_event(
176 const EntityListener::Context&,
181 virtual void on_after_stream_event(
182 const EntityListener::Context&,
187 virtual ~EntityListener() {}
192 EntityListener::Context from_native(
193 const RTI_RoutingServiceEntityListenerContext *native)
195 EntityListener::Context context;
196 context.entity_kind_ =
static_cast<EntityKind::type
> (
197 native->entity_kind);
198 context.entity_name_ = native->entity_name;
199 context.entity_state_kind_ =
static_cast<EntityStateKind::type
> (
200 native->entity_state_kind);
201 context.ok_ = native->ok ?
true :
false;
206 class EntityListenerForwarder {
209 typedef RTI_RoutingServiceEntityListener native;
211 static native create(
212 EntityListener *listener)
214 native native_listener = RTI_RoutingServiceEntityListener_INITIALIZER;
215 native_listener.on_before_create =
216 on_before_create_forwarder;
217 native_listener.on_after_create =
218 on_after_create_forwarder;
219 native_listener.on_before_state_change =
220 on_before_state_change_forwarder;
221 native_listener.on_after_state_change =
222 on_after_state_change_forwarder;
223 native_listener.on_before_delete =
224 on_before_delete_forwarder;
225 native_listener.on_after_delete =
226 on_after_delete_forwarder;
227 native_listener.on_before_stream_event =
228 on_before_stream_event_forwarder;
229 native_listener.on_after_stream_event =
230 on_after_stream_event_forwarder;
231 native_listener.listener_data =
static_cast<void*
>(listener);
233 return native_listener;
237 static void on_before_create_forwarder(
239 const RTI_RoutingServiceEntityListenerContext *context)
241 EntityListener *listener =
242 static_cast<EntityListener *
>(listener_data);
244 listener->on_before_create(rti::routing::from_native(context));
245 }
catch (rti::service::ServiceException& ex) {
246 SERVICELog_fromException(ex);
247 }
catch (std::exception& ex) {
248 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
250 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
253 static void on_after_create_forwarder(
255 const RTI_RoutingServiceEntityListenerContext *context)
257 EntityListener *listener =
258 static_cast<EntityListener *
>(listener_data);
260 listener->on_after_create(rti::routing::from_native(context));
261 }
catch (rti::service::ServiceException& ex) {
262 SERVICELog_fromException(ex);
263 }
catch (std::exception& ex) {
264 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
266 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
270 static void on_before_state_change_forwarder(
272 const RTI_RoutingServiceEntityListenerContext *context)
274 EntityListener *listener =
275 static_cast<EntityListener *
>(listener_data);
277 listener->on_before_state_change(rti::routing::from_native(context));
278 }
catch (rti::service::ServiceException& ex) {
279 SERVICELog_fromException(ex);
280 }
catch (std::exception& ex) {
281 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
283 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
287 static void on_after_state_change_forwarder(
289 const RTI_RoutingServiceEntityListenerContext *context)
291 EntityListener *listener =
292 static_cast<EntityListener *
>(listener_data);
294 listener->on_after_state_change(rti::routing::from_native(context));
295 }
catch (rti::service::ServiceException& ex) {
296 SERVICELog_fromException(ex);
297 }
catch (std::exception& ex) {
298 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
300 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
304 static void on_before_delete_forwarder(
306 const RTI_RoutingServiceEntityListenerContext *context)
308 EntityListener *listener =
309 static_cast<EntityListener *
>(listener_data);
311 listener->on_before_delete(rti::routing::from_native(context));
312 }
catch (rti::service::ServiceException& ex) {
313 SERVICELog_fromException(ex);
314 }
catch (std::exception& ex) {
315 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
317 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
321 static void on_after_delete_forwarder(
323 const RTI_RoutingServiceEntityListenerContext *context)
325 EntityListener *listener =
326 static_cast<EntityListener *
>(listener_data);
328 listener->on_after_delete(rti::routing::from_native(context));
329 }
catch (rti::service::ServiceException& ex) {
330 SERVICELog_fromException(ex);
331 }
catch (std::exception& ex) {
332 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
334 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
338 static void on_before_stream_event_forwarder(
340 const RTI_RoutingServiceEntityListenerContext *context,
341 const RTI_RoutingServiceStreamInfo *stream_info)
343 EntityListener *listener =
344 static_cast<EntityListener *
>(listener_data);
346 listener->on_before_stream_event(
347 rti::routing::from_native(context),
349 }
catch (rti::service::ServiceException& ex) {
350 SERVICELog_fromException(ex);
351 }
catch (std::exception& ex) {
352 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
354 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
358 static void on_after_stream_event_forwarder(
360 const RTI_RoutingServiceEntityListenerContext *context,
361 const RTI_RoutingServiceStreamInfo *stream_info)
363 EntityListener *listener =
364 static_cast<EntityListener *
>(listener_data);
366 listener->on_after_stream_event(
367 rti::routing::from_native(context),
369 }
catch (rti::service::ServiceException& ex) {
370 SERVICELog_fromException(ex);
371 }
catch (std::exception& ex) {
372 SERVICELog_exception(&RTI_LOG_ANY_s, ex.what());
374 SERVICELog_exception(&RTI_LOG_UNEXPECTED_EXCEPTION);
385 #endif // RTI_ROUTING_ENTITY_LISTENER_HPP_