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