// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_UNSERIALIZED_MESSAGE_CONTEXT_H_ #define MOJO_PUBLIC_CPP_BINDINGS_LIB_UNSERIALIZED_MESSAGE_CONTEXT_H_ #include <stdint.h> #include "base/component_export.h" #include "base/macros.h" #include "base/optional.h" #include "mojo/public/c/system/types.h" #include "mojo/public/cpp/bindings/lib/buffer.h" #include "mojo/public/cpp/bindings/lib/message_internal.h" #include "mojo/public/cpp/bindings/lib/serialization_context.h" namespace mojo { namespace internal { class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) UnserializedMessageContext { public: struct Tag {}; UnserializedMessageContext(const Tag* tag, uint32_t message_name, uint32_t message_flags); virtual ~UnserializedMessageContext(); template <typename MessageType> MessageType* SafeCast() { if (&MessageType::kMessageTag != tag_) return nullptr; return static_cast<MessageType*>(this); } const Tag* tag() const { return tag_; } uint32_t message_name() const { return header_.name; } uint32_t message_flags() const { return header_.flags; } MessageHeaderV1* header() { return &header_; } virtual void Serialize(SerializationContext* serialization_context, Buffer* buffer) = 0; private: // The |tag_| is used for run-time type identification of specific // unserialized message types, e.g. messages generated by mojom bindings. This // allows opaque message objects to be safely downcast once pulled off a pipe. const Tag* const tag_; // We store message metadata in a serialized header structure to simplify // Message implementation which needs to query such metadata for both // serialized and unserialized message objects. MessageHeaderV1 header_; DISALLOW_COPY_AND_ASSIGN(UnserializedMessageContext); }; } // namespace internal } // namespace mojo #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_UNSERIALIZED_MESSAGE_CONTEXT_H_