// 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 "src/developer/debug/ipc/message_writer.h"

#include <string.h>

namespace debug_ipc {

namespace {

constexpr uint32_t kInitialSize = 32;

}  // namespace

MessageWriter::MessageWriter() : MessageWriter(kInitialSize) {}

MessageWriter::MessageWriter(size_t initial_size) { buffer_.reserve(initial_size); }

MessageWriter::~MessageWriter() {}

void MessageWriter::WriteBytes(const void* data, uint32_t len) {
  const char* begin = static_cast<const char*>(data);
  const char* end = begin + len;
  buffer_.insert(buffer_.end(), begin, end);
}

void MessageWriter::WriteInt32(int32_t i) { WriteBytes(&i, sizeof(int32_t)); }
void MessageWriter::WriteUint32(uint32_t i) { WriteBytes(&i, sizeof(uint32_t)); }
void MessageWriter::WriteInt64(int64_t i) { WriteBytes(&i, sizeof(int64_t)); }
void MessageWriter::WriteUint64(uint64_t i) { WriteBytes(&i, sizeof(uint64_t)); }

void MessageWriter::WriteString(const std::string& str) {
  // 32-bit size first, followed by bytes.
  uint32_t size = static_cast<uint32_t>(str.size());
  WriteUint32(size);
  if (!str.empty())
    WriteBytes(&str[0], size);
}

void MessageWriter::WriteBool(bool b) { WriteUint32(b ? 1u : 0u); }

void MessageWriter::WriteHeader(MsgHeader::Type type, uint32_t transaction_id) {
  WriteUint32(0);  // Size to be filled in by GetDataAndWriteSize() later.
  WriteUint32(static_cast<uint32_t>(type));
  WriteUint32(transaction_id);
}

std::vector<char> MessageWriter::MessageComplete() {
  uint32_t size = static_cast<uint32_t>(buffer_.size());
  memcpy(&buffer_[0], &size, sizeof(uint32_t));
  return std::move(buffer_);
}

}  // namespace debug_ipc
