aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/protobuf/3.2.0/src/google/protobuf/util/internal
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/protobuf/3.2.0/src/google/protobuf/util/internal')
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h103
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc406
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h219
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc601
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h285
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc189
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc42
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h103
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h238
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc225
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h72
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc404
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h91
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc196
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h233
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc313
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc844
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h269
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc845
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h65
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h63
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h64
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h79
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc92
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h146
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc799
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h353
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc1123
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h308
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc1034
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc1265
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h405
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc2771
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h118
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto108
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto192
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto170
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto53
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto71
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto146
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto77
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto42
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto117
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto80
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto100
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc173
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h92
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc134
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h98
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc416
-rw-r--r--third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h208
51 files changed, 0 insertions, 16640 deletions
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h
deleted file mode 100644
index a018a09ef7..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/constants.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_CONSTANTS_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_CONSTANTS_H__
-
-#include <google/protobuf/stubs/common.h>
-
-// This file contains constants used by //net/proto2/util/converter.
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-// Prefix for type URLs.
-const char kTypeServiceBaseUrl[] = "type.googleapis.com";
-
-// Format string for RFC3339 timestamp formatting.
-const char kRfc3339TimeFormat[] = "%E4Y-%m-%dT%H:%M:%S";
-
-// Same as above, but the year value is not zero-padded i.e. this accepts
-// timestamps like "1-01-0001T23:59:59Z" instead of "0001-01-0001T23:59:59Z".
-const char kRfc3339TimeFormatNoPadding[] = "%Y-%m-%dT%H:%M:%S";
-
-// Minimun seconds allowed in a google.protobuf.Timestamp value.
-const int64 kTimestampMinSeconds = -62135596800LL;
-
-// Maximum seconds allowed in a google.protobuf.Timestamp value.
-const int64 kTimestampMaxSeconds = 253402300799LL;
-
-// Minimum seconds allowed in a google.protobuf.Duration value.
-const int64 kDurationMinSeconds = -315576000000LL;
-
-// Maximum seconds allowed in a google.protobuf.Duration value.
-const int64 kDurationMaxSeconds = 315576000000LL;
-
-// Nano seconds in a second.
-const int32 kNanosPerSecond = 1000000000;
-
-// Type url representing NULL values in google.protobuf.Struct type.
-const char kStructNullValueTypeUrl[] =
- "type.googleapis.com/google.protobuf.NullValue";
-
-// Type string for google.protobuf.Struct
-const char kStructType[] = "google.protobuf.Struct";
-
-// Type string for struct.proto's google.protobuf.Value value type.
-const char kStructValueType[] = "google.protobuf.Value";
-
-// Type string for struct.proto's google.protobuf.ListValue value type.
-const char kStructListValueType[] = "google.protobuf.ListValue";
-
-// Type string for google.protobuf.Timestamp
-const char kTimestampType[] = "google.protobuf.Timestamp";
-
-// Type string for google.protobuf.Duration
-const char kDurationType[] = "google.protobuf.Duration";
-
-// Type URL for struct value type google.protobuf.Value
-const char kStructValueTypeUrl[] = "type.googleapis.com/google.protobuf.Value";
-
-// Type URL for struct value type google.protobuf.Value
-const char kStructTypeUrl[] = "type.googleapis.com/google.protobuf.Struct";
-
-// Type string for google.protobuf.Any
-const char kAnyType[] = "google.protobuf.Any";
-
-// The type URL of google.protobuf.FieldMask;
-const char kFieldMaskTypeUrl[] =
- "type.googleapis.com/google.protobuf.FieldMask";
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_CONSTANTS_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc
deleted file mode 100644
index 213c2c40c0..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.cc
+++ /dev/null
@@ -1,406 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/datapiece.h>
-
-#include <google/protobuf/struct.pb.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/mathlimits.h>
-#include <google/protobuf/stubs/mathutil.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::EnumDescriptor;
-using google::protobuf::EnumValueDescriptor;
-;
-;
-;
-using util::error::Code;
-using util::Status;
-using util::StatusOr;
-
-namespace {
-
-inline Status InvalidArgument(StringPiece value_str) {
- return Status(util::error::INVALID_ARGUMENT, value_str);
-}
-
-template <typename To, typename From>
-StatusOr<To> ValidateNumberConversion(To after, From before) {
- if (after == before &&
- MathUtil::Sign<From>(before) == MathUtil::Sign<To>(after)) {
- return after;
- } else {
- return InvalidArgument(::google::protobuf::internal::is_integral<From>::value
- ? ValueAsString(before)
- : ::google::protobuf::internal::is_same<From, double>::value
- ? DoubleAsString(before)
- : FloatAsString(before));
- }
-}
-
-// For general conversion between
-// int32, int64, uint32, uint64, double and float
-// except conversion between double and float.
-template <typename To, typename From>
-StatusOr<To> NumberConvertAndCheck(From before) {
- if (::google::protobuf::internal::is_same<From, To>::value) return before;
-
- To after = static_cast<To>(before);
- return ValidateNumberConversion(after, before);
-}
-
-// For conversion to integer types (int32, int64, uint32, uint64) from floating
-// point types (double, float) only.
-template <typename To, typename From>
-StatusOr<To> FloatingPointToIntConvertAndCheck(From before) {
- if (::google::protobuf::internal::is_same<From, To>::value) return before;
-
- To after = static_cast<To>(before);
- return ValidateNumberConversion(after, before);
-}
-
-// For conversion between double and float only.
-StatusOr<double> FloatToDouble(float before) {
- // Casting float to double should just work as double has more precision
- // than float.
- return static_cast<double>(before);
-}
-
-StatusOr<float> DoubleToFloat(double before) {
- if (MathLimits<double>::IsNaN(before)) {
- return std::numeric_limits<float>::quiet_NaN();
- } else if (!MathLimits<double>::IsFinite(before)) {
- // Converting a double +inf/-inf to float should just work.
- return static_cast<float>(before);
- } else if (before > std::numeric_limits<float>::max() ||
- before < -std::numeric_limits<float>::max()) {
- // Double value outside of the range of float.
- return InvalidArgument(DoubleAsString(before));
- } else {
- return static_cast<float>(before);
- }
-}
-
-} // namespace
-
-StatusOr<int32> DataPiece::ToInt32() const {
- if (type_ == TYPE_STRING) return StringToNumber<int32>(safe_strto32);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<int32, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<int32, float>(float_);
-
- return GenericConvert<int32>();
-}
-
-StatusOr<uint32> DataPiece::ToUint32() const {
- if (type_ == TYPE_STRING) return StringToNumber<uint32>(safe_strtou32);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<uint32, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<uint32, float>(float_);
-
- return GenericConvert<uint32>();
-}
-
-StatusOr<int64> DataPiece::ToInt64() const {
- if (type_ == TYPE_STRING) return StringToNumber<int64>(safe_strto64);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<int64, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<int64, float>(float_);
-
- return GenericConvert<int64>();
-}
-
-StatusOr<uint64> DataPiece::ToUint64() const {
- if (type_ == TYPE_STRING) return StringToNumber<uint64>(safe_strtou64);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<uint64, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<uint64, float>(float_);
-
- return GenericConvert<uint64>();
-}
-
-StatusOr<double> DataPiece::ToDouble() const {
- if (type_ == TYPE_FLOAT) {
- return FloatToDouble(float_);
- }
- if (type_ == TYPE_STRING) {
- if (str_ == "Infinity") return std::numeric_limits<double>::infinity();
- if (str_ == "-Infinity") return -std::numeric_limits<double>::infinity();
- if (str_ == "NaN") return std::numeric_limits<double>::quiet_NaN();
- StatusOr<double> value = StringToNumber<double>(safe_strtod);
- if (value.ok() && !MathLimits<double>::IsFinite(value.ValueOrDie())) {
- // safe_strtod converts out-of-range values to +inf/-inf, but we want
- // to report them as errors.
- return InvalidArgument(StrCat("\"", str_, "\""));
- } else {
- return value;
- }
- }
- return GenericConvert<double>();
-}
-
-StatusOr<float> DataPiece::ToFloat() const {
- if (type_ == TYPE_DOUBLE) {
- return DoubleToFloat(double_);
- }
- if (type_ == TYPE_STRING) {
- if (str_ == "Infinity") return std::numeric_limits<float>::infinity();
- if (str_ == "-Infinity") return -std::numeric_limits<float>::infinity();
- if (str_ == "NaN") return std::numeric_limits<float>::quiet_NaN();
- // SafeStrToFloat() is used instead of safe_strtof() because the later
- // does not fail on inputs like SimpleDtoa(DBL_MAX).
- return StringToNumber<float>(SafeStrToFloat);
- }
- return GenericConvert<float>();
-}
-
-StatusOr<bool> DataPiece::ToBool() const {
- switch (type_) {
- case TYPE_BOOL:
- return bool_;
- case TYPE_STRING:
- return StringToNumber<bool>(safe_strtob);
- default:
- return InvalidArgument(
- ValueAsStringOrDefault("Wrong type. Cannot convert to Bool."));
- }
-}
-
-StatusOr<string> DataPiece::ToString() const {
- switch (type_) {
- case TYPE_STRING:
- return str_.ToString();
- case TYPE_BYTES: {
- string base64;
- Base64Escape(str_, &base64);
- return base64;
- }
- default:
- return InvalidArgument(
- ValueAsStringOrDefault("Cannot convert to string."));
- }
-}
-
-string DataPiece::ValueAsStringOrDefault(StringPiece default_string) const {
- switch (type_) {
- case TYPE_INT32:
- return SimpleItoa(i32_);
- case TYPE_INT64:
- return SimpleItoa(i64_);
- case TYPE_UINT32:
- return SimpleItoa(u32_);
- case TYPE_UINT64:
- return SimpleItoa(u64_);
- case TYPE_DOUBLE:
- return DoubleAsString(double_);
- case TYPE_FLOAT:
- return FloatAsString(float_);
- case TYPE_BOOL:
- return SimpleBtoa(bool_);
- case TYPE_STRING:
- return StrCat("\"", str_.ToString(), "\"");
- case TYPE_BYTES: {
- string base64;
- WebSafeBase64Escape(str_, &base64);
- return StrCat("\"", base64, "\"");
- }
- case TYPE_NULL:
- return "null";
- default:
- return default_string.ToString();
- }
-}
-
-StatusOr<string> DataPiece::ToBytes() const {
- if (type_ == TYPE_BYTES) return str_.ToString();
- if (type_ == TYPE_STRING) {
- string decoded;
- if (!DecodeBase64(str_, &decoded)) {
- return InvalidArgument(ValueAsStringOrDefault("Invalid data in input."));
- }
- return decoded;
- } else {
- return InvalidArgument(ValueAsStringOrDefault(
- "Wrong type. Only String or Bytes can be converted to Bytes."));
- }
-}
-
-StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type,
- bool use_lower_camel_for_enums) const {
- if (type_ == TYPE_NULL) return google::protobuf::NULL_VALUE;
-
- if (type_ == TYPE_STRING) {
- // First try the given value as a name.
- string enum_name = str_.ToString();
- const google::protobuf::EnumValue* value =
- FindEnumValueByNameOrNull(enum_type, enum_name);
- if (value != NULL) return value->number();
-
- // Check if int version of enum is sent as string.
- StatusOr<int32> int_value = ToInt32();
- if (int_value.ok()) {
- if (const google::protobuf::EnumValue* enum_value =
- FindEnumValueByNumberOrNull(enum_type, int_value.ValueOrDie())) {
- return enum_value->number();
- }
- }
-
- // Next try a normalized name.
- for (string::iterator it = enum_name.begin(); it != enum_name.end(); ++it) {
- *it = *it == '-' ? '_' : ascii_toupper(*it);
- }
- value = FindEnumValueByNameOrNull(enum_type, enum_name);
- if (value != NULL) return value->number();
-
- // If use_lower_camel_for_enums is true try with enum name without
- // underscore. This will also accept camel case names as the enum_name has
- // been normalized before.
- if (use_lower_camel_for_enums) {
- value = FindEnumValueByNameWithoutUnderscoreOrNull(enum_type, enum_name);
- if (value != NULL) return value->number();
- }
- } else {
- // We don't need to check whether the value is actually declared in the
- // enum because we preserve unknown enum values as well.
- return ToInt32();
- }
- return InvalidArgument(
- ValueAsStringOrDefault("Cannot find enum with given value."));
-}
-
-template <typename To>
-StatusOr<To> DataPiece::GenericConvert() const {
- switch (type_) {
- case TYPE_INT32:
- return NumberConvertAndCheck<To, int32>(i32_);
- case TYPE_INT64:
- return NumberConvertAndCheck<To, int64>(i64_);
- case TYPE_UINT32:
- return NumberConvertAndCheck<To, uint32>(u32_);
- case TYPE_UINT64:
- return NumberConvertAndCheck<To, uint64>(u64_);
- case TYPE_DOUBLE:
- return NumberConvertAndCheck<To, double>(double_);
- case TYPE_FLOAT:
- return NumberConvertAndCheck<To, float>(float_);
- default: // TYPE_ENUM, TYPE_STRING, TYPE_CORD, TYPE_BOOL
- return InvalidArgument(ValueAsStringOrDefault(
- "Wrong type. Bool, Enum, String and Cord not supported in "
- "GenericConvert."));
- }
-}
-
-template <typename To>
-StatusOr<To> DataPiece::StringToNumber(bool (*func)(StringPiece, To*)) const {
- if (str_.size() > 0 && (str_[0] == ' ' || str_[str_.size() - 1] == ' ')) {
- return InvalidArgument(StrCat("\"", str_, "\""));
- }
- To result;
- if (func(str_, &result)) return result;
- return InvalidArgument(StrCat("\"", str_.ToString(), "\""));
-}
-
-bool DataPiece::DecodeBase64(StringPiece src, string* dest) const {
- // Try web-safe decode first, if it fails, try the non-web-safe decode.
- if (WebSafeBase64Unescape(src, dest)) {
- if (use_strict_base64_decoding_) {
- // In strict mode, check if the escaped version gives us the same value as
- // unescaped.
- string encoded;
- // WebSafeBase64Escape does no padding by default.
- WebSafeBase64Escape(*dest, &encoded);
- // Remove trailing padding '=' characters before comparison.
- StringPiece src_no_padding = StringPiece(src).substr(
- 0, src.ends_with("=") ? src.find_last_not_of('=') + 1 : src.length());
- return encoded == src_no_padding;
- }
- return true;
- }
-
- if (Base64Unescape(src, dest)) {
- if (use_strict_base64_decoding_) {
- string encoded;
- Base64Escape(
- reinterpret_cast<const unsigned char*>(dest->data()), dest->length(),
- &encoded, false);
- StringPiece src_no_padding = StringPiece(src).substr(
- 0, src.ends_with("=") ? src.find_last_not_of('=') + 1 : src.length());
- return encoded == src_no_padding;
- }
- return true;
- }
-
- return false;
-}
-
-void DataPiece::InternalCopy(const DataPiece& other) {
- type_ = other.type_;
- use_strict_base64_decoding_ = other.use_strict_base64_decoding_;
- switch (type_) {
- case TYPE_INT32:
- case TYPE_INT64:
- case TYPE_UINT32:
- case TYPE_UINT64:
- case TYPE_DOUBLE:
- case TYPE_FLOAT:
- case TYPE_BOOL:
- case TYPE_ENUM:
- case TYPE_NULL:
- case TYPE_BYTES:
- case TYPE_STRING: {
- str_ = other.str_;
- break;
- }
- }
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h
deleted file mode 100644
index 83516d0972..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/datapiece.h
+++ /dev/null
@@ -1,219 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_DATAPIECE_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_DATAPIECE_H__
-
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/statusor.h>
-
-
-namespace google {
-namespace protobuf {
-class Enum;
-} // namespace protobuf
-
-
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// Container for a single piece of data together with its data type.
-//
-// For primitive types (int32, int64, uint32, uint64, double, float, bool),
-// the data is stored by value.
-//
-// For string, a StringPiece is stored. For Cord, a pointer to Cord is stored.
-// Just like StringPiece, the DataPiece class does not own the storage for
-// the actual string or Cord, so it is the user's responsiblity to guarantee
-// that the underlying storage is still valid when the DataPiece is accessed.
-class LIBPROTOBUF_EXPORT DataPiece {
- public:
- // Identifies data type of the value.
- // These are the types supported by DataPiece.
- enum Type {
- TYPE_INT32 = 1,
- TYPE_INT64 = 2,
- TYPE_UINT32 = 3,
- TYPE_UINT64 = 4,
- TYPE_DOUBLE = 5,
- TYPE_FLOAT = 6,
- TYPE_BOOL = 7,
- TYPE_ENUM = 8,
- TYPE_STRING = 9,
- TYPE_BYTES = 10,
- TYPE_NULL = 11, // explicit NULL type
- };
-
- // Constructors and Destructor
- explicit DataPiece(const int32 value)
- : type_(TYPE_INT32), i32_(value), use_strict_base64_decoding_(false) {}
- explicit DataPiece(const int64 value)
- : type_(TYPE_INT64), i64_(value), use_strict_base64_decoding_(false) {}
- explicit DataPiece(const uint32 value)
- : type_(TYPE_UINT32), u32_(value), use_strict_base64_decoding_(false) {}
- explicit DataPiece(const uint64 value)
- : type_(TYPE_UINT64), u64_(value), use_strict_base64_decoding_(false) {}
- explicit DataPiece(const double value)
- : type_(TYPE_DOUBLE),
- double_(value),
- use_strict_base64_decoding_(false) {}
- explicit DataPiece(const float value)
- : type_(TYPE_FLOAT), float_(value), use_strict_base64_decoding_(false) {}
- explicit DataPiece(const bool value)
- : type_(TYPE_BOOL), bool_(value), use_strict_base64_decoding_(false) {}
- DataPiece(StringPiece value, bool use_strict_base64_decoding)
- : type_(TYPE_STRING),
- str_(StringPiecePod::CreateFromStringPiece(value)),
- use_strict_base64_decoding_(use_strict_base64_decoding) {}
- // Constructor for bytes. The second parameter is not used.
- DataPiece(StringPiece value, bool dummy, bool use_strict_base64_decoding)
- : type_(TYPE_BYTES),
- str_(StringPiecePod::CreateFromStringPiece(value)),
- use_strict_base64_decoding_(use_strict_base64_decoding) {}
-
- DataPiece(const DataPiece& r) : type_(r.type_) { InternalCopy(r); }
-
- DataPiece& operator=(const DataPiece& x) {
- InternalCopy(x);
- return *this;
- }
-
- static DataPiece NullData() { return DataPiece(TYPE_NULL, 0); }
-
- virtual ~DataPiece() {
- }
-
- // Accessors
- Type type() const { return type_; }
-
- bool use_strict_base64_decoding() { return use_strict_base64_decoding_; }
-
- StringPiece str() const {
- GOOGLE_LOG_IF(DFATAL, type_ != TYPE_STRING) << "Not a string type.";
- return str_;
- }
-
-
- // Parses, casts or converts the value stored in the DataPiece into an int32.
- util::StatusOr<int32> ToInt32() const;
-
- // Parses, casts or converts the value stored in the DataPiece into a uint32.
- util::StatusOr<uint32> ToUint32() const;
-
- // Parses, casts or converts the value stored in the DataPiece into an int64.
- util::StatusOr<int64> ToInt64() const;
-
- // Parses, casts or converts the value stored in the DataPiece into a uint64.
- util::StatusOr<uint64> ToUint64() const;
-
- // Parses, casts or converts the value stored in the DataPiece into a double.
- util::StatusOr<double> ToDouble() const;
-
- // Parses, casts or converts the value stored in the DataPiece into a float.
- util::StatusOr<float> ToFloat() const;
-
- // Parses, casts or converts the value stored in the DataPiece into a bool.
- util::StatusOr<bool> ToBool() const;
-
- // Parses, casts or converts the value stored in the DataPiece into a string.
- util::StatusOr<string> ToString() const;
-
- // Tries to convert the value contained in this datapiece to string. If the
- // conversion fails, it returns the default_string.
- string ValueAsStringOrDefault(StringPiece default_string) const;
-
- util::StatusOr<string> ToBytes() const;
-
- // Converts a value into protocol buffer enum number. If the value is a
- // string, first attempts conversion by name, trying names as follows:
- // 1) the directly provided string value.
- // 2) the value upper-cased and replacing '-' by '_'
- // 3) if use_lower_camel_for_enums is true it also attempts by comparing
- // enum name without underscore with the value upper cased above.
- // If the value is not a string, attempts to convert to a 32-bit integer.
- // If none of these succeeds, returns a conversion error status.
- util::StatusOr<int> ToEnum(const google::protobuf::Enum* enum_type,
- bool use_lower_camel_for_enums) const;
-
- private:
- // Disallow implicit constructor.
- DataPiece();
-
- // Helper to create NULL or ENUM types.
- DataPiece(Type type, int32 val)
- : type_(type), i32_(val), use_strict_base64_decoding_(false) {}
-
- // For numeric conversion between
- // int32, int64, uint32, uint64, double, float and bool
- template <typename To>
- util::StatusOr<To> GenericConvert() const;
-
- // For conversion from string to
- // int32, int64, uint32, uint64, double, float and bool
- template <typename To>
- util::StatusOr<To> StringToNumber(bool (*func)(StringPiece, To*)) const;
-
- // Decodes a base64 string. Returns true on success.
- bool DecodeBase64(StringPiece src, string* dest) const;
-
- // Helper function to initialize this DataPiece with 'other'.
- void InternalCopy(const DataPiece& other);
-
- // Data type for this piece of data.
- Type type_;
-
- typedef ::google::protobuf::internal::StringPiecePod StringPiecePod;
-
- // Stored piece of data.
- union {
- int32 i32_;
- int64 i64_;
- uint32 u32_;
- uint64 u64_;
- double double_;
- float float_;
- bool bool_;
- StringPiecePod str_;
- };
-
- // Uses a stricter version of base64 decoding for byte fields.
- bool use_strict_base64_decoding_;
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_DATAPIECE_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc
deleted file mode 100644
index 1772219ab2..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.cc
+++ /dev/null
@@ -1,601 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-
-#include <google/protobuf/stubs/hash.h>
-
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/map_util.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-using util::Status;
-using util::StatusOr;
-namespace converter {
-
-namespace {
-// Helper function to convert string value to given data type by calling the
-// passed converter function on the DataPiece created from "value" argument.
-// If value is empty or if conversion fails, the default_value is returned.
-template <typename T>
-T ConvertTo(StringPiece value, StatusOr<T> (DataPiece::*converter_fn)() const,
- T default_value) {
- if (value.empty()) return default_value;
- StatusOr<T> result = (DataPiece(value, true).*converter_fn)();
- return result.ok() ? result.ValueOrDie() : default_value;
-}
-} // namespace
-
-DefaultValueObjectWriter::DefaultValueObjectWriter(
- TypeResolver* type_resolver, const google::protobuf::Type& type,
- ObjectWriter* ow)
- : typeinfo_(TypeInfo::NewTypeInfo(type_resolver)),
- own_typeinfo_(true),
- type_(type),
- current_(NULL),
- root_(NULL),
- suppress_empty_list_(false),
- field_scrub_callback_(NULL),
- ow_(ow) {}
-
-DefaultValueObjectWriter::~DefaultValueObjectWriter() {
- for (int i = 0; i < string_values_.size(); ++i) {
- delete string_values_[i];
- }
- if (own_typeinfo_) {
- delete typeinfo_;
- }
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderBool(StringPiece name,
- bool value) {
- if (current_ == NULL) {
- ow_->RenderBool(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderInt32(
- StringPiece name, int32 value) {
- if (current_ == NULL) {
- ow_->RenderInt32(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderUint32(
- StringPiece name, uint32 value) {
- if (current_ == NULL) {
- ow_->RenderUint32(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderInt64(
- StringPiece name, int64 value) {
- if (current_ == NULL) {
- ow_->RenderInt64(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderUint64(
- StringPiece name, uint64 value) {
- if (current_ == NULL) {
- ow_->RenderUint64(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderDouble(
- StringPiece name, double value) {
- if (current_ == NULL) {
- ow_->RenderDouble(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderFloat(
- StringPiece name, float value) {
- if (current_ == NULL) {
- ow_->RenderBool(name, value);
- } else {
- RenderDataPiece(name, DataPiece(value));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderString(
- StringPiece name, StringPiece value) {
- if (current_ == NULL) {
- ow_->RenderString(name, value);
- } else {
- // Since StringPiece is essentially a pointer, takes a copy of "value" to
- // avoid ownership issues.
- string_values_.push_back(new string(value.ToString()));
- RenderDataPiece(name, DataPiece(*string_values_.back(), true));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderBytes(
- StringPiece name, StringPiece value) {
- if (current_ == NULL) {
- ow_->RenderBytes(name, value);
- } else {
- // Since StringPiece is essentially a pointer, takes a copy of "value" to
- // avoid ownership issues.
- string_values_.push_back(new string(value.ToString()));
- RenderDataPiece(name, DataPiece(*string_values_.back(), false, true));
- }
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::RenderNull(
- StringPiece name) {
- if (current_ == NULL) {
- ow_->RenderNull(name);
- } else {
- RenderDataPiece(name, DataPiece::NullData());
- }
- return this;
-}
-
-void DefaultValueObjectWriter::RegisterFieldScrubCallBack(
- FieldScrubCallBackPtr field_scrub_callback) {
- field_scrub_callback_.reset(field_scrub_callback.release());
-}
-
-DefaultValueObjectWriter::Node::Node(
- const string& name, const google::protobuf::Type* type, NodeKind kind,
- const DataPiece& data, bool is_placeholder, const std::vector<string>& path,
- bool suppress_empty_list, FieldScrubCallBack* field_scrub_callback)
- : name_(name),
- type_(type),
- kind_(kind),
- is_any_(false),
- data_(data),
- is_placeholder_(is_placeholder),
- path_(path),
- suppress_empty_list_(suppress_empty_list),
- field_scrub_callback_(field_scrub_callback) {}
-
-DefaultValueObjectWriter::Node* DefaultValueObjectWriter::Node::FindChild(
- StringPiece name) {
- if (name.empty() || kind_ != OBJECT) {
- return NULL;
- }
- for (int i = 0; i < children_.size(); ++i) {
- Node* child = children_[i];
- if (child->name() == name) {
- return child;
- }
- }
- return NULL;
-}
-
-void DefaultValueObjectWriter::Node::WriteTo(ObjectWriter* ow) {
- if (kind_ == PRIMITIVE) {
- ObjectWriter::RenderDataPieceTo(data_, name_, ow);
- return;
- }
-
- // Render maps. Empty maps are rendered as "{}".
- if (kind_ == MAP) {
- ow->StartObject(name_);
- WriteChildren(ow);
- ow->EndObject();
- return;
- }
-
- // Write out lists. If we didn't have any list in response, write out empty
- // list.
- if (kind_ == LIST) {
- // Suppress empty lists if requested.
- if (suppress_empty_list_ && is_placeholder_) return;
-
- ow->StartList(name_);
- WriteChildren(ow);
- ow->EndList();
- return;
- }
-
- // If is_placeholder_ = true, we didn't see this node in the response, so
- // skip output.
- if (is_placeholder_) return;
-
- ow->StartObject(name_);
- WriteChildren(ow);
- ow->EndObject();
-}
-
-void DefaultValueObjectWriter::Node::WriteChildren(ObjectWriter* ow) {
- for (int i = 0; i < children_.size(); ++i) {
- Node* child = children_[i];
- child->WriteTo(ow);
- }
-}
-
-const google::protobuf::Type* DefaultValueObjectWriter::Node::GetMapValueType(
- const google::protobuf::Type& found_type, const TypeInfo* typeinfo) {
- // If this field is a map, we should use the type of its "Value" as
- // the type of the child node.
- for (int i = 0; i < found_type.fields_size(); ++i) {
- const google::protobuf::Field& sub_field = found_type.fields(i);
- if (sub_field.number() != 2) {
- continue;
- }
- if (sub_field.kind() != google::protobuf::Field_Kind_TYPE_MESSAGE) {
- // This map's value type is not a message type. We don't need to
- // get the field_type in this case.
- break;
- }
- util::StatusOr<const google::protobuf::Type*> sub_type =
- typeinfo->ResolveTypeUrl(sub_field.type_url());
- if (!sub_type.ok()) {
- GOOGLE_LOG(WARNING) << "Cannot resolve type '" << sub_field.type_url() << "'.";
- } else {
- return sub_type.ValueOrDie();
- }
- break;
- }
- return NULL;
-}
-
-void DefaultValueObjectWriter::Node::PopulateChildren(
- const TypeInfo* typeinfo) {
- // Ignores well known types that don't require automatically populating their
- // primitive children. For type "Any", we only populate its children when the
- // "@type" field is set.
- // TODO(tsun): remove "kStructValueType" from the list. It's being checked
- // now because of a bug in the tool-chain that causes the "oneof_index"
- // of kStructValueType to not be set correctly.
- if (type_ == NULL || type_->name() == kAnyType ||
- type_->name() == kStructType || type_->name() == kTimestampType ||
- type_->name() == kDurationType || type_->name() == kStructValueType) {
- return;
- }
- std::vector<Node*> new_children;
- hash_map<string, int> orig_children_map;
-
- // Creates a map of child nodes to speed up lookup.
- for (int i = 0; i < children_.size(); ++i) {
- InsertIfNotPresent(&orig_children_map, children_[i]->name_, i);
- }
-
- for (int i = 0; i < type_->fields_size(); ++i) {
- const google::protobuf::Field& field = type_->fields(i);
-
- // This code is checking if the field to be added to the tree should be
- // scrubbed or not by calling the field_scrub_callback_ callback function.
- std::vector<string> path;
- if (!path_.empty()) {
- path.insert(path.begin(), path_.begin(), path_.end());
- }
- path.push_back(field.name());
- if (field_scrub_callback_ != NULL &&
- field_scrub_callback_->Run(path, &field)) {
- continue;
- }
-
- hash_map<string, int>::iterator found =
- orig_children_map.find(field.name());
- // If the child field has already been set, we just add it to the new list
- // of children.
- if (found != orig_children_map.end()) {
- new_children.push_back(children_[found->second]);
- children_[found->second] = NULL;
- continue;
- }
-
- const google::protobuf::Type* field_type = NULL;
- bool is_map = false;
- NodeKind kind = PRIMITIVE;
-
- if (field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) {
- kind = OBJECT;
- util::StatusOr<const google::protobuf::Type*> found_result =
- typeinfo->ResolveTypeUrl(field.type_url());
- if (!found_result.ok()) {
- // "field" is of an unknown type.
- GOOGLE_LOG(WARNING) << "Cannot resolve type '" << field.type_url() << "'.";
- } else {
- const google::protobuf::Type* found_type = found_result.ValueOrDie();
- is_map = IsMap(field, *found_type);
-
- if (!is_map) {
- field_type = found_type;
- } else {
- // If this field is a map, we should use the type of its "Value" as
- // the type of the child node.
- field_type = GetMapValueType(*found_type, typeinfo);
- kind = MAP;
- }
- }
- }
-
- if (!is_map &&
- field.cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED) {
- kind = LIST;
- }
-
- // If oneof_index() != 0, the child field is part of a "oneof", which means
- // the child field is optional and we shouldn't populate its default value.
- if (field.oneof_index() != 0) continue;
-
- // If the child field is of primitive type, sets its data to the default
- // value of its type.
- google::protobuf::scoped_ptr<Node> child(new Node(
- field.json_name(), field_type, kind,
- kind == PRIMITIVE ? CreateDefaultDataPieceForField(field, typeinfo)
- : DataPiece::NullData(),
- true, path, suppress_empty_list_, field_scrub_callback_));
- new_children.push_back(child.release());
- }
- // Adds all leftover nodes in children_ to the beginning of new_child.
- for (int i = 0; i < children_.size(); ++i) {
- if (children_[i] == NULL) {
- continue;
- }
- new_children.insert(new_children.begin(), children_[i]);
- children_[i] = NULL;
- }
- children_.swap(new_children);
-}
-
-void DefaultValueObjectWriter::MaybePopulateChildrenOfAny(Node* node) {
- // If this is an "Any" node with "@type" already given and no other children
- // have been added, populates its children.
- if (node != NULL && node->is_any() && node->type() != NULL &&
- node->type()->name() != kAnyType && node->number_of_children() == 1) {
- node->PopulateChildren(typeinfo_);
- }
-}
-
-DataPiece DefaultValueObjectWriter::FindEnumDefault(
- const google::protobuf::Field& field, const TypeInfo* typeinfo) {
- if (!field.default_value().empty())
- return DataPiece(field.default_value(), true);
-
- const google::protobuf::Enum* enum_type =
- typeinfo->GetEnumByTypeUrl(field.type_url());
- if (!enum_type) {
- GOOGLE_LOG(WARNING) << "Could not find enum with type '" << field.type_url()
- << "'";
- return DataPiece::NullData();
- }
- // We treat the first value as the default if none is specified.
- return enum_type->enumvalue_size() > 0
- ? DataPiece(enum_type->enumvalue(0).name(), true)
- : DataPiece::NullData();
-}
-
-DataPiece DefaultValueObjectWriter::CreateDefaultDataPieceForField(
- const google::protobuf::Field& field, const TypeInfo* typeinfo) {
- switch (field.kind()) {
- case google::protobuf::Field_Kind_TYPE_DOUBLE: {
- return DataPiece(ConvertTo<double>(
- field.default_value(), &DataPiece::ToDouble, static_cast<double>(0)));
- }
- case google::protobuf::Field_Kind_TYPE_FLOAT: {
- return DataPiece(ConvertTo<float>(
- field.default_value(), &DataPiece::ToFloat, static_cast<float>(0)));
- }
- case google::protobuf::Field_Kind_TYPE_INT64:
- case google::protobuf::Field_Kind_TYPE_SINT64:
- case google::protobuf::Field_Kind_TYPE_SFIXED64: {
- return DataPiece(ConvertTo<int64>(
- field.default_value(), &DataPiece::ToInt64, static_cast<int64>(0)));
- }
- case google::protobuf::Field_Kind_TYPE_UINT64:
- case google::protobuf::Field_Kind_TYPE_FIXED64: {
- return DataPiece(ConvertTo<uint64>(
- field.default_value(), &DataPiece::ToUint64, static_cast<uint64>(0)));
- }
- case google::protobuf::Field_Kind_TYPE_INT32:
- case google::protobuf::Field_Kind_TYPE_SINT32:
- case google::protobuf::Field_Kind_TYPE_SFIXED32: {
- return DataPiece(ConvertTo<int32>(
- field.default_value(), &DataPiece::ToInt32, static_cast<int32>(0)));
- }
- case google::protobuf::Field_Kind_TYPE_BOOL: {
- return DataPiece(
- ConvertTo<bool>(field.default_value(), &DataPiece::ToBool, false));
- }
- case google::protobuf::Field_Kind_TYPE_STRING: {
- return DataPiece(field.default_value(), true);
- }
- case google::protobuf::Field_Kind_TYPE_BYTES: {
- return DataPiece(field.default_value(), false, true);
- }
- case google::protobuf::Field_Kind_TYPE_UINT32:
- case google::protobuf::Field_Kind_TYPE_FIXED32: {
- return DataPiece(ConvertTo<uint32>(
- field.default_value(), &DataPiece::ToUint32, static_cast<uint32>(0)));
- }
- case google::protobuf::Field_Kind_TYPE_ENUM: {
- return FindEnumDefault(field, typeinfo);
- }
- default: { return DataPiece::NullData(); }
- }
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::StartObject(
- StringPiece name) {
- if (current_ == NULL) {
- std::vector<string> path;
- root_.reset(new Node(name.ToString(), &type_, OBJECT, DataPiece::NullData(),
- false, path, suppress_empty_list_,
- field_scrub_callback_.get()));
- root_->PopulateChildren(typeinfo_);
- current_ = root_.get();
- return this;
- }
- MaybePopulateChildrenOfAny(current_);
- Node* child = current_->FindChild(name);
- if (current_->kind() == LIST || current_->kind() == MAP || child == NULL) {
- // If current_ is a list or a map node, we should create a new child and use
- // the type of current_ as the type of the new child.
- google::protobuf::scoped_ptr<Node> node(new Node(
- name.ToString(), ((current_->kind() == LIST || current_->kind() == MAP)
- ? current_->type()
- : NULL),
- OBJECT, DataPiece::NullData(), false,
- child == NULL ? current_->path() : child->path(),
- suppress_empty_list_, field_scrub_callback_.get()));
- child = node.get();
- current_->AddChild(node.release());
- }
-
- child->set_is_placeholder(false);
- if (child->kind() == OBJECT && child->number_of_children() == 0) {
- child->PopulateChildren(typeinfo_);
- }
-
- stack_.push(current_);
- current_ = child;
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::EndObject() {
- if (stack_.empty()) {
- // The root object ends here. Writes out the tree.
- WriteRoot();
- return this;
- }
- current_ = stack_.top();
- stack_.pop();
- return this;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::StartList(
- StringPiece name) {
- if (current_ == NULL) {
- std::vector<string> path;
- root_.reset(new Node(name.ToString(), &type_, LIST, DataPiece::NullData(),
- false, path, suppress_empty_list_,
- field_scrub_callback_.get()));
- current_ = root_.get();
- return this;
- }
- MaybePopulateChildrenOfAny(current_);
- Node* child = current_->FindChild(name);
- if (child == NULL || child->kind() != LIST) {
- google::protobuf::scoped_ptr<Node> node(
- new Node(name.ToString(), NULL, LIST, DataPiece::NullData(), false,
- child == NULL ? current_->path() : child->path(),
- suppress_empty_list_, field_scrub_callback_.get()));
- child = node.get();
- current_->AddChild(node.release());
- }
- child->set_is_placeholder(false);
-
- stack_.push(current_);
- current_ = child;
- return this;
-}
-
-void DefaultValueObjectWriter::WriteRoot() {
- root_->WriteTo(ow_);
- root_.reset(NULL);
- current_ = NULL;
-}
-
-DefaultValueObjectWriter* DefaultValueObjectWriter::EndList() {
- if (stack_.empty()) {
- WriteRoot();
- return this;
- }
- current_ = stack_.top();
- stack_.pop();
- return this;
-}
-
-void DefaultValueObjectWriter::RenderDataPiece(StringPiece name,
- const DataPiece& data) {
- MaybePopulateChildrenOfAny(current_);
- if (current_->type() != NULL && current_->type()->name() == kAnyType &&
- name == "@type") {
- util::StatusOr<string> data_string = data.ToString();
- if (data_string.ok()) {
- const string& string_value = data_string.ValueOrDie();
- // If the type of current_ is "Any" and its "@type" field is being set
- // here, sets the type of current_ to be the type specified by the
- // "@type".
- util::StatusOr<const google::protobuf::Type*> found_type =
- typeinfo_->ResolveTypeUrl(string_value);
- if (!found_type.ok()) {
- GOOGLE_LOG(WARNING) << "Failed to resolve type '" << string_value << "'.";
- } else {
- current_->set_type(found_type.ValueOrDie());
- }
- current_->set_is_any(true);
- // If the "@type" field is placed after other fields, we should populate
- // other children of primitive type now. Otherwise, we should wait until
- // the first value field is rendered before we populate the children,
- // because the "value" field of a Any message could be omitted.
- if (current_->number_of_children() > 1 && current_->type() != NULL) {
- current_->PopulateChildren(typeinfo_);
- }
- }
- }
- Node* child = current_->FindChild(name);
- if (child == NULL || child->kind() != PRIMITIVE) {
- // No children are found, creates a new child.
- google::protobuf::scoped_ptr<Node> node(
- new Node(name.ToString(), NULL, PRIMITIVE, data, false,
- child == NULL ? current_->path() : child->path(),
- suppress_empty_list_, field_scrub_callback_.get()));
- current_->AddChild(node.release());
- } else {
- child->set_data(data);
- }
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h
deleted file mode 100644
index dc4551c943..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter.h
+++ /dev/null
@@ -1,285 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_DEFAULT_VALUE_OBJECTWRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_DEFAULT_VALUE_OBJECTWRITER_H__
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <stack>
-#include <vector>
-
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/internal/datapiece.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/stringpiece.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// An ObjectWriter that renders non-repeated primitive fields of proto messages
-// with their default values. DefaultValueObjectWriter holds objects, lists and
-// fields it receives in a tree structure and writes them out to another
-// ObjectWriter when EndObject() is called on the root object. It also writes
-// out all non-repeated primitive fields that haven't been explicitly rendered
-// with their default values (0 for numbers, "" for strings, etc).
-class LIBPROTOBUF_EXPORT DefaultValueObjectWriter : public ObjectWriter {
- public:
- // A Callback function to check whether a field needs to be scrubbed.
- //
- // Returns true if the field should not be present in the output. Returns
- // false otherwise.
- //
- // The 'path' parameter is a vector of path to the field from root. For
- // example: if a nested field "a.b.c" (b is the parent message field of c and
- // a is the parent message field of b), then the vector should contain { "a",
- // "b", "c" }.
- //
- // The Field* should point to the google::protobuf::Field of "c".
- typedef ResultCallback2<bool /*return*/,
- const std::vector<string>& /*path of the field*/,
- const google::protobuf::Field* /*field*/>
- FieldScrubCallBack;
-
- // A unique pointer to a DefaultValueObjectWriter::FieldScrubCallBack.
- typedef google::protobuf::scoped_ptr<FieldScrubCallBack> FieldScrubCallBackPtr;
-
- DefaultValueObjectWriter(TypeResolver* type_resolver,
- const google::protobuf::Type& type,
- ObjectWriter* ow);
-
- virtual ~DefaultValueObjectWriter();
-
- // ObjectWriter methods.
- virtual DefaultValueObjectWriter* StartObject(StringPiece name);
-
- virtual DefaultValueObjectWriter* EndObject();
-
- virtual DefaultValueObjectWriter* StartList(StringPiece name);
-
- virtual DefaultValueObjectWriter* EndList();
-
- virtual DefaultValueObjectWriter* RenderBool(StringPiece name, bool value);
-
- virtual DefaultValueObjectWriter* RenderInt32(StringPiece name, int32 value);
-
- virtual DefaultValueObjectWriter* RenderUint32(StringPiece name,
- uint32 value);
-
- virtual DefaultValueObjectWriter* RenderInt64(StringPiece name, int64 value);
-
- virtual DefaultValueObjectWriter* RenderUint64(StringPiece name,
- uint64 value);
-
- virtual DefaultValueObjectWriter* RenderDouble(StringPiece name,
- double value);
-
- virtual DefaultValueObjectWriter* RenderFloat(StringPiece name, float value);
-
- virtual DefaultValueObjectWriter* RenderString(StringPiece name,
- StringPiece value);
- virtual DefaultValueObjectWriter* RenderBytes(StringPiece name,
- StringPiece value);
-
- virtual DefaultValueObjectWriter* RenderNull(StringPiece name);
-
- // Register the callback for scrubbing of fields. Owership of
- // field_scrub_callback pointer is also transferred to this class
- void RegisterFieldScrubCallBack(FieldScrubCallBackPtr field_scrub_callback);
-
- // If set to true, empty lists are suppressed from output when default values
- // are written.
- void set_suppress_empty_list(bool value) { suppress_empty_list_ = value; }
-
- private:
- enum NodeKind {
- PRIMITIVE = 0,
- OBJECT = 1,
- LIST = 2,
- MAP = 3,
- };
-
- // "Node" represents a node in the tree that holds the input of
- // DefaultValueObjectWriter.
- class LIBPROTOBUF_EXPORT Node {
- public:
- Node(const string& name, const google::protobuf::Type* type, NodeKind kind,
- const DataPiece& data, bool is_placeholder,
- const std::vector<string>& path, bool suppress_empty_list,
- FieldScrubCallBack* field_scrub_callback);
- virtual ~Node() {
- for (int i = 0; i < children_.size(); ++i) {
- delete children_[i];
- }
- }
-
- // Adds a child to this node. Takes ownership of this child.
- void AddChild(Node* child) { children_.push_back(child); }
-
- // Finds the child given its name.
- Node* FindChild(StringPiece name);
-
- // Populates children of this Node based on its type. If there are already
- // children created, they will be merged to the result. Caller should pass
- // in TypeInfo for looking up types of the children.
- void PopulateChildren(const TypeInfo* typeinfo);
-
- // If this node is a leaf (has data), writes the current node to the
- // ObjectWriter; if not, then recursively writes the children to the
- // ObjectWriter.
- void WriteTo(ObjectWriter* ow);
-
- // Accessors
- const string& name() const { return name_; }
-
- const std::vector<string>& path() const { return path_; }
-
- const google::protobuf::Type* type() const { return type_; }
-
- void set_type(const google::protobuf::Type* type) { type_ = type; }
-
- NodeKind kind() const { return kind_; }
-
- int number_of_children() const { return children_.size(); }
-
- void set_data(const DataPiece& data) { data_ = data; }
-
- bool is_any() const { return is_any_; }
-
- void set_is_any(bool is_any) { is_any_ = is_any; }
-
- void set_is_placeholder(bool is_placeholder) {
- is_placeholder_ = is_placeholder;
- }
-
- private:
- // Returns the Value Type of a map given the Type of the map entry and a
- // TypeInfo instance.
- const google::protobuf::Type* GetMapValueType(
- const google::protobuf::Type& entry_type, const TypeInfo* typeinfo);
-
- // Calls WriteTo() on every child in children_.
- void WriteChildren(ObjectWriter* ow);
-
- // The name of this node.
- string name_;
- // google::protobuf::Type of this node. Owned by TypeInfo.
- const google::protobuf::Type* type_;
- // The kind of this node.
- NodeKind kind_;
- // Whether this is a node for "Any".
- bool is_any_;
- // The data of this node when it is a leaf node.
- DataPiece data_;
- // Children of this node.
- std::vector<Node*> children_;
- // Whether this node is a placeholder for an object or list automatically
- // generated when creating the parent node. Should be set to false after
- // the parent node's StartObject()/StartList() method is called with this
- // node's name.
- bool is_placeholder_;
-
- // Path of the field of this node
- std::vector<string> path_;
-
- // Whether to suppress empty list output.
- bool suppress_empty_list_;
-
- // Pointer to function for determining whether a field needs to be scrubbed
- // or not. This callback is owned by the creator of this node.
- FieldScrubCallBack* field_scrub_callback_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Node);
- };
-
- // Populates children of "node" if it is an "any" Node and its real type has
- // been given.
- void MaybePopulateChildrenOfAny(Node* node);
-
- // Writes the root_ node to ow_ and resets the root_ and current_ pointer to
- // NULL.
- void WriteRoot();
-
- // Creates a DataPiece containing the default value of the type of the field.
- static DataPiece CreateDefaultDataPieceForField(
- const google::protobuf::Field& field, const TypeInfo* typeinfo);
-
- // Adds or replaces the data_ of a primitive child node.
- void RenderDataPiece(StringPiece name, const DataPiece& data);
-
- // Returns the default enum value as a DataPiece, or the first enum value if
- // there is no default. For proto3, where we cannot specify an explicit
- // default, a zero value will always be returned.
- static DataPiece FindEnumDefault(const google::protobuf::Field& field,
- const TypeInfo* typeinfo);
-
- // Type information for all the types used in the descriptor. Used to find
- // google::protobuf::Type of nested messages/enums.
- const TypeInfo* typeinfo_;
- // Whether the TypeInfo object is owned by this class.
- bool own_typeinfo_;
- // google::protobuf::Type of the root message type.
- const google::protobuf::Type& type_;
- // Holds copies of strings passed to RenderString.
- std::vector<string*> string_values_;
-
- // The current Node. Owned by its parents.
- Node* current_;
- // The root Node.
- google::protobuf::scoped_ptr<Node> root_;
- // The stack to hold the path of Nodes from current_ to root_;
- std::stack<Node*> stack_;
-
- // Whether to suppress output of empty lists.
- bool suppress_empty_list_;
-
- // Unique Pointer to function for determining whether a field needs to be
- // scrubbed or not.
- FieldScrubCallBackPtr field_scrub_callback_;
-
- ObjectWriter* ow_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DefaultValueObjectWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_DEFAULT_VALUE_OBJECTWRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
deleted file mode 100644
index e1dd697aec..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-#include <google/protobuf/util/internal/expecting_objectwriter.h>
-#include <google/protobuf/util/internal/testdata/default_value_test.pb.h>
-#include <google/protobuf/util/internal/type_info_test_helper.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-namespace testing {
-
-using google::protobuf::testing::DefaultValueTest;
-
-// Base class for setting up required state for running default values tests on
-// different descriptors.
-class BaseDefaultValueObjectWriterTest
- : public ::testing::TestWithParam<testing::TypeInfoSource> {
- protected:
- explicit BaseDefaultValueObjectWriterTest(const Descriptor* descriptor)
- : helper_(GetParam()), mock_(), expects_(&mock_) {
- helper_.ResetTypeInfo(descriptor);
- testing_.reset(helper_.NewDefaultValueWriter(
- string(kTypeServiceBaseUrl) + "/" + descriptor->full_name(), &mock_));
- }
-
- virtual ~BaseDefaultValueObjectWriterTest() {}
-
- TypeInfoTestHelper helper_;
- MockObjectWriter mock_;
- ExpectingObjectWriter expects_;
- google::protobuf::scoped_ptr<DefaultValueObjectWriter> testing_;
-};
-
-// Tests to cover some basic DefaultValueObjectWriter use cases. More tests are
-// in the marshalling_test.cc and translator_integration_test.cc.
-class DefaultValueObjectWriterTest : public BaseDefaultValueObjectWriterTest {
- protected:
- DefaultValueObjectWriterTest()
- : BaseDefaultValueObjectWriterTest(DefaultValueTest::descriptor()) {}
- virtual ~DefaultValueObjectWriterTest() {}
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- DefaultValueObjectWriterTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(DefaultValueObjectWriterTest, Empty) {
- // Set expectation
- expects_.StartObject("")
- ->RenderDouble("doubleValue", 0.0)
- ->StartList("repeatedDouble")
- ->EndList()
- ->RenderFloat("floatValue", 0.0)
- ->RenderInt64("int64Value", 0)
- ->RenderUint64("uint64Value", 0)
- ->RenderInt32("int32Value", 0)
- ->RenderUint32("uint32Value", 0)
- ->RenderBool("boolValue", false)
- ->RenderString("stringValue", "")
- ->RenderBytes("bytesValue", "")
- ->RenderString("enumValue", "ENUM_FIRST")
- ->EndObject();
-
- // Actual testing
- testing_->StartObject("")->EndObject();
-}
-
-TEST_P(DefaultValueObjectWriterTest, NonDefaultDouble) {
- // Set expectation
- expects_.StartObject("")
- ->RenderDouble("doubleValue", 1.0)
- ->StartList("repeatedDouble")
- ->EndList()
- ->RenderFloat("floatValue", 0.0)
- ->RenderInt64("int64Value", 0)
- ->RenderUint64("uint64Value", 0)
- ->RenderInt32("int32Value", 0)
- ->RenderUint32("uint32Value", 0)
- ->RenderBool("boolValue", false)
- ->RenderString("stringValue", "")
- ->RenderString("enumValue", "ENUM_FIRST")
- ->EndObject();
-
- // Actual testing
- testing_->StartObject("")->RenderDouble("doubleValue", 1.0)->EndObject();
-}
-
-TEST_P(DefaultValueObjectWriterTest, ShouldRetainUnknownField) {
- // Set expectation
- expects_.StartObject("")
- ->RenderDouble("doubleValue", 1.0)
- ->StartList("repeatedDouble")
- ->EndList()
- ->RenderFloat("floatValue", 0.0)
- ->RenderInt64("int64Value", 0)
- ->RenderUint64("uint64Value", 0)
- ->RenderInt32("int32Value", 0)
- ->RenderUint32("uint32Value", 0)
- ->RenderBool("boolValue", false)
- ->RenderString("stringValue", "")
- ->RenderString("unknown", "abc")
- ->StartObject("unknownObject")
- ->RenderString("unknown", "def")
- ->EndObject()
- ->RenderString("enumValue", "ENUM_FIRST")
- ->EndObject();
-
- // Actual testing
- testing_->StartObject("")
- ->RenderDouble("doubleValue", 1.0)
- ->RenderString("unknown", "abc")
- ->StartObject("unknownObject")
- ->RenderString("unknown", "def")
- ->EndObject()
- ->EndObject();
-}
-
-
-class DefaultValueObjectWriterSuppressListTest
- : public BaseDefaultValueObjectWriterTest {
- protected:
- DefaultValueObjectWriterSuppressListTest()
- : BaseDefaultValueObjectWriterTest(DefaultValueTest::descriptor()) {
- testing_->set_suppress_empty_list(true);
- }
- ~DefaultValueObjectWriterSuppressListTest() {}
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- DefaultValueObjectWriterSuppressListTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(DefaultValueObjectWriterSuppressListTest, Empty) {
- // Set expectation. Emtpy lists should be suppressed.
- expects_.StartObject("")
- ->RenderDouble("doubleValue", 0.0)
- ->RenderFloat("floatValue", 0.0)
- ->RenderInt64("int64Value", 0)
- ->RenderUint64("uint64Value", 0)
- ->RenderInt32("int32Value", 0)
- ->RenderUint32("uint32Value", 0)
- ->RenderBool("boolValue", false)
- ->RenderString("stringValue", "")
- ->RenderBytes("bytesValue", "")
- ->RenderString("enumValue", "ENUM_FIRST")
- ->EndObject();
-
- // Actual testing
- testing_->StartObject("")->EndObject();
-}
-} // namespace testing
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc
deleted file mode 100644
index 538307bae2..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/error_listener.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h
deleted file mode 100644
index 1dc814a360..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/error_listener.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_ERROR_LISTENER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_ERROR_LISTENER_H__
-
-#include <algorithm>
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <string>
-#include <vector>
-
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/util/internal/location_tracker.h>
-#include <google/protobuf/stubs/stringpiece.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// Interface for error listener.
-class LIBPROTOBUF_EXPORT ErrorListener {
- public:
- virtual ~ErrorListener() {}
-
- // Reports an invalid name at the given location.
- virtual void InvalidName(const LocationTrackerInterface& loc,
- StringPiece invalid_name, StringPiece message) = 0;
-
- // Reports an invalid value for a field.
- virtual void InvalidValue(const LocationTrackerInterface& loc,
- StringPiece type_name, StringPiece value) = 0;
-
- // Reports a missing required field.
- virtual void MissingField(const LocationTrackerInterface& loc,
- StringPiece missing_name) = 0;
-
- protected:
- ErrorListener() {}
-
- private:
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorListener);
-};
-
-// An error listener that ignores all errors.
-class LIBPROTOBUF_EXPORT NoopErrorListener : public ErrorListener {
- public:
- NoopErrorListener() {}
- virtual ~NoopErrorListener() {}
-
- virtual void InvalidName(const LocationTrackerInterface& loc,
- StringPiece invalid_name, StringPiece message) {}
-
- virtual void InvalidValue(const LocationTrackerInterface& loc,
- StringPiece type_name, StringPiece value) {}
-
- virtual void MissingField(const LocationTrackerInterface& loc,
- StringPiece missing_name) {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(NoopErrorListener);
-};
-
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_ERROR_LISTENER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h
deleted file mode 100644
index ae98ddd86a..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/expecting_objectwriter.h
+++ /dev/null
@@ -1,238 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__
-
-// An implementation of ObjectWriter that automatically sets the
-// gmock expectations for the response to a method. Every method
-// returns the object itself for chaining.
-//
-// Usage:
-// // Setup
-// MockObjectWriter mock;
-// ExpectingObjectWriter ow(&mock);
-//
-// // Set expectation
-// ow.StartObject("")
-// ->RenderString("key", "value")
-// ->EndObject();
-//
-// // Actual testing
-// mock.StartObject(StringPiece())
-// ->RenderString("key", "value")
-// ->EndObject();
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <gmock/gmock.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using testing::IsEmpty;
-using testing::NanSensitiveDoubleEq;
-using testing::NanSensitiveFloatEq;
-using testing::Return;
-using testing::StrEq;
-using testing::TypedEq;
-
-class MockObjectWriter : public ObjectWriter {
- public:
- MockObjectWriter() {}
-
- MOCK_METHOD1(StartObject, ObjectWriter*(StringPiece));
- MOCK_METHOD0(EndObject, ObjectWriter*());
- MOCK_METHOD1(StartList, ObjectWriter*(StringPiece));
- MOCK_METHOD0(EndList, ObjectWriter*());
- MOCK_METHOD2(RenderBool, ObjectWriter*(StringPiece, bool));
- MOCK_METHOD2(RenderInt32, ObjectWriter*(StringPiece, int32));
- MOCK_METHOD2(RenderUint32, ObjectWriter*(StringPiece, uint32));
- MOCK_METHOD2(RenderInt64, ObjectWriter*(StringPiece, int64));
- MOCK_METHOD2(RenderUint64, ObjectWriter*(StringPiece, uint64));
- MOCK_METHOD2(RenderDouble, ObjectWriter*(StringPiece, double));
- MOCK_METHOD2(RenderFloat, ObjectWriter*(StringPiece, float));
- MOCK_METHOD2(RenderString, ObjectWriter*(StringPiece, StringPiece));
- MOCK_METHOD2(RenderBytes, ObjectWriter*(StringPiece, StringPiece));
- MOCK_METHOD1(RenderNull, ObjectWriter*(StringPiece));
-};
-
-class ExpectingObjectWriter : public ObjectWriter {
- public:
- explicit ExpectingObjectWriter(MockObjectWriter* mock) : mock_(mock) {}
-
- virtual ObjectWriter* StartObject(StringPiece name) {
- (name.empty()
- ? EXPECT_CALL(*mock_, StartObject(IsEmpty()))
- : EXPECT_CALL(*mock_, StartObject(StrEq(name.ToString()))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* EndObject() {
- EXPECT_CALL(*mock_, EndObject())
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* StartList(StringPiece name) {
- (name.empty()
- ? EXPECT_CALL(*mock_, StartList(IsEmpty()))
- : EXPECT_CALL(*mock_, StartList(StrEq(name.ToString()))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* EndList() {
- EXPECT_CALL(*mock_, EndList())
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderBool(StringPiece name, bool value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderBool(IsEmpty(), TypedEq<bool>(value)))
- : EXPECT_CALL(*mock_, RenderBool(StrEq(name.ToString()),
- TypedEq<bool>(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderInt32(StringPiece name, int32 value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderInt32(IsEmpty(), TypedEq<int32>(value)))
- : EXPECT_CALL(*mock_, RenderInt32(StrEq(name.ToString()),
- TypedEq<int32>(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderUint32(StringPiece name, uint32 value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderUint32(IsEmpty(), TypedEq<uint32>(value)))
- : EXPECT_CALL(*mock_, RenderUint32(StrEq(name.ToString()),
- TypedEq<uint32>(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderInt64(StringPiece name, int64 value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderInt64(IsEmpty(), TypedEq<int64>(value)))
- : EXPECT_CALL(*mock_, RenderInt64(StrEq(name.ToString()),
- TypedEq<int64>(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderUint64(StringPiece name, uint64 value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderUint64(IsEmpty(), TypedEq<uint64>(value)))
- : EXPECT_CALL(*mock_, RenderUint64(StrEq(name.ToString()),
- TypedEq<uint64>(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderDouble(StringPiece name, double value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderDouble(IsEmpty(),
- NanSensitiveDoubleEq(value)))
- : EXPECT_CALL(*mock_, RenderDouble(StrEq(name.ToString()),
- NanSensitiveDoubleEq(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderFloat(StringPiece name, float value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderFloat(IsEmpty(),
- NanSensitiveFloatEq(value)))
- : EXPECT_CALL(*mock_, RenderFloat(StrEq(name.ToString()),
- NanSensitiveFloatEq(value))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderString(StringPiece name, StringPiece value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderString(IsEmpty(),
- TypedEq<StringPiece>(value.ToString())))
- : EXPECT_CALL(*mock_, RenderString(StrEq(name.ToString()),
- TypedEq<StringPiece>(value.ToString()))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
- virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderBytes(IsEmpty(), TypedEq<StringPiece>(
- value.ToString())))
- : EXPECT_CALL(*mock_,
- RenderBytes(StrEq(name.ToString()),
- TypedEq<StringPiece>(value.ToString()))))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation();
- return this;
- }
-
- virtual ObjectWriter* RenderNull(StringPiece name) {
- (name.empty() ? EXPECT_CALL(*mock_, RenderNull(IsEmpty()))
- : EXPECT_CALL(*mock_, RenderNull(StrEq(name.ToString())))
- .WillOnce(Return(mock_))
- .RetiresOnSaturation());
- return this;
- }
-
- private:
- MockObjectWriter* mock_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ExpectingObjectWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc
deleted file mode 100644
index 53b90fb05d..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/field_mask_utility.h>
-
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status_macros.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-namespace {
-inline util::Status CallPathSink(PathSinkCallback path_sink,
- StringPiece arg) {
- return path_sink->Run(arg);
-}
-
-util::Status CreatePublicError(util::error::Code code,
- const string& message) {
- return util::Status(code, message);
-}
-
-// Appends a FieldMask path segment to a prefix.
-string AppendPathSegmentToPrefix(StringPiece prefix, StringPiece segment) {
- if (prefix.empty()) {
- return segment.ToString();
- }
- if (segment.empty()) {
- return prefix.ToString();
- }
- // If the segment is a map key, appends it to the prefix without the ".".
- if (segment.starts_with("[\"")) {
- return StrCat(prefix, segment);
- }
- return StrCat(prefix, ".", segment);
-}
-
-} // namespace
-
-string ConvertFieldMaskPath(const StringPiece path,
- ConverterCallback converter) {
- string result;
- result.reserve(path.size() << 1);
-
- bool is_quoted = false;
- bool is_escaping = false;
- int current_segment_start = 0;
-
- // Loops until 1 passed the end of the input to make handling the last
- // segment easier.
- for (size_t i = 0; i <= path.size(); ++i) {
- // Outputs quoted string as-is.
- if (is_quoted) {
- if (i == path.size()) {
- break;
- }
- result.push_back(path[i]);
- if (is_escaping) {
- is_escaping = false;
- } else if (path[i] == '\\') {
- is_escaping = true;
- } else if (path[i] == '\"') {
- current_segment_start = i + 1;
- is_quoted = false;
- }
- continue;
- }
- if (i == path.size() || path[i] == '.' || path[i] == '(' ||
- path[i] == ')' || path[i] == '\"') {
- result += converter(
- path.substr(current_segment_start, i - current_segment_start));
- if (i < path.size()) {
- result.push_back(path[i]);
- }
- current_segment_start = i + 1;
- }
- if (i < path.size() && path[i] == '\"') {
- is_quoted = true;
- }
- }
- return result;
-}
-
-util::Status DecodeCompactFieldMaskPaths(StringPiece paths,
- PathSinkCallback path_sink) {
- std::stack<string> prefix;
- int length = paths.length();
- int previous_position = 0;
- bool in_map_key = false;
- bool is_escaping = false;
- // Loops until 1 passed the end of the input to make the handle of the last
- // segment easier.
- for (int i = 0; i <= length; ++i) {
- if (i != length) {
- // Skips everything in a map key until we hit the end of it, which is
- // marked by an un-escaped '"' immediately followed by a ']'.
- if (in_map_key) {
- if (is_escaping) {
- is_escaping = false;
- continue;
- }
- if (paths[i] == '\\') {
- is_escaping = true;
- continue;
- }
- if (paths[i] != '\"') {
- continue;
- }
- // Un-escaped '"' must be followed with a ']'.
- if (i >= length - 1 || paths[i + 1] != ']') {
- return util::Status(
- util::error::INVALID_ARGUMENT,
- StrCat("Invalid FieldMask '", paths,
- "'. Map keys should be represented as [\"some_key\"]."));
- }
- // The end of the map key ("\"]") has been found.
- in_map_key = false;
- // Skips ']'.
- i++;
- // Checks whether the key ends at the end of a path segment.
- if (i < length - 1 && paths[i + 1] != '.' && paths[i + 1] != ',' &&
- paths[i + 1] != ')' && paths[i + 1] != '(') {
- return util::Status(
- util::error::INVALID_ARGUMENT,
- StrCat("Invalid FieldMask '", paths,
- "'. Map keys should be at the end of a path segment."));
- }
- is_escaping = false;
- continue;
- }
-
- // We are not in a map key, look for the start of one.
- if (paths[i] == '[') {
- if (i >= length - 1 || paths[i + 1] != '\"') {
- return util::Status(
- util::error::INVALID_ARGUMENT,
- StrCat("Invalid FieldMask '", paths,
- "'. Map keys should be represented as [\"some_key\"]."));
- }
- // "[\"" starts a map key.
- in_map_key = true;
- i++; // Skips the '\"'.
- continue;
- }
- // If the current character is not a special character (',', '(' or ')'),
- // continue to the next.
- if (paths[i] != ',' && paths[i] != ')' && paths[i] != '(') {
- continue;
- }
- }
- // Gets the current segment - sub-string between previous position (after
- // '(', ')', ',', or the beginning of the input) and the current position.
- StringPiece segment =
- paths.substr(previous_position, i - previous_position);
- string current_prefix = prefix.empty() ? "" : prefix.top();
-
- if (i < length && paths[i] == '(') {
- // Builds a prefix and save it into the stack.
- prefix.push(AppendPathSegmentToPrefix(current_prefix, segment));
- } else if (!segment.empty()) {
- // When the current charactor is ')', ',' or the current position has
- // passed the end of the input, builds and outputs a new paths by
- // concatenating the last prefix with the current segment.
- RETURN_IF_ERROR(CallPathSink(
- path_sink, AppendPathSegmentToPrefix(current_prefix, segment)));
- }
-
- // Removes the last prefix after seeing a ')'.
- if (i < length && paths[i] == ')') {
- if (prefix.empty()) {
- return util::Status(
- util::error::INVALID_ARGUMENT,
- StrCat("Invalid FieldMask '", paths,
- "'. Cannot find matching '(' for all ')'."));
- }
- prefix.pop();
- }
- previous_position = i + 1;
- }
- if (in_map_key) {
- return util::Status(util::error::INVALID_ARGUMENT,
- StrCat("Invalid FieldMask '", paths,
- "'. Cannot find matching ']' for all '['."));
- }
- if (!prefix.empty()) {
- return util::Status(util::error::INVALID_ARGUMENT,
- StrCat("Invalid FieldMask '", paths,
- "'. Cannot find matching ')' for all '('."));
- }
- return util::Status::OK;
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h
deleted file mode 100644
index 59f36f756f..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/field_mask_utility.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// FieldMask related utility methods.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_FIELD_MASK_UTILITY_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_FIELD_MASK_UTILITY_H__
-
-#include <functional>
-#include <stack>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/status.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-typedef string (*ConverterCallback)(StringPiece);
-typedef ResultCallback1<util::Status, StringPiece>* PathSinkCallback;
-
-// Applies a 'converter' to each segment of a FieldMask path and returns the
-// result. Quoted strings in the 'path' are copied to the output as-is without
-// converting their content. Escaping is supported within quoted strings.
-// For example, "ab\"_c" will be returned as "ab\"_c" without any changes.
-string ConvertFieldMaskPath(const StringPiece path,
- ConverterCallback converter);
-
-// Decodes a compact list of FieldMasks. For example, "a.b,a.c.d,a.c.e" will be
-// decoded into a list of field paths - "a.b", "a.c.d", "a.c.e". And the results
-// will be sent to 'path_sink', i.e. 'path_sink' will be called once per
-// resulting path.
-// Note that we also support Apiary style FieldMask form. The above example in
-// the Apiary style will look like "a.b,a.c(d,e)".
-util::Status DecodeCompactFieldMaskPaths(StringPiece paths,
- PathSinkCallback path_sink);
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_FIELD_MASK_UTILITY_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc
deleted file mode 100644
index 47e4dd6df9..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.cc
+++ /dev/null
@@ -1,404 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/json_escaping.h>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-namespace {
-
-// Array of hex characters for conversion to hex.
-static const char kHex[] = "0123456789abcdef";
-
-// Characters 0x00 to 0x9f are very commonly used, so we provide a special
-// table lookup.
-//
-// For unicode code point ch < 0xa0:
-// kCommonEscapes[ch] is the escaped string of ch, if escaping is needed;
-// or an empty string, if escaping is not needed.
-static const char kCommonEscapes[160][7] = {
- // C0 (ASCII and derivatives) control characters
- "\\u0000", "\\u0001", "\\u0002", "\\u0003", // 0x00
- "\\u0004", "\\u0005", "\\u0006", "\\u0007",
- "\\b", "\\t", "\\n", "\\u000b",
- "\\f", "\\r", "\\u000e", "\\u000f",
- "\\u0010", "\\u0011", "\\u0012", "\\u0013", // 0x10
- "\\u0014", "\\u0015", "\\u0016", "\\u0017",
- "\\u0018", "\\u0019", "\\u001a", "\\u001b",
- "\\u001c", "\\u001d", "\\u001e", "\\u001f",
- // Escaping of " and \ are required by www.json.org string definition.
- // Escaping of < and > are required for HTML security.
- "", "", "\\\"", "", "", "", "", "", // 0x20
- "", "", "", "", "", "", "", "",
- "", "", "", "", "", "", "", "", // 0x30
- "", "", "", "", "\\u003c", "", "\\u003e", "",
- "", "", "", "", "", "", "", "", // 0x40
- "", "", "", "", "", "", "", "",
- "", "", "", "", "", "", "", "", // 0x50
- "", "", "", "", "\\\\", "", "", "",
- "", "", "", "", "", "", "", "", // 0x60
- "", "", "", "", "", "", "", "",
- "", "", "", "", "", "", "", "", // 0x70
- "", "", "", "", "", "", "", "\\u007f",
- // C1 (ISO 8859 and Unicode) extended control characters
- "\\u0080", "\\u0081", "\\u0082", "\\u0083", // 0x80
- "\\u0084", "\\u0085", "\\u0086", "\\u0087",
- "\\u0088", "\\u0089", "\\u008a", "\\u008b",
- "\\u008c", "\\u008d", "\\u008e", "\\u008f",
- "\\u0090", "\\u0091", "\\u0092", "\\u0093", // 0x90
- "\\u0094", "\\u0095", "\\u0096", "\\u0097",
- "\\u0098", "\\u0099", "\\u009a", "\\u009b",
- "\\u009c", "\\u009d", "\\u009e", "\\u009f"
-};
-
-// Determines if the given char value is a unicode high-surrogate code unit.
-// Such values do not represent characters by themselves, but are used in the
-// representation of supplementary characters in the utf-16 encoding.
-inline bool IsHighSurrogate(uint16 c) {
- // Optimized form of:
- // return c >= kMinHighSurrogate && c <= kMaxHighSurrogate;
- // (Reduced from 3 ALU instructions to 2 ALU instructions)
- return (c & ~(JsonEscaping::kMaxHighSurrogate -
- JsonEscaping::kMinHighSurrogate))
- == JsonEscaping::kMinHighSurrogate;
-}
-
-// Determines if the given char value is a unicode low-surrogate code unit.
-// Such values do not represent characters by themselves, but are used in the
-// representation of supplementary characters in the utf-16 encoding.
-inline bool IsLowSurrogate(uint16 c) {
- // Optimized form of:
- // return c >= kMinLowSurrogate && c <= kMaxLowSurrogate;
- // (Reduced from 3 ALU instructions to 2 ALU instructions)
- return (c & ~(JsonEscaping::kMaxLowSurrogate -
- JsonEscaping::kMinLowSurrogate))
- == JsonEscaping::kMinLowSurrogate;
-}
-
-// Determines if the given char value is a unicode surrogate code unit (either
-// high-surrogate or low-surrogate).
-inline bool IsSurrogate(uint32 c) {
- // Optimized form of:
- // return c >= kMinHighSurrogate && c <= kMaxLowSurrogate;
- // (Reduced from 3 ALU instructions to 2 ALU instructions)
- return (c & 0xfffff800) == JsonEscaping::kMinHighSurrogate;
-}
-
-// Returns true if the given unicode code point cp is
-// in the supplementary character range.
-inline bool IsSupplementalCodePoint(uint32 cp) {
- // Optimized form of:
- // return kMinSupplementaryCodePoint <= cp && cp <= kMaxCodePoint;
- // (Reduced from 3 ALU instructions to 2 ALU instructions)
- return (cp & ~(JsonEscaping::kMinSupplementaryCodePoint - 1))
- < JsonEscaping::kMaxCodePoint;
-}
-
-// Returns true if the given unicode code point cp is a valid
-// unicode code point (i.e. in the range 0 <= cp <= kMaxCodePoint).
-inline bool IsValidCodePoint(uint32 cp) {
- return cp <= JsonEscaping::kMaxCodePoint;
-}
-
-// Converts the specified surrogate pair to its supplementary code point value.
-// It is the callers' responsibility to validate the specified surrogate pair.
-inline uint32 ToCodePoint(uint16 high, uint16 low) {
- // Optimized form of:
- // return ((high - kMinHighSurrogate) << 10)
- // + (low - kMinLowSurrogate)
- // + kMinSupplementaryCodePoint;
- // (Reduced from 5 ALU instructions to 3 ALU instructions)
- return (high << 10) + low +
- (JsonEscaping::kMinSupplementaryCodePoint
- - (static_cast<unsigned>(JsonEscaping::kMinHighSurrogate) << 10)
- - JsonEscaping::kMinLowSurrogate);
-}
-
-// Returns the low surrogate for the given unicode code point. The result is
-// meaningless if the given code point is not a supplementary character.
-inline uint16 ToLowSurrogate(uint32 cp) {
- return (cp & (JsonEscaping::kMaxLowSurrogate
- - JsonEscaping::kMinLowSurrogate))
- + JsonEscaping::kMinLowSurrogate;
-}
-
-// Returns the high surrogate for the given unicode code point. The result is
-// meaningless if the given code point is not a supplementary character.
-inline uint16 ToHighSurrogate(uint32 cp) {
- return (cp >> 10) + (JsonEscaping::kMinHighSurrogate -
- (JsonEscaping::kMinSupplementaryCodePoint >> 10));
-}
-
-// Input str is encoded in UTF-8. A unicode code point could be encoded in
-// UTF-8 using anywhere from 1 to 4 characters, and it could span multiple
-// reads of the ByteSource.
-//
-// This function reads the next unicode code point from the input (str) at
-// the given position (index), taking into account any left-over partial
-// code point from the previous iteration (cp), together with the number
-// of characters left to read to complete this code point (num_left).
-//
-// This function assumes that the input (str) is valid at the given position
-// (index). In order words, at least one character could be read successfully.
-//
-// The code point read (partial or complete) is stored in (cp). Upon return,
-// (num_left) stores the number of characters that has yet to be read in
-// order to complete the current unicode code point. If the read is complete,
-// then (num_left) is 0. Also, (num_read) is the number of characters read.
-//
-// Returns false if we encounter an invalid UTF-8 string. Returns true
-// otherwise, including the case when we reach the end of the input (str)
-// before a complete unicode code point is read.
-bool ReadCodePoint(StringPiece str, int index,
- uint32 *cp, int* num_left, int *num_read) {
- if (*num_left == 0) {
- // Last read was complete. Start reading a new unicode code point.
- *cp = static_cast<uint8>(str[index++]);
- *num_read = 1;
- // The length of the code point is determined from reading the first byte.
- //
- // If the first byte is between:
- // 0..0x7f: that's the value of the code point.
- // 0x80..0xbf: <invalid>
- // 0xc0..0xdf: 11-bit code point encoded in 2 bytes.
- // bit 10-6, bit 5-0
- // 0xe0..0xef: 16-bit code point encoded in 3 bytes.
- // bit 15-12, bit 11-6, bit 5-0
- // 0xf0..0xf7: 21-bit code point encoded in 4 bytes.
- // bit 20-18, bit 17-12, bit 11-6, bit 5-0
- // 0xf8..0xff: <invalid>
- //
- // Meaning of each bit:
- // <msb> bit 7: 0 - single byte code point: bits 6-0 are values.
- // 1 - multibyte code point
- // bit 6: 0 - subsequent bytes of multibyte code point:
- // bits 5-0 are values.
- // 1 - first byte of multibyte code point
- // bit 5: 0 - first byte of 2-byte code point: bits 4-0 are values.
- // 1 - first byte of code point with >= 3 bytes.
- // bit 4: 0 - first byte of 3-byte code point: bits 3-0 are values.
- // 1 - first byte of code point with >= 4 bytes.
- // bit 3: 0 - first byte of 4-byte code point: bits 2-0 are values.
- // 1 - reserved for future expansion.
- if (*cp <= 0x7f) {
- return true;
- } else if (*cp <= 0xbf) {
- return false;
- } else if (*cp <= 0xdf) {
- *cp &= 0x1f;
- *num_left = 1;
- } else if (*cp <= 0xef) {
- *cp &= 0x0f;
- *num_left = 2;
- } else if (*cp <= 0xf7) {
- *cp &= 0x07;
- *num_left = 3;
- } else {
- return false;
- }
- } else {
- // Last read was partial. Initialize num_read to 0 and continue reading
- // the last unicode code point.
- *num_read = 0;
- }
- while (*num_left > 0 && index < str.size()) {
- uint32 ch = static_cast<uint8>(str[index++]);
- --(*num_left);
- ++(*num_read);
- *cp = (*cp << 6) | (ch & 0x3f);
- if (ch < 0x80 || ch > 0xbf) return false;
- }
- return *num_left > 0 || (!IsSurrogate(*cp) && IsValidCodePoint(*cp));
-}
-
-// Stores the 16-bit unicode code point as its hexadecimal digits in buffer
-// and returns a StringPiece that points to this buffer. The input buffer needs
-// to be at least 6 bytes long.
-StringPiece ToHex(uint16 cp, char* buffer) {
- buffer[5] = kHex[cp & 0x0f];
- cp >>= 4;
- buffer[4] = kHex[cp & 0x0f];
- cp >>= 4;
- buffer[3] = kHex[cp & 0x0f];
- cp >>= 4;
- buffer[2] = kHex[cp & 0x0f];
- return StringPiece(buffer).substr(0, 6);
-}
-
-// Stores the 32-bit unicode code point as its hexadecimal digits in buffer
-// and returns a StringPiece that points to this buffer. The input buffer needs
-// to be at least 12 bytes long.
-StringPiece ToSurrogateHex(uint32 cp, char* buffer) {
- uint16 low = ToLowSurrogate(cp);
- uint16 high = ToHighSurrogate(cp);
-
- buffer[11] = kHex[low & 0x0f];
- low >>= 4;
- buffer[10] = kHex[low & 0x0f];
- low >>= 4;
- buffer[9] = kHex[low & 0x0f];
- low >>= 4;
- buffer[8] = kHex[low & 0x0f];
-
- buffer[5] = kHex[high & 0x0f];
- high >>= 4;
- buffer[4] = kHex[high & 0x0f];
- high >>= 4;
- buffer[3] = kHex[high & 0x0f];
- high >>= 4;
- buffer[2] = kHex[high & 0x0f];
-
- return StringPiece(buffer, 12);
-}
-
-// If the given unicode code point needs escaping, then returns the
-// escaped form. The returned StringPiece either points to statically
-// pre-allocated char[] or to the given buffer. The input buffer needs
-// to be at least 12 bytes long.
-//
-// If the given unicode code point does not need escaping, an empty
-// StringPiece is returned.
-StringPiece EscapeCodePoint(uint32 cp, char* buffer) {
- if (cp < 0xa0) return kCommonEscapes[cp];
- switch (cp) {
- // These are not required by json spec
- // but used to prevent security bugs in javascript.
- case 0xfeff: // Zero width no-break space
- case 0xfff9: // Interlinear annotation anchor
- case 0xfffa: // Interlinear annotation separator
- case 0xfffb: // Interlinear annotation terminator
-
- case 0x00ad: // Soft-hyphen
- case 0x06dd: // Arabic end of ayah
- case 0x070f: // Syriac abbreviation mark
- case 0x17b4: // Khmer vowel inherent Aq
- case 0x17b5: // Khmer vowel inherent Aa
- return ToHex(cp, buffer);
-
- default:
- if ((cp >= 0x0600 && cp <= 0x0603) || // Arabic signs
- (cp >= 0x200b && cp <= 0x200f) || // Zero width etc.
- (cp >= 0x2028 && cp <= 0x202e) || // Separators etc.
- (cp >= 0x2060 && cp <= 0x2064) || // Invisible etc.
- (cp >= 0x206a && cp <= 0x206f)) { // Shaping etc.
- return ToHex(cp, buffer);
- }
-
- if (cp == 0x000e0001 || // Language tag
- (cp >= 0x0001d173 && cp <= 0x0001d17a) || // Music formatting
- (cp >= 0x000e0020 && cp <= 0x000e007f)) { // TAG symbols
- return ToSurrogateHex(cp, buffer);
- }
- }
- return StringPiece();
-}
-
-// Tries to escape the given code point first. If the given code point
-// does not need to be escaped, but force_output is true, then render
-// the given multi-byte code point in UTF8 in the buffer and returns it.
-StringPiece EscapeCodePoint(uint32 cp, char* buffer, bool force_output) {
- StringPiece sp = EscapeCodePoint(cp, buffer);
- if (force_output && sp.empty()) {
- buffer[5] = (cp & 0x3f) | 0x80;
- cp >>= 6;
- if (cp <= 0x1f) {
- buffer[4] = cp | 0xc0;
- sp = StringPiece(buffer + 4, 2);
- return sp;
- }
- buffer[4] = (cp & 0x3f) | 0x80;
- cp >>= 6;
- if (cp <= 0x0f) {
- buffer[3] = cp | 0xe0;
- sp = StringPiece(buffer + 3, 3);
- return sp;
- }
- buffer[3] = (cp & 0x3f) | 0x80;
- buffer[2] = ((cp >> 6) & 0x07) | 0xf0;
- sp = StringPiece(buffer + 2, 4);
- }
- return sp;
-}
-
-} // namespace
-
-void JsonEscaping::Escape(strings::ByteSource* input,
- strings::ByteSink* output) {
- char buffer[12] = "\\udead\\ubee";
- uint32 cp = 0; // Current unicode code point.
- int num_left = 0; // Num of chars to read to complete the code point.
- while (input->Available() > 0) {
- StringPiece str = input->Peek();
- StringPiece escaped;
- int i = 0;
- int num_read;
- bool ok;
- bool cp_was_split = num_left > 0;
- // Loop until we encounter either
- // i) a code point that needs to be escaped; or
- // ii) a split code point is completely read; or
- // iii) a character that is not a valid utf8; or
- // iv) end of the StringPiece str is reached.
- do {
- ok = ReadCodePoint(str, i, &cp, &num_left, &num_read);
- if (num_left > 0 || !ok) break; // case iii or iv
- escaped = EscapeCodePoint(cp, buffer, cp_was_split);
- if (!escaped.empty()) break; // case i or ii
- i += num_read;
- num_read = 0;
- } while (i < str.length()); // case iv
- // First copy the un-escaped prefix, if any, to the output ByteSink.
- if (i > 0) input->CopyTo(output, i);
- if (num_read > 0) input->Skip(num_read);
- if (!ok) {
- // Case iii: Report error.
- // TODO(wpoon): Add error reporting.
- num_left = 0;
- } else if (num_left == 0 && !escaped.empty()) {
- // Case i or ii: Append the escaped code point to the output ByteSink.
- output->Append(escaped.data(), escaped.size());
- }
- }
- if (num_left > 0) {
- // Treat as case iii: report error.
- // TODO(wpoon): Add error reporting.
- }
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h
deleted file mode 100644
index e3e329fc96..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_escaping.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_
-#define NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/bytestream.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class JsonEscaping {
- public:
- // The minimum value of a unicode high-surrogate code unit in the utf-16
- // encoding. A high-surrogate is also known as a leading-surrogate.
- // See http://www.unicode.org/glossary/#high_surrogate_code_unit
- static const uint16 kMinHighSurrogate = 0xd800;
-
- // The maximum value of a unicide high-surrogate code unit in the utf-16
- // encoding. A high-surrogate is also known as a leading-surrogate.
- // See http://www.unicode.org/glossary/#high_surrogate_code_unit
- static const uint16 kMaxHighSurrogate = 0xdbff;
-
- // The minimum value of a unicode low-surrogate code unit in the utf-16
- // encoding. A low-surrogate is also known as a trailing-surrogate.
- // See http://www.unicode.org/glossary/#low_surrogate_code_unit
- static const uint16 kMinLowSurrogate = 0xdc00;
-
- // The maximum value of a unicode low-surrogate code unit in the utf-16
- // encoding. A low-surrogate is also known as a trailing surrogate.
- // See http://www.unicode.org/glossary/#low_surrogate_code_unit
- static const uint16 kMaxLowSurrogate = 0xdfff;
-
- // The minimum value of a unicode supplementary code point.
- // See http://www.unicode.org/glossary/#supplementary_code_point
- static const uint32 kMinSupplementaryCodePoint = 0x010000;
-
- // The minimum value of a unicode code point.
- // See http://www.unicode.org/glossary/#code_point
- static const uint32 kMinCodePoint = 0x000000;
-
- // The maximum value of a unicode code point.
- // See http://www.unicode.org/glossary/#code_point
- static const uint32 kMaxCodePoint = 0x10ffff;
-
- JsonEscaping() {}
- virtual ~JsonEscaping() {}
-
- // Escape the given ByteSource to the given ByteSink.
- static void Escape(strings::ByteSource* input, strings::ByteSink* output);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JsonEscaping);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-#endif // NET_PROTO2_UTIL_CONVERTER_STRINGS_JSON_ESCAPING_H_
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc
deleted file mode 100644
index 6e4edd8836..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.cc
+++ /dev/null
@@ -1,196 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/json_objectwriter.h>
-
-#include <math.h>
-
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/util/internal/json_escaping.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/mathlimits.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using strings::ArrayByteSource;
-;
-
-JsonObjectWriter::~JsonObjectWriter() {
- if (!element_->is_root()) {
- GOOGLE_LOG(WARNING) << "JsonObjectWriter was not fully closed.";
- }
-}
-
-JsonObjectWriter* JsonObjectWriter::StartObject(StringPiece name) {
- WritePrefix(name);
- WriteChar('{');
- Push();
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::EndObject() {
- Pop();
- WriteChar('}');
- if (element()->is_root()) NewLine();
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::StartList(StringPiece name) {
- WritePrefix(name);
- WriteChar('[');
- Push();
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::EndList() {
- Pop();
- WriteChar(']');
- if (element()->is_root()) NewLine();
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderBool(StringPiece name, bool value) {
- return RenderSimple(name, value ? "true" : "false");
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderInt32(StringPiece name, int32 value) {
- return RenderSimple(name, SimpleItoa(value));
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderUint32(StringPiece name,
- uint32 value) {
- return RenderSimple(name, SimpleItoa(value));
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderInt64(StringPiece name, int64 value) {
- WritePrefix(name);
- WriteChar('"');
- stream_->WriteString(SimpleItoa(value));
- WriteChar('"');
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderUint64(StringPiece name,
- uint64 value) {
- WritePrefix(name);
- WriteChar('"');
- stream_->WriteString(SimpleItoa(value));
- WriteChar('"');
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderDouble(StringPiece name,
- double value) {
- if (MathLimits<double>::IsFinite(value)) {
- return RenderSimple(name, SimpleDtoa(value));
- }
-
- // Render quoted with NaN/Infinity-aware DoubleAsString.
- return RenderString(name, DoubleAsString(value));
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderFloat(StringPiece name, float value) {
- if (MathLimits<float>::IsFinite(value)) {
- return RenderSimple(name, SimpleFtoa(value));
- }
-
- // Render quoted with NaN/Infinity-aware FloatAsString.
- return RenderString(name, FloatAsString(value));
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderString(StringPiece name,
- StringPiece value) {
- WritePrefix(name);
- WriteChar('"');
- ArrayByteSource source(value);
- JsonEscaping::Escape(&source, &sink_);
- WriteChar('"');
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderBytes(StringPiece name,
- StringPiece value) {
- WritePrefix(name);
- string base64;
-
- if (use_websafe_base64_for_bytes_)
- WebSafeBase64EscapeWithPadding(value.ToString(), &base64);
- else
- Base64Escape(value, &base64);
-
- WriteChar('"');
- // TODO(wpoon): Consider a ByteSink solution that writes the base64 bytes
- // directly to the stream, rather than first putting them
- // into a string and then writing them to the stream.
- stream_->WriteRaw(base64.data(), base64.size());
- WriteChar('"');
- return this;
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderNull(StringPiece name) {
- return RenderSimple(name, "null");
-}
-
-JsonObjectWriter* JsonObjectWriter::RenderNullAsEmpty(StringPiece name) {
- return RenderSimple(name, "");
-}
-
-void JsonObjectWriter::WritePrefix(StringPiece name) {
- bool not_first = !element()->is_first();
- if (not_first) WriteChar(',');
- if (not_first || !element()->is_root()) NewLine();
- bool empty_key_ok = GetAndResetEmptyKeyOk();
- if (!name.empty() || empty_key_ok) {
- WriteChar('"');
- if (!name.empty()) {
- ArrayByteSource source(name);
- JsonEscaping::Escape(&source, &sink_);
- }
- stream_->WriteString("\":");
- if (!indent_string_.empty()) WriteChar(' ');
- }
-}
-
-bool JsonObjectWriter::GetAndResetEmptyKeyOk() {
- bool retval = empty_name_ok_for_next_key_;
- empty_name_ok_for_next_key_ = false;
- return retval;
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h
deleted file mode 100644
index 31edc2927f..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter.h
+++ /dev/null
@@ -1,233 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_OBJECTWRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_OBJECTWRITER_H__
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <string>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/util/internal/structured_objectwriter.h>
-#include <google/protobuf/stubs/bytestream.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// An ObjectWriter implementation that outputs JSON. This ObjectWriter
-// supports writing a compact form or a pretty printed form.
-//
-// Sample usage:
-// string output;
-// StringOutputStream* str_stream = new StringOutputStream(&output);
-// CodedOutputStream* out_stream = new CodedOutputStream(str_stream);
-// JsonObjectWriter* ow = new JsonObjectWriter(" ", out_stream);
-// ow->StartObject("")
-// ->RenderString("name", "value")
-// ->RenderString("emptystring", string())
-// ->StartObject("nested")
-// ->RenderInt64("light", 299792458);
-// ->RenderDouble("pi", 3.141592653589793);
-// ->EndObject()
-// ->StartList("empty")
-// ->EndList()
-// ->EndObject();
-//
-// And then the output string would become:
-// {
-// "name": "value",
-// "emptystring": "",
-// "nested": {
-// "light": "299792458",
-// "pi": 3.141592653589793
-// },
-// "empty": []
-// }
-//
-// JsonObjectWriter does not validate if calls actually result in valid JSON.
-// For example, passing an empty name when one would be required won't result
-// in an error, just an invalid output.
-//
-// Note that all int64 and uint64 are rendered as strings instead of numbers.
-// This is because JavaScript parses numbers as 64-bit float thus int64 and
-// uint64 would lose precision if rendered as numbers.
-//
-// JsonObjectWriter is thread-unsafe.
-class LIBPROTOBUF_EXPORT JsonObjectWriter : public StructuredObjectWriter {
- public:
- JsonObjectWriter(StringPiece indent_string,
- google::protobuf::io::CodedOutputStream* out)
- : element_(new Element(NULL)),
- stream_(out),
- sink_(out),
- indent_string_(indent_string.ToString()),
- use_websafe_base64_for_bytes_(false),
- empty_name_ok_for_next_key_(false) {}
- virtual ~JsonObjectWriter();
-
- // ObjectWriter methods.
- virtual JsonObjectWriter* StartObject(StringPiece name);
- virtual JsonObjectWriter* EndObject();
- virtual JsonObjectWriter* StartList(StringPiece name);
- virtual JsonObjectWriter* EndList();
- virtual JsonObjectWriter* RenderBool(StringPiece name, bool value);
- virtual JsonObjectWriter* RenderInt32(StringPiece name, int32 value);
- virtual JsonObjectWriter* RenderUint32(StringPiece name, uint32 value);
- virtual JsonObjectWriter* RenderInt64(StringPiece name, int64 value);
- virtual JsonObjectWriter* RenderUint64(StringPiece name, uint64 value);
- virtual JsonObjectWriter* RenderDouble(StringPiece name, double value);
- virtual JsonObjectWriter* RenderFloat(StringPiece name, float value);
- virtual JsonObjectWriter* RenderString(StringPiece name, StringPiece value);
- virtual JsonObjectWriter* RenderBytes(StringPiece name, StringPiece value);
- virtual JsonObjectWriter* RenderNull(StringPiece name);
- virtual JsonObjectWriter* RenderNullAsEmpty(StringPiece name);
-
- void set_use_websafe_base64_for_bytes(bool value) {
- use_websafe_base64_for_bytes_ = value;
- }
-
- // Whether empty strings should be rendered for the next JSON key. This
- // setting is only valid until the next key is rendered, after which it gets
- // reset to false.
- virtual void empty_name_ok_for_next_key() {
- empty_name_ok_for_next_key_ = true;
- }
-
- protected:
- class LIBPROTOBUF_EXPORT Element : public BaseElement {
- public:
- explicit Element(Element* parent) : BaseElement(parent), is_first_(true) {}
-
- // Called before each field of the Element is to be processed.
- // Returns true if this is the first call (processing the first field).
- bool is_first() {
- if (is_first_) {
- is_first_ = false;
- return true;
- }
- return false;
- }
-
- private:
- bool is_first_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(Element);
- };
-
- virtual Element* element() { return element_.get(); }
-
- private:
- class LIBPROTOBUF_EXPORT ByteSinkWrapper : public strings::ByteSink {
- public:
- explicit ByteSinkWrapper(google::protobuf::io::CodedOutputStream* stream)
- : stream_(stream) {}
- virtual ~ByteSinkWrapper() {}
-
- // ByteSink methods.
- virtual void Append(const char* bytes, size_t n) {
- stream_->WriteRaw(bytes, n);
- }
-
- private:
- google::protobuf::io::CodedOutputStream* stream_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ByteSinkWrapper);
- };
-
- // Renders a simple value as a string. By default all non-string Render
- // methods convert their argument to a string and call this method. This
- // method can then be used to render the simple value without escaping it.
- JsonObjectWriter* RenderSimple(StringPiece name, const string& value) {
- WritePrefix(name);
- stream_->WriteString(value);
- return this;
- }
-
- // Pushes a new element to the stack.
- void Push() { element_.reset(new Element(element_.release())); }
-
- // Pops an element off of the stack and deletes the popped element.
- void Pop() {
- bool needs_newline = !element_->is_first();
- element_.reset(element_->pop<Element>());
- if (needs_newline) NewLine();
- }
-
- // If pretty printing is enabled, this will write a newline to the output,
- // followed by optional indentation. Otherwise this method is a noop.
- void NewLine() {
- if (!indent_string_.empty()) {
- WriteChar('\n');
- for (int i = 0; i < element()->level(); i++) {
- stream_->WriteString(indent_string_);
- }
- }
- }
-
- // Writes a prefix. This will write out any pretty printing and
- // commas that are required, followed by the name and a ':' if
- // the name is not null.
- void WritePrefix(StringPiece name);
-
- // Writes an individual character to the output.
- void WriteChar(const char c) { stream_->WriteRaw(&c, sizeof(c)); }
-
- // Returns the current value of empty_name_ok_for_next_key_ and resets it to
- // false.
- bool GetAndResetEmptyKeyOk();
-
- google::protobuf::scoped_ptr<Element> element_;
- google::protobuf::io::CodedOutputStream* stream_;
- ByteSinkWrapper sink_;
- const string indent_string_;
-
- // Whether to use regular or websafe base64 encoding for byte fields. Defaults
- // to regular base64 encoding.
- bool use_websafe_base64_for_bytes_;
-
- // Whether empty strings should be rendered for the next JSON key. This
- // setting is only valid until the next key is rendered, after which it gets
- // reset to false.
- bool empty_name_ok_for_next_key_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonObjectWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_OBJECTWRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc
deleted file mode 100644
index bbd9d78a43..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_objectwriter_test.cc
+++ /dev/null
@@ -1,313 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/json_objectwriter.h>
-
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::io::CodedOutputStream;
-using google::protobuf::io::StringOutputStream;
-
-class JsonObjectWriterTest : public ::testing::Test {
- protected:
- JsonObjectWriterTest()
- : str_stream_(new StringOutputStream(&output_)),
- out_stream_(new CodedOutputStream(str_stream_)),
- ow_(NULL) {}
-
- virtual ~JsonObjectWriterTest() {
- delete ow_;
- delete out_stream_;
- delete str_stream_;
- }
-
- string output_;
- StringOutputStream* const str_stream_;
- CodedOutputStream* const out_stream_;
- JsonObjectWriter* ow_;
-};
-
-TEST_F(JsonObjectWriterTest, EmptyRootObject) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")->EndObject();
- EXPECT_EQ("{}", output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, EmptyObject) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->RenderString("test", "value")
- ->StartObject("empty")
- ->EndObject()
- ->EndObject();
- EXPECT_EQ("{\"test\":\"value\",\"empty\":{}}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, EmptyRootList) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartList("")->EndList();
- EXPECT_EQ("[]", output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, EmptyList) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->RenderString("test", "value")
- ->StartList("empty")
- ->EndList()
- ->EndObject();
- EXPECT_EQ("{\"test\":\"value\",\"empty\":[]}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, ObjectInObject) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->StartObject("nested")
- ->RenderString("field", "value")
- ->EndObject()
- ->EndObject();
- EXPECT_EQ("{\"nested\":{\"field\":\"value\"}}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, ListInObject) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->StartList("nested")
- ->RenderString("", "value")
- ->EndList()
- ->EndObject();
- EXPECT_EQ("{\"nested\":[\"value\"]}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, ObjectInList) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartList("")
- ->StartObject("")
- ->RenderString("field", "value")
- ->EndObject()
- ->EndList();
- EXPECT_EQ("[{\"field\":\"value\"}]",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, ListInList) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartList("")
- ->StartList("")
- ->RenderString("", "value")
- ->EndList()
- ->EndList();
- EXPECT_EQ("[[\"value\"]]", output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, RenderPrimitives) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->RenderBool("bool", true)
- ->RenderDouble("double", std::numeric_limits<double>::max())
- ->RenderFloat("float", std::numeric_limits<float>::max())
- ->RenderInt32("int", std::numeric_limits<int32>::min())
- ->RenderInt64("long", std::numeric_limits<int64>::min())
- ->RenderBytes("bytes", "abracadabra")
- ->RenderString("string", "string")
- ->RenderBytes("emptybytes", "")
- ->RenderString("emptystring", string())
- ->EndObject();
- EXPECT_EQ(
- "{\"bool\":true,"
- "\"double\":" +
- ValueAsString<double>(std::numeric_limits<double>::max()) +
- ","
- "\"float\":" +
- ValueAsString<float>(std::numeric_limits<float>::max()) +
- ","
- "\"int\":-2147483648,"
- "\"long\":\"-9223372036854775808\","
- "\"bytes\":\"YWJyYWNhZGFicmE=\","
- "\"string\":\"string\","
- "\"emptybytes\":\"\","
- "\"emptystring\":\"\"}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, BytesEncodesAsNonWebSafeBase64) {
- string s;
- s.push_back('\377');
- s.push_back('\357');
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")->RenderBytes("bytes", s)->EndObject();
- // Non-web-safe would encode this as "/+8="
- EXPECT_EQ("{\"bytes\":\"/+8=\"}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, PrettyPrintList) {
- ow_ = new JsonObjectWriter(" ", out_stream_);
- ow_->StartObject("")
- ->StartList("items")
- ->RenderString("", "item1")
- ->RenderString("", "item2")
- ->RenderString("", "item3")
- ->EndList()
- ->StartList("empty")
- ->EndList()
- ->EndObject();
- EXPECT_EQ(
- "{\n"
- " \"items\": [\n"
- " \"item1\",\n"
- " \"item2\",\n"
- " \"item3\"\n"
- " ],\n"
- " \"empty\": []\n"
- "}\n",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, PrettyPrintObject) {
- ow_ = new JsonObjectWriter(" ", out_stream_);
- ow_->StartObject("")
- ->StartObject("items")
- ->RenderString("key1", "item1")
- ->RenderString("key2", "item2")
- ->RenderString("key3", "item3")
- ->EndObject()
- ->StartObject("empty")
- ->EndObject()
- ->EndObject();
- EXPECT_EQ(
- "{\n"
- " \"items\": {\n"
- " \"key1\": \"item1\",\n"
- " \"key2\": \"item2\",\n"
- " \"key3\": \"item3\"\n"
- " },\n"
- " \"empty\": {}\n"
- "}\n",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, PrettyPrintEmptyObjectInEmptyList) {
- ow_ = new JsonObjectWriter(" ", out_stream_);
- ow_->StartObject("")
- ->StartList("list")
- ->StartObject("")
- ->EndObject()
- ->EndList()
- ->EndObject();
- EXPECT_EQ(
- "{\n"
- " \"list\": [\n"
- " {}\n"
- " ]\n"
- "}\n",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, PrettyPrintDoubleIndent) {
- ow_ = new JsonObjectWriter(" ", out_stream_);
- ow_->StartObject("")
- ->RenderBool("bool", true)
- ->RenderInt32("int", 42)
- ->EndObject();
- EXPECT_EQ(
- "{\n"
- " \"bool\": true,\n"
- " \"int\": 42\n"
- "}\n",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, StringsEscapedAndEnclosedInDoubleQuotes) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")->RenderString("string", "'<>&amp;\\\"\r\n")->EndObject();
- EXPECT_EQ("{\"string\":\"'\\u003c\\u003e&amp;\\\\\\\"\\r\\n\"}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, Stringification) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->RenderDouble("double_nan", std::numeric_limits<double>::quiet_NaN())
- ->RenderFloat("float_nan", std::numeric_limits<float>::quiet_NaN())
- ->RenderDouble("double_pos", std::numeric_limits<double>::infinity())
- ->RenderFloat("float_pos", std::numeric_limits<float>::infinity())
- ->RenderDouble("double_neg", -std::numeric_limits<double>::infinity())
- ->RenderFloat("float_neg", -std::numeric_limits<float>::infinity())
- ->EndObject();
- EXPECT_EQ(
- "{\"double_nan\":\"NaN\","
- "\"float_nan\":\"NaN\","
- "\"double_pos\":\"Infinity\","
- "\"float_pos\":\"Infinity\","
- "\"double_neg\":\"-Infinity\","
- "\"float_neg\":\"-Infinity\"}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, TestRegularByteEncoding) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->StartObject("")
- ->RenderBytes("bytes", "\x03\xef\xc0")
- ->EndObject();
-
- // Test that we get regular (non websafe) base64 encoding on byte fields by
- // default.
- EXPECT_EQ("{\"bytes\":\"A+/A\"}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-TEST_F(JsonObjectWriterTest, TestWebsafeByteEncoding) {
- ow_ = new JsonObjectWriter("", out_stream_);
- ow_->set_use_websafe_base64_for_bytes(true);
- ow_->StartObject("")
- ->RenderBytes("bytes", "\x03\xef\xc0\x10")
- ->EndObject();
-
- // Test that we get websafe base64 encoding when explicitly asked.
- EXPECT_EQ("{\"bytes\":\"A-_AEA==\"}",
- output_.substr(0, out_stream_->ByteCount()));
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc
deleted file mode 100644
index b38030c3c6..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.cc
+++ /dev/null
@@ -1,844 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/json_stream_parser.h>
-
-#include <algorithm>
-#include <cctype>
-#include <cerrno>
-#include <cstdlib>
-#include <cstring>
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/json_escaping.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/mathlimits.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-
-// Allow these symbols to be referenced as util::Status, util::error::* in
-// this file.
-using util::Status;
-namespace error {
-using util::error::CANCELLED;
-using util::error::INTERNAL;
-using util::error::INVALID_ARGUMENT;
-} // namespace error
-
-namespace converter {
-
-// Number of digits in an escaped UTF-16 code unit ('\\' 'u' X X X X)
-static const int kUnicodeEscapedLength = 6;
-
-// Length of the true, false, and null literals.
-static const int true_len = strlen("true");
-static const int false_len = strlen("false");
-static const int null_len = strlen("null");
-
-inline bool IsLetter(char c) {
- return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || (c == '_') ||
- (c == '$');
-}
-
-inline bool IsAlphanumeric(char c) {
- return IsLetter(c) || ('0' <= c && c <= '9');
-}
-
-static bool ConsumeKey(StringPiece* input, StringPiece* key) {
- if (input->empty() || !IsLetter((*input)[0])) return false;
- int len = 1;
- for (; len < input->size(); ++len) {
- if (!IsAlphanumeric((*input)[len])) {
- break;
- }
- }
- *key = StringPiece(input->data(), len);
- *input = StringPiece(input->data() + len, input->size() - len);
- return true;
-}
-
-static bool MatchKey(StringPiece input) {
- return !input.empty() && IsLetter(input[0]);
-}
-
-JsonStreamParser::JsonStreamParser(ObjectWriter* ow)
- : ow_(ow),
- stack_(),
- leftover_(),
- json_(),
- p_(),
- key_(),
- key_storage_(),
- finishing_(false),
- parsed_(),
- parsed_storage_(),
- string_open_(0),
- chunk_storage_(),
- coerce_to_utf8_(false),
- allow_empty_null_(false),
- loose_float_number_conversion_(false) {
- // Initialize the stack with a single value to be parsed.
- stack_.push(VALUE);
-}
-
-JsonStreamParser::~JsonStreamParser() {}
-
-
-util::Status JsonStreamParser::Parse(StringPiece json) {
- StringPiece chunk = json;
- // If we have leftovers from a previous chunk, append the new chunk to it
- // and create a new StringPiece pointing at the string's data. This could
- // be large but we rely on the chunks to be small, assuming they are
- // fragments of a Cord.
- if (!leftover_.empty()) {
- // Don't point chunk to leftover_ because leftover_ will be updated in
- // ParseChunk(chunk).
- chunk_storage_.swap(leftover_);
- json.AppendToString(&chunk_storage_);
- chunk = StringPiece(chunk_storage_);
- }
-
- // Find the structurally valid UTF8 prefix and parse only that.
- int n = internal::UTF8SpnStructurallyValid(chunk);
- if (n > 0) {
- util::Status status = ParseChunk(chunk.substr(0, n));
-
- // Any leftover characters are stashed in leftover_ for later parsing when
- // there is more data available.
- chunk.substr(n).AppendToString(&leftover_);
- return status;
- } else {
- chunk.CopyToString(&leftover_);
- return util::Status::OK;
- }
-}
-
-util::Status JsonStreamParser::FinishParse() {
- // If we do not expect anything and there is nothing left to parse we're all
- // done.
- if (stack_.empty() && leftover_.empty()) {
- return util::Status::OK;
- }
-
- // Storage for UTF8-coerced string.
- google::protobuf::scoped_array<char> utf8;
- if (coerce_to_utf8_) {
- utf8.reset(new char[leftover_.size()]);
- char* coerced = internal::UTF8CoerceToStructurallyValid(leftover_, utf8.get(), ' ');
- p_ = json_ = StringPiece(coerced, leftover_.size());
- } else {
- p_ = json_ = leftover_;
- if (!internal::IsStructurallyValidUTF8(leftover_)) {
- return ReportFailure("Encountered non UTF-8 code points.");
- }
- }
-
- // Parse the remainder in finishing mode, which reports errors for things like
- // unterminated strings or unknown tokens that would normally be retried.
- finishing_ = true;
- util::Status result = RunParser();
- if (result.ok()) {
- SkipWhitespace();
- if (!p_.empty()) {
- result = ReportFailure("Parsing terminated before end of input.");
- }
- }
- return result;
-}
-
-util::Status JsonStreamParser::ParseChunk(StringPiece chunk) {
- // Do not do any work if the chunk is empty.
- if (chunk.empty()) return util::Status::OK;
-
- p_ = json_ = chunk;
-
- finishing_ = false;
- util::Status result = RunParser();
- if (!result.ok()) return result;
-
- SkipWhitespace();
- if (p_.empty()) {
- // If we parsed everything we had, clear the leftover.
- leftover_.clear();
- } else {
- // If we do not expect anything i.e. stack is empty, and we have non-empty
- // string left to parse, we report an error.
- if (stack_.empty()) {
- return ReportFailure("Parsing terminated before end of input.");
- }
- // If we expect future data i.e. stack is non-empty, and we have some
- // unparsed data left, we save it for later parse.
- leftover_ = p_.ToString();
- }
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::RunParser() {
- while (!stack_.empty()) {
- ParseType type = stack_.top();
- TokenType t = (string_open_ == 0) ? GetNextTokenType() : BEGIN_STRING;
- stack_.pop();
- util::Status result;
- switch (type) {
- case VALUE:
- result = ParseValue(t);
- break;
-
- case OBJ_MID:
- result = ParseObjectMid(t);
- break;
-
- case ENTRY:
- result = ParseEntry(t);
- break;
-
- case ENTRY_MID:
- result = ParseEntryMid(t);
- break;
-
- case ARRAY_VALUE:
- result = ParseArrayValue(t);
- break;
-
- case ARRAY_MID:
- result = ParseArrayMid(t);
- break;
-
- default:
- result = util::Status(util::error::INTERNAL,
- StrCat("Unknown parse type: ", type));
- break;
- }
- if (!result.ok()) {
- // If we were cancelled, save our state and try again later.
- if (!finishing_ && result == util::Status(error::CANCELLED, "")) {
- stack_.push(type);
- // If we have a key we still need to render, make sure to save off the
- // contents in our own storage.
- if (!key_.empty() && key_storage_.empty()) {
- key_.AppendToString(&key_storage_);
- key_ = StringPiece(key_storage_);
- }
- result = util::Status::OK;
- }
- return result;
- }
- }
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseValue(TokenType type) {
- switch (type) {
- case BEGIN_OBJECT:
- return HandleBeginObject();
- case BEGIN_ARRAY:
- return HandleBeginArray();
- case BEGIN_STRING:
- return ParseString();
- case BEGIN_NUMBER:
- return ParseNumber();
- case BEGIN_TRUE:
- return ParseTrue();
- case BEGIN_FALSE:
- return ParseFalse();
- case BEGIN_NULL:
- return ParseNull();
- case UNKNOWN:
- return ReportUnknown("Expected a value.");
- default: {
- if (allow_empty_null_ && IsEmptyNullAllowed(type)) {
- return ParseEmptyNull();
- }
-
- // Special case for having been cut off while parsing, wait for more data.
- // This handles things like 'fals' being at the end of the string, we
- // don't know if the next char would be e, completing it, or something
- // else, making it invalid.
- if (!finishing_ && p_.length() < false_len) {
- return util::Status(error::CANCELLED, "");
- }
- return ReportFailure("Unexpected token.");
- }
- }
-}
-
-util::Status JsonStreamParser::ParseString() {
- util::Status result = ParseStringHelper();
- if (result.ok()) {
- ow_->RenderString(key_, parsed_);
- key_ = StringPiece();
- parsed_ = StringPiece();
- parsed_storage_.clear();
- }
- return result;
-}
-
-util::Status JsonStreamParser::ParseStringHelper() {
- // If we haven't seen the start quote, grab it and remember it for later.
- if (string_open_ == 0) {
- string_open_ = *p_.data();
- GOOGLE_DCHECK(string_open_ == '\"' || string_open_ == '\'');
- Advance();
- }
- // Track where we last copied data from so we can minimize copying.
- const char* last = p_.data();
- while (!p_.empty()) {
- const char* data = p_.data();
- if (*data == '\\') {
- // We're about to handle an escape, copy all bytes from last to data.
- if (last < data) {
- parsed_storage_.append(last, data - last);
- }
- // If we ran out of string after the \, cancel or report an error
- // depending on if we expect more data later.
- if (p_.length() == 1) {
- if (!finishing_) {
- return util::Status(error::CANCELLED, "");
- }
- return ReportFailure("Closing quote expected in string.");
- }
- // Parse a unicode escape if we found \u in the string.
- if (data[1] == 'u') {
- util::Status result = ParseUnicodeEscape();
- if (!result.ok()) {
- return result;
- }
- // Move last pointer past the unicode escape and continue.
- last = p_.data();
- continue;
- }
- // Handle the standard set of backslash-escaped characters.
- switch (data[1]) {
- case 'b':
- parsed_storage_.push_back('\b');
- break;
- case 'f':
- parsed_storage_.push_back('\f');
- break;
- case 'n':
- parsed_storage_.push_back('\n');
- break;
- case 'r':
- parsed_storage_.push_back('\r');
- break;
- case 't':
- parsed_storage_.push_back('\t');
- break;
- case 'v':
- parsed_storage_.push_back('\v');
- break;
- default:
- parsed_storage_.push_back(data[1]);
- }
- // We handled two characters, so advance past them and continue.
- p_.remove_prefix(2);
- last = p_.data();
- continue;
- }
- // If we found the closing quote note it, advance past it, and return.
- if (*data == string_open_) {
- // If we didn't copy anything, reuse the input buffer.
- if (parsed_storage_.empty()) {
- parsed_ = StringPiece(last, data - last);
- } else {
- if (last < data) {
- parsed_storage_.append(last, data - last);
- }
- parsed_ = StringPiece(parsed_storage_);
- }
- // Clear the quote char so next time we try to parse a string we'll
- // start fresh.
- string_open_ = 0;
- Advance();
- return util::Status::OK;
- }
- // Normal character, just advance past it.
- Advance();
- }
- // If we ran out of characters, copy over what we have so far.
- if (last < p_.data()) {
- parsed_storage_.append(last, p_.data() - last);
- }
- // If we didn't find the closing quote but we expect more data, cancel for now
- if (!finishing_) {
- return util::Status(error::CANCELLED, "");
- }
- // End of string reached without a closing quote, report an error.
- string_open_ = 0;
- return ReportFailure("Closing quote expected in string.");
-}
-
-// Converts a unicode escaped character to a decimal value stored in a char32
-// for use in UTF8 encoding utility. We assume that str begins with \uhhhh and
-// convert that from the hex number to a decimal value.
-//
-// There are some security exploits with UTF-8 that we should be careful of:
-// - http://www.unicode.org/reports/tr36/#UTF-8_Exploit
-// - http://sites/intl-eng/design-guide/core-application
-util::Status JsonStreamParser::ParseUnicodeEscape() {
- if (p_.length() < kUnicodeEscapedLength) {
- if (!finishing_) {
- return util::Status(error::CANCELLED, "");
- }
- return ReportFailure("Illegal hex string.");
- }
- GOOGLE_DCHECK_EQ('\\', p_.data()[0]);
- GOOGLE_DCHECK_EQ('u', p_.data()[1]);
- uint32 code = 0;
- for (int i = 2; i < kUnicodeEscapedLength; ++i) {
- if (!isxdigit(p_.data()[i])) {
- return ReportFailure("Invalid escape sequence.");
- }
- code = (code << 4) + hex_digit_to_int(p_.data()[i]);
- }
- if (code >= JsonEscaping::kMinHighSurrogate &&
- code <= JsonEscaping::kMaxHighSurrogate) {
- if (p_.length() < 2 * kUnicodeEscapedLength) {
- if (!finishing_) {
- return util::Status(error::CANCELLED, "");
- }
- if (!coerce_to_utf8_) {
- return ReportFailure("Missing low surrogate.");
- }
- } else if (p_.data()[kUnicodeEscapedLength] == '\\' &&
- p_.data()[kUnicodeEscapedLength + 1] == 'u') {
- uint32 low_code = 0;
- for (int i = kUnicodeEscapedLength + 2; i < 2 * kUnicodeEscapedLength;
- ++i) {
- if (!isxdigit(p_.data()[i])) {
- return ReportFailure("Invalid escape sequence.");
- }
- low_code = (low_code << 4) + hex_digit_to_int(p_.data()[i]);
- }
- if (low_code >= JsonEscaping::kMinLowSurrogate &&
- low_code <= JsonEscaping::kMaxLowSurrogate) {
- // Convert UTF-16 surrogate pair to 21-bit Unicode codepoint.
- code = (((code & 0x3FF) << 10) | (low_code & 0x3FF)) +
- JsonEscaping::kMinSupplementaryCodePoint;
- // Advance past the first code unit escape.
- p_.remove_prefix(kUnicodeEscapedLength);
- } else if (!coerce_to_utf8_) {
- return ReportFailure("Invalid low surrogate.");
- }
- } else if (!coerce_to_utf8_) {
- return ReportFailure("Missing low surrogate.");
- }
- }
- if (!coerce_to_utf8_ && !IsValidCodePoint(code)) {
- return ReportFailure("Invalid unicode code point.");
- }
- char buf[UTFmax];
- int len = EncodeAsUTF8Char(code, buf);
- // Advance past the [final] code unit escape.
- p_.remove_prefix(kUnicodeEscapedLength);
- parsed_storage_.append(buf, len);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseNumber() {
- NumberResult number;
- util::Status result = ParseNumberHelper(&number);
- if (result.ok()) {
- switch (number.type) {
- case NumberResult::DOUBLE:
- ow_->RenderDouble(key_, number.double_val);
- key_ = StringPiece();
- break;
-
- case NumberResult::INT:
- ow_->RenderInt64(key_, number.int_val);
- key_ = StringPiece();
- break;
-
- case NumberResult::UINT:
- ow_->RenderUint64(key_, number.uint_val);
- key_ = StringPiece();
- break;
-
- default:
- return ReportFailure("Unable to parse number.");
- }
- }
- return result;
-}
-
-util::Status JsonStreamParser::ParseNumberHelper(NumberResult* result) {
- const char* data = p_.data();
- int length = p_.length();
-
- // Look for the first non-numeric character, or the end of the string.
- int index = 0;
- bool floating = false;
- bool negative = data[index] == '-';
- // Find the first character that cannot be part of the number. Along the way
- // detect if the number needs to be parsed as a double.
- // Note that this restricts numbers to the JSON specification, so for example
- // we do not support hex or octal notations.
- for (; index < length; ++index) {
- char c = data[index];
- if (isdigit(c)) continue;
- if (c == '.' || c == 'e' || c == 'E') {
- floating = true;
- continue;
- }
- if (c == '+' || c == '-' || c == 'x') continue;
- // Not a valid number character, break out.
- break;
- }
-
- // If the entire input is a valid number, and we may have more content in the
- // future, we abort for now and resume when we know more.
- if (index == length && !finishing_) {
- return util::Status(error::CANCELLED, "");
- }
-
- // Create a string containing just the number, so we can use safe_strtoX
- string number = p_.substr(0, index).ToString();
-
- // Floating point number, parse as a double.
- if (floating) {
- if (!safe_strtod(number, &result->double_val)) {
- return ReportFailure("Unable to parse number.");
- }
- if (!loose_float_number_conversion_ &&
- !MathLimits<double>::IsFinite(result->double_val)) {
- return ReportFailure("Number exceeds the range of double.");
- }
- result->type = NumberResult::DOUBLE;
- p_.remove_prefix(index);
- return util::Status::OK;
- }
-
- // Positive non-floating point number, parse as a uint64.
- if (!negative) {
- // Octal/Hex numbers are not valid JSON values.
- if (number.length() >= 2 && number[0] == '0') {
- return ReportFailure("Octal/hex numbers are not valid JSON values.");
- }
- if (!safe_strtou64(number, &result->uint_val)) {
- return ReportFailure("Unable to parse number.");
- }
- result->type = NumberResult::UINT;
- p_.remove_prefix(index);
- return util::Status::OK;
- }
-
- // Octal/Hex numbers are not valid JSON values.
- if (number.length() >= 3 && number[1] == '0') {
- return ReportFailure("Octal/hex numbers are not valid JSON values.");
- }
- // Negative non-floating point number, parse as an int64.
- if (!safe_strto64(number, &result->int_val)) {
- return ReportFailure("Unable to parse number.");
- }
- result->type = NumberResult::INT;
- p_.remove_prefix(index);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::HandleBeginObject() {
- GOOGLE_DCHECK_EQ('{', *p_.data());
- Advance();
- ow_->StartObject(key_);
- key_ = StringPiece();
- stack_.push(ENTRY);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseObjectMid(TokenType type) {
- if (type == UNKNOWN) {
- return ReportUnknown("Expected , or } after key:value pair.");
- }
-
- // Object is complete, advance past the comma and render the EndObject.
- if (type == END_OBJECT) {
- Advance();
- ow_->EndObject();
- return util::Status::OK;
- }
- // Found a comma, advance past it and get ready for an entry.
- if (type == VALUE_SEPARATOR) {
- Advance();
- stack_.push(ENTRY);
- return util::Status::OK;
- }
- // Illegal token after key:value pair.
- return ReportFailure("Expected , or } after key:value pair.");
-}
-
-util::Status JsonStreamParser::ParseEntry(TokenType type) {
- if (type == UNKNOWN) {
- return ReportUnknown("Expected an object key or }.");
- }
-
- // Close the object and return. This allows for trailing commas.
- if (type == END_OBJECT) {
- ow_->EndObject();
- Advance();
- return util::Status::OK;
- }
-
- util::Status result;
- if (type == BEGIN_STRING) {
- // Key is a string (standard JSON), parse it and store the string.
- result = ParseStringHelper();
- if (result.ok()) {
- key_storage_.clear();
- if (!parsed_storage_.empty()) {
- parsed_storage_.swap(key_storage_);
- key_ = StringPiece(key_storage_);
- } else {
- key_ = parsed_;
- }
- parsed_ = StringPiece();
- }
- } else if (type == BEGIN_KEY) {
- // Key is a bare key (back compat), create a StringPiece pointing to it.
- result = ParseKey();
- } else {
- // Unknown key type, report an error.
- result = ReportFailure("Expected an object key or }.");
- }
- // On success we next expect an entry mid ':' then an object mid ',' or '}'
- if (result.ok()) {
- stack_.push(OBJ_MID);
- stack_.push(ENTRY_MID);
- }
- return result;
-}
-
-util::Status JsonStreamParser::ParseEntryMid(TokenType type) {
- if (type == UNKNOWN) {
- return ReportUnknown("Expected : between key:value pair.");
- }
- if (type == ENTRY_SEPARATOR) {
- Advance();
- stack_.push(VALUE);
- return util::Status::OK;
- }
- return ReportFailure("Expected : between key:value pair.");
-}
-
-util::Status JsonStreamParser::HandleBeginArray() {
- GOOGLE_DCHECK_EQ('[', *p_.data());
- Advance();
- ow_->StartList(key_);
- key_ = StringPiece();
- stack_.push(ARRAY_VALUE);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseArrayValue(TokenType type) {
- if (type == UNKNOWN) {
- return ReportUnknown("Expected a value or ] within an array.");
- }
-
- if (type == END_ARRAY) {
- ow_->EndList();
- Advance();
- return util::Status::OK;
- }
-
- // The ParseValue call may push something onto the stack so we need to make
- // sure an ARRAY_MID is after it, so we push it on now. Also, the parsing of
- // empty-null array value is relying on this ARRAY_MID token.
- stack_.push(ARRAY_MID);
- util::Status result = ParseValue(type);
- if (result == util::Status(error::CANCELLED, "")) {
- // If we were cancelled, pop back off the ARRAY_MID so we don't try to
- // push it on again when we try over.
- stack_.pop();
- }
- return result;
-}
-
-util::Status JsonStreamParser::ParseArrayMid(TokenType type) {
- if (type == UNKNOWN) {
- return ReportUnknown("Expected , or ] after array value.");
- }
-
- if (type == END_ARRAY) {
- ow_->EndList();
- Advance();
- return util::Status::OK;
- }
-
- // Found a comma, advance past it and expect an array value next.
- if (type == VALUE_SEPARATOR) {
- Advance();
- stack_.push(ARRAY_VALUE);
- return util::Status::OK;
- }
- // Illegal token after array value.
- return ReportFailure("Expected , or ] after array value.");
-}
-
-util::Status JsonStreamParser::ParseTrue() {
- ow_->RenderBool(key_, true);
- key_ = StringPiece();
- p_.remove_prefix(true_len);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseFalse() {
- ow_->RenderBool(key_, false);
- key_ = StringPiece();
- p_.remove_prefix(false_len);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseNull() {
- ow_->RenderNull(key_);
- key_ = StringPiece();
- p_.remove_prefix(null_len);
- return util::Status::OK;
-}
-
-util::Status JsonStreamParser::ParseEmptyNull() {
- ow_->RenderNull(key_);
- key_ = StringPiece();
- return util::Status::OK;
-}
-
-bool JsonStreamParser::IsEmptyNullAllowed(TokenType type) {
- if (stack_.empty()) return false;
- return (stack_.top() == ARRAY_MID && type == VALUE_SEPARATOR) ||
- stack_.top() == OBJ_MID;
-}
-
-util::Status JsonStreamParser::ReportFailure(StringPiece message) {
- static const int kContextLength = 20;
- const char* p_start = p_.data();
- const char* json_start = json_.data();
- const char* begin = std::max(p_start - kContextLength, json_start);
- const char* end =
- std::min(p_start + kContextLength, json_start + json_.size());
- StringPiece segment(begin, end - begin);
- string location(p_start - begin, ' ');
- location.push_back('^');
- return util::Status(util::error::INVALID_ARGUMENT,
- StrCat(message, "\n", segment, "\n", location));
-}
-
-util::Status JsonStreamParser::ReportUnknown(StringPiece message) {
- // If we aren't finishing the parse, cancel parsing and try later.
- if (!finishing_) {
- return util::Status(error::CANCELLED, "");
- }
- if (p_.empty()) {
- return ReportFailure(StrCat("Unexpected end of string. ", message));
- }
- return ReportFailure(message);
-}
-
-void JsonStreamParser::SkipWhitespace() {
- while (!p_.empty() && ascii_isspace(*p_.data())) {
- Advance();
- }
-}
-
-void JsonStreamParser::Advance() {
- // Advance by moving one UTF8 character while making sure we don't go beyond
- // the length of StringPiece.
- p_.remove_prefix(std::min<int>(
- p_.length(), UTF8FirstLetterNumBytes(p_.data(), p_.length())));
-}
-
-util::Status JsonStreamParser::ParseKey() {
- StringPiece original = p_;
- if (!ConsumeKey(&p_, &key_)) {
- return ReportFailure("Invalid key or variable name.");
- }
- // If we consumed everything but expect more data, reset p_ and cancel since
- // we can't know if the key was complete or not.
- if (!finishing_ && p_.empty()) {
- p_ = original;
- return util::Status(error::CANCELLED, "");
- }
- // Since we aren't using the key storage, clear it out.
- key_storage_.clear();
- return util::Status::OK;
-}
-
-JsonStreamParser::TokenType JsonStreamParser::GetNextTokenType() {
- SkipWhitespace();
-
- int size = p_.size();
- if (size == 0) {
- // If we ran out of data, report unknown and we'll place the previous parse
- // type onto the stack and try again when we have more data.
- return UNKNOWN;
- }
- // TODO(sven): Split this method based on context since different contexts
- // support different tokens. Would slightly speed up processing?
- const char* data = p_.data();
- if (*data == '\"' || *data == '\'') return BEGIN_STRING;
- if (*data == '-' || ('0' <= *data && *data <= '9')) {
- return BEGIN_NUMBER;
- }
- if (size >= true_len && !strncmp(data, "true", true_len)) {
- return BEGIN_TRUE;
- }
- if (size >= false_len && !strncmp(data, "false", false_len)) {
- return BEGIN_FALSE;
- }
- if (size >= null_len && !strncmp(data, "null", null_len)) {
- return BEGIN_NULL;
- }
- if (*data == '{') return BEGIN_OBJECT;
- if (*data == '}') return END_OBJECT;
- if (*data == '[') return BEGIN_ARRAY;
- if (*data == ']') return END_ARRAY;
- if (*data == ':') return ENTRY_SEPARATOR;
- if (*data == ',') return VALUE_SEPARATOR;
- if (MatchKey(p_)) {
- return BEGIN_KEY;
- }
-
- // We don't know that we necessarily have an invalid token here, just that we
- // can't parse what we have so far. So we don't report an error and just
- // return UNKNOWN so we can try again later when we have more data, or if we
- // finish and we have leftovers.
- return UNKNOWN;
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h
deleted file mode 100644
index 6b9d46ee22..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser.h
+++ /dev/null
@@ -1,269 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_STREAM_PARSER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_STREAM_PARSER_H__
-
-#include <stack>
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/status.h>
-
-namespace google {
-namespace util {
-class Status;
-} // namespace util
-
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class ObjectWriter;
-
-// A JSON parser that can parse a stream of JSON chunks rather than needing the
-// entire JSON string up front. It is a modified version of the parser in
-// //net/proto/json/json-parser.h that has been changed in the following ways:
-// - Changed from recursion to an explicit stack to allow resumption
-// - Added support for int64 and uint64 numbers
-// - Removed support for octal and decimal escapes
-// - Removed support for numeric keys
-// - Removed support for functions (javascript)
-// - Removed some lax-comma support (but kept trailing comma support)
-// - Writes directly to an ObjectWriter rather than using subclassing
-//
-// Here is an example usage:
-// JsonStreamParser parser(ow_.get());
-// util::Status result = parser.Parse(chunk1);
-// result.Update(parser.Parse(chunk2));
-// result.Update(parser.FinishParse());
-// GOOGLE_DCHECK(result.ok()) << "Failed to parse JSON";
-//
-// This parser is thread-compatible as long as only one thread is calling a
-// Parse() method at a time.
-class LIBPROTOBUF_EXPORT JsonStreamParser {
- public:
- // Creates a JsonStreamParser that will write to the given ObjectWriter.
- explicit JsonStreamParser(ObjectWriter* ow);
- virtual ~JsonStreamParser();
-
- // Parses a UTF-8 encoded JSON string from a StringPiece.
- util::Status Parse(StringPiece json);
-
-
- // Finish parsing the JSON string.
- util::Status FinishParse();
-
-
- private:
- enum TokenType {
- BEGIN_STRING, // " or '
- BEGIN_NUMBER, // - or digit
- BEGIN_TRUE, // true
- BEGIN_FALSE, // false
- BEGIN_NULL, // null
- BEGIN_OBJECT, // {
- END_OBJECT, // }
- BEGIN_ARRAY, // [
- END_ARRAY, // ]
- ENTRY_SEPARATOR, // :
- VALUE_SEPARATOR, // ,
- BEGIN_KEY, // letter, _, $ or digit. Must begin with non-digit
- UNKNOWN // Unknown token or we ran out of the stream.
- };
-
- enum ParseType {
- VALUE, // Expects a {, [, true, false, null, string or number
- OBJ_MID, // Expects a ',' or }
- ENTRY, // Expects a key or }
- ENTRY_MID, // Expects a :
- ARRAY_VALUE, // Expects a value or ]
- ARRAY_MID // Expects a ',' or ]
- };
-
- // Holds the result of parsing a number
- struct NumberResult {
- enum Type { DOUBLE, INT, UINT };
- Type type;
- union {
- double double_val;
- int64 int_val;
- uint64 uint_val;
- };
- };
-
- // Parses a single chunk of JSON, returning an error if the JSON was invalid.
- util::Status ParseChunk(StringPiece json);
-
- // Runs the parser based on stack_ and p_, until the stack is empty or p_ runs
- // out of data. If we unexpectedly run out of p_ we push the latest back onto
- // the stack and return.
- util::Status RunParser();
-
- // Parses a value from p_ and writes it to ow_.
- // A value may be an object, array, true, false, null, string or number.
- util::Status ParseValue(TokenType type);
-
- // Parses a string and writes it out to the ow_.
- util::Status ParseString();
-
- // Parses a string, storing the result in parsed_.
- util::Status ParseStringHelper();
-
- // This function parses unicode escape sequences in strings. It returns an
- // error when there's a parsing error, either the size is not the expected
- // size or a character is not a hex digit. When it returns str will contain
- // what has been successfully parsed so far.
- util::Status ParseUnicodeEscape();
-
- // Expects p_ to point to a JSON number, writes the number to the writer using
- // the appropriate Render method based on the type of number.
- util::Status ParseNumber();
-
- // Parse a number into a NumberResult, reporting an error if no number could
- // be parsed. This method will try to parse into a uint64, int64, or double
- // based on whether the number was positive or negative or had a decimal
- // component.
- util::Status ParseNumberHelper(NumberResult* result);
-
- // Handles a { during parsing of a value.
- util::Status HandleBeginObject();
-
- // Parses from the ENTRY state.
- util::Status ParseEntry(TokenType type);
-
- // Parses from the ENTRY_MID state.
- util::Status ParseEntryMid(TokenType type);
-
- // Parses from the OBJ_MID state.
- util::Status ParseObjectMid(TokenType type);
-
- // Handles a [ during parsing of a value.
- util::Status HandleBeginArray();
-
- // Parses from the ARRAY_VALUE state.
- util::Status ParseArrayValue(TokenType type);
-
- // Parses from the ARRAY_MID state.
- util::Status ParseArrayMid(TokenType type);
-
- // Expects p_ to point to an unquoted literal
- util::Status ParseTrue();
- util::Status ParseFalse();
- util::Status ParseNull();
- util::Status ParseEmptyNull();
-
- // Whether an empty-null is allowed in the current state.
- bool IsEmptyNullAllowed(TokenType type);
-
- // Report a failure as a util::Status.
- util::Status ReportFailure(StringPiece message);
-
- // Report a failure due to an UNKNOWN token type. We check if we hit the
- // end of the stream and if we're finishing or not to detect what type of
- // status to return in this case.
- util::Status ReportUnknown(StringPiece message);
-
- // Advance p_ past all whitespace or until the end of the string.
- void SkipWhitespace();
-
- // Advance p_ one UTF-8 character
- void Advance();
-
- // Expects p_ to point to the beginning of a key.
- util::Status ParseKey();
-
- // Return the type of the next token at p_.
- TokenType GetNextTokenType();
-
- // The object writer to write parse events to.
- ObjectWriter* ow_;
-
- // The stack of parsing we still need to do. When the stack runs empty we will
- // have parsed a single value from the root (e.g. an object or list).
- std::stack<ParseType> stack_;
-
- // Contains any leftover text from a previous chunk that we weren't able to
- // fully parse, for example the start of a key or number.
- string leftover_;
-
- // The current chunk of JSON being parsed. Primarily used for providing
- // context during error reporting.
- StringPiece json_;
-
- // A pointer within the current JSON being parsed, used to track location.
- StringPiece p_;
-
- // Stores the last key read, as we separate parsing of keys and values.
- StringPiece key_;
-
- // Storage for key_ if we need to keep ownership, for example between chunks
- // or if the key was unescaped from a JSON string.
- string key_storage_;
-
- // True during the FinishParse() call, so we know that any errors are fatal.
- // For example an unterminated string will normally result in cancelling and
- // trying during the next chunk, but during FinishParse() it is an error.
- bool finishing_;
-
- // String we parsed during a call to ParseStringHelper().
- StringPiece parsed_;
-
- // Storage for the string we parsed. This may be empty if the string was able
- // to be parsed directly from the input.
- string parsed_storage_;
-
- // The character that opened the string, either ' or ".
- // A value of 0 indicates that string parsing is not in process.
- char string_open_;
-
- // Storage for the chunk that are being parsed in ParseChunk().
- string chunk_storage_;
-
- // Whether to allow non UTF-8 encoded input and replace invalid code points.
- bool coerce_to_utf8_;
-
- // Whether allows empty string represented null array value or object entry
- // value.
- bool allow_empty_null_;
-
- // Whether allows out-of-range floating point numbers or reject them.
- bool loose_float_number_conversion_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonStreamParser);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_JSON_STREAM_PARSER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc
deleted file mode 100644
index ca71ff2419..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/json_stream_parser_test.cc
+++ /dev/null
@@ -1,845 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/json_stream_parser.h>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/util/internal/expecting_objectwriter.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <gtest/gtest.h>
-#include <google/protobuf/stubs/status.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-using util::Status;
-namespace error {
-using util::error::INVALID_ARGUMENT;
-} // namespace error
-namespace converter {
-
-using util::Status;
-
-// Tests for the JSON Stream Parser. These tests are intended to be
-// comprehensive and cover the following:
-//
-// Positive tests:
-// - true, false, null
-// - empty object or array.
-// - negative and positive double and int, unsigned int
-// - single and double quoted strings
-// - string key, unquoted key, numeric key
-// - array containing array, object, value
-// - object containing array, object, value
-// - unicode handling in strings
-// - ascii escaping (\b, \f, \n, \r, \t, \v)
-// - trailing commas
-//
-// Negative tests:
-// - illegal literals
-// - mismatched quotes failure on strings
-// - unterminated string failure
-// - unexpected end of string failure
-// - mismatched object and array closing
-// - Failure to close array or object
-// - numbers too large
-// - invalid unicode escapes.
-// - invalid unicode sequences.
-// - numbers as keys
-//
-// For each test we split the input string on every possible character to ensure
-// the parser is able to handle arbitrarily split input for all cases. We also
-// do a final test of the entire test case one character at a time.
-//
-// It is verified that expected calls to the mocked objects are in sequence.
-class JsonStreamParserTest : public ::testing::Test {
- protected:
- JsonStreamParserTest() : mock_(), ow_(&mock_) {}
- virtual ~JsonStreamParserTest() {}
-
- util::Status RunTest(StringPiece json, int split, bool coerce_utf8 = false,
- bool allow_empty_null = false,
- bool loose_float_number_conversion = false) {
- JsonStreamParser parser(&mock_);
-
- // Special case for split == length, test parsing one character at a time.
- if (split == json.length()) {
- GOOGLE_LOG(INFO) << "Testing split every char: " << json;
- for (int i = 0; i < json.length(); ++i) {
- StringPiece single = json.substr(i, 1);
- util::Status result = parser.Parse(single);
- if (!result.ok()) {
- return result;
- }
- }
- return parser.FinishParse();
- }
-
- // Normal case, split at the split point and parse two substrings.
- StringPiece first = json.substr(0, split);
- StringPiece rest = json.substr(split);
- GOOGLE_LOG(INFO) << "Testing split: " << first << "><" << rest;
- util::Status result = parser.Parse(first);
- if (result.ok()) {
- result = parser.Parse(rest);
- if (result.ok()) {
- result = parser.FinishParse();
- }
- }
- return result;
- }
-
- void DoTest(StringPiece json, int split, bool coerce_utf8 = false,
- bool allow_empty_null = false,
- bool loose_float_number_conversion = false) {
- util::Status result = RunTest(json, split, coerce_utf8, allow_empty_null,
- loose_float_number_conversion);
- if (!result.ok()) {
- GOOGLE_LOG(WARNING) << result;
- }
- EXPECT_OK(result);
- }
-
- void DoErrorTest(StringPiece json, int split, StringPiece error_prefix,
- bool coerce_utf8 = false, bool allow_empty_null = false) {
- util::Status result =
- RunTest(json, split, coerce_utf8, allow_empty_null);
- EXPECT_EQ(util::error::INVALID_ARGUMENT, result.error_code());
- StringPiece error_message(result.error_message());
- EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
- }
-
-
-#ifndef _MSC_VER
- // TODO(xiaofeng): We have to disable InSequence check for MSVC because it
- // causes stack overflow due to its use of a linked list that is desctructed
- // recursively.
- ::testing::InSequence in_sequence_;
-#endif // !_MSC_VER
- MockObjectWriter mock_;
- ExpectingObjectWriter ow_;
-};
-
-
-// Positive tests
-
-// - true, false, null
-TEST_F(JsonStreamParserTest, SimpleTrue) {
- StringPiece str = "true";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderBool("", true);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleFalse) {
- StringPiece str = "false";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderBool("", false);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleNull) {
- StringPiece str = "null";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderNull("");
- DoTest(str, i);
- }
-}
-
-// - empty object and array.
-TEST_F(JsonStreamParserTest, EmptyObject) {
- StringPiece str = "{}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")->EndObject();
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, EmptyList) {
- StringPiece str = "[]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")->EndList();
- DoTest(str, i);
- }
-}
-
-// - negative and positive double and int, unsigned int
-TEST_F(JsonStreamParserTest, SimpleDouble) {
- StringPiece str = "42.5";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderDouble("", 42.5);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, ScientificDouble) {
- StringPiece str = "1.2345e-10";
- for (int i = 0; i < str.length(); ++i) {
- ow_.RenderDouble("", 1.2345e-10);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleNegativeDouble) {
- StringPiece str = "-1045.235";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderDouble("", -1045.235);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleInt) {
- StringPiece str = "123456";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderUint64("", 123456);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleNegativeInt) {
- StringPiece str = "-79497823553162765";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderInt64("", -79497823553162765LL);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleUnsignedInt) {
- StringPiece str = "11779497823553162765";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderUint64("", 11779497823553162765ULL);
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, OctalNumberIsInvalid) {
- StringPiece str = "01234";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values.");
- }
- str = "-01234";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values.");
- }
-}
-
-TEST_F(JsonStreamParserTest, HexNumberIsInvalid) {
- StringPiece str = "0x1234";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values.");
- }
- str = "-0x1234";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values.");
- }
- str = "12x34";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Unable to parse number.");
- }
-}
-
-// - single and double quoted strings
-TEST_F(JsonStreamParserTest, EmptyDoubleQuotedString) {
- StringPiece str = "\"\"";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderString("", "");
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, EmptySingleQuotedString) {
- StringPiece str = "''";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderString("", "");
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleDoubleQuotedString) {
- StringPiece str = "\"Some String\"";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderString("", "Some String");
- DoTest(str, i);
- }
-}
-
-TEST_F(JsonStreamParserTest, SimpleSingleQuotedString) {
- StringPiece str = "'Another String'";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderString("", "Another String");
- DoTest(str, i);
- }
-}
-
-// - string key, unquoted key, numeric key
-TEST_F(JsonStreamParserTest, ObjectKeyTypes) {
- StringPiece str =
- "{'s': true, \"d\": false, key: null, snake_key: [], camelKey: {}}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")
- ->RenderBool("s", true)
- ->RenderBool("d", false)
- ->RenderNull("key")
- ->StartList("snake_key")
- ->EndList()
- ->StartObject("camelKey")
- ->EndObject()
- ->EndObject();
- DoTest(str, i);
- }
-}
-
-// - array containing primitive values (true, false, null, num, string)
-TEST_F(JsonStreamParserTest, ArrayPrimitiveValues) {
- StringPiece str = "[true, false, null, 'one', \"two\"]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")
- ->RenderBool("", true)
- ->RenderBool("", false)
- ->RenderNull("")
- ->RenderString("", "one")
- ->RenderString("", "two")
- ->EndList();
- DoTest(str, i);
- }
-}
-
-// - array containing array, object
-TEST_F(JsonStreamParserTest, ArrayComplexValues) {
- StringPiece str =
- "[[22, -127, 45.3, -1056.4, 11779497823553162765], {'key': true}]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")
- ->StartList("")
- ->RenderUint64("", 22)
- ->RenderInt64("", -127)
- ->RenderDouble("", 45.3)
- ->RenderDouble("", -1056.4)
- ->RenderUint64("", 11779497823553162765ULL)
- ->EndList()
- ->StartObject("")
- ->RenderBool("key", true)
- ->EndObject()
- ->EndList();
- DoTest(str, i);
- }
-}
-
-
-// - object containing array, object, value (true, false, null, num, string)
-TEST_F(JsonStreamParserTest, ObjectValues) {
- StringPiece str =
- "{t: true, f: false, n: null, s: 'a string', d: \"another string\", pi: "
- "22, ni: -127, pd: 45.3, nd: -1056.4, pl: 11779497823553162765, l: [[]], "
- "o: {'key': true}}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")
- ->RenderBool("t", true)
- ->RenderBool("f", false)
- ->RenderNull("n")
- ->RenderString("s", "a string")
- ->RenderString("d", "another string")
- ->RenderUint64("pi", 22)
- ->RenderInt64("ni", -127)
- ->RenderDouble("pd", 45.3)
- ->RenderDouble("nd", -1056.4)
- ->RenderUint64("pl", 11779497823553162765ULL)
- ->StartList("l")
- ->StartList("")
- ->EndList()
- ->EndList()
- ->StartObject("o")
- ->RenderBool("key", true)
- ->EndObject()
- ->EndObject();
- DoTest(str, i);
- }
-}
-
-
-TEST_F(JsonStreamParserTest, RejectNonUtf8WhenNotCoerced) {
- StringPiece json = "{\"address\":\xFF\"חרושת 23, רעננה, ישראל\"}";
- for (int i = 0; i <= json.length(); ++i) {
- DoErrorTest(json, i, "Encountered non UTF-8 code points.");
- }
- json = "{\"address\": \"חרושת 23,\xFFרעננה, ישראל\"}";
- for (int i = 0; i <= json.length(); ++i) {
- DoErrorTest(json, i, "Encountered non UTF-8 code points.");
- }
- DoErrorTest("\xFF{}", 0, "Encountered non UTF-8 code points.");
-}
-
-// - unicode handling in strings
-TEST_F(JsonStreamParserTest, UnicodeEscaping) {
- StringPiece str = "[\"\\u0639\\u0631\\u0628\\u0649\"]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")
- ->RenderString("", "\xD8\xB9\xD8\xB1\xD8\xA8\xD9\x89")
- ->EndList();
- DoTest(str, i);
- }
-}
-
-// - unicode UTF-16 surrogate pair handling in strings
-TEST_F(JsonStreamParserTest, UnicodeSurrogatePairEscaping) {
- StringPiece str =
- "[\"\\u0bee\\ud800\\uddf1\\uD80C\\uDDA4\\uD83d\\udC1D\\uD83C\\uDF6F\"]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")
- ->RenderString("",
- "\xE0\xAF\xAE\xF0\x90\x87\xB1\xF0\x93\x86\xA4\xF0"
- "\x9F\x90\x9D\xF0\x9F\x8D\xAF")
- ->EndList();
- DoTest(str, i);
- }
-}
-
-
-TEST_F(JsonStreamParserTest, UnicodeEscapingInvalidCodePointWhenNotCoerced) {
- // A low surrogate alone.
- StringPiece str = "[\"\\ude36\"]";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Invalid unicode code point.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnicodeEscapingMissingLowSurrogateWhenNotCoerced) {
- // A high surrogate alone.
- StringPiece str = "[\"\\ud83d\"]";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Missing low surrogate.");
- }
- // A high surrogate with some trailing characters.
- str = "[\"\\ud83d|ude36\"]";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Missing low surrogate.");
- }
- // A high surrogate with half a low surrogate.
- str = "[\"\\ud83d\\ude--\"]";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Invalid escape sequence.");
- }
- // Two high surrogates.
- str = "[\"\\ud83d\\ud83d\"]";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Invalid low surrogate.");
- }
-}
-
-// - ascii escaping (\b, \f, \n, \r, \t, \v)
-TEST_F(JsonStreamParserTest, AsciiEscaping) {
- StringPiece str =
- "[\"\\b\", \"\\ning\", \"test\\f\", \"\\r\\t\", \"test\\\\\\ving\"]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")
- ->RenderString("", "\b")
- ->RenderString("", "\ning")
- ->RenderString("", "test\f")
- ->RenderString("", "\r\t")
- ->RenderString("", "test\\\ving")
- ->EndList();
- DoTest(str, i);
- }
-}
-
-// - trailing commas, we support a single trailing comma but no internal commas.
-TEST_F(JsonStreamParserTest, TrailingCommas) {
- StringPiece str = "[['a',true,], {b: null,},]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")
- ->StartList("")
- ->RenderString("", "a")
- ->RenderBool("", true)
- ->EndList()
- ->StartObject("")
- ->RenderNull("b")
- ->EndObject()
- ->EndList();
- DoTest(str, i);
- }
-}
-
-// Negative tests
-
-// illegal literals
-TEST_F(JsonStreamParserTest, ExtraTextAfterTrue) {
- StringPiece str = "truee";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderBool("", true);
- DoErrorTest(str, i, "Parsing terminated before end of input.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidNumberDashOnly) {
- StringPiece str = "-";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Unable to parse number.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidNumberDashName) {
- StringPiece str = "-foo";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Unable to parse number.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidLiteralInArray) {
- StringPiece str = "[nule]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Unexpected token.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidLiteralInObject) {
- StringPiece str = "{123false}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-// mismatched quotes failure on strings
-TEST_F(JsonStreamParserTest, MismatchedSingleQuotedLiteral) {
- StringPiece str = "'Some str\"";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-TEST_F(JsonStreamParserTest, MismatchedDoubleQuotedLiteral) {
- StringPiece str = "\"Another string that ends poorly!'";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-// unterminated strings
-TEST_F(JsonStreamParserTest, UnterminatedLiteralString) {
- StringPiece str = "\"Forgot the rest of i";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnterminatedStringEscape) {
- StringPiece str = "\"Forgot the rest of \\";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnterminatedStringInArray) {
- StringPiece str = "[\"Forgot to close the string]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnterminatedStringInObject) {
- StringPiece str = "{f: \"Forgot to close the string}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnterminatedObject) {
- StringPiece str = "{";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Unexpected end of string.");
- }
-}
-
-
-// mismatched object and array closing
-TEST_F(JsonStreamParserTest, MismatchedCloseObject) {
- StringPiece str = "{'key': true]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")->RenderBool("key", true);
- DoErrorTest(str, i, "Expected , or } after key:value pair.");
- }
-}
-
-TEST_F(JsonStreamParserTest, MismatchedCloseArray) {
- StringPiece str = "[true, null}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")->RenderBool("", true)->RenderNull("");
- DoErrorTest(str, i, "Expected , or ] after array value.");
- }
-}
-
-// Invalid object keys.
-TEST_F(JsonStreamParserTest, InvalidNumericObjectKey) {
- StringPiece str = "{42: true}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidLiteralObjectInObject) {
- StringPiece str = "{{bob: true}}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidLiteralArrayInObject) {
- StringPiece str = "{[null]}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidLiteralValueInObject) {
- StringPiece str = "{false}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-TEST_F(JsonStreamParserTest, MissingColonAfterStringInObject) {
- StringPiece str = "{\"key\"}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected : between key:value pair.");
- }
-}
-
-TEST_F(JsonStreamParserTest, MissingColonAfterKeyInObject) {
- StringPiece str = "{key}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected : between key:value pair.");
- }
-}
-
-TEST_F(JsonStreamParserTest, EndOfTextAfterKeyInObject) {
- StringPiece str = "{key";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Unexpected end of string.");
- }
-}
-
-TEST_F(JsonStreamParserTest, MissingValueAfterColonInObject) {
- StringPiece str = "{key:}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Unexpected token.");
- }
-}
-
-TEST_F(JsonStreamParserTest, MissingCommaBetweenObjectEntries) {
- StringPiece str = "{key:20 'hello': true}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")->RenderUint64("key", 20);
- DoErrorTest(str, i, "Expected , or } after key:value pair.");
- }
-}
-
-TEST_F(JsonStreamParserTest, InvalidLiteralAsObjectKey) {
- StringPiece str = "{false: 20}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-TEST_F(JsonStreamParserTest, ExtraCharactersAfterObject) {
- StringPiece str = "{}}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")->EndObject();
- DoErrorTest(str, i, "Parsing terminated before end of input.");
- }
-}
-
-// numbers too large
-TEST_F(JsonStreamParserTest, PositiveNumberTooBig) {
- StringPiece str = "[18446744073709551616]"; // 2^64
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Unable to parse number.");
- }
-}
-
-TEST_F(JsonStreamParserTest, NegativeNumberTooBig) {
- StringPiece str = "[-18446744073709551616]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Unable to parse number.");
- }
-}
-
-TEST_F(JsonStreamParserTest, DoubleTooBig) {
- StringPiece str = "[1.89769e+308]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Number exceeds the range of double.");
- }
- str = "[-1.89769e+308]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Number exceeds the range of double.");
- }
-}
-
-
-// invalid bare backslash.
-TEST_F(JsonStreamParserTest, UnfinishedEscape) {
- StringPiece str = "\"\\";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Closing quote expected in string.");
- }
-}
-
-// invalid bare backslash u.
-TEST_F(JsonStreamParserTest, UnfinishedUnicodeEscape) {
- StringPiece str = "\"\\u";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Illegal hex string.");
- }
-}
-
-// invalid unicode sequence.
-TEST_F(JsonStreamParserTest, UnicodeEscapeCutOff) {
- StringPiece str = "\"\\u12";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Illegal hex string.");
- }
-}
-
-// invalid unicode sequence (valid in modern EcmaScript but not in JSON).
-TEST_F(JsonStreamParserTest, BracketedUnicodeEscape) {
- StringPiece str = "\"\\u{1f36f}\"";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Invalid escape sequence.");
- }
-}
-
-
-TEST_F(JsonStreamParserTest, UnicodeEscapeInvalidCharacters) {
- StringPiece str = "\"\\u12$4hello";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Invalid escape sequence.");
- }
-}
-
-// invalid unicode sequence in low half surrogate: g is not a hex digit.
-TEST_F(JsonStreamParserTest, UnicodeEscapeLowHalfSurrogateInvalidCharacters) {
- StringPiece str = "\"\\ud800\\udcfg\"";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Invalid escape sequence.");
- }
-}
-
-// Extra commas with an object or array.
-TEST_F(JsonStreamParserTest, ExtraCommaInObject) {
- StringPiece str = "{'k1': true,,'k2': false}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")->RenderBool("k1", true);
- DoErrorTest(str, i, "Expected an object key or }.");
- }
-}
-
-TEST_F(JsonStreamParserTest, ExtraCommaInArray) {
- StringPiece str = "[true,,false}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")->RenderBool("", true);
- DoErrorTest(str, i, "Unexpected token.");
- }
-}
-
-// Extra text beyond end of value.
-TEST_F(JsonStreamParserTest, ExtraTextAfterLiteral) {
- StringPiece str = "'hello', 'world'";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.RenderString("", "hello");
- DoErrorTest(str, i, "Parsing terminated before end of input.");
- }
-}
-
-TEST_F(JsonStreamParserTest, ExtraTextAfterObject) {
- StringPiece str = "{'key': true} 'oops'";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("")->RenderBool("key", true)->EndObject();
- DoErrorTest(str, i, "Parsing terminated before end of input.");
- }
-}
-
-TEST_F(JsonStreamParserTest, ExtraTextAfterArray) {
- StringPiece str = "[null] 'oops'";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("")->RenderNull("")->EndList();
- DoErrorTest(str, i, "Parsing terminated before end of input.");
- }
-}
-
-// Random unknown text in the value.
-TEST_F(JsonStreamParserTest, UnknownCharactersAsValue) {
- StringPiece str = "*&#25";
- for (int i = 0; i <= str.length(); ++i) {
- DoErrorTest(str, i, "Expected a value.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnknownCharactersInArray) {
- StringPiece str = "[*&#25]";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartList("");
- DoErrorTest(str, i, "Expected a value or ] within an array.");
- }
-}
-
-TEST_F(JsonStreamParserTest, UnknownCharactersInObject) {
- StringPiece str = "{'key': *&#25}";
- for (int i = 0; i <= str.length(); ++i) {
- ow_.StartObject("");
- DoErrorTest(str, i, "Expected a value.");
- }
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h
deleted file mode 100644
index 0864b05737..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/location_tracker.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_LOCATION_TRACKER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_LOCATION_TRACKER_H__
-
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// LocationTrackerInterface is an interface for classes that track
-// the location information for the purpose of error reporting.
-class LIBPROTOBUF_EXPORT LocationTrackerInterface {
- public:
- virtual ~LocationTrackerInterface() {}
-
- // Returns the object location as human readable string.
- virtual string ToString() const = 0;
-
- protected:
- LocationTrackerInterface() {}
-
- private:
- // Please do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LocationTrackerInterface);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_LOCATION_TRACKER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h
deleted file mode 100644
index 591c35dbbb..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/mock_error_listener.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_MOCK_ERROR_LISTENER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_MOCK_ERROR_LISTENER_H__
-
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/location_tracker.h>
-#include <gmock/gmock.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class MockErrorListener : public ErrorListener {
- public:
- MockErrorListener() {}
- virtual ~MockErrorListener() {}
-
- MOCK_METHOD3(InvalidName, void(const LocationTrackerInterface& loc,
- StringPiece unknown_name,
- StringPiece message));
- MOCK_METHOD3(InvalidValue, void(const LocationTrackerInterface& loc,
- StringPiece type_name, StringPiece value));
- MOCK_METHOD2(MissingField, void(const LocationTrackerInterface& loc,
- StringPiece missing_name));
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_MOCK_ERROR_LISTENER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h
deleted file mode 100644
index 8586cecc91..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_location_tracker.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_LOCATION_TRACKER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_LOCATION_TRACKER_H__
-
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/location_tracker.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// An empty concrete implementation of LocationTrackerInterface.
-class ObjectLocationTracker : public LocationTrackerInterface {
- public:
- // Creates an empty location tracker.
- ObjectLocationTracker() {}
-
- virtual ~ObjectLocationTracker() {}
-
- // Returns empty because nothing is tracked.
- virtual string ToString() const { return ""; }
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectLocationTracker);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_LOCATION_TRACKER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h
deleted file mode 100644
index 2c31cfb09e..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_source.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_SOURCE_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_SOURCE_H__
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/status.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class ObjectWriter;
-
-// An ObjectSource is anything that can write to an ObjectWriter.
-// Implementation of this interface typically provide constructors or
-// factory methods to create an instance based on some source data, for
-// example, a character stream, or protobuf.
-//
-// Derived classes could be thread-unsafe.
-class LIBPROTOBUF_EXPORT ObjectSource {
- public:
- virtual ~ObjectSource() {}
-
- // Writes to the ObjectWriter
- virtual util::Status WriteTo(ObjectWriter* ow) const {
- return NamedWriteTo("", ow);
- }
-
- // Writes to the ObjectWriter with a custom name for the message.
- // This is useful when you chain ObjectSource together by embedding one
- // within another.
- virtual util::Status NamedWriteTo(StringPiece name,
- ObjectWriter* ow) const = 0;
-
- protected:
- ObjectSource() {}
-
- private:
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectSource);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_SOURCE_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc
deleted file mode 100644
index 57cc08a1d7..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/object_writer.h>
-
-#include <google/protobuf/util/internal/datapiece.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// static
-void ObjectWriter::RenderDataPieceTo(const DataPiece& data, StringPiece name,
- ObjectWriter* ow) {
- switch (data.type()) {
- case DataPiece::TYPE_INT32: {
- ow->RenderInt32(name, data.ToInt32().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_INT64: {
- ow->RenderInt64(name, data.ToInt64().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_UINT32: {
- ow->RenderUint32(name, data.ToUint32().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_UINT64: {
- ow->RenderUint64(name, data.ToUint64().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_DOUBLE: {
- ow->RenderDouble(name, data.ToDouble().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_FLOAT: {
- ow->RenderFloat(name, data.ToFloat().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_BOOL: {
- ow->RenderBool(name, data.ToBool().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_STRING: {
- ow->RenderString(name, data.ToString().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_BYTES: {
- ow->RenderBytes(name, data.ToBytes().ValueOrDie());
- break;
- }
- case DataPiece::TYPE_NULL: {
- ow->RenderNull(name);
- break;
- }
- default:
- break;
- }
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h
deleted file mode 100644
index b6fbd19bf7..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/object_writer.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_WRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_WRITER_H__
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class DataPiece;
-
-// An ObjectWriter is an interface for writing a stream of events
-// representing objects and collections. Implementation of this
-// interface can be used to write an object stream to an in-memory
-// structure, protobufs, JSON, XML, or any other output format
-// desired. The ObjectSource interface is typically used as the
-// source of an object stream.
-//
-// See JsonObjectWriter for a sample implementation of ObjectWriter
-// and its use.
-//
-// Derived classes could be thread-unsafe.
-//
-// TODO(xinb): seems like a prime candidate to apply the RAII paradigm
-// and get rid the need to call EndXXX().
-class LIBPROTOBUF_EXPORT ObjectWriter {
- public:
- virtual ~ObjectWriter() {}
-
- // Starts an object. If the name is empty, the object will not be named.
- virtual ObjectWriter* StartObject(StringPiece name) = 0;
-
- // Ends an object.
- virtual ObjectWriter* EndObject() = 0;
-
- // Starts a list. If the name is empty, the list will not be named.
- virtual ObjectWriter* StartList(StringPiece name) = 0;
-
- // Ends a list.
- virtual ObjectWriter* EndList() = 0;
-
- // Renders a boolean value.
- virtual ObjectWriter* RenderBool(StringPiece name, bool value) = 0;
-
- // Renders an 32-bit integer value.
- virtual ObjectWriter* RenderInt32(StringPiece name, int32 value) = 0;
-
- // Renders an 32-bit unsigned integer value.
- virtual ObjectWriter* RenderUint32(StringPiece name, uint32 value) = 0;
-
- // Renders a 64-bit integer value.
- virtual ObjectWriter* RenderInt64(StringPiece name, int64 value) = 0;
-
- // Renders an 64-bit unsigned integer value.
- virtual ObjectWriter* RenderUint64(StringPiece name, uint64 value) = 0;
-
- // Renders a double value.
- virtual ObjectWriter* RenderDouble(StringPiece name, double value) = 0;
-
- // Renders a float value.
- virtual ObjectWriter* RenderFloat(StringPiece name, float value) = 0;
-
- // Renders a StringPiece value. This is for rendering strings.
- virtual ObjectWriter* RenderString(StringPiece name, StringPiece value) = 0;
-
- // Renders a bytes value.
- virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) = 0;
-
- // Renders a Null value.
- virtual ObjectWriter* RenderNull(StringPiece name) = 0;
-
-
- // Renders a DataPiece object to a ObjectWriter.
- static void RenderDataPieceTo(const DataPiece& data, StringPiece name,
- ObjectWriter* ow);
-
- // Indicates whether this ObjectWriter has completed writing the root message,
- // usually this means writing of one complete object. Subclasses must override
- // this behavior appropriately.
- virtual bool done() { return false; }
-
- void set_use_strict_base64_decoding(bool value) {
- use_strict_base64_decoding_ = value;
- }
-
- bool use_strict_base64_decoding() const {
- return use_strict_base64_decoding_;
- }
-
- // Whether empty strings should be rendered for the next name for Start/Render
- // calls. This setting is only valid until the next key is rendered, after
- // which it gets reset.
- // It is up to the derived classes to interpret this and render accordingly.
- // Default implementation ignores this setting.
- virtual void empty_name_ok_for_next_key() {}
-
- protected:
- ObjectWriter() : use_strict_base64_decoding_(true) {}
-
- private:
- // If set to true, we use the stricter version of base64 decoding for byte
- // fields by making sure decoded version encodes back to the original string.
- bool use_strict_base64_decoding_;
-
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_OBJECT_WRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc
deleted file mode 100644
index 8bebf2ab1f..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.cc
+++ /dev/null
@@ -1,799 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/proto_writer.h>
-
-#include <functional>
-#include <stack>
-
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/util/internal/field_mask_utility.h>
-#include <google/protobuf/util/internal/object_location_tracker.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/statusor.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::internal::WireFormatLite;
-using google::protobuf::io::CodedOutputStream;
-using util::error::INVALID_ARGUMENT;
-using util::Status;
-using util::StatusOr;
-
-
-ProtoWriter::ProtoWriter(TypeResolver* type_resolver,
- const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener)
- : master_type_(type),
- typeinfo_(TypeInfo::NewTypeInfo(type_resolver)),
- own_typeinfo_(true),
- done_(false),
- ignore_unknown_fields_(false),
- use_lower_camel_for_enums_(false),
- element_(NULL),
- size_insert_(),
- output_(output),
- buffer_(),
- adapter_(&buffer_),
- stream_(new CodedOutputStream(&adapter_)),
- listener_(listener),
- invalid_depth_(0),
- tracker_(new ObjectLocationTracker()) {}
-
-ProtoWriter::ProtoWriter(const TypeInfo* typeinfo,
- const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener)
- : master_type_(type),
- typeinfo_(typeinfo),
- own_typeinfo_(false),
- done_(false),
- ignore_unknown_fields_(false),
- use_lower_camel_for_enums_(false),
- element_(NULL),
- size_insert_(),
- output_(output),
- buffer_(),
- adapter_(&buffer_),
- stream_(new CodedOutputStream(&adapter_)),
- listener_(listener),
- invalid_depth_(0),
- tracker_(new ObjectLocationTracker()) {}
-
-ProtoWriter::~ProtoWriter() {
- if (own_typeinfo_) {
- delete typeinfo_;
- }
- if (element_ == NULL) return;
- // Cleanup explicitly in order to avoid destructor stack overflow when input
- // is deeply nested.
- // Cast to BaseElement to avoid doing additional checks (like missing fields)
- // during pop().
- google::protobuf::scoped_ptr<BaseElement> element(
- static_cast<BaseElement*>(element_.get())->pop<BaseElement>());
- while (element != NULL) {
- element.reset(element->pop<BaseElement>());
- }
-}
-
-namespace {
-
-// Writes an INT32 field, including tag to the stream.
-inline Status WriteInt32(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<int32> i32 = data.ToInt32();
- if (i32.ok()) {
- WireFormatLite::WriteInt32(field_number, i32.ValueOrDie(), stream);
- }
- return i32.status();
-}
-
-// writes an SFIXED32 field, including tag, to the stream.
-inline Status WriteSFixed32(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<int32> i32 = data.ToInt32();
- if (i32.ok()) {
- WireFormatLite::WriteSFixed32(field_number, i32.ValueOrDie(), stream);
- }
- return i32.status();
-}
-
-// Writes an SINT32 field, including tag, to the stream.
-inline Status WriteSInt32(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<int32> i32 = data.ToInt32();
- if (i32.ok()) {
- WireFormatLite::WriteSInt32(field_number, i32.ValueOrDie(), stream);
- }
- return i32.status();
-}
-
-// Writes a FIXED32 field, including tag, to the stream.
-inline Status WriteFixed32(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<uint32> u32 = data.ToUint32();
- if (u32.ok()) {
- WireFormatLite::WriteFixed32(field_number, u32.ValueOrDie(), stream);
- }
- return u32.status();
-}
-
-// Writes a UINT32 field, including tag, to the stream.
-inline Status WriteUInt32(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<uint32> u32 = data.ToUint32();
- if (u32.ok()) {
- WireFormatLite::WriteUInt32(field_number, u32.ValueOrDie(), stream);
- }
- return u32.status();
-}
-
-// Writes an INT64 field, including tag, to the stream.
-inline Status WriteInt64(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<int64> i64 = data.ToInt64();
- if (i64.ok()) {
- WireFormatLite::WriteInt64(field_number, i64.ValueOrDie(), stream);
- }
- return i64.status();
-}
-
-// Writes an SFIXED64 field, including tag, to the stream.
-inline Status WriteSFixed64(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<int64> i64 = data.ToInt64();
- if (i64.ok()) {
- WireFormatLite::WriteSFixed64(field_number, i64.ValueOrDie(), stream);
- }
- return i64.status();
-}
-
-// Writes an SINT64 field, including tag, to the stream.
-inline Status WriteSInt64(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<int64> i64 = data.ToInt64();
- if (i64.ok()) {
- WireFormatLite::WriteSInt64(field_number, i64.ValueOrDie(), stream);
- }
- return i64.status();
-}
-
-// Writes a FIXED64 field, including tag, to the stream.
-inline Status WriteFixed64(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<uint64> u64 = data.ToUint64();
- if (u64.ok()) {
- WireFormatLite::WriteFixed64(field_number, u64.ValueOrDie(), stream);
- }
- return u64.status();
-}
-
-// Writes a UINT64 field, including tag, to the stream.
-inline Status WriteUInt64(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<uint64> u64 = data.ToUint64();
- if (u64.ok()) {
- WireFormatLite::WriteUInt64(field_number, u64.ValueOrDie(), stream);
- }
- return u64.status();
-}
-
-// Writes a DOUBLE field, including tag, to the stream.
-inline Status WriteDouble(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<double> d = data.ToDouble();
- if (d.ok()) {
- WireFormatLite::WriteDouble(field_number, d.ValueOrDie(), stream);
- }
- return d.status();
-}
-
-// Writes a FLOAT field, including tag, to the stream.
-inline Status WriteFloat(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<float> f = data.ToFloat();
- if (f.ok()) {
- WireFormatLite::WriteFloat(field_number, f.ValueOrDie(), stream);
- }
- return f.status();
-}
-
-// Writes a BOOL field, including tag, to the stream.
-inline Status WriteBool(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<bool> b = data.ToBool();
- if (b.ok()) {
- WireFormatLite::WriteBool(field_number, b.ValueOrDie(), stream);
- }
- return b.status();
-}
-
-// Writes a BYTES field, including tag, to the stream.
-inline Status WriteBytes(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<string> c = data.ToBytes();
- if (c.ok()) {
- WireFormatLite::WriteBytes(field_number, c.ValueOrDie(), stream);
- }
- return c.status();
-}
-
-// Writes a STRING field, including tag, to the stream.
-inline Status WriteString(int field_number, const DataPiece& data,
- CodedOutputStream* stream) {
- StatusOr<string> s = data.ToString();
- if (s.ok()) {
- WireFormatLite::WriteString(field_number, s.ValueOrDie(), stream);
- }
- return s.status();
-}
-
-// Writes an ENUM field, including tag, to the stream.
-inline Status WriteEnum(int field_number, const DataPiece& data,
- const google::protobuf::Enum* enum_type,
- CodedOutputStream* stream,
- bool use_lower_camel_for_enums) {
- StatusOr<int> e = data.ToEnum(enum_type, use_lower_camel_for_enums);
- if (e.ok()) {
- WireFormatLite::WriteEnum(field_number, e.ValueOrDie(), stream);
- }
- return e.status();
-}
-
-// Given a google::protobuf::Type, returns the set of all required fields.
-std::set<const google::protobuf::Field*> GetRequiredFields(
- const google::protobuf::Type& type) {
- std::set<const google::protobuf::Field*> required;
- for (int i = 0; i < type.fields_size(); i++) {
- const google::protobuf::Field& field = type.fields(i);
- if (field.cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REQUIRED) {
- required.insert(&field);
- }
- }
- return required;
-}
-
-} // namespace
-
-ProtoWriter::ProtoElement::ProtoElement(const TypeInfo* typeinfo,
- const google::protobuf::Type& type,
- ProtoWriter* enclosing)
- : BaseElement(NULL),
- ow_(enclosing),
- parent_field_(NULL),
- typeinfo_(typeinfo),
- proto3_(type.syntax() == google::protobuf::SYNTAX_PROTO3),
- type_(type),
- size_index_(-1),
- array_index_(-1),
- // oneof_indices_ values are 1-indexed (0 means not present).
- oneof_indices_(type.oneofs_size() + 1) {
- if (!proto3_) {
- required_fields_ = GetRequiredFields(type_);
- }
-}
-
-ProtoWriter::ProtoElement::ProtoElement(ProtoWriter::ProtoElement* parent,
- const google::protobuf::Field* field,
- const google::protobuf::Type& type,
- bool is_list)
- : BaseElement(parent),
- ow_(this->parent()->ow_),
- parent_field_(field),
- typeinfo_(this->parent()->typeinfo_),
- proto3_(type.syntax() == google::protobuf::SYNTAX_PROTO3),
- type_(type),
- size_index_(
- !is_list && field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE
- ? ow_->size_insert_.size()
- : -1),
- array_index_(is_list ? 0 : -1),
- // oneof_indices_ values are 1-indexed (0 means not present).
- oneof_indices_(type_.oneofs_size() + 1) {
- if (!is_list) {
- if (ow_->IsRepeated(*field)) {
- // Update array_index_ if it is an explicit list.
- if (this->parent()->array_index_ >= 0) this->parent()->array_index_++;
- } else if (!proto3_) {
- // For required fields tracking.
- this->parent()->RegisterField(field);
- }
-
- if (field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) {
- if (!proto3_) {
- required_fields_ = GetRequiredFields(type_);
- }
- int start_pos = ow_->stream_->ByteCount();
- // length of serialized message is the final buffer position minus
- // starting buffer position, plus length adjustments for size fields
- // of any nested messages. We start with -start_pos here, so we only
- // need to add the final buffer position to it at the end.
- SizeInfo info = {start_pos, -start_pos};
- ow_->size_insert_.push_back(info);
- }
- }
-}
-
-ProtoWriter::ProtoElement* ProtoWriter::ProtoElement::pop() {
- if (!proto3_) {
- // Calls the registered error listener for any required field(s) not yet
- // seen.
- for (std::set<const google::protobuf::Field*>::iterator it =
- required_fields_.begin();
- it != required_fields_.end(); ++it) {
- ow_->MissingField((*it)->name());
- }
- }
- // Computes the total number of proto bytes used by a message, also adjusts
- // the size of all parent messages by the length of this size field.
- // If size_index_ < 0, this is not a message, so no size field is added.
- if (size_index_ >= 0) {
- // Add the final buffer position to compute the total length of this
- // serialized message. The stored value (before this addition) already
- // contains the total length of the size fields of all nested messages
- // minus the initial buffer position.
- ow_->size_insert_[size_index_].size += ow_->stream_->ByteCount();
- // Calculate the length required to serialize the size field of the
- // message, and propagate this additional size information upward to
- // all enclosing messages.
- int size = ow_->size_insert_[size_index_].size;
- int length = CodedOutputStream::VarintSize32(size);
- for (ProtoElement* e = parent(); e != NULL; e = e->parent()) {
- // Only nested messages have size field, lists do not have size field.
- if (e->size_index_ >= 0) {
- ow_->size_insert_[e->size_index_].size += length;
- }
- }
- }
- return BaseElement::pop<ProtoElement>();
-}
-
-void ProtoWriter::ProtoElement::RegisterField(
- const google::protobuf::Field* field) {
- if (!required_fields_.empty() &&
- field->cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REQUIRED) {
- required_fields_.erase(field);
- }
-}
-
-string ProtoWriter::ProtoElement::ToString() const {
- if (parent() == NULL) return "";
- string loc = parent()->ToString();
- if (!ow_->IsRepeated(*parent_field_) ||
- parent()->parent_field_ != parent_field_) {
- string name = parent_field_->name();
- int i = 0;
- while (i < name.size() && (ascii_isalnum(name[i]) || name[i] == '_')) ++i;
- if (i > 0 && i == name.size()) { // safe field name
- if (loc.empty()) {
- loc = name;
- } else {
- StrAppend(&loc, ".", name);
- }
- } else {
- StrAppend(&loc, "[\"", CEscape(name), "\"]");
- }
- }
- if (ow_->IsRepeated(*parent_field_) && array_index_ > 0) {
- StrAppend(&loc, "[", array_index_ - 1, "]");
- }
- return loc.empty() ? "." : loc;
-}
-
-bool ProtoWriter::ProtoElement::IsOneofIndexTaken(int32 index) {
- return oneof_indices_[index];
-}
-
-void ProtoWriter::ProtoElement::TakeOneofIndex(int32 index) {
- oneof_indices_[index] = true;
-}
-
-void ProtoWriter::InvalidName(StringPiece unknown_name, StringPiece message) {
- listener_->InvalidName(location(), ToSnakeCase(unknown_name), message);
-}
-
-void ProtoWriter::InvalidValue(StringPiece type_name, StringPiece value) {
- listener_->InvalidValue(location(), type_name, value);
-}
-
-void ProtoWriter::MissingField(StringPiece missing_name) {
- listener_->MissingField(location(), missing_name);
-}
-
-ProtoWriter* ProtoWriter::StartObject(StringPiece name) {
- // Starting the root message. Create the root ProtoElement and return.
- if (element_ == NULL) {
- if (!name.empty()) {
- InvalidName(name, "Root element should not be named.");
- }
- element_.reset(new ProtoElement(typeinfo_, master_type_, this));
- return this;
- }
-
- const google::protobuf::Field* field = NULL;
- field = BeginNamed(name, false);
- if (field == NULL) return this;
-
- // Check to see if this field is a oneof and that no oneof in that group has
- // already been set.
- if (!ValidOneof(*field, name)) {
- ++invalid_depth_;
- return this;
- }
-
- const google::protobuf::Type* type = LookupType(field);
- if (type == NULL) {
- ++invalid_depth_;
- InvalidName(name,
- StrCat("Missing descriptor for field: ", field->type_url()));
- return this;
- }
-
- return StartObjectField(*field, *type);
-}
-
-ProtoWriter* ProtoWriter::EndObject() {
- if (invalid_depth_ > 0) {
- --invalid_depth_;
- return this;
- }
-
- if (element_ != NULL) {
- element_.reset(element_->pop());
- }
-
-
- // If ending the root element,
- // then serialize the full message with calculated sizes.
- if (element_ == NULL) {
- WriteRootMessage();
- }
- return this;
-}
-
-ProtoWriter* ProtoWriter::StartList(StringPiece name) {
- const google::protobuf::Field* field = BeginNamed(name, true);
- if (field == NULL) return this;
-
- if (!ValidOneof(*field, name)) {
- ++invalid_depth_;
- return this;
- }
-
- const google::protobuf::Type* type = LookupType(field);
- if (type == NULL) {
- ++invalid_depth_;
- InvalidName(name,
- StrCat("Missing descriptor for field: ", field->type_url()));
- return this;
- }
-
- return StartListField(*field, *type);
-}
-
-ProtoWriter* ProtoWriter::EndList() {
- if (invalid_depth_ > 0) {
- --invalid_depth_;
- } else if (element_ != NULL) {
- element_.reset(element_->pop());
- }
- return this;
-}
-
-ProtoWriter* ProtoWriter::RenderDataPiece(StringPiece name,
- const DataPiece& data) {
- Status status;
- if (invalid_depth_ > 0) return this;
-
- const google::protobuf::Field* field = Lookup(name);
- if (field == NULL) return this;
-
- if (!ValidOneof(*field, name)) return this;
-
- const google::protobuf::Type* type = LookupType(field);
- if (type == NULL) {
- InvalidName(name,
- StrCat("Missing descriptor for field: ", field->type_url()));
- return this;
- }
-
- return RenderPrimitiveField(*field, *type, data);
-}
-
-bool ProtoWriter::ValidOneof(const google::protobuf::Field& field,
- StringPiece unnormalized_name) {
- if (element_ == NULL) return true;
-
- if (field.oneof_index() > 0) {
- if (element_->IsOneofIndexTaken(field.oneof_index())) {
- InvalidValue(
- "oneof",
- StrCat("oneof field '",
- element_->type().oneofs(field.oneof_index() - 1),
- "' is already set. Cannot set '", unnormalized_name, "'"));
- return false;
- }
- element_->TakeOneofIndex(field.oneof_index());
- }
- return true;
-}
-
-bool ProtoWriter::IsRepeated(const google::protobuf::Field& field) {
- return field.cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED;
-}
-
-ProtoWriter* ProtoWriter::StartObjectField(const google::protobuf::Field& field,
- const google::protobuf::Type& type) {
- WriteTag(field);
- element_.reset(new ProtoElement(element_.release(), &field, type, false));
- return this;
-}
-
-ProtoWriter* ProtoWriter::StartListField(const google::protobuf::Field& field,
- const google::protobuf::Type& type) {
- element_.reset(new ProtoElement(element_.release(), &field, type, true));
- return this;
-}
-
-ProtoWriter* ProtoWriter::RenderPrimitiveField(
- const google::protobuf::Field& field, const google::protobuf::Type& type,
- const DataPiece& data) {
- Status status;
-
- // Pushing a ProtoElement and then pop it off at the end for 2 purposes:
- // error location reporting and required field accounting.
- //
- // For proto3, since there is no required field tracking, we only need to push
- // ProtoElement for error cases.
- if (!element_->proto3()) {
- element_.reset(new ProtoElement(element_.release(), &field, type, false));
- }
-
- if (field.kind() == google::protobuf::Field_Kind_TYPE_UNKNOWN ||
- field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) {
- // Push a ProtoElement for location reporting purposes.
- if (element_->proto3()) {
- element_.reset(new ProtoElement(element_.release(), &field, type, false));
- }
- InvalidValue(field.type_url().empty()
- ? google::protobuf::Field_Kind_Name(field.kind())
- : field.type_url(),
- data.ValueAsStringOrDefault(""));
- element_.reset(element()->pop());
- return this;
- }
-
- switch (field.kind()) {
- case google::protobuf::Field_Kind_TYPE_INT32: {
- status = WriteInt32(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SFIXED32: {
- status = WriteSFixed32(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SINT32: {
- status = WriteSInt32(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FIXED32: {
- status = WriteFixed32(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_UINT32: {
- status = WriteUInt32(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_INT64: {
- status = WriteInt64(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SFIXED64: {
- status = WriteSFixed64(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SINT64: {
- status = WriteSInt64(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FIXED64: {
- status = WriteFixed64(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_UINT64: {
- status = WriteUInt64(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_DOUBLE: {
- status = WriteDouble(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FLOAT: {
- status = WriteFloat(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_BOOL: {
- status = WriteBool(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_BYTES: {
- status = WriteBytes(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_STRING: {
- status = WriteString(field.number(), data, stream_.get());
- break;
- }
- case google::protobuf::Field_Kind_TYPE_ENUM: {
- status = WriteEnum(field.number(), data,
- typeinfo_->GetEnumByTypeUrl(field.type_url()),
- stream_.get(), use_lower_camel_for_enums_);
- break;
- }
- default: // TYPE_GROUP or TYPE_MESSAGE
- status = Status(INVALID_ARGUMENT, data.ToString().ValueOrDie());
- }
-
- if (!status.ok()) {
- // Push a ProtoElement for location reporting purposes.
- if (element_->proto3()) {
- element_.reset(new ProtoElement(element_.release(), &field, type, false));
- }
- InvalidValue(google::protobuf::Field_Kind_Name(field.kind()),
- status.error_message());
- element_.reset(element()->pop());
- return this;
- }
-
- if (!element_->proto3()) element_.reset(element()->pop());
-
- return this;
-}
-
-const google::protobuf::Field* ProtoWriter::BeginNamed(StringPiece name,
- bool is_list) {
- if (invalid_depth_ > 0) {
- ++invalid_depth_;
- return NULL;
- }
- const google::protobuf::Field* field = Lookup(name);
- if (field == NULL) {
- ++invalid_depth_;
- // InvalidName() already called in Lookup().
- return NULL;
- }
- if (is_list && !IsRepeated(*field)) {
- ++invalid_depth_;
- InvalidName(name, "Proto field is not repeating, cannot start list.");
- return NULL;
- }
- return field;
-}
-
-const google::protobuf::Field* ProtoWriter::Lookup(
- StringPiece unnormalized_name) {
- ProtoElement* e = element();
- if (e == NULL) {
- InvalidName(unnormalized_name, "Root element must be a message.");
- return NULL;
- }
- if (unnormalized_name.empty()) {
- // Objects in repeated field inherit the same field descriptor.
- if (e->parent_field() == NULL) {
- InvalidName(unnormalized_name, "Proto fields must have a name.");
- } else if (!IsRepeated(*e->parent_field())) {
- InvalidName(unnormalized_name, "Proto fields must have a name.");
- return NULL;
- }
- return e->parent_field();
- }
- const google::protobuf::Field* field =
- typeinfo_->FindField(&e->type(), unnormalized_name);
- if (field == NULL && !ignore_unknown_fields_) {
- InvalidName(unnormalized_name, "Cannot find field.");
- }
- return field;
-}
-
-const google::protobuf::Type* ProtoWriter::LookupType(
- const google::protobuf::Field* field) {
- return ((field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE ||
- field->kind() == google::protobuf::Field_Kind_TYPE_GROUP)
- ? typeinfo_->GetTypeByTypeUrl(field->type_url())
- : &element_->type());
-}
-
-void ProtoWriter::WriteRootMessage() {
- GOOGLE_DCHECK(!done_);
- int curr_pos = 0;
- // Calls the destructor of CodedOutputStream to remove any uninitialized
- // memory from the Cord before we read it.
- stream_.reset(NULL);
- const void* data;
- int length;
- google::protobuf::io::ArrayInputStream input_stream(buffer_.data(), buffer_.size());
- while (input_stream.Next(&data, &length)) {
- if (length == 0) continue;
- int num_bytes = length;
- // Write up to where we need to insert the size field.
- // The number of bytes we may write is the smaller of:
- // - the current fragment size
- // - the distance to the next position where a size field needs to be
- // inserted.
- if (!size_insert_.empty() &&
- size_insert_.front().pos - curr_pos < num_bytes) {
- num_bytes = size_insert_.front().pos - curr_pos;
- }
- output_->Append(static_cast<const char*>(data), num_bytes);
- if (num_bytes < length) {
- input_stream.BackUp(length - num_bytes);
- }
- curr_pos += num_bytes;
- // Insert the size field.
- // size_insert_.front(): the next <index, size> pair to be written.
- // size_insert_.front().pos: position of the size field.
- // size_insert_.front().size: the size (integer) to be inserted.
- if (!size_insert_.empty() && curr_pos == size_insert_.front().pos) {
- // Varint32 occupies at most 10 bytes.
- uint8 insert_buffer[10];
- uint8* insert_buffer_pos = CodedOutputStream::WriteVarint32ToArray(
- size_insert_.front().size, insert_buffer);
- output_->Append(reinterpret_cast<const char*>(insert_buffer),
- insert_buffer_pos - insert_buffer);
- size_insert_.pop_front();
- }
- }
- output_->Flush();
- stream_.reset(new CodedOutputStream(&adapter_));
- done_ = true;
-}
-
-void ProtoWriter::WriteTag(const google::protobuf::Field& field) {
- WireFormatLite::WireType wire_type = WireFormatLite::WireTypeForFieldType(
- static_cast<WireFormatLite::FieldType>(field.kind()));
- stream_->WriteTag(WireFormatLite::MakeTag(field.number(), wire_type));
-}
-
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h
deleted file mode 100644
index 21dff88d72..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/proto_writer.h
+++ /dev/null
@@ -1,353 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__
-
-#include <deque>
-#include <string>
-#include <vector>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/internal/datapiece.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/structured_objectwriter.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/hash.h>
-
-namespace google {
-namespace protobuf {
-namespace io {
-class CodedOutputStream;
-} // namespace io
-} // namespace protobuf
-
-
-namespace protobuf {
-class Type;
-class Field;
-} // namespace protobuf
-
-
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class ObjectLocationTracker;
-
-// An ObjectWriter that can write protobuf bytes directly from writer events.
-// This class does not support special types like Struct or Map. However, since
-// this class supports raw protobuf, it can be used to provide support for
-// special types by inheriting from it or by wrapping it.
-//
-// It also supports streaming.
-class LIBPROTOBUF_EXPORT ProtoWriter : public StructuredObjectWriter {
- public:
-// Constructor. Does not take ownership of any parameter passed in.
- ProtoWriter(TypeResolver* type_resolver, const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener);
- virtual ~ProtoWriter();
-
- // ObjectWriter methods.
- virtual ProtoWriter* StartObject(StringPiece name);
- virtual ProtoWriter* EndObject();
- virtual ProtoWriter* StartList(StringPiece name);
- virtual ProtoWriter* EndList();
- virtual ProtoWriter* RenderBool(StringPiece name, bool value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderInt32(StringPiece name, int32 value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderUint32(StringPiece name, uint32 value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderInt64(StringPiece name, int64 value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderUint64(StringPiece name, uint64 value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderDouble(StringPiece name, double value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderFloat(StringPiece name, float value) {
- return RenderDataPiece(name, DataPiece(value));
- }
- virtual ProtoWriter* RenderString(StringPiece name, StringPiece value) {
- return RenderDataPiece(name,
- DataPiece(value, use_strict_base64_decoding()));
- }
- virtual ProtoWriter* RenderBytes(StringPiece name, StringPiece value) {
- return RenderDataPiece(
- name, DataPiece(value, false, use_strict_base64_decoding()));
- }
- virtual ProtoWriter* RenderNull(StringPiece name) {
- return RenderDataPiece(name, DataPiece::NullData());
- }
-
-
- // Renders a DataPiece 'value' into a field whose wire type is determined
- // from the given field 'name'.
- virtual ProtoWriter* RenderDataPiece(StringPiece name,
- const DataPiece& value);
-
- // Returns the location tracker to use for tracking locations for errors.
- const LocationTrackerInterface& location() {
- return element_ != NULL ? *element_ : *tracker_;
- }
-
- // When true, we finished writing to output a complete message.
- bool done() { return done_; }
-
- // Returns the proto stream object.
- google::protobuf::io::CodedOutputStream* stream() { return stream_.get(); }
-
- // Getters and mutators of invalid_depth_.
- void IncrementInvalidDepth() { ++invalid_depth_; }
- void DecrementInvalidDepth() { --invalid_depth_; }
- int invalid_depth() { return invalid_depth_; }
-
- ErrorListener* listener() { return listener_; }
-
- const TypeInfo* typeinfo() { return typeinfo_; }
-
- void set_ignore_unknown_fields(bool ignore_unknown_fields) {
- ignore_unknown_fields_ = ignore_unknown_fields;
- }
-
- void set_use_lower_camel_for_enums(bool use_lower_camel_for_enums) {
- use_lower_camel_for_enums_ = use_lower_camel_for_enums;
- }
-
- protected:
- class LIBPROTOBUF_EXPORT ProtoElement : public BaseElement, public LocationTrackerInterface {
- public:
- // Constructor for the root element. No parent nor field.
- ProtoElement(const TypeInfo* typeinfo, const google::protobuf::Type& type,
- ProtoWriter* enclosing);
-
- // Constructor for a field of an element.
- ProtoElement(ProtoElement* parent, const google::protobuf::Field* field,
- const google::protobuf::Type& type, bool is_list);
-
- virtual ~ProtoElement() {}
-
- // Called just before the destructor for clean up:
- // - reports any missing required fields
- // - computes the space needed by the size field, and augment the
- // length of all parent messages by this additional space.
- // - releases and returns the parent pointer.
- ProtoElement* pop();
-
- // Accessors
- // parent_field() may be NULL if we are at root.
- const google::protobuf::Field* parent_field() const {
- return parent_field_;
- }
- const google::protobuf::Type& type() const { return type_; }
-
- // Registers field for accounting required fields.
- void RegisterField(const google::protobuf::Field* field);
-
- // To report location on error messages.
- virtual string ToString() const;
-
- virtual ProtoElement* parent() const {
- return static_cast<ProtoElement*>(BaseElement::parent());
- }
-
- // Returns true if the index is already taken by a preceding oneof input.
- bool IsOneofIndexTaken(int32 index);
-
- // Marks the oneof 'index' as taken. Future inputs to this oneof will
- // generate an error.
- void TakeOneofIndex(int32 index);
-
- bool proto3() { return proto3_; }
-
- private:
- // Used for access to variables of the enclosing instance of
- // ProtoWriter.
- ProtoWriter* ow_;
-
- // Describes the element as a field in the parent message.
- // parent_field_ is NULL if and only if this element is the root element.
- const google::protobuf::Field* parent_field_;
-
- // TypeInfo to lookup types.
- const TypeInfo* typeinfo_;
-
- // Whether the type_ is proto3 or not.
- bool proto3_;
-
- // Additional variables if this element is a message:
- // (Root element is always a message).
- // type_ : the type of this element.
- // required_fields_ : set of required fields.
- // size_index_ : index into ProtoWriter::size_insert_
- // for later insertion of serialized message length.
- const google::protobuf::Type& type_;
- std::set<const google::protobuf::Field*> required_fields_;
- const int size_index_;
-
- // Tracks position in repeated fields, needed for LocationTrackerInterface.
- int array_index_;
-
- // Set of oneof indices already seen for the type_. Used to validate
- // incoming messages so no more than one oneof is set.
- std::vector<bool> oneof_indices_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoElement);
- };
-
- // Container for inserting 'size' information at the 'pos' position.
- struct SizeInfo {
- const int pos;
- int size;
- };
-
- ProtoWriter(const TypeInfo* typeinfo, const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener);
-
- virtual ProtoElement* element() { return element_.get(); }
-
- // Helper methods for calling ErrorListener. See error_listener.h.
- void InvalidName(StringPiece unknown_name, StringPiece message);
- void InvalidValue(StringPiece type_name, StringPiece value);
- void MissingField(StringPiece missing_name);
-
- // Common code for BeginObject() and BeginList() that does invalid_depth_
- // bookkeeping associated with name lookup.
- const google::protobuf::Field* BeginNamed(StringPiece name, bool is_list);
-
- // Lookup the field in the current element. Looks in the base descriptor
- // and in any extension. This will report an error if the field cannot be
- // found when ignore_unknown_names_ is false or if multiple matching
- // extensions are found.
- const google::protobuf::Field* Lookup(StringPiece name);
-
- // Lookup the field type in the type descriptor. Returns NULL if the type
- // is not known.
- const google::protobuf::Type* LookupType(
- const google::protobuf::Field* field);
-
- // Write serialized output to the final output ByteSink, inserting all
- // the size information for nested messages that are missing from the
- // intermediate Cord buffer.
- void WriteRootMessage();
-
- // Helper method to write proto tags based on the given field.
- void WriteTag(const google::protobuf::Field& field);
-
-
- // Returns true if the field for type_ can be set as a oneof. If field is not
- // a oneof type, this function does nothing and returns true.
- // If another field for this oneof is already set, this function returns
- // false. It also calls the appropriate error callback.
- // unnormalized_name is used for error string.
- bool ValidOneof(const google::protobuf::Field& field,
- StringPiece unnormalized_name);
-
- // Returns true if the field is repeated.
- bool IsRepeated(const google::protobuf::Field& field);
-
- // Starts an object given the field and the enclosing type.
- ProtoWriter* StartObjectField(const google::protobuf::Field& field,
- const google::protobuf::Type& type);
-
- // Starts a list given the field and the enclosing type.
- ProtoWriter* StartListField(const google::protobuf::Field& field,
- const google::protobuf::Type& type);
-
- // Renders a primitve field given the field and the enclosing type.
- ProtoWriter* RenderPrimitiveField(const google::protobuf::Field& field,
- const google::protobuf::Type& type,
- const DataPiece& value);
-
- private:
- // Variables for describing the structure of the input tree:
- // master_type_: descriptor for the whole protobuf message.
- // typeinfo_ : the TypeInfo object to lookup types.
- const google::protobuf::Type& master_type_;
- const TypeInfo* typeinfo_;
- // Whether we own the typeinfo_ object.
- bool own_typeinfo_;
-
- // Indicates whether we finished writing root message completely.
- bool done_;
-
- // If true, don't report unknown field names to the listener.
- bool ignore_unknown_fields_;
-
- // If true, check if enum name in camel case or without underscore matches the
- // field name.
- bool use_lower_camel_for_enums_;
-
- // Variable for internal state processing:
- // element_ : the current element.
- // size_insert_: sizes of nested messages.
- // pos - position to insert the size field.
- // size - size value to be inserted.
- google::protobuf::scoped_ptr<ProtoElement> element_;
- std::deque<SizeInfo> size_insert_;
-
- // Variables for output generation:
- // output_ : pointer to an external ByteSink for final user-visible output.
- // buffer_ : buffer holding partial message before being ready for output_.
- // adapter_ : internal adapter between CodedOutputStream and buffer_.
- // stream_ : wrapper for writing tags and other encodings in wire format.
- strings::ByteSink* output_;
- string buffer_;
- google::protobuf::io::StringOutputStream adapter_;
- google::protobuf::scoped_ptr<google::protobuf::io::CodedOutputStream> stream_;
-
- // Variables for error tracking and reporting:
- // listener_ : a place to report any errors found.
- // invalid_depth_: number of enclosing invalid nested messages.
- // tracker_ : the root location tracker interface.
- ErrorListener* listener_;
- int invalid_depth_;
- google::protobuf::scoped_ptr<LocationTrackerInterface> tracker_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTO_WRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc
deleted file mode 100644
index 3591febfc3..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.cc
+++ /dev/null
@@ -1,1123 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-
-#include <utility>
-
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/util/internal/field_mask_utility.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/status_macros.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-using util::Status;
-using util::StatusOr;
-namespace error {
-using util::error::Code;
-using util::error::INTERNAL;
-}
-namespace converter {
-
-using google::protobuf::Descriptor;
-using google::protobuf::EnumValueDescriptor;
-using google::protobuf::FieldDescriptor;
-using google::protobuf::internal::WireFormat;
-using google::protobuf::internal::WireFormatLite;
-using util::Status;
-using util::StatusOr;
-
-namespace {
-
-static int kDefaultMaxRecursionDepth = 64;
-
-// Finds a field with the given number. NULL if none found.
-const google::protobuf::Field* FindFieldByNumber(
- const google::protobuf::Type& type, int number);
-
-// Returns true if the field is packable.
-bool IsPackable(const google::protobuf::Field& field);
-
-// Finds an enum value with the given number. NULL if none found.
-const google::protobuf::EnumValue* FindEnumValueByNumber(
- const google::protobuf::Enum& tech_enum, int number);
-
-// Utility function to format nanos.
-const string FormatNanos(uint32 nanos, bool with_trailing_zeros);
-
-StatusOr<string> MapKeyDefaultValueAsString(
- const google::protobuf::Field& field) {
- switch (field.kind()) {
- case google::protobuf::Field_Kind_TYPE_BOOL:
- return string("false");
- case google::protobuf::Field_Kind_TYPE_INT32:
- case google::protobuf::Field_Kind_TYPE_INT64:
- case google::protobuf::Field_Kind_TYPE_UINT32:
- case google::protobuf::Field_Kind_TYPE_UINT64:
- case google::protobuf::Field_Kind_TYPE_SINT32:
- case google::protobuf::Field_Kind_TYPE_SINT64:
- case google::protobuf::Field_Kind_TYPE_SFIXED32:
- case google::protobuf::Field_Kind_TYPE_SFIXED64:
- case google::protobuf::Field_Kind_TYPE_FIXED32:
- case google::protobuf::Field_Kind_TYPE_FIXED64:
- return string("0");
- case google::protobuf::Field_Kind_TYPE_STRING:
- return string();
- default:
- return Status(util::error::INTERNAL, "Invalid map key type.");
- }
-}
-} // namespace
-
-
-ProtoStreamObjectSource::ProtoStreamObjectSource(
- google::protobuf::io::CodedInputStream* stream, TypeResolver* type_resolver,
- const google::protobuf::Type& type)
- : stream_(stream),
- typeinfo_(TypeInfo::NewTypeInfo(type_resolver)),
- own_typeinfo_(true),
- type_(type),
- use_lower_camel_for_enums_(false),
- recursion_depth_(0),
- max_recursion_depth_(kDefaultMaxRecursionDepth),
- render_unknown_fields_(false),
- add_trailing_zeros_for_timestamp_and_duration_(false) {
- GOOGLE_LOG_IF(DFATAL, stream == NULL) << "Input stream is NULL.";
-}
-
-ProtoStreamObjectSource::ProtoStreamObjectSource(
- google::protobuf::io::CodedInputStream* stream, const TypeInfo* typeinfo,
- const google::protobuf::Type& type)
- : stream_(stream),
- typeinfo_(typeinfo),
- own_typeinfo_(false),
- type_(type),
- use_lower_camel_for_enums_(false),
- recursion_depth_(0),
- max_recursion_depth_(kDefaultMaxRecursionDepth),
- render_unknown_fields_(false),
- add_trailing_zeros_for_timestamp_and_duration_(false) {
- GOOGLE_LOG_IF(DFATAL, stream == NULL) << "Input stream is NULL.";
-}
-
-ProtoStreamObjectSource::~ProtoStreamObjectSource() {
- if (own_typeinfo_) {
- delete typeinfo_;
- }
-}
-
-Status ProtoStreamObjectSource::NamedWriteTo(StringPiece name,
- ObjectWriter* ow) const {
- return WriteMessage(type_, name, 0, true, ow);
-}
-
-const google::protobuf::Field* ProtoStreamObjectSource::FindAndVerifyField(
- const google::protobuf::Type& type, uint32 tag) const {
- // Lookup the new field in the type by tag number.
- const google::protobuf::Field* field = FindFieldByNumber(type, tag >> 3);
- // Verify if the field corresponds to the wire type in tag.
- // If there is any discrepancy, mark the field as not found.
- if (field != NULL) {
- WireFormatLite::WireType expected_type =
- WireFormatLite::WireTypeForFieldType(
- static_cast<WireFormatLite::FieldType>(field->kind()));
- WireFormatLite::WireType actual_type = WireFormatLite::GetTagWireType(tag);
- if (actual_type != expected_type &&
- (!IsPackable(*field) ||
- actual_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED)) {
- field = NULL;
- }
- }
- return field;
-}
-
-Status ProtoStreamObjectSource::WriteMessage(const google::protobuf::Type& type,
- StringPiece name,
- const uint32 end_tag,
- bool include_start_and_end,
- ObjectWriter* ow) const {
-
- const TypeRenderer* type_renderer = FindTypeRenderer(type.name());
- if (type_renderer != NULL) {
- return (*type_renderer)(this, type, name, ow);
- }
-
- const google::protobuf::Field* field = NULL;
- string field_name;
- // last_tag set to dummy value that is different from tag.
- uint32 tag = stream_->ReadTag(), last_tag = tag + 1;
- google::protobuf::UnknownFieldSet unknown_fields;
-
- if (include_start_and_end) {
- ow->StartObject(name);
- }
- while (tag != end_tag) {
- if (tag != last_tag) { // Update field only if tag is changed.
- last_tag = tag;
- field = FindAndVerifyField(type, tag);
- if (field != NULL) {
- field_name = field->json_name();
- }
- }
- if (field == NULL) {
- // If we didn't find a field, skip this unknown tag.
- // TODO(wpoon): Check return boolean value.
- WireFormat::SkipField(stream_, tag,
- render_unknown_fields_ ? &unknown_fields : NULL);
- tag = stream_->ReadTag();
- continue;
- }
-
- if (field->cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED) {
- bool check_maps = true;
-
- if (check_maps && IsMap(*field)) {
- ow->StartObject(field_name);
- ASSIGN_OR_RETURN(tag, RenderMap(field, field_name, tag, ow));
- ow->EndObject();
- } else {
- ASSIGN_OR_RETURN(tag, RenderList(field, field_name, tag, ow));
- }
- } else {
- // Render the field.
- RETURN_IF_ERROR(RenderField(field, field_name, ow));
- tag = stream_->ReadTag();
- }
- }
-
-
- if (include_start_and_end) {
- ow->EndObject();
- }
- return Status::OK;
-}
-
-StatusOr<uint32> ProtoStreamObjectSource::RenderList(
- const google::protobuf::Field* field, StringPiece name, uint32 list_tag,
- ObjectWriter* ow) const {
- uint32 tag_to_return = 0;
- ow->StartList(name);
- if (IsPackable(*field) &&
- list_tag ==
- WireFormatLite::MakeTag(field->number(),
- WireFormatLite::WIRETYPE_LENGTH_DELIMITED)) {
- RETURN_IF_ERROR(RenderPacked(field, ow));
- // Since packed fields have a single tag, read another tag from stream to
- // return.
- tag_to_return = stream_->ReadTag();
- } else {
- do {
- RETURN_IF_ERROR(RenderField(field, "", ow));
- } while ((tag_to_return = stream_->ReadTag()) == list_tag);
- }
- ow->EndList();
- return tag_to_return;
-}
-
-StatusOr<uint32> ProtoStreamObjectSource::RenderMap(
- const google::protobuf::Field* field, StringPiece name, uint32 list_tag,
- ObjectWriter* ow) const {
- const google::protobuf::Type* field_type =
- typeinfo_->GetTypeByTypeUrl(field->type_url());
- uint32 tag_to_return = 0;
- do {
- // Render map entry message type.
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32); // message length
- int old_limit = stream_->PushLimit(buffer32);
- string map_key;
- for (uint32 tag = stream_->ReadTag(); tag != 0; tag = stream_->ReadTag()) {
- const google::protobuf::Field* field =
- FindAndVerifyField(*field_type, tag);
- if (field == NULL) {
- WireFormat::SkipField(stream_, tag, NULL);
- continue;
- }
- // Map field numbers are key = 1 and value = 2
- if (field->number() == 1) {
- map_key = ReadFieldValueAsString(*field);
- } else if (field->number() == 2) {
- if (map_key.empty()) {
- // An absent map key is treated as the default.
- const google::protobuf::Field* key_field =
- FindFieldByNumber(*field_type, 1);
- if (key_field == NULL) {
- // The Type info for this map entry is incorrect. It should always
- // have a field named "key" and with field number 1.
- return Status(util::error::INTERNAL, "Invalid map entry.");
- }
- ASSIGN_OR_RETURN(map_key, MapKeyDefaultValueAsString(*key_field));
- // Key is empty, force it to render as empty (for string values).
- ow->empty_name_ok_for_next_key();
- }
- RETURN_IF_ERROR(RenderField(field, map_key, ow));
- } else {
- // The Type info for this map entry is incorrect. It should contain
- // exactly two fields with field number 1 and 2.
- return Status(util::error::INTERNAL, "Invalid map entry.");
- }
- }
- stream_->PopLimit(old_limit);
- } while ((tag_to_return = stream_->ReadTag()) == list_tag);
- return tag_to_return;
-}
-
-Status ProtoStreamObjectSource::RenderPacked(
- const google::protobuf::Field* field, ObjectWriter* ow) const {
- uint32 length;
- stream_->ReadVarint32(&length);
- int old_limit = stream_->PushLimit(length);
- while (stream_->BytesUntilLimit() > 0) {
- RETURN_IF_ERROR(RenderField(field, StringPiece(), ow));
- }
- stream_->PopLimit(old_limit);
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderTimestamp(
- const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
- std::pair<int64, int32> p = os->ReadSecondsAndNanos(type);
- int64 seconds = p.first;
- int32 nanos = p.second;
- if (seconds > kTimestampMaxSeconds || seconds < kTimestampMinSeconds) {
- return Status(
- util::error::INTERNAL,
- StrCat("Timestamp seconds exceeds limit for field: ", field_name));
- }
-
- if (nanos < 0 || nanos >= kNanosPerSecond) {
- return Status(
- util::error::INTERNAL,
- StrCat("Timestamp nanos exceeds limit for field: ", field_name));
- }
-
- ow->RenderString(field_name,
- ::google::protobuf::internal::FormatTime(seconds, nanos));
-
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderDuration(
- const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
- std::pair<int64, int32> p = os->ReadSecondsAndNanos(type);
- int64 seconds = p.first;
- int32 nanos = p.second;
- if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds) {
- return Status(
- util::error::INTERNAL,
- StrCat("Duration seconds exceeds limit for field: ", field_name));
- }
-
- if (nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) {
- return Status(
- util::error::INTERNAL,
- StrCat("Duration nanos exceeds limit for field: ", field_name));
- }
-
- string sign = "";
- if (seconds < 0) {
- if (nanos > 0) {
- return Status(util::error::INTERNAL,
- StrCat("Duration nanos is non-negative, but seconds is "
- "negative for field: ",
- field_name));
- }
- sign = "-";
- seconds = -seconds;
- nanos = -nanos;
- } else if (seconds == 0 && nanos < 0) {
- sign = "-";
- nanos = -nanos;
- }
- string formatted_duration = StringPrintf(
- "%s%lld%ss", sign.c_str(), seconds,
- FormatNanos(nanos, os->add_trailing_zeros_for_timestamp_and_duration_)
- .c_str());
- ow->RenderString(field_name, formatted_duration);
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderDouble(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint64 buffer64 = 0; // default value of Double wrapper value
- if (tag != 0) {
- os->stream_->ReadLittleEndian64(&buffer64);
- os->stream_->ReadTag();
- }
- ow->RenderDouble(field_name, bit_cast<double>(buffer64));
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderFloat(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint32 buffer32 = 0; // default value of Float wrapper value
- if (tag != 0) {
- os->stream_->ReadLittleEndian32(&buffer32);
- os->stream_->ReadTag();
- }
- ow->RenderFloat(field_name, bit_cast<float>(buffer32));
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderInt64(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint64 buffer64 = 0; // default value of Int64 wrapper value
- if (tag != 0) {
- os->stream_->ReadVarint64(&buffer64);
- os->stream_->ReadTag();
- }
- ow->RenderInt64(field_name, bit_cast<int64>(buffer64));
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderUInt64(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint64 buffer64 = 0; // default value of UInt64 wrapper value
- if (tag != 0) {
- os->stream_->ReadVarint64(&buffer64);
- os->stream_->ReadTag();
- }
- ow->RenderUint64(field_name, bit_cast<uint64>(buffer64));
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderInt32(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint32 buffer32 = 0; // default value of Int32 wrapper value
- if (tag != 0) {
- os->stream_->ReadVarint32(&buffer32);
- os->stream_->ReadTag();
- }
- ow->RenderInt32(field_name, bit_cast<int32>(buffer32));
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderUInt32(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint32 buffer32 = 0; // default value of UInt32 wrapper value
- if (tag != 0) {
- os->stream_->ReadVarint32(&buffer32);
- os->stream_->ReadTag();
- }
- ow->RenderUint32(field_name, bit_cast<uint32>(buffer32));
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderBool(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint64 buffer64 = 0; // results in 'false' value as default, which is the
- // default value of Bool wrapper
- if (tag != 0) {
- os->stream_->ReadVarint64(&buffer64);
- os->stream_->ReadTag();
- }
- ow->RenderBool(field_name, buffer64 != 0);
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderString(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint32 buffer32;
- string str; // default value of empty for String wrapper
- if (tag != 0) {
- os->stream_->ReadVarint32(&buffer32); // string size.
- os->stream_->ReadString(&str, buffer32);
- os->stream_->ReadTag();
- }
- ow->RenderString(field_name, str);
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderBytes(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
- uint32 buffer32;
- string str;
- if (tag != 0) {
- os->stream_->ReadVarint32(&buffer32);
- os->stream_->ReadString(&str, buffer32);
- os->stream_->ReadTag();
- }
- ow->RenderBytes(field_name, str);
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderStruct(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- const google::protobuf::Field* field = NULL;
- uint32 tag = os->stream_->ReadTag();
- ow->StartObject(field_name);
- while (tag != 0) {
- field = os->FindAndVerifyField(type, tag);
- // google.protobuf.Struct has only one field that is a map. Hence we use
- // RenderMap to render that field.
- if (os->IsMap(*field)) {
- ASSIGN_OR_RETURN(tag, os->RenderMap(field, field_name, tag, ow));
- }
- }
- ow->EndObject();
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderStructValue(
- const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
- const google::protobuf::Field* field = NULL;
- for (uint32 tag = os->stream_->ReadTag(); tag != 0;
- tag = os->stream_->ReadTag()) {
- field = os->FindAndVerifyField(type, tag);
- if (field == NULL) {
- WireFormat::SkipField(os->stream_, tag, NULL);
- continue;
- }
- RETURN_IF_ERROR(os->RenderField(field, field_name, ow));
- }
- return Status::OK;
-}
-
-// TODO(skarvaje): Avoid code duplication of for loops and SkipField logic.
-Status ProtoStreamObjectSource::RenderStructListValue(
- const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
- uint32 tag = os->stream_->ReadTag();
-
- // Render empty list when we find empty ListValue message.
- if (tag == 0) {
- ow->StartList(field_name);
- ow->EndList();
- return Status::OK;
- }
-
- while (tag != 0) {
- const google::protobuf::Field* field = os->FindAndVerifyField(type, tag);
- if (field == NULL) {
- WireFormat::SkipField(os->stream_, tag, NULL);
- tag = os->stream_->ReadTag();
- continue;
- }
- ASSIGN_OR_RETURN(tag, os->RenderList(field, field_name, tag, ow));
- }
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderAny(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece field_name,
- ObjectWriter* ow) {
- // An Any is of the form { string type_url = 1; bytes value = 2; }
- uint32 tag;
- string type_url;
- string value;
-
- // First read out the type_url and value from the proto stream
- for (tag = os->stream_->ReadTag(); tag != 0; tag = os->stream_->ReadTag()) {
- const google::protobuf::Field* field = os->FindAndVerifyField(type, tag);
- if (field == NULL) {
- WireFormat::SkipField(os->stream_, tag, NULL);
- continue;
- }
- // 'type_url' has field number of 1 and 'value' has field number 2
- // //google/protobuf/any.proto
- if (field->number() == 1) {
- // read type_url
- uint32 type_url_size;
- os->stream_->ReadVarint32(&type_url_size);
- os->stream_->ReadString(&type_url, type_url_size);
- } else if (field->number() == 2) {
- // read value
- uint32 value_size;
- os->stream_->ReadVarint32(&value_size);
- os->stream_->ReadString(&value, value_size);
- }
- }
-
- // If there is no value, we don't lookup the type, we just output it (if
- // present). If both type and value are empty we output an empty object.
- if (value.empty()) {
- ow->StartObject(field_name);
- if (!type_url.empty()) {
- ow->RenderString("@type", type_url);
- }
- ow->EndObject();
- return util::Status::OK;
- }
-
- // If there is a value but no type, we cannot render it, so report an error.
- if (type_url.empty()) {
- // TODO(sven): Add an external message once those are ready.
- return util::Status(util::error::INTERNAL,
- "Invalid Any, the type_url is missing.");
- }
-
- util::StatusOr<const google::protobuf::Type*> resolved_type =
- os->typeinfo_->ResolveTypeUrl(type_url);
-
- if (!resolved_type.ok()) {
- // Convert into an internal error, since this means the backend gave us
- // an invalid response (missing or invalid type information).
- return util::Status(util::error::INTERNAL,
- resolved_type.status().error_message());
- }
- // nested_type cannot be null at this time.
- const google::protobuf::Type* nested_type = resolved_type.ValueOrDie();
-
- google::protobuf::io::ArrayInputStream zero_copy_stream(value.data(), value.size());
- google::protobuf::io::CodedInputStream in_stream(&zero_copy_stream);
- // We know the type so we can render it. Recursively parse the nested stream
- // using a nested ProtoStreamObjectSource using our nested type information.
- ProtoStreamObjectSource nested_os(&in_stream, os->typeinfo_, *nested_type);
-
- // We manually call start and end object here so we can inject the @type.
- ow->StartObject(field_name);
- ow->RenderString("@type", type_url);
- util::Status result =
- nested_os.WriteMessage(nested_os.type_, "value", 0, false, ow);
- ow->EndObject();
- return result;
-}
-
-Status ProtoStreamObjectSource::RenderFieldMask(
- const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
- string combined;
- uint32 buffer32;
- uint32 paths_field_tag = 0;
- for (uint32 tag = os->stream_->ReadTag(); tag != 0;
- tag = os->stream_->ReadTag()) {
- if (paths_field_tag == 0) {
- const google::protobuf::Field* field = os->FindAndVerifyField(type, tag);
- if (field != NULL && field->number() == 1 &&
- field->name() == "paths") {
- paths_field_tag = tag;
- }
- }
- if (paths_field_tag != tag) {
- return util::Status(util::error::INTERNAL,
- "Invalid FieldMask, unexpected field.");
- }
- string str;
- os->stream_->ReadVarint32(&buffer32); // string size.
- os->stream_->ReadString(&str, buffer32);
- if (!combined.empty()) {
- combined.append(",");
- }
- combined.append(ConvertFieldMaskPath(str, &ToCamelCase));
- }
- ow->RenderString(field_name, combined);
- return Status::OK;
-}
-
-
-hash_map<string, ProtoStreamObjectSource::TypeRenderer>*
- ProtoStreamObjectSource::renderers_ = NULL;
-GOOGLE_PROTOBUF_DECLARE_ONCE(source_renderers_init_);
-
-void ProtoStreamObjectSource::InitRendererMap() {
- renderers_ = new hash_map<string, ProtoStreamObjectSource::TypeRenderer>();
- (*renderers_)["google.protobuf.Timestamp"] =
- &ProtoStreamObjectSource::RenderTimestamp;
- (*renderers_)["google.protobuf.Duration"] =
- &ProtoStreamObjectSource::RenderDuration;
- (*renderers_)["google.protobuf.DoubleValue"] =
- &ProtoStreamObjectSource::RenderDouble;
- (*renderers_)["google.protobuf.FloatValue"] =
- &ProtoStreamObjectSource::RenderFloat;
- (*renderers_)["google.protobuf.Int64Value"] =
- &ProtoStreamObjectSource::RenderInt64;
- (*renderers_)["google.protobuf.UInt64Value"] =
- &ProtoStreamObjectSource::RenderUInt64;
- (*renderers_)["google.protobuf.Int32Value"] =
- &ProtoStreamObjectSource::RenderInt32;
- (*renderers_)["google.protobuf.UInt32Value"] =
- &ProtoStreamObjectSource::RenderUInt32;
- (*renderers_)["google.protobuf.BoolValue"] =
- &ProtoStreamObjectSource::RenderBool;
- (*renderers_)["google.protobuf.StringValue"] =
- &ProtoStreamObjectSource::RenderString;
- (*renderers_)["google.protobuf.BytesValue"] =
- &ProtoStreamObjectSource::RenderBytes;
- (*renderers_)["google.protobuf.Any"] = &ProtoStreamObjectSource::RenderAny;
- (*renderers_)["google.protobuf.Struct"] =
- &ProtoStreamObjectSource::RenderStruct;
- (*renderers_)["google.protobuf.Value"] =
- &ProtoStreamObjectSource::RenderStructValue;
- (*renderers_)["google.protobuf.ListValue"] =
- &ProtoStreamObjectSource::RenderStructListValue;
- (*renderers_)["google.protobuf.FieldMask"] =
- &ProtoStreamObjectSource::RenderFieldMask;
- ::google::protobuf::internal::OnShutdown(&DeleteRendererMap);
-}
-
-void ProtoStreamObjectSource::DeleteRendererMap() {
- delete ProtoStreamObjectSource::renderers_;
- renderers_ = NULL;
-}
-
-// static
-ProtoStreamObjectSource::TypeRenderer*
-ProtoStreamObjectSource::FindTypeRenderer(const string& type_url) {
- ::google::protobuf::GoogleOnceInit(&source_renderers_init_, &InitRendererMap);
- return FindOrNull(*renderers_, type_url);
-}
-
-Status ProtoStreamObjectSource::RenderField(
- const google::protobuf::Field* field, StringPiece field_name,
- ObjectWriter* ow) const {
- // Short-circuit message types as it tends to call WriteMessage recursively
- // and ends up using a lot of stack space. Keep the stack usage of this
- // message small in order to preserve stack space and not crash.
- if (field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE) {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32); // message length
- int old_limit = stream_->PushLimit(buffer32);
- // Get the nested message type for this field.
- const google::protobuf::Type* type =
- typeinfo_->GetTypeByTypeUrl(field->type_url());
- if (type == NULL) {
- return Status(util::error::INTERNAL,
- StrCat("Invalid configuration. Could not find the type: ",
- field->type_url()));
- }
-
- // Short-circuit any special type rendering to save call-stack space.
- const TypeRenderer* type_renderer = FindTypeRenderer(type->name());
-
- bool use_type_renderer = type_renderer != NULL;
-
- if (use_type_renderer) {
- RETURN_IF_ERROR((*type_renderer)(this, *type, field_name, ow));
- } else {
- RETURN_IF_ERROR(IncrementRecursionDepth(type->name(), field_name));
- RETURN_IF_ERROR(WriteMessage(*type, field_name, 0, true, ow));
- --recursion_depth_;
- }
- if (!stream_->ConsumedEntireMessage()) {
- return Status(util::error::INVALID_ARGUMENT,
- "Nested protocol message not parsed in its entirety.");
- }
- stream_->PopLimit(old_limit);
- } else {
- // Render all other non-message types.
- return RenderNonMessageField(field, field_name, ow);
- }
- return Status::OK;
-}
-
-Status ProtoStreamObjectSource::RenderNonMessageField(
- const google::protobuf::Field* field, StringPiece field_name,
- ObjectWriter* ow) const {
- // Temporary buffers of different types.
- uint32 buffer32;
- uint64 buffer64;
- string strbuffer;
- switch (field->kind()) {
- case google::protobuf::Field_Kind_TYPE_BOOL: {
- stream_->ReadVarint64(&buffer64);
- ow->RenderBool(field_name, buffer64 != 0);
- break;
- }
- case google::protobuf::Field_Kind_TYPE_INT32: {
- stream_->ReadVarint32(&buffer32);
- ow->RenderInt32(field_name, bit_cast<int32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_INT64: {
- stream_->ReadVarint64(&buffer64);
- ow->RenderInt64(field_name, bit_cast<int64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_UINT32: {
- stream_->ReadVarint32(&buffer32);
- ow->RenderUint32(field_name, bit_cast<uint32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_UINT64: {
- stream_->ReadVarint64(&buffer64);
- ow->RenderUint64(field_name, bit_cast<uint64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SINT32: {
- stream_->ReadVarint32(&buffer32);
- ow->RenderInt32(field_name, WireFormatLite::ZigZagDecode32(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SINT64: {
- stream_->ReadVarint64(&buffer64);
- ow->RenderInt64(field_name, WireFormatLite::ZigZagDecode64(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SFIXED32: {
- stream_->ReadLittleEndian32(&buffer32);
- ow->RenderInt32(field_name, bit_cast<int32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SFIXED64: {
- stream_->ReadLittleEndian64(&buffer64);
- ow->RenderInt64(field_name, bit_cast<int64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FIXED32: {
- stream_->ReadLittleEndian32(&buffer32);
- ow->RenderUint32(field_name, bit_cast<uint32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FIXED64: {
- stream_->ReadLittleEndian64(&buffer64);
- ow->RenderUint64(field_name, bit_cast<uint64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FLOAT: {
- stream_->ReadLittleEndian32(&buffer32);
- ow->RenderFloat(field_name, bit_cast<float>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_DOUBLE: {
- stream_->ReadLittleEndian64(&buffer64);
- ow->RenderDouble(field_name, bit_cast<double>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_ENUM: {
- stream_->ReadVarint32(&buffer32);
-
- // If the field represents an explicit NULL value, render null.
- if (field->type_url() == kStructNullValueTypeUrl) {
- ow->RenderNull(field_name);
- break;
- }
-
- // Get the nested enum type for this field.
- // TODO(skarvaje): Avoid string manipulation. Find ways to speed this
- // up.
- const google::protobuf::Enum* en =
- typeinfo_->GetEnumByTypeUrl(field->type_url());
- // Lookup the name of the enum, and render that. Unknown enum values
- // are printed as integers.
- if (en != NULL) {
- const google::protobuf::EnumValue* enum_value =
- FindEnumValueByNumber(*en, buffer32);
- if (enum_value != NULL) {
- if (use_lower_camel_for_enums_)
- ow->RenderString(field_name, ToCamelCase(enum_value->name()));
- else
- ow->RenderString(field_name, enum_value->name());
- } else {
- ow->RenderInt32(field_name, buffer32);
- }
- } else {
- ow->RenderInt32(field_name, buffer32);
- }
- break;
- }
- case google::protobuf::Field_Kind_TYPE_STRING: {
- stream_->ReadVarint32(&buffer32); // string size.
- stream_->ReadString(&strbuffer, buffer32);
- ow->RenderString(field_name, strbuffer);
- break;
- }
- case google::protobuf::Field_Kind_TYPE_BYTES: {
- stream_->ReadVarint32(&buffer32); // bytes size.
- stream_->ReadString(&strbuffer, buffer32);
- ow->RenderBytes(field_name, strbuffer);
- break;
- }
- default:
- break;
- }
- return Status::OK;
-}
-
-// TODO(skarvaje): Fix this to avoid code duplication.
-const string ProtoStreamObjectSource::ReadFieldValueAsString(
- const google::protobuf::Field& field) const {
- string result;
- switch (field.kind()) {
- case google::protobuf::Field_Kind_TYPE_BOOL: {
- uint64 buffer64;
- stream_->ReadVarint64(&buffer64);
- result = buffer64 != 0 ? "true" : "false";
- break;
- }
- case google::protobuf::Field_Kind_TYPE_INT32: {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32);
- result = SimpleItoa(bit_cast<int32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_INT64: {
- uint64 buffer64;
- stream_->ReadVarint64(&buffer64);
- result = SimpleItoa(bit_cast<int64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_UINT32: {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32);
- result = SimpleItoa(bit_cast<uint32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_UINT64: {
- uint64 buffer64;
- stream_->ReadVarint64(&buffer64);
- result = SimpleItoa(bit_cast<uint64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SINT32: {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32);
- result = SimpleItoa(WireFormatLite::ZigZagDecode32(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SINT64: {
- uint64 buffer64;
- stream_->ReadVarint64(&buffer64);
- result = SimpleItoa(WireFormatLite::ZigZagDecode64(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SFIXED32: {
- uint32 buffer32;
- stream_->ReadLittleEndian32(&buffer32);
- result = SimpleItoa(bit_cast<int32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_SFIXED64: {
- uint64 buffer64;
- stream_->ReadLittleEndian64(&buffer64);
- result = SimpleItoa(bit_cast<int64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FIXED32: {
- uint32 buffer32;
- stream_->ReadLittleEndian32(&buffer32);
- result = SimpleItoa(bit_cast<uint32>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FIXED64: {
- uint64 buffer64;
- stream_->ReadLittleEndian64(&buffer64);
- result = SimpleItoa(bit_cast<uint64>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_FLOAT: {
- uint32 buffer32;
- stream_->ReadLittleEndian32(&buffer32);
- result = SimpleFtoa(bit_cast<float>(buffer32));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_DOUBLE: {
- uint64 buffer64;
- stream_->ReadLittleEndian64(&buffer64);
- result = SimpleDtoa(bit_cast<double>(buffer64));
- break;
- }
- case google::protobuf::Field_Kind_TYPE_ENUM: {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32);
- // Get the nested enum type for this field.
- // TODO(skarvaje): Avoid string manipulation. Find ways to speed this
- // up.
- const google::protobuf::Enum* en =
- typeinfo_->GetEnumByTypeUrl(field.type_url());
- // Lookup the name of the enum, and render that. Skips unknown enums.
- if (en != NULL) {
- const google::protobuf::EnumValue* enum_value =
- FindEnumValueByNumber(*en, buffer32);
- if (enum_value != NULL) {
- result = enum_value->name();
- }
- }
- break;
- }
- case google::protobuf::Field_Kind_TYPE_STRING: {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32); // string size.
- stream_->ReadString(&result, buffer32);
- break;
- }
- case google::protobuf::Field_Kind_TYPE_BYTES: {
- uint32 buffer32;
- stream_->ReadVarint32(&buffer32); // bytes size.
- stream_->ReadString(&result, buffer32);
- break;
- }
- default:
- break;
- }
- return result;
-}
-
-// Field is a map if it is a repeated message and it has an option "map_type".
-// TODO(skarvaje): Consider pre-computing the IsMap() into Field directly.
-bool ProtoStreamObjectSource::IsMap(
- const google::protobuf::Field& field) const {
- const google::protobuf::Type* field_type =
- typeinfo_->GetTypeByTypeUrl(field.type_url());
- return field.kind() == google::protobuf::Field_Kind_TYPE_MESSAGE &&
- google::protobuf::util::converter::IsMap(field, *field_type);
-}
-
-std::pair<int64, int32> ProtoStreamObjectSource::ReadSecondsAndNanos(
- const google::protobuf::Type& type) const {
- uint64 seconds = 0;
- uint32 nanos = 0;
- uint32 tag = 0;
- int64 signed_seconds = 0;
- int32 signed_nanos = 0;
-
- for (tag = stream_->ReadTag(); tag != 0; tag = stream_->ReadTag()) {
- const google::protobuf::Field* field = FindAndVerifyField(type, tag);
- if (field == NULL) {
- WireFormat::SkipField(stream_, tag, NULL);
- continue;
- }
- // 'seconds' has field number of 1 and 'nanos' has field number 2
- // //google/protobuf/timestamp.proto & duration.proto
- if (field->number() == 1) {
- // read seconds
- stream_->ReadVarint64(&seconds);
- signed_seconds = bit_cast<int64>(seconds);
- } else if (field->number() == 2) {
- // read nanos
- stream_->ReadVarint32(&nanos);
- signed_nanos = bit_cast<int32>(nanos);
- }
- }
- return std::pair<int64, int32>(signed_seconds, signed_nanos);
-}
-
-Status ProtoStreamObjectSource::IncrementRecursionDepth(
- StringPiece type_name, StringPiece field_name) const {
- if (++recursion_depth_ > max_recursion_depth_) {
- return Status(
- util::error::INVALID_ARGUMENT,
- StrCat("Message too deep. Max recursion depth reached for type '",
- type_name, "', field '", field_name, "'"));
- }
- return Status::OK;
-}
-
-namespace {
-// TODO(skarvaje): Speed this up by not doing a linear scan.
-const google::protobuf::Field* FindFieldByNumber(
- const google::protobuf::Type& type, int number) {
- for (int i = 0; i < type.fields_size(); ++i) {
- if (type.fields(i).number() == number) {
- return &type.fields(i);
- }
- }
- return NULL;
-}
-
-// TODO(skarvaje): Replace FieldDescriptor by implementing IsTypePackable()
-// using tech Field.
-bool IsPackable(const google::protobuf::Field& field) {
- return field.cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED &&
- google::protobuf::FieldDescriptor::IsTypePackable(
- static_cast<google::protobuf::FieldDescriptor::Type>(field.kind()));
-}
-
-// TODO(skarvaje): Speed this up by not doing a linear scan.
-const google::protobuf::EnumValue* FindEnumValueByNumber(
- const google::protobuf::Enum& tech_enum, int number) {
- for (int i = 0; i < tech_enum.enumvalue_size(); ++i) {
- const google::protobuf::EnumValue& ev = tech_enum.enumvalue(i);
- if (ev.number() == number) {
- return &ev;
- }
- }
- return NULL;
-}
-
-// TODO(skarvaje): Look into optimizing this by not doing computation on
-// double.
-const string FormatNanos(uint32 nanos, bool with_trailing_zeros) {
- if (nanos == 0) {
- return with_trailing_zeros ? ".000" : "";
- }
-
- const char* format =
- (nanos % 1000 != 0) ? "%.9f" : (nanos % 1000000 != 0) ? "%.6f" : "%.3f";
- string formatted =
- StringPrintf(format, static_cast<double>(nanos) / kNanosPerSecond);
- // remove the leading 0 before decimal.
- return formatted.substr(1);
-}
-} // namespace
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h
deleted file mode 100644
index 88ca652b2d..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource.h
+++ /dev/null
@@ -1,308 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__
-
-#include <functional>
-#include <google/protobuf/stubs/hash.h>
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/util/internal/object_source.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
-
-
-namespace google {
-namespace protobuf {
-class Field;
-class Type;
-} // namespace protobuf
-
-
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class TypeInfo;
-
-// An ObjectSource that can parse a stream of bytes as a protocol buffer.
-// Its WriteTo() method can be given an ObjectWriter.
-// This implementation uses a google.protobuf.Type for tag and name lookup.
-// The field names are converted into lower camel-case when writing to the
-// ObjectWriter.
-//
-// Sample usage: (suppose input is: string proto)
-// ArrayInputStream arr_stream(proto.data(), proto.size());
-// CodedInputStream in_stream(&arr_stream);
-// ProtoStreamObjectSource os(&in_stream, /*ServiceTypeInfo*/ typeinfo,
-// <your message google::protobuf::Type>);
-//
-// Status status = os.WriteTo(<some ObjectWriter>);
-class LIBPROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource {
- public:
- ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream,
- TypeResolver* type_resolver,
- const google::protobuf::Type& type);
-
- virtual ~ProtoStreamObjectSource();
-
- virtual util::Status NamedWriteTo(StringPiece name, ObjectWriter* ow) const;
-
- // Sets whether or not to use lowerCamelCase casing for enum values. If set to
- // false, enum values are output without any case conversions.
- //
- // For example, if we have an enum:
- // enum Type {
- // ACTION_AND_ADVENTURE = 1;
- // }
- // Type type = 20;
- //
- // And this option is set to true. Then the rendered "type" field will have
- // the string "actionAndAdventure".
- // {
- // ...
- // "type": "actionAndAdventure",
- // ...
- // }
- //
- // If set to false, the rendered "type" field will have the string
- // "ACTION_AND_ADVENTURE".
- // {
- // ...
- // "type": "ACTION_AND_ADVENTURE",
- // ...
- // }
- void set_use_lower_camel_for_enums(bool value) {
- use_lower_camel_for_enums_ = value;
- }
-
- // Sets the max recursion depth of proto message to be deserialized. Proto
- // messages over this depth will fail to be deserialized.
- // Default value is 64.
- void set_max_recursion_depth(int max_depth) {
- max_recursion_depth_ = max_depth;
- }
-
-
- protected:
- // Writes a proto2 Message to the ObjectWriter. When the given end_tag is
- // found this method will complete, allowing it to be used for parsing both
- // nested messages (end with 0) and nested groups (end with group end tag).
- // The include_start_and_end parameter allows this method to be called when
- // already inside of an object, and skip calling StartObject and EndObject.
- virtual util::Status WriteMessage(const google::protobuf::Type& descriptor,
- StringPiece name, const uint32 end_tag,
- bool include_start_and_end,
- ObjectWriter* ow) const;
-
- // Renders a repeating field (packed or unpacked). Returns the next tag after
- // reading all sequential repeating elements. The caller should use this tag
- // before reading more tags from the stream.
- virtual util::StatusOr<uint32> RenderList(
- const google::protobuf::Field* field, StringPiece name, uint32 list_tag,
- ObjectWriter* ow) const;
-
- // Looks up a field and verify its consistency with wire type in tag.
- const google::protobuf::Field* FindAndVerifyField(
- const google::protobuf::Type& type, uint32 tag) const;
-
- // Renders a field value to the ObjectWriter.
- util::Status RenderField(const google::protobuf::Field* field,
- StringPiece field_name, ObjectWriter* ow) const;
-
- // Reads field value according to Field spec in 'field' and returns the read
- // value as string. This only works for primitive datatypes (no message
- // types).
- const string ReadFieldValueAsString(
- const google::protobuf::Field& field) const;
-
-
- private:
- ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream,
- const TypeInfo* typeinfo,
- const google::protobuf::Type& type);
- // Function that renders a well known type with a modified behavior.
- typedef util::Status (*TypeRenderer)(const ProtoStreamObjectSource*,
- const google::protobuf::Type&,
- StringPiece, ObjectWriter*);
-
- // TODO(skarvaje): Mark these methods as non-const as they modify internal
- // state (stream_).
- //
- // Renders a NWP map.
- // Returns the next tag after reading all map entries. The caller should use
- // this tag before reading more tags from the stream.
- util::StatusOr<uint32> RenderMap(const google::protobuf::Field* field,
- StringPiece name, uint32 list_tag,
- ObjectWriter* ow) const;
-
- // Renders a packed repeating field. A packed field is stored as:
- // {tag length item1 item2 item3} instead of the less efficient
- // {tag item1 tag item2 tag item3}.
- util::Status RenderPacked(const google::protobuf::Field* field,
- ObjectWriter* ow) const;
-
- // Renders a google.protobuf.Timestamp value to ObjectWriter
- static util::Status RenderTimestamp(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Renders a google.protobuf.Duration value to ObjectWriter
- static util::Status RenderDuration(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Following RenderTYPE functions render well known types in
- // google/protobuf/wrappers.proto corresponding to TYPE.
- static util::Status RenderDouble(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderFloat(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderInt64(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderUInt64(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderInt32(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderUInt32(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderBool(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderString(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderBytes(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Renders a google.protobuf.Struct to ObjectWriter.
- static util::Status RenderStruct(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Helper to render google.protobuf.Struct's Value fields to ObjectWriter.
- static util::Status RenderStructValue(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Helper to render google.protobuf.Struct's ListValue fields to ObjectWriter.
- static util::Status RenderStructListValue(
- const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Render the "Any" type.
- static util::Status RenderAny(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- // Render the "FieldMask" type.
- static util::Status RenderFieldMask(const ProtoStreamObjectSource* os,
- const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
-
- static hash_map<string, TypeRenderer>* renderers_;
- static void InitRendererMap();
- static void DeleteRendererMap();
- static TypeRenderer* FindTypeRenderer(const string& type_url);
-
- // Same as above but renders all non-message field types. Callers don't call
- // this function directly. They just use RenderField.
- util::Status RenderNonMessageField(const google::protobuf::Field* field,
- StringPiece field_name,
- ObjectWriter* ow) const;
-
-
- // Utility function to detect proto maps. The 'field' MUST be repeated.
- bool IsMap(const google::protobuf::Field& field) const;
-
- // Utility to read int64 and int32 values from a message type in stream_.
- // Used for reading google.protobuf.Timestamp and Duration messages.
- std::pair<int64, int32> ReadSecondsAndNanos(
- const google::protobuf::Type& type) const;
-
- // Helper function to check recursion depth and increment it. It will return
- // Status::OK if the current depth is allowed. Otherwise an error is returned.
- // type_name and field_name are used for error reporting.
- util::Status IncrementRecursionDepth(StringPiece type_name,
- StringPiece field_name) const;
-
- // Input stream to read from. Ownership rests with the caller.
- google::protobuf::io::CodedInputStream* stream_;
-
- // Type information for all the types used in the descriptor. Used to find
- // google::protobuf::Type of nested messages/enums.
- const TypeInfo* typeinfo_;
-
- // Whether this class owns the typeinfo_ object. If true the typeinfo_ object
- // should be deleted in the destructor.
- bool own_typeinfo_;
-
- // google::protobuf::Type of the message source.
- const google::protobuf::Type& type_;
-
-
- // Whether to render enums using lowerCamelCase. Defaults to false.
- bool use_lower_camel_for_enums_;
-
- // Tracks current recursion depth.
- mutable int recursion_depth_;
-
- // Maximum allowed recursion depth.
- int max_recursion_depth_;
-
- // Whether to render unknown fields.
- bool render_unknown_fields_;
-
- // Whether to add trailing zeros for timestamp and duration.
- bool add_trailing_zeros_for_timestamp_and_duration_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc
deleted file mode 100644
index 1286bdb998..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectsource_test.cc
+++ /dev/null
@@ -1,1034 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <sstream>
-
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/expecting_objectwriter.h>
-#include <google/protobuf/util/internal/testdata/anys.pb.h>
-#include <google/protobuf/util/internal/testdata/books.pb.h>
-#include <google/protobuf/util/internal/testdata/field_mask.pb.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/internal/testdata/proto3.pb.h>
-#include <google/protobuf/util/internal/testdata/struct.pb.h>
-#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
-#include <google/protobuf/util/internal/type_info_test_helper.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <gtest/gtest.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::Descriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::FileDescriptorProto;
-using google::protobuf::Message;
-using google::protobuf::io::ArrayInputStream;
-using google::protobuf::io::CodedInputStream;
-using util::Status;
-using google::protobuf::testing::AnyM;
-using google::protobuf::testing::AnyOut;
-using google::protobuf::testing::Author;
-using google::protobuf::testing::BadAuthor;
-using google::protobuf::testing::BadNestedBook;
-using google::protobuf::testing::Book;
-using google::protobuf::testing::Book_Label;
-using google::protobuf::testing::Cyclic;
-using google::protobuf::testing::FieldMaskTest;
-using google::protobuf::testing::MapOut;
-using google::protobuf::testing::MapOutWireFormat;
-using google::protobuf::testing::NestedBook;
-using google::protobuf::testing::NestedFieldMask;
-using google::protobuf::testing::PackedPrimitive;
-using google::protobuf::testing::Primitive;
-using google::protobuf::testing::Proto3Message;
-using google::protobuf::testing::StructType;
-using google::protobuf::testing::TimestampDuration;
-using ::testing::_;
-
-
-namespace {
-string GetTypeUrl(const Descriptor* descriptor) {
- return string(kTypeServiceBaseUrl) + "/" + descriptor->full_name();
-}
-} // namespace
-
-class ProtostreamObjectSourceTest
- : public ::testing::TestWithParam<testing::TypeInfoSource> {
- protected:
- ProtostreamObjectSourceTest()
- : helper_(GetParam()),
- mock_(),
- ow_(&mock_),
- use_lower_camel_for_enums_(false),
- add_trailing_zeros_(false) {
- helper_.ResetTypeInfo(Book::descriptor(), Proto3Message::descriptor());
- }
-
- virtual ~ProtostreamObjectSourceTest() {}
-
- void DoTest(const Message& msg, const Descriptor* descriptor) {
- Status status = ExecuteTest(msg, descriptor);
- EXPECT_EQ(Status::OK, status);
- }
-
- Status ExecuteTest(const Message& msg, const Descriptor* descriptor) {
- std::ostringstream oss;
- msg.SerializePartialToOstream(&oss);
- string proto = oss.str();
- ArrayInputStream arr_stream(proto.data(), proto.size());
- CodedInputStream in_stream(&arr_stream);
-
- google::protobuf::scoped_ptr<ProtoStreamObjectSource> os(
- helper_.NewProtoSource(&in_stream, GetTypeUrl(descriptor)));
- if (use_lower_camel_for_enums_) os->set_use_lower_camel_for_enums(true);
- os->set_max_recursion_depth(64);
- return os->WriteTo(&mock_);
- }
-
- void PrepareExpectingObjectWriterForRepeatedPrimitive() {
- ow_.StartObject("")
- ->StartList("repFix32")
- ->RenderUint32("", bit_cast<uint32>(3201))
- ->RenderUint32("", bit_cast<uint32>(0))
- ->RenderUint32("", bit_cast<uint32>(3202))
- ->EndList()
- ->StartList("repU32")
- ->RenderUint32("", bit_cast<uint32>(3203))
- ->RenderUint32("", bit_cast<uint32>(0))
- ->EndList()
- ->StartList("repI32")
- ->RenderInt32("", 0)
- ->RenderInt32("", 3204)
- ->RenderInt32("", 3205)
- ->EndList()
- ->StartList("repSf32")
- ->RenderInt32("", 3206)
- ->RenderInt32("", 0)
- ->EndList()
- ->StartList("repS32")
- ->RenderInt32("", 0)
- ->RenderInt32("", 3207)
- ->RenderInt32("", 3208)
- ->EndList()
- ->StartList("repFix64")
- ->RenderUint64("", bit_cast<uint64>(6401LL))
- ->RenderUint64("", bit_cast<uint64>(0LL))
- ->EndList()
- ->StartList("repU64")
- ->RenderUint64("", bit_cast<uint64>(0LL))
- ->RenderUint64("", bit_cast<uint64>(6402LL))
- ->RenderUint64("", bit_cast<uint64>(6403LL))
- ->EndList()
- ->StartList("repI64")
- ->RenderInt64("", 6404L)
- ->RenderInt64("", 0L)
- ->EndList()
- ->StartList("repSf64")
- ->RenderInt64("", 0L)
- ->RenderInt64("", 6405L)
- ->RenderInt64("", 6406L)
- ->EndList()
- ->StartList("repS64")
- ->RenderInt64("", 6407L)
- ->RenderInt64("", 0L)
- ->EndList()
- ->StartList("repFloat")
- ->RenderFloat("", 0.0f)
- ->RenderFloat("", 32.1f)
- ->RenderFloat("", 32.2f)
- ->EndList()
- ->StartList("repDouble")
- ->RenderDouble("", 64.1L)
- ->RenderDouble("", 0.0L)
- ->EndList()
- ->StartList("repBool")
- ->RenderBool("", true)
- ->RenderBool("", false)
- ->EndList()
- ->EndObject();
- }
-
- Primitive PrepareRepeatedPrimitive() {
- Primitive primitive;
- primitive.add_rep_fix32(3201);
- primitive.add_rep_fix32(0);
- primitive.add_rep_fix32(3202);
- primitive.add_rep_u32(3203);
- primitive.add_rep_u32(0);
- primitive.add_rep_i32(0);
- primitive.add_rep_i32(3204);
- primitive.add_rep_i32(3205);
- primitive.add_rep_sf32(3206);
- primitive.add_rep_sf32(0);
- primitive.add_rep_s32(0);
- primitive.add_rep_s32(3207);
- primitive.add_rep_s32(3208);
- primitive.add_rep_fix64(6401L);
- primitive.add_rep_fix64(0L);
- primitive.add_rep_u64(0L);
- primitive.add_rep_u64(6402L);
- primitive.add_rep_u64(6403L);
- primitive.add_rep_i64(6404L);
- primitive.add_rep_i64(0L);
- primitive.add_rep_sf64(0L);
- primitive.add_rep_sf64(6405L);
- primitive.add_rep_sf64(6406L);
- primitive.add_rep_s64(6407L);
- primitive.add_rep_s64(0L);
- primitive.add_rep_float(0.0f);
- primitive.add_rep_float(32.1f);
- primitive.add_rep_float(32.2f);
- primitive.add_rep_double(64.1L);
- primitive.add_rep_double(0.0);
- primitive.add_rep_bool(true);
- primitive.add_rep_bool(false);
-
- PrepareExpectingObjectWriterForRepeatedPrimitive();
- return primitive;
- }
-
- PackedPrimitive PreparePackedPrimitive() {
- PackedPrimitive primitive;
- primitive.add_rep_fix32(3201);
- primitive.add_rep_fix32(0);
- primitive.add_rep_fix32(3202);
- primitive.add_rep_u32(3203);
- primitive.add_rep_u32(0);
- primitive.add_rep_i32(0);
- primitive.add_rep_i32(3204);
- primitive.add_rep_i32(3205);
- primitive.add_rep_sf32(3206);
- primitive.add_rep_sf32(0);
- primitive.add_rep_s32(0);
- primitive.add_rep_s32(3207);
- primitive.add_rep_s32(3208);
- primitive.add_rep_fix64(6401L);
- primitive.add_rep_fix64(0L);
- primitive.add_rep_u64(0L);
- primitive.add_rep_u64(6402L);
- primitive.add_rep_u64(6403L);
- primitive.add_rep_i64(6404L);
- primitive.add_rep_i64(0L);
- primitive.add_rep_sf64(0L);
- primitive.add_rep_sf64(6405L);
- primitive.add_rep_sf64(6406L);
- primitive.add_rep_s64(6407L);
- primitive.add_rep_s64(0L);
- primitive.add_rep_float(0.0f);
- primitive.add_rep_float(32.1f);
- primitive.add_rep_float(32.2f);
- primitive.add_rep_double(64.1L);
- primitive.add_rep_double(0.0);
- primitive.add_rep_bool(true);
- primitive.add_rep_bool(false);
-
- PrepareExpectingObjectWriterForRepeatedPrimitive();
- return primitive;
- }
-
- void UseLowerCamelForEnums() { use_lower_camel_for_enums_ = true; }
-
- void AddTrailingZeros() { add_trailing_zeros_ = true; }
-
- testing::TypeInfoTestHelper helper_;
-
- ::testing::NiceMock<MockObjectWriter> mock_;
- ExpectingObjectWriter ow_;
- bool use_lower_camel_for_enums_;
- bool add_trailing_zeros_;
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtostreamObjectSourceTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtostreamObjectSourceTest, EmptyMessage) {
- Book empty;
- ow_.StartObject("")->EndObject();
- DoTest(empty, Book::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, Primitives) {
- Primitive primitive;
- primitive.set_fix32(3201);
- primitive.set_u32(3202);
- primitive.set_i32(3203);
- primitive.set_sf32(3204);
- primitive.set_s32(3205);
- primitive.set_fix64(6401L);
- primitive.set_u64(6402L);
- primitive.set_i64(6403L);
- primitive.set_sf64(6404L);
- primitive.set_s64(6405L);
- primitive.set_str("String Value");
- primitive.set_bytes("Some Bytes");
- primitive.set_float_(32.1f);
- primitive.set_double_(64.1L);
- primitive.set_bool_(true);
-
- ow_.StartObject("")
- ->RenderUint32("fix32", bit_cast<uint32>(3201))
- ->RenderUint32("u32", bit_cast<uint32>(3202))
- ->RenderInt32("i32", 3203)
- ->RenderInt32("sf32", 3204)
- ->RenderInt32("s32", 3205)
- ->RenderUint64("fix64", bit_cast<uint64>(6401LL))
- ->RenderUint64("u64", bit_cast<uint64>(6402LL))
- ->RenderInt64("i64", 6403L)
- ->RenderInt64("sf64", 6404L)
- ->RenderInt64("s64", 6405L)
- ->RenderString("str", "String Value")
- ->RenderBytes("bytes", "Some Bytes")
- ->RenderFloat("float", 32.1f)
- ->RenderDouble("double", 64.1L)
- ->RenderBool("bool", true)
- ->EndObject();
- DoTest(primitive, Primitive::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, RepeatingPrimitives) {
- Primitive primitive = PrepareRepeatedPrimitive();
- primitive.add_rep_str("String One");
- primitive.add_rep_str("String Two");
- primitive.add_rep_bytes("Some Bytes");
-
- ow_.StartList("repStr")
- ->RenderString("", "String One")
- ->RenderString("", "String Two")
- ->EndList()
- ->StartList("repBytes")
- ->RenderBytes("", "Some Bytes")
- ->EndList();
- DoTest(primitive, Primitive::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, CustomJsonName) {
- Author author;
- author.set_id(12345);
-
- ow_.StartObject("")->RenderUint64("@id", 12345)->EndObject();
- DoTest(author, Author::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, NestedMessage) {
- Author* author = new Author();
- author->set_name("Tolstoy");
- Book book;
- book.set_title("My Book");
- book.set_allocated_author(author);
-
- ow_.StartObject("")
- ->RenderString("title", "My Book")
- ->StartObject("author")
- ->RenderString("name", "Tolstoy")
- ->EndObject()
- ->EndObject();
- DoTest(book, Book::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, RepeatingField) {
- Author author;
- author.set_alive(false);
- author.set_name("john");
- author.add_pseudonym("phil");
- author.add_pseudonym("bob");
-
- ow_.StartObject("")
- ->RenderBool("alive", false)
- ->RenderString("name", "john")
- ->StartList("pseudonym")
- ->RenderString("", "phil")
- ->RenderString("", "bob")
- ->EndList()
- ->EndObject();
- DoTest(author, Author::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, PackedRepeatingFields) {
- DoTest(PreparePackedPrimitive(), PackedPrimitive::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, NonPackedPackableFieldsActuallyPacked) {
- // Protostream is packed, but parse with non-packed Primitive.
- DoTest(PreparePackedPrimitive(), Primitive::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, PackedPackableFieldNotActuallyPacked) {
- // Protostream is not packed, but parse with PackedPrimitive.
- DoTest(PrepareRepeatedPrimitive(), PackedPrimitive::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, BadAuthor) {
- Author author;
- author.set_alive(false);
- author.set_name("john");
- author.set_id(1234L);
- author.add_pseudonym("phil");
- author.add_pseudonym("bob");
-
- ow_.StartObject("")
- ->StartList("alive")
- ->RenderBool("", false)
- ->EndList()
- ->StartList("name")
- ->RenderUint64("", static_cast<uint64>('j'))
- ->RenderUint64("", static_cast<uint64>('o'))
- ->RenderUint64("", static_cast<uint64>('h'))
- ->RenderUint64("", static_cast<uint64>('n'))
- ->EndList()
- ->RenderString("pseudonym", "phil")
- ->RenderString("pseudonym", "bob")
- ->EndObject();
- // Protostream created with Author, but parsed with BadAuthor.
- DoTest(author, BadAuthor::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, NestedBookToBadNestedBook) {
- Book* book = new Book();
- book->set_length(250);
- book->set_published(2014L);
- NestedBook nested;
- nested.set_allocated_book(book);
-
- ow_.StartObject("")
- ->StartList("book")
- ->RenderUint32("", 24) // tag for field length (3 << 3)
- ->RenderUint32("", 250)
- ->RenderUint32("", 32) // tag for field published (4 << 3)
- ->RenderUint32("", 2014)
- ->EndList()
- ->EndObject();
- // Protostream created with NestedBook, but parsed with BadNestedBook.
- DoTest(nested, BadNestedBook::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, BadNestedBookToNestedBook) {
- BadNestedBook nested;
- nested.add_book(1);
- nested.add_book(2);
- nested.add_book(3);
- nested.add_book(4);
- nested.add_book(5);
- nested.add_book(6);
- nested.add_book(7);
-
- ow_.StartObject("")->StartObject("book")->EndObject()->EndObject();
- // Protostream created with BadNestedBook, but parsed with NestedBook.
- DoTest(nested, NestedBook::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest,
- LongRepeatedListDoesNotBreakIntoMultipleJsonLists) {
- Book book;
-
- int repeat = 10000;
- for (int i = 0; i < repeat; ++i) {
- Book_Label* label = book.add_labels();
- label->set_key(StrCat("i", i));
- label->set_value(StrCat("v", i));
- }
-
- // Make sure StartList and EndList are called exactly once (see b/18227499 for
- // problems when this doesn't happen)
- EXPECT_CALL(mock_, StartList(_)).Times(1);
- EXPECT_CALL(mock_, EndList()).Times(1);
-
- DoTest(book, Book::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, LowerCamelEnumOutputTest) {
- Book book;
- book.set_type(Book::ACTION_AND_ADVENTURE);
-
- UseLowerCamelForEnums();
-
- ow_.StartObject("")->RenderString("type", "actionAndAdventure")->EndObject();
- DoTest(book, Book::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, EnumCaseIsUnchangedByDefault) {
- Book book;
- book.set_type(Book::ACTION_AND_ADVENTURE);
- ow_.StartObject("")
- ->RenderString("type", "ACTION_AND_ADVENTURE")
- ->EndObject();
- DoTest(book, Book::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, UnknownEnum) {
- Proto3Message message;
- message.set_enum_value(static_cast<Proto3Message::NestedEnum>(1234));
- ow_.StartObject("")
- ->RenderInt32("enumValue", 1234)
- ->EndObject();
- DoTest(message, Proto3Message::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceTest, CyclicMessageDepthTest) {
- Cyclic cyclic;
- cyclic.set_m_int(123);
-
- Book* book = cyclic.mutable_m_book();
- book->set_title("book title");
- Cyclic* current = cyclic.mutable_m_cyclic();
- Author* current_author = cyclic.add_m_author();
- for (int i = 0; i < 63; ++i) {
- Author* next = current_author->add_friend_();
- next->set_id(i);
- next->set_name(StrCat("author_name_", i));
- next->set_alive(true);
- current_author = next;
- }
-
- // Recursive message with depth (65) > max (max is 64).
- for (int i = 0; i < 64; ++i) {
- Cyclic* next = current->mutable_m_cyclic();
- next->set_m_str(StrCat("count_", i));
- current = next;
- }
-
- Status status = ExecuteTest(cyclic, Cyclic::descriptor());
- EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code());
-}
-
-class ProtostreamObjectSourceMapsTest : public ProtostreamObjectSourceTest {
- protected:
- ProtostreamObjectSourceMapsTest() {
- helper_.ResetTypeInfo(MapOut::descriptor());
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtostreamObjectSourceMapsTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-// Tests JSON map.
-//
-// This is the example expected output.
-// {
-// "map1": {
-// "key1": {
-// "foo": "foovalue"
-// },
-// "key2": {
-// "foo": "barvalue"
-// }
-// },
-// "map2": {
-// "nestedself": {
-// "map1": {
-// "nested_key1": {
-// "foo": "nested_foo"
-// }
-// },
-// "bar": "nested_bar_string"
-// }
-// },
-// "map3": {
-// "111": "one one one"
-// },
-// "bar": "top bar"
-// }
-TEST_P(ProtostreamObjectSourceMapsTest, MapsTest) {
- MapOut out;
- (*out.mutable_map1())["key1"].set_foo("foovalue");
- (*out.mutable_map1())["key2"].set_foo("barvalue");
-
- MapOut* nested_value = &(*out.mutable_map2())["nestedself"];
- (*nested_value->mutable_map1())["nested_key1"].set_foo("nested_foo");
- nested_value->set_bar("nested_bar_string");
-
- (*out.mutable_map3())[111] = "one one one";
-
- out.set_bar("top bar");
-
- ow_.StartObject("")
- ->StartObject("map1")
- ->StartObject("key1")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->StartObject("key2")
- ->RenderString("foo", "barvalue")
- ->EndObject()
- ->StartObject("map2")
- ->StartObject("nestedself")
- ->StartObject("map1")
- ->StartObject("nested_key1")
- ->RenderString("foo", "nested_foo")
- ->EndObject()
- ->EndObject()
- ->RenderString("bar", "nested_bar_string")
- ->EndObject()
- ->EndObject()
- ->StartObject("map3")
- ->RenderString("111", "one one one")
- ->EndObject()
- ->EndObject()
- ->RenderString("bar", "top bar")
- ->EndObject();
-
- DoTest(out, MapOut::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceMapsTest, MissingKeysTest) {
- // MapOutWireFormat has the same wire representation with MapOut but uses
- // repeated message fields to represent map fields so we can intentionally
- // leave out the key field or the value field of a map entry.
- MapOutWireFormat out;
- // Create some map entries without keys. They will be rendered with the
- // default values ("" for strings, "0" for integers, etc.).
- // {
- // "map1": {
- // "": {
- // "foo": "foovalue"
- // }
- // },
- // "map2": {
- // "": {
- // "map1": {
- // "nested_key1": {
- // "foo": "nested_foo"
- // }
- // }
- // }
- // },
- // "map3": {
- // "0": "one one one"
- // },
- // "map4": {
- // "false": "bool"
- // }
- // }
- out.add_map1()->mutable_value()->set_foo("foovalue");
- MapOut* nested = out.add_map2()->mutable_value();
- (*nested->mutable_map1())["nested_key1"].set_foo("nested_foo");
- out.add_map3()->set_value("one one one");
- out.add_map4()->set_value("bool");
-
- ow_.StartObject("")
- ->StartObject("map1")
- ->StartObject("")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->EndObject()
- ->StartObject("map2")
- ->StartObject("")
- ->StartObject("map1")
- ->StartObject("nested_key1")
- ->RenderString("foo", "nested_foo")
- ->EndObject()
- ->EndObject()
- ->EndObject()
- ->EndObject()
- ->StartObject("map3")
- ->RenderString("0", "one one one")
- ->EndObject()
- ->StartObject("map4")
- ->RenderString("false", "bool")
- ->EndObject()
- ->EndObject();
-
- DoTest(out, MapOut::descriptor());
-}
-
-class ProtostreamObjectSourceAnysTest : public ProtostreamObjectSourceTest {
- protected:
- ProtostreamObjectSourceAnysTest() {
- helper_.ResetTypeInfo(AnyOut::descriptor(),
- google::protobuf::Any::descriptor());
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtostreamObjectSourceAnysTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-// Tests JSON any support.
-//
-// This is the example expected output.
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.testing.AnyM"
-// "foo": "foovalue"
-// }
-// }
-TEST_P(ProtostreamObjectSourceAnysTest, BasicAny) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
-
- AnyM m;
- m.set_foo("foovalue");
- any->PackFrom(m);
-
- ow_.StartObject("")
- ->StartObject("any")
- ->RenderString("@type",
- "type.googleapis.com/google.protobuf.testing.AnyM")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->EndObject();
-
- DoTest(out, AnyOut::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, RecursiveAny) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
- any->set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ::google::protobuf::Any nested_any;
- nested_any.set_type_url("type.googleapis.com/google.protobuf.testing.AnyM");
-
- AnyM m;
- m.set_foo("foovalue");
- nested_any.set_value(m.SerializeAsString());
-
- any->set_value(nested_any.SerializeAsString());
-
- ow_.StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->StartObject("value")
- ->RenderString("@type",
- "type.googleapis.com/google.protobuf.testing.AnyM")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->EndObject()
- ->EndObject();
-
- DoTest(out, AnyOut::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, DoubleRecursiveAny) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
- any->set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ::google::protobuf::Any nested_any;
- nested_any.set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ::google::protobuf::Any second_nested_any;
- second_nested_any.set_type_url(
- "type.googleapis.com/google.protobuf.testing.AnyM");
-
- AnyM m;
- m.set_foo("foovalue");
- second_nested_any.set_value(m.SerializeAsString());
- nested_any.set_value(second_nested_any.SerializeAsString());
- any->set_value(nested_any.SerializeAsString());
-
- ow_.StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->StartObject("value")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->StartObject("value")
- ->RenderString("@type",
- "type.googleapis.com/google.protobuf.testing.AnyM")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->EndObject()
- ->EndObject()
- ->EndObject();
-
- DoTest(out, AnyOut::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, EmptyAnyOutputsEmptyObject) {
- AnyOut out;
- out.mutable_any();
-
- ow_.StartObject("")->StartObject("any")->EndObject()->EndObject();
-
- DoTest(out, AnyOut::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, EmptyWithTypeAndNoValueOutputsType) {
- AnyOut out;
- out.mutable_any()->set_type_url("foo.googleapis.com/my.Type");
-
- ow_.StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "foo.googleapis.com/my.Type")
- ->EndObject()
- ->EndObject();
-
- DoTest(out, AnyOut::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, MissingTypeUrlError) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
-
- AnyM m;
- m.set_foo("foovalue");
- any->set_value(m.SerializeAsString());
-
- // We start the "AnyOut" part and then fail when we hit the Any object.
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, AnyOut::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, UnknownTypeServiceError) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
- any->set_type_url("foo.googleapis.com/my.own.Type");
-
- AnyM m;
- m.set_foo("foovalue");
- any->set_value(m.SerializeAsString());
-
- // We start the "AnyOut" part and then fail when we hit the Any object.
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, AnyOut::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-TEST_P(ProtostreamObjectSourceAnysTest, UnknownTypeError) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
- any->set_type_url("type.googleapis.com/unknown.Type");
-
- AnyM m;
- m.set_foo("foovalue");
- any->set_value(m.SerializeAsString());
-
- // We start the "AnyOut" part and then fail when we hit the Any object.
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, AnyOut::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-class ProtostreamObjectSourceStructTest : public ProtostreamObjectSourceTest {
- protected:
- ProtostreamObjectSourceStructTest() {
- helper_.ResetTypeInfo(StructType::descriptor(),
- google::protobuf::Struct::descriptor());
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtostreamObjectSourceStructTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-// Tests struct
-//
-// "object": {
-// "k1": 123,
-// "k2": true
-// }
-TEST_P(ProtostreamObjectSourceStructTest, StructRenderSuccess) {
- StructType out;
- google::protobuf::Struct* s = out.mutable_object();
- s->mutable_fields()->operator[]("k1").set_number_value(123);
- s->mutable_fields()->operator[]("k2").set_bool_value(true);
-
- ow_.StartObject("")
- ->StartObject("object")
- ->RenderDouble("k1", 123)
- ->RenderBool("k2", true)
- ->EndObject()
- ->EndObject();
-
- DoTest(out, StructType::descriptor());
-}
-
-TEST_P(ProtostreamObjectSourceStructTest, MissingValueSkipsField) {
- StructType out;
- google::protobuf::Struct* s = out.mutable_object();
- s->mutable_fields()->operator[]("k1");
-
- ow_.StartObject("")->StartObject("object")->EndObject()->EndObject();
-
- DoTest(out, StructType::descriptor());
-}
-
-class ProtostreamObjectSourceFieldMaskTest
- : public ProtostreamObjectSourceTest {
- protected:
- ProtostreamObjectSourceFieldMaskTest() {
- helper_.ResetTypeInfo(FieldMaskTest::descriptor(),
- google::protobuf::FieldMask::descriptor());
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtostreamObjectSourceFieldMaskTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtostreamObjectSourceFieldMaskTest, FieldMaskRenderSuccess) {
- FieldMaskTest out;
- out.set_id("1");
- out.mutable_single_mask()->add_paths("path1");
- out.mutable_single_mask()->add_paths("snake_case_path2");
- ::google::protobuf::FieldMask* mask = out.add_repeated_mask();
- mask->add_paths("path3");
- mask = out.add_repeated_mask();
- mask->add_paths("snake_case_path4");
- mask->add_paths("path5");
- NestedFieldMask* nested = out.add_nested_mask();
- nested->set_data("data");
- nested->mutable_single_mask()->add_paths("nested.path1");
- nested->mutable_single_mask()->add_paths("nested_field.snake_case_path2");
- mask = nested->add_repeated_mask();
- mask->add_paths("nested_field.path3");
- mask->add_paths("nested.snake_case_path4");
- mask = nested->add_repeated_mask();
- mask->add_paths("nested.path5");
- mask = nested->add_repeated_mask();
- mask->add_paths(
- "snake_case.map_field[\"map_key_should_be_ignored\"].nested_snake_case."
- "map_field[\"map_key_sho\\\"uld_be_ignored\"]");
-
- ow_.StartObject("")
- ->RenderString("id", "1")
- ->RenderString("singleMask", "path1,snakeCasePath2")
- ->StartList("repeatedMask")
- ->RenderString("", "path3")
- ->RenderString("", "snakeCasePath4,path5")
- ->EndList()
- ->StartList("nestedMask")
- ->StartObject("")
- ->RenderString("data", "data")
- ->RenderString("singleMask", "nested.path1,nestedField.snakeCasePath2")
- ->StartList("repeatedMask")
- ->RenderString("", "nestedField.path3,nested.snakeCasePath4")
- ->RenderString("", "nested.path5")
- ->RenderString("",
- "snakeCase.mapField[\"map_key_should_be_ignored\"]."
- "nestedSnakeCase.mapField[\"map_key_sho\\\"uld_be_"
- "ignored\"]")
- ->EndList()
- ->EndObject()
- ->EndList()
- ->EndObject();
-
- DoTest(out, FieldMaskTest::descriptor());
-}
-
-class ProtostreamObjectSourceTimestampTest
- : public ProtostreamObjectSourceTest {
- protected:
- ProtostreamObjectSourceTimestampTest() {
- helper_.ResetTypeInfo(TimestampDuration::descriptor());
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtostreamObjectSourceTimestampTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtostreamObjectSourceTimestampTest, InvalidTimestampBelowMinTest) {
- TimestampDuration out;
- google::protobuf::Timestamp* ts = out.mutable_ts();
- // Min allowed seconds - 1
- ts->set_seconds(kTimestampMinSeconds - 1);
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-TEST_P(ProtostreamObjectSourceTimestampTest, InvalidTimestampAboveMaxTest) {
- TimestampDuration out;
- google::protobuf::Timestamp* ts = out.mutable_ts();
- // Max allowed seconds + 1
- ts->set_seconds(kTimestampMaxSeconds + 1);
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-TEST_P(ProtostreamObjectSourceTimestampTest, InvalidDurationBelowMinTest) {
- TimestampDuration out;
- google::protobuf::Duration* dur = out.mutable_dur();
- // Min allowed seconds - 1
- dur->set_seconds(kDurationMinSeconds - 1);
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-TEST_P(ProtostreamObjectSourceTimestampTest, InvalidDurationAboveMaxTest) {
- TimestampDuration out;
- google::protobuf::Duration* dur = out.mutable_dur();
- // Min allowed seconds + 1
- dur->set_seconds(kDurationMaxSeconds + 1);
- ow_.StartObject("");
-
- Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_EQ(util::error::INTERNAL, status.error_code());
-}
-
-TEST_P(ProtostreamObjectSourceTimestampTest, TimestampDurationDefaultValue) {
- TimestampDuration out;
- out.mutable_ts()->set_seconds(0);
- out.mutable_dur()->set_seconds(0);
-
- ow_.StartObject("")
- ->RenderString("ts", "1970-01-01T00:00:00Z")
- ->RenderString("dur", "0s")
- ->EndObject();
-
- DoTest(out, TimestampDuration::descriptor());
-}
-
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc
deleted file mode 100644
index 6c9bc30e75..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.cc
+++ /dev/null
@@ -1,1265 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-
-#include <functional>
-#include <stack>
-
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/util/internal/field_mask_utility.h>
-#include <google/protobuf/util/internal/object_location_tracker.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/statusor.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::internal::WireFormatLite;
-using util::error::INVALID_ARGUMENT;
-using util::Status;
-using util::StatusOr;
-
-
-ProtoStreamObjectWriter::ProtoStreamObjectWriter(
- TypeResolver* type_resolver, const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener,
- const ProtoStreamObjectWriter::Options& options)
- : ProtoWriter(type_resolver, type, output, listener),
- master_type_(type),
- current_(NULL),
- options_(options) {
- set_ignore_unknown_fields(options_.ignore_unknown_fields);
- set_use_lower_camel_for_enums(options_.use_lower_camel_for_enums);
-}
-
-ProtoStreamObjectWriter::ProtoStreamObjectWriter(
- const TypeInfo* typeinfo, const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener)
- : ProtoWriter(typeinfo, type, output, listener),
- master_type_(type),
- current_(NULL),
- options_(ProtoStreamObjectWriter::Options::Defaults()) {}
-
-ProtoStreamObjectWriter::~ProtoStreamObjectWriter() {
- if (current_ == NULL) return;
- // Cleanup explicitly in order to avoid destructor stack overflow when input
- // is deeply nested.
- // Cast to BaseElement to avoid doing additional checks (like missing fields)
- // during pop().
- google::protobuf::scoped_ptr<BaseElement> element(
- static_cast<BaseElement*>(current_.get())->pop<BaseElement>());
- while (element != NULL) {
- element.reset(element->pop<BaseElement>());
- }
-}
-
-namespace {
-// Utility method to split a string representation of Timestamp or Duration and
-// return the parts.
-void SplitSecondsAndNanos(StringPiece input, StringPiece* seconds,
- StringPiece* nanos) {
- size_t idx = input.rfind('.');
- if (idx != string::npos) {
- *seconds = input.substr(0, idx);
- *nanos = input.substr(idx + 1);
- } else {
- *seconds = input;
- *nanos = StringPiece();
- }
-}
-
-Status GetNanosFromStringPiece(StringPiece s_nanos,
- const char* parse_failure_message,
- const char* exceeded_limit_message,
- int32* nanos) {
- *nanos = 0;
-
- // Count the number of leading 0s and consume them.
- int num_leading_zeros = 0;
- while (s_nanos.Consume("0")) {
- num_leading_zeros++;
- }
- int32 i_nanos = 0;
- // 's_nanos' contains fractional seconds -- i.e. 'nanos' is equal to
- // "0." + s_nanos.ToString() seconds. An int32 is used for the
- // conversion to 'nanos', rather than a double, so that there is no
- // loss of precision.
- if (!s_nanos.empty() && !safe_strto32(s_nanos.ToString(), &i_nanos)) {
- return Status(INVALID_ARGUMENT, parse_failure_message);
- }
- if (i_nanos > kNanosPerSecond || i_nanos < 0) {
- return Status(INVALID_ARGUMENT, exceeded_limit_message);
- }
- // s_nanos should only have digits. No whitespace.
- if (s_nanos.find_first_not_of("0123456789") != StringPiece::npos) {
- return Status(INVALID_ARGUMENT, parse_failure_message);
- }
-
- if (i_nanos > 0) {
- // 'scale' is the number of digits to the right of the decimal
- // point in "0." + s_nanos.ToString()
- int32 scale = num_leading_zeros + s_nanos.size();
- // 'conversion' converts i_nanos into nanoseconds.
- // conversion = kNanosPerSecond / static_cast<int32>(std::pow(10, scale))
- // For efficiency, we precompute the conversion factor.
- int32 conversion = 0;
- switch (scale) {
- case 1:
- conversion = 100000000;
- break;
- case 2:
- conversion = 10000000;
- break;
- case 3:
- conversion = 1000000;
- break;
- case 4:
- conversion = 100000;
- break;
- case 5:
- conversion = 10000;
- break;
- case 6:
- conversion = 1000;
- break;
- case 7:
- conversion = 100;
- break;
- case 8:
- conversion = 10;
- break;
- case 9:
- conversion = 1;
- break;
- default:
- return Status(INVALID_ARGUMENT, exceeded_limit_message);
- }
- *nanos = i_nanos * conversion;
- }
-
- return Status::OK;
-}
-
-} // namespace
-
-ProtoStreamObjectWriter::AnyWriter::AnyWriter(ProtoStreamObjectWriter* parent)
- : parent_(parent),
- ow_(),
- invalid_(false),
- data_(),
- output_(&data_),
- depth_(0),
- is_well_known_type_(false),
- well_known_type_render_(NULL) {}
-
-ProtoStreamObjectWriter::AnyWriter::~AnyWriter() {}
-
-void ProtoStreamObjectWriter::AnyWriter::StartObject(StringPiece name) {
- ++depth_;
- // If an object writer is absent, that means we have not called StartAny()
- // before reaching here, which happens when we have data before the "@type"
- // field.
- if (ow_ == NULL) {
- // Save data before the "@type" field for later replay.
- uninterpreted_events_.push_back(Event(Event::START_OBJECT, name));
- } else if (is_well_known_type_ && depth_ == 1) {
- // For well-known types, the only other field besides "@type" should be a
- // "value" field.
- if (name != "value" && !invalid_) {
- parent_->InvalidValue("Any",
- "Expect a \"value\" field for well-known types.");
- invalid_ = true;
- }
- ow_->StartObject("");
- } else {
- // Forward the call to the child writer if:
- // 1. the type is not a well-known type.
- // 2. or, we are in a nested Any, Struct, or Value object.
- ow_->StartObject(name);
- }
-}
-
-bool ProtoStreamObjectWriter::AnyWriter::EndObject() {
- --depth_;
- if (ow_ == NULL) {
- if (depth_ >= 0) {
- // Save data before the "@type" field for later replay.
- uninterpreted_events_.push_back(Event(Event::END_OBJECT));
- }
- } else if (depth_ >= 0 || !is_well_known_type_) {
- // As long as depth_ >= 0, we know we haven't reached the end of Any.
- // Propagate these EndObject() calls to the contained ow_. For regular
- // message types, we propagate the end of Any as well.
- ow_->EndObject();
- }
- // A negative depth_ implies that we have reached the end of Any
- // object. Now we write out its contents.
- if (depth_ < 0) {
- WriteAny();
- return false;
- }
- return true;
-}
-
-void ProtoStreamObjectWriter::AnyWriter::StartList(StringPiece name) {
- ++depth_;
- if (ow_ == NULL) {
- // Save data before the "@type" field for later replay.
- uninterpreted_events_.push_back(Event(Event::START_LIST, name));
- } else if (is_well_known_type_ && depth_ == 1) {
- if (name != "value" && !invalid_) {
- parent_->InvalidValue("Any",
- "Expect a \"value\" field for well-known types.");
- invalid_ = true;
- }
- ow_->StartList("");
- } else {
- ow_->StartList(name);
- }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::EndList() {
- --depth_;
- if (depth_ < 0) {
- GOOGLE_LOG(DFATAL) << "Mismatched EndList found, should not be possible";
- depth_ = 0;
- }
- if (ow_ == NULL) {
- // Save data before the "@type" field for later replay.
- uninterpreted_events_.push_back(Event(Event::END_LIST));
- } else {
- ow_->EndList();
- }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::RenderDataPiece(
- StringPiece name, const DataPiece& value) {
- // Start an Any only at depth_ 0. Other RenderDataPiece calls with "@type"
- // should go to the contained ow_ as they indicate nested Anys.
- if (depth_ == 0 && ow_ == NULL && name == "@type") {
- StartAny(value);
- } else if (ow_ == NULL) {
- // Save data before the "@type" field.
- uninterpreted_events_.push_back(Event(name, value));
- } else if (depth_ == 0 && is_well_known_type_) {
- if (name != "value" && !invalid_) {
- parent_->InvalidValue("Any",
- "Expect a \"value\" field for well-known types.");
- invalid_ = true;
- }
- if (well_known_type_render_ == NULL) {
- // Only Any and Struct don't have a special type render but both of
- // them expect a JSON object (i.e., a StartObject() call).
- if (value.type() != DataPiece::TYPE_NULL && !invalid_) {
- parent_->InvalidValue("Any", "Expect a JSON object.");
- invalid_ = true;
- }
- } else {
- ow_->ProtoWriter::StartObject("");
- Status status = (*well_known_type_render_)(ow_.get(), value);
- if (!status.ok()) ow_->InvalidValue("Any", status.error_message());
- ow_->ProtoWriter::EndObject();
- }
- } else {
- ow_->RenderDataPiece(name, value);
- }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::StartAny(const DataPiece& value) {
- // Figure out the type url. This is a copy-paste from WriteString but we also
- // need the value, so we can't just call through to that.
- if (value.type() == DataPiece::TYPE_STRING) {
- type_url_ = value.str().ToString();
- } else {
- StatusOr<string> s = value.ToString();
- if (!s.ok()) {
- parent_->InvalidValue("String", s.status().error_message());
- invalid_ = true;
- return;
- }
- type_url_ = s.ValueOrDie();
- }
- // Resolve the type url, and report an error if we failed to resolve it.
- StatusOr<const google::protobuf::Type*> resolved_type =
- parent_->typeinfo()->ResolveTypeUrl(type_url_);
- if (!resolved_type.ok()) {
- parent_->InvalidValue("Any", resolved_type.status().error_message());
- invalid_ = true;
- return;
- }
- // At this point, type is never null.
- const google::protobuf::Type* type = resolved_type.ValueOrDie();
-
- well_known_type_render_ = FindTypeRenderer(type_url_);
- if (well_known_type_render_ != NULL ||
- // Explicitly list Any and Struct here because they don't have a
- // custom renderer.
- type->name() == kAnyType || type->name() == kStructType) {
- is_well_known_type_ = true;
- }
-
- // Create our object writer and initialize it with the first StartObject
- // call.
- ow_.reset(new ProtoStreamObjectWriter(parent_->typeinfo(), *type, &output_,
- parent_->listener()));
-
- // Don't call StartObject() for well-known types yet. Depending on the
- // type of actual data, we may not need to call StartObject(). For
- // example:
- // {
- // "@type": "type.googleapis.com/google.protobuf.Value",
- // "value": [1, 2, 3],
- // }
- // With the above JSON representation, we will only call StartList() on the
- // contained ow_.
- if (!is_well_known_type_) {
- ow_->StartObject("");
- }
-
- // Now we know the proto type and can interpret all data fields we gathered
- // before the "@type" field.
- for (int i = 0; i < uninterpreted_events_.size(); ++i) {
- uninterpreted_events_[i].Replay(this);
- }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::WriteAny() {
- if (ow_ == NULL) {
- if (uninterpreted_events_.empty()) {
- // We never got any content, so just return immediately, which is
- // equivalent to writing an empty Any.
- return;
- } else {
- // There are uninterpreted data, but we never got a "@type" field.
- if (!invalid_) {
- parent_->InvalidValue("Any", StrCat("Missing @type for any field in ",
- parent_->master_type_.name()));
- invalid_ = true;
- }
- return;
- }
- }
- // Render the type_url and value fields directly to the stream.
- // type_url has tag 1 and value has tag 2.
- WireFormatLite::WriteString(1, type_url_, parent_->stream());
- if (!data_.empty()) {
- WireFormatLite::WriteBytes(2, data_, parent_->stream());
- }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::Event::Replay(
- AnyWriter* writer) const {
- switch (type_) {
- case START_OBJECT:
- writer->StartObject(name_);
- break;
- case END_OBJECT:
- writer->EndObject();
- break;
- case START_LIST:
- writer->StartList(name_);
- break;
- case END_LIST:
- writer->EndList();
- break;
- case RENDER_DATA_PIECE:
- writer->RenderDataPiece(name_, value_);
- break;
- }
-}
-
-void ProtoStreamObjectWriter::AnyWriter::Event::DeepCopy() {
- // DataPiece only contains a string reference. To make sure the referenced
- // string value stays valid, we make a copy of the string value and update
- // DataPiece to reference our own copy.
- if (value_.type() == DataPiece::TYPE_STRING) {
- value_.str().AppendToString(&value_storage_);
- value_ = DataPiece(value_storage_, value_.use_strict_base64_decoding());
- } else if (value_.type() == DataPiece::TYPE_BYTES) {
- value_storage_ = value_.ToBytes().ValueOrDie();
- value_ =
- DataPiece(value_storage_, true, value_.use_strict_base64_decoding());
- }
-}
-
-ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter* enclosing,
- ItemType item_type, bool is_placeholder,
- bool is_list)
- : BaseElement(NULL),
- ow_(enclosing),
- any_(),
- item_type_(item_type),
- is_placeholder_(is_placeholder),
- is_list_(is_list) {
- if (item_type_ == ANY) {
- any_.reset(new AnyWriter(ow_));
- }
- if (item_type == MAP) {
- map_keys_.reset(new hash_set<string>);
- }
-}
-
-ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter::Item* parent,
- ItemType item_type, bool is_placeholder,
- bool is_list)
- : BaseElement(parent),
- ow_(this->parent()->ow_),
- any_(),
- item_type_(item_type),
- is_placeholder_(is_placeholder),
- is_list_(is_list) {
- if (item_type == ANY) {
- any_.reset(new AnyWriter(ow_));
- }
- if (item_type == MAP) {
- map_keys_.reset(new hash_set<string>);
- }
-}
-
-bool ProtoStreamObjectWriter::Item::InsertMapKeyIfNotPresent(
- StringPiece map_key) {
- return InsertIfNotPresent(map_keys_.get(), map_key.ToString());
-}
-
-ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartObject(
- StringPiece name) {
- if (invalid_depth() > 0) {
- IncrementInvalidDepth();
- return this;
- }
-
- // Starting the root message. Create the root Item and return.
- // ANY message type does not need special handling, just set the ItemType
- // to ANY.
- if (current_ == NULL) {
- ProtoWriter::StartObject(name);
- current_.reset(new Item(
- this, master_type_.name() == kAnyType ? Item::ANY : Item::MESSAGE,
- false, false));
-
- // If master type is a special type that needs extra values to be written to
- // stream, we write those values.
- if (master_type_.name() == kStructType) {
- // Struct has a map<string, Value> field called "fields".
- // https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
- // "fields": [
- Push("fields", Item::MAP, true, true);
- return this;
- }
-
- if (master_type_.name() == kStructValueType) {
- // We got a StartObject call with google.protobuf.Value field. The only
- // object within that type is a struct type. So start a struct.
- //
- // The struct field in Value type is named "struct_value"
- // https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
- // Also start the map field "fields" within the struct.
- // "struct_value": {
- // "fields": [
- Push("struct_value", Item::MESSAGE, true, false);
- Push("fields", Item::MAP, true, true);
- return this;
- }
-
- if (master_type_.name() == kStructListValueType) {
- InvalidValue(kStructListValueType,
- "Cannot start root message with ListValue.");
- }
-
- return this;
- }
-
- // Send all ANY events to AnyWriter.
- if (current_->IsAny()) {
- current_->any()->StartObject(name);
- return this;
- }
-
- // If we are within a map, we render name as keys and send StartObject to the
- // value field.
- if (current_->IsMap()) {
- if (!ValidMapKey(name)) {
- IncrementInvalidDepth();
- return this;
- }
-
- // Map is a repeated field of message type with a "key" and a "value" field.
- // https://developers.google.com/protocol-buffers/docs/proto3?hl=en#maps
- // message MapFieldEntry {
- // key_type key = 1;
- // value_type value = 2;
- // }
- //
- // repeated MapFieldEntry map_field = N;
- //
- // That means, we render the following element within a list (hence no
- // name):
- // { "key": "<name>", "value": {
- Push("", Item::MESSAGE, false, false);
- ProtoWriter::RenderDataPiece("key",
- DataPiece(name, use_strict_base64_decoding()));
- Push("value", Item::MESSAGE, true, false);
-
- // Make sure we are valid so far after starting map fields.
- if (invalid_depth() > 0) return this;
-
- // If top of stack is g.p.Struct type, start the struct the map field within
- // it.
- if (element() != NULL && IsStruct(*element()->parent_field())) {
- // Render "fields": [
- Push("fields", Item::MAP, true, true);
- return this;
- }
-
- // If top of stack is g.p.Value type, start the Struct within it.
- if (element() != NULL && IsStructValue(*element()->parent_field())) {
- // Render
- // "struct_value": {
- // "fields": [
- Push("struct_value", Item::MESSAGE, true, false);
- Push("fields", Item::MAP, true, true);
- }
- return this;
- }
-
- const google::protobuf::Field* field = BeginNamed(name, false);
- if (field == NULL) return this;
-
- if (IsStruct(*field)) {
- // Start a struct object.
- // Render
- // "<name>": {
- // "fields": {
- Push(name, Item::MESSAGE, false, false);
- Push("fields", Item::MAP, true, true);
- return this;
- }
-
- if (IsStructValue(*field)) {
- // We got a StartObject call with google.protobuf.Value field. The only
- // object within that type is a struct type. So start a struct.
- // Render
- // "<name>": {
- // "struct_value": {
- // "fields": {
- Push(name, Item::MESSAGE, false, false);
- Push("struct_value", Item::MESSAGE, true, false);
- Push("fields", Item::MAP, true, true);
- return this;
- }
-
- if (IsMap(*field)) {
- // Begin a map. A map is triggered by a StartObject() call if the current
- // field has a map type.
- // A map type is always repeated, hence set is_list to true.
- // Render
- // "<name>": [
- Push(name, Item::MAP, false, true);
- return this;
- }
-
- // A regular message type. Pass it directly to ProtoWriter.
- // Render
- // "<name>": {
- Push(name, IsAny(*field) ? Item::ANY : Item::MESSAGE, false, false);
- return this;
-}
-
-ProtoStreamObjectWriter* ProtoStreamObjectWriter::EndObject() {
- if (invalid_depth() > 0) {
- DecrementInvalidDepth();
- return this;
- }
-
- if (current_ == NULL) return this;
-
- if (current_->IsAny()) {
- if (current_->any()->EndObject()) return this;
- }
-
- Pop();
-
- return this;
-}
-
-ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartList(StringPiece name) {
- if (invalid_depth() > 0) {
- IncrementInvalidDepth();
- return this;
- }
-
- // Since we cannot have a top-level repeated item in protobuf, the only way
- // this is valid is if we start a special type google.protobuf.ListValue or
- // google.protobuf.Value.
- if (current_ == NULL) {
- if (!name.empty()) {
- InvalidName(name, "Root element should not be named.");
- IncrementInvalidDepth();
- return this;
- }
-
- // If master type is a special type that needs extra values to be written to
- // stream, we write those values.
- if (master_type_.name() == kStructValueType) {
- // We got a StartList with google.protobuf.Value master type. This means
- // we have to start the "list_value" within google.protobuf.Value.
- //
- // See
- // https://github.com/google/protobuf/blob/master/src/google/protobuf/struct.proto
- //
- // Render
- // "<name>": {
- // "list_value": {
- // "values": [ // Start this list.
- ProtoWriter::StartObject(name);
- current_.reset(new Item(this, Item::MESSAGE, false, false));
- Push("list_value", Item::MESSAGE, true, false);
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
-
- if (master_type_.name() == kStructListValueType) {
- // We got a StartList with google.protobuf.ListValue master type. This
- // means we have to start the "values" within google.protobuf.ListValue.
- //
- // Render
- // "<name>": {
- // "values": [ // Start this list.
- ProtoWriter::StartObject(name);
- current_.reset(new Item(this, Item::MESSAGE, false, false));
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
-
- // Send the event to ProtoWriter so proper errors can be reported.
- //
- // Render a regular list:
- // "<name>": [
- ProtoWriter::StartList(name);
- current_.reset(new Item(this, Item::MESSAGE, false, true));
- return this;
- }
-
- if (current_->IsAny()) {
- current_->any()->StartList(name);
- return this;
- }
-
- // If the top of stack is a map, we are starting a list value within a map.
- // Since map does not allow repeated values, this can only happen when the map
- // value is of a special type that renders a list in JSON. These can be one
- // of 3 cases:
- // i. We are rendering a list value within google.protobuf.Struct
- // ii. We are rendering a list value within google.protobuf.Value
- // iii. We are rendering a list value with type google.protobuf.ListValue.
- if (current_->IsMap()) {
- if (!ValidMapKey(name)) {
- IncrementInvalidDepth();
- return this;
- }
-
- // Start the repeated map entry object.
- // Render
- // { "key": "<name>", "value": {
- Push("", Item::MESSAGE, false, false);
- ProtoWriter::RenderDataPiece("key",
- DataPiece(name, use_strict_base64_decoding()));
- Push("value", Item::MESSAGE, true, false);
-
- // Make sure we are valid after pushing all above items.
- if (invalid_depth() > 0) return this;
-
- // case i and ii above. Start "list_value" field within g.p.Value
- if (element() != NULL && element()->parent_field() != NULL) {
- // Render
- // "list_value": {
- // "values": [ // Start this list
- if (IsStructValue(*element()->parent_field())) {
- Push("list_value", Item::MESSAGE, true, false);
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
-
- // Render
- // "values": [
- if (IsStructListValue(*element()->parent_field())) {
- // case iii above. Bind directly to g.p.ListValue
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
- }
-
- // Report an error.
- InvalidValue("Map", StrCat("Cannot have repeated items ('", name,
- "') within a map."));
- return this;
- }
-
- // When name is empty and stack is not empty, we are rendering an item within
- // a list.
- if (name.empty()) {
- if (element() != NULL && element()->parent_field() != NULL) {
- if (IsStructValue(*element()->parent_field())) {
- // Since it is g.p.Value, we bind directly to the list_value.
- // Render
- // { // g.p.Value item within the list
- // "list_value": {
- // "values": [
- Push("", Item::MESSAGE, false, false);
- Push("list_value", Item::MESSAGE, true, false);
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
-
- if (IsStructListValue(*element()->parent_field())) {
- // Since it is g.p.ListValue, we bind to it directly.
- // Render
- // { // g.p.ListValue item within the list
- // "values": [
- Push("", Item::MESSAGE, false, false);
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
- }
-
- // Pass the event to underlying ProtoWriter.
- Push(name, Item::MESSAGE, false, true);
- return this;
- }
-
- // name is not empty
- const google::protobuf::Field* field = Lookup(name);
- if (field == NULL) {
- IncrementInvalidDepth();
- return this;
- }
-
- if (IsStructValue(*field)) {
- // If g.p.Value is repeated, start that list. Otherwise, start the
- // "list_value" within it.
- if (IsRepeated(*field)) {
- // Render it just like a regular repeated field.
- // "<name>": [
- Push(name, Item::MESSAGE, false, true);
- return this;
- }
-
- // Start the "list_value" field.
- // Render
- // "<name>": {
- // "list_value": {
- // "values": [
- Push(name, Item::MESSAGE, false, false);
- Push("list_value", Item::MESSAGE, true, false);
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
-
- if (IsStructListValue(*field)) {
- // If g.p.ListValue is repeated, start that list. Otherwise, start the
- // "values" within it.
- if (IsRepeated(*field)) {
- // Render it just like a regular repeated field.
- // "<name>": [
- Push(name, Item::MESSAGE, false, true);
- return this;
- }
-
- // Start the "values" field within g.p.ListValue.
- // Render
- // "<name>": {
- // "values": [
- Push(name, Item::MESSAGE, false, false);
- Push("values", Item::MESSAGE, true, true);
- return this;
- }
-
- // If we are here, the field should be repeated. Report an error otherwise.
- if (!IsRepeated(*field)) {
- IncrementInvalidDepth();
- InvalidName(name, "Proto field is not repeating, cannot start list.");
- return this;
- }
-
- if (IsMap(*field)) {
- InvalidValue("Map",
- StrCat("Cannot bind a list to map for field '", name, "'."));
- IncrementInvalidDepth();
- return this;
- }
-
- // Pass the event to ProtoWriter.
- // Render
- // "<name>": [
- Push(name, Item::MESSAGE, false, true);
- return this;
-}
-
-ProtoStreamObjectWriter* ProtoStreamObjectWriter::EndList() {
- if (invalid_depth() > 0) {
- DecrementInvalidDepth();
- return this;
- }
-
- if (current_ == NULL) return this;
-
- if (current_->IsAny()) {
- current_->any()->EndList();
- return this;
- }
-
- Pop();
- return this;
-}
-
-Status ProtoStreamObjectWriter::RenderStructValue(ProtoStreamObjectWriter* ow,
- const DataPiece& data) {
- string struct_field_name;
- switch (data.type()) {
- // Our JSON parser parses numbers as either int64, uint64, or double.
- case DataPiece::TYPE_INT64: {
- // If the option to treat integers as strings is set, then render them as
- // strings. Otherwise, fallback to rendering them as double.
- if (ow->options_.struct_integers_as_strings) {
- StatusOr<int64> int_value = data.ToInt64();
- if (int_value.ok()) {
- ow->ProtoWriter::RenderDataPiece(
- "string_value",
- DataPiece(SimpleItoa(int_value.ValueOrDie()), true));
- return Status::OK;
- }
- }
- struct_field_name = "number_value";
- break;
- }
- case DataPiece::TYPE_UINT64: {
- // If the option to treat integers as strings is set, then render them as
- // strings. Otherwise, fallback to rendering them as double.
- if (ow->options_.struct_integers_as_strings) {
- StatusOr<uint64> int_value = data.ToUint64();
- if (int_value.ok()) {
- ow->ProtoWriter::RenderDataPiece(
- "string_value",
- DataPiece(SimpleItoa(int_value.ValueOrDie()), true));
- return Status::OK;
- }
- }
- struct_field_name = "number_value";
- break;
- }
- case DataPiece::TYPE_DOUBLE: {
- struct_field_name = "number_value";
- break;
- }
- case DataPiece::TYPE_STRING: {
- struct_field_name = "string_value";
- break;
- }
- case DataPiece::TYPE_BOOL: {
- struct_field_name = "bool_value";
- break;
- }
- case DataPiece::TYPE_NULL: {
- struct_field_name = "null_value";
- break;
- }
- default: {
- return Status(INVALID_ARGUMENT,
- "Invalid struct data type. Only number, string, boolean or "
- "null values are supported.");
- }
- }
- ow->ProtoWriter::RenderDataPiece(struct_field_name, data);
- return Status::OK;
-}
-
-Status ProtoStreamObjectWriter::RenderTimestamp(ProtoStreamObjectWriter* ow,
- const DataPiece& data) {
- if (data.type() == DataPiece::TYPE_NULL) return Status::OK;
- if (data.type() != DataPiece::TYPE_STRING) {
- return Status(INVALID_ARGUMENT,
- StrCat("Invalid data type for timestamp, value is ",
- data.ValueAsStringOrDefault("")));
- }
-
- StringPiece value(data.str());
-
- int64 seconds;
- int32 nanos;
- if (!::google::protobuf::internal::ParseTime(value.ToString(), &seconds,
- &nanos)) {
- return Status(INVALID_ARGUMENT, StrCat("Invalid time format: ", value));
- }
-
-
- ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds));
- ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos));
- return Status::OK;
-}
-
-static inline util::Status RenderOneFieldPath(ProtoStreamObjectWriter* ow,
- StringPiece path) {
- ow->ProtoWriter::RenderDataPiece(
- "paths", DataPiece(ConvertFieldMaskPath(path, &ToSnakeCase), true));
- return Status::OK;
-}
-
-Status ProtoStreamObjectWriter::RenderFieldMask(ProtoStreamObjectWriter* ow,
- const DataPiece& data) {
- if (data.type() == DataPiece::TYPE_NULL) return Status::OK;
- if (data.type() != DataPiece::TYPE_STRING) {
- return Status(INVALID_ARGUMENT,
- StrCat("Invalid data type for field mask, value is ",
- data.ValueAsStringOrDefault("")));
- }
-
-// TODO(tsun): figure out how to do proto descriptor based snake case
-// conversions as much as possible. Because ToSnakeCase sometimes returns the
-// wrong value.
- google::protobuf::scoped_ptr<ResultCallback1<util::Status, StringPiece> > callback(
- NewPermanentCallback(&RenderOneFieldPath, ow));
- return DecodeCompactFieldMaskPaths(data.str(), callback.get());
-}
-
-Status ProtoStreamObjectWriter::RenderDuration(ProtoStreamObjectWriter* ow,
- const DataPiece& data) {
- if (data.type() == DataPiece::TYPE_NULL) return Status::OK;
- if (data.type() != DataPiece::TYPE_STRING) {
- return Status(INVALID_ARGUMENT,
- StrCat("Invalid data type for duration, value is ",
- data.ValueAsStringOrDefault("")));
- }
-
- StringPiece value(data.str());
-
- if (!value.ends_with("s")) {
- return Status(INVALID_ARGUMENT,
- "Illegal duration format; duration must end with 's'");
- }
- value = value.substr(0, value.size() - 1);
- int sign = 1;
- if (value.starts_with("-")) {
- sign = -1;
- value = value.substr(1);
- }
-
- StringPiece s_secs, s_nanos;
- SplitSecondsAndNanos(value, &s_secs, &s_nanos);
- uint64 unsigned_seconds;
- if (!safe_strtou64(s_secs, &unsigned_seconds)) {
- return Status(INVALID_ARGUMENT,
- "Invalid duration format, failed to parse seconds");
- }
-
- int32 nanos = 0;
- Status nanos_status = GetNanosFromStringPiece(
- s_nanos, "Invalid duration format, failed to parse nano seconds",
- "Duration value exceeds limits", &nanos);
- if (!nanos_status.ok()) {
- return nanos_status;
- }
- nanos = sign * nanos;
-
- int64 seconds = sign * unsigned_seconds;
- if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds ||
- nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) {
- return Status(INVALID_ARGUMENT, "Duration value exceeds limits");
- }
-
- ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds));
- ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos));
- return Status::OK;
-}
-
-Status ProtoStreamObjectWriter::RenderWrapperType(ProtoStreamObjectWriter* ow,
- const DataPiece& data) {
- if (data.type() == DataPiece::TYPE_NULL) return Status::OK;
- ow->ProtoWriter::RenderDataPiece("value", data);
- return Status::OK;
-}
-
-ProtoStreamObjectWriter* ProtoStreamObjectWriter::RenderDataPiece(
- StringPiece name, const DataPiece& data) {
- Status status;
- if (invalid_depth() > 0) return this;
-
- if (current_ == NULL) {
- const TypeRenderer* type_renderer =
- FindTypeRenderer(GetFullTypeWithUrl(master_type_.name()));
- if (type_renderer == NULL) {
- InvalidName(name, "Root element must be a message.");
- return this;
- }
- // Render the special type.
- // "<name>": {
- // ... Render special type ...
- // }
- ProtoWriter::StartObject(name);
- status = (*type_renderer)(this, data);
- if (!status.ok()) {
- InvalidValue(master_type_.name(),
- StrCat("Field '", name, "', ", status.error_message()));
- }
- ProtoWriter::EndObject();
- return this;
- }
-
- if (current_->IsAny()) {
- current_->any()->RenderDataPiece(name, data);
- return this;
- }
-
- const google::protobuf::Field* field = NULL;
- if (current_->IsMap()) {
- if (!ValidMapKey(name)) return this;
-
- // Render an item in repeated map list.
- // { "key": "<name>", "value":
- Push("", Item::MESSAGE, false, false);
- ProtoWriter::RenderDataPiece("key",
- DataPiece(name, use_strict_base64_decoding()));
- field = Lookup("value");
- if (field == NULL) {
- Pop();
- GOOGLE_LOG(DFATAL) << "Map does not have a value field.";
- return this;
- }
-
- const TypeRenderer* type_renderer = FindTypeRenderer(field->type_url());
- if (type_renderer != NULL) {
- // Map's value type is a special type. Render it like a message:
- // "value": {
- // ... Render special type ...
- // }
- Push("value", Item::MESSAGE, true, false);
- status = (*type_renderer)(this, data);
- if (!status.ok()) {
- InvalidValue(field->type_url(),
- StrCat("Field '", name, "', ", status.error_message()));
- }
- Pop();
- return this;
- }
-
- // If we are rendering explicit null values and the backend proto field is
- // not of the google.protobuf.NullType type, we do nothing.
- if (data.type() == DataPiece::TYPE_NULL &&
- field->type_url() != kStructNullValueTypeUrl) {
- Pop();
- return this;
- }
-
- // Render the map value as a primitive type.
- ProtoWriter::RenderDataPiece("value", data);
- Pop();
- return this;
- }
-
- field = Lookup(name);
- if (field == NULL) return this;
-
- // Check if the field is of special type. Render it accordingly if so.
- const TypeRenderer* type_renderer = FindTypeRenderer(field->type_url());
- if (type_renderer != NULL) {
- // Pass through null value only for google.protobuf.Value. For other
- // types we ignore null value just like for regular field types.
- if (data.type() != DataPiece::TYPE_NULL ||
- field->type_url() == kStructValueTypeUrl) {
- Push(name, Item::MESSAGE, false, false);
- status = (*type_renderer)(this, data);
- if (!status.ok()) {
- InvalidValue(field->type_url(),
- StrCat("Field '", name, "', ", status.error_message()));
- }
- Pop();
- }
- return this;
- }
-
- // If we are rendering explicit null values and the backend proto field is
- // not of the google.protobuf.NullType type, we do nothing.
- if (data.type() == DataPiece::TYPE_NULL &&
- field->type_url() != kStructNullValueTypeUrl) {
- return this;
- }
-
- ProtoWriter::RenderDataPiece(name, data);
- return this;
-}
-
-// Map of functions that are responsible for rendering well known type
-// represented by the key.
-hash_map<string, ProtoStreamObjectWriter::TypeRenderer>*
- ProtoStreamObjectWriter::renderers_ = NULL;
-GOOGLE_PROTOBUF_DECLARE_ONCE(writer_renderers_init_);
-
-void ProtoStreamObjectWriter::InitRendererMap() {
- renderers_ = new hash_map<string, ProtoStreamObjectWriter::TypeRenderer>();
- (*renderers_)["type.googleapis.com/google.protobuf.Timestamp"] =
- &ProtoStreamObjectWriter::RenderTimestamp;
- (*renderers_)["type.googleapis.com/google.protobuf.Duration"] =
- &ProtoStreamObjectWriter::RenderDuration;
- (*renderers_)["type.googleapis.com/google.protobuf.FieldMask"] =
- &ProtoStreamObjectWriter::RenderFieldMask;
- (*renderers_)["type.googleapis.com/google.protobuf.Double"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Float"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Int64"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.UInt64"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Int32"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.UInt32"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Bool"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.String"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Bytes"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.DoubleValue"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.FloatValue"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Int64Value"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.UInt64Value"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Int32Value"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.UInt32Value"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.BoolValue"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.StringValue"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.BytesValue"] =
- &ProtoStreamObjectWriter::RenderWrapperType;
- (*renderers_)["type.googleapis.com/google.protobuf.Value"] =
- &ProtoStreamObjectWriter::RenderStructValue;
- ::google::protobuf::internal::OnShutdown(&DeleteRendererMap);
-}
-
-void ProtoStreamObjectWriter::DeleteRendererMap() {
- delete ProtoStreamObjectWriter::renderers_;
- renderers_ = NULL;
-}
-
-ProtoStreamObjectWriter::TypeRenderer*
-ProtoStreamObjectWriter::FindTypeRenderer(const string& type_url) {
- ::google::protobuf::GoogleOnceInit(&writer_renderers_init_, &InitRendererMap);
- return FindOrNull(*renderers_, type_url);
-}
-
-bool ProtoStreamObjectWriter::ValidMapKey(StringPiece unnormalized_name) {
- if (current_ == NULL) return true;
-
- if (!current_->InsertMapKeyIfNotPresent(unnormalized_name)) {
- listener()->InvalidName(
- location(), unnormalized_name,
- StrCat("Repeated map key: '", unnormalized_name, "' is already set."));
- return false;
- }
-
- return true;
-}
-
-void ProtoStreamObjectWriter::Push(StringPiece name, Item::ItemType item_type,
- bool is_placeholder, bool is_list) {
- is_list ? ProtoWriter::StartList(name) : ProtoWriter::StartObject(name);
-
- // invalid_depth == 0 means it is a successful StartObject or StartList.
- if (invalid_depth() == 0)
- current_.reset(
- new Item(current_.release(), item_type, is_placeholder, is_list));
-}
-
-void ProtoStreamObjectWriter::Pop() {
- // Pop all placeholder items sending StartObject or StartList events to
- // ProtoWriter according to is_list value.
- while (current_ != NULL && current_->is_placeholder()) {
- PopOneElement();
- }
- if (current_ != NULL) {
- PopOneElement();
- }
-}
-
-void ProtoStreamObjectWriter::PopOneElement() {
- current_->is_list() ? ProtoWriter::EndList() : ProtoWriter::EndObject();
- current_.reset(current_->pop<Item>());
-}
-
-bool ProtoStreamObjectWriter::IsMap(const google::protobuf::Field& field) {
- if (field.type_url().empty() ||
- field.kind() != google::protobuf::Field_Kind_TYPE_MESSAGE ||
- field.cardinality() !=
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED) {
- return false;
- }
- const google::protobuf::Type* field_type =
- typeinfo()->GetTypeByTypeUrl(field.type_url());
-
- return google::protobuf::util::converter::IsMap(field, *field_type);
-}
-
-bool ProtoStreamObjectWriter::IsAny(const google::protobuf::Field& field) {
- return GetTypeWithoutUrl(field.type_url()) == kAnyType;
-}
-
-bool ProtoStreamObjectWriter::IsStruct(const google::protobuf::Field& field) {
- return GetTypeWithoutUrl(field.type_url()) == kStructType;
-}
-
-bool ProtoStreamObjectWriter::IsStructValue(
- const google::protobuf::Field& field) {
- return GetTypeWithoutUrl(field.type_url()) == kStructValueType;
-}
-
-bool ProtoStreamObjectWriter::IsStructListValue(
- const google::protobuf::Field& field) {
- return GetTypeWithoutUrl(field.type_url()) == kStructListValueType;
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h
deleted file mode 100644
index 732971e1b7..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter.h
+++ /dev/null
@@ -1,405 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTWRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTWRITER_H__
-
-#include <deque>
-#include <google/protobuf/stubs/hash.h>
-#include <string>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/internal/datapiece.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/proto_writer.h>
-#include <google/protobuf/util/internal/structured_objectwriter.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/bytestream.h>
-
-namespace google {
-namespace protobuf {
-namespace io {
-class CodedOutputStream;
-} // namespace io
-} // namespace protobuf
-
-
-namespace protobuf {
-class Type;
-class Field;
-} // namespace protobuf
-
-
-namespace protobuf {
-namespace util {
-namespace converter {
-
-class ObjectLocationTracker;
-
-// An ObjectWriter that can write protobuf bytes directly from writer events.
-// This class supports all special types like Struct and Map. It uses
-// the ProtoWriter class to write raw proto bytes.
-//
-// It also supports streaming.
-class LIBPROTOBUF_EXPORT ProtoStreamObjectWriter : public ProtoWriter {
- public:
- // Options that control ProtoStreamObjectWriter class's behavior.
- struct Options {
- // Treats integer inputs in google.protobuf.Struct as strings. Normally,
- // integer values are returned in double field "number_value" of
- // google.protobuf.Struct. However, this can cause precision loss for
- // int64/uint64 inputs. This option is provided for cases that want to
- // preserve integer precision.
- bool struct_integers_as_strings;
-
- // Not treat unknown fields as an error. If there is an unknown fields,
- // just ignore it and continue to process the rest.
- bool ignore_unknown_fields;
-
- // If true, check if enum name in camel case or without underscore matches
- // the field name.
- bool use_lower_camel_for_enums;
-
- Options()
- : struct_integers_as_strings(false),
- ignore_unknown_fields(false),
- use_lower_camel_for_enums(false) {}
-
- // Default instance of Options with all options set to defaults.
- static const Options& Defaults() {
- static Options defaults;
- return defaults;
- }
- };
-
-// Constructor. Does not take ownership of any parameter passed in.
- ProtoStreamObjectWriter(TypeResolver* type_resolver,
- const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener,
- const ProtoStreamObjectWriter::Options& options =
- ProtoStreamObjectWriter::Options::Defaults());
- virtual ~ProtoStreamObjectWriter();
-
- // ObjectWriter methods.
- virtual ProtoStreamObjectWriter* StartObject(StringPiece name);
- virtual ProtoStreamObjectWriter* EndObject();
- virtual ProtoStreamObjectWriter* StartList(StringPiece name);
- virtual ProtoStreamObjectWriter* EndList();
-
- // Renders a DataPiece 'value' into a field whose wire type is determined
- // from the given field 'name'.
- virtual ProtoStreamObjectWriter* RenderDataPiece(StringPiece name,
- const DataPiece& value);
-
- protected:
- // Function that renders a well known type with modified behavior.
- typedef util::Status (*TypeRenderer)(ProtoStreamObjectWriter*,
- const DataPiece&);
-
- // Handles writing Anys out using nested object writers and the like.
- class LIBPROTOBUF_EXPORT AnyWriter {
- public:
- explicit AnyWriter(ProtoStreamObjectWriter* parent);
- ~AnyWriter();
-
- // Passes a StartObject call through to the Any writer.
- void StartObject(StringPiece name);
-
- // Passes an EndObject call through to the Any. Returns true if the any
- // handled the EndObject call, false if the Any is now all done and is no
- // longer needed.
- bool EndObject();
-
- // Passes a StartList call through to the Any writer.
- void StartList(StringPiece name);
-
- // Passes an EndList call through to the Any writer.
- void EndList();
-
- // Renders a data piece on the any.
- void RenderDataPiece(StringPiece name, const DataPiece& value);
-
- private:
- // Before the "@type" field is encountered, we store all incoming data
- // into this Event struct and replay them after we get the "@type" field.
- class LIBPROTOBUF_EXPORT Event {
- public:
- enum Type {
- START_OBJECT = 0,
- END_OBJECT = 1,
- START_LIST = 2,
- END_LIST = 3,
- RENDER_DATA_PIECE = 4,
- };
-
- // Constructor for END_OBJECT and END_LIST events.
- explicit Event(Type type) : type_(type), value_(DataPiece::NullData()) {}
-
- // Constructor for START_OBJECT and START_LIST events.
- explicit Event(Type type, StringPiece name)
- : type_(type),
- name_(name.ToString()),
- value_(DataPiece::NullData()) {}
-
- // Constructor for RENDER_DATA_PIECE events.
- explicit Event(StringPiece name, const DataPiece& value)
- : type_(RENDER_DATA_PIECE), name_(name.ToString()), value_(value) {
- DeepCopy();
- }
-
- Event(const Event& other)
- : type_(other.type_), name_(other.name_), value_(other.value_) {
- DeepCopy();
- }
-
- Event& operator=(const Event& other) {
- type_ = other.type_;
- name_ = other.name_;
- value_ = other.value_;
- DeepCopy();
- return *this;
- }
-
- void Replay(AnyWriter* writer) const;
-
- private:
- void DeepCopy();
-
- Type type_;
- string name_;
- DataPiece value_;
- string value_storage_;
- };
-
- // Handles starting up the any once we have a type.
- void StartAny(const DataPiece& value);
-
- // Writes the Any out to the parent writer in its serialized form.
- void WriteAny();
-
- // The parent of this writer, needed for various bits such as type info and
- // the listeners.
- ProtoStreamObjectWriter* parent_;
-
- // The nested object writer, used to write events.
- google::protobuf::scoped_ptr<ProtoStreamObjectWriter> ow_;
-
- // The type_url_ that this Any represents.
- string type_url_;
-
- // Whether this any is invalid. This allows us to only report an invalid
- // Any message a single time rather than every time we get a nested field.
- bool invalid_;
-
- // The output data and wrapping ByteSink.
- string data_;
- strings::StringByteSink output_;
-
- // The depth within the Any, so we can track when we're done.
- int depth_;
-
- // True if the type is a well-known type. Well-known types in Any
- // has a special formating:
- // {
- // "@type": "type.googleapis.com/google.protobuf.XXX",
- // "value": <JSON representation of the type>,
- // }
- bool is_well_known_type_;
- TypeRenderer* well_known_type_render_;
-
- // Store data before the "@type" field.
- std::vector<Event> uninterpreted_events_;
- };
-
- // Represents an item in a stack of items used to keep state between
- // ObjectWrier events.
- class LIBPROTOBUF_EXPORT Item : public BaseElement {
- public:
- // Indicates the type of item.
- enum ItemType {
- MESSAGE, // Simple message
- MAP, // Proto3 map type
- ANY, // Proto3 Any type
- };
-
- // Constructor for the root item.
- Item(ProtoStreamObjectWriter* enclosing, ItemType item_type,
- bool is_placeholder, bool is_list);
-
- // Constructor for a field of a message.
- Item(Item* parent, ItemType item_type, bool is_placeholder, bool is_list);
-
- virtual ~Item() {}
-
- // These functions return true if the element type is corresponding to the
- // type in function name.
- bool IsMap() { return item_type_ == MAP; }
- bool IsAny() { return item_type_ == ANY; }
-
- AnyWriter* any() const { return any_.get(); }
-
- virtual Item* parent() const {
- return static_cast<Item*>(BaseElement::parent());
- }
-
- // Inserts map key into hash set if and only if the key did NOT already
- // exist in hash set.
- // The hash set (map_keys_) is ONLY used to keep track of map keys.
- // Return true if insert successfully; returns false if the map key was
- // already present.
- bool InsertMapKeyIfNotPresent(StringPiece map_key);
-
- bool is_placeholder() const { return is_placeholder_; }
- bool is_list() const { return is_list_; }
-
- private:
- // Used for access to variables of the enclosing instance of
- // ProtoStreamObjectWriter.
- ProtoStreamObjectWriter* ow_;
-
- // A writer for Any objects, handles all Any-related nonsense.
- google::protobuf::scoped_ptr<AnyWriter> any_;
-
- // The type of this element, see enum for permissible types.
- ItemType item_type_;
-
- // Set of map keys already seen for the type_. Used to validate incoming
- // messages so no map key appears more than once.
- google::protobuf::scoped_ptr<hash_set<string> > map_keys_;
-
- // Conveys whether this Item is a placeholder or not. Placeholder items are
- // pushed to stack to account for special types.
- bool is_placeholder_;
-
- // Conveys whether this Item is a list or not. This is used to send
- // StartList or EndList calls to underlying ObjectWriter.
- bool is_list_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(Item);
- };
-
- ProtoStreamObjectWriter(const TypeInfo* typeinfo,
- const google::protobuf::Type& type,
- strings::ByteSink* output, ErrorListener* listener);
-
- // Returns true if the field is a map.
- inline bool IsMap(const google::protobuf::Field& field);
-
- // Returns true if the field is an any.
- inline bool IsAny(const google::protobuf::Field& field);
-
- // Returns true if the field is google.protobuf.Struct.
- inline bool IsStruct(const google::protobuf::Field& field);
-
- // Returns true if the field is google.protobuf.Value.
- inline bool IsStructValue(const google::protobuf::Field& field);
-
- // Returns true if the field is google.protobuf.ListValue.
- inline bool IsStructListValue(const google::protobuf::Field& field);
-
- // Renders google.protobuf.Value in struct.proto. It picks the right oneof
- // type based on value's type.
- static util::Status RenderStructValue(ProtoStreamObjectWriter* ow,
- const DataPiece& value);
-
- // Renders google.protobuf.Timestamp value.
- static util::Status RenderTimestamp(ProtoStreamObjectWriter* ow,
- const DataPiece& value);
-
- // Renders google.protobuf.FieldMask value.
- static util::Status RenderFieldMask(ProtoStreamObjectWriter* ow,
- const DataPiece& value);
-
- // Renders google.protobuf.Duration value.
- static util::Status RenderDuration(ProtoStreamObjectWriter* ow,
- const DataPiece& value);
-
- // Renders wrapper message types for primitive types in
- // google/protobuf/wrappers.proto.
- static util::Status RenderWrapperType(ProtoStreamObjectWriter* ow,
- const DataPiece& value);
-
- static void InitRendererMap();
- static void DeleteRendererMap();
- static TypeRenderer* FindTypeRenderer(const string& type_url);
-
- // Returns true if the map key for type_ is not duplicated key.
- // If map key is duplicated key, this function returns false.
- // Note that caller should make sure that the current proto element (current_)
- // is of element type MAP or STRUCT_MAP.
- // It also calls the appropriate error callback and unnormalzied_name is used
- // for error string.
- bool ValidMapKey(StringPiece unnormalized_name);
-
- // Pushes an item on to the stack. Also calls either StartObject or StartList
- // on the underlying ObjectWriter depending on whether is_list is false or
- // not.
- // is_placeholder conveys whether the item is a placeholder item or not.
- // Placeholder items are pushed when adding auxillary types' StartObject or
- // StartList calls.
- void Push(StringPiece name, Item::ItemType item_type, bool is_placeholder,
- bool is_list);
-
- // Pops items from the stack. All placeholder items are popped until a
- // non-placeholder item is found.
- void Pop();
-
- // Pops one element from the stack. Calls EndObject() or EndList() on the
- // underlying ObjectWriter depending on the value of is_list_.
- void PopOneElement();
-
- private:
- // Helper functions to create the map and find functions responsible for
- // rendering well known types, keyed by type URL.
- static hash_map<string, TypeRenderer>* renderers_;
-
- // Variables for describing the structure of the input tree:
- // master_type_: descriptor for the whole protobuf message.
- const google::protobuf::Type& master_type_;
-
- // The current element, variable for internal state processing.
- google::protobuf::scoped_ptr<Item> current_;
-
- // Reference to the options that control this class's behavior.
- const ProtoStreamObjectWriter::Options options_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTWRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
deleted file mode 100644
index a9b15e68a8..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
+++ /dev/null
@@ -1,2771 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-
-#include <stddef.h> // For size_t
-
-#include <google/protobuf/field_mask.pb.h>
-#include <google/protobuf/timestamp.pb.h>
-#include <google/protobuf/wrappers.pb.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/util/internal/mock_error_listener.h>
-#include <google/protobuf/util/internal/testdata/anys.pb.h>
-#include <google/protobuf/util/internal/testdata/books.pb.h>
-#include <google/protobuf/util/internal/testdata/field_mask.pb.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/internal/testdata/oneofs.pb.h>
-#include <google/protobuf/util/internal/testdata/proto3.pb.h>
-#include <google/protobuf/util/internal/testdata/struct.pb.h>
-#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
-#include <google/protobuf/util/internal/testdata/wrappers.pb.h>
-#include <google/protobuf/util/internal/type_info_test_helper.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <gtest/gtest.h>
-
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::testing::AnyM;
-using google::protobuf::testing::AnyOut;
-using google::protobuf::testing::Author;
-using google::protobuf::testing::Book;
-using google::protobuf::testing::FieldMaskTest;
-using google::protobuf::testing::Int32Wrapper;
-using google::protobuf::testing::MapIn;
-using google::protobuf::testing::Primitive;
-using google::protobuf::testing::Proto3Message;
-using google::protobuf::testing::Publisher;
-using google::protobuf::testing::StructType;
-using google::protobuf::testing::TimestampDuration;
-using google::protobuf::testing::ValueWrapper;
-using google::protobuf::testing::oneofs::OneOfsRequest;
-using google::protobuf::Descriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::DynamicMessageFactory;
-using google::protobuf::FileDescriptorProto;
-using google::protobuf::Message;
-using strings::GrowingArrayByteSink;
-using ::testing::_;
-using ::testing::Args;
-
-
-namespace {
-string GetTypeUrl(const Descriptor* descriptor) {
- return string(kTypeServiceBaseUrl) + "/" + descriptor->full_name();
-}
-} // namespace
-
-#if __cplusplus >= 201103L
- using std::get;
-#else
- using std::tr1::get;
-#endif
-
-class BaseProtoStreamObjectWriterTest
- : public ::testing::TestWithParam<testing::TypeInfoSource> {
- protected:
- BaseProtoStreamObjectWriterTest()
- : helper_(GetParam()),
- listener_(),
- output_(new GrowingArrayByteSink(1000)),
- ow_() {}
-
- explicit BaseProtoStreamObjectWriterTest(const Descriptor* descriptor)
- : helper_(GetParam()),
- listener_(),
- output_(new GrowingArrayByteSink(1000)),
- ow_() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(descriptor);
- ResetTypeInfo(descriptors);
- }
-
- explicit BaseProtoStreamObjectWriterTest(
- std::vector<const Descriptor*> descriptors)
- : helper_(GetParam()),
- listener_(),
- output_(new GrowingArrayByteSink(1000)),
- ow_() {
- ResetTypeInfo(descriptors);
- }
-
- void ResetTypeInfo(std::vector<const Descriptor*> descriptors) {
- GOOGLE_CHECK(!descriptors.empty()) << "Must have at least one descriptor!";
- helper_.ResetTypeInfo(descriptors);
- ow_.reset(helper_.NewProtoWriter(GetTypeUrl(descriptors[0]), output_.get(),
- &listener_, options_));
- }
-
- void ResetTypeInfo(const Descriptor* descriptor) {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(descriptor);
- ResetTypeInfo(descriptors);
- }
-
- virtual ~BaseProtoStreamObjectWriterTest() {}
-
- void CheckOutput(const Message& expected, int expected_length) {
- size_t nbytes;
- google::protobuf::scoped_array<char> buffer(output_->GetBuffer(&nbytes));
- if (expected_length >= 0) {
- EXPECT_EQ(expected_length, nbytes);
- }
- string str(buffer.get(), nbytes);
-
- std::stringbuf str_buf(str, std::ios_base::in);
- std::istream istream(&str_buf);
- google::protobuf::scoped_ptr<Message> message(expected.New());
- message->ParsePartialFromIstream(&istream);
-
- if (!MessageDifferencer::Equivalent(expected, *message)) {
- EXPECT_EQ(expected.DebugString(), message->DebugString());
- }
- }
-
- void CheckOutput(const Message& expected) { CheckOutput(expected, -1); }
-
- const google::protobuf::Type* GetType(const Descriptor* descriptor) {
- return helper_.GetTypeInfo()->GetTypeByTypeUrl(GetTypeUrl(descriptor));
- }
-
- testing::TypeInfoTestHelper helper_;
- MockErrorListener listener_;
- google::protobuf::scoped_ptr<GrowingArrayByteSink> output_;
- google::protobuf::scoped_ptr<ProtoStreamObjectWriter> ow_;
- ProtoStreamObjectWriter::Options options_;
-};
-
-MATCHER_P(HasObjectLocation, expected,
- "Verifies the expected object location") {
- string actual = get<0>(arg).ToString();
- if (actual.compare(expected) == 0) return true;
- *result_listener << "actual location is: " << actual;
- return false;
-}
-
-class ProtoStreamObjectWriterTest : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterTest()
- : BaseProtoStreamObjectWriterTest(Book::descriptor()) {}
-
- void ResetProtoWriter() {
- ResetTypeInfo(Book::descriptor());
- }
-
- virtual ~ProtoStreamObjectWriterTest() {}
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterTest, EmptyObject) {
- Book empty;
- ow_->StartObject("")->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, SimpleObject) {
- string content("My content");
-
- Book book;
- book.set_title("My Title");
- book.set_length(222);
- book.set_content(content);
-
- ow_->StartObject("")
- ->RenderString("title", "My Title")
- ->RenderInt32("length", 222)
- ->RenderBytes("content", content)
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, SimpleMessage) {
- Book book;
- book.set_title("Some Book");
- book.set_length(102);
- Publisher* publisher = book.mutable_publisher();
- publisher->set_name("My Publisher");
- Author* robert = book.mutable_author();
- robert->set_alive(true);
- robert->set_name("robert");
- robert->add_pseudonym("bob");
- robert->add_pseudonym("bobby");
- robert->add_friend_()->set_name("john");
-
- ow_->StartObject("")
- ->RenderString("title", "Some Book")
- ->RenderInt32("length", 102)
- ->StartObject("publisher")
- ->RenderString("name", "My Publisher")
- ->EndObject()
- ->StartObject("author")
- ->RenderBool("alive", true)
- ->RenderString("name", "robert")
- ->StartList("pseudonym")
- ->RenderString("", "bob")
- ->RenderString("", "bobby")
- ->EndList()
- ->StartList("friend")
- ->StartObject("")
- ->RenderString("name", "john")
- ->EndObject()
- ->EndList()
- ->EndObject()
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, CustomJsonName) {
- Book book;
- Author* robert = book.mutable_author();
- robert->set_id(12345);
- robert->set_name("robert");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderUint64("@id", 12345)
- ->RenderString("name", "robert")
- ->EndObject()
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IntEnumValuesAreAccepted) {
- Book book;
- book.set_title("Some Book");
- book.set_type(google::protobuf::testing::Book_Type_KIDS);
- Author* robert = book.mutable_author();
- robert->set_name("robert");
-
- ow_->StartObject("")
- ->RenderString("title", "Some Book")
- ->RenderString("type", "2")
- ->StartObject("author")
- ->RenderString("name", "robert")
- ->EndObject()
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, EnumValuesWithoutUnderscoreAreAccepted) {
- Book book;
- book.set_title("Some Book");
- book.set_type(google::protobuf::testing::Book_Type_ACTION_AND_ADVENTURE);
- Author* robert = book.mutable_author();
- robert->set_name("robert");
-
- options_.use_lower_camel_for_enums = true;
- ResetProtoWriter();
-
- ow_->StartObject("")
- ->RenderString("title", "Some Book")
- ->RenderString("type", "ACTIONANDADVENTURE")
- ->StartObject("author")
- ->RenderString("name", "robert")
- ->EndObject()
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, EnumValuesInCamelCaseAreAccepted) {
- Book book;
- book.set_title("Some Book");
- book.set_type(google::protobuf::testing::Book_Type_ACTION_AND_ADVENTURE);
- Author* robert = book.mutable_author();
- robert->set_name("robert");
-
- options_.use_lower_camel_for_enums = true;
- ResetProtoWriter();
-
- ow_->StartObject("")
- ->RenderString("title", "Some Book")
- ->RenderString("type", "actionAndAdventure")
- ->StartObject("author")
- ->RenderString("name", "robert")
- ->EndObject()
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest,
- EnumValuesInCamelCaseWithNameNotUppercaseAreAccepted) {
- Book book;
- book.set_title("Some Book");
- book.set_type(google::protobuf::testing::Book_Type_arts_and_photography);
- Author* robert = book.mutable_author();
- robert->set_name("robert");
-
- options_.use_lower_camel_for_enums = true;
- ResetProtoWriter();
-
- ow_->StartObject("")
- ->RenderString("title", "Some Book")
- ->RenderString("type", "artsAndPhotography")
- ->StartObject("author")
- ->RenderString("name", "robert")
- ->EndObject()
- ->EndObject();
- CheckOutput(book);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, PrimitiveFromStringConversion) {
- Primitive full;
- full.set_fix32(101);
- full.set_u32(102);
- full.set_i32(-103);
- full.set_sf32(-104);
- full.set_s32(-105);
- full.set_fix64(40000000001L);
- full.set_u64(40000000002L);
- full.set_i64(-40000000003L);
- full.set_sf64(-40000000004L);
- full.set_s64(-40000000005L);
- full.set_str("string1");
- full.set_bytes("Some Bytes");
- full.set_float_(3.14f);
- full.set_double_(-4.05L);
- full.set_bool_(true);
- full.add_rep_fix32(201);
- full.add_rep_u32(202);
- full.add_rep_i32(-203);
- full.add_rep_sf32(-204);
- full.add_rep_s32(-205);
- full.add_rep_fix64(80000000001L);
- full.add_rep_u64(80000000002L);
- full.add_rep_i64(-80000000003L);
- full.add_rep_sf64(-80000000004L);
- full.add_rep_s64(-80000000005L);
- full.add_rep_str("string2");
- full.add_rep_bytes("More Bytes");
- full.add_rep_float(6.14f);
- full.add_rep_double(-8.05L);
- full.add_rep_bool(false);
-
- ResetTypeInfo(Primitive::descriptor());
-
- ow_->StartObject("")
- ->RenderString("fix32", "101")
- ->RenderString("u32", "102")
- ->RenderString("i32", "-103")
- ->RenderString("sf32", "-104")
- ->RenderString("s32", "-105")
- ->RenderString("fix64", "40000000001")
- ->RenderString("u64", "40000000002")
- ->RenderString("i64", "-40000000003")
- ->RenderString("sf64", "-40000000004")
- ->RenderString("s64", "-40000000005")
- ->RenderString("str", "string1")
- ->RenderString("bytes", "U29tZSBCeXRlcw==") // "Some Bytes"
- ->RenderString("float", "3.14")
- ->RenderString("double", "-4.05")
- ->RenderString("bool", "true")
- ->StartList("rep_fix32")
- ->RenderString("", "201")
- ->EndList()
- ->StartList("rep_u32")
- ->RenderString("", "202")
- ->EndList()
- ->StartList("rep_i32")
- ->RenderString("", "-203")
- ->EndList()
- ->StartList("rep_sf32")
- ->RenderString("", "-204")
- ->EndList()
- ->StartList("rep_s32")
- ->RenderString("", "-205")
- ->EndList()
- ->StartList("rep_fix64")
- ->RenderString("", "80000000001")
- ->EndList()
- ->StartList("rep_u64")
- ->RenderString("", "80000000002")
- ->EndList()
- ->StartList("rep_i64")
- ->RenderString("", "-80000000003")
- ->EndList()
- ->StartList("rep_sf64")
- ->RenderString("", "-80000000004")
- ->EndList()
- ->StartList("rep_s64")
- ->RenderString("", "-80000000005")
- ->EndList()
- ->StartList("rep_str")
- ->RenderString("", "string2")
- ->EndList()
- ->StartList("rep_bytes")
- ->RenderString("", "TW9yZSBCeXRlcw==") // "More Bytes"
- ->EndList()
- ->StartList("rep_float")
- ->RenderString("", "6.14")
- ->EndList()
- ->StartList("rep_double")
- ->RenderString("", "-8.05")
- ->EndList()
- ->StartList("rep_bool")
- ->RenderString("", "false")
- ->EndList()
- ->EndObject();
- CheckOutput(full);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, InfinityInputTest) {
- Primitive full;
- full.set_double_(std::numeric_limits<double>::infinity());
- full.set_float_(std::numeric_limits<float>::infinity());
- full.set_str("-Infinity");
-
- ResetTypeInfo(Primitive::descriptor());
-
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT32"),
- StringPiece("\"Infinity\"")))
- .With(Args<0>(HasObjectLocation("i32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"Infinity\"")))
- .With(Args<0>(HasObjectLocation("u32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_SFIXED64"),
- StringPiece("\"-Infinity\"")))
- .With(Args<0>(HasObjectLocation("sf64")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_BOOL"),
- StringPiece("\"Infinity\"")))
- .With(Args<0>(HasObjectLocation("bool")));
-
- ow_->StartObject("")
- ->RenderString("double", "Infinity")
- ->RenderString("float", "Infinity")
- ->RenderString("i32", "Infinity")
- ->RenderString("u32", "Infinity")
- ->RenderString("sf64", "-Infinity")
- ->RenderString("str", "-Infinity")
- ->RenderString("bool", "Infinity")
- ->EndObject();
- CheckOutput(full);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, NaNInputTest) {
- Primitive full;
- full.set_double_(std::numeric_limits<double>::quiet_NaN());
- full.set_float_(std::numeric_limits<float>::quiet_NaN());
- full.set_str("NaN");
-
- ResetTypeInfo(Primitive::descriptor());
-
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT32"),
- StringPiece("\"NaN\"")))
- .With(Args<0>(HasObjectLocation("i32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"NaN\"")))
- .With(Args<0>(HasObjectLocation("u32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_SFIXED64"),
- StringPiece("\"NaN\"")))
- .With(Args<0>(HasObjectLocation("sf64")));
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("TYPE_BOOL"), StringPiece("\"NaN\"")))
- .With(Args<0>(HasObjectLocation("bool")));
-
- ow_->StartObject("")
- ->RenderString("double", "NaN")
- ->RenderString("float", "NaN")
- ->RenderString("i32", "NaN")
- ->RenderString("u32", "NaN")
- ->RenderString("sf64", "NaN")
- ->RenderString("str", "NaN")
- ->RenderString("bool", "NaN")
- ->EndObject();
-
- CheckOutput(full);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, ImplicitPrimitiveList) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("The Author");
- author->add_pseudonym("first");
- author->add_pseudonym("second");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "The Author")
- ->RenderString("pseudonym", "first")
- ->RenderString("pseudonym", "second")
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest,
- LastWriteWinsOnNonRepeatedPrimitiveFieldWithDuplicates) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("second");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "first")
- ->RenderString("name", "second")
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, ExplicitPrimitiveList) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("The Author");
- author->add_pseudonym("first");
- author->add_pseudonym("second");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "The Author")
- ->StartList("pseudonym")
- ->RenderString("", "first")
- ->RenderString("", "second")
- ->EndList()
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, NonRepeatedExplicitPrimitiveList) {
- Book expected;
- expected.set_allocated_author(new Author());
-
- EXPECT_CALL(
- listener_,
- InvalidName(
- _, StringPiece("name"),
- StringPiece("Proto field is not repeating, cannot start list.")))
- .With(Args<0>(HasObjectLocation("author")));
- ow_->StartObject("")
- ->StartObject("author")
- ->StartList("name")
- ->RenderString("", "first")
- ->RenderString("", "second")
- ->EndList()
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, ImplicitMessageList) {
- Book expected;
- Author* outer = expected.mutable_author();
- outer->set_name("outer");
- outer->set_alive(true);
- Author* first = outer->add_friend_();
- first->set_name("first");
- Author* second = outer->add_friend_();
- second->set_name("second");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "outer")
- ->RenderBool("alive", true)
- ->StartObject("friend")
- ->RenderString("name", "first")
- ->EndObject()
- ->StartObject("friend")
- ->RenderString("name", "second")
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest,
- LastWriteWinsOnNonRepeatedMessageFieldWithDuplicates) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("The Author");
- Publisher* publisher = expected.mutable_publisher();
- publisher->set_name("second");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "The Author")
- ->EndObject()
- ->StartObject("publisher")
- ->RenderString("name", "first")
- ->EndObject()
- ->StartObject("publisher")
- ->RenderString("name", "second")
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, ExplicitMessageList) {
- Book expected;
- Author* outer = expected.mutable_author();
- outer->set_name("outer");
- outer->set_alive(true);
- Author* first = outer->add_friend_();
- first->set_name("first");
- Author* second = outer->add_friend_();
- second->set_name("second");
-
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "outer")
- ->RenderBool("alive", true)
- ->StartList("friend")
- ->StartObject("")
- ->RenderString("name", "first")
- ->EndObject()
- ->StartObject("")
- ->RenderString("name", "second")
- ->EndObject()
- ->EndList()
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, NonRepeatedExplicitMessageList) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("The Author");
-
- EXPECT_CALL(
- listener_,
- InvalidName(
- _, StringPiece("publisher"),
- StringPiece("Proto field is not repeating, cannot start list.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "The Author")
- ->EndObject()
- ->StartList("publisher")
- ->StartObject("")
- ->RenderString("name", "first")
- ->EndObject()
- ->StartObject("")
- ->RenderString("name", "second")
- ->EndObject()
- ->EndList()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnknownFieldAtRoot) {
- Book empty;
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")->RenderString("unknown", "Nope!")->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnknownFieldAtAuthorFriend) {
- Book expected;
- Author* paul = expected.mutable_author();
- paul->set_name("Paul");
- Author* mark = paul->add_friend_();
- mark->set_name("Mark");
- Author* john = paul->add_friend_();
- john->set_name("John");
- Author* luke = paul->add_friend_();
- luke->set_name("Luke");
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("address"),
- StringPiece("Cannot find field.")))
- .With(Args<0>(HasObjectLocation("author.friend[1]")));
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "Paul")
- ->StartList("friend")
- ->StartObject("")
- ->RenderString("name", "Mark")
- ->EndObject()
- ->StartObject("")
- ->RenderString("name", "John")
- ->RenderString("address", "Patmos")
- ->EndObject()
- ->StartObject("")
- ->RenderString("name", "Luke")
- ->EndObject()
- ->EndList()
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnknownObjectAtRoot) {
- Book empty;
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnknownObjectAtAuthor) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("William");
- author->add_pseudonym("Bill");
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("wife"),
- StringPiece("Cannot find field.")))
- .With(Args<0>(HasObjectLocation("author")));
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "William")
- ->StartObject("wife")
- ->RenderString("name", "Hilary")
- ->EndObject()
- ->RenderString("pseudonym", "Bill")
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnknownListAtRoot) {
- Book empty;
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")->StartList("unknown")->EndList()->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnknownListAtPublisher) {
- Book expected;
- expected.set_title("Brainwashing");
- Publisher* publisher = expected.mutable_publisher();
- publisher->set_name("propaganda");
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("alliance"),
- StringPiece("Cannot find field.")))
- .With(Args<0>(HasObjectLocation("publisher")));
- ow_->StartObject("")
- ->StartObject("publisher")
- ->RenderString("name", "propaganda")
- ->StartList("alliance")
- ->EndList()
- ->EndObject()
- ->RenderString("title", "Brainwashing")
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownFieldAtRoot) {
- Book empty;
-
- options_.ignore_unknown_fields = true;
- ResetProtoWriter();
-
- EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
- ow_->StartObject("")->RenderString("unknown", "Nope!")->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownFieldAtAuthorFriend) {
- Book expected;
- Author* paul = expected.mutable_author();
- paul->set_name("Paul");
- Author* mark = paul->add_friend_();
- mark->set_name("Mark");
- Author* john = paul->add_friend_();
- john->set_name("John");
- Author* luke = paul->add_friend_();
- luke->set_name("Luke");
-
- options_.ignore_unknown_fields = true;
- ResetProtoWriter();
-
- EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "Paul")
- ->StartList("friend")
- ->StartObject("")
- ->RenderString("name", "Mark")
- ->EndObject()
- ->StartObject("")
- ->RenderString("name", "John")
- ->RenderString("address", "Patmos")
- ->EndObject()
- ->StartObject("")
- ->RenderString("name", "Luke")
- ->EndObject()
- ->EndList()
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownObjectAtRoot) {
- Book empty;
-
- options_.ignore_unknown_fields = true;
- ResetProtoWriter();
-
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
- .Times(0);
- ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownObjectAtAuthor) {
- Book expected;
- Author* author = expected.mutable_author();
- author->set_name("William");
- author->add_pseudonym("Bill");
-
- options_.ignore_unknown_fields = true;
- ResetProtoWriter();
-
- EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderString("name", "William")
- ->StartObject("wife")
- ->RenderString("name", "Hilary")
- ->EndObject()
- ->RenderString("pseudonym", "Bill")
- ->EndObject()
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownListAtRoot) {
- Book empty;
-
- options_.ignore_unknown_fields = true;
- ResetProtoWriter();
-
- EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
- ow_->StartObject("")->StartList("unknown")->EndList()->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, IgnoreUnknownListAtPublisher) {
- Book expected;
- expected.set_title("Brainwashing");
- Publisher* publisher = expected.mutable_publisher();
- publisher->set_name("propaganda");
-
- options_.ignore_unknown_fields = true;
- ResetProtoWriter();
-
- EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("publisher")
- ->RenderString("name", "propaganda")
- ->StartList("alliance")
- ->EndList()
- ->EndObject()
- ->RenderString("title", "Brainwashing")
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, AcceptUnknownEnumValue) {
- ResetTypeInfo(Proto3Message::descriptor());
-
- Proto3Message expected;
- expected.set_enum_value(static_cast<Proto3Message::NestedEnum>(12345));
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")
- ->RenderInt32("enumValue", 12345)
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, MissingRequiredField) {
- Book expected;
- expected.set_title("My Title");
- expected.set_allocated_publisher(new Publisher());
-
- EXPECT_CALL(listener_, MissingField(_, StringPiece("name")))
- .With(Args<0>(HasObjectLocation("publisher")));
- ow_->StartObject("")
- ->StartObject("publisher")
- ->EndObject()
- ->RenderString("title", "My Title")
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, InvalidFieldValueAtRoot) {
- Book empty;
-
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"garbage\"")))
- .With(Args<0>(HasObjectLocation("length")));
- ow_->StartObject("")->RenderString("length", "garbage")->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, MultipleInvalidFieldValues) {
- Book expected;
- expected.set_title("My Title");
-
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"-400\"")))
- .With(Args<0>(HasObjectLocation("length")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT64"),
- StringPiece("\"3.14\"")))
- .With(Args<0>(HasObjectLocation("published")));
- ow_->StartObject("")
- ->RenderString("length", "-400")
- ->RenderString("published", "3.14")
- ->RenderString("title", "My Title")
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnnamedFieldAtRoot) {
- Book empty;
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")->RenderFloat("", 3.14)->EndObject();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnnamedFieldAtAuthor) {
- Book expected;
- expected.set_title("noname");
- expected.set_allocated_author(new Author());
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
- .With(Args<0>(HasObjectLocation("author")));
- ow_->StartObject("")
- ->StartObject("author")
- ->RenderInt32("", 123)
- ->EndObject()
- ->RenderString("title", "noname")
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, UnnamedListAtRoot) {
- Book expected;
- expected.set_title("noname");
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")
- ->StartList("")
- ->EndList()
- ->RenderString("title", "noname")
- ->EndObject();
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, RootNamedObject) {
- Book expected;
- expected.set_title("Annie");
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece("oops"),
- StringPiece("Root element should not be named.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("oops")->RenderString("title", "Annie")->EndObject();
- CheckOutput(expected, 7);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, RootNamedList) {
- Book empty;
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece("oops"),
- StringPiece("Root element should not be named.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartList("oops")->RenderString("", "item")->EndList();
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, RootUnnamedField) {
- Book empty;
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Root element must be a message.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->RenderBool("", true);
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, RootNamedField) {
- Book empty;
-
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece("oops"),
- StringPiece("Root element must be a message.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->RenderBool("oops", true);
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, NullValue) {
- Book empty;
-
- ow_->RenderNull("");
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, NullValueForMessageField) {
- Book empty;
-
- ow_->RenderNull("author");
- CheckOutput(empty, 0);
-}
-
-TEST_P(ProtoStreamObjectWriterTest, NullValueForPrimitiveField) {
- Book empty;
-
- ow_->RenderNull("length");
- CheckOutput(empty, 0);
-}
-
-class ProtoStreamObjectWriterTimestampDurationTest
- : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterTimestampDurationTest() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(TimestampDuration::descriptor());
- descriptors.push_back(google::protobuf::Timestamp::descriptor());
- descriptors.push_back(google::protobuf::Duration::descriptor());
- ResetTypeInfo(descriptors);
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterTimestampDurationTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, ParseTimestamp) {
- TimestampDuration timestamp;
- google::protobuf::Timestamp* ts = timestamp.mutable_ts();
- ts->set_seconds(1448249855);
- ts->set_nanos(33155000);
-
- ow_->StartObject("")
- ->RenderString("ts", "2015-11-23T03:37:35.033155Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- ParseTimestampYearNotZeroPadded) {
- TimestampDuration timestamp;
- google::protobuf::Timestamp* ts = timestamp.mutable_ts();
- ts->set_seconds(-61665654145);
- ts->set_nanos(33155000);
-
- ow_->StartObject("")
- ->RenderString("ts", "15-11-23T03:37:35.033155Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- ParseTimestampYearZeroPadded) {
- TimestampDuration timestamp;
- google::protobuf::Timestamp* ts = timestamp.mutable_ts();
- ts->set_seconds(-61665654145);
- ts->set_nanos(33155000);
-
- ow_->StartObject("")
- ->RenderString("ts", "0015-11-23T03:37:35.033155Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- ParseTimestampWithPositiveOffset) {
- TimestampDuration timestamp;
- google::protobuf::Timestamp* ts = timestamp.mutable_ts();
- ts->set_seconds(1448249855);
- ts->set_nanos(33155000);
-
- ow_->StartObject("")
- ->RenderString("ts", "2015-11-23T11:47:35.033155+08:10")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- ParseTimestampWithNegativeOffset) {
- TimestampDuration timestamp;
- google::protobuf::Timestamp* ts = timestamp.mutable_ts();
- ts->set_seconds(1448249855);
- ts->set_nanos(33155000);
-
- ow_->StartObject("")
- ->RenderString("ts", "2015-11-22T19:47:35.033155-07:50")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- TimestampWithInvalidOffset1) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+")));
-
- ow_->StartObject("")->RenderString("ts", "2016-03-07T15:14:23+")->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- TimestampWithInvalidOffset2) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+08-10")));
-
- ow_->StartObject("")
- ->RenderString("ts", "2016-03-07T15:14:23+08-10")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- TimestampWithInvalidOffset3) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+24:10")));
-
- ow_->StartObject("")
- ->RenderString("ts", "2016-03-07T15:14:23+24:10")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- TimestampWithInvalidOffset4) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+04:60")));
-
- ow_->StartObject("")
- ->RenderString("ts", "2016-03-07T15:14:23+04:60")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError1) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: ")));
-
- ow_->StartObject("")->RenderString("ts", "")->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError2) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: Z")));
-
- ow_->StartObject("")->RenderString("ts", "Z")->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError3) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "1970-01-01T00:00:00.ABZ")));
-
- ow_->StartObject("")
- ->RenderString("ts", "1970-01-01T00:00:00.ABZ")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError4) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "-8031-10-18T00:00:00.000Z")));
-
- ow_->StartObject("")
- ->RenderString("ts", "-8031-10-18T00:00:00.000Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError5) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2015-11-23T03:37:35.033155 Z")));
-
- ow_->StartObject("")
- // Whitespace in the Timestamp nanos is not allowed.
- ->RenderString("ts", "2015-11-23T03:37:35.033155 Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError6) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2015-11-23T03:37:35.033155 1234Z")));
-
- ow_->StartObject("")
- // Whitespace in the Timestamp nanos is not allowed.
- ->RenderString("ts", "2015-11-23T03:37:35.033155 1234Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError7) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2015-11-23T03:37:35.033abc155Z")));
-
- ow_->StartObject("")
- // Non-numeric characters in the Timestamp nanos is not allowed.
- ->RenderString("ts", "2015-11-23T03:37:35.033abc155Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidTimestampError8) {
- TimestampDuration timestamp;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "0-12-31T23:59:59.000Z")));
-
- ow_->StartObject("")
- ->RenderString("ts", "0-12-31T23:59:59.000Z")
- ->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, ParseDuration) {
- TimestampDuration duration;
- google::protobuf::Duration* dur = duration.mutable_dur();
- dur->set_seconds(1448216930);
- dur->set_nanos(132262000);
-
- ow_->StartObject("")->RenderString("dur", "1448216930.132262s")->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError1) {
- TimestampDuration duration;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Illegal duration format; duration must "
- "end with 's'")));
-
- ow_->StartObject("")->RenderString("dur", "")->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError2) {
- TimestampDuration duration;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Invalid duration format, failed to parse "
- "seconds")));
-
- ow_->StartObject("")->RenderString("dur", "s")->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError3) {
- TimestampDuration duration;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Invalid duration format, failed to "
- "parse nano seconds")));
-
- ow_->StartObject("")->RenderString("dur", "123.DEFs")->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError4) {
- TimestampDuration duration;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Duration value exceeds limits")));
-
- ow_->StartObject("")->RenderString("dur", "315576000002s")->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, InvalidDurationError5) {
- TimestampDuration duration;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Duration value exceeds limits")));
-
- ow_->StartObject("")->RenderString("dur", "0.1000000001s")->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- MismatchedTimestampTypeInput) {
- TimestampDuration timestamp;
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece(
- "Field 'ts', Invalid data type for timestamp, value is 1")))
- .With(Args<0>(HasObjectLocation("ts")));
- ow_->StartObject("")->RenderInt32("ts", 1)->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest,
- MismatchedDurationTypeInput) {
- TimestampDuration duration;
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece(
- "Field 'dur', Invalid data type for duration, value is 1")))
- .With(Args<0>(HasObjectLocation("dur")));
- ow_->StartObject("")->RenderInt32("dur", 1)->EndObject();
- CheckOutput(duration);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, TimestampAcceptsNull) {
- TimestampDuration timestamp;
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")->RenderNull("ts")->EndObject();
- CheckOutput(timestamp);
-}
-
-TEST_P(ProtoStreamObjectWriterTimestampDurationTest, DurationAcceptsNull) {
- TimestampDuration duration;
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")->RenderNull("dur")->EndObject();
- CheckOutput(duration);
-}
-
-class ProtoStreamObjectWriterStructTest
- : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterStructTest() { ResetProtoWriter(); }
-
- // Resets ProtoWriter with current set of options and other state.
- void ResetProtoWriter() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(StructType::descriptor());
- descriptors.push_back(google::protobuf::Struct::descriptor());
- ResetTypeInfo(descriptors);
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterStructTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-// TODO(skarvaje): Write tests for failure cases.
-TEST_P(ProtoStreamObjectWriterStructTest, StructRenderSuccess) {
- StructType struct_type;
- google::protobuf::Struct* s = struct_type.mutable_object();
- s->mutable_fields()->operator[]("k1").set_number_value(123);
- s->mutable_fields()->operator[]("k2").set_bool_value(true);
-
- ow_->StartObject("")
- ->StartObject("object")
- ->RenderDouble("k1", 123)
- ->RenderBool("k2", true)
- ->EndObject()
- ->EndObject();
- CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, StructNullInputSuccess) {
- StructType struct_type;
- EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
- .With(Args<0>(HasObjectLocation("")));
- ow_->StartObject("")->RenderNull("")->EndObject();
- CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, StructInvalidInputFailure) {
- StructType struct_type;
- EXPECT_CALL(
- listener_,
- InvalidValue(_, StringPiece("type.googleapis.com/google.protobuf.Struct"),
- StringPiece("true")))
- .With(Args<0>(HasObjectLocation("object")));
-
- ow_->StartObject("")->RenderBool("object", true)->EndObject();
- CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, StructAcceptsNull) {
- StructType struct_type;
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-
- ow_->StartObject("")->RenderNull("object")->EndObject();
- CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, StructValuePreservesNull) {
- StructType struct_type;
- (*struct_type.mutable_object()->mutable_fields())["key"].set_null_value(
- google::protobuf::NULL_VALUE);
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-
- ow_->StartObject("")
- ->StartObject("object")
- ->RenderNull("key")
- ->EndObject()
- ->EndObject();
- CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, SimpleRepeatedStructMapKeyTest) {
- EXPECT_CALL(
- listener_,
- InvalidName(_, StringPiece("gBike"),
- StringPiece("Repeated map key: 'gBike' is already set.")));
- ow_->StartObject("")
- ->StartObject("object")
- ->RenderString("gBike", "v1")
- ->RenderString("gBike", "v2")
- ->EndObject()
- ->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, RepeatedStructMapListKeyTest) {
- EXPECT_CALL(
- listener_,
- InvalidName(_, StringPiece("k1"),
- StringPiece("Repeated map key: 'k1' is already set.")));
- ow_->StartObject("")
- ->StartObject("object")
- ->RenderString("k1", "v1")
- ->StartList("k1")
- ->RenderString("", "v2")
- ->EndList()
- ->EndObject()
- ->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, RepeatedStructMapObjectKeyTest) {
- EXPECT_CALL(
- listener_,
- InvalidName(_, StringPiece("k1"),
- StringPiece("Repeated map key: 'k1' is already set.")));
- ow_->StartObject("")
- ->StartObject("object")
- ->StartObject("k1")
- ->RenderString("sub_k1", "v1")
- ->EndObject()
- ->StartObject("k1")
- ->RenderString("sub_k2", "v2")
- ->EndObject()
- ->EndObject()
- ->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, OptionStructIntAsStringsTest) {
- StructType struct_type;
- google::protobuf::Struct* s = struct_type.mutable_object();
- s->mutable_fields()->operator[]("k1").set_number_value(123);
- s->mutable_fields()->operator[]("k2").set_bool_value(true);
- s->mutable_fields()->operator[]("k3").set_string_value("-222222222");
- s->mutable_fields()->operator[]("k4").set_string_value("33333333");
-
- options_.struct_integers_as_strings = true;
- ResetProtoWriter();
-
- ow_->StartObject("")
- ->StartObject("object")
- ->RenderDouble("k1", 123)
- ->RenderBool("k2", true)
- ->RenderInt64("k3", -222222222)
- ->RenderUint64("k4", 33333333)
- ->EndObject()
- ->EndObject();
- CheckOutput(struct_type);
-}
-
-TEST_P(ProtoStreamObjectWriterStructTest, ValuePreservesNull) {
- ValueWrapper value;
- value.mutable_value()->set_null_value(google::protobuf::NULL_VALUE);
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")->RenderNull("value")->EndObject();
- CheckOutput(value);
-}
-
-class ProtoStreamObjectWriterMapTest : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterMapTest()
- : BaseProtoStreamObjectWriterTest(MapIn::descriptor()) {}
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterMapTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterMapTest, MapShouldNotAcceptList) {
- MapIn mm;
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("Map"),
- StringPiece("Cannot bind a list to map for field 'map_input'.")));
- ow_->StartObject("")
- ->StartList("map_input")
- ->RenderString("a", "b")
- ->EndList()
- ->EndObject();
- CheckOutput(mm);
-}
-
-TEST_P(ProtoStreamObjectWriterMapTest, RepeatedMapKeyTest) {
- EXPECT_CALL(
- listener_,
- InvalidName(_, StringPiece("k1"),
- StringPiece("Repeated map key: 'k1' is already set.")));
- ow_->StartObject("")
- ->RenderString("other", "test")
- ->StartObject("map_input")
- ->RenderString("k1", "v1")
- ->RenderString("k1", "v2")
- ->EndObject()
- ->EndObject();
-}
-
-class ProtoStreamObjectWriterAnyTest : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterAnyTest() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(AnyOut::descriptor());
- descriptors.push_back(Book::descriptor());
- descriptors.push_back(google::protobuf::Any::descriptor());
- descriptors.push_back(google::protobuf::DoubleValue::descriptor());
- descriptors.push_back(google::protobuf::FieldMask::descriptor());
- descriptors.push_back(google::protobuf::Int32Value::descriptor());
- descriptors.push_back(google::protobuf::Struct::descriptor());
- descriptors.push_back(google::protobuf::Timestamp::descriptor());
- descriptors.push_back(google::protobuf::Value::descriptor());
- ResetTypeInfo(descriptors);
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterAnyTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyRenderSuccess) {
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.DoubleValue");
- google::protobuf::DoubleValue d;
- d.set_value(40.2);
- any_type->set_value(d.SerializeAsString());
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.DoubleValue")
- ->RenderDouble("value", 40.2)
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, RecursiveAny) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
- any->set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ::google::protobuf::Any nested_any;
- nested_any.set_type_url("type.googleapis.com/google.protobuf.testing.AnyM");
-
- AnyM m;
- m.set_foo("foovalue");
- nested_any.set_value(m.SerializeAsString());
-
- any->set_value(nested_any.SerializeAsString());
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->StartObject("value")
- ->RenderString("@type",
- "type.googleapis.com/google.protobuf.testing.AnyM")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(out, 107);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, DoubleRecursiveAny) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
- any->set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ::google::protobuf::Any nested_any;
- nested_any.set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ::google::protobuf::Any second_nested_any;
- second_nested_any.set_type_url(
- "type.googleapis.com/google.protobuf.testing.AnyM");
-
- AnyM m;
- m.set_foo("foovalue");
- second_nested_any.set_value(m.SerializeAsString());
-
- nested_any.set_value(second_nested_any.SerializeAsString());
- any->set_value(nested_any.SerializeAsString());
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->StartObject("value")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->StartObject("value")
- ->RenderString("@type",
- "type.googleapis.com/google.protobuf.testing.AnyM")
- ->RenderString("foo", "foovalue")
- ->EndObject()
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(out, 151);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEnd) {
- Book book;
- book.set_title("C++");
- book.set_length(1234);
- book.set_content("Hello World!");
-
- ::google::protobuf::Any any;
- any.PackFrom(book);
-
- ::google::protobuf::Any outer_any;
- outer_any.PackFrom(any);
-
- AnyOut out;
- out.mutable_any()->PackFrom(outer_any);
-
- // Put the @type field at the end of each Any message. Parsers should
- // be able to accept that.
- ow_->StartObject("")
- ->StartObject("any")
- ->StartObject("value")
- ->StartObject("value")
- ->RenderString("title", "C++")
- ->RenderInt32("length", 1234)
- ->RenderBytes("content", "Hello World!")
- ->RenderString("@type",
- "type.googleapis.com/google.protobuf.testing.Book")
- ->EndObject()
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->EndObject()
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// Same as TypeUrlAtEnd, but use temporary string values to make sure we don't
-// mistakenly store StringPiece objects pointing to invalid memory.
-TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEndWithTemporaryStrings) {
- Book book;
- book.set_title("C++");
- book.set_length(1234);
- book.set_content("Hello World!");
-
- ::google::protobuf::Any any;
- any.PackFrom(book);
-
- ::google::protobuf::Any outer_any;
- outer_any.PackFrom(any);
-
- AnyOut out;
- out.mutable_any()->PackFrom(outer_any);
-
- string name, value;
- // Put the @type field at the end of each Any message. Parsers should
- // be able to accept that.
- ow_->StartObject("")->StartObject("any");
- {
- ow_->StartObject("value");
- {
- ow_->StartObject("value");
- {
- name = "title";
- value = "C++";
- ow_->RenderString(name, value);
- name = "length";
- ow_->RenderInt32(name, 1234);
- name = "content";
- value = "Hello World!";
- ow_->RenderBytes(name, value);
- name = "@type";
- value = "type.googleapis.com/google.protobuf.testing.Book";
- ow_->RenderString(name, value);
- }
- ow_->EndObject();
-
- name = "@type";
- value = "type.googleapis.com/google.protobuf.Any";
- ow_->RenderString(name, value);
- }
- ow_->EndObject();
-
- name = "@type";
- value = "type.googleapis.com/google.protobuf.Any";
- ow_->RenderString(name, value);
- }
- ow_->EndObject()->EndObject();
- CheckOutput(out);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, EmptyAnyFromEmptyObject) {
- AnyOut out;
- out.mutable_any();
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-
- ow_->StartObject("")->StartObject("any")->EndObject()->EndObject();
-
- CheckOutput(out, 2);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails1) {
- AnyOut any;
-
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Missing @type for any field in "
- "google.protobuf.testing.AnyOut")));
-
- ow_->StartObject("")
- ->StartObject("any")
- ->StartObject("another")
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails2) {
- AnyOut any;
-
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Missing @type for any field in "
- "google.protobuf.testing.AnyOut")));
-
- ow_->StartObject("")
- ->StartObject("any")
- ->StartList("another")
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithoutTypeUrlFails3) {
- AnyOut any;
-
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Missing @type for any field in "
- "google.protobuf.testing.AnyOut")));
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("value", "somevalue")
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithInvalidTypeUrlFails) {
- AnyOut any;
-
- EXPECT_CALL(listener_,
- InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Invalid type URL, type URLs must be of the form "
- "'type.googleapis.com/<typename>', got: "
- "type.other.com/some.Type")));
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.other.com/some.Type")
- ->RenderDouble("value", 40.2)
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithUnknownTypeFails) {
- AnyOut any;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Invalid type URL, unknown type: some.Type")));
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/some.Type")
- ->RenderDouble("value", 40.2)
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyIncorrectInputTypeFails) {
- AnyOut any;
-
- EXPECT_CALL(
- listener_,
- InvalidValue(_, StringPiece("type.googleapis.com/google.protobuf.Any"),
- StringPiece("1")));
- ow_->StartObject("")->RenderInt32("any", 1)->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyAcceptsNull) {
- AnyOut any;
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")->RenderNull("any")->EndObject();
- CheckOutput(any);
-}
-
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypeErrorTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"),
- StringPiece("Invalid time format: ")));
-
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.Timestamp");
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Timestamp")
- ->RenderString("value", "")
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Value",
-// "value": "abc"
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithNestedPrimitiveValue) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
-
- ::google::protobuf::Value value;
- value.set_string_value("abc");
- any->PackFrom(value);
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Value")
- ->RenderString("value", "abc")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Value",
-// "value": {
-// "foo": "abc"
-// }
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithNestedObjectValue) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
-
- ::google::protobuf::Value value;
- (*value.mutable_struct_value()->mutable_fields())["foo"].set_string_value(
- "abc");
- any->PackFrom(value);
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Value")
- ->StartObject("value")
- ->RenderString("foo", "abc")
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Value",
-// "value": ["hello"],
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWithNestedArrayValue) {
- AnyOut out;
- ::google::protobuf::Any* any = out.mutable_any();
-
- ::google::protobuf::Value value;
- value.mutable_list_value()->add_values()->set_string_value("hello");
- any->PackFrom(value);
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Value")
- ->StartList("value")
- ->RenderString("", "hello")
- ->EndList()
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Value",
-// "not_value": ""
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest,
- AnyWellKnownTypesNoValueFieldForPrimitive) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Expect a \"value\" field for well-known types.")));
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.Value");
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Value")
- ->RenderString("not_value", "")
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Value",
-// "not_value": {}
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesNoValueFieldForObject) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Expect a \"value\" field for well-known types.")));
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.Value");
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Value")
- ->StartObject("not_value")
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Value",
-// "not_value": [],
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesNoValueFieldForArray) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Expect a \"value\" field for well-known types.")));
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.Value");
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Value")
- ->StartList("not_value")
- ->EndList()
- ->EndObject()
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Struct",
-// "value": "",
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesExpectObjectForStruct) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"),
- StringPiece("Expect a JSON object.")));
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.Struct");
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Struct")
- ->RenderString("value", "")
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-// Test the following case:
-//
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Any",
-// "value": "",
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesExpectObjectForAny) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"),
- StringPiece("Expect a JSON object.")));
- AnyOut any;
- google::protobuf::Any* any_type = any.mutable_any();
- any_type->set_type_url("type.googleapis.com/google.protobuf.Any");
-
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->RenderString("value", "")
- ->EndObject()
- ->EndObject();
- CheckOutput(any);
-}
-
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Any",
-// "value": null
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, AnyInAnyAcceptsNull) {
- AnyOut out;
- google::protobuf::Any empty;
- out.mutable_any()->PackFrom(empty);
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Any")
- ->RenderNull("value")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Timestamp",
-// "value": null
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, TimestampInAnyAcceptsNull) {
- AnyOut out;
- google::protobuf::Timestamp empty;
- out.mutable_any()->PackFrom(empty);
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Timestamp")
- ->RenderNull("value")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Duration",
-// "value": null
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, DurationInAnyAcceptsNull) {
- AnyOut out;
- google::protobuf::Duration empty;
- out.mutable_any()->PackFrom(empty);
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Duration")
- ->RenderNull("value")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.FieldMask",
-// "value": null
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, FieldMaskInAnyAcceptsNull) {
- AnyOut out;
- google::protobuf::FieldMask empty;
- out.mutable_any()->PackFrom(empty);
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.FieldMask")
- ->RenderNull("value")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-// {
-// "any": {
-// "@type": "type.googleapis.com/google.protobuf.Int32Value",
-// "value": null
-// }
-// }
-TEST_P(ProtoStreamObjectWriterAnyTest, WrapperInAnyAcceptsNull) {
- AnyOut out;
- google::protobuf::Int32Value empty;
- out.mutable_any()->PackFrom(empty);
-
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")
- ->StartObject("any")
- ->RenderString("@type", "type.googleapis.com/google.protobuf.Int32Value")
- ->RenderNull("value")
- ->EndObject()
- ->EndObject();
- CheckOutput(out);
-}
-
-class ProtoStreamObjectWriterFieldMaskTest
- : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterFieldMaskTest() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(FieldMaskTest::descriptor());
- descriptors.push_back(google::protobuf::FieldMask::descriptor());
- ResetTypeInfo(descriptors);
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterFieldMaskTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, SimpleFieldMaskTest) {
- FieldMaskTest expected;
- expected.set_id("1");
- expected.mutable_single_mask()->add_paths("path1");
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- ow_->RenderString("single_mask", "path1");
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MutipleMasksInCompactForm) {
- FieldMaskTest expected;
- expected.set_id("1");
- expected.mutable_single_mask()->add_paths("camel_case1");
- expected.mutable_single_mask()->add_paths("camel_case2");
- expected.mutable_single_mask()->add_paths("camel_case3");
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- ow_->RenderString("single_mask", "camelCase1,camelCase2,camelCase3");
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, RepeatedFieldMaskTest) {
- FieldMaskTest expected;
- expected.set_id("1");
- google::protobuf::FieldMask* mask = expected.add_repeated_mask();
- mask->add_paths("field1");
- mask->add_paths("field2");
- expected.add_repeated_mask()->add_paths("field3");
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- ow_->StartList("repeated_mask");
- ow_->RenderString("", "field1,field2");
- ow_->RenderString("", "field3");
- ow_->EndList();
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, EmptyFieldMaskTest) {
- FieldMaskTest expected;
- expected.set_id("1");
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- ow_->RenderString("single_mask", "");
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MaskUsingApiaryStyleShouldWork) {
- FieldMaskTest expected;
- expected.set_id("1");
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- // Case1
- ow_->RenderString("single_mask",
- "outerField(camelCase1,camelCase2,camelCase3)");
- expected.mutable_single_mask()->add_paths("outer_field.camel_case1");
- expected.mutable_single_mask()->add_paths("outer_field.camel_case2");
- expected.mutable_single_mask()->add_paths("outer_field.camel_case3");
-
- ow_->StartList("repeated_mask");
-
- ow_->RenderString("", "a(field1,field2)");
- google::protobuf::FieldMask* mask = expected.add_repeated_mask();
- mask->add_paths("a.field1");
- mask->add_paths("a.field2");
-
- ow_->RenderString("", "a(field3)");
- mask = expected.add_repeated_mask();
- mask->add_paths("a.field3");
-
- ow_->RenderString("", "a()");
- expected.add_repeated_mask();
-
- ow_->RenderString("", "a(,)");
- expected.add_repeated_mask();
-
- ow_->RenderString("", "a(field1(field2(field3)))");
- mask = expected.add_repeated_mask();
- mask->add_paths("a.field1.field2.field3");
-
- ow_->RenderString("", "a(field1(field2(field3,field4),field5),field6)");
- mask = expected.add_repeated_mask();
- mask->add_paths("a.field1.field2.field3");
- mask->add_paths("a.field1.field2.field4");
- mask->add_paths("a.field1.field5");
- mask->add_paths("a.field6");
-
- ow_->RenderString("", "a(id,field1(id,field2(field3,field4),field5),field6)");
- mask = expected.add_repeated_mask();
- mask->add_paths("a.id");
- mask->add_paths("a.field1.id");
- mask->add_paths("a.field1.field2.field3");
- mask->add_paths("a.field1.field2.field4");
- mask->add_paths("a.field1.field5");
- mask->add_paths("a.field6");
-
- ow_->RenderString("", "a(((field3,field4)))");
- mask = expected.add_repeated_mask();
- mask->add_paths("a.field3");
- mask->add_paths("a.field4");
-
- ow_->EndList();
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MoreCloseThanOpenParentheses) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask 'a(b,c))'. "
- "Cannot find matching '(' for all ')'.")));
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- ow_->RenderString("single_mask", "a(b,c))");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MoreOpenThanCloseParentheses) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece(
- "Field 'single_mask', Invalid FieldMask 'a(((b,c)'. Cannot "
- "find matching ')' for all '('.")));
-
- ow_->StartObject("");
- ow_->RenderString("id", "1");
- ow_->RenderString("single_mask", "a(((b,c)");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, PathWithMapKeyShouldWork) {
- FieldMaskTest expected;
- expected.mutable_single_mask()->add_paths("path.to.map[\"key1\"]");
- expected.mutable_single_mask()->add_paths(
- "path.to.map[\"e\\\"[]][scape\\\"\"]");
- expected.mutable_single_mask()->add_paths("path.to.map[\"key2\"]");
-
- ow_->StartObject("");
- ow_->RenderString("single_mask",
- "path.to.map[\"key1\"],path.to.map[\"e\\\"[]][scape\\\"\"],"
- "path.to.map[\"key2\"]");
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest,
- MapKeyMustBeAtTheEndOfAPathSegment) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask "
- "'path.to.map[\"key1\"]a,path.to.map[\"key2\"]'. "
- "Map keys should be at the end of a path segment.")));
-
- ow_->StartObject("");
- ow_->RenderString("single_mask",
- "path.to.map[\"key1\"]a,path.to.map[\"key2\"]");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MapKeyMustEnd) {
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask "
- "'path.to.map[\"key1\"'. Map keys should be "
- "represented as [\"some_key\"].")));
-
- ow_->StartObject("");
- ow_->RenderString("single_mask", "path.to.map[\"key1\"");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MapKeyMustBeEscapedCorrectly) {
- EXPECT_CALL(
- listener_,
- InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask "
- "'path.to.map[\"ke\"y1\"]'. Map keys should be "
- "represented as [\"some_key\"].")));
-
- ow_->StartObject("");
- ow_->RenderString("single_mask", "path.to.map[\"ke\"y1\"]");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, MapKeyCanContainAnyChars) {
- FieldMaskTest expected;
- expected.mutable_single_mask()->add_paths(
- // \xE5\xAD\x99 is the UTF-8 byte sequence for chinese character 孙.
- // We cannot embed non-ASCII characters in the code directly because
- // some windows compilers will try to interpret them using the system's
- // current encoding and end up with invalid UTF-8 byte sequence.
- "path.to.map[\"(),[],\\\"'!@#$%^&*123_|War\xE5\xAD\x99,./?><\\\\\"]");
- expected.mutable_single_mask()->add_paths("path.to.map[\"key2\"]");
-
- ow_->StartObject("");
- ow_->RenderString(
- "single_mask",
- "path.to.map[\"(),[],\\\"'!@#$%^&*123_|War\xE5\xAD\x99,./?><\\\\\"],"
- "path.to.map[\"key2\"]");
- ow_->EndObject();
-
- CheckOutput(expected);
-}
-
-TEST_P(ProtoStreamObjectWriterFieldMaskTest, FieldMaskAcceptsNull) {
- FieldMaskTest expected;
- EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
- ow_->StartObject("")->RenderNull("single_mask")->EndObject();
- CheckOutput(expected);
-}
-
-class ProtoStreamObjectWriterWrappersTest
- : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterWrappersTest() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(Int32Wrapper::descriptor());
- descriptors.push_back(google::protobuf::Int32Value::descriptor());
- ResetTypeInfo(descriptors);
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterWrappersTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterWrappersTest, WrapperAcceptsNull) {
- Int32Wrapper wrapper;
- EXPECT_CALL(listener_, InvalidName(_, _, _)).Times(0);
- ow_->StartObject("")->RenderNull("int32")->EndObject();
- CheckOutput(wrapper);
-}
-
-class ProtoStreamObjectWriterOneOfsTest
- : public BaseProtoStreamObjectWriterTest {
- protected:
- ProtoStreamObjectWriterOneOfsTest() {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(OneOfsRequest::descriptor());
- descriptors.push_back(google::protobuf::Struct::descriptor());
- ResetTypeInfo(descriptors);
- }
-};
-
-INSTANTIATE_TEST_CASE_P(DifferentTypeInfoSourceTest,
- ProtoStreamObjectWriterOneOfsTest,
- ::testing::Values(
- testing::USE_TYPE_RESOLVER));
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForPrimitiveTypesTest) {
- EXPECT_CALL(
- listener_,
- InvalidValue(
- _, StringPiece("oneof"),
- StringPiece(
- "oneof field 'data' is already set. Cannot set 'intData'")));
-
- ow_->StartObject("");
- ow_->RenderString("strData", "blah");
- ow_->RenderString("intData", "123");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForMessageTypesPrimitiveFirstTest) {
- // Test for setting primitive oneof field first and then message field.
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'messageData'")));
-
- // JSON: { "strData": "blah", "messageData": { "dataValue": 123 } }
- ow_->StartObject("");
- ow_->RenderString("strData", "blah");
- ow_->StartObject("messageData");
- ow_->RenderInt32("dataValue", 123);
- ow_->EndObject();
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForMessageTypesMessageFirstTest) {
- // Test for setting message oneof field first and then primitive field.
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'strData'")));
-
- // JSON: { "messageData": { "dataValue": 123 }, "strData": "blah" }
- ow_->StartObject("");
- ow_->StartObject("messageData");
- ow_->RenderInt32("dataValue", 123);
- ow_->EndObject();
- ow_->RenderString("strData", "blah");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForStructTypesPrimitiveFirstTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'structData'")));
-
- // JSON: { "strData": "blah", "structData": { "a": "b" } }
- ow_->StartObject("");
- ow_->RenderString("strData", "blah");
- ow_->StartObject("structData");
- ow_->RenderString("a", "b");
- ow_->EndObject();
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForStructTypesStructFirstTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'strData'")));
-
- // JSON: { "structData": { "a": "b" }, "strData": "blah" }
- ow_->StartObject("");
- ow_->StartObject("structData");
- ow_->RenderString("a", "b");
- ow_->EndObject();
- ow_->RenderString("strData", "blah");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForStructValueTypesTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'valueData'")));
-
- // JSON: { "messageData": { "dataValue": 123 }, "valueData": { "a": "b" } }
- ow_->StartObject("");
- ow_->StartObject("messageData");
- ow_->RenderInt32("dataValue", 123);
- ow_->EndObject();
- ow_->StartObject("valueData");
- ow_->RenderString("a", "b");
- ow_->EndObject();
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForWellKnownTypesPrimitiveFirstTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'tsData'")));
-
- // JSON: { "intData": 123, "tsData": "1970-01-02T01:00:00.000Z" }
- ow_->StartObject("");
- ow_->RenderInt32("intData", 123);
- ow_->RenderString("tsData", "1970-01-02T01:00:00.000Z");
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForWellKnownTypesWktFirstTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'intData'")));
-
- // JSON: { "tsData": "1970-01-02T01:00:00.000Z", "intData": 123 }
- ow_->StartObject("");
- ow_->RenderString("tsData", "1970-01-02T01:00:00.000Z");
- ow_->RenderInt32("intData", 123);
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForWellKnownTypesAndMessageTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'messageData'")));
-
- // JSON: { "tsData": "1970-01-02T01:00:00.000Z",
- // "messageData": { "dataValue": 123 } }
- ow_->StartObject("");
- ow_->RenderString("tsData", "1970-01-02T01:00:00.000Z");
- ow_->StartObject("messageData");
- ow_->RenderInt32("dataValue", 123);
- ow_->EndObject();
- ow_->EndObject();
-}
-
-TEST_P(ProtoStreamObjectWriterOneOfsTest,
- MultipleOneofsFailForOneofWithinAnyTest) {
- EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("oneof"),
- StringPiece("oneof field 'data' is already set. "
- "Cannot set 'intData'")));
-
- // JSON:
- // { "anyData":
- // { "@type":
- // "type.googleapis.com/google.protobuf.testing.oneofs.OneOfsRequest",
- // "strData": "blah",
- // "intData": 123
- // }
- // }
- ow_->StartObject("");
- ow_->StartObject("anyData");
- ow_->RenderString(
- "@type",
- "type.googleapis.com/google.protobuf.testing.oneofs.OneOfsRequest");
- ow_->RenderString("strData", "blah");
- ow_->RenderInt32("intData", 123);
- ow_->EndObject();
- ow_->EndObject();
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h
deleted file mode 100644
index 3f065d6b1c..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/structured_objectwriter.h
+++ /dev/null
@@ -1,118 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_STRUCTURED_OBJECTWRITER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_STRUCTURED_OBJECTWRITER_H__
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/object_writer.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// An StructuredObjectWriter is an ObjectWriter for writing
-// tree-structured data in a stream of events representing objects
-// and collections. Implementation of this interface can be used to
-// write an object stream to an in-memory structure, protobufs,
-// JSON, XML, or any other output format desired. The ObjectSource
-// interface is typically used as the source of an object stream.
-//
-// See JsonObjectWriter for a sample implementation of
-// StructuredObjectWriter and its use.
-//
-// Derived classes could be thread-unsafe.
-class LIBPROTOBUF_EXPORT StructuredObjectWriter : public ObjectWriter {
- public:
- virtual ~StructuredObjectWriter() {}
-
- protected:
- // A base element class for subclasses to extend, makes tracking state easier.
- //
- // StructuredObjectWriter behaves as a visitor. BaseElement represents a node
- // in the input tree. Implementation of StructuredObjectWriter should also
- // extend BaseElement to keep track of the location in the input tree.
- class LIBPROTOBUF_EXPORT BaseElement {
- public:
- // Takes ownership of the parent Element.
- explicit BaseElement(BaseElement* parent)
- : parent_(parent), level_(parent == NULL ? 0 : parent->level() + 1) {}
- virtual ~BaseElement() {}
-
- // Releases ownership of the parent and returns a pointer to it.
- template <typename ElementType>
- ElementType* pop() {
- return down_cast<ElementType*>(parent_.release());
- }
-
- // Returns true if this element is the root.
- bool is_root() const { return parent_ == NULL; }
-
- // Returns the number of hops from this element to the root element.
- int level() const { return level_; }
-
- protected:
- // Returns pointer to parent element without releasing ownership.
- virtual BaseElement* parent() const { return parent_.get(); }
-
- private:
- // Pointer to the parent Element.
- google::protobuf::scoped_ptr<BaseElement> parent_;
-
- // Number of hops to the root Element.
- // The root Element has NULL parent_ and a level_ of 0.
- const int level_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(BaseElement);
- };
-
- StructuredObjectWriter() {}
-
- // Returns the current element. Used for indentation and name overrides.
- virtual BaseElement* element() = 0;
-
- private:
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StructuredObjectWriter);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_STRUCTURED_OBJECTWRITER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto
deleted file mode 100644
index a9ebca3d43..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/anys.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-import "google/protobuf/any.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/duration.proto";
-import "google/protobuf/wrappers.proto";
-
-// Top-level test cases proto used by MarshallingTest. See description
-// at the top of the class MarshallingTest for details on how to write
-// test cases.
-message AnyTestCases {
- AnyWrapper empty_any = 1;
- AnyWrapper type_only_any = 2;
- AnyWrapper wrapper_any = 3;
- AnyWrapper any_with_timestamp_value = 4;
- AnyWrapper any_with_duration_value = 5;
- AnyWrapper any_with_struct_value = 6;
- AnyWrapper recursive_any = 7;
- AnyWrapper any_with_message_value = 8;
- AnyWrapper any_with_nested_message = 9;
- AnyWrapper any_with_message_with_wrapper_type = 10;
- AnyWrapper any_with_message_with_timestamp = 11;
- AnyWrapper any_with_message_containing_map = 12;
- AnyWrapper any_with_message_containing_struct = 13;
- AnyWrapper any_with_message_containing_repeated_message = 14;
- AnyWrapper recursive_any_with_type_field_at_end = 15;
-
- google.protobuf.Any top_level_any = 50;
- google.protobuf.Any top_level_any_with_type_field_at_end = 51;
-}
-
-message AnyWrapper {
- google.protobuf.Any any = 1;
-}
-
-// Hack to make sure the types we put into the any are included in the types.
-// Real solution is to add these types to the service config.
-message Imports {
- google.protobuf.DoubleValue dbl = 1;
- google.protobuf.Struct struct = 2;
- google.protobuf.Timestamp timestamp = 3;
- google.protobuf.Duration duration = 4;
- google.protobuf.Int32Value i32 = 5;
- Data data = 100;
-}
-
-message Data {
- int32 attr = 1;
- string str = 2;
- repeated string msgs = 3;
- Data nested_data = 4;
- google.protobuf.Int32Value int_wrapper = 5;
- google.protobuf.Timestamp time = 6;
- map<string, string> map_data = 7;
- google.protobuf.Struct struct_data = 8;
- repeated Data repeated_data = 9;
-}
-
-service AnyTestService {
- rpc Call(AnyTestCases) returns (AnyTestCases);
- rpc Call1(Imports) returns (Imports);
-}
-
-message AnyIn {
- string something = 1;
- google.protobuf.Any any = 2;
-}
-
-message AnyOut {
- google.protobuf.Any any = 1;
-}
-
-message AnyM {
- string foo = 1;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto
deleted file mode 100644
index 9fe4f7aa8c..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/books.proto
+++ /dev/null
@@ -1,192 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Author: sven@google.com (Sven Mawson)
-//
-// Sample protos for testing.
-
-// Some of the older enums don't use CAPITALS_WITH_UNDERSCORES for testing.
-// LINT: LEGACY_NAMES
-
-syntax = "proto2";
-
-package google.protobuf.testing;
-
-// A book
-message Book {
- optional string title = 1;
- optional Author author = 2;
- optional uint32 length = 3;
- optional int64 published = 4;
- optional bytes content = 5;
-
- optional group Data = 6 {
- optional uint32 year = 7;
- optional string copyright = 8;
- }
-
- message Label {
- optional string key = 1;
- optional string value = 2;
- }
-
- optional Publisher publisher = 9;
- repeated Label labels = 10;
-
- enum Type {
- FICTION = 1;
- KIDS = 2;
- ACTION_AND_ADVENTURE = 3;
- arts_and_photography = 4;
- }
- optional Type type = 11;
-
- extensions 200 to 499;
-}
-
-// A publisher of a book, tests required fields.
-message Publisher {
- required string name = 1;
-}
-
-// An author of a book
-message Author {
- optional uint64 id = 1 [json_name = "@id"];
- optional string name = 2;
- repeated string pseudonym = 3;
- optional bool alive = 4;
- repeated Author friend = 5;
-}
-
-// For testing resiliency of our protostream parser.
-// Field numbers of Author are reused for something else.
-message BadAuthor {
- optional string id = 1; // non-length-delimited to length-delimited.
- repeated uint64 name = 2; // string to repeated (both length-delimited).
- optional string pseudonym = 3; // Repeated to optional.
- repeated bool alive = 4 [packed=true]; // Optional to repeated.
-}
-
-// All primitive types
-message Primitive {
- // 32 bit numbers:
- optional fixed32 fix32 = 1;
- optional uint32 u32 = 2;
- optional int32 i32 = 3;
- optional sfixed32 sf32 = 4;
- optional sint32 s32 = 5;
-
- // 64 bit numbers:
- optional fixed64 fix64 = 6;
- optional uint64 u64 = 7;
- optional int64 i64 = 8;
- optional sfixed64 sf64 = 9;
- optional sint64 s64 = 10;
-
- // The other stuff.
- optional string str = 11;
- optional bytes bytes = 12;
- optional float float = 13;
- optional double double = 14;
- optional bool bool = 15;
-
- // repeated 32 bit numbers:
- repeated fixed32 rep_fix32 = 16;
- repeated uint32 rep_u32 = 17;
- repeated int32 rep_i32 = 18;
- repeated sfixed32 rep_sf32 = 19;
- repeated sint32 rep_s32 = 20;
-
- // repeated 64 bit numbers:
- repeated fixed64 rep_fix64 = 21;
- repeated uint64 rep_u64 = 22;
- repeated int64 rep_i64 = 23;
- repeated sfixed64 rep_sf64 = 24;
- repeated sint64 rep_s64 = 25;
-
- // repeated other stuff:
- repeated string rep_str = 26;
- repeated bytes rep_bytes = 27;
- repeated float rep_float = 28;
- repeated double rep_double = 29;
- repeated bool rep_bool = 30;
-}
-
-// Test packed versions of all repeated primitives.
-// The field numbers should match their non-packed version in Primitive message.
-message PackedPrimitive {
- // repeated 32 bit numbers:
- repeated fixed32 rep_fix32 = 16 [packed=true];
- repeated uint32 rep_u32 = 17 [packed=true];
- repeated int32 rep_i32 = 18 [packed=true];
- repeated sfixed32 rep_sf32 = 19 [packed=true];
- repeated sint32 rep_s32 = 20 [packed=true];
-
- // repeated 64 bit numbers:
- repeated fixed64 rep_fix64 = 21 [packed=true];
- repeated uint64 rep_u64 = 22 [packed=true];
- repeated int64 rep_i64 = 23 [packed=true];
- repeated sfixed64 rep_sf64 = 24 [packed=true];
- repeated sint64 rep_s64 = 25 [packed=true];
-
- // repeated other stuff:
- repeated float rep_float = 28 [packed=true];
- repeated double rep_double = 29 [packed=true];
- repeated bool rep_bool = 30 [packed=true];
-}
-
-// Test extensions.
-extend Book {
- repeated Author more_author = 201;
-}
-
-// Test nested extensions.
-message NestedBook {
- extend Book {
- optional NestedBook another_book = 301;
- }
- // Recurse
- optional Book book = 1;
-}
-
-// For testing resiliency of our protostream parser.
-// Field number of NestedBook is reused for something else.
-message BadNestedBook {
- repeated uint32 book = 1 [packed=true]; // Packed to optional message.
-}
-
-// A recursively defined message.
-message Cyclic {
- optional int32 m_int = 1;
- optional string m_str = 2;
- optional Book m_book = 3;
- repeated Author m_author = 5;
- optional Cyclic m_cyclic = 4;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto
deleted file mode 100644
index cccc741c2d..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value.proto
+++ /dev/null
@@ -1,170 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-import "google/protobuf/any.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/wrappers.proto";
-
-message DefaultValueTestCases {
- DoubleMessage empty_double = 1;
- DoubleMessage double_with_default_value = 2;
- DoubleMessage double_with_nondefault_value = 3;
- DoubleMessage repeated_double = 4;
- DoubleMessage nested_message = 5;
- DoubleMessage repeated_nested_message = 6;
- DoubleMessage double_message_with_oneof = 7;
- StructMessage empty_struct = 201;
- StructMessage empty_struct2 = 202;
- StructMessage struct_with_null_value = 203;
- StructMessage struct_with_values = 204;
- StructMessage struct_with_nested_struct = 205;
- StructMessage struct_with_nested_list = 206;
- StructMessage struct_with_list_of_nulls = 207;
- StructMessage struct_with_list_of_lists = 208;
- StructMessage struct_with_list_of_structs = 209;
- google.protobuf.Struct top_level_struct = 210;
- ValueMessage value_wrapper_simple = 212;
- ValueMessage value_wrapper_with_struct = 213;
- ValueMessage value_wrapper_with_list = 214;
- ListValueMessage list_value_wrapper = 215;
- google.protobuf.Value top_level_value_simple = 216;
- google.protobuf.Value top_level_value_with_struct = 217;
- google.protobuf.Value top_level_value_with_list = 218;
- google.protobuf.ListValue top_level_listvalue = 219;
- AnyMessage empty_any = 301;
- AnyMessage type_only_any = 302;
- AnyMessage recursive_any = 303;
- AnyMessage any_with_message_value = 304;
- AnyMessage any_with_nested_message = 305;
- AnyMessage any_with_message_containing_map = 306;
- AnyMessage any_with_message_containing_struct = 307;
- google.protobuf.Any top_level_any = 308;
- StringtoIntMap empty_map = 401;
- StringtoIntMap string_to_int = 402;
- IntToStringMap int_to_string = 403;
- MixedMap mixed1 = 404;
- MixedMap2 mixed2 = 405;
- MixedMap2 empty_mixed2 = 406;
- MessageMap map_of_objects = 407;
- MixedMap mixed_empty = 408;
- MessageMap message_map_empty = 409;
- DoubleValueMessage double_value = 501;
- DoubleValueMessage double_value_default = 502;
-}
-
-message DoubleMessage {
- double double_value = 1;
- repeated double repeated_double = 2;
- DoubleMessage nested_message = 3;
- repeated DoubleMessage repeated_nested_message = 4;
- google.protobuf.DoubleValue double_wrapper = 100;
- oneof value {
- string str_value = 112;
- int64 num_value = 113;
- }
-}
-
-message StructMessage {
- google.protobuf.Struct struct = 1;
-}
-
-message ValueMessage {
- google.protobuf.Value value = 1;
-}
-
-message ListValueMessage {
- google.protobuf.ListValue shopping_list = 1;
-}
-message RequestMessage {
- string content = 1;
-}
-
-// A test service.
-service DefaultValueTestService {
- // A test method.
- rpc Call(RequestMessage) returns (DefaultValueTestCases);
-}
-
-message AnyMessage {
- google.protobuf.Any any = 1;
- AnyData data = 2;
-}
-
-message AnyData {
- int32 attr = 1;
- string str = 2;
- repeated string msgs = 3;
- AnyData nested_data = 4;
- map<string, string> map_data = 7;
- google.protobuf.Struct struct_data = 8;
- repeated AnyData repeated_data = 9;
-}
-
-message StringtoIntMap {
- map<string, int32> map = 1;
-}
-
-message IntToStringMap {
- map<int32, string> map = 1;
-}
-
-message MixedMap {
- string msg = 1;
- map<string, float> map = 2;
- int32 int_value = 3;
-}
-
-message MixedMap2 {
- enum E {
- E0 = 0;
- E1 = 1;
- E2 = 2;
- E3 = 3;
- }
- map<int32, bool> map = 1;
- E ee = 2;
- string msg = 4;
-}
-
-message MessageMap {
- message M {
- int32 inner_int = 1;
- string inner_text = 2;
- }
- map<string, M> map = 1;
-}
-
-message DoubleValueMessage {
- google.protobuf.DoubleValue double = 1;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto
deleted file mode 100644
index 932883410e..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/default_value_test.proto
+++ /dev/null
@@ -1,53 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-message DefaultValueTest {
- double double_value = 1;
- repeated double repeated_double = 2;
- float float_value = 3;
- int64 int64_value = 5;
- uint64 uint64_value = 7;
- int32 int32_value = 9;
- uint32 uint32_value = 11;
- bool bool_value = 13;
- string string_value = 15;
- bytes bytes_value = 17 [ctype = CORD];
-
- enum EnumDefault {
- ENUM_FIRST = 0;
- ENUM_SECOND = 1;
- ENUM_THIRD = 2;
- }
- EnumDefault enum_value = 18;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto
deleted file mode 100644
index e8b2bc5f2e..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/field_mask.proto
+++ /dev/null
@@ -1,71 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-import "google/protobuf/field_mask.proto";
-
-message NestedFieldMask {
- string data = 1;
- google.protobuf.FieldMask single_mask = 2;
- repeated google.protobuf.FieldMask repeated_mask = 3;
-}
-
-message FieldMaskTest {
- string id = 1;
- google.protobuf.FieldMask single_mask = 2;
- repeated google.protobuf.FieldMask repeated_mask = 3;
- repeated NestedFieldMask nested_mask = 4;
-}
-
-message FieldMaskTestCases {
- FieldMaskWrapper single_mask = 1;
- FieldMaskWrapper multiple_mask = 2;
- FieldMaskWrapper snake_camel = 3;
- FieldMaskWrapper empty_field = 4;
- FieldMaskWrapper apiary_format1 = 5;
- FieldMaskWrapper apiary_format2 = 6;
- FieldMaskWrapper apiary_format3 = 7;
- FieldMaskWrapper map_key1 = 8;
- FieldMaskWrapper map_key2 = 9;
- FieldMaskWrapper map_key3 = 10;
- FieldMaskWrapper map_key4 = 11;
- FieldMaskWrapper map_key5 = 12;
-}
-
-message FieldMaskWrapper {
- google.protobuf.FieldMask mask = 1;
-}
-
-service FieldMaskTestService {
- rpc Call(FieldMaskTestCases) returns (FieldMaskTestCases);
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto
deleted file mode 100644
index 0f381b320b..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/maps.proto
+++ /dev/null
@@ -1,146 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-// Top-level test cases proto used by MarshallingTest. See description
-// at the top of the class MarshallingTest for details on how to write
-// test cases.
-message MapsTestCases {
- EmptyMap empty_map = 1;
- StringtoInt string_to_int = 2;
- IntToString int_to_string = 3;
- Mixed1 mixed1 = 4;
- Mixed2 mixed2 = 5;
- MapOfObjects map_of_objects = 6;
-
- // Empty key tests
- StringtoInt empty_key_string_to_int1 = 7;
- StringtoInt empty_key_string_to_int2 = 8;
- StringtoInt empty_key_string_to_int3 = 9;
- BoolToString empty_key_bool_to_string = 10;
- IntToString empty_key_int_to_string = 11;
- Mixed1 empty_key_mixed = 12;
- MapOfObjects empty_key_map_objects = 13;
-}
-
-message EmptyMap {
- map<int32, int32> map = 1;
-}
-
-message StringtoInt {
- map<string, int32> map = 1;
-}
-
-message IntToString {
- map<int32, string> map = 1;
-}
-
-message BoolToString {
- map<bool, string> map = 1;
-}
-
-message Mixed1 {
- string msg = 1;
- map<string, float> map = 2;
-}
-
-message Mixed2 {
- enum E {
- E0 = 0;
- E1 = 1;
- E2 = 2;
- E3 = 3;
- }
- map<int32, bool> map = 1;
- E ee = 2;
-}
-
-message MapOfObjects {
- message M {
- string inner_text = 1;
- }
- map<string, M> map = 1;
-}
-
-message DummyRequest {
-}
-
-service MapsTestService {
- rpc Call(DummyRequest) returns (MapsTestCases);
-}
-
-message MapIn {
- string other = 1;
- repeated string things = 2;
- map<string, string> map_input = 3;
-}
-
-message MapOut {
- map<string, MapM> map1 = 1;
- map<string, MapOut> map2 = 2;
- map<int32, string> map3 = 3;
- map<bool, string> map4 = 5;
- string bar = 4;
-}
-
-// A message with exactly the same wire representation as MapOut, but using
-// repeated message fields instead of map fields. We use this message to test
-// the wire-format compatibility of the JSON transcoder (e.g., whether it
-// handles missing keys correctly).
-message MapOutWireFormat {
- message Map1Entry {
- string key = 1;
- MapM value = 2;
- }
- repeated Map1Entry map1 = 1;
- message Map2Entry {
- string key = 1;
- MapOut value = 2;
- }
- repeated Map2Entry map2 = 2;
- message Map3Entry {
- int32 key = 1;
- string value = 2;
- }
- repeated Map3Entry map3 = 3;
- message Map4Entry {
- bool key = 1;
- string value = 2;
- }
- repeated Map4Entry map4 = 5;
- string bar = 4;
-}
-
-message MapM {
- string foo = 1;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto
deleted file mode 100644
index c37da08316..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/oneofs.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Proto to test proto3 oneofs.
-syntax = "proto3";
-
-import "google/protobuf/any.proto";
-import "google/protobuf/struct.proto";
-import "google/protobuf/timestamp.proto";
-
-package google.protobuf.testing.oneofs;
-
-message OneOfsRequest {
- string value = 1;
- oneof data {
- string str_data = 2;
- int32 int_data = 3;
- // Simple message
- Data message_data = 4;
- MoreData more_data = 5;
- // Well known types
- google.protobuf.Struct struct_data = 6;
- google.protobuf.Value value_data = 7;
- google.protobuf.ListValue list_value_data = 8;
- google.protobuf.Timestamp ts_data = 9;
- }
- google.protobuf.Any any_data = 19;
-}
-
-message RequestWithSimpleOneof {
- string value = 1;
- oneof data {
- string str_data = 2;
- int32 int_data = 3;
- Data message_data = 4;
- MoreData more_data = 5;
- }
-}
-
-message Data {
- int32 data_value = 1;
-}
-
-message MoreData {
- string str_value = 1;
-}
-
-message Response {
- string value = 1;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto
deleted file mode 100644
index c013cee31e..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/proto3.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-message Proto3Message {
- enum NestedEnum {
- FOO = 0;
- BAR = 1;
- BAZ = 2;
- }
- NestedEnum enum_value = 1;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto
deleted file mode 100644
index 7b1cc1b954..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/struct.proto
+++ /dev/null
@@ -1,117 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-import "google/protobuf/struct.proto";
-
-message StructTestCases {
- StructWrapper empty_value = 1;
- StructWrapper empty_value2 = 2;
- StructWrapper null_value = 3;
- StructWrapper simple_struct = 4;
- StructWrapper longer_struct = 5;
- StructWrapper struct_with_nested_struct = 6;
- StructWrapper struct_with_nested_list = 7;
- StructWrapper struct_with_list_of_nulls = 8;
- StructWrapper struct_with_list_of_lists = 9;
- StructWrapper struct_with_list_of_structs = 10;
- StructWrapper struct_with_empty_list = 11;
- StructWrapper struct_with_list_with_empty_struct = 12;
- google.protobuf.Struct top_level_struct = 13;
- google.protobuf.Struct top_level_struct_with_empty_list = 14;
- google.protobuf.Struct top_level_struct_with_list_with_empty_struct = 15;
- ValueWrapper value_wrapper_simple = 16;
- ValueWrapper value_wrapper_with_struct = 17;
- ValueWrapper value_wrapper_with_list = 18;
- ValueWrapper value_wrapper_with_empty_list = 19;
- ValueWrapper value_wrapper_with_list_with_empty_struct = 20;
- ListValueWrapper list_value_wrapper = 21;
- ListValueWrapper list_value_wrapper_with_empty_list = 22;
- ListValueWrapper list_value_wrapper_with_list_with_empty_struct = 23;
- google.protobuf.Value top_level_value_simple = 24;
- google.protobuf.Value top_level_value_with_struct = 25;
- google.protobuf.Value top_level_value_with_list = 26;
- google.protobuf.Value top_level_value_with_empty_list = 27;
- google.protobuf.Value top_level_value_with_list_with_empty_struct = 28;
- google.protobuf.ListValue top_level_listvalue = 29;
- google.protobuf.ListValue top_level_empty_listvalue = 30;
- google.protobuf.ListValue top_level_listvalue_with_empty_struct = 31;
- RepeatedValueWrapper repeated_value = 32;
- RepeatedValueWrapper repeated_value_nested_list = 33;
- RepeatedValueWrapper repeated_value_nested_list2 = 34;
- RepeatedValueWrapper repeated_value_nested_list3 = 35;
- RepeatedListValueWrapper repeated_listvalue = 36;
- MapOfStruct map_of_struct = 37;
- MapOfStruct map_of_struct_value = 38;
- MapOfStruct map_of_listvalue = 39;
-}
-
-message StructWrapper {
- google.protobuf.Struct struct = 1;
-}
-
-message ValueWrapper {
- google.protobuf.Value value = 1;
-}
-
-message RepeatedValueWrapper {
- repeated google.protobuf.Value values = 1;
-}
-
-message ListValueWrapper {
- google.protobuf.ListValue shopping_list = 1;
-}
-
-message RepeatedListValueWrapper {
- repeated google.protobuf.ListValue dimensions = 1;
-}
-
-message MapOfStruct {
- map<string, google.protobuf.Struct> struct_map = 1;
- map<string, google.protobuf.Value> value_map = 2;
- map<string, google.protobuf.ListValue> listvalue_map = 3;
-}
-
-// Hack to test return types with Struct as top-level message. Struct typers
-// cannot be directly used in API requests. Hence using Dummy as request type.
-message Dummy {
- string text = 1;
-}
-
-service StructTestService {
- rpc Call(Dummy) returns (StructTestCases);
-}
-
-message StructType {
- google.protobuf.Struct object = 1;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
deleted file mode 100644
index b74484ce58..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
+++ /dev/null
@@ -1,80 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/duration.proto";
-
-message TimestampDurationTestCases {
- // Timestamp tests
- TimeStampType epoch = 1;
- TimeStampType epoch2 = 2;
- TimeStampType mintime = 3;
- TimeStampType maxtime = 4;
- TimeStampType timeval1 = 5;
- TimeStampType timeval2 = 6;
- TimeStampType timeval3 = 7;
- TimeStampType timeval4 = 8;
- TimeStampType timeval5 = 9;
- TimeStampType timeval6 = 10;
- TimeStampType timeval7 = 11;
- google.protobuf.Timestamp timeval8 = 12;
-
- // Duration tests
- DurationType zero_duration = 101;
- DurationType min_duration = 102;
- DurationType max_duration = 103;
- DurationType duration1 = 104;
- DurationType duration2 = 105;
- DurationType duration3 = 106;
- DurationType duration4 = 107;
- google.protobuf.Duration duration5 = 108;
-}
-
-message TimeStampType {
- google.protobuf.Timestamp timestamp = 1;
-}
-
-message DurationType {
- google.protobuf.Duration duration = 1;
-}
-
-service TimestampDurationTestService {
- rpc Call(TimestampDurationTestCases) returns (TimestampDurationTestCases);
-}
-
-message TimestampDuration {
- google.protobuf.Timestamp ts = 1;
- google.protobuf.Duration dur = 2;
- repeated google.protobuf.Timestamp rep_ts = 3;
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto
deleted file mode 100644
index eabc99f245..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/testdata/wrappers.proto
+++ /dev/null
@@ -1,100 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package google.protobuf.testing;
-
-import "google/protobuf/wrappers.proto";
-
-// Top-level test cases proto used by MarshallingTest. See description
-// at the top of the class MarshallingTest for details on how to write
-// test cases.
-message WrappersTestCases {
- DoubleWrapper double_wrapper = 1;
- FloatWrapper float_wrapper = 2;
- Int64Wrapper int64_wrapper = 3;
- UInt64Wrapper uint64_wrapper = 4;
- Int32Wrapper int32_wrapper = 5;
- UInt32Wrapper uint32_wrapper = 6;
- BoolWrapper bool_wrapper = 7;
- StringWrapper string_wrapper = 8;
- BytesWrapper bytes_wrapper = 9;
-
- DoubleWrapper double_wrapper_default = 10;
- FloatWrapper float_wrapper_default = 11;
- Int64Wrapper int64_wrapper_default = 12;
- UInt64Wrapper uint64_wrapper_default = 13;
- Int32Wrapper int32_wrapper_default = 14;
- UInt32Wrapper uint32_wrapper_default = 15;
- BoolWrapper bool_wrapper_default = 16;
- StringWrapper string_wrapper_default = 17;
- BytesWrapper bytes_wrapper_default = 18;
-}
-
-message DoubleWrapper {
- google.protobuf.DoubleValue double = 1;
-}
-
-message FloatWrapper {
- google.protobuf.FloatValue float = 1;
-}
-
-message Int64Wrapper {
- google.protobuf.Int64Value int64 = 1;
-}
-
-message UInt64Wrapper {
- google.protobuf.UInt64Value uint64 = 1;
-}
-
-message Int32Wrapper {
- google.protobuf.Int32Value int32 = 1;
-}
-
-message UInt32Wrapper {
- google.protobuf.UInt32Value uint32 = 1;
-}
-
-message BoolWrapper {
- google.protobuf.BoolValue bool = 1;
-}
-
-message StringWrapper {
- google.protobuf.StringValue string = 1;
-}
-
-message BytesWrapper {
- google.protobuf.BytesValue bytes = 1;
-}
-
-service WrappersTestService {
- rpc Call(WrappersTestCases) returns (WrappersTestCases);
-}
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc
deleted file mode 100644
index 17d5847555..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.cc
+++ /dev/null
@@ -1,173 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/type_info.h>
-
-#include <map>
-#include <set>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-namespace {
-// A TypeInfo that looks up information provided by a TypeResolver.
-class TypeInfoForTypeResolver : public TypeInfo {
- public:
- explicit TypeInfoForTypeResolver(TypeResolver* type_resolver)
- : type_resolver_(type_resolver) {}
-
- virtual ~TypeInfoForTypeResolver() {
- DeleteCachedTypes(&cached_types_);
- DeleteCachedTypes(&cached_enums_);
- }
-
- virtual util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
- StringPiece type_url) const {
- std::map<StringPiece, StatusOrType>::iterator it =
- cached_types_.find(type_url);
- if (it != cached_types_.end()) {
- return it->second;
- }
- // Stores the string value so it can be referenced using StringPiece in the
- // cached_types_ map.
- const string& string_type_url =
- *string_storage_.insert(type_url.ToString()).first;
- google::protobuf::scoped_ptr<google::protobuf::Type> type(new google::protobuf::Type());
- util::Status status =
- type_resolver_->ResolveMessageType(string_type_url, type.get());
- StatusOrType result =
- status.ok() ? StatusOrType(type.release()) : StatusOrType(status);
- cached_types_[string_type_url] = result;
- return result;
- }
-
- virtual const google::protobuf::Type* GetTypeByTypeUrl(
- StringPiece type_url) const {
- StatusOrType result = ResolveTypeUrl(type_url);
- return result.ok() ? result.ValueOrDie() : NULL;
- }
-
- virtual const google::protobuf::Enum* GetEnumByTypeUrl(
- StringPiece type_url) const {
- std::map<StringPiece, StatusOrEnum>::iterator it =
- cached_enums_.find(type_url);
- if (it != cached_enums_.end()) {
- return it->second.ok() ? it->second.ValueOrDie() : NULL;
- }
- // Stores the string value so it can be referenced using StringPiece in the
- // cached_enums_ map.
- const string& string_type_url =
- *string_storage_.insert(type_url.ToString()).first;
- google::protobuf::scoped_ptr<google::protobuf::Enum> enum_type(
- new google::protobuf::Enum());
- util::Status status =
- type_resolver_->ResolveEnumType(string_type_url, enum_type.get());
- StatusOrEnum result =
- status.ok() ? StatusOrEnum(enum_type.release()) : StatusOrEnum(status);
- cached_enums_[string_type_url] = result;
- return result.ok() ? result.ValueOrDie() : NULL;
- }
-
- virtual const google::protobuf::Field* FindField(
- const google::protobuf::Type* type, StringPiece camel_case_name) const {
- if (indexed_types_.find(type) == indexed_types_.end()) {
- PopulateNameLookupTable(type);
- indexed_types_.insert(type);
- }
- StringPiece name =
- FindWithDefault(camel_case_name_table_, camel_case_name, StringPiece());
- if (name.empty()) {
- // Didn't find a mapping. Use whatever provided.
- name = camel_case_name;
- }
- return FindFieldInTypeOrNull(type, name);
- }
-
- private:
- typedef util::StatusOr<const google::protobuf::Type*> StatusOrType;
- typedef util::StatusOr<const google::protobuf::Enum*> StatusOrEnum;
-
- template <typename T>
- static void DeleteCachedTypes(std::map<StringPiece, T>* cached_types) {
- for (typename std::map<StringPiece, T>::iterator it = cached_types->begin();
- it != cached_types->end(); ++it) {
- if (it->second.ok()) {
- delete it->second.ValueOrDie();
- }
- }
- }
-
- void PopulateNameLookupTable(const google::protobuf::Type* type) const {
- for (int i = 0; i < type->fields_size(); ++i) {
- const google::protobuf::Field& field = type->fields(i);
- StringPiece name = field.name();
- StringPiece camel_case_name = field.json_name();
- const StringPiece* existing = InsertOrReturnExisting(
- &camel_case_name_table_, camel_case_name, name);
- if (existing && *existing != name) {
- GOOGLE_LOG(WARNING) << "Field '" << name << "' and '" << *existing
- << "' map to the same camel case name '" << camel_case_name
- << "'.";
- }
- }
- }
-
- TypeResolver* type_resolver_;
-
- // Stores string values that will be referenced by StringPieces in
- // cached_types_, cached_enums_ and camel_case_name_table_.
- mutable std::set<string> string_storage_;
-
- mutable std::map<StringPiece, StatusOrType> cached_types_;
- mutable std::map<StringPiece, StatusOrEnum> cached_enums_;
-
- mutable std::set<const google::protobuf::Type*> indexed_types_;
- mutable std::map<StringPiece, StringPiece> camel_case_name_table_;
-};
-} // namespace
-
-TypeInfo* TypeInfo::NewTypeInfo(TypeResolver* type_resolver) {
- return new TypeInfoForTypeResolver(type_resolver);
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h
deleted file mode 100644
index d81331763a..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_H__
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-// Internal helper class for type resolving. Note that this class is not
-// thread-safe and should only be accessed in one thread.
-class LIBPROTOBUF_EXPORT TypeInfo {
- public:
- TypeInfo() {}
- virtual ~TypeInfo() {}
-
- // Resolves a type url into a Type. If the type url is invalid, returns
- // INVALID_ARGUMENT error status. If the type url is valid but the
- // corresponding type cannot be found, returns a NOT_FOUND error status.
- //
- // This TypeInfo class retains the ownership of the returned pointer.
- virtual util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
- StringPiece type_url) const = 0;
-
- // Resolves a type url into a Type. Like ResolveTypeUrl() but returns
- // NULL if the type url is invalid or the type cannot be found.
- //
- // This TypeInfo class retains the ownership of the returned pointer.
- virtual const google::protobuf::Type* GetTypeByTypeUrl(
- StringPiece type_url) const = 0;
-
- // Resolves a type url for an enum. Returns NULL if the type url is
- // invalid or the type cannot be found.
- //
- // This TypeInfo class retains the ownership of the returned pointer.
- virtual const google::protobuf::Enum* GetEnumByTypeUrl(
- StringPiece type_url) const = 0;
-
- // Looks up a field in the specified type given a CamelCase name.
- virtual const google::protobuf::Field* FindField(
- const google::protobuf::Type* type,
- StringPiece camel_case_name) const = 0;
-
- // Creates a TypeInfo object that looks up type information from a
- // TypeResolver. Caller takes ownership of the returned pointer.
- static TypeInfo* NewTypeInfo(TypeResolver* type_resolver);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeInfo);
-};
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc
deleted file mode 100644
index 737ba9e475..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/type_info_test_helper.h>
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <vector>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/util/type_resolver_util.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-namespace testing {
-
-
-void TypeInfoTestHelper::ResetTypeInfo(
- const std::vector<const Descriptor*>& descriptors) {
- switch (type_) {
- case USE_TYPE_RESOLVER: {
- const DescriptorPool* pool = descriptors[0]->file()->pool();
- for (int i = 1; i < descriptors.size(); ++i) {
- GOOGLE_CHECK(pool == descriptors[i]->file()->pool())
- << "Descriptors from different pools are not supported.";
- }
- type_resolver_.reset(
- NewTypeResolverForDescriptorPool(kTypeServiceBaseUrl, pool));
- typeinfo_.reset(TypeInfo::NewTypeInfo(type_resolver_.get()));
- return;
- }
- }
- GOOGLE_LOG(FATAL) << "Can not reach here.";
-}
-
-void TypeInfoTestHelper::ResetTypeInfo(const Descriptor* descriptor) {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(descriptor);
- ResetTypeInfo(descriptors);
-}
-
-void TypeInfoTestHelper::ResetTypeInfo(const Descriptor* descriptor1,
- const Descriptor* descriptor2) {
- std::vector<const Descriptor*> descriptors;
- descriptors.push_back(descriptor1);
- descriptors.push_back(descriptor2);
- ResetTypeInfo(descriptors);
-}
-
-TypeInfo* TypeInfoTestHelper::GetTypeInfo() { return typeinfo_.get(); }
-
-ProtoStreamObjectSource* TypeInfoTestHelper::NewProtoSource(
- io::CodedInputStream* coded_input, const string& type_url) {
- const google::protobuf::Type* type = typeinfo_->GetTypeByTypeUrl(type_url);
- switch (type_) {
- case USE_TYPE_RESOLVER: {
- return new ProtoStreamObjectSource(coded_input, type_resolver_.get(),
- *type);
- }
- }
- GOOGLE_LOG(FATAL) << "Can not reach here.";
- return NULL;
-}
-
-ProtoStreamObjectWriter* TypeInfoTestHelper::NewProtoWriter(
- const string& type_url, strings::ByteSink* output, ErrorListener* listener,
- const ProtoStreamObjectWriter::Options& options) {
- const google::protobuf::Type* type = typeinfo_->GetTypeByTypeUrl(type_url);
- switch (type_) {
- case USE_TYPE_RESOLVER: {
- return new ProtoStreamObjectWriter(type_resolver_.get(), *type, output,
- listener, options);
- }
- }
- GOOGLE_LOG(FATAL) << "Can not reach here.";
- return NULL;
-}
-
-DefaultValueObjectWriter* TypeInfoTestHelper::NewDefaultValueWriter(
- const string& type_url, ObjectWriter* writer) {
- const google::protobuf::Type* type = typeinfo_->GetTypeByTypeUrl(type_url);
- switch (type_) {
- case USE_TYPE_RESOLVER: {
- return new DefaultValueObjectWriter(type_resolver_.get(), *type, writer);
- }
- }
- GOOGLE_LOG(FATAL) << "Can not reach here.";
- return NULL;
-}
-
-} // namespace testing
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h
deleted file mode 100644
index 1a1967156b..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/type_info_test_helper.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_TEST_HELPER_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_TEST_HELPER_H__
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <vector>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-#include <google/protobuf/util/type_resolver.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-namespace testing {
-
-enum TypeInfoSource {
- USE_TYPE_RESOLVER,
-};
-
-// In the unit-tests we want to test two scenarios: one with type info from
-// ServiceTypeInfo, the other with type info from TypeResolver. This class
-// wraps the detail of where the type info is from and provides the same
-// interface so the same unit-test code can test both scenarios.
-class TypeInfoTestHelper {
- public:
- explicit TypeInfoTestHelper(TypeInfoSource type) : type_(type) {}
-
- // Creates a TypeInfo object for the given set of descriptors.
- void ResetTypeInfo(const std::vector<const Descriptor*>& descriptors);
-
- // Convinent overloads.
- void ResetTypeInfo(const Descriptor* descriptor);
- void ResetTypeInfo(const Descriptor* descriptor1,
- const Descriptor* descriptor2);
-
- // Returns the TypeInfo created after ResetTypeInfo.
- TypeInfo* GetTypeInfo();
-
- ProtoStreamObjectSource* NewProtoSource(io::CodedInputStream* coded_input,
- const string& type_url);
-
- ProtoStreamObjectWriter* NewProtoWriter(
- const string& type_url, strings::ByteSink* output,
- ErrorListener* listener, const ProtoStreamObjectWriter::Options& options);
-
- DefaultValueObjectWriter* NewDefaultValueWriter(const string& type_url,
- ObjectWriter* writer);
-
- private:
- TypeInfoSource type_;
- google::protobuf::scoped_ptr<TypeInfo> typeinfo_;
- google::protobuf::scoped_ptr<TypeResolver> type_resolver_;
-};
-} // namespace testing
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_TYPE_INFO_TEST_HELPER_H__
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc
deleted file mode 100644
index 6daf24eb56..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.cc
+++ /dev/null
@@ -1,416 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/utility.h>
-
-#include <algorithm>
-
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/wrappers.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/mathlimits.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-namespace {
-const StringPiece SkipWhiteSpace(StringPiece str) {
- StringPiece::size_type i;
- for (i = 0; i < str.size() && isspace(str[i]); ++i) {
- }
- GOOGLE_DCHECK(i == str.size() || !isspace(str[i]));
- return str.substr(i);
-}
-} // namespace
-
-bool GetBoolOptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, bool default_value) {
- const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
- if (opt == NULL) {
- return default_value;
- }
- return GetBoolFromAny(opt->value());
-}
-
-int64 GetInt64OptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, int64 default_value) {
- const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
- if (opt == NULL) {
- return default_value;
- }
- return GetInt64FromAny(opt->value());
-}
-
-double GetDoubleOptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, double default_value) {
- const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
- if (opt == NULL) {
- return default_value;
- }
- return GetDoubleFromAny(opt->value());
-}
-
-string GetStringOptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, const string& default_value) {
- const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
- if (opt == NULL) {
- return default_value;
- }
- return GetStringFromAny(opt->value());
-}
-
-template <typename T>
-void ParseFromAny(const string& data, T* result) {
- result->ParseFromString(data);
-}
-
-// Returns a boolean value contained in Any type.
-// TODO(skarvaje): Add type checking & error messages here.
-bool GetBoolFromAny(const google::protobuf::Any& any) {
- google::protobuf::BoolValue b;
- ParseFromAny(any.value(), &b);
- return b.value();
-}
-
-int64 GetInt64FromAny(const google::protobuf::Any& any) {
- google::protobuf::Int64Value i;
- ParseFromAny(any.value(), &i);
- return i.value();
-}
-
-double GetDoubleFromAny(const google::protobuf::Any& any) {
- google::protobuf::DoubleValue i;
- ParseFromAny(any.value(), &i);
- return i.value();
-}
-
-string GetStringFromAny(const google::protobuf::Any& any) {
- google::protobuf::StringValue s;
- ParseFromAny(any.value(), &s);
- return s.value();
-}
-
-const StringPiece GetTypeWithoutUrl(StringPiece type_url) {
- if (type_url.size() > kTypeUrlSize && type_url[kTypeUrlSize] == '/') {
- return type_url.substr(kTypeUrlSize + 1);
- } else {
- size_t idx = type_url.rfind('/');
- return type_url.substr(idx + 1);
- }
-}
-
-const string GetFullTypeWithUrl(StringPiece simple_type) {
- return StrCat(kTypeServiceBaseUrl, "/", simple_type);
-}
-
-const google::protobuf::Option* FindOptionOrNull(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name) {
- for (int i = 0; i < options.size(); ++i) {
- const google::protobuf::Option& opt = options.Get(i);
- if (opt.name() == option_name) {
- return &opt;
- }
- }
- return NULL;
-}
-
-const google::protobuf::Field* FindFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece field_name) {
- if (type != NULL) {
- for (int i = 0; i < type->fields_size(); ++i) {
- const google::protobuf::Field& field = type->fields(i);
- if (field.name() == field_name) {
- return &field;
- }
- }
- }
- return NULL;
-}
-
-const google::protobuf::Field* FindJsonFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece json_name) {
- if (type != NULL) {
- for (int i = 0; i < type->fields_size(); ++i) {
- const google::protobuf::Field& field = type->fields(i);
- if (field.json_name() == json_name) {
- return &field;
- }
- }
- }
- return NULL;
-}
-
-const google::protobuf::Field* FindFieldInTypeByNumberOrNull(
- const google::protobuf::Type* type, int32 number) {
- if (type != NULL) {
- for (int i = 0; i < type->fields_size(); ++i) {
- const google::protobuf::Field& field = type->fields(i);
- if (field.number() == number) {
- return &field;
- }
- }
- }
- return NULL;
-}
-
-const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name) {
- if (enum_type != NULL) {
- for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
- const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
- if (enum_value.name() == enum_name) {
- return &enum_value;
- }
- }
- }
- return NULL;
-}
-
-const google::protobuf::EnumValue* FindEnumValueByNumberOrNull(
- const google::protobuf::Enum* enum_type, int32 value) {
- if (enum_type != NULL) {
- for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
- const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
- if (enum_value.number() == value) {
- return &enum_value;
- }
- }
- }
- return NULL;
-}
-
-const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name) {
- if (enum_type != NULL) {
- for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
- const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
- string enum_name_without_underscore = enum_value.name();
-
- // Remove underscore from the name.
- enum_name_without_underscore.erase(
- std::remove(enum_name_without_underscore.begin(),
- enum_name_without_underscore.end(), '_'),
- enum_name_without_underscore.end());
- // Make the name uppercase.
- for (string::iterator it = enum_name_without_underscore.begin();
- it != enum_name_without_underscore.end(); ++it) {
- *it = ascii_toupper(*it);
- }
-
- if (enum_name_without_underscore == enum_name) {
- return &enum_value;
- }
- }
- }
- return NULL;
-}
-
-string ToCamelCase(const StringPiece input) {
- bool capitalize_next = false;
- bool was_cap = true;
- bool is_cap = false;
- bool first_word = true;
- string result;
- result.reserve(input.size());
-
- for (size_t i = 0; i < input.size(); ++i, was_cap = is_cap) {
- is_cap = ascii_isupper(input[i]);
- if (input[i] == '_') {
- capitalize_next = true;
- if (!result.empty()) first_word = false;
- continue;
- } else if (first_word) {
- // Consider when the current character B is capitalized,
- // first word ends when:
- // 1) following a lowercase: "...aB..."
- // 2) followed by a lowercase: "...ABc..."
- if (!result.empty() && is_cap &&
- (!was_cap || (i + 1 < input.size() && ascii_islower(input[i + 1])))) {
- first_word = false;
- result.push_back(input[i]);
- } else {
- result.push_back(ascii_tolower(input[i]));
- continue;
- }
- } else if (capitalize_next) {
- capitalize_next = false;
- if (ascii_islower(input[i])) {
- result.push_back(ascii_toupper(input[i]));
- continue;
- } else {
- result.push_back(input[i]);
- continue;
- }
- } else {
- result.push_back(ascii_tolower(input[i]));
- }
- }
- return result;
-}
-
-string ToSnakeCase(StringPiece input) {
- bool was_not_underscore = false; // Initialize to false for case 1 (below)
- bool was_not_cap = false;
- string result;
- result.reserve(input.size() << 1);
-
- for (size_t i = 0; i < input.size(); ++i) {
- if (ascii_isupper(input[i])) {
- // Consider when the current character B is capitalized:
- // 1) At beginning of input: "B..." => "b..."
- // (e.g. "Biscuit" => "biscuit")
- // 2) Following a lowercase: "...aB..." => "...a_b..."
- // (e.g. "gBike" => "g_bike")
- // 3) At the end of input: "...AB" => "...ab"
- // (e.g. "GoogleLAB" => "google_lab")
- // 4) Followed by a lowercase: "...ABc..." => "...a_bc..."
- // (e.g. "GBike" => "g_bike")
- if (was_not_underscore && // case 1 out
- (was_not_cap || // case 2 in, case 3 out
- (i + 1 < input.size() && // case 3 out
- ascii_islower(input[i + 1])))) { // case 4 in
- // We add an underscore for case 2 and case 4.
- result.push_back('_');
- }
- result.push_back(ascii_tolower(input[i]));
- was_not_underscore = true;
- was_not_cap = false;
- } else {
- result.push_back(input[i]);
- was_not_underscore = input[i] != '_';
- was_not_cap = true;
- }
- }
- return result;
-}
-
-std::set<string>* well_known_types_ = NULL;
-GOOGLE_PROTOBUF_DECLARE_ONCE(well_known_types_init_);
-const char* well_known_types_name_array_[] = {
- "google.protobuf.Timestamp", "google.protobuf.Duration",
- "google.protobuf.DoubleValue", "google.protobuf.FloatValue",
- "google.protobuf.Int64Value", "google.protobuf.UInt64Value",
- "google.protobuf.Int32Value", "google.protobuf.UInt32Value",
- "google.protobuf.BoolValue", "google.protobuf.StringValue",
- "google.protobuf.BytesValue", "google.protobuf.FieldMask"};
-
-void DeleteWellKnownTypes() { delete well_known_types_; }
-
-void InitWellKnownTypes() {
- well_known_types_ = new std::set<string>;
- for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) {
- well_known_types_->insert(well_known_types_name_array_[i]);
- }
- google::protobuf::internal::OnShutdown(&DeleteWellKnownTypes);
-}
-
-bool IsWellKnownType(const string& type_name) {
- InitWellKnownTypes();
- return ContainsKey(*well_known_types_, type_name);
-}
-
-bool IsValidBoolString(const string& bool_string) {
- return bool_string == "true" || bool_string == "false" ||
- bool_string == "1" || bool_string == "0";
-}
-
-bool IsMap(const google::protobuf::Field& field,
- const google::protobuf::Type& type) {
- return field.cardinality() ==
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED &&
- (GetBoolOptionOrDefault(type.options(), "map_entry", false) ||
- GetBoolOptionOrDefault(type.options(),
- "google.protobuf.MessageOptions.map_entry", false) ||
- GetBoolOptionOrDefault(type.options(),
- "google.protobuf.MessageOptions.map_entry",
- false));
-}
-
-bool IsMessageSetWireFormat(const google::protobuf::Type& type) {
- return GetBoolOptionOrDefault(type.options(), "message_set_wire_format",
- false) ||
- GetBoolOptionOrDefault(type.options(),
- "google.protobuf.MessageOptions.message_set_wire_format",
- false) ||
- GetBoolOptionOrDefault(
- type.options(),
- "google.protobuf.MessageOptions.message_set_wire_format", false);
-}
-
-string DoubleAsString(double value) {
- if (MathLimits<double>::IsPosInf(value)) return "Infinity";
- if (MathLimits<double>::IsNegInf(value)) return "-Infinity";
- if (MathLimits<double>::IsNaN(value)) return "NaN";
-
- return SimpleDtoa(value);
-}
-
-string FloatAsString(float value) {
- if (MathLimits<float>::IsFinite(value)) return SimpleFtoa(value);
- return DoubleAsString(value);
-}
-
-bool SafeStrToFloat(StringPiece str, float* value) {
- double double_value;
- if (!safe_strtod(str, &double_value)) {
- return false;
- }
-
- if (MathLimits<double>::IsInf(double_value) ||
- MathLimits<double>::IsNaN(double_value))
- return false;
-
- // Fail if the value is not representable in float.
- if (double_value > std::numeric_limits<float>::max() ||
- double_value < -std::numeric_limits<float>::max()) {
- return false;
- }
-
- *value = static_cast<float>(double_value);
- return true;
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h b/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h
deleted file mode 100644
index 667e660c58..0000000000
--- a/third_party/protobuf/3.2.0/src/google/protobuf/util/internal/utility.h
+++ /dev/null
@@ -1,208 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__
-#define GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__
-
-#include <memory>
-#ifndef _SHARED_PTR_H
-#include <google/protobuf/stubs/shared_ptr.h>
-#endif
-#include <string>
-#include <utility>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
-
-
-namespace google {
-namespace protobuf {
-class Method;
-class Any;
-class Bool;
-class Option;
-class Field;
-class Type;
-class Enum;
-class EnumValue;
-} // namespace protobuf
-
-
-namespace protobuf {
-namespace util {
-namespace converter {
-
-// Size of "type.googleapis.com"
-static const int64 kTypeUrlSize = 19;
-
-// Finds the tech option identified by option_name. Parses the boolean value and
-// returns it.
-// When the option with the given name is not found, default_value is returned.
-LIBPROTOBUF_EXPORT bool GetBoolOptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, bool default_value);
-
-// Returns int64 option value. If the option isn't found, returns the
-// default_value.
-LIBPROTOBUF_EXPORT int64 GetInt64OptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, int64 default_value);
-
-// Returns double option value. If the option isn't found, returns the
-// default_value.
-LIBPROTOBUF_EXPORT double GetDoubleOptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, double default_value);
-
-// Returns string option value. If the option isn't found, returns the
-// default_value.
-LIBPROTOBUF_EXPORT string GetStringOptionOrDefault(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name, const string& default_value);
-
-// Returns a boolean value contained in Any type.
-// TODO(skarvaje): Make these utilities dealing with Any types more generic,
-// add more error checking and move to a more public/sharable location so others
-// can use.
-LIBPROTOBUF_EXPORT bool GetBoolFromAny(const google::protobuf::Any& any);
-
-// Returns int64 value contained in Any type.
-LIBPROTOBUF_EXPORT int64 GetInt64FromAny(const google::protobuf::Any& any);
-
-// Returns double value contained in Any type.
-LIBPROTOBUF_EXPORT double GetDoubleFromAny(const google::protobuf::Any& any);
-
-// Returns string value contained in Any type.
-LIBPROTOBUF_EXPORT string GetStringFromAny(const google::protobuf::Any& any);
-
-// Returns the type string without the url prefix. e.g.: If the passed type is
-// 'type.googleapis.com/tech.type.Bool', the returned value is 'tech.type.Bool'.
-LIBPROTOBUF_EXPORT const StringPiece GetTypeWithoutUrl(StringPiece type_url);
-
-// Returns the simple_type with the base type url (kTypeServiceBaseUrl)
-// prefixed.
-//
-// E.g:
-// GetFullTypeWithUrl("google.protobuf.Timestamp") returns the string
-// "type.googleapis.com/google.protobuf.Timestamp".
-LIBPROTOBUF_EXPORT const string GetFullTypeWithUrl(StringPiece simple_type);
-
-// Finds and returns option identified by name and option_name within the
-// provided map. Returns NULL if none found.
-const google::protobuf::Option* FindOptionOrNull(
- const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
- const string& option_name);
-
-// Finds and returns the field identified by field_name in the passed tech Type
-// object. Returns NULL if none found.
-const google::protobuf::Field* FindFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece field_name);
-
-// Similar to FindFieldInTypeOrNull, but this looks up fields with given
-// json_name.
-const google::protobuf::Field* FindJsonFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece json_name);
-
-// Similar to FindFieldInTypeOrNull, but this looks up fields by number.
-const google::protobuf::Field* FindFieldInTypeByNumberOrNull(
- const google::protobuf::Type* type, int32 number);
-
-// Finds and returns the EnumValue identified by enum_name in the passed tech
-// Enum object. Returns NULL if none found.
-const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name);
-
-// Finds and returns the EnumValue identified by value in the passed tech
-// Enum object. Returns NULL if none found.
-const google::protobuf::EnumValue* FindEnumValueByNumberOrNull(
- const google::protobuf::Enum* enum_type, int32 value);
-
-// Finds and returns the EnumValue identified by enum_name without underscore in
-// the passed tech Enum object. Returns NULL if none found.
-// For Ex. if enum_name is ACTIONANDADVENTURE it can get accepted if
-// EnumValue's name is action_and_adventure or ACTION_AND_ADVENTURE.
-const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name);
-
-// Converts input to camel-case and returns it.
-LIBPROTOBUF_EXPORT string ToCamelCase(const StringPiece input);
-
-// Converts input to snake_case and returns it.
-LIBPROTOBUF_EXPORT string ToSnakeCase(StringPiece input);
-
-// Returns true if type_name represents a well-known type.
-LIBPROTOBUF_EXPORT bool IsWellKnownType(const string& type_name);
-
-// Returns true if 'bool_string' represents a valid boolean value. Only "true",
-// "false", "0" and "1" are allowed.
-LIBPROTOBUF_EXPORT bool IsValidBoolString(const string& bool_string);
-
-// Returns true if "field" is a protobuf map field based on its type.
-LIBPROTOBUF_EXPORT bool IsMap(const google::protobuf::Field& field,
- const google::protobuf::Type& type);
-
-// Returns true if the given type has special MessageSet wire format.
-bool IsMessageSetWireFormat(const google::protobuf::Type& type);
-
-// Infinity/NaN-aware conversion to string.
-LIBPROTOBUF_EXPORT string DoubleAsString(double value);
-LIBPROTOBUF_EXPORT string FloatAsString(float value);
-
-// Convert from int32, int64, uint32, uint64, double or float to string.
-template <typename T>
-string ValueAsString(T value) {
- return SimpleItoa(value);
-}
-
-template <>
-inline string ValueAsString(float value) {
- return FloatAsString(value);
-}
-
-template <>
-inline string ValueAsString(double value) {
- return DoubleAsString(value);
-}
-
-// Converts a string to float. Unlike safe_strtof, conversion will fail if the
-// value fits into double but not float (e.g., DBL_MAX).
-LIBPROTOBUF_EXPORT bool SafeStrToFloat(StringPiece str, float* value);
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-
-} // namespace google
-#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__