RTI Recording Service  Version 6.0.1
 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  try {
83  StorageStreamReaderForwarder *forwarder =
84  static_cast<StorageStreamReaderForwarder *>(
85  stream_reader_data);
86  forwarder->storage_stream_reader_->read(
87  forwarder->sample_seq_,
88  forwarder->info_seq_,
89  SelectorState(*native_selector));
90  *array_length = forwarder->sample_seq_.size();
91  if (*array_length > 0) {
92  *sample_array = forwarder->sample_seq_.data();
93  *sample_info_array = forwarder->info_seq_.data();
94  }
95  } catch (const std::exception& ex) {
96  RTILog_printContextAndMsg(
97  RTI_LOG_BIT_EXCEPTION,
98  RTI_FUNCTION_NAME,
99  &RTI_LOG_ANY_s,
100  ex.what());
101  } catch (...) {
102  RTILog_printContextAndMsg(
103  RTI_LOG_BIT_EXCEPTION,
104  RTI_FUNCTION_NAME,
105  &RTI_LOG_ANY_s,
106  "unknown exception");
107  }
108  }
109 
110  static void return_loan_fwd(
111  void *stream_reader_data,
112  RTI_RoutingServiceSample *sample_array,
113  RTI_RoutingServiceSampleInfo *sample_info_array,
114  int array_length)
115  {
116  RTIOsapiUtility_unusedParameter(sample_array);
117  RTIOsapiUtility_unusedParameter(sample_info_array);
118  RTIOsapiUtility_unusedParameter(array_length);
119 
120  try {
121  StorageStreamReaderForwarder *forwarder =
122  static_cast<StorageStreamReaderForwarder *>(
123  stream_reader_data);
124  // Deleting what's inside the vectors (dynamic data objects) and any
125  // related objects is responsability of the implementation
126  forwarder->storage_stream_reader_->return_loan(
127  forwarder->sample_seq_,
128  forwarder->info_seq_);
129  // Clear our internal containers
130  forwarder->sample_seq_.clear();
131  forwarder->info_seq_.clear();
132  } catch (const std::exception& ex) {
133  RTILog_printContextAndMsg(
134  RTI_LOG_BIT_EXCEPTION,
135  RTI_FUNCTION_NAME,
136  &RTI_LOG_ANY_s,
137  ex.what());
138  } catch (...) {
139  RTILog_printContextAndMsg(
140  RTI_LOG_BIT_EXCEPTION,
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_LOG_BIT_EXCEPTION,
159  RTI_FUNCTION_NAME,
160  &RTI_LOG_ANY_s,
161  ex.what());
162  } catch (...) {
163  RTILog_printContextAndMsg(
164  RTI_LOG_BIT_EXCEPTION,
165  RTI_FUNCTION_NAME,
166  &RTI_LOG_ANY_s,
167  "unknown exception");
168  }
169  return RTI_FALSE;
170  }
171 
172  static void reset_fwd(void *stream_reader_data)
173  {
174  try {
175  StorageStreamReaderForwarder *forwarder =
176  static_cast<StorageStreamReaderForwarder *>(
177  stream_reader_data);
178  forwarder->storage_stream_reader_->reset();
179  } catch (const std::exception& ex) {
180  RTILog_printContextAndMsg(
181  RTI_LOG_BIT_EXCEPTION,
182  RTI_FUNCTION_NAME,
183  &RTI_LOG_ANY_s,
184  ex.what());
185  } catch (...) {
186  RTILog_printContextAndMsg(
187  RTI_LOG_BIT_EXCEPTION,
188  RTI_FUNCTION_NAME,
189  &RTI_LOG_ANY_s,
190  "unknown exception");
191  }
192  }
193 
194  StorageStreamReader * stream_reader()
195  {
196  return storage_stream_reader_.get();
197  }
198 
199 private:
200  rtiboost::shared_ptr<StorageStreamReader> storage_stream_reader_;
201 
202  std::vector<StorageStreamReader::SamplePtr> sample_seq_;
203  std::vector<StorageStreamReader::InfoPtr> info_seq_;
204 
205 };
206 
207 } } } } // rti::recording::storage::detail
208 
209 #endif // RTI_RECORDING_STORAGE_DETAIL_STORAGE_STREAM_READER_FORWARDER_HPP_

RTI Recording Service Version 6.0.1 Copyright © Sun Nov 17 2019 Real-Time Innovations, Inc