1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Protocol Buffers - Google's data interchange format 2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Copyright 2008 Google Inc. All rights reserved. 3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// http://code.google.com/p/protobuf/ 4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Redistribution and use in source and binary forms, with or without 6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// modification, are permitted provided that the following conditions are 7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// met: 8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions of source code must retain the above copyright 10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// notice, this list of conditions and the following disclaimer. 11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions in binary form must reproduce the above 12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// copyright notice, this list of conditions and the following disclaimer 13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// in the documentation and/or other materials provided with the 14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// distribution. 15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Neither the name of Google Inc. nor the names of its 16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// contributors may be used to endorse or promote products derived from 17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// this software without specific prior written permission. 18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Author: kenton@google.com (Kenton Varda) 32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// atenasio@google.com (Chris Atenasio) (ZigZag transform) 33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Based on original Protocol Buffers design by 34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Sanjay Ghemawat, Jeff Dean, and others. 35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This header is logically internal, but is made public because it is used 37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// from protocol-compiler-generated code, which may reside in other components. 38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_H__ 40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_WIRE_FORMAT_H__ 41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <string> 43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/stubs/common.h> 44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/descriptor.pb.h> 45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/descriptor.h> 46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/message.h> 47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/wire_format_lite.h> 48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Do UTF-8 validation on string type in Debug build only 50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef NDEBUG 51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace google { 55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf { 56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot namespace io { 57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class CodedInputStream; // coded_stream.h 58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class CodedOutputStream; // coded_stream.h 59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class UnknownFieldSet; // unknown_field_set.h 61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf { 64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace internal { 65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This class is for internal use by the protocol buffer library and by 67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// protocol-complier-generated message classes. It must not be called 68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// directly by clients. 69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This class contains code for implementing the binary protocol buffer 71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// wire format via reflection. The WireFormatLite class implements the 72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// non-reflection based routines. 73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This class is really a namespace that contains only static methods 75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT WireFormat { 76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Given a field return its WireType 79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline WireFormatLite::WireType WireTypeForField( 80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field); 81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Given a FieldSescriptor::Type return its WireType 83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline WireFormatLite::WireType WireTypeForFieldType( 84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldDescriptor::Type type); 85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Compute the byte size of a tag. For groups, this includes both the start 87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // and end tags. 88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline int TagSize(int field_number, FieldDescriptor::Type type); 89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // These procedures can be used to implement the methods of Message which 91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // handle parsing and serialization of the protocol buffer wire format 92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // using only the Reflection interface. When you ask the protocol 93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // compiler to optimize for code size rather than speed, it will implement 94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // those methods in terms of these procedures. Of course, these are much 95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // slower than the specialized implementations which the protocol compiler 96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // generates when told to optimize for speed. 97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Read a message in protocol buffer wire format. 99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This procedure reads either to the end of the input stream or through 101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a WIRETYPE_END_GROUP tag ending the message, whichever comes first. 102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // It returns false if the input is invalid. 103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Required fields are NOT checked by this method. You must call 105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // IsInitialized() on the resulting message yourself. 106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static bool ParseAndMergePartial(io::CodedInputStream* input, 107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Message* message); 108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Serialize a message in protocol buffer wire format. 110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Any embedded messages within the message must have their correct sizes 112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // cached. However, the top-level message need not; its size is passed as 113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a parameter to this procedure. 114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // These return false iff the underlying stream returns a write error. 116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void SerializeWithCachedSizes( 117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message& message, 118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int size, io::CodedOutputStream* output); 119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Implements Message::ByteSize() via reflection. WARNING: The result 121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // of this method is *not* cached anywhere. However, all embedded messages 122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // will have their ByteSize() methods called, so their sizes will be cached. 123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Therefore, calling this method is sufficient to allow you to call 124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // WireFormat::SerializeWithCachedSizes() on the same object. 125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int ByteSize(const Message& message); 126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ----------------------------------------------------------------- 128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Helpers for dealing with unknown fields 129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Skips a field value of the given WireType. The input should start 131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // positioned immediately after the tag. If unknown_fields is non-NULL, 132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the contents of the field will be added to it. 133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static bool SkipField(io::CodedInputStream* input, uint32 tag, 134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot UnknownFieldSet* unknown_fields); 135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Reads and ignores a message from the input. If unknown_fields is non-NULL, 137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the contents will be added to it. 138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static bool SkipMessage(io::CodedInputStream* input, 139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot UnknownFieldSet* unknown_fields); 140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write the contents of an UnknownFieldSet to the output. 142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void SerializeUnknownFields(const UnknownFieldSet& unknown_fields, 143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output); 144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Same as above, except writing directly to the provided buffer. 145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Requires that the buffer have sufficient capacity for 146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ComputeUnknownFieldsSize(unknown_fields). 147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns a pointer past the last written byte. 149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* SerializeUnknownFieldsToArray( 150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const UnknownFieldSet& unknown_fields, 151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target); 152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Same thing except for messages that have the message_set_wire_format 154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // option. 155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void SerializeUnknownMessageSetItems( 156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const UnknownFieldSet& unknown_fields, 157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output); 158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Same as above, except writing directly to the provided buffer. 159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Requires that the buffer have sufficient capacity for 160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ComputeUnknownMessageSetItemsSize(unknown_fields). 161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns a pointer past the last written byte. 163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint8* SerializeUnknownMessageSetItemsToArray( 164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const UnknownFieldSet& unknown_fields, 165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target); 166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Compute the size of the UnknownFieldSet on the wire. 168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields); 169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Same thing except for messages that have the message_set_wire_format 171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // option. 172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int ComputeUnknownMessageSetItemsSize( 173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const UnknownFieldSet& unknown_fields); 174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Helper functions for encoding and decoding tags. (Inlined below and in 177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // _inl.h) 178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // This is different from MakeTag(field->number(), field->type()) in the case 180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // of packed repeated fields. 181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static uint32 MakeTag(const FieldDescriptor* field); 182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Parse a single field. The input should start out positioned immidately 184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // after the tag. 185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static bool ParseAndMergeField( 186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 tag, 187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field, // May be NULL for unknown 188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Message* message, 189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedInputStream* input); 190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Serialize a single field. 192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void SerializeFieldWithCachedSizes( 193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field, // Cannot be NULL 194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message& message, 195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output); 196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Compute size of a single field. If the field is a message type, this 198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // will call ByteSize() for the embedded message, insuring that it caches 199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // its size. 200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int FieldByteSize( 201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field, // Cannot be NULL 202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message& message); 203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Parse/serialize a MessageSet::Item group. Used with messages that use 205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // opion message_set_wire_format = true. 206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static bool ParseAndMergeMessageSetItem( 207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedInputStream* input, 208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Message* message); 209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void SerializeMessageSetItemWithCachedSizes( 210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field, 211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message& message, 212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output); 213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int MessageSetItemByteSize( 214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field, 215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message& message); 216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Computes the byte size of a field, excluding tags. For packed fields, it 218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // only includes the size of the raw data, and not the size of the total 219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // length, but for other length-delimited types, the size of the length is 220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // included. 221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static int FieldDataOnlyByteSize( 222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field, // Cannot be NULL 223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message& message); 224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot enum Operation { 226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot PARSE, 227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot SERIALIZE, 228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Verifies that a string field is valid UTF8, logging an error if not. 231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void VerifyUTF8String(const char* data, int size, Operation op); 232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Verifies that a string field is valid UTF8, logging an error if not. 235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void VerifyUTF8StringFallback( 236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const char* data, 237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int size, 238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Operation op); 239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormat); 243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Subclass of FieldSkipper which saves skipped fields to an UnknownFieldSet. 246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT UnknownFieldSetFieldSkipper : public FieldSkipper { 247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot UnknownFieldSetFieldSkipper(UnknownFieldSet* unknown_fields) 249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : unknown_fields_(unknown_fields) {} 250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual ~UnknownFieldSetFieldSkipper() {} 251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // implements FieldSkipper ----------------------------------------- 253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool SkipField(io::CodedInputStream* input, uint32 tag); 254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool SkipMessage(io::CodedInputStream* input); 255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual void SkipUnknownEnum(int field_number, int value); 256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot protected: 258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot UnknownFieldSet* unknown_fields_; 259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// inline methods ==================================================== 262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline WireFormatLite::WireType WireFormat::WireTypeForField( 264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* field) { 265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot if (field->options().packed()) { 266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WireFormatLite::WIRETYPE_LENGTH_DELIMITED; 267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } else { 268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WireTypeForFieldType(field->type()); 269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline WireFormatLite::WireType WireFormat::WireTypeForFieldType( 273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldDescriptor::Type type) { 274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Some compilers don't like enum -> enum casts, so we implicit_cast to 275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // int first. 276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WireFormatLite::WireTypeForFieldType( 277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static_cast<WireFormatLite::FieldType>( 278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot implicit_cast<int>(type))); 279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline uint32 WireFormat::MakeTag(const FieldDescriptor* field) { 282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WireFormatLite::MakeTag(field->number(), WireTypeForField(field)); 283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline int WireFormat::TagSize(int field_number, FieldDescriptor::Type type) { 286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Some compilers don't like enum -> enum casts, so we implicit_cast to 287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // int first. 288555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return WireFormatLite::TagSize(field_number, 289555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static_cast<WireFormatLite::FieldType>( 290555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot implicit_cast<int>(type))); 291555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 292555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 293555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void WireFormat::VerifyUTF8String(const char* data, int size, 294555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot WireFormat::Operation op) { 295555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 296555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot WireFormat::VerifyUTF8StringFallback(data, size, op); 297555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 298555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Avoid the compiler warning about unsued variables. 299555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot (void)data; (void)size; (void)op; 300555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 301555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 302555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 303555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 304555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace internal 305555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace protobuf 306555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 307555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace google 308555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_H__ 309