blob: 7b2311468e9d85e01fc4127998bafab39eba73f8 [file] [log] [blame]
// Copyright 2022 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/internal/natural_message_encoder.h>
#include <zircon/assert.h>
#include <zircon/fidl.h>
namespace fidl::internal {
NaturalMessageEncoder::NaturalMessageEncoder(const TransportVTable* vtable, uint64_t ordinal,
MessageDynamicFlags dynamic_flags)
: body_encoder_(vtable, WireFormatVersion::kV2) {
EncodeMessageHeader(ordinal, dynamic_flags);
}
fidl::OutgoingMessage NaturalMessageEncoder::GetMessage() {
return std::move(body_encoder_)
.GetOutgoingMessage(NaturalBodyEncoder::MessageType::kTransactional);
}
void NaturalMessageEncoder::Reset(uint64_t ordinal, MessageDynamicFlags dynamic_flags) {
body_encoder_.Reset();
EncodeMessageHeader(ordinal, dynamic_flags);
}
void NaturalMessageEncoder::EncodeMessageHeader(uint64_t ordinal,
MessageDynamicFlags dynamic_flags) {
size_t offset = body_encoder_.Alloc(sizeof(fidl_message_header_t));
fidl_message_header_t* header = body_encoder_.GetPtr<fidl_message_header_t>(offset);
fidl::InitTxnHeader(header, 0, ordinal, dynamic_flags);
if (body_encoder_.wire_format() == internal::WireFormatVersion::kV2) {
header->at_rest_flags[0] |= FIDL_MESSAGE_HEADER_AT_REST_FLAGS_0_USE_VERSION_V2;
}
}
} // namespace fidl::internal