RTI Recording Service  Version 6.0.0
 All Data Structures Namespaces Files Functions Typedefs Enumerations Enumerator Groups
StorageStreamReaderForwarder.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_RECORDING_STORAGE_DETAIL_STORAGE_STREAM_READER_FORWARDER_HPP_
12 #define RTI_RECORDING_STORAGE_DETAIL_STORAGE_STREAM_READER_FORWARDER_HPP_
13 
14 #include <map>
15 #include <string>
16 
17 #include "log/log_common.h"
18 #include "recordingservice/recordingservice_storagereader.h"
19 
20 #include "rtiboost/smart_ptr/shared_ptr.hpp"
21 #include "rti/routing/detail/ForwarderUtils.hpp"
22 
24 #include "rti/recording/storage/StorageStreamReader.hpp"
25 #include "rti/recording/storage/SelectorState.hpp"
26 
27 namespace rti { namespace recording { namespace storage { namespace detail {
28 
35 public:
36  StorageStreamReaderDeleter(StorageReader *storage_reader_parent)
37  : storage_reader_parent_(storage_reader_parent)
38  {
39  RTIBOOST_ASSERT(storage_reader_parent != NULL);
40  }
41 
42  void operator ()(StorageStreamReader *stream_reader_instance)
43  {
44  RTIBOOST_ASSERT(stream_reader_instance != NULL);
45  storage_reader_parent_->delete_stream_reader(
46  stream_reader_instance);
47  }
48 
49 private:
50  StorageReader *storage_reader_parent_;
51 };
52 
53 class StorageStreamReaderForwarder :
54  public RTI_RecordingServiceStorageStreamReader {
55 public:
56 
57  StorageStreamReaderForwarder(
58  StorageStreamReader *stream_reader,
59  StorageReader *storage_reader_parent)
60  : storage_stream_reader_(
61  stream_reader,
62  StorageStreamReaderDeleter(storage_reader_parent))
63  {
64  read = StorageStreamReaderForwarder::read_fwd;
65  return_loan = StorageStreamReaderForwarder::return_loan_fwd;
66  finished = StorageStreamReaderForwarder::finished_fwd;
67  reset = StorageStreamReaderForwarder::reset_fwd;
68  stream_reader_data = this;
69  }
70 
71  ~StorageStreamReaderForwarder()
72  {
73  }
74 
75  static void read_fwd(
76  void *stream_reader_data,
77  RTI_RoutingServiceSample **sample_array,
78  RTI_RoutingServiceSampleInfo **sample_info_array,
79  int *array_length,
80  const struct RTI_RecordingServiceSelectorState *native_selector)
81  {
82  RTIOsapiUtility_unusedParameter(sample_array);
83  RTIOsapiUtility_unusedParameter(sample_info_array);
84  RTIOsapiUtility_unusedParameter(array_length);
85 
86  try {
87  StorageStreamReaderForwarder *forwarder =
88  static_cast<StorageStreamReaderForwarder *>(
89  stream_reader_data);
90  forwarder->storage_stream_reader_->read(
91  forwarder->sample_seq_,
92  forwarder->info_seq_,
93  SelectorState(*native_selector));
94  *array_length = forwarder->sample_seq_.size();
95  if (*array_length > 0) {
96  *sample_array = forwarder->sample_seq_.data();
97  *sample_info_array = forwarder->info_seq_.data();
98  }
99  } catch (const std::exception& ex) {
100  RTILog_printContextAndMsg(
101  RTI_FUNCTION_NAME,
102  &RTI_LOG_ANY_s,
103  ex.what());
104  } catch (...) {
105  RTILog_printContextAndMsg(
106  RTI_FUNCTION_NAME,
107  &RTI_LOG_ANY_s,
108  "unknown exception");
109  }
110  }
111 
112  static void return_loan_fwd(
113  void *stream_reader_data,
114  RTI_RoutingServiceSample *sample_array,
115  RTI_RoutingServiceSampleInfo *sample_info_array,
116  int array_length)
117  {
118  RTIOsapiUtility_unusedParameter(sample_array);
119  RTIOsapiUtility_unusedParameter(sample_info_array);
120  RTIOsapiUtility_unusedParameter(array_length);
121 
122  try {
123  StorageStreamReaderForwarder *forwarder =
124  static_cast<StorageStreamReaderForwarder *>(
125  stream_reader_data);
126  // Deleting what's inside the vectors (dynamic data objects) and any
127  // related objects is responsability of the implementation
128  forwarder->storage_stream_reader_->return_loan(
129  forwarder->sample_seq_,
130  forwarder->info_seq_);
131  // Clear our internal containers
132  forwarder->sample_seq_.clear();
133  forwarder->info_seq_.clear();
134  } catch (const std::exception& ex) {
135  RTILog_printContextAndMsg(
136  RTI_FUNCTION_NAME,
137  &RTI_LOG_ANY_s,
138  ex.what());
139  } catch (...) {
140  RTILog_printContextAndMsg(
141  RTI_FUNCTION_NAME,
142  &RTI_LOG_ANY_s,
143  "unknown exception");
144  }
145  }
146 
147  static int finished_fwd(void *stream_reader_data)
148  {
149  try {
150  StorageStreamReaderForwarder *forwarder =
151  static_cast<StorageStreamReaderForwarder *>(
152  stream_reader_data);
153  return (forwarder->storage_stream_reader_->finished() ?
154  RTI_TRUE :
155  RTI_FALSE);
156  } catch (const std::exception& ex) {
157  RTILog_printContextAndMsg(
158  RTI_FUNCTION_NAME,
159  &RTI_LOG_ANY_s,
160  ex.what());
161  } catch (...) {
162  RTILog_printContextAndMsg(
163  RTI_FUNCTION_NAME,
164  &RTI_LOG_ANY_s,
165  "unknown exception");
166  }
167  return RTI_FALSE;
168  }
169 
170  static void reset_fwd(void *stream_reader_data)
171  {
172  try {
173  StorageStreamReaderForwarder *forwarder =
174  static_cast<StorageStreamReaderForwarder *>(
175  stream_reader_data);
176  forwarder->storage_stream_reader_->reset();
177  } catch (const std::exception& ex) {
178  RTILog_printContextAndMsg(
179  RTI_FUNCTION_NAME,
180  &RTI_LOG_ANY_s,
181  ex.what());
182  } catch (...) {
183  RTILog_printContextAndMsg(
184  RTI_FUNCTION_NAME,
185  &RTI_LOG_ANY_s,
186  "unknown exception");
187  }
188  }
189 
190  StorageStreamReader * stream_reader()
191  {
192  return storage_stream_reader_.get();
193  }
194 
195 private:
196  rtiboost::shared_ptr<StorageStreamReader> storage_stream_reader_;
197 
198  std::vector<StorageStreamReader::SamplePtr> sample_seq_;
199  std::vector<StorageStreamReader::InfoPtr> info_seq_;
200 
201 };
202 
203 } } } } // rti::recording::storage::detail
204 
205 #endif // RTI_RECORDING_STORAGE_DETAIL_STORAGE_STREAM_READER_FORWARDER_HPP_

RTI Recording Service Version 6.0.0 Copyright © Sun Mar 3 2019 Real-Time Innovations, Inc