blob: 6806a73213c6cbd0b184aad3a397832726525327 [file] [log] [blame]
// Copyright 2013 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.
#include "mojo/public/cpp/bindings/lib/message_builder.h"
#include "mojo/public/cpp/bindings/lib/array_internal.h"
#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
#include "mojo/public/cpp/bindings/lib/buffer.h"
#include "mojo/public/cpp/bindings/lib/message_internal.h"
namespace mojo {
namespace internal {
template <typename Header>
void Allocate(Buffer* buf, Header** header) {
*header = static_cast<Header*>(buf->Allocate(sizeof(Header)));
(*header)->num_bytes = sizeof(Header);
}
MessageBuilder::MessageBuilder(uint32_t name,
uint32_t flags,
size_t payload_size,
size_t payload_interface_id_count) {
if (payload_interface_id_count > 0) {
// Version 2
InitializeMessage(
sizeof(MessageHeaderV2) + Align(payload_size) +
ArrayDataTraits<uint32_t>::GetStorageSize(
static_cast<uint32_t>(payload_interface_id_count)));
MessageHeaderV2* header;
Allocate(message_.buffer(), &header);
header->version = 2;
header->name = name;
header->flags = flags;
// The payload immediately follows the header.
header->payload.Set(header + 1);
} else if (flags &
(Message::kFlagExpectsResponse | Message::kFlagIsResponse)) {
// Version 1
InitializeMessage(sizeof(MessageHeaderV1) + payload_size);
MessageHeaderV1* header;
Allocate(message_.buffer(), &header);
header->version = 1;
header->name = name;
header->flags = flags;
} else {
InitializeMessage(sizeof(MessageHeader) + payload_size);
MessageHeader* header;
Allocate(message_.buffer(), &header);
header->version = 0;
header->name = name;
header->flags = flags;
}
}
MessageBuilder::~MessageBuilder() {
}
void MessageBuilder::InitializeMessage(size_t size) {
message_.Initialize(static_cast<uint32_t>(Align(size)),
true /* zero_initialized */);
}
} // namespace internal
} // namespace mojo