blob: 98f033a4cee609d79f40d90626fc2a0da73ca0f0 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// 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_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 {
// Interface ID for identifying multiple interfaces running on the same
// message pipe.
uint32_t interface_id;
// Message name, which is scoped to the interface that the message belongs to.
uint32_t name;
// A combination of zero or more of the flag constants defined within the
// Message class.
uint32_t flags;
// A unique (hopefully) value for a message. Used in tracing, forming the
// lower part of the 64-bit trace id, which is used to match trace events for
// sending and receiving a message (`name` forms the upper part).
uint32_t trace_nonce;
};
static_assert(sizeof(MessageHeader) == 24, "Bad sizeof(MessageHeader)");
struct MessageHeaderV1 : MessageHeader {
// Only used if either kFlagExpectsResponse or kFlagIsResponse is set in
// order to match responses with corresponding requests.
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);
} // namespace internal
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_