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