// 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;

using ObjType = uint32;

// TODO(scottmg): ZX_OBJ_TYPE_xyz here.

using HandleOp = uint32;

// TODO(scottmg): ZX_HANDLE_OP_xyz here.

struct HandleInfo {
    handle handle;
    ObjType type;
    rights rights;
    uint32 unused;
};

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

struct HandleDisposition {
    HandleOp operation;
    handle handle;
    ObjType type;
    rights rights;
    status result;
};

[Transport = "Syscall"]
protocol channel {
    /// Create a channel.
    channel_create(uint32 options) -> (status status, handle out0, handle out1);

    /// Read a message from a channel.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ.
    [ArgReorder = "handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles",
    HandleUnchecked]
    channel_read(handle<channel> handle,
                 uint32 options)
        -> (status status,
            vector_void_u32size bytes,
            vector_handle_u32size handles,
            optional_uint32 actual_bytes,
            optional_uint32 actual_handles);

    /// Read a message from a channel.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CHANNEL and have ZX_RIGHT_READ.
    [ArgReorder = "handle, options, bytes, handles, num_bytes, num_handles, actual_bytes, actual_handles"]
    channel_read_etc(handle<channel> handle,
                     uint32 options)
        -> (status status,
            vector_void_u32size bytes,
            vector_HandleInfo_u32size handles,
            optional_uint32 actual_bytes,
            optional_uint32 actual_handles);

    /// 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(handle<channel> handle,
                  uint32 options,
                  vector_void_u32size bytes,
                  vector_handle_u32size handles)
        -> (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(handle<channel> handle,
                      uint32 options,
                      vector_void_u32size bytes,
                      mutable_vector_HandleDisposition_u32size handles)
        -> (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(handle<channel> handle,
                         uint32 options,
                         time deadline,
                         ChannelCallArgs args)
        -> (status status, uint32 actual_bytes, uint32 actual_handles);

    [internal]
    channel_call_finish(time deadline, ChannelCallArgs args)
        -> (status status, uint32 actual_bytes, uint32 actual_handles);

    /// 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(handle handle, uint32 options, time deadline, ChannelCallArgs args)
        -> (status status, uint32 actual_bytes, uint32 actual_handles);
};
