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