// 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/bindings_serialization.h"
#include "mojo/public/cpp/bindings/message.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, size_t payload_size) {
  Initialize(sizeof(MessageHeader) + payload_size);

  MessageHeader* header;
  Allocate(&buf_, &header);
  header->version = 0;
  header->name = name;
}

MessageBuilder::~MessageBuilder() {
}

MessageBuilder::MessageBuilder() {}

void MessageBuilder::Initialize(size_t size) {
  message_.AllocData(static_cast<uint32_t>(Align(size)));
  buf_.Initialize(message_.mutable_data(), message_.data_num_bytes());
}

MessageWithRequestIDBuilder::MessageWithRequestIDBuilder(uint32_t name,
                                                         size_t payload_size,
                                                         uint32_t flags,
                                                         uint64_t request_id) {
  Initialize(sizeof(MessageHeaderWithRequestID) + payload_size);
  MessageHeaderWithRequestID* header;
  Allocate(&buf_, &header);
  header->version = 1;
  header->name = name;
  header->flags = flags;
  header->request_id = request_id;
}

}  // namespace internal
}  // namespace mojo
