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