// Copyright 2014 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_MESSAGE_INTERNAL_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
#include <stdint.h>
#include <string>
#include "base/callback.h"
#include "base/component_export.h"
#include "base/macros.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;
// 0 or either of the enum values defined above.
uint32_t flags;
// Unused padding to make the struct size a multiple of 8 bytes.
uint32_t padding;
};
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)");
#pragma pack(pop)
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) MessageDispatchContext {
public:
explicit MessageDispatchContext(Message* message);
~MessageDispatchContext();
static MessageDispatchContext* current();
base::OnceCallback<void(const std::string&)> GetBadMessageCallback();
private:
MessageDispatchContext* outer_context_;
Message* message_;
DISALLOW_COPY_AND_ASSIGN(MessageDispatchContext);
};
class COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) SyncMessageResponseSetup {
public:
static void SetCurrentSyncResponseMessage(Message* message);
};
COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE)
size_t ComputeSerializedMessageSize(uint32_t flags,
size_t payload_size,
size_t payload_interface_id_count);
} // namespace internal
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_