Spaces:
Sleeping
Sleeping
// 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. | |
namespace google { | |
namespace protobuf { | |
class FieldDescriptor; | |
class Message; | |
namespace internal { | |
extern const char kAnyFullTypeName[]; // "google.protobuf.Any". | |
extern const char kTypeGoogleApisComPrefix[]; // "type.googleapis.com/". | |
extern const char kTypeGoogleProdComPrefix[]; // "type.googleprod.com/". | |
std::string GetTypeUrl(StringPiece message_name, | |
StringPiece type_url_prefix); | |
// Helper class used to implement google::protobuf::Any. | |
class PROTOBUF_EXPORT AnyMetadata { | |
typedef ArenaStringPtr UrlType; | |
typedef ArenaStringPtr ValueType; | |
public: | |
// AnyMetadata does not take ownership of "type_url" and "value". | |
constexpr AnyMetadata(UrlType* type_url, ValueType* value) | |
: type_url_(type_url), value_(value) {} | |
// Packs a message using the default type URL prefix: "type.googleapis.com". | |
// The resulted type URL will be "type.googleapis.com/<message_full_name>". | |
template <typename T> | |
void PackFrom(const T& message) { | |
InternalPackFrom(message, kTypeGoogleApisComPrefix, T::FullMessageName()); | |
} | |
void PackFrom(const Message& message); | |
// Packs a message using the given type URL prefix. The type URL will be | |
// constructed by concatenating the message type's full name to the prefix | |
// with an optional "/" separator if the prefix doesn't already end with "/". | |
// For example, both PackFrom(message, "type.googleapis.com") and | |
// PackFrom(message, "type.googleapis.com/") yield the same result type | |
// URL: "type.googleapis.com/<message_full_name>". | |
template <typename T> | |
void PackFrom(const T& message, StringPiece type_url_prefix) { | |
InternalPackFrom(message, type_url_prefix, T::FullMessageName()); | |
} | |
void PackFrom(const Message& message, StringPiece type_url_prefix); | |
// Unpacks the payload into the given message. Returns false if the message's | |
// type doesn't match the type specified in the type URL (i.e., the full | |
// name after the last "/" of the type URL doesn't match the message's actual | |
// full name) or parsing the payload has failed. | |
template <typename T> | |
bool UnpackTo(T* message) const { | |
return InternalUnpackTo(T::FullMessageName(), message); | |
} | |
bool UnpackTo(Message* message) const; | |
// Checks whether the type specified in the type URL matches the given type. | |
// A type is considered matching if its full name matches the full name after | |
// the last "/" in the type URL. | |
template <typename T> | |
bool Is() const { | |
return InternalIs(T::FullMessageName()); | |
} | |
private: | |
void InternalPackFrom(const MessageLite& message, | |
StringPiece type_url_prefix, | |
StringPiece type_name); | |
bool InternalUnpackTo(StringPiece type_name, | |
MessageLite* message) const; | |
bool InternalIs(StringPiece type_name) const; | |
UrlType* type_url_; | |
ValueType* value_; | |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AnyMetadata); | |
}; | |
// Get the proto type name from Any::type_url value. For example, passing | |
// "type.googleapis.com/rpc.QueryOrigin" will return "rpc.QueryOrigin" in | |
// *full_type_name. Returns false if the type_url does not have a "/" | |
// in the type url separating the full type name. | |
// | |
// NOTE: this function is available publicly as: | |
// google::protobuf::Any() // static method on the generated message type. | |
bool ParseAnyTypeUrl(StringPiece type_url, std::string* full_type_name); | |
// Get the proto type name and prefix from Any::type_url value. For example, | |
// passing "type.googleapis.com/rpc.QueryOrigin" will return | |
// "type.googleapis.com/" in *url_prefix and "rpc.QueryOrigin" in | |
// *full_type_name. Returns false if the type_url does not have a "/" in the | |
// type url separating the full type name. | |
bool ParseAnyTypeUrl(StringPiece type_url, std::string* url_prefix, | |
std::string* full_type_name); | |
// See if message is of type google.protobuf.Any, if so, return the descriptors | |
// for "type_url" and "value" fields. | |
bool GetAnyFieldDescriptors(const Message& message, | |
const FieldDescriptor** type_url_field, | |
const FieldDescriptor** value_field); | |
} // namespace internal | |
} // namespace protobuf | |
} // namespace google | |