blob: 01ffb4476d8ad4ae41389327bce027b7f9722f9c [file] [log] [blame]
Doug Horn1427b6a2018-12-11 13:19:16 -08001// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "lib/fidl/cpp/encoder.h"
6
7#include <zircon/assert.h>
8#include <zircon/fidl.h>
9
10namespace fidl {
11namespace {
12
13size_t Align(size_t size) {
14 constexpr size_t alignment_mask = FIDL_ALIGNMENT - 1;
15 return (size + alignment_mask) & ~alignment_mask;
16}
17
18} // namespace
19
20Encoder::Encoder(uint32_t ordinal) { EncodeMessageHeader(ordinal); }
21
22Encoder::~Encoder() = default;
23
24size_t Encoder::Alloc(size_t size) {
25 size_t offset = bytes_.size();
26 size_t new_size = bytes_.size() + Align(size);
27 ZX_ASSERT(new_size >= offset);
28 bytes_.resize(new_size);
29 return offset;
30}
31
32#ifdef __Fuchsia__
33void Encoder::EncodeHandle(zx::object_base* value, size_t offset) {
34 if (value->is_valid()) {
35 *GetPtr<zx_handle_t>(offset) = FIDL_HANDLE_PRESENT;
36 handles_.push_back(value->release());
37 } else {
38 *GetPtr<zx_handle_t>(offset) = FIDL_HANDLE_ABSENT;
39 }
40}
41#endif
42
43Message Encoder::GetMessage() {
44 return Message(BytePart(bytes_.data(), bytes_.size(), bytes_.size()),
45 HandlePart(handles_.data(), handles_.size(), handles_.size()));
46}
47
48void Encoder::Reset(uint32_t ordinal) {
49 bytes_.clear();
50 handles_.clear();
51 EncodeMessageHeader(ordinal);
52}
53
54void Encoder::EncodeMessageHeader(uint32_t ordinal) {
55 size_t offset = Alloc(sizeof(fidl_message_header_t));
56 fidl_message_header_t* header = GetPtr<fidl_message_header_t>(offset);
57 header->ordinal = ordinal;
58}
59
60} // namespace fidl