Index: third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.h |
diff --git a/third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.h b/third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..78defa1d488d19765c77e5552c5148e41a7c43f3 |
--- /dev/null |
+++ b/third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.h |
@@ -0,0 +1,248 @@ |
+// 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. |
+ |
+#ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ |
+#define GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ |
+ |
+#include <functional> |
+#include <google/protobuf/stubs/hash.h> |
+#include <string> |
+ |
+#include <google/protobuf/stubs/common.h> |
+#include <google/protobuf/type.pb.h> |
+#include <google/protobuf/util/internal/object_source.h> |
+#include <google/protobuf/util/internal/object_writer.h> |
+#include <google/protobuf/util/internal/type_info.h> |
+#include <google/protobuf/util/type_resolver.h> |
+#include <google/protobuf/stubs/stringpiece.h> |
+#include <google/protobuf/stubs/status.h> |
+#include <google/protobuf/stubs/statusor.h> |
+ |
+ |
+namespace google { |
+namespace protobuf { |
+class Field; |
+class Type; |
+} // namespace protobuf |
+ |
+ |
+namespace protobuf { |
+namespace util { |
+namespace converter { |
+ |
+class TypeInfo; |
+ |
+// An ObjectSource that can parse a stream of bytes as a protocol buffer. |
+// Its WriteTo() method can be given an ObjectWriter. |
+// This implementation uses a google.protobuf.Type for tag and name lookup. |
+// The field names are converted into lower camel-case when writing to the |
+// ObjectWriter. |
+// |
+// Sample usage: (suppose input is: string proto) |
+// ArrayInputStream arr_stream(proto.data(), proto.size()); |
+// CodedInputStream in_stream(&arr_stream); |
+// ProtoStreamObjectSource os(&in_stream, /*ServiceTypeInfo*/ typeinfo, |
+// <your message google::protobuf::Type>); |
+// |
+// Status status = os.WriteTo(<some ObjectWriter>); |
+class LIBPROTOBUF_EXPORT ProtoStreamObjectSource : public ObjectSource { |
+ public: |
+ ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream, |
+ TypeResolver* type_resolver, |
+ const google::protobuf::Type& type); |
+ |
+ virtual ~ProtoStreamObjectSource(); |
+ |
+ virtual util::Status NamedWriteTo(StringPiece name, ObjectWriter* ow) const; |
+ |
+ protected: |
+ // Writes a proto2 Message to the ObjectWriter. When the given end_tag is |
+ // found this method will complete, allowing it to be used for parsing both |
+ // nested messages (end with 0) and nested groups (end with group end tag). |
+ // The include_start_and_end parameter allows this method to be called when |
+ // already inside of an object, and skip calling StartObject and EndObject. |
+ virtual util::Status WriteMessage(const google::protobuf::Type& descriptor, |
+ StringPiece name, const uint32 end_tag, |
+ bool include_start_and_end, |
+ ObjectWriter* ow) const; |
+ |
+ private: |
+ ProtoStreamObjectSource(google::protobuf::io::CodedInputStream* stream, |
+ const TypeInfo* typeinfo, |
+ const google::protobuf::Type& type); |
+ // Function that renders a well known type with a modified behavior. |
+ typedef util::Status (*TypeRenderer)(const ProtoStreamObjectSource*, |
+ const google::protobuf::Type&, |
+ StringPiece, ObjectWriter*); |
+ |
+ // Looks up a field and verify its consistency with wire type in tag. |
+ const google::protobuf::Field* FindAndVerifyField( |
+ const google::protobuf::Type& type, uint32 tag) const; |
+ |
+ // TODO(skarvaje): Mark these methods as non-const as they modify internal |
+ // state (stream_). |
+ // |
+ // Renders a repeating field (packed or unpacked). |
+ // Returns the next tag after reading all sequential repeating elements. The |
+ // caller should use this tag before reading more tags from the stream. |
+ util::StatusOr<uint32> RenderList(const google::protobuf::Field* field, |
+ StringPiece name, uint32 list_tag, |
+ ObjectWriter* ow) const; |
+ // Renders a NWP map. |
+ // Returns the next tag after reading all map entries. The caller should use |
+ // this tag before reading more tags from the stream. |
+ util::StatusOr<uint32> RenderMap(const google::protobuf::Field* field, |
+ StringPiece name, uint32 list_tag, |
+ ObjectWriter* ow) const; |
+ |
+ // Renders a packed repeating field. A packed field is stored as: |
+ // {tag length item1 item2 item3} instead of the less efficient |
+ // {tag item1 tag item2 tag item3}. |
+ util::Status RenderPacked(const google::protobuf::Field* field, |
+ ObjectWriter* ow) const; |
+ |
+ // Renders a google.protobuf.Timestamp value to ObjectWriter |
+ static util::Status RenderTimestamp(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Renders a google.protobuf.Duration value to ObjectWriter |
+ static util::Status RenderDuration(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Following RenderTYPE functions render well known types in |
+ // google/protobuf/wrappers.proto corresponding to TYPE. |
+ static util::Status RenderDouble(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderFloat(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderInt64(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderUInt64(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderInt32(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderUInt32(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderBool(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderString(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ static util::Status RenderBytes(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Renders a google.protobuf.Struct to ObjectWriter. |
+ static util::Status RenderStruct(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Helper to render google.protobuf.Struct's Value fields to ObjectWriter. |
+ static util::Status RenderStructValue(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Helper to render google.protobuf.Struct's ListValue fields to ObjectWriter. |
+ static util::Status RenderStructListValue( |
+ const ProtoStreamObjectSource* os, const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Render the "Any" type. |
+ static util::Status RenderAny(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ // Render the "FieldMask" type. |
+ static util::Status RenderFieldMask(const ProtoStreamObjectSource* os, |
+ const google::protobuf::Type& type, |
+ StringPiece name, ObjectWriter* ow); |
+ |
+ static hash_map<string, TypeRenderer>* renderers_; |
+ static void InitRendererMap(); |
+ static void DeleteRendererMap(); |
+ static TypeRenderer* FindTypeRenderer(const string& type_url); |
+ |
+ // Renders a field value to the ObjectWriter. |
+ util::Status RenderField(const google::protobuf::Field* field, |
+ StringPiece field_name, ObjectWriter* ow) const; |
+ |
+ // Same as above but renders all non-message field types. Callers don't call |
+ // this function directly. They just use RenderField. |
+ util::Status RenderNonMessageField(const google::protobuf::Field* field, |
+ StringPiece field_name, |
+ ObjectWriter* ow) const; |
+ |
+ |
+ // Reads field value according to Field spec in 'field' and returns the read |
+ // value as string. This only works for primitive datatypes (no message |
+ // types). |
+ const string ReadFieldValueAsString( |
+ const google::protobuf::Field& field) const; |
+ |
+ // Utility function to detect proto maps. The 'field' MUST be repeated. |
+ bool IsMap(const google::protobuf::Field& field) const; |
+ |
+ // Utility to read int64 and int32 values from a message type in stream_. |
+ // Used for reading google.protobuf.Timestamp and Duration messages. |
+ std::pair<int64, int32> ReadSecondsAndNanos( |
+ const google::protobuf::Type& type) const; |
+ |
+ // Input stream to read from. Ownership rests with the caller. |
+ google::protobuf::io::CodedInputStream* stream_; |
+ |
+ // Type information for all the types used in the descriptor. Used to find |
+ // google::protobuf::Type of nested messages/enums. |
+ const TypeInfo* typeinfo_; |
+ // Whether this class owns the typeinfo_ object. If true the typeinfo_ object |
+ // should be deleted in the destructor. |
+ bool own_typeinfo_; |
+ |
+ // google::protobuf::Type of the message source. |
+ const google::protobuf::Type& type_; |
+ |
+ |
+ GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource); |
+}; |
+ |
+} // namespace converter |
+} // namespace util |
+} // namespace protobuf |
+ |
+} // namespace google |
+#endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_PROTOSTREAM_OBJECTSOURCE_H__ |