RTI Routing Service Version 7.7.0
DiscoveryStreamReaderForwarder.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_DISCOVERY_STREAM_READER_FORWARDER_HPP_
12#define RTI_ROUTING_ADAPTER_DETAIL_DISCOVERY_STREAM_READER_FORWARDER_HPP_
13
14#include <rti/core/Exception.hpp>
15
16#include <rti/apputils/ServiceException.hpp>
17
18#include <routingservice/routingservice_adapter_new.h>
19
20#include <rti/routing/adapter/DiscoveryStreamReader.hpp>
21#include <rti/routing/detail/ForwarderUtils.hpp>
22
23namespace rti { namespace routing { namespace adapter { namespace detail {
24
25
26class DiscoveryStreamReaderForwarder {
27public:
28 static void take(
29 void *native_stream_reader_data,
30 RTI_RoutingServiceSample **sample_array,
31 RTI_RoutingServiceSampleInfo **sample_info_array,
32 int *array_length,
33 RTI_RoutingServiceEnvironment *environment)
34 {
35 DiscoveryStreamReaderForwarder *forwarder =
36 static_cast<DiscoveryStreamReaderForwarder*>(
37 native_stream_reader_data);
38
39 *sample_info_array = NULL;
40 *array_length = 0;
41 try {
42 forwarder->stream_reader_->take(forwarder->sample_seq_);
43 *array_length = static_cast<int>(forwarder->sample_seq_.size());
44 if (*array_length > 0) {
45 *sample_array = reinterpret_cast<RTI_RoutingServiceSample*> (
46 &forwarder->sample_seq_[0]);
47 }
48 } catch (const rti::apputils::FatalServiceException& ex) {
49 RTI_RoutingServiceEnvironment_fatal_error(
50 environment,
51 ex.what());
52 } catch (const std::exception& ex) {
53 RTI_RoutingServiceEnvironment_set_error(
54 environment,
55 ex.what());
56 } catch (...) {
57 RTI_RoutingServiceEnvironment_set_error(
58 environment,
59 "unexpected exception");
60 }
61
62 }
63
64 static void return_loan(
65 void *native_stream_reader_data,
66 RTI_RoutingServiceSample *,
67 RTI_RoutingServiceSampleInfo *,
68 int,
69 RTI_RoutingServiceEnvironment *environment)
70 {
71 DiscoveryStreamReaderForwarder *forwarder =
72 static_cast<DiscoveryStreamReaderForwarder*>(
73 native_stream_reader_data);
74
75 try {
76 forwarder->stream_reader_->return_loan(forwarder->sample_seq_);
77 } catch (const rti::apputils::FatalServiceException& ex) {
78 RTI_RoutingServiceEnvironment_fatal_error(
79 environment,
80 ex.what());
81 } catch (const std::exception& ex) {
82 RTI_RoutingServiceEnvironment_set_error(
83 environment,
84 ex.what());
85 } catch (...) {
86 RTI_RoutingServiceEnvironment_set_error(
87 environment,
88 "unexpected exception");
89 return;
90 }
91 forwarder->sample_seq_.clear();
92 }
93
94
95 DiscoveryStreamReaderForwarder(
96 DiscoveryStreamReader *stream_reader) :
97 stream_reader_(stream_reader)
98 {
99 RTIOsapiMemory_zero(&native_, sizeof(native_));
100 native_.stream_reader_data =
101 static_cast<void *>(this);
102 native_.take =
103 DiscoveryStreamReaderForwarder::take;
104 native_.return_loan =
105 DiscoveryStreamReaderForwarder::return_loan;
106 }
107
108
109 ~DiscoveryStreamReaderForwarder()
110 {
111 }
112
113
114 static DiscoveryStreamReaderForwarder* from_native(
115 RTI_RoutingServiceStreamReaderExt *native)
116 {
117 return static_cast<DiscoveryStreamReaderForwarder*>(
118 native->stream_reader_data);
119 }
120
121 RTI_RoutingServiceStreamReaderExt * native()
122 {
123 return &native_;
124 }
125
126private:
127 RTI_RoutingServiceStreamReaderExt native_;
128 DiscoveryStreamReader *stream_reader_;
129 std::vector<StreamInfo*> sample_seq_;
130};
131
132}}}}
133
134#endif // RTI_ROUTING_ADAPTER_DETAIL_DISCOVERY_STREAM_READER_FORWARDER_HPP_