123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- // Protocol Buffers - Google's data interchange format
- // Copyright 2008 Google Inc. All rights reserved.
- // https://developers.google.com/protocol-buffers/
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- //
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Google Inc. nor the names of its
- // contributors may be used to endorse or promote products derived from
- // this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- // Author: jschorr@google.com (Joseph Schorr)
- // Based on original Protocol Buffers design by
- // Sanjay Ghemawat, Jeff Dean, and others.
- //
- // Utilities for printing and parsing protocol messages in a human-readable,
- // text-based format.
- #ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__
- #define GOOGLE_PROTOBUF_TEXT_FORMAT_H__
- #include <map>
- #include <memory>
- #include <string>
- #include <vector>
- #include <google/protobuf/stubs/common.h>
- #include <google/protobuf/descriptor.h>
- #include <google/protobuf/message.h>
- #include <google/protobuf/message_lite.h>
- #include <google/protobuf/port.h>
- #include <google/protobuf/port_def.inc>
- #ifdef SWIG
- #error "You cannot SWIG proto headers"
- #endif
- namespace google {
- namespace protobuf {
- namespace io {
- class ErrorCollector; // tokenizer.h
- }
- // This class implements protocol buffer text format, colloquially known as text
- // proto. Printing and parsing protocol messages in text format is useful for
- // debugging and human editing of messages.
- //
- // This class is really a namespace that contains only static methods.
- class PROTOBUF_EXPORT TextFormat {
- public:
- // Outputs a textual representation of the given message to the given
- // output stream. Returns false if printing fails.
- static bool Print(const Message& message, io::ZeroCopyOutputStream* output);
- // Print the fields in an UnknownFieldSet. They are printed by tag number
- // only. Embedded messages are heuristically identified by attempting to
- // parse them. Returns false if printing fails.
- static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
- io::ZeroCopyOutputStream* output);
- // Like Print(), but outputs directly to a string.
- // Note: output will be cleared prior to printing, and will be left empty
- // even if printing fails. Returns false if printing fails.
- static bool PrintToString(const Message& message, std::string* output);
- // Like PrintUnknownFields(), but outputs directly to a string. Returns
- // false if printing fails.
- static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
- std::string* output);
- // Outputs a textual representation of the value of the field supplied on
- // the message supplied. For non-repeated fields, an index of -1 must
- // be supplied. Note that this method will print the default value for a
- // field if it is not set.
- static void PrintFieldValueToString(const Message& message,
- const FieldDescriptor* field, int index,
- std::string* output);
- class PROTOBUF_EXPORT BaseTextGenerator {
- public:
- virtual ~BaseTextGenerator();
- virtual void Indent() {}
- virtual void Outdent() {}
- // Returns the current indentation size in characters.
- virtual size_t GetCurrentIndentationSize() const { return 0; }
- // Print text to the output stream.
- virtual void Print(const char* text, size_t size) = 0;
- void PrintString(const std::string& str) { Print(str.data(), str.size()); }
- template <size_t n>
- void PrintLiteral(const char (&text)[n]) {
- Print(text, n - 1); // n includes the terminating zero character.
- }
- };
- // The default printer that converts scalar values from fields into their
- // string representation.
- // You can derive from this FastFieldValuePrinter if you want to have fields
- // to be printed in a different way and register it at the Printer.
- class PROTOBUF_EXPORT FastFieldValuePrinter {
- public:
- FastFieldValuePrinter();
- virtual ~FastFieldValuePrinter();
- virtual void PrintBool(bool val, BaseTextGenerator* generator) const;
- virtual void PrintInt32(int32 val, BaseTextGenerator* generator) const;
- virtual void PrintUInt32(uint32 val, BaseTextGenerator* generator) const;
- virtual void PrintInt64(int64 val, BaseTextGenerator* generator) const;
- virtual void PrintUInt64(uint64 val, BaseTextGenerator* generator) const;
- virtual void PrintFloat(float val, BaseTextGenerator* generator) const;
- virtual void PrintDouble(double val, BaseTextGenerator* generator) const;
- virtual void PrintString(const std::string& val,
- BaseTextGenerator* generator) const;
- virtual void PrintBytes(const std::string& val,
- BaseTextGenerator* generator) const;
- virtual void PrintEnum(int32 val, const std::string& name,
- BaseTextGenerator* generator) const;
- virtual void PrintFieldName(const Message& message, int field_index,
- int field_count, const Reflection* reflection,
- const FieldDescriptor* field,
- BaseTextGenerator* generator) const;
- virtual void PrintFieldName(const Message& message,
- const Reflection* reflection,
- const FieldDescriptor* field,
- BaseTextGenerator* generator) const;
- virtual void PrintMessageStart(const Message& message, int field_index,
- int field_count, bool single_line_mode,
- BaseTextGenerator* generator) const;
- // Allows to override the logic on how to print the content of a message.
- // Return false to use the default printing logic. Note that it is legal for
- // this function to print something and then return false to use the default
- // content printing (although at that point it would behave similarly to
- // PrintMessageStart).
- virtual bool PrintMessageContent(const Message& message, int field_index,
- int field_count, bool single_line_mode,
- BaseTextGenerator* generator) const;
- virtual void PrintMessageEnd(const Message& message, int field_index,
- int field_count, bool single_line_mode,
- BaseTextGenerator* generator) const;
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FastFieldValuePrinter);
- };
- // Deprecated: please use FastFieldValuePrinter instead.
- class PROTOBUF_EXPORT FieldValuePrinter {
- public:
- FieldValuePrinter();
- virtual ~FieldValuePrinter();
- virtual std::string PrintBool(bool val) const;
- virtual std::string PrintInt32(int32 val) const;
- virtual std::string PrintUInt32(uint32 val) const;
- virtual std::string PrintInt64(int64 val) const;
- virtual std::string PrintUInt64(uint64 val) const;
- virtual std::string PrintFloat(float val) const;
- virtual std::string PrintDouble(double val) const;
- virtual std::string PrintString(const std::string& val) const;
- virtual std::string PrintBytes(const std::string& val) const;
- virtual std::string PrintEnum(int32 val, const std::string& name) const;
- virtual std::string PrintFieldName(const Message& message,
- const Reflection* reflection,
- const FieldDescriptor* field) const;
- virtual std::string PrintMessageStart(const Message& message,
- int field_index, int field_count,
- bool single_line_mode) const;
- virtual std::string PrintMessageEnd(const Message& message, int field_index,
- int field_count,
- bool single_line_mode) const;
- private:
- FastFieldValuePrinter delegate_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldValuePrinter);
- };
- class PROTOBUF_EXPORT MessagePrinter {
- public:
- MessagePrinter() {}
- virtual ~MessagePrinter() {}
- virtual void Print(const Message& message, bool single_line_mode,
- BaseTextGenerator* generator) const = 0;
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessagePrinter);
- };
- // Interface that Printers or Parsers can use to find extensions, or types
- // referenced in Any messages.
- class PROTOBUF_EXPORT Finder {
- public:
- virtual ~Finder();
- // Try to find an extension of *message by fully-qualified field
- // name. Returns NULL if no extension is known for this name or number.
- // The base implementation uses the extensions already known by the message.
- virtual const FieldDescriptor* FindExtension(Message* message,
- const std::string& name) const;
- // Similar to FindExtension, but uses a Descriptor and the extension number
- // instead of using a Message and the name when doing the look up.
- virtual const FieldDescriptor* FindExtensionByNumber(
- const Descriptor* descriptor, int number) const;
- // Find the message type for an Any proto.
- // Returns NULL if no message is known for this name.
- // The base implementation only accepts prefixes of type.googleprod.com/ or
- // type.googleapis.com/, and searches the DescriptorPool of the parent
- // message.
- virtual const Descriptor* FindAnyType(const Message& message,
- const std::string& prefix,
- const std::string& name) const;
- // Find the message factory for the given extension field. This can be used
- // to generalize the Parser to add extension fields to a message in the same
- // way as the "input" message for the Parser.
- virtual MessageFactory* FindExtensionFactory(
- const FieldDescriptor* field) const;
- };
- // Class for those users which require more fine-grained control over how
- // a protobuffer message is printed out.
- class PROTOBUF_EXPORT Printer {
- public:
- Printer();
- // Like TextFormat::Print
- bool Print(const Message& message, io::ZeroCopyOutputStream* output) const;
- // Like TextFormat::PrintUnknownFields
- bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,
- io::ZeroCopyOutputStream* output) const;
- // Like TextFormat::PrintToString
- bool PrintToString(const Message& message, std::string* output) const;
- // Like TextFormat::PrintUnknownFieldsToString
- bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,
- std::string* output) const;
- // Like TextFormat::PrintFieldValueToString
- void PrintFieldValueToString(const Message& message,
- const FieldDescriptor* field, int index,
- std::string* output) const;
- // Adjust the initial indent level of all output. Each indent level is
- // equal to two spaces.
- void SetInitialIndentLevel(int indent_level) {
- initial_indent_level_ = indent_level;
- }
- // If printing in single line mode, then the entire message will be output
- // on a single line with no line breaks.
- void SetSingleLineMode(bool single_line_mode) {
- single_line_mode_ = single_line_mode;
- }
- bool IsInSingleLineMode() const { return single_line_mode_; }
- // If use_field_number is true, uses field number instead of field name.
- void SetUseFieldNumber(bool use_field_number) {
- use_field_number_ = use_field_number;
- }
- // Set true to print repeated primitives in a format like:
- // field_name: [1, 2, 3, 4]
- // instead of printing each value on its own line. Short format applies
- // only to primitive values -- i.e. everything except strings and
- // sub-messages/groups.
- void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) {
- use_short_repeated_primitives_ = use_short_repeated_primitives;
- }
- // Set true to output UTF-8 instead of ASCII. The only difference
- // is that bytes >= 0x80 in string fields will not be escaped,
- // because they are assumed to be part of UTF-8 multi-byte
- // sequences. This will change the default FastFieldValuePrinter.
- void SetUseUtf8StringEscaping(bool as_utf8);
- // Set the default FastFieldValuePrinter that is used for all fields that
- // don't have a field-specific printer registered.
- // Takes ownership of the printer.
- void SetDefaultFieldValuePrinter(const FastFieldValuePrinter* printer);
- PROTOBUF_DEPRECATED_MSG("Please use FastFieldValuePrinter")
- void SetDefaultFieldValuePrinter(const FieldValuePrinter* printer);
- // Sets whether we want to hide unknown fields or not.
- // Usually unknown fields are printed in a generic way that includes the
- // tag number of the field instead of field name. However, sometimes it
- // is useful to be able to print the message without unknown fields (e.g.
- // for the python protobuf version to maintain consistency between its pure
- // python and c++ implementations).
- void SetHideUnknownFields(bool hide) { hide_unknown_fields_ = hide; }
- // If print_message_fields_in_index_order is true, fields of a proto message
- // will be printed using the order defined in source code instead of the
- // field number, extensions will be printed at the end of the message
- // and their relative order is determined by the extension number.
- // By default, use the field number order.
- void SetPrintMessageFieldsInIndexOrder(
- bool print_message_fields_in_index_order) {
- print_message_fields_in_index_order_ =
- print_message_fields_in_index_order;
- }
- // If expand==true, expand google.protobuf.Any payloads. The output
- // will be of form
- // [type_url] { <value_printed_in_text> }
- //
- // If expand==false, print Any using the default printer. The output will
- // look like
- // type_url: "<type_url>" value: "serialized_content"
- void SetExpandAny(bool expand) { expand_any_ = expand; }
- // Set how parser finds message for Any payloads.
- void SetFinder(const Finder* finder) { finder_ = finder; }
- // If non-zero, we truncate all string fields that are longer than
- // this threshold. This is useful when the proto message has very long
- // strings, e.g., dump of encoded image file.
- //
- // NOTE(hfgong): Setting a non-zero value breaks round-trip safe
- // property of TextFormat::Printer. That is, from the printed message, we
- // cannot fully recover the original string field any more.
- void SetTruncateStringFieldLongerThan(
- const int64 truncate_string_field_longer_than) {
- truncate_string_field_longer_than_ = truncate_string_field_longer_than;
- }
- // Register a custom field-specific FastFieldValuePrinter for fields
- // with a particular FieldDescriptor.
- // Returns "true" if the registration succeeded, or "false", if there is
- // already a printer for that FieldDescriptor.
- // Takes ownership of the printer on successful registration.
- bool RegisterFieldValuePrinter(const FieldDescriptor* field,
- const FastFieldValuePrinter* printer);
- PROTOBUF_DEPRECATED_MSG("Please use FastFieldValuePrinter")
- bool RegisterFieldValuePrinter(const FieldDescriptor* field,
- const FieldValuePrinter* printer);
- // Register a custom message-specific MessagePrinter for messages with a
- // particular Descriptor.
- // Returns "true" if the registration succeeded, or "false" if there is
- // already a printer for that Descriptor.
- bool RegisterMessagePrinter(const Descriptor* descriptor,
- const MessagePrinter* printer);
- private:
- // Forward declaration of an internal class used to print the text
- // output to the OutputStream (see text_format.cc for implementation).
- class TextGenerator;
- // Forward declaration of an internal class used to print field values for
- // DebugString APIs (see text_format.cc for implementation).
- class DebugStringFieldValuePrinter;
- // Forward declaration of an internal class used to print UTF-8 escaped
- // strings (see text_format.cc for implementation).
- class FastFieldValuePrinterUtf8Escaping;
- static const char* const kDoNotParse;
- // Internal Print method, used for writing to the OutputStream via
- // the TextGenerator class.
- void Print(const Message& message, TextGenerator* generator) const;
- // Print a single field.
- void PrintField(const Message& message, const Reflection* reflection,
- const FieldDescriptor* field,
- TextGenerator* generator) const;
- // Print a repeated primitive field in short form.
- void PrintShortRepeatedField(const Message& message,
- const Reflection* reflection,
- const FieldDescriptor* field,
- TextGenerator* generator) const;
- // Print the name of a field -- i.e. everything that comes before the
- // ':' for a single name/value pair.
- void PrintFieldName(const Message& message, int field_index,
- int field_count, const Reflection* reflection,
- const FieldDescriptor* field,
- TextGenerator* generator) const;
- // Outputs a textual representation of the value of the field supplied on
- // the message supplied or the default value if not set.
- void PrintFieldValue(const Message& message, const Reflection* reflection,
- const FieldDescriptor* field, int index,
- TextGenerator* generator) const;
- // Print the fields in an UnknownFieldSet. They are printed by tag number
- // only. Embedded messages are heuristically identified by attempting to
- // parse them (subject to the recursion budget).
- void PrintUnknownFields(const UnknownFieldSet& unknown_fields,
- TextGenerator* generator,
- int recursion_budget) const;
- bool PrintAny(const Message& message, TextGenerator* generator) const;
- const FastFieldValuePrinter* GetFieldPrinter(
- const FieldDescriptor* field) const {
- auto it = custom_printers_.find(field);
- return it == custom_printers_.end() ? default_field_value_printer_.get()
- : it->second.get();
- }
- int initial_indent_level_;
- bool single_line_mode_;
- bool use_field_number_;
- bool use_short_repeated_primitives_;
- bool insert_silent_marker_;
- bool hide_unknown_fields_;
- bool print_message_fields_in_index_order_;
- bool expand_any_;
- int64 truncate_string_field_longer_than_;
- std::unique_ptr<const FastFieldValuePrinter> default_field_value_printer_;
- typedef std::map<const FieldDescriptor*,
- std::unique_ptr<const FastFieldValuePrinter>>
- CustomPrinterMap;
- CustomPrinterMap custom_printers_;
- typedef std::map<const Descriptor*, std::unique_ptr<const MessagePrinter>>
- CustomMessagePrinterMap;
- CustomMessagePrinterMap custom_message_printers_;
- const Finder* finder_;
- };
- // Parses a text-format protocol message from the given input stream to
- // the given message object. This function parses the human-readable format
- // written by Print(). Returns true on success. The message is cleared first,
- // even if the function fails -- See Merge() to avoid this behavior.
- //
- // Example input: "user {\n id: 123 extra { gender: MALE language: 'en' }\n}"
- //
- // One use for this function is parsing handwritten strings in test code.
- // Another use is to parse the output from google::protobuf::Message::DebugString()
- // (or ShortDebugString()), because these functions output using
- // google::protobuf::TextFormat::Print().
- //
- // If you would like to read a protocol buffer serialized in the
- // (non-human-readable) binary wire format, see
- // google::protobuf::MessageLite::ParseFromString().
- static bool Parse(io::ZeroCopyInputStream* input, Message* output);
- // Like Parse(), but reads directly from a string.
- static bool ParseFromString(ConstStringParam input, Message* output);
- // Like Parse(), but the data is merged into the given message, as if
- // using Message::MergeFrom().
- static bool Merge(io::ZeroCopyInputStream* input, Message* output);
- // Like Merge(), but reads directly from a string.
- static bool MergeFromString(ConstStringParam input, Message* output);
- // Parse the given text as a single field value and store it into the
- // given field of the given message. If the field is a repeated field,
- // the new value will be added to the end
- static bool ParseFieldValueFromString(const std::string& input,
- const FieldDescriptor* field,
- Message* message);
- // A location in the parsed text.
- struct ParseLocation {
- int line;
- int column;
- ParseLocation() : line(-1), column(-1) {}
- ParseLocation(int line_param, int column_param)
- : line(line_param), column(column_param) {}
- };
- // Data structure which is populated with the locations of each field
- // value parsed from the text.
- class PROTOBUF_EXPORT ParseInfoTree {
- public:
- ParseInfoTree() = default;
- ParseInfoTree(const ParseInfoTree&) = delete;
- ParseInfoTree& operator=(const ParseInfoTree&) = delete;
- // Returns the parse location for index-th value of the field in the parsed
- // text. If none exists, returns a location with line = -1. Index should be
- // -1 for not-repeated fields.
- ParseLocation GetLocation(const FieldDescriptor* field, int index) const;
- // Returns the parse info tree for the given field, which must be a message
- // type. The nested information tree is owned by the root tree and will be
- // deleted when it is deleted.
- ParseInfoTree* GetTreeForNested(const FieldDescriptor* field,
- int index) const;
- private:
- // Allow the text format parser to record information into the tree.
- friend class TextFormat;
- // Records the starting location of a single value for a field.
- void RecordLocation(const FieldDescriptor* field, ParseLocation location);
- // Create and records a nested tree for a nested message field.
- ParseInfoTree* CreateNested(const FieldDescriptor* field);
- // Defines the map from the index-th field descriptor to its parse location.
- typedef std::map<const FieldDescriptor*, std::vector<ParseLocation> >
- LocationMap;
- // Defines the map from the index-th field descriptor to the nested parse
- // info tree.
- typedef std::map<const FieldDescriptor*,
- std::vector<std::unique_ptr<ParseInfoTree>>>
- NestedMap;
- LocationMap locations_;
- NestedMap nested_;
- };
- // For more control over parsing, use this class.
- class PROTOBUF_EXPORT Parser {
- public:
- Parser();
- ~Parser();
- // Like TextFormat::Parse().
- bool Parse(io::ZeroCopyInputStream* input, Message* output);
- // Like TextFormat::ParseFromString().
- bool ParseFromString(ConstStringParam input, Message* output);
- // Like TextFormat::Merge().
- bool Merge(io::ZeroCopyInputStream* input, Message* output);
- // Like TextFormat::MergeFromString().
- bool MergeFromString(ConstStringParam input, Message* output);
- // Set where to report parse errors. If NULL (the default), errors will
- // be printed to stderr.
- void RecordErrorsTo(io::ErrorCollector* error_collector) {
- error_collector_ = error_collector;
- }
- // Set how parser finds extensions. If NULL (the default), the
- // parser will use the standard Reflection object associated with
- // the message being parsed.
- void SetFinder(const Finder* finder) { finder_ = finder; }
- // Sets where location information about the parse will be written. If NULL
- // (the default), then no location will be written.
- void WriteLocationsTo(ParseInfoTree* tree) { parse_info_tree_ = tree; }
- // Normally parsing fails if, after parsing, output->IsInitialized()
- // returns false. Call AllowPartialMessage(true) to skip this check.
- void AllowPartialMessage(bool allow) { allow_partial_ = allow; }
- // Allow field names to be matched case-insensitively.
- // This is not advisable if there are fields that only differ in case, or
- // if you want to enforce writing in the canonical form.
- // This is 'false' by default.
- void AllowCaseInsensitiveField(bool allow) {
- allow_case_insensitive_field_ = allow;
- }
- // Like TextFormat::ParseFieldValueFromString
- bool ParseFieldValueFromString(const std::string& input,
- const FieldDescriptor* field,
- Message* output);
- // When an unknown extension is met, parsing will fail if this option is
- // set to false (the default). If true, unknown extensions will be ignored
- // and a warning message will be generated.
- // Beware! Setting this option true may hide some errors (e.g. spelling
- // error on extension name). This allows data loss; unlike binary format,
- // text format cannot preserve unknown extensions. Avoid using this option
- // if possible.
- void AllowUnknownExtension(bool allow) { allow_unknown_extension_ = allow; }
- // When an unknown field is met, parsing will fail if this option is set
- // to false (the default). If true, unknown fields will be ignored and
- // a warning message will be generated.
- // Beware! Setting this option true may hide some errors (e.g. spelling
- // error on field name). This allows data loss; unlike binary format, text
- // format cannot preserve unknown fields. Avoid using this option
- // if possible.
- void AllowUnknownField(bool allow) { allow_unknown_field_ = allow; }
- void AllowFieldNumber(bool allow) { allow_field_number_ = allow; }
- // Sets maximum recursion depth which parser can use. This is effectively
- // the maximum allowed nesting of proto messages.
- void SetRecursionLimit(int limit) { recursion_limit_ = limit; }
- private:
- // Forward declaration of an internal class used to parse text
- // representations (see text_format.cc for implementation).
- class ParserImpl;
- // Like TextFormat::Merge(). The provided implementation is used
- // to do the parsing.
- bool MergeUsingImpl(io::ZeroCopyInputStream* input, Message* output,
- ParserImpl* parser_impl);
- io::ErrorCollector* error_collector_;
- const Finder* finder_;
- ParseInfoTree* parse_info_tree_;
- bool allow_partial_;
- bool allow_case_insensitive_field_;
- bool allow_unknown_field_;
- bool allow_unknown_extension_;
- bool allow_unknown_enum_;
- bool allow_field_number_;
- bool allow_relaxed_whitespace_;
- bool allow_singular_overwrites_;
- int recursion_limit_;
- };
- private:
- // Hack: ParseInfoTree declares TextFormat as a friend which should extend
- // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some
- // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide
- // helpers for ParserImpl to call methods of ParseInfoTree.
- static inline void RecordLocation(ParseInfoTree* info_tree,
- const FieldDescriptor* field,
- ParseLocation location);
- static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree,
- const FieldDescriptor* field);
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);
- };
- inline void TextFormat::RecordLocation(ParseInfoTree* info_tree,
- const FieldDescriptor* field,
- ParseLocation location) {
- info_tree->RecordLocation(field, location);
- }
- inline TextFormat::ParseInfoTree* TextFormat::CreateNested(
- ParseInfoTree* info_tree, const FieldDescriptor* field) {
- return info_tree->CreateNested(field);
- }
- } // namespace protobuf
- } // namespace google
- #include <google/protobuf/port_undef.inc>
- #endif // GOOGLE_PROTOBUF_TEXT_FORMAT_H__
|