1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 #ifndef GOOGLE_PROTOBUF_ANY_H__ 32 #define GOOGLE_PROTOBUF_ANY_H__ 33 34 #include <string> 35 36 #include <google/protobuf/stubs/common.h> 37 #include <google/protobuf/descriptor.h> 38 #include <google/protobuf/message.h> 39 #include <google/protobuf/arenastring.h> 40 41 namespace google { 42 namespace protobuf { 43 namespace internal { 44 45 // Helper class used to implement google::protobuf::Any. 46 class LIBPROTOBUF_EXPORT AnyMetadata { 47 typedef ArenaStringPtr UrlType; 48 typedef ArenaStringPtr ValueType; 49 public: 50 // AnyMetadata does not take ownership of "type_url" and "value". 51 AnyMetadata(UrlType* type_url, ValueType* value); 52 53 // Packs a message using the default type URL prefix: "type.googleapis.com". 54 // The resulted type URL will be "type.googleapis.com/<message_full_name>". 55 void PackFrom(const Message& message); 56 // Packs a message using the given type URL prefix. The type URL will be 57 // constructed by concatenating the message type's full name to the prefix 58 // with an optional "/" separator if the prefix doesn't already end up "/". 59 // For example, both PackFrom(message, "type.googleapis.com") and 60 // PackFrom(message, "type.googleapis.com/") yield the same result type 61 // URL: "type.googleapis.com/<message_full_name>". 62 void PackFrom(const Message& message, const string& type_url_prefix); 63 64 // Unpacks the payload into the given message. Returns false if the message's 65 // type doesn't match the type specified in the type URL (i.e., the full 66 // name after the last "/" of the type URL doesn't match the message's actaul 67 // full name) or parsing the payload has failed. 68 bool UnpackTo(Message* message) const; 69 70 // Checks whether the type specified in the type URL matches the given type. 71 // A type is consdiered matching if its full name matches the full name after 72 // the last "/" in the type URL. 73 template<typename T> Is()74 bool Is() const { 75 return InternalIs(T::default_instance().GetDescriptor()); 76 } 77 78 private: 79 bool InternalIs(const Descriptor* message) const; 80 81 UrlType* type_url_; 82 ValueType* value_; 83 84 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AnyMetadata); 85 }; 86 87 extern const char kAnyFullTypeName[]; // "google.protobuf.Any". 88 extern const char kTypeGoogleApisComPrefix[]; // "type.googleapis.com/". 89 extern const char kTypeGoogleProdComPrefix[]; // "type.googleprod.com/". 90 91 // Get the proto type name from Any::type_url value. For example, passing 92 // "type.googleapis.com/rpc.QueryOrigin" will return "rpc.QueryOrigin" in 93 // *full_type_name. Returns false if type_url does not start with 94 // "type.googleapis.com" or "type.googleprod.com". 95 bool ParseAnyTypeUrl(const string& type_url, string* full_type_name); 96 97 // See if message is of type google.protobuf.Any, if so, return the descriptors 98 // for "type_url" and "value" fields. 99 bool GetAnyFieldDescriptors(const Message& message, 100 const FieldDescriptor** type_url_field, 101 const FieldDescriptor** value_field); 102 103 } // namespace internal 104 } // namespace protobuf 105 106 } // namespace google 107 #endif // GOOGLE_PROTOBUF_ANY_H__ 108