6 #ifndef OPENDDS_DCPS_JSON_VALUE_READER_H 7 #define OPENDDS_DCPS_JSON_VALUE_READER_H 9 #if defined OPENDDS_RAPIDJSON && !defined OPENDDS_SAFETY_PROFILE 10 # define OPENDDS_HAS_JSON_VALUE_READER 1 12 # define OPENDDS_HAS_JSON_VALUE_READER 0 15 #if OPENDDS_HAS_JSON_VALUE_READER 26 #if !defined (ACE_LACKS_PRAGMA_ONCE) 36 template <
typename InputStream = rap
idjson::StringStream>
39 public rapidjson::BaseReaderHandler<rapidjson::UTF8<> > {
41 explicit JsonValueReader(InputStream& input_stream)
42 : token_type_(kUnknown)
43 , input_stream_(input_stream)
51 reader_.IterativeParseInit();
56 bool begin_struct_member(
XTypes::MemberId& member_id,
const MemberHelper& helper);
57 bool end_struct_member();
61 bool begin_discriminator();
62 bool end_discriminator();
63 bool begin_union_member();
64 bool end_union_member();
68 bool begin_sequence();
69 bool elements_remaining();
76 #if OPENDDS_HAS_EXPLICIT_INTS 89 bool read_fixed(OpenDDS::FaceTypes::Fixed& value);
92 bool read_string(std::string& value);
93 bool read_wstring(std::wstring& value);
94 bool read_long_enum(
ACE_CDR::Long& value,
const EnumHelper& helper);
96 bool Null() { token_type_ = kNull;
return true; }
97 bool Bool(
bool b) { token_type_ = kBool; bool_value_ = b;
return true; }
98 bool Int(
int i) { token_type_ = kInt; int_value_ = i;
return true; }
99 bool Uint(
unsigned i) { token_type_ = kUint; uint_value_ = i;
return true; }
100 bool Int64(int64_t i) { token_type_ = kInt64; int64_value_ = i;
return true; }
101 bool Uint64(uint64_t i) { token_type_ = kUint64; uint64_value_ = i;
return true; }
102 bool Double(
double d) { token_type_ = kDouble; double_value_ = d;
return true; }
103 bool RawNumber(
const Ch* , rapidjson::SizeType ,
bool ) { token_type_ = kRawNumber;
return true; }
104 bool String(
const Ch* str, rapidjson::SizeType length,
bool )
106 token_type_ = kString;
107 string_value_ = std::string(str, length);
110 bool StartObject() { token_type_ = kStartObject;
return true; }
111 bool Key(
const Ch* str, rapidjson::SizeType ,
bool ) { token_type_ = kKey; key_value_ = str;
return true; }
112 bool EndObject(rapidjson::SizeType ) { token_type_ = kEndObject;
return true; }
113 bool StartArray() { token_type_ = kStartArray;
return true; }
114 bool EndArray(rapidjson::SizeType ) { token_type_ = kEndArray;
return true; }
139 if (token_type_ != kUnknown) {
143 if (reader_.IterativeParseComplete()) {
148 if (!reader_.IterativeParseNext<rapidjson::kParseStopWhenDoneFlag>(input_stream_, *
this)) {
149 token_type_ = kError;
155 bool consume(TokenType expected)
157 if (token_type_ == expected) {
158 token_type_ = kUnknown;
166 bool skip_to(TokenType expected)
170 while (peek() != kEnd) {
171 if (skip_level == 0 && token_type_ == expected) {
174 switch (token_type_) {
186 consume(token_type_);
192 TokenType token_type_;
193 InputStream& input_stream_;
194 rapidjson::Reader reader_;
197 unsigned int uint_value_;
198 int64_t int64_value_;
199 uint64_t uint64_value_;
200 double double_value_;
201 std::string string_value_;
202 std::string key_value_;
205 template <
typename InputStream>
206 bool JsonValueReader<InputStream>::begin_struct()
209 return consume(kStartObject);
212 template <
typename InputStream>
213 bool JsonValueReader<InputStream>::end_struct()
215 if (peek() == kKey) {
216 if (!skip_to(kEndObject)) {
220 return consume(kEndObject);
223 template <
typename InputStream>
224 bool JsonValueReader<InputStream>::begin_struct_member(
XTypes::MemberId& member_id,
const MemberHelper& helper)
226 while (peek() == kKey) {
228 if (helper.get_value(member_id, key_value_.c_str())) {
231 if (!skip_to(kKey)) {
238 template <
typename InputStream>
239 bool JsonValueReader<InputStream>::end_struct_member()
244 template <
typename InputStream>
245 bool JsonValueReader<InputStream>::begin_union()
248 return consume(kStartObject);
251 template <
typename InputStream>
252 bool JsonValueReader<InputStream>::end_union()
255 return consume(kEndObject);
258 template <
typename InputStream>
259 bool JsonValueReader<InputStream>::begin_discriminator()
261 if (peek() == kKey && key_value_ ==
"$discriminator") {
262 return consume(kKey);
267 template <
typename InputStream>
268 bool JsonValueReader<InputStream>::end_discriminator()
273 template <
typename InputStream>
274 bool JsonValueReader<InputStream>::begin_union_member()
276 if (peek() == kKey) {
277 return consume(kKey);
282 template <
typename InputStream>
283 bool JsonValueReader<InputStream>::end_union_member()
288 template <
typename InputStream>
289 bool JsonValueReader<InputStream>::begin_array()
292 return consume(kStartArray);
295 template <
typename InputStream>
296 bool JsonValueReader<InputStream>::end_array()
299 return consume(kEndArray);
302 template <
typename InputStream>
303 bool JsonValueReader<InputStream>::begin_sequence()
306 return consume(kStartArray);
309 template <
typename InputStream>
310 bool JsonValueReader<InputStream>::elements_remaining()
313 return token_type_ != kEndArray;
316 template <
typename InputStream>
317 bool JsonValueReader<InputStream>::end_sequence()
320 return consume(kEndArray);
323 template <
typename InputStream>
324 bool JsonValueReader<InputStream>::begin_element()
329 template <
typename InputStream>
330 bool JsonValueReader<InputStream>::end_element()
335 template <
typename InputStream>
338 if (peek() == kBool) {
340 return consume(kBool);
345 template <
typename InputStream>
346 bool JsonValueReader<InputStream>::read_byte(
ACE_CDR::Octet& value)
348 if (peek() == kUint) {
350 return consume(kUint);
355 #if OPENDDS_HAS_EXPLICIT_INTS 356 template <
typename InputStream>
357 bool JsonValueReader<InputStream>::read_int8(
ACE_CDR::Int8& value)
362 return consume(kInt);
365 return consume(kUint);
371 template <
typename InputStream>
372 bool JsonValueReader<InputStream>::read_uint8(
ACE_CDR::UInt8& value)
374 if (peek() == kUint) {
376 return consume(kUint);
382 template <
typename InputStream>
383 bool JsonValueReader<InputStream>::read_int16(
ACE_CDR::Short& value)
389 return consume(kInt);
392 return consume(kUint);
398 template <
typename InputStream>
401 if (peek() == kUint) {
403 return consume(kUint);
408 template <
typename InputStream>
409 bool JsonValueReader<InputStream>::read_int32(
ACE_CDR::Long& value)
414 return consume(kInt);
417 return consume(kUint);
423 template <
typename InputStream>
424 bool JsonValueReader<InputStream>::read_uint32(
ACE_CDR::ULong& value)
426 if (peek() == kUint) {
428 return consume(kUint);
433 template <
typename InputStream>
438 value = int64_value_;
439 return consume(kInt64);
441 value = uint64_value_;
442 return consume(kUint64);
445 return consume(kInt);
448 return consume(kUint);
454 template <
typename InputStream>
459 value = uint64_value_;
460 return consume(kUint64);
463 return consume(kUint);
469 template <
typename InputStream>
470 bool JsonValueReader<InputStream>::read_float32(
ACE_CDR::Float& value)
475 return consume(kDouble);
478 return consume(kUint64);
481 return consume(kUint);
484 return consume(kInt64);
487 return consume(kUint);
493 template <
typename InputStream>
494 bool JsonValueReader<InputStream>::read_float64(
ACE_CDR::Double& value)
498 value = double_value_;
499 return consume(kDouble);
502 return consume(kUint64);
505 return consume(kUint);
508 return consume(kInt64);
511 return consume(kUint);
517 template <
typename InputStream>
523 return consume(kDouble);
526 # pragma warning(disable:4244) 530 # pragma warning(default:4244) 532 return consume(kUint64);
535 return consume(kUint);
538 # pragma warning(disable:4244) 542 # pragma warning(default:4244) 544 return consume(kInt64);
547 return consume(kUint);
553 template <
typename InputStream>
554 bool JsonValueReader<InputStream>::read_fixed(OpenDDS::FaceTypes::Fixed& )
557 if (peek() == kString) {
558 return consume(kString);
563 template <
typename InputStream>
564 bool JsonValueReader<InputStream>::read_char8(
ACE_CDR::Char& value)
566 if (peek() == kString) {
567 if (string_value_.length() == 1) {
568 value = string_value_[0];
569 return consume(kString);
575 template <
typename InputStream>
576 bool JsonValueReader<InputStream>::read_char16(
ACE_CDR::WChar& value)
578 if (peek() == kString) {
579 rapidjson::StringStream source(string_value_.c_str());
580 rapidjson::GenericStringBuffer<rapidjson::UTF16<> > target;
582 while (source.Tell() != string_value_.size()) {
583 if (!rapidjson::Transcoder<rapidjson::UTF8<>, rapidjson::UTF16<> >::Transcode(source, target)) {
588 if (target.GetLength() == 1) {
589 value = target.GetString()[0];
590 return consume(kString);
596 template <
typename InputStream>
597 bool JsonValueReader<InputStream>::read_string(std::string& value)
599 if (peek() == kString) {
600 value = string_value_;
601 return consume(kString);
606 template <
typename InputStream>
607 bool JsonValueReader<InputStream>::read_wstring(std::wstring& value)
609 if (peek() == kString) {
610 rapidjson::StringStream source(string_value_.c_str());
611 rapidjson::GenericStringBuffer<rapidjson::UTF16<> > target;
613 while (source.Tell() != string_value_.size()) {
614 if (!rapidjson::Transcoder<rapidjson::UTF8<>, rapidjson::UTF16<> >::Transcode(source, target)) {
619 value = target.GetString();
620 return consume(kString);
625 template <
typename InputStream>
626 bool JsonValueReader<InputStream>::read_long_enum(
ACE_CDR::Long& value,
const EnumHelper& helper)
630 if (helper.get_value(value, string_value_.c_str())) {
631 return consume(kString);
637 return consume(kInt);
640 return consume(kUint);
646 template<
typename T,
typename InputStream>
647 bool from_json(T& value, InputStream& stream)
650 JsonValueReader<InputStream> jvr(stream);
651 return vread(jvr, value);
const LogLevel::Value value
bool vread(ValueReader &, XTypes::TypeIdentifier &)
#define ACE_CDR_LONG_DOUBLE_ASSIGNMENT(LHS, RHS)
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
The Internal API and Implementation of OpenDDS.