blob: 2ffccd3ae1a6d6db094a076262943f5322c84df1 [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/fdf/cpp/arena.h>
#include <lib/fidl/cpp/wire/message.h>
#include <lib/fidl_driver/cpp/transport.h>
#include <lib/fidl_driver/cpp/unknown_interactions.h>
namespace fidl::internal {
void SendDriverUnknownMethodReply(UnknownMethodReply reply, ::fidl::Transaction* txn) {
fdf::Arena arena('FIDL');
decltype(reply)& arena_reply = *static_cast<decltype(reply)*>(arena.Allocate(sizeof(reply)));
arena_reply = reply;
zx_channel_iovec_t& iovec_on_arena =
*static_cast<zx_channel_iovec_t*>(arena.Allocate(sizeof(zx_channel_iovec_t)));
iovec_on_arena = {
.buffer = &arena_reply,
.capacity = sizeof(reply),
};
::fidl::OutgoingMessage msg = ::fidl::OutgoingMessage::Create_InternalMayBreak({
.transport_vtable = &DriverTransport::VTable,
.iovecs = &iovec_on_arena,
.num_iovecs = 1,
.handles = nullptr,
.handle_metadata = nullptr,
.num_handles = 0,
.is_transactional = true,
});
::fidl::internal::OutgoingTransportContext context =
::fidl::internal::OutgoingTransportContext::Create<::fidl::internal::DriverTransport>(
arena.get());
txn->Reply(&msg, {.outgoing_transport_context = std::move(context)});
}
} // namespace fidl::internal