#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
#include <stdint.h>
#include <string_view>
#include "base/component_export.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
namespace mojo {
class Message;
namespace internal {
template <typename T>
class Array_Data;
#pragma pack(push, 1)
struct MessageHeader : internal::StructHeader {
uint32_t interface_id;
uint32_t name;
uint32_t flags;
uint32_t trace_nonce;
};
static_assert(sizeof(MessageHeader) == 24, "Bad sizeof(MessageHeader)");
struct MessageHeaderV1 : MessageHeader {
uint64_t request_id;
};
static_assert(sizeof(MessageHeaderV1) == 32, "Bad sizeof(MessageHeaderV1)");
struct MessageHeaderV2 : MessageHeaderV1 {
MessageHeaderV2();
GenericPointer payload;
Pointer<Array_Data<uint32_t>> payload_interface_ids;
};
static_assert(sizeof(MessageHeaderV2) == 48, "Bad sizeof(MessageHeaderV2)");
struct MessageHeaderV3 : MessageHeaderV2 {
MessageHeaderV3();
int64_t creation_timeticks_us;
};
static_assert(sizeof(MessageHeaderV3) == 56, "Bad sizeof(MessageHeaderV3)");
#pragma pack(pop)
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) MessageDispatchContext {
public:
explicit MessageDispatchContext(Message* message);
MessageDispatchContext(const MessageDispatchContext&) = delete;
MessageDispatchContext& operator=(const MessageDispatchContext&) = delete;
~MessageDispatchContext();
static MessageDispatchContext* current();
base::OnceCallback<void(std::string_view)> GetBadMessageCallback();
private:
raw_ptr<MessageDispatchContext> outer_context_;
raw_ptr<Message> message_;
};
COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE)
size_t ComputeSerializedMessageSize(size_t payload_size,
size_t payload_interface_id_count);
COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE)
size_t EstimateSerializedMessageSize(uint32_t message_name,
size_t payload_size,
size_t total_size,
size_t estimated_payload_size);
}
}
#endif