// Copyright 2018 The Fuchsia 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 <lib/fidl/cpp/message_buffer.h>
#include <zircon/assert.h>

#include <stdlib.h>

namespace fidl {
namespace {

uint64_t AddPadding(uint32_t offset) {
    constexpr uint32_t kMask = alignof(zx_handle_t) - 1;
    // Cast before addition to avoid overflow.
    return static_cast<uint64_t>(offset) + static_cast<uint64_t>(offset & kMask);
}

size_t GetAllocSize(uint32_t bytes_capacity, uint32_t handles_capacity) {
    return AddPadding(bytes_capacity) + sizeof(zx_handle_t) * handles_capacity;
}

} // namespace

MessageBuffer::MessageBuffer(uint32_t bytes_capacity,
                             uint32_t handles_capacity)
    : buffer_(static_cast<uint8_t*>(malloc(GetAllocSize(bytes_capacity, handles_capacity)))),
      bytes_capacity_(bytes_capacity),
      handles_capacity_(handles_capacity) {
    ZX_ASSERT_MSG(buffer_, "malloc returned NULL in MessageBuffer::MessageBuffer()");
}

MessageBuffer::~MessageBuffer() {
    free(buffer_);
}

zx_handle_t* MessageBuffer::handles() const {
    return reinterpret_cast<zx_handle_t*>(buffer_ + AddPadding(bytes_capacity_));
}

Message MessageBuffer::CreateEmptyMessage() {
    return Message(BytePart(bytes(), bytes_capacity()),
                   HandlePart(handles(), handles_capacity()));
}

Builder MessageBuffer::CreateBuilder() {
    return Builder(bytes(), bytes_capacity());
}

} // namespace fidl
