// Copyright 2017 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/async/cpp/trap.h>

#include <utility>

namespace async {

GuestBellTrapBase::GuestBellTrapBase(async_guest_bell_trap_handler_t* handler)
    : trap_{{ASYNC_STATE_INIT}, handler} {}

GuestBellTrapBase::~GuestBellTrapBase() = default;

zx_status_t GuestBellTrapBase::SetTrap(
    async_dispatcher_t* dispatcher, const zx::guest& guest, zx_vaddr_t addr, size_t length) {
    return async_set_guest_bell_trap(dispatcher, &trap_, guest.get(), addr, length);
}

GuestBellTrap::GuestBellTrap(Handler handler)
    : GuestBellTrapBase(&GuestBellTrap::CallHandler), handler_(std::move(handler)) {}

GuestBellTrap::~GuestBellTrap() = default;

void GuestBellTrap::CallHandler(async_dispatcher_t* dispatcher, async_guest_bell_trap_t* trap,
                                zx_status_t status, const zx_packet_guest_bell_t* bell) {
    auto self = Dispatch<GuestBellTrap>(trap);
    self->handler_(dispatcher, self, status, bell);
}

} // namespace async
