15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Based on original Protocol Buffers design by
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Sanjay Ghemawat, Jeff Dean, and others.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/wire_format_lite_inl.h>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stack>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/coded_stream_inl.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/zero_copy_stream.h>
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unknown_field_set.h>
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _MSC_VER    // MSVC doesn't like definitions of inline constants, GCC
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // requires them.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WireFormatLite::kMessageSetItemStartTag;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WireFormatLite::kMessageSetItemEndTag;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WireFormatLite::kMessageSetTypeIdTag;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WireFormatLite::kMessageSetMessageTag;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FieldSkipper::SkipField(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input, uint32 tag) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WireFormatLite::SkipField(input, tag, unknown_fields_);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FieldSkipper::SkipMessage(io::CodedInputStream* input) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WireFormatLite::SkipMessage(input, unknown_fields_);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FieldSkipper::SkipUnknownEnum(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int field_number, int value) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unknown_fields_->AddVarint(field_number, value);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int WireFormatLite::kMessageSetItemTagsSize =
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedOutputStream::StaticVarintSize32<kMessageSetItemStartTag>::value +
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedOutputStream::StaticVarintSize32<kMessageSetItemEndTag>::value +
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedOutputStream::StaticVarintSize32<kMessageSetTypeIdTag>::value +
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedOutputStream::StaticVarintSize32<kMessageSetMessageTag>::value;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const WireFormatLite::CppType
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WireFormatLite::kFieldTypeToCppTypeMap[MAX_FIELD_TYPE + 1] = {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<CppType>(0),  // 0 is reserved for errors
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_DOUBLE,   // TYPE_DOUBLE
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_FLOAT,    // TYPE_FLOAT
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT64,    // TYPE_INT64
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT64,   // TYPE_UINT64
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT32,    // TYPE_INT32
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT64,   // TYPE_FIXED64
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT32,   // TYPE_FIXED32
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_BOOL,     // TYPE_BOOL
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_STRING,   // TYPE_STRING
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_MESSAGE,  // TYPE_GROUP
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_MESSAGE,  // TYPE_MESSAGE
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_STRING,   // TYPE_BYTES
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT32,   // TYPE_UINT32
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_ENUM,     // TYPE_ENUM
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT32,    // TYPE_SFIXED32
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT64,    // TYPE_SFIXED64
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT32,    // TYPE_SINT32
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT64,    // TYPE_SINT64
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const WireFormatLite::WireType
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WireFormatLite::kWireTypeForFieldType[MAX_FIELD_TYPE + 1] = {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<WireFormatLite::WireType>(-1),  // invalid
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_DOUBLE
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FLOAT
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT64
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT64
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT32
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_FIXED64
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FIXED32
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_BOOL
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_STRING
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_START_GROUP,       // TYPE_GROUP
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_MESSAGE
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_BYTES
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT32
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_ENUM
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_SFIXED32
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_SFIXED64
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT32
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT64
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::SkipField(io::CodedInputStream* input, uint32 tag,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               UnknownFieldSet* unknown_fields) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int number = WireFormatLite::GetTagFieldNumber(tag);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (WireFormatLite::GetTagWireType(tag)) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WireFormatLite::WIRETYPE_VARINT: {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint64 value;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!input->ReadVarint64(&value)) return false;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (unknown_fields != NULL) unknown_fields->AddVarint(number, value);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WireFormatLite::WIRETYPE_FIXED64: {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint64 value;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!input->ReadLittleEndian64(&value)) return false;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (unknown_fields != NULL) unknown_fields->AddFixed64(number, value);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 length;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!input->ReadVarint32(&length)) return false;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (unknown_fields == NULL) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!input->Skip(length)) return false;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!input->ReadString(unknown_fields->AddLengthDelimited(number),
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               length)) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WireFormatLite::WIRETYPE_START_GROUP: {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!input->IncrementRecursionDepth()) return false;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!SkipMessage(input, (unknown_fields == NULL) ?
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              NULL : unknown_fields->AddGroup(number))) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input->DecrementRecursionDepth();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check that the ending tag matched the starting tag.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!input->LastTagWas(WireFormatLite::MakeTag(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WireFormatLite::GetTagFieldNumber(tag),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WireFormatLite::WIRETYPE_END_GROUP))) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WireFormatLite::WIRETYPE_END_GROUP: {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WireFormatLite::WIRETYPE_FIXED32: {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 value;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!input->ReadLittleEndian32(&value)) return false;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (unknown_fields != NULL) unknown_fields->AddFixed32(number, value);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::SkipMessage(io::CodedInputStream* input,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 UnknownFieldSet* unknown_fields) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while(true) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 tag = input->ReadTag();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tag == 0) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // End of input.  This is a valid place to end, so return true.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Must be the end of the message.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!SkipField(input, tag, unknown_fields)) return false;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::SerializeUnknownFields(const UnknownFieldSet& unknown_fields,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            io::CodedOutputStream* output) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < unknown_fields.field_count(); i++) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = unknown_fields.field(i);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (field.type()) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_VARINT:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_VARINT));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint64(field.varint());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_FIXED32:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_FIXED32));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteLittleEndian32(field.fixed32());
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_FIXED64:
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_FIXED64));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteLittleEndian64(field.fixed64());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_LENGTH_DELIMITED:
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(field.length_delimited().size());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteString(field.length_delimited());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_GROUP:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_START_GROUP));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SerializeUnknownFields(field.group(), output);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_END_GROUP));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint8* WireFormatLite::SerializeUnknownFieldsToArray(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownFieldSet& unknown_fields,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* target) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < unknown_fields.field_count(); i++) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = unknown_fields.field(i);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (field.type()) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_VARINT:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = WireFormatLite::WriteInt64ToArray(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.number(), field.varint(), target);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_FIXED32:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = WireFormatLite::WriteFixed32ToArray(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.number(), field.fixed32(), target);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_FIXED64:
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = WireFormatLite::WriteFixed64ToArray(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.number(), field.fixed64(), target);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_LENGTH_DELIMITED:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = WireFormatLite::WriteBytesToArray(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.number(), field.length_delimited(), target);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_GROUP:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = WireFormatLite::WriteTagToArray(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.number(), WireFormatLite::WIRETYPE_START_GROUP, target);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = SerializeUnknownFieldsToArray(field.group(), target);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target = WireFormatLite::WriteTagToArray(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.number(), WireFormatLite::WIRETYPE_END_GROUP, target);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return target;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::SerializeUnknownMessageSetItems(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownFieldSet& unknown_fields,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedOutputStream* output) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < unknown_fields.field_count(); i++) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = unknown_fields.field(i);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The only unknown fields that are allowed to exist in a MessageSet are
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // messages, which are length-delimited.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string& data = field.length_delimited();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Start group.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Write type ID.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteVarint32(field.number());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Write message.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteVarint32(WireFormatLite::kMessageSetMessageTag);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteVarint32(data.size());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteString(data);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // End group.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint8* WireFormatLite::SerializeUnknownMessageSetItemsToArray(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownFieldSet& unknown_fields,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* target) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < unknown_fields.field_count(); i++) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = unknown_fields.field(i);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The only unknown fields that are allowed to exist in a MessageSet are
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // messages, which are length-delimited.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string& data = field.length_delimited();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Start group.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteTagToArray(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WireFormatLite::kMessageSetItemStartTag, target);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Write type ID.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteTagToArray(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WireFormatLite::kMessageSetTypeIdTag, target);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteVarint32ToArray(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          field.number(), target);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Write message.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteTagToArray(
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WireFormatLite::kMessageSetMessageTag, target);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteStringToArray(data, target);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // End group.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target = io::CodedOutputStream::WriteTagToArray(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WireFormatLite::kMessageSetItemEndTag, target);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return target;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WireFormatLite::ComputeUnknownFieldsSize(
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownFieldSet& unknown_fields) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = 0;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < unknown_fields.field_count(); i++) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = unknown_fields.field(i);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (field.type()) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_VARINT:
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::MakeTag(field.number(),
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_VARINT));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize64(field.varint());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_FIXED32:
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::MakeTag(field.number(),
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_FIXED32));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += sizeof(int32);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_FIXED64:
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::MakeTag(field.number(),
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_FIXED64));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += sizeof(int64);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_LENGTH_DELIMITED:
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::MakeTag(field.number(),
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            field.length_delimited().size());
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += field.length_delimited().size();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_GROUP:
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::MakeTag(field.number(),
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_START_GROUP));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += ComputeUnknownFieldsSize(field.group());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size += io::CodedOutputStream::VarintSize32(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::MakeTag(field.number(),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            WireFormatLite::WIRETYPE_END_GROUP));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return size;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WireFormatLite::ComputeUnknownMessageSetItemsSize(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownFieldSet& unknown_fields) {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = 0;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < unknown_fields.field_count(); i++) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = unknown_fields.field(i);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The only unknown fields that are allowed to exist in a MessageSet are
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // messages, which are length-delimited.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size += WireFormatLite::kMessageSetItemTagsSize;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size += io::CodedOutputStream::VarintSize32(field.number());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size += io::CodedOutputStream::VarintSize32(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        field.length_delimited().size());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size += field.length_delimited().size();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return size;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::ReadPackedEnumNoInline(io::CodedInputStream* input,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            bool (*is_valid)(int),
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            RepeatedField<int>* values) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 length;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&length)) return false;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedInputStream::Limit limit = input->PushLimit(length);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (input->BytesUntilLimit() > 0) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int value;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!google::protobuf::internal::WireFormatLite::ReadPrimitive<
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int, WireFormatLite::TYPE_ENUM>(input, &value)) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_valid(value)) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      values->Add(value);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->PopLimit(limit);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteInt32(int field_number, int32 value,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                io::CodedOutputStream* output) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteInt32NoTag(value, output);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteInt64(int field_number, int64 value,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                io::CodedOutputStream* output) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteInt64NoTag(value, output);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteUInt32(int field_number, uint32 value,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 io::CodedOutputStream* output) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteUInt32NoTag(value, output);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteUInt64(int field_number, uint64 value,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 io::CodedOutputStream* output) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteUInt64NoTag(value, output);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteSInt32(int field_number, int32 value,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 io::CodedOutputStream* output) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteSInt32NoTag(value, output);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteSInt64(int field_number, int64 value,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 io::CodedOutputStream* output) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteSInt64NoTag(value, output);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteFixed32(int field_number, uint32 value,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  io::CodedOutputStream* output) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_FIXED32, output);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteFixed32NoTag(value, output);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteFixed64(int field_number, uint64 value,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  io::CodedOutputStream* output) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_FIXED64, output);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteFixed64NoTag(value, output);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteSFixed32(int field_number, int32 value,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   io::CodedOutputStream* output) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_FIXED32, output);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteSFixed32NoTag(value, output);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteSFixed64(int field_number, int64 value,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   io::CodedOutputStream* output) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_FIXED64, output);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteSFixed64NoTag(value, output);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteFloat(int field_number, float value,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                io::CodedOutputStream* output) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_FIXED32, output);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteFloatNoTag(value, output);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteDouble(int field_number, double value,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 io::CodedOutputStream* output) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_FIXED64, output);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteDoubleNoTag(value, output);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteBool(int field_number, bool value,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               io::CodedOutputStream* output) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteBoolNoTag(value, output);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteEnum(int field_number, int value,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               io::CodedOutputStream* output) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_VARINT, output);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteEnumNoTag(value, output);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteString(int field_number, const string& value,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 io::CodedOutputStream* output) {
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String is for UTF-8 text only
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GOOGLE_CHECK(value.size() <= kint32max);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(value.size());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteString(value);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteBytes(int field_number, const string& value,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                io::CodedOutputStream* output) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GOOGLE_CHECK(value.size() <= kint32max);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(value.size());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteString(value);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteGroup(int field_number,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const MessageLite& value,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                io::CodedOutputStream* output) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_START_GROUP, output);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value.SerializeWithCachedSizes(output);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_END_GROUP, output);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteMessage(int field_number,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const MessageLite& value,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  io::CodedOutputStream* output) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int size = value.GetCachedSize();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(size);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value.SerializeWithCachedSizes(output);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteGroupMaybeToArray(int field_number,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const MessageLite& value,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            io::CodedOutputStream* output) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_START_GROUP, output);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int size = value.GetCachedSize();
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* target = output->GetDirectBufferForNBytesAndAdvance(size);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target != NULL) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* end = value.SerializeWithCachedSizesToArray(target);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GOOGLE_DCHECK_EQ(end - target, size);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value.SerializeWithCachedSizes(output);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_END_GROUP, output);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WireFormatLite::WriteMessageMaybeToArray(int field_number,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const MessageLite& value,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              io::CodedOutputStream* output) {
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int size = value.GetCachedSize();
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(size);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* target = output->GetDirectBufferForNBytesAndAdvance(size);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target != NULL) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* end = value.SerializeWithCachedSizesToArray(target);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GOOGLE_DCHECK_EQ(end - target, size);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value.SerializeWithCachedSizes(output);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::ReadString(io::CodedInputStream* input,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                string* value) {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String is for UTF-8 text only
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 length;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&length)) return false;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->InternalReadStringInline(value, length)) return false;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::ReadBytes(io::CodedInputStream* input,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               string* value) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 length;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&length)) return false;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input->InternalReadStringInline(value, length);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
587