OpenDDS  Snapshot(2023/04/28-20:55)
JsonValueWriter.h
Go to the documentation of this file.
1 /*
2  * Distributed under the OpenDDS License.
3  * See: http://www.opendds.org/license.html
4  */
5 
6 #ifndef OPENDDS_DCPS_JSON_VALUE_WRITER_H
7 #define OPENDDS_DCPS_JSON_VALUE_WRITER_H
8 
9 #if defined OPENDDS_RAPIDJSON && !defined OPENDDS_SAFETY_PROFILE
10 # define OPENDDS_HAS_JSON_VALUE_WRITER 1
11 #else
12 # define OPENDDS_HAS_JSON_VALUE_WRITER 0
13 #endif
14 
15 #if OPENDDS_HAS_JSON_VALUE_WRITER
16 
17 #include "ValueWriter.h"
18 #include "RapidJsonWrapper.h"
19 #include "dcps_export.h"
20 #include "Definitions.h"
21 
22 #include <dds/DdsDcpsCoreTypeSupportImpl.h>
23 #include <dds/DdsDcpsTopicC.h>
24 
25 #include <iosfwd>
26 #include <sstream>
27 #include <vector>
28 
29 #if !defined (ACE_LACKS_PRAGMA_ONCE)
30 #pragma once
31 #endif /* ACE_LACKS_PRAGMA_ONCE */
32 
34 
35 namespace OpenDDS {
36 namespace DCPS {
37 
38 /// Convert values to JSON.
39 template <typename Writer>
40 class JsonValueWriter : public ValueWriter {
41 public:
42  explicit JsonValueWriter(Writer& writer)
43  : writer_(writer)
44  {}
45 
46  void begin_struct();
47  void end_struct();
48  void begin_struct_member(const DDS::MemberDescriptor& /*descriptor*/);
49  void end_struct_member();
50 
51  void begin_union();
52  void end_union();
53  void begin_discriminator();
54  void end_discriminator();
55  void begin_union_member(const char* name);
56  void end_union_member();
57 
58  void begin_array();
59  void end_array();
60  void begin_sequence();
61  void end_sequence();
62  void begin_element(size_t idx);
63  void end_element();
64 
65  void write_boolean(ACE_CDR::Boolean value);
66  void write_byte(ACE_CDR::Octet value);
67 #if OPENDDS_HAS_EXPLICIT_INTS
68  void write_int8(ACE_CDR::Int8 value);
69  void write_uint8(ACE_CDR::UInt8 value);
70 #endif
71  void write_int16(ACE_CDR::Short value);
72  void write_uint16(ACE_CDR::UShort value);
73  void write_int32(ACE_CDR::Long value);
74  void write_uint32(ACE_CDR::ULong value);
75  void write_int64(ACE_CDR::LongLong value);
76  void write_uint64(ACE_CDR::ULongLong value);
77  void write_float32(ACE_CDR::Float value);
78  void write_float64(ACE_CDR::Double value);
79  void write_float128(ACE_CDR::LongDouble value);
80  void write_fixed(const OpenDDS::FaceTypes::Fixed& value);
81  void write_char8(ACE_CDR::Char value);
82  void write_char16(ACE_CDR::WChar value);
83  void write_string(const ACE_CDR::Char* value, size_t length);
84  void write_wstring(const ACE_CDR::WChar* value, size_t length);
85  void write_enum(const char* /*name*/, ACE_CDR::Long value);
86 
87 private:
88  Writer& writer_;
89 };
90 
91 template <typename Writer>
92 void JsonValueWriter<Writer>::begin_struct()
93 {
94  writer_.StartObject();
95 }
96 
97 template <typename Writer>
98 void JsonValueWriter<Writer>::end_struct()
99 {
100  writer_.EndObject();
101 }
102 
103 template <typename Writer>
104 void JsonValueWriter<Writer>::begin_struct_member(const DDS::MemberDescriptor& descriptor)
105 {
106  writer_.Key(descriptor.name());
107 }
108 
109 template <typename Writer>
110 void JsonValueWriter<Writer>::end_struct_member()
111 {}
112 
113 template <typename Writer>
114 void JsonValueWriter<Writer>::begin_union()
115 {
116  writer_.StartObject();
117 }
118 
119 template <typename Writer>
120 void JsonValueWriter<Writer>::end_union()
121 {
122  writer_.EndObject();
123 }
124 
125 template <typename Writer>
126 void JsonValueWriter<Writer>::begin_discriminator()
127 {
128  writer_.Key("$discriminator");
129 }
130 
131 template <typename Writer>
132 void JsonValueWriter<Writer>::end_discriminator()
133 {}
134 
135 template <typename Writer>
136 void JsonValueWriter<Writer>::begin_union_member(const char* name)
137 {
138  writer_.Key(name);
139 }
140 
141 template <typename Writer>
142 void JsonValueWriter<Writer>::end_union_member()
143 {}
144 
145 template <typename Writer>
146 void JsonValueWriter<Writer>::begin_array()
147 {
148  writer_.StartArray();
149 }
150 
151 template <typename Writer>
152 void JsonValueWriter<Writer>::end_array()
153 {
154  writer_.EndArray();
155 }
156 
157 template <typename Writer>
158 void JsonValueWriter<Writer>::begin_sequence()
159 {
160  writer_.StartArray();
161 }
162 
163 template <typename Writer>
164 void JsonValueWriter<Writer>::end_sequence()
165 {
166  writer_.EndArray();
167 }
168 
169 template <typename Writer>
170 void JsonValueWriter<Writer>::begin_element(size_t /*idx*/)
171 {}
172 
173 template <typename Writer>
174 void JsonValueWriter<Writer>::end_element()
175 {}
176 
177 template <typename Writer>
178 void JsonValueWriter<Writer>::write_boolean(ACE_CDR::Boolean value)
179 {
180  writer_.Bool(value);
181 }
182 
183 template <typename Writer>
184 void JsonValueWriter<Writer>::write_byte(ACE_CDR::Octet value)
185 {
186  writer_.Uint(value);
187 }
188 
189 #if OPENDDS_HAS_EXPLICIT_INTS
190 template <typename Writer>
191 void JsonValueWriter<Writer>::write_int8(ACE_CDR::Int8 value)
192 {
193  writer_.Int(value);
194 }
195 
196 template <typename Writer>
197 void JsonValueWriter<Writer>::write_uint8(ACE_CDR::UInt8 value)
198 {
199  writer_.Uint(value);
200 }
201 #endif
202 
203 template <typename Writer>
204 void JsonValueWriter<Writer>::write_int16(ACE_CDR::Short value)
205 {
206  writer_.Int(value);
207 }
208 
209 template <typename Writer>
210 void JsonValueWriter<Writer>::write_uint16(ACE_CDR::UShort value)
211 {
212  writer_.Uint(value);
213 }
214 
215 template <typename Writer>
216 void JsonValueWriter<Writer>::write_int32(ACE_CDR::Long value)
217 {
218  writer_.Int(value);
219 }
220 
221 template <typename Writer>
222 void JsonValueWriter<Writer>::write_uint32(ACE_CDR::ULong value)
223 {
224  writer_.Uint(value);
225 }
226 
227 template <typename Writer>
228 void JsonValueWriter<Writer>::write_int64(ACE_CDR::LongLong value)
229 {
230  writer_.Int64(value);
231 }
232 
233 template <typename Writer>
234 void JsonValueWriter<Writer>::write_uint64(ACE_CDR::ULongLong value)
235 {
236  writer_.Uint64(value);
237 }
238 
239 template <typename Writer>
240 void JsonValueWriter<Writer>::write_float32(ACE_CDR::Float value)
241 {
242  writer_.Double(value);
243 }
244 
245 template <typename Writer>
246 void JsonValueWriter<Writer>::write_float64(ACE_CDR::Double value)
247 {
248  writer_.Double(value);
249 }
250 
251 template <typename Writer>
252 void JsonValueWriter<Writer>::write_float128(ACE_CDR::LongDouble value)
253 {
254  // TODO
255  writer_.Double(value);
256 }
257 
258 template <typename Writer>
259 void JsonValueWriter<Writer>::write_fixed(const OpenDDS::FaceTypes::Fixed& /*value*/)
260 {
261  // TODO
262  writer_.String("fixed");
263 }
264 
265 template <typename Writer>
266 void JsonValueWriter<Writer>::write_char8(ACE_CDR::Char value)
267 {
268  ACE_CDR::Char s[2] = { value, 0 };
269  writer_.String(s, 1);
270 }
271 
272 template <typename Writer>
273 void JsonValueWriter<Writer>::write_char16(ACE_CDR::WChar value)
274 {
275  ACE_CDR::WChar s[2] = { value, 0 };
276 
277  rapidjson::GenericStringStream<rapidjson::UTF16<> > source(s);
278  rapidjson::GenericStringBuffer<rapidjson::UTF8<> > target;
279 
280  if (!rapidjson::Transcoder<rapidjson::UTF16<>, rapidjson::UTF8<> >::Transcode(source, target)) {
281  return;
282  }
283 
284  writer_.String(target.GetString(), static_cast<rapidjson::SizeType>(target.GetLength()));
285 }
286 
287 template <typename Writer>
288 void JsonValueWriter<Writer>::write_string(const ACE_CDR::Char* value, size_t length)
289 {
290  writer_.String(value, static_cast<rapidjson::SizeType>(length));
291 }
292 
293 template <typename Writer>
294 void JsonValueWriter<Writer>::write_wstring(const ACE_CDR::WChar* value, size_t length)
295 {
296  rapidjson::GenericStringStream<rapidjson::UTF16<> > source(value);
297  rapidjson::GenericStringBuffer<rapidjson::UTF8<> > target;
298 
299  while (source.Tell() != length) {
300  if (!rapidjson::Transcoder<rapidjson::UTF16<>, rapidjson::UTF8<> >::Transcode(source, target)) {
301  return;
302  }
303  }
304 
305  writer_.String(target.GetString(), static_cast<rapidjson::SizeType>(target.GetLength()));
306 }
307 
308 template <typename Writer>
309 void JsonValueWriter<Writer>::write_enum(const char* name,
310  ACE_CDR::Long /*value*/)
311 {
312  writer_.String(name);
313 }
314 
315 template<typename T>
316 std::string to_json(const T& sample)
317 {
318  rapidjson::StringBuffer buffer;
319  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
320  JsonValueWriter<rapidjson::Writer<rapidjson::StringBuffer> > jvw(writer);
321  vwrite(jvw, sample);
322  writer.Flush();
323  return buffer.GetString();
324 }
325 
326 template<typename T, typename Writer>
327 bool to_json(const T& sample, Writer& writer)
328 {
329  JsonValueWriter<Writer> jvw(writer);
330  return vwrite(jvw, sample);
331 }
332 
333 template<typename T>
334 std::string to_json(const DDS::TopicDescription_ptr topic,
335  const T& sample, const DDS::SampleInfo& sample_info)
336 {
337  rapidjson::StringBuffer buffer;
338  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
339  JsonValueWriter<rapidjson::Writer<rapidjson::StringBuffer> > jvw(writer);
340  jvw.begin_struct();
341  jvw.begin_struct_member(XTypes::MemberDescriptorImpl("topic", false));
342  jvw.begin_struct();
343  jvw.begin_struct_member(XTypes::MemberDescriptorImpl("name", false));
344  CORBA::String_var topic_name = topic->get_name();
345  static_cast<ValueWriter&>(jvw).write_string(topic_name);
346  jvw.end_struct_member();
347  jvw.begin_struct_member(XTypes::MemberDescriptorImpl("type_name", false));
348  CORBA::String_var type_name = topic->get_type_name();
349  static_cast<ValueWriter&>(jvw).write_string(type_name);
350  jvw.end_struct_member();
351  jvw.end_struct();
352  jvw.end_struct_member();
353  jvw.begin_struct_member(XTypes::MemberDescriptorImpl("sample", false));
354  vwrite(jvw, sample);
355  jvw.end_struct_member();
356  jvw.begin_struct_member(XTypes::MemberDescriptorImpl("sample_info", false));
357  vwrite(jvw, sample_info);
358  jvw.end_struct_member();
359  jvw.end_struct();
360  writer.Flush();
361  return buffer.GetString();
362 }
363 
364 } // namespace DCPS
365 } // namespace OpenDDS
366 
368 
369 #endif
370 
371 #endif /* OPENDDS_DCPS_JSON_VALUE_WRITER_H */
ACE_Byte Octet
void vwrite(ValueWriter &vw, const Observer::Sample &sample)
Definition: Observer.cpp:51
ACE_INT64 LongLong
const LogLevel::Value value
Definition: debug.cpp:61
ACE_UINT64 ULongLong
ACE_INT16 Short
char Char
ACE_UINT16 UShort
ACE_UINT32 ULong
const char *const name
Definition: debug.cpp:60
ACE_INT32 Long
ACE_INT8 Int8
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
ACE_WCHAR_T WChar
public ObjectName name
bool Boolean
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
ACE_UINT8 UInt8