|  | // 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/transaction_header.h> | 
|  | #include <lib/fidl/cpp/wire/internal/transport_channel.h> | 
|  | #include <lib/fidl/cpp/wire/message.h> | 
|  | #include <lib/fidl/cpp/wire/unknown_interactions.h> | 
|  |  | 
|  | #include <cstring> | 
|  |  | 
|  | namespace fidl::internal { | 
|  |  | 
|  | UnknownMethodReply UnknownMethodReply::MakeReplyFor(uint64_t method_ordinal, | 
|  | ::fidl::MessageDynamicFlags dynamic_flags) { | 
|  | const fidl_union_tag_t kFrameworkErrTag = 3; | 
|  | const zx_status_t kUnknownMethodStatus = ZX_ERR_NOT_SUPPORTED; | 
|  | UnknownMethodReply reply{ | 
|  | .body{ | 
|  | .tag = kFrameworkErrTag, | 
|  | .envelope = | 
|  | { | 
|  | .num_handles = 0, | 
|  | .flags = FIDL_ENVELOPE_FLAGS_INLINING_MASK, | 
|  | }, | 
|  | }, | 
|  | }; | 
|  | InitTxnHeader(&reply.header, 0, method_ordinal, dynamic_flags); | 
|  |  | 
|  | static_assert(sizeof(reply.body.envelope.inline_value) == sizeof(kUnknownMethodStatus)); | 
|  | ::std::memcpy(reply.body.envelope.inline_value, &kUnknownMethodStatus, | 
|  | sizeof(kUnknownMethodStatus)); | 
|  |  | 
|  | return reply; | 
|  | } | 
|  |  | 
|  | void SendChannelUnknownMethodReply(UnknownMethodReply reply, ::fidl::Transaction *txn) { | 
|  | zx_channel_iovec_t iovecs[] = { | 
|  | { | 
|  | .buffer = &reply, | 
|  | .capacity = sizeof(reply), | 
|  | }, | 
|  | }; | 
|  | auto message = ::fidl::OutgoingMessage::Create_InternalMayBreak({ | 
|  | .transport_vtable = &ChannelTransport::VTable, | 
|  | .iovecs = iovecs, | 
|  | .num_iovecs = std::size(iovecs), | 
|  | .handles = nullptr, | 
|  | .handle_metadata = nullptr, | 
|  | .num_handles = 0, | 
|  | .is_transactional = true, | 
|  | }); | 
|  | txn->Reply(&message, {}); | 
|  | } | 
|  |  | 
|  | }  // namespace fidl::internal |