| // 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_ |