#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 "mojo/public/cpp/bindings/lib/message_internal.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);
UnserializedMessageContext(const UnserializedMessageContext&) = delete;
UnserializedMessageContext& operator=(const UnserializedMessageContext&) =
delete;
virtual ~UnserializedMessageContext();
template <typename MessageType>
MessageType* SafeCast() {
if (reinterpret_cast<uintptr_t>(&MessageType::kMessageTag) != tag_) {
return nullptr;
}
return static_cast<MessageType*>(this);
}
uintptr_t 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(Message& message) = 0;
private:
const uintptr_t tag_;
MessageHeaderV1 header_;
};
}
}
#endif