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