11#ifndef RTI_ROUTING_ADAPTER_DETAIL_DISCOVERY_STREAM_READER_FORWARDER_HPP_
12#define RTI_ROUTING_ADAPTER_DETAIL_DISCOVERY_STREAM_READER_FORWARDER_HPP_
14#include <rti/core/Exception.hpp>
16#include <routingservice/routingservice_adapter_new.h>
18#include <rti/routing/adapter/DiscoveryStreamReader.hpp>
19#include <rti/routing/detail/ForwarderUtils.hpp>
21namespace rti {
namespace routing {
namespace adapter {
namespace detail {
24class DiscoveryStreamReaderForwarder {
27 void *native_stream_reader_data,
28 RTI_RoutingServiceSample **sample_array,
29 RTI_RoutingServiceSampleInfo **sample_info_array,
31 RTI_RoutingServiceEnvironment *environment)
33 DiscoveryStreamReaderForwarder *forwarder =
34 static_cast<DiscoveryStreamReaderForwarder*
>(
35 native_stream_reader_data);
37 *sample_info_array = NULL;
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]);
46 }
catch (
const std::exception& ex) {
47 RTI_RoutingServiceEnvironment_set_error(
52 RTI_RoutingServiceEnvironment_set_error(
54 "unexpected exception");
59 static void return_loan(
60 void *native_stream_reader_data,
61 RTI_RoutingServiceSample *,
62 RTI_RoutingServiceSampleInfo *,
64 RTI_RoutingServiceEnvironment *environment)
66 DiscoveryStreamReaderForwarder *forwarder =
67 static_cast<DiscoveryStreamReaderForwarder*
>(
68 native_stream_reader_data);
71 forwarder->stream_reader_->return_loan(forwarder->sample_seq_);
72 }
catch (
const std::exception& ex) {
73 RTI_RoutingServiceEnvironment_set_error(
78 RTI_RoutingServiceEnvironment_set_error(
80 "unexpected exception");
83 forwarder->sample_seq_.clear();
87 DiscoveryStreamReaderForwarder(
88 DiscoveryStreamReader *stream_reader) :
89 stream_reader_(stream_reader)
91 RTIOsapiMemory_zero(&native_,
sizeof(native_));
92 native_.stream_reader_data =
93 static_cast<void *
>(
this);
95 DiscoveryStreamReaderForwarder::take;
97 DiscoveryStreamReaderForwarder::return_loan;
101 ~DiscoveryStreamReaderForwarder()
106 static DiscoveryStreamReaderForwarder* from_native(
107 RTI_RoutingServiceStreamReaderExt *native)
109 return static_cast<DiscoveryStreamReaderForwarder*
>(
110 native->stream_reader_data);
113 RTI_RoutingServiceStreamReaderExt * native()
119 RTI_RoutingServiceStreamReaderExt native_;
120 DiscoveryStreamReader *stream_reader_;
121 std::vector<StreamInfo*> sample_seq_;