15a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Protocol Buffers - Google's data interchange format
25a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Copyright 2008 Google Inc.  All rights reserved.
35a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// http://code.google.com/p/protobuf/
45a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
55a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Redistribution and use in source and binary forms, with or without
65a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// modification, are permitted provided that the following conditions are
75a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// met:
85a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
95a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions of source code must retain the above copyright
105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// notice, this list of conditions and the following disclaimer.
115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions in binary form must reproduce the above
125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copyright notice, this list of conditions and the following disclaimer
135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the documentation and/or other materials provided with the
145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// distribution.
155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Neither the name of Google Inc. nor the names of its
165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// contributors may be used to endorse or promote products derived from
175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// this software without specific prior written permission.
185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Author: jschorr@google.com (Joseph Schorr)
325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  Based on original Protocol Buffers design by
335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  Sanjay Ghemawat, Jeff Dean, and others.
345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Utilities for printing and parsing protocol messages in a human-readable,
365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// text-based format.
375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__
395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__
405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <map>
425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string>
435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <vector>
445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/common.h>
455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/message.h>
465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/descriptor.h>
475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google {
495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf {
505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace io {
525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class ErrorCollector;      // tokenizer.h
535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This class implements protocol buffer text format.  Printing and parsing
565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// protocol messages in text format is useful for debugging and human editing
575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of messages.
585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This class is really a namespace that contains only static methods.
605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT TextFormat {
615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Outputs a textual representation of the given message to the given
635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // output stream.
645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool Print(const Message& message, io::ZeroCopyOutputStream* output);
655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Print the fields in an UnknownFieldSet.  They are printed by tag number
675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // only.  Embedded messages are heuristically identified by attempting to
685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // parse them.
695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 io::ZeroCopyOutputStream* output);
715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like Print(), but outputs directly to a string.
735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool PrintToString(const Message& message, string* output);
745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like PrintUnknownFields(), but outputs directly to a string.
765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                         string* output);
785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Outputs a textual representation of the value of the field supplied on
805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the message supplied. For non-repeated fields, an index of -1 must
815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // be supplied. Note that this method will print the default value for a
825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // field if it is not set.
835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static void PrintFieldValueToString(const Message& message,
845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                      const FieldDescriptor* field,
855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                      int index,
865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                      string* output);
875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Class for those users which require more fine-grained control over how
895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // a protobuffer message is printed out.
905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class LIBPROTOBUF_EXPORT Printer {
915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   public:
925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Printer();
935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ~Printer();
945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::Print
965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool Print(const Message& message, io::ZeroCopyOutputStream* output) const;
975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::PrintUnknownFields
985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                            io::ZeroCopyOutputStream* output) const;
1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::PrintToString
1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool PrintToString(const Message& message, string* output) const;
1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::PrintUnknownFieldsToString
1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    string* output) const;
1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::PrintFieldValueToString
1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void PrintFieldValueToString(const Message& message,
1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 const FieldDescriptor* field,
1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 int index,
1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 string* output) const;
1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Adjust the initial indent level of all output.  Each indent level is
1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // equal to two spaces.
1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SetInitialIndentLevel(int indent_level) {
1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      initial_indent_level_ = indent_level;
1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // If printing in single line mode, then the entire message will be output
1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // on a single line with no line breaks.
1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SetSingleLineMode(bool single_line_mode) {
1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      single_line_mode_ = single_line_mode;
1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Set true to print repeated primitives in a format like:
1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    //   field_name: [1, 2, 3, 4]
1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // instead of printing each value on its own line.  Short format applies
1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // only to primitive values -- i.e. everything except strings and
1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // sub-messages/groups.
1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) {
1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      use_short_repeated_primitives_ = use_short_repeated_primitives;
1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Set true to output UTF-8 instead of ASCII.  The only difference
1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // is that bytes >= 0x80 in string fields will not be escaped,
1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // because they are assumed to be part of UTF-8 multi-byte
1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // sequences.
1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SetUseUtf8StringEscaping(bool as_utf8) {
1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      utf8_string_escaping_ = as_utf8;
1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   private:
1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Forward declaration of an internal class used to print the text
1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // output to the OutputStream (see text_format.cc for implementation).
1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    class TextGenerator;
1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Internal Print method, used for writing to the OutputStream via
1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // the TextGenerator class.
1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void Print(const Message& message,
1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot               TextGenerator& generator) const;
1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Print a single field.
1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void PrintField(const Message& message,
1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                    const Reflection* reflection,
1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                    const FieldDescriptor* field,
1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                    TextGenerator& generator) const;
1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Print a repeated primitive field in short form.
1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void PrintShortRepeatedField(const Message& message,
1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 const Reflection* reflection,
1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 const FieldDescriptor* field,
1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 TextGenerator& generator) const;
1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Print the name of a field -- i.e. everything that comes before the
1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // ':' for a single name/value pair.
1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void PrintFieldName(const Message& message,
1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                        const Reflection* reflection,
1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                        const FieldDescriptor* field,
1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                        TextGenerator& generator) const;
1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Outputs a textual representation of the value of the field supplied on
1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // the message supplied or the default value if not set.
1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void PrintFieldValue(const Message& message,
1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         const Reflection* reflection,
1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         const FieldDescriptor* field,
1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         int index,
1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         TextGenerator& generator) const;
1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Print the fields in an UnknownFieldSet.  They are printed by tag number
1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // only.  Embedded messages are heuristically identified by attempting to
1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // parse them.
1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void PrintUnknownFields(const UnknownFieldSet& unknown_fields,
1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                            TextGenerator& generator) const;
1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int initial_indent_level_;
1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool single_line_mode_;
1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool use_short_repeated_primitives_;
1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool utf8_string_escaping_;
1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Parses a text-format protocol message from the given input stream to
1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the given message object.  This function parses the format written
1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // by Print().
1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool Parse(io::ZeroCopyInputStream* input, Message* output);
1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like Parse(), but reads directly from a string.
1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool ParseFromString(const string& input, Message* output);
1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like Parse(), but the data is merged into the given message, as if
2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // using Message::MergeFrom().
2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool Merge(io::ZeroCopyInputStream* input, Message* output);
2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like Merge(), but reads directly from a string.
2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool MergeFromString(const string& input, Message* output);
2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Parse the given text as a single field value and store it into the
2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // given field of the given message. If the field is a repeated field,
2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the new value will be added to the end
2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static bool ParseFieldValueFromString(const string& input,
2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                        const FieldDescriptor* field,
2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                        Message* message);
2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Interface that TextFormat::Parser can use to find extensions.
2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This class may be extended in the future to find more information
2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // like fields, etc.
2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class LIBPROTOBUF_EXPORT Finder {
2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   public:
2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual ~Finder();
2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Try to find an extension of *message by fully-qualified field
2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // name.  Returns NULL if no extension is known for this name or number.
2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual const FieldDescriptor* FindExtension(
2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        Message* message,
2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        const string& name) const = 0;
2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // A location in the parsed text.
2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  struct ParseLocation {
2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int line;
2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int column;
2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseLocation() : line(-1), column(-1) {}
2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseLocation(int line_param, int column_param)
2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        : line(line_param), column(column_param) {}
2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Data structure which is populated with the locations of each field
2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // value parsed from the text.
2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class LIBPROTOBUF_EXPORT ParseInfoTree {
2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   public:
2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseInfoTree();
2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ~ParseInfoTree();
2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Returns the parse location for index-th value of the field in the parsed
2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // text. If none exists, returns a location with line = -1. Index should be
2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // -1 for not-repeated fields.
2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseLocation GetLocation(const FieldDescriptor* field, int index) const;
2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Returns the parse info tree for the given field, which must be a message
2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // type. The nested information tree is owned by the root tree and will be
2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // deleted when it is deleted.
2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseInfoTree* GetTreeForNested(const FieldDescriptor* field,
2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    int index) const;
2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   private:
2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Allow the text format parser to record information into the tree.
2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    friend class TextFormat;
2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Records the starting location of a single value for a field.
2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void RecordLocation(const FieldDescriptor* field, ParseLocation location);
2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Create and records a nested tree for a nested message field.
2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseInfoTree* CreateNested(const FieldDescriptor* field);
2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Defines the map from the index-th field descriptor to its parse location.
2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef map<const FieldDescriptor*, vector<ParseLocation> > LocationMap;
2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Defines the map from the index-th field descriptor to the nested parse
2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // info tree.
2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef map<const FieldDescriptor*, vector<ParseInfoTree*> > NestedMap;
2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    LocationMap locations_;
2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    NestedMap nested_;
2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParseInfoTree);
2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // For more control over parsing, use this class.
2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class LIBPROTOBUF_EXPORT Parser {
2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   public:
2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Parser();
2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ~Parser();
2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::Parse().
2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool Parse(io::ZeroCopyInputStream* input, Message* output);
2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::ParseFromString().
2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool ParseFromString(const string& input, Message* output);
2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::Merge().
2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool Merge(io::ZeroCopyInputStream* input, Message* output);
2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::MergeFromString().
2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool MergeFromString(const string& input, Message* output);
2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Set where to report parse errors.  If NULL (the default), errors will
2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // be printed to stderr.
2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void RecordErrorsTo(io::ErrorCollector* error_collector) {
2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      error_collector_ = error_collector;
2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Set how parser finds extensions.  If NULL (the default), the
2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // parser will use the standard Reflection object associated with
3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // the message being parsed.
3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SetFinder(Finder* finder) {
3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      finder_ = finder;
3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Sets where location information about the parse will be written. If NULL
3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // (the default), then no location will be written.
3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void WriteLocationsTo(ParseInfoTree* tree) {
3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      parse_info_tree_ = tree;
3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Normally parsing fails if, after parsing, output->IsInitialized()
3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // returns false.  Call AllowPartialMessage(true) to skip this check.
3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void AllowPartialMessage(bool allow) {
3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      allow_partial_ = allow;
3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::ParseFieldValueFromString
3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool ParseFieldValueFromString(const string& input,
3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                   const FieldDescriptor* field,
3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                   Message* output);
3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   private:
3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Forward declaration of an internal class used to parse text
3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // representations (see text_format.cc for implementation).
3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    class ParserImpl;
3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Like TextFormat::Merge().  The provided implementation is used
3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // to do the parsing.
3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool MergeUsingImpl(io::ZeroCopyInputStream* input,
3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                        Message* output,
3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                        ParserImpl* parser_impl);
3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    io::ErrorCollector* error_collector_;
3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Finder* finder_;
3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseInfoTree* parse_info_tree_;
3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool allow_partial_;
3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool allow_unknown_field_;
3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Hack: ParseInfoTree declares TextFormat as a friend which should extend
3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some
3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide
3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // helpers for ParserImpl to call methods of ParseInfoTree.
3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void RecordLocation(ParseInfoTree* info_tree,
3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    const FieldDescriptor* field,
3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    ParseLocation location);
3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree,
3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                            const FieldDescriptor* field);
3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);
3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void TextFormat::RecordLocation(ParseInfoTree* info_tree,
3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                       const FieldDescriptor* field,
3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                       ParseLocation location) {
3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  info_tree->RecordLocation(field, location);
3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline TextFormat::ParseInfoTree* TextFormat::CreateNested(
3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ParseInfoTree* info_tree, const FieldDescriptor* field) {
3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return info_tree->CreateNested(field);
3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace protobuf
3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace google
3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif  // GOOGLE_PROTOBUF_TEXT_FORMAT_H__
370