| // 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 |