1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <functional> 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/hash.h> 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <string> 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/common.h> 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/type.pb.h> 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/internal/object_source.h> 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/internal/object_writer.h> 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/internal/type_info.h> 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/type_resolver.h> 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/stringpiece.h> 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/status.h> 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/statusor.h> 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google { 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf { 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass Field; 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass Type; 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace protobuf 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf { 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace util { 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace converter { 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass TypeInfo; 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// An ObjectSource that can parse a stream of bytes as a protocol buffer. 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Its WriteTo() method can be given an ObjectWriter. 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// This implementation uses a google.protobuf.Type for tag and name lookup. 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// The field names are converted into lower camel-case when writing to the 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// ObjectWriter. 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Sample usage: (suppose input is: string proto) 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// ArrayInputStream arr_stream(proto.data(), proto.size()); 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// CodedInputStream in_stream(&arr_stream); 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// ProtoStreamObjectSource os(&in_stream, /*ServiceTypeInfo*/ typeinfo, 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// <your message google::protobuf::Type>); 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Status status = os.WriteTo(<some ObjectWriter>); 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass LIBPROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource { 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public: 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream, 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TypeResolver* type_resolver, 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type); 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer virtual ~ProtoStreamObjectSource(); 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer virtual util::Status NamedWriteTo(StringPiece name, ObjectWriter* ow) const; 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Sets whether or not to use lowerCamelCase casing for enum values. If set to 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // false, enum values are output without any case conversions. 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // For example, if we have an enum: 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // enum Type { 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ACTION_AND_ADVENTURE = 1; 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // } 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Type type = 20; 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // And this option is set to true. Then the rendered "type" field will have 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // the string "actionAndAdventure". 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // { 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ... 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // "type": "actionAndAdventure", 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ... 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // } 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // If set to false, the rendered "type" field will have the string 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // "ACTION_AND_ADVENTURE". 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // { 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ... 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // "type": "ACTION_AND_ADVENTURE", 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ... 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // } 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void set_use_lower_camel_for_enums(bool value) { 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer use_lower_camel_for_enums_ = value; 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Sets the max recursion depth of proto message to be deserialized. Proto 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // messages over this depth will fail to be deserialized. 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Default value is 64. 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void set_max_recursion_depth(int max_depth) { 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer max_recursion_depth_ = max_depth; 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protected: 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Writes a proto2 Message to the ObjectWriter. When the given end_tag is 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // found this method will complete, allowing it to be used for parsing both 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // nested messages (end with 0) and nested groups (end with group end tag). 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The include_start_and_end parameter allows this method to be called when 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // already inside of an object, and skip calling StartObject and EndObject. 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer virtual util::Status WriteMessage(const google::protobuf::Type& descriptor, 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, const uint32 end_tag, 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool include_start_and_end, 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ObjectWriter* ow) const; 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private: 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream, 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const TypeInfo* typeinfo, 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type); 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Function that renders a well known type with a modified behavior. 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer typedef util::Status (*TypeRenderer)(const ProtoStreamObjectSource*, 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type&, 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece, ObjectWriter*); 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Looks up a field and verify its consistency with wire type in tag. 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Field* FindAndVerifyField( 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, uint32 tag) const; 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // TODO(skarvaje): Mark these methods as non-const as they modify internal 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // state (stream_). 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a repeating field (packed or unpacked). 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns the next tag after reading all sequential repeating elements. The 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // caller should use this tag before reading more tags from the stream. 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer util::StatusOr<uint32> RenderList(const google::protobuf::Field* field, 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, uint32 list_tag, 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ObjectWriter* ow) const; 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a NWP map. 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns the next tag after reading all map entries. The caller should use 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // this tag before reading more tags from the stream. 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer util::StatusOr<uint32> RenderMap(const google::protobuf::Field* field, 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, uint32 list_tag, 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ObjectWriter* ow) const; 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a packed repeating field. A packed field is stored as: 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // {tag length item1 item2 item3} instead of the less efficient 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // {tag item1 tag item2 tag item3}. 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer util::Status RenderPacked(const google::protobuf::Field* field, 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ObjectWriter* ow) const; 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a google.protobuf.Timestamp value to ObjectWriter 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderTimestamp(const ProtoStreamObjectSource* os, 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a google.protobuf.Duration value to ObjectWriter 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderDuration(const ProtoStreamObjectSource* os, 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Following RenderTYPE functions render well known types in 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // google/protobuf/wrappers.proto corresponding to TYPE. 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderDouble(const ProtoStreamObjectSource* os, 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderFloat(const ProtoStreamObjectSource* os, 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderInt64(const ProtoStreamObjectSource* os, 185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderUInt64(const ProtoStreamObjectSource* os, 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderInt32(const ProtoStreamObjectSource* os, 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderUInt32(const ProtoStreamObjectSource* os, 194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderBool(const ProtoStreamObjectSource* os, 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderString(const ProtoStreamObjectSource* os, 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderBytes(const ProtoStreamObjectSource* os, 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a google.protobuf.Struct to ObjectWriter. 207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderStruct(const ProtoStreamObjectSource* os, 208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Helper to render google.protobuf.Struct's Value fields to ObjectWriter. 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderStructValue(const ProtoStreamObjectSource* os, 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Helper to render google.protobuf.Struct's ListValue fields to ObjectWriter. 217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderStructListValue( 218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ProtoStreamObjectSource* os, const google::protobuf::Type& type, 219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Render the "Any" type. 222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderAny(const ProtoStreamObjectSource* os, 223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Render the "FieldMask" type. 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static util::Status RenderFieldMask(const ProtoStreamObjectSource* os, 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type, 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece name, ObjectWriter* ow); 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static hash_map<string, TypeRenderer>* renderers_; 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static void InitRendererMap(); 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static void DeleteRendererMap(); 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static TypeRenderer* FindTypeRenderer(const string& type_url); 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Renders a field value to the ObjectWriter. 237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer util::Status RenderField(const google::protobuf::Field* field, 238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece field_name, ObjectWriter* ow) const; 239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Same as above but renders all non-message field types. Callers don't call 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // this function directly. They just use RenderField. 242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer util::Status RenderNonMessageField(const google::protobuf::Field* field, 243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece field_name, 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ObjectWriter* ow) const; 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Reads field value according to Field spec in 'field' and returns the read 248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // value as string. This only works for primitive datatypes (no message 249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // types). 250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string ReadFieldValueAsString( 251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Field& field) const; 252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Utility function to detect proto maps. The 'field' MUST be repeated. 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool IsMap(const google::protobuf::Field& field) const; 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Utility to read int64 and int32 values from a message type in stream_. 257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Used for reading google.protobuf.Timestamp and Duration messages. 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer std::pair<int64, int32> ReadSecondsAndNanos( 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type) const; 260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Helper function to check recursion depth and increment it. It will return 262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Status::OK if the current depth is allowed. Otherwise an error is returned. 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // type_name and field_name are used for error reporting. 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer util::Status IncrementRecursionDepth(StringPiece type_name, 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StringPiece field_name) const; 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Input stream to read from. Ownership rests with the caller. 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::io::CodedInputStream* stream_; 269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Type information for all the types used in the descriptor. Used to find 271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // google::protobuf::Type of nested messages/enums. 272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const TypeInfo* typeinfo_; 273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Whether this class owns the typeinfo_ object. If true the typeinfo_ object 274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // should be deleted in the destructor. 275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool own_typeinfo_; 276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // google::protobuf::Type of the message source. 278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const google::protobuf::Type& type_; 279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Whether to render enums using lowerCamelCase. Defaults to false. 282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool use_lower_camel_for_enums_; 283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Tracks current recursion depth. 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mutable int recursion_depth_; 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Maximum allowed recursion depth. 288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int max_recursion_depth_; 289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource); 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace converter 294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace util 295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace protobuf 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace google 298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ 299