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