1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: jschorr@google.com (Joseph Schorr) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Utilities for printing and parsing protocol messages in a human-readable, 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// text-based format. 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__ 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__ 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace io { 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ErrorCollector; // tokenizer.h 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class implements protocol buffer text format. Printing and parsing 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// protocol messages in text format is useful for debugging and human editing 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of messages. 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is really a namespace that contains only static methods. 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT TextFormat { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Outputs a textual representation of the given message to the given 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // output stream. 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool Print(const Message& message, io::ZeroCopyOutputStream* output); 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Print the fields in an UnknownFieldSet. They are printed by tag number 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // only. Embedded messages are heuristically identified by attempting to 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // parse them. 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ZeroCopyOutputStream* output); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like Print(), but outputs directly to a string. 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool PrintToString(const Message& message, string* output); 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like PrintUnknownFields(), but outputs directly to a string. 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* output); 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Outputs a textual representation of the value of the field supplied on 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the message supplied. For non-repeated fields, an index of -1 must 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be supplied. Note that this method will print the default value for a 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field if it is not set. 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void PrintFieldValueToString(const Message& message, 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* output); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Class for those users which require more fine-grained control over how 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a protobuffer message is printed out. 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class LIBPROTOBUF_EXPORT Printer { 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Printer(); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~Printer(); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::Print 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool Print(const Message& message, io::ZeroCopyOutputStream* output); 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::PrintUnknownFields 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ZeroCopyOutputStream* output); 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::PrintToString 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool PrintToString(const Message& message, string* output); 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::PrintUnknownFieldsToString 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* output); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::PrintFieldValueToString 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void PrintFieldValueToString(const Message& message, 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* output); 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Adjust the initial indent level of all output. Each indent level is 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // equal to two spaces. 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetInitialIndentLevel(int indent_level) { 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville initial_indent_level_ = indent_level; 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If printing in single line mode, then the entire message will be output 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // on a single line with no line breaks. 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetSingleLineMode(bool single_line_mode) { 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville single_line_mode_ = single_line_mode; 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Set true to print repeated primitives in a format like: 121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // field_name: [1, 2, 3, 4] 122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // instead of printing each value on its own line. Short format applies 123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // only to primitive values -- i.e. everything except strings and 124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // sub-messages/groups. Note that at present this format is not recognized 125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // by the parser. 126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) { 127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville use_short_repeated_primitives_ = use_short_repeated_primitives; 128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Set true to output UTF-8 instead of ASCII. The only difference 131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // is that bytes >= 0x80 in string fields will not be escaped, 132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // because they are assumed to be part of UTF-8 multi-byte 133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // sequences. 134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetUseUtf8StringEscaping(bool as_utf8) { 135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville utf8_string_escaping_ = as_utf8; 136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Forward declaration of an internal class used to print the text 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // output to the OutputStream (see text_format.cc for implementation). 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class TextGenerator; 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Internal Print method, used for writing to the OutputStream via 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the TextGenerator class. 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Print(const Message& message, 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextGenerator& generator); 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Print a single field. 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void PrintField(const Message& message, 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection, 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextGenerator& generator); 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Print a repeated primitive field in short form. 155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void PrintShortRepeatedField(const Message& message, 156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const Reflection* reflection, 157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* field, 158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville TextGenerator& generator); 159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Print the name of a field -- i.e. everything that comes before the 161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // ':' for a single name/value pair. 162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void PrintFieldName(const Message& message, 163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const Reflection* reflection, 164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* field, 165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville TextGenerator& generator); 166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Outputs a textual representation of the value of the field supplied on 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the message supplied or the default value if not set. 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void PrintFieldValue(const Message& message, 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection, 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextGenerator& generator); 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Print the fields in an UnknownFieldSet. They are printed by tag number 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // only. Embedded messages are heuristically identified by attempting to 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // parse them. 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void PrintUnknownFields(const UnknownFieldSet& unknown_fields, 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextGenerator& generator); 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int initial_indent_level_; 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool single_line_mode_; 184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool use_short_repeated_primitives_; 186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool utf8_string_escaping_; 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parses a text-format protocol message from the given input stream to 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the given message object. This function parses the format written 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // by Print(). 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool Parse(io::ZeroCopyInputStream* input, Message* output); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like Parse(), but reads directly from a string. 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool ParseFromString(const string& input, Message* output); 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like Parse(), but the data is merged into the given message, as if 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // using Message::MergeFrom(). 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool Merge(io::ZeroCopyInputStream* input, Message* output); 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like Merge(), but reads directly from a string. 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool MergeFromString(const string& input, Message* output); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse the given text as a single field value and store it into the 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // given field of the given message. If the field is a repeated field, 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the new value will be added to the end 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool ParseFieldValueFromString(const string& input, 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message); 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For more control over parsing, use this class. 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class LIBPROTOBUF_EXPORT Parser { 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Parser(); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~Parser(); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::Parse(). 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool Parse(io::ZeroCopyInputStream* input, Message* output); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::ParseFromString(). 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseFromString(const string& input, Message* output); 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::Merge(). 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool Merge(io::ZeroCopyInputStream* input, Message* output); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::MergeFromString(). 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool MergeFromString(const string& input, Message* output); 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set where to report parse errors. If NULL (the default), errors will 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be printed to stderr. 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void RecordErrorsTo(io::ErrorCollector* error_collector) { 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville error_collector_ = error_collector; 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Normally parsing fails if, after parsing, output->IsInitialized() 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // returns false. Call AllowPartialMessage(true) to skip this check. 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AllowPartialMessage(bool allow) { 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville allow_partial_ = allow; 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::ParseFieldValueFromString 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseFieldValueFromString(const string& input, 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* output); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Forward declaration of an internal class used to parse text 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // representations (see text_format.cc for implementation). 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ParserImpl; 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like TextFormat::Merge(). The provided implementation is used 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to do the parsing. 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool MergeUsingImpl(io::ZeroCopyInputStream* input, 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* output, 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ParserImpl* parser_impl); 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ErrorCollector* error_collector_; 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool allow_partial_; 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_TEXT_FORMAT_H__ 265