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: jschorr@google.com (Joseph Schorr)
32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//  Based on original Protocol Buffers design by
33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//  Sanjay Ghemawat, Jeff Dean, and others.
34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Utilities for printing and parsing protocol messages in a human-readable,
36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// text-based format.
37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__
39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__
40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <map>
42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <string>
43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <vector>
44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/stubs/common.h>
45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/message.h>
46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/descriptor.h>
47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace google {
49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf {
50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace io {
52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  class ErrorCollector;      // tokenizer.h
53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This class implements protocol buffer text format.  Printing and parsing
56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// protocol messages in text format is useful for debugging and human editing
57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// of messages.
58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This class is really a namespace that contains only static methods.
60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT TextFormat {
61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public:
62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Outputs a textual representation of the given message to the given
63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // output stream.
64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool Print(const Message& message, io::ZeroCopyOutputStream* output);
65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Print the fields in an UnknownFieldSet.  They are printed by tag number
67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // only.  Embedded messages are heuristically identified by attempting to
68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // parse them.
69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 io::ZeroCopyOutputStream* output);
71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Like Print(), but outputs directly to a string.
73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool PrintToString(const Message& message, string* output);
74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Like PrintUnknownFields(), but outputs directly to a string.
76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                         string* output);
78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Outputs a textual representation of the value of the field supplied on
80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // the message supplied. For non-repeated fields, an index of -1 must
81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // be supplied. Note that this method will print the default value for a
82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // field if it is not set.
83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static void PrintFieldValueToString(const Message& message,
84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                      const FieldDescriptor* field,
85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                      int index,
86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                      string* output);
87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Class for those users which require more fine-grained control over how
89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // a protobuffer message is printed out.
90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  class LIBPROTOBUF_EXPORT Printer {
91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   public:
92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    Printer();
93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ~Printer();
94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::Print
96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool Print(const Message& message, io::ZeroCopyOutputStream* output) const;
97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::PrintUnknownFields
98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                            io::ZeroCopyOutputStream* output) const;
100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::PrintToString
101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool PrintToString(const Message& message, string* output) const;
102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::PrintUnknownFieldsToString
103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                    string* output) const;
105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::PrintFieldValueToString
106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void PrintFieldValueToString(const Message& message,
107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 const FieldDescriptor* field,
108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 int index,
109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 string* output) const;
110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Adjust the initial indent level of all output.  Each indent level is
112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // equal to two spaces.
113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void SetInitialIndentLevel(int indent_level) {
114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      initial_indent_level_ = indent_level;
115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // If printing in single line mode, then the entire message will be output
118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // on a single line with no line breaks.
119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void SetSingleLineMode(bool single_line_mode) {
120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      single_line_mode_ = single_line_mode;
121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Set true to print repeated primitives in a format like:
124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    //   field_name: [1, 2, 3, 4]
125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // instead of printing each value on its own line.  Short format applies
126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // only to primitive values -- i.e. everything except strings and
127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // sub-messages/groups.
128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) {
129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      use_short_repeated_primitives_ = use_short_repeated_primitives;
130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Set true to output UTF-8 instead of ASCII.  The only difference
133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // is that bytes >= 0x80 in string fields will not be escaped,
134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // because they are assumed to be part of UTF-8 multi-byte
135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // sequences.
136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void SetUseUtf8StringEscaping(bool as_utf8) {
137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      utf8_string_escaping_ = as_utf8;
138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   private:
141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Forward declaration of an internal class used to print the text
142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // output to the OutputStream (see text_format.cc for implementation).
143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    class TextGenerator;
144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Internal Print method, used for writing to the OutputStream via
146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // the TextGenerator class.
147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void Print(const Message& message,
148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot               TextGenerator& generator) const;
149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Print a single field.
151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void PrintField(const Message& message,
152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    const Reflection* reflection,
153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    const FieldDescriptor* field,
154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    TextGenerator& generator) const;
155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Print a repeated primitive field in short form.
157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void PrintShortRepeatedField(const Message& message,
158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 const Reflection* reflection,
159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 const FieldDescriptor* field,
160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                 TextGenerator& generator) const;
161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Print the name of a field -- i.e. everything that comes before the
163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // ':' for a single name/value pair.
164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void PrintFieldName(const Message& message,
165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        const Reflection* reflection,
166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        const FieldDescriptor* field,
167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        TextGenerator& generator) const;
168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Outputs a textual representation of the value of the field supplied on
170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // the message supplied or the default value if not set.
171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void PrintFieldValue(const Message& message,
172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                         const Reflection* reflection,
173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                         const FieldDescriptor* field,
174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                         int index,
175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                         TextGenerator& generator) const;
176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Print the fields in an UnknownFieldSet.  They are printed by tag number
178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // only.  Embedded messages are heuristically identified by attempting to
179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // parse them.
180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void PrintUnknownFields(const UnknownFieldSet& unknown_fields,
181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                            TextGenerator& generator) const;
182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int initial_indent_level_;
184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool single_line_mode_;
186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool use_short_repeated_primitives_;
188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool utf8_string_escaping_;
190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Parses a text-format protocol message from the given input stream to
193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // the given message object.  This function parses the format written
194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // by Print().
195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool Parse(io::ZeroCopyInputStream* input, Message* output);
196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Like Parse(), but reads directly from a string.
197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool ParseFromString(const string& input, Message* output);
198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Like Parse(), but the data is merged into the given message, as if
200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // using Message::MergeFrom().
201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool Merge(io::ZeroCopyInputStream* input, Message* output);
202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Like Merge(), but reads directly from a string.
203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool MergeFromString(const string& input, Message* output);
204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Parse the given text as a single field value and store it into the
206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // given field of the given message. If the field is a repeated field,
207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // the new value will be added to the end
208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static bool ParseFieldValueFromString(const string& input,
209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                        const FieldDescriptor* field,
210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                        Message* message);
211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Interface that TextFormat::Parser can use to find extensions.
213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // This class may be extended in the future to find more information
214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // like fields, etc.
215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  class LIBPROTOBUF_EXPORT Finder {
216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   public:
217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    virtual ~Finder();
218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Try to find an extension of *message by fully-qualified field
220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // name.  Returns NULL if no extension is known for this name or number.
221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    virtual const FieldDescriptor* FindExtension(
222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        Message* message,
223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        const string& name) const = 0;
224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // A location in the parsed text.
227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct ParseLocation {
228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int line;
229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int column;
230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseLocation() : line(-1), column(-1) {}
232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseLocation(int line_param, int column_param)
233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        : line(line_param), column(column_param) {}
234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Data structure which is populated with the locations of each field
237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // value parsed from the text.
238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  class LIBPROTOBUF_EXPORT ParseInfoTree {
239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   public:
240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseInfoTree();
241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ~ParseInfoTree();
242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Returns the parse location for index-th value of the field in the parsed
244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // text. If none exists, returns a location with line = -1. Index should be
245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // -1 for not-repeated fields.
246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseLocation GetLocation(const FieldDescriptor* field, int index) const;
247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Returns the parse info tree for the given field, which must be a message
249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // type. The nested information tree is owned by the root tree and will be
250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // deleted when it is deleted.
251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseInfoTree* GetTreeForNested(const FieldDescriptor* field,
252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                    int index) const;
253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   private:
255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Allow the text format parser to record information into the tree.
256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    friend class TextFormat;
257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Records the starting location of a single value for a field.
259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void RecordLocation(const FieldDescriptor* field, ParseLocation location);
260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Create and records a nested tree for a nested message field.
262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseInfoTree* CreateNested(const FieldDescriptor* field);
263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Defines the map from the index-th field descriptor to its parse location.
265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    typedef map<const FieldDescriptor*, vector<ParseLocation> > LocationMap;
266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Defines the map from the index-th field descriptor to the nested parse
268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // info tree.
269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    typedef map<const FieldDescriptor*, vector<ParseInfoTree*> > NestedMap;
270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    LocationMap locations_;
272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    NestedMap nested_;
273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParseInfoTree);
275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // For more control over parsing, use this class.
278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  class LIBPROTOBUF_EXPORT Parser {
279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   public:
280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    Parser();
281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ~Parser();
282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::Parse().
284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool Parse(io::ZeroCopyInputStream* input, Message* output);
285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::ParseFromString().
286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool ParseFromString(const string& input, Message* output);
287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::Merge().
288555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool Merge(io::ZeroCopyInputStream* input, Message* output);
289555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::MergeFromString().
290555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool MergeFromString(const string& input, Message* output);
291555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
292555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Set where to report parse errors.  If NULL (the default), errors will
293555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // be printed to stderr.
294555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void RecordErrorsTo(io::ErrorCollector* error_collector) {
295555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      error_collector_ = error_collector;
296555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
297555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
298555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Set how parser finds extensions.  If NULL (the default), the
299555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // parser will use the standard Reflection object associated with
300555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // the message being parsed.
301555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void SetFinder(Finder* finder) {
302555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      finder_ = finder;
303555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
304555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
305555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Sets where location information about the parse will be written. If NULL
306555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // (the default), then no location will be written.
307555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void WriteLocationsTo(ParseInfoTree* tree) {
308555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      parse_info_tree_ = tree;
309555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
310555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
311555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Normally parsing fails if, after parsing, output->IsInitialized()
312555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // returns false.  Call AllowPartialMessage(true) to skip this check.
313555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    void AllowPartialMessage(bool allow) {
314555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      allow_partial_ = allow;
315555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
316555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
317555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::ParseFieldValueFromString
318555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool ParseFieldValueFromString(const string& input,
319555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                   const FieldDescriptor* field,
320555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                   Message* output);
321555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
322555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
323555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   private:
324555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Forward declaration of an internal class used to parse text
325555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // representations (see text_format.cc for implementation).
326555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    class ParserImpl;
327555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
328555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Like TextFormat::Merge().  The provided implementation is used
329555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // to do the parsing.
330555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool MergeUsingImpl(io::ZeroCopyInputStream* input,
331555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        Message* output,
332555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        ParserImpl* parser_impl);
333555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
334555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    io::ErrorCollector* error_collector_;
335555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    Finder* finder_;
336555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseInfoTree* parse_info_tree_;
337555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool allow_partial_;
338555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    bool allow_unknown_field_;
339555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
340555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
341555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private:
342555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Hack: ParseInfoTree declares TextFormat as a friend which should extend
343555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some
344555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide
345555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // helpers for ParserImpl to call methods of ParseInfoTree.
346555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static inline void RecordLocation(ParseInfoTree* info_tree,
347555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                    const FieldDescriptor* field,
348555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                    ParseLocation location);
349555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree,
350555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                            const FieldDescriptor* field);
351555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
352555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);
353555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot};
354555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
355555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void TextFormat::RecordLocation(ParseInfoTree* info_tree,
356555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                       const FieldDescriptor* field,
357555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                                       ParseLocation location) {
358555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  info_tree->RecordLocation(field, location);
359555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
360555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
361555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline TextFormat::ParseInfoTree* TextFormat::CreateNested(
362555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ParseInfoTree* info_tree, const FieldDescriptor* field) {
363555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  return info_tree->CreateNested(field);
364555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
365555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
366555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}  // namespace protobuf
367555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
368555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}  // namespace google
369555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif  // GOOGLE_PROTOBUF_TEXT_FORMAT_H__
370