Index: third_party/protobuf/src/google/protobuf/wire_format.cc |
diff --git a/third_party/protobuf/src/google/protobuf/wire_format.cc b/third_party/protobuf/src/google/protobuf/wire_format.cc |
index 21350f51a160116b8a993e929ddad3b7aa825448..5ee4e25d4935be7a542ff5534ae06a7baaae8d4d 100644 |
--- a/third_party/protobuf/src/google/protobuf/wire_format.cc |
+++ b/third_party/protobuf/src/google/protobuf/wire_format.cc |
@@ -1,6 +1,6 @@ |
// Protocol Buffers - Google's data interchange format |
// Copyright 2008 Google Inc. All rights reserved. |
-// http://code.google.com/p/protobuf/ |
+// 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 |
@@ -38,7 +38,9 @@ |
#include <google/protobuf/wire_format.h> |
+#include <google/protobuf/stubs/logging.h> |
#include <google/protobuf/stubs/common.h> |
+#include <google/protobuf/stubs/stringprintf.h> |
#include <google/protobuf/descriptor.h> |
#include <google/protobuf/wire_format_lite_inl.h> |
#include <google/protobuf/descriptor.pb.h> |
@@ -53,6 +55,329 @@ namespace google { |
namespace protobuf { |
namespace internal { |
+// =================================================================== |
+ |
+bool UnknownFieldSetFieldSkipper::SkipField( |
+ io::CodedInputStream* input, uint32 tag) { |
+ return WireFormat::SkipField(input, tag, unknown_fields_); |
+} |
+ |
+bool UnknownFieldSetFieldSkipper::SkipMessage(io::CodedInputStream* input) { |
+ return WireFormat::SkipMessage(input, unknown_fields_); |
+} |
+ |
+void UnknownFieldSetFieldSkipper::SkipUnknownEnum( |
+ int field_number, int value) { |
+ unknown_fields_->AddVarint(field_number, value); |
+} |
+ |
+bool WireFormat::SkipField(io::CodedInputStream* input, uint32 tag, |
+ UnknownFieldSet* unknown_fields) { |
+ int number = WireFormatLite::GetTagFieldNumber(tag); |
+ |
+ switch (WireFormatLite::GetTagWireType(tag)) { |
+ case WireFormatLite::WIRETYPE_VARINT: { |
+ uint64 value; |
+ if (!input->ReadVarint64(&value)) return false; |
+ if (unknown_fields != NULL) unknown_fields->AddVarint(number, value); |
+ return true; |
+ } |
+ case WireFormatLite::WIRETYPE_FIXED64: { |
+ uint64 value; |
+ if (!input->ReadLittleEndian64(&value)) return false; |
+ if (unknown_fields != NULL) unknown_fields->AddFixed64(number, value); |
+ return true; |
+ } |
+ case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: { |
+ uint32 length; |
+ if (!input->ReadVarint32(&length)) return false; |
+ if (unknown_fields == NULL) { |
+ if (!input->Skip(length)) return false; |
+ } else { |
+ if (!input->ReadString(unknown_fields->AddLengthDelimited(number), |
+ length)) { |
+ return false; |
+ } |
+ } |
+ return true; |
+ } |
+ case WireFormatLite::WIRETYPE_START_GROUP: { |
+ if (!input->IncrementRecursionDepth()) return false; |
+ if (!SkipMessage(input, (unknown_fields == NULL) ? |
+ NULL : unknown_fields->AddGroup(number))) { |
+ return false; |
+ } |
+ input->DecrementRecursionDepth(); |
+ // Check that the ending tag matched the starting tag. |
+ if (!input->LastTagWas(WireFormatLite::MakeTag( |
+ WireFormatLite::GetTagFieldNumber(tag), |
+ WireFormatLite::WIRETYPE_END_GROUP))) { |
+ return false; |
+ } |
+ return true; |
+ } |
+ case WireFormatLite::WIRETYPE_END_GROUP: { |
+ return false; |
+ } |
+ case WireFormatLite::WIRETYPE_FIXED32: { |
+ uint32 value; |
+ if (!input->ReadLittleEndian32(&value)) return false; |
+ if (unknown_fields != NULL) unknown_fields->AddFixed32(number, value); |
+ return true; |
+ } |
+ default: { |
+ return false; |
+ } |
+ } |
+} |
+ |
+bool WireFormat::SkipMessage(io::CodedInputStream* input, |
+ UnknownFieldSet* unknown_fields) { |
+ while (true) { |
+ uint32 tag = input->ReadTag(); |
+ if (tag == 0) { |
+ // End of input. This is a valid place to end, so return true. |
+ return true; |
+ } |
+ |
+ WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); |
+ |
+ if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) { |
+ // Must be the end of the message. |
+ return true; |
+ } |
+ |
+ if (!SkipField(input, tag, unknown_fields)) return false; |
+ } |
+} |
+ |
+bool WireFormat::ReadPackedEnumPreserveUnknowns(io::CodedInputStream* input, |
+ uint32 field_number, |
+ bool (*is_valid)(int), |
+ UnknownFieldSet* unknown_fields, |
+ RepeatedField<int>* values) { |
+ uint32 length; |
+ if (!input->ReadVarint32(&length)) return false; |
+ io::CodedInputStream::Limit limit = input->PushLimit(length); |
+ while (input->BytesUntilLimit() > 0) { |
+ int value; |
+ if (!google::protobuf::internal::WireFormatLite::ReadPrimitive< |
+ int, WireFormatLite::TYPE_ENUM>(input, &value)) { |
+ return false; |
+ } |
+ if (is_valid == NULL || is_valid(value)) { |
+ values->Add(value); |
+ } else { |
+ unknown_fields->AddVarint(field_number, value); |
+ } |
+ } |
+ input->PopLimit(limit); |
+ return true; |
+} |
+ |
+ |
+void WireFormat::SerializeUnknownFields(const UnknownFieldSet& unknown_fields, |
+ io::CodedOutputStream* output) { |
+ for (int i = 0; i < unknown_fields.field_count(); i++) { |
+ const UnknownField& field = unknown_fields.field(i); |
+ switch (field.type()) { |
+ case UnknownField::TYPE_VARINT: |
+ output->WriteVarint32(WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_VARINT)); |
+ output->WriteVarint64(field.varint()); |
+ break; |
+ case UnknownField::TYPE_FIXED32: |
+ output->WriteVarint32(WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_FIXED32)); |
+ output->WriteLittleEndian32(field.fixed32()); |
+ break; |
+ case UnknownField::TYPE_FIXED64: |
+ output->WriteVarint32(WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_FIXED64)); |
+ output->WriteLittleEndian64(field.fixed64()); |
+ break; |
+ case UnknownField::TYPE_LENGTH_DELIMITED: |
+ output->WriteVarint32(WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); |
+ output->WriteVarint32(field.length_delimited().size()); |
+ output->WriteRawMaybeAliased(field.length_delimited().data(), |
+ field.length_delimited().size()); |
+ break; |
+ case UnknownField::TYPE_GROUP: |
+ output->WriteVarint32(WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_START_GROUP)); |
+ SerializeUnknownFields(field.group(), output); |
+ output->WriteVarint32(WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_END_GROUP)); |
+ break; |
+ } |
+ } |
+} |
+ |
+uint8* WireFormat::SerializeUnknownFieldsToArray( |
+ const UnknownFieldSet& unknown_fields, |
+ uint8* target) { |
+ for (int i = 0; i < unknown_fields.field_count(); i++) { |
+ const UnknownField& field = unknown_fields.field(i); |
+ |
+ switch (field.type()) { |
+ case UnknownField::TYPE_VARINT: |
+ target = WireFormatLite::WriteInt64ToArray( |
+ field.number(), field.varint(), target); |
+ break; |
+ case UnknownField::TYPE_FIXED32: |
+ target = WireFormatLite::WriteFixed32ToArray( |
+ field.number(), field.fixed32(), target); |
+ break; |
+ case UnknownField::TYPE_FIXED64: |
+ target = WireFormatLite::WriteFixed64ToArray( |
+ field.number(), field.fixed64(), target); |
+ break; |
+ case UnknownField::TYPE_LENGTH_DELIMITED: |
+ target = WireFormatLite::WriteBytesToArray( |
+ field.number(), field.length_delimited(), target); |
+ break; |
+ case UnknownField::TYPE_GROUP: |
+ target = WireFormatLite::WriteTagToArray( |
+ field.number(), WireFormatLite::WIRETYPE_START_GROUP, target); |
+ target = SerializeUnknownFieldsToArray(field.group(), target); |
+ target = WireFormatLite::WriteTagToArray( |
+ field.number(), WireFormatLite::WIRETYPE_END_GROUP, target); |
+ break; |
+ } |
+ } |
+ return target; |
+} |
+ |
+void WireFormat::SerializeUnknownMessageSetItems( |
+ const UnknownFieldSet& unknown_fields, |
+ io::CodedOutputStream* output) { |
+ for (int i = 0; i < unknown_fields.field_count(); i++) { |
+ const UnknownField& field = unknown_fields.field(i); |
+ // The only unknown fields that are allowed to exist in a MessageSet are |
+ // messages, which are length-delimited. |
+ if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { |
+ // Start group. |
+ output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag); |
+ |
+ // Write type ID. |
+ output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag); |
+ output->WriteVarint32(field.number()); |
+ |
+ // Write message. |
+ output->WriteVarint32(WireFormatLite::kMessageSetMessageTag); |
+ field.SerializeLengthDelimitedNoTag(output); |
+ |
+ // End group. |
+ output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); |
+ } |
+ } |
+} |
+ |
+uint8* WireFormat::SerializeUnknownMessageSetItemsToArray( |
+ const UnknownFieldSet& unknown_fields, |
+ uint8* target) { |
+ for (int i = 0; i < unknown_fields.field_count(); i++) { |
+ const UnknownField& field = unknown_fields.field(i); |
+ |
+ // The only unknown fields that are allowed to exist in a MessageSet are |
+ // messages, which are length-delimited. |
+ if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { |
+ // Start group. |
+ target = io::CodedOutputStream::WriteTagToArray( |
+ WireFormatLite::kMessageSetItemStartTag, target); |
+ |
+ // Write type ID. |
+ target = io::CodedOutputStream::WriteTagToArray( |
+ WireFormatLite::kMessageSetTypeIdTag, target); |
+ target = io::CodedOutputStream::WriteVarint32ToArray( |
+ field.number(), target); |
+ |
+ // Write message. |
+ target = io::CodedOutputStream::WriteTagToArray( |
+ WireFormatLite::kMessageSetMessageTag, target); |
+ target = field.SerializeLengthDelimitedNoTagToArray(target); |
+ |
+ // End group. |
+ target = io::CodedOutputStream::WriteTagToArray( |
+ WireFormatLite::kMessageSetItemEndTag, target); |
+ } |
+ } |
+ |
+ return target; |
+} |
+ |
+int WireFormat::ComputeUnknownFieldsSize( |
+ const UnknownFieldSet& unknown_fields) { |
+ int size = 0; |
+ for (int i = 0; i < unknown_fields.field_count(); i++) { |
+ const UnknownField& field = unknown_fields.field(i); |
+ |
+ switch (field.type()) { |
+ case UnknownField::TYPE_VARINT: |
+ size += io::CodedOutputStream::VarintSize32( |
+ WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_VARINT)); |
+ size += io::CodedOutputStream::VarintSize64(field.varint()); |
+ break; |
+ case UnknownField::TYPE_FIXED32: |
+ size += io::CodedOutputStream::VarintSize32( |
+ WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_FIXED32)); |
+ size += sizeof(int32); |
+ break; |
+ case UnknownField::TYPE_FIXED64: |
+ size += io::CodedOutputStream::VarintSize32( |
+ WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_FIXED64)); |
+ size += sizeof(int64); |
+ break; |
+ case UnknownField::TYPE_LENGTH_DELIMITED: |
+ size += io::CodedOutputStream::VarintSize32( |
+ WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); |
+ size += io::CodedOutputStream::VarintSize32( |
+ field.length_delimited().size()); |
+ size += field.length_delimited().size(); |
+ break; |
+ case UnknownField::TYPE_GROUP: |
+ size += io::CodedOutputStream::VarintSize32( |
+ WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_START_GROUP)); |
+ size += ComputeUnknownFieldsSize(field.group()); |
+ size += io::CodedOutputStream::VarintSize32( |
+ WireFormatLite::MakeTag(field.number(), |
+ WireFormatLite::WIRETYPE_END_GROUP)); |
+ break; |
+ } |
+ } |
+ |
+ return size; |
+} |
+ |
+int WireFormat::ComputeUnknownMessageSetItemsSize( |
+ const UnknownFieldSet& unknown_fields) { |
+ int size = 0; |
+ for (int i = 0; i < unknown_fields.field_count(); i++) { |
+ const UnknownField& field = unknown_fields.field(i); |
+ |
+ // The only unknown fields that are allowed to exist in a MessageSet are |
+ // messages, which are length-delimited. |
+ if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { |
+ size += WireFormatLite::kMessageSetItemTagsSize; |
+ size += io::CodedOutputStream::VarintSize32(field.number()); |
+ |
+ int field_size = field.GetLengthDelimitedSize(); |
+ size += io::CodedOutputStream::VarintSize32(field_size); |
+ size += field_size; |
+ } |
+ } |
+ |
+ return size; |
+} |
+ |
+// =================================================================== |
+ |
bool WireFormat::ParseAndMergePartial(io::CodedInputStream* input, |
Message* message) { |
const Descriptor* descriptor = message->GetDescriptor(); |
@@ -105,6 +430,41 @@ bool WireFormat::ParseAndMergePartial(io::CodedInputStream* input, |
} |
} |
+bool WireFormat::SkipMessageSetField(io::CodedInputStream* input, |
+ uint32 field_number, |
+ UnknownFieldSet* unknown_fields) { |
+ uint32 length; |
+ if (!input->ReadVarint32(&length)) return false; |
+ return input->ReadString( |
+ unknown_fields->AddLengthDelimited(field_number), length); |
+} |
+ |
+bool WireFormat::ParseAndMergeMessageSetField(uint32 field_number, |
+ const FieldDescriptor* field, |
+ Message* message, |
+ io::CodedInputStream* input) { |
+ const Reflection* message_reflection = message->GetReflection(); |
+ if (field == NULL) { |
+ // We store unknown MessageSet extensions as groups. |
+ return SkipMessageSetField( |
+ input, field_number, message_reflection->MutableUnknownFields(message)); |
+ } else if (field->is_repeated() || |
+ field->type() != FieldDescriptor::TYPE_MESSAGE) { |
+ // This shouldn't happen as we only allow optional message extensions to |
+ // MessageSet. |
+ GOOGLE_LOG(ERROR) << "Extensions of MessageSets must be optional messages."; |
+ return false; |
+ } else { |
+ Message* sub_message = message_reflection->MutableMessage( |
+ message, field, input->GetExtensionFactory()); |
+ return WireFormatLite::ReadMessage(input, sub_message); |
+ } |
+} |
+ |
+static bool StrictUtf8Check(const FieldDescriptor* field) { |
+ return field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3; |
+} |
+ |
bool WireFormat::ParseAndMergeField( |
uint32 tag, |
const FieldDescriptor* field, // May be NULL for unknown |
@@ -130,8 +490,8 @@ bool WireFormat::ParseAndMergeField( |
} |
if (value_format == UNKNOWN) { |
- return WireFormatLite::SkipField( |
- input, tag, message_reflection->MutableUnknownFields(message)); |
+ return SkipField(input, tag, |
+ message_reflection->MutableUnknownFields(message)); |
} else if (value_format == PACKED_FORMAT) { |
uint32 length; |
if (!input->ReadVarint32(&length)) return false; |
@@ -173,10 +533,23 @@ bool WireFormat::ParseAndMergeField( |
int value; |
if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>( |
input, &value)) return false; |
- const EnumValueDescriptor* enum_value = |
- field->enum_type()->FindValueByNumber(value); |
- if (enum_value != NULL) { |
- message_reflection->AddEnum(message, field, enum_value); |
+ if (message->GetDescriptor()->file()->syntax() == |
+ FileDescriptor::SYNTAX_PROTO3) { |
+ message_reflection->AddEnumValue(message, field, value); |
+ } else { |
+ const EnumValueDescriptor* enum_value = |
+ field->enum_type()->FindValueByNumber(value); |
+ if (enum_value != NULL) { |
+ message_reflection->AddEnum(message, field, enum_value); |
+ } else { |
+ // The enum value is not one of the known values. Add it to the |
+ // UnknownFieldSet. |
+ int64 sign_extended_value = static_cast<int64>(value); |
+ message_reflection->MutableUnknownFields(message) |
+ ->AddVarint( |
+ WireFormatLite::GetTagFieldNumber(tag), |
+ sign_extended_value); |
+ } |
} |
} |
@@ -233,30 +606,50 @@ bool WireFormat::ParseAndMergeField( |
int value; |
if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>( |
input, &value)) return false; |
- const EnumValueDescriptor* enum_value = |
- field->enum_type()->FindValueByNumber(value); |
- if (enum_value != NULL) { |
+ if (message->GetDescriptor()->file()->syntax() == |
+ FileDescriptor::SYNTAX_PROTO3) { |
if (field->is_repeated()) { |
- message_reflection->AddEnum(message, field, enum_value); |
+ message_reflection->AddEnumValue(message, field, value); |
} else { |
- message_reflection->SetEnum(message, field, enum_value); |
+ message_reflection->SetEnumValue(message, field, value); |
} |
} else { |
- // The enum value is not one of the known values. Add it to the |
- // UnknownFieldSet. |
- int64 sign_extended_value = static_cast<int64>(value); |
- message_reflection->MutableUnknownFields(message) |
- ->AddVarint(WireFormatLite::GetTagFieldNumber(tag), |
- sign_extended_value); |
+ const EnumValueDescriptor* enum_value = |
+ field->enum_type()->FindValueByNumber(value); |
+ if (enum_value != NULL) { |
+ if (field->is_repeated()) { |
+ message_reflection->AddEnum(message, field, enum_value); |
+ } else { |
+ message_reflection->SetEnum(message, field, enum_value); |
+ } |
+ } else { |
+ // The enum value is not one of the known values. Add it to the |
+ // UnknownFieldSet. |
+ int64 sign_extended_value = static_cast<int64>(value); |
+ message_reflection->MutableUnknownFields(message) |
+ ->AddVarint( |
+ WireFormatLite::GetTagFieldNumber(tag), |
+ sign_extended_value); |
+ } |
} |
break; |
} |
// Handle strings separately so that we can optimize the ctype=CORD case. |
case FieldDescriptor::TYPE_STRING: { |
+ bool strict_utf8_check = StrictUtf8Check(field); |
string value; |
if (!WireFormatLite::ReadString(input, &value)) return false; |
- VerifyUTF8String(value.data(), value.length(), PARSE); |
+ if (strict_utf8_check) { |
+ if (!WireFormatLite::VerifyUtf8String( |
+ value.data(), value.length(), WireFormatLite::PARSE, |
+ field->full_name().c_str())) { |
+ return false; |
+ } |
+ } else { |
+ VerifyUTF8StringNamedField(value.data(), value.length(), PARSE, |
+ field->full_name().c_str()); |
+ } |
if (field->is_repeated()) { |
message_reflection->AddString(message, field, value); |
} else { |
@@ -320,10 +713,7 @@ bool WireFormat::ParseAndMergeMessageSetItem( |
// required int32 type_id = 2; |
// required data message = 3; |
- // Once we see a type_id, we'll construct a fake tag for this extension |
- // which is the tag it would have had under the proto2 extensions wire |
- // format. |
- uint32 fake_tag = 0; |
+ uint32 last_type_id = 0; |
// Once we see a type_id, we'll look up the FieldDescriptor for the |
// extension. |
@@ -341,8 +731,7 @@ bool WireFormat::ParseAndMergeMessageSetItem( |
case WireFormatLite::kMessageSetTypeIdTag: { |
uint32 type_id; |
if (!input->ReadVarint32(&type_id)) return false; |
- fake_tag = WireFormatLite::MakeTag( |
- type_id, WireFormatLite::WIRETYPE_LENGTH_DELIMITED); |
+ last_type_id = type_id; |
field = message_reflection->FindKnownExtensionByNumber(type_id); |
if (!message_data.empty()) { |
@@ -351,8 +740,8 @@ bool WireFormat::ParseAndMergeMessageSetItem( |
io::ArrayInputStream raw_input(message_data.data(), |
message_data.size()); |
io::CodedInputStream sub_input(&raw_input); |
- if (!ParseAndMergeField(fake_tag, field, message, |
- &sub_input)) { |
+ if (!ParseAndMergeMessageSetField(last_type_id, field, message, |
+ &sub_input)) { |
return false; |
} |
message_data.clear(); |
@@ -362,7 +751,7 @@ bool WireFormat::ParseAndMergeMessageSetItem( |
} |
case WireFormatLite::kMessageSetMessageTag: { |
- if (fake_tag == 0) { |
+ if (last_type_id == 0) { |
// We haven't seen a type_id yet. Append this data to message_data. |
string temp; |
uint32 length; |
@@ -374,7 +763,8 @@ bool WireFormat::ParseAndMergeMessageSetItem( |
coded_output.WriteString(temp); |
} else { |
// Already saw type_id, so we can parse this directly. |
- if (!ParseAndMergeField(fake_tag, field, message, input)) { |
+ if (!ParseAndMergeMessageSetField(last_type_id, field, message, |
+ input)) { |
return false; |
} |
} |
@@ -387,7 +777,7 @@ bool WireFormat::ParseAndMergeMessageSetItem( |
} |
default: { |
- if (!WireFormatLite::SkipField(input, tag, NULL)) return false; |
+ if (!SkipField(input, tag, NULL)) return false; |
} |
} |
} |
@@ -409,10 +799,10 @@ void WireFormat::SerializeWithCachedSizes( |
} |
if (descriptor->options().message_set_wire_format()) { |
- WireFormatLite::SerializeUnknownMessageSetItems( |
+ SerializeUnknownMessageSetItems( |
message_reflection->GetUnknownFields(message), output); |
} else { |
- WireFormatLite::SerializeUnknownFields( |
+ SerializeUnknownFields( |
message_reflection->GetUnknownFields(message), output); |
} |
@@ -444,7 +834,7 @@ void WireFormat::SerializeFieldWithCachedSizes( |
count = 1; |
} |
- const bool is_packed = field->options().packed(); |
+ const bool is_packed = field->is_packed(); |
if (is_packed && count > 0) { |
WireFormatLite::WriteTag(field->number(), |
WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); |
@@ -517,12 +907,20 @@ void WireFormat::SerializeFieldWithCachedSizes( |
// Handle strings separately so that we can get string references |
// instead of copying. |
case FieldDescriptor::TYPE_STRING: { |
+ bool strict_utf8_check = StrictUtf8Check(field); |
string scratch; |
const string& value = field->is_repeated() ? |
message_reflection->GetRepeatedStringReference( |
message, field, j, &scratch) : |
message_reflection->GetStringReference(message, field, &scratch); |
- VerifyUTF8String(value.data(), value.length(), SERIALIZE); |
+ if (strict_utf8_check) { |
+ WireFormatLite::VerifyUtf8String(value.data(), value.length(), |
+ WireFormatLite::SERIALIZE, |
+ field->full_name().c_str()); |
+ } else { |
+ VerifyUTF8StringNamedField(value.data(), value.length(), SERIALIZE, |
+ field->full_name().c_str()); |
+ } |
WireFormatLite::WriteString(field->number(), value, output); |
break; |
} |
@@ -579,10 +977,10 @@ int WireFormat::ByteSize(const Message& message) { |
} |
if (descriptor->options().message_set_wire_format()) { |
- our_size += WireFormatLite::ComputeUnknownMessageSetItemsSize( |
+ our_size += ComputeUnknownMessageSetItemsSize( |
message_reflection->GetUnknownFields(message)); |
} else { |
- our_size += WireFormatLite::ComputeUnknownFieldsSize( |
+ our_size += ComputeUnknownFieldsSize( |
message_reflection->GetUnknownFields(message)); |
} |
@@ -610,7 +1008,7 @@ int WireFormat::FieldByteSize( |
const int data_size = FieldDataOnlyByteSize(field, message); |
int our_size = data_size; |
- if (field->options().packed()) { |
+ if (field->is_packed()) { |
if (data_size > 0) { |
// Packed fields get serialized like a string, not their native type. |
// Technically this doesn't really matter; the size only changes if it's |
@@ -730,28 +1128,6 @@ int WireFormat::MessageSetItemByteSize( |
return our_size; |
} |
-void WireFormat::VerifyUTF8StringFallback(const char* data, |
- int size, |
- Operation op) { |
- if (!IsStructurallyValidUTF8(data, size)) { |
- const char* operation_str = NULL; |
- switch (op) { |
- case PARSE: |
- operation_str = "parsing"; |
- break; |
- case SERIALIZE: |
- operation_str = "serializing"; |
- break; |
- // no default case: have the compiler warn if a case is not covered. |
- } |
- GOOGLE_LOG(ERROR) << "String field contains invalid UTF-8 data when " |
- << operation_str |
- << " a protocol buffer. Use the 'bytes' type if you intend to " |
- "send raw bytes."; |
- } |
-} |
- |
- |
} // namespace internal |
} // namespace protobuf |
} // namespace google |