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