Home | History | Annotate | Download | only in protobuf
      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>
     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