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 <rti/apputils/ServiceException.hpp>
18#include <routingservice/routingservice_adapter_new.h>
20#include <rti/routing/adapter/DiscoveryStreamReader.hpp>
21#include <rti/routing/detail/ForwarderUtils.hpp>
23namespace rti {
namespace routing {
namespace adapter {
namespace detail {
26class DiscoveryStreamReaderForwarder {
29 void *native_stream_reader_data,
30 RTI_RoutingServiceSample **sample_array,
31 RTI_RoutingServiceSampleInfo **sample_info_array,
33 RTI_RoutingServiceEnvironment *environment)
35 DiscoveryStreamReaderForwarder *forwarder =
36 static_cast<DiscoveryStreamReaderForwarder*
>(
37 native_stream_reader_data);
39 *sample_info_array = NULL;
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]);
48 }
catch (
const rti::apputils::FatalServiceException& ex) {
49 RTI_RoutingServiceEnvironment_fatal_error(
52 }
catch (
const std::exception& ex) {
53 RTI_RoutingServiceEnvironment_set_error(
57 RTI_RoutingServiceEnvironment_set_error(
59 "unexpected exception");
64 static void return_loan(
65 void *native_stream_reader_data,
66 RTI_RoutingServiceSample *,
67 RTI_RoutingServiceSampleInfo *,
69 RTI_RoutingServiceEnvironment *environment)
71 DiscoveryStreamReaderForwarder *forwarder =
72 static_cast<DiscoveryStreamReaderForwarder*
>(
73 native_stream_reader_data);
76 forwarder->stream_reader_->return_loan(forwarder->sample_seq_);
77 }
catch (
const rti::apputils::FatalServiceException& ex) {
78 RTI_RoutingServiceEnvironment_fatal_error(
81 }
catch (
const std::exception& ex) {
82 RTI_RoutingServiceEnvironment_set_error(
86 RTI_RoutingServiceEnvironment_set_error(
88 "unexpected exception");
91 forwarder->sample_seq_.clear();
95 DiscoveryStreamReaderForwarder(
96 DiscoveryStreamReader *stream_reader) :
97 stream_reader_(stream_reader)
99 RTIOsapiMemory_zero(&native_,
sizeof(native_));
100 native_.stream_reader_data =
101 static_cast<void *
>(
this);
103 DiscoveryStreamReaderForwarder::take;
104 native_.return_loan =
105 DiscoveryStreamReaderForwarder::return_loan;
109 ~DiscoveryStreamReaderForwarder()
114 static DiscoveryStreamReaderForwarder* from_native(
115 RTI_RoutingServiceStreamReaderExt *native)
117 return static_cast<DiscoveryStreamReaderForwarder*
>(
118 native->stream_reader_data);
121 RTI_RoutingServiceStreamReaderExt * native()
127 RTI_RoutingServiceStreamReaderExt native_;
128 DiscoveryStreamReader *stream_reader_;
129 std::vector<StreamInfo*> sample_seq_;