blob: 56350c996b48618969fc83c6dadf74f2aad05d0a [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/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