// Copyright 2019 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.
library zx;

alias HandleOp = uint32;

// TODO(scottmg): ZX_HANDLE_OP_xyz here.

type HandleInfo = resource struct {
    handle handle;
    type obj_type;
    rights rights;
    unused uint32;
};

type ChannelCallArgs = resource struct {
    wr_bytes vector<byte>;
    wr_handles vector<handle>;
    // TODO(scottmg): mutable_vector_void
    rd_bytes vector<byte>;
    // TODO(scottmg): mutable_vector_handle
    rd_handles vector<handle>;
};

type HandleDisposition = resource struct {
    operation HandleOp;
    handle handle;
    type obj_type;
    rights rights;
    result status;
};

type ChannelCallEtcArgs = resource struct {
    wr_bytes vector<byte>;
    wr_handles mutable_vector_HandleDisposition_u32size;
    rd_bytes vector<byte>;
    rd_handles mutable_vector_HandleInfo_u32size;
};

@transport("Syscall")
protocol channel {
    /// Create a channel.
    /// Rights: Caller job policy must allow ZX_POL_NEW_CHANNEL.
    channel_create(struct {
        options uint32;
    }) -> (resource struct {
        status status;
        out0 handle;
        out1 handle;
    });

    /// Read a message from a channel.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ.
    @arg_reorder(
            "handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles")
    @handle_unchecked
    channel_read(resource struct {
        handle handle:CHANNEL;
        options uint32;
    }) -> (resource struct {
        status status;
        bytes vector_void_u32size;
        handles vector_handle_u32size;
        actual_bytes optional_uint32;
        actual_handles optional_uint32;
    });

    /// Read a message from a channel.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ.
    @arg_reorder(
            "handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles")
    channel_read_etc(resource struct {
        handle handle:CHANNEL;
        options uint32;
    }) -> (resource struct {
        status status;
        bytes vector_void_u32size;
        handles vector_HandleInfo_u32size;
        actual_bytes optional_uint32;
        actual_handles optional_uint32;
    });

    /// Write a message to a channel.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_WRITE.
    /// Rights: Every entry of handles must have ZX_RIGHT_TRANSFER.
    channel_write(resource struct {
        handle handle:CHANNEL;
        options uint32;
        bytes vector_void_u32size;
        @release
        handles vector_handle_u32size;
    }) -> (struct {
        status status;
    });

    /// Write a message to a channel.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_WRITE.
    /// Rights: Every entry of handles must have ZX_RIGHT_TRANSFER.
    channel_write_etc(resource struct {
        handle handle:CHANNEL;
        options uint32;
        bytes vector_void_u32size;
        handles mutable_vector_HandleDisposition_u32size;
    }) -> (struct {
        status status;
    });

    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.
    /// Rights: All wr_handles of args must have ZX_RIGHT_TRANSFER.
    @internal
    channel_call_noretry(resource struct {
        handle handle:CHANNEL;
        options uint32;
        deadline time;
        args ChannelCallArgs;
    }) -> (struct {
        status status;
        actual_bytes uint32;
        actual_handles uint32;
    });

    @internal
    channel_call_finish(resource struct {
        deadline time;
        args ChannelCallArgs;
    }) -> (struct {
        status status;
        actual_bytes uint32;
        actual_handles uint32;
    });

    /// Send a message to a channel and await a reply.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.
    /// Rights: All wr_handles of args must have ZX_RIGHT_TRANSFER.
    @blocking
    @vdsocall
    // TODO(scottmg): Express "All wr_handles of args must have ZX_RIGHT_TRANSFER."
    channel_call(resource struct {
        handle handle:CHANNEL;
        options uint32;
        deadline time;
        args ChannelCallArgs;
    }) -> (struct {
        status status;
        actual_bytes uint32;
        actual_handles uint32;
    });

    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.
    /// Rights: All wr_handles of args must have ZX_RIGHT_TRANSFER.
    @internal
    channel_call_etc_noretry(resource struct {
        handle handle:CHANNEL;
        options uint32;
        deadline time;
        args mutable_ChannelCallEtcArgs;
    }) -> (struct {
        status status;
        actual_bytes uint32;
        actual_handles uint32;
    });

    @internal
    channel_call_etc_finish(resource struct {
        deadline time;
        args mutable_ChannelCallEtcArgs;
    }) -> (struct {
        status status;
        actual_bytes uint32;
        actual_handles uint32;
    });

    /// Send a message to a channel and await a reply.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ and have ZX_RIGHT_WRITE.
    /// Rights: All wr_handles of args must have ZX_RIGHT_TRANSFER.
    @blocking
    @vdsocall
    // TODO(scottmg): Express "All wr_handles of args must have ZX_RIGHT_TRANSFER."
    channel_call_etc(resource struct {
        handle handle:CHANNEL;
        options uint32;
        deadline time;
        args mutable_ChannelCallEtcArgs;
    }) -> (struct {
        status status;
        actual_bytes uint32;
        actual_handles uint32;
    });
};
