blob: b931879c57d30df70c7072b65b914daeb875871f [file] [log] [blame]
// 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