// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#pragma once

#include <zircon/types.h>
#include <zircon/syscalls/types.h>
#include <lib/user_copy/user_ptr.h>

// Forward declaration so it can be used in abigen-generated sys_* prototypes.
class user_out_handle;

#define ZX_SYSCALL_PARAM_ATTR(x)
#include <zircon/syscall-definitions.h>

#include <object/handle.h>
#include <object/process_dispatcher.h>

// This is the type of handle result parameters in system call
// implementation functions (sys_*).  abigen recognizes return values of
// type zx_handle_t and converts them into user_out_handle* instead of into
// user_out_ptr<zx_handle_t>.  System call implementation functions use the
// make, dup, or transfer method to turn a Dispatcher pointer or another
// handle into a handle received by the user.
class user_out_handle final {
public:
    zx_status_t make(fbl::RefPtr<Dispatcher> dispatcher, zx_rights_t rights) {
        h_ = Handle::Make(ktl::move(dispatcher), rights);
        return h_ ? ZX_OK : ZX_ERR_NO_MEMORY;
    }

    zx_status_t dup(Handle* source, zx_rights_t rights) {
        h_ = Handle::Dup(source, rights);
        return h_ ? ZX_OK : ZX_ERR_NO_MEMORY;
    }

    zx_status_t transfer(HandleOwner&& source) {
        h_.swap(source);
        return ZX_OK;
    }

    // These methods are called by the abigen-generated wrapper_* functions
    // (syscall-kernel-wrappers.inc).  See KernelWrapperGenerator::syscall.

    bool begin_copyout(ProcessDispatcher* current_process,
                       user_out_ptr<zx_handle_t> out) const {
        if (h_)
            return out.copy_to_user(current_process->MapHandleToValue(h_));
        return false;
    }

    void finish_copyout(ProcessDispatcher* current_process) {
        if (h_)
            current_process->AddHandle(ktl::move(h_));
    }

private:
    HandleOwner h_;
};
