# Copyright 2018 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.
#
# WARNING: This file is machine generated by fidlgen.

include <fidl/test/nullable/c/fidl.h>
fidl_test_nullable_StructWithNullableStringInLine {
       valInLine fidl_string
} [packed]
fidl_test_nullable_StructWithNullableStringOutOfLine {
       valOutOfLine fidl_aligned[stringnoz]
} [packed]
fidl_test_nullable_StructWithNullableStringHandles {
       void void
} [packed]
fidl_test_nullable_StructWithNullableVectorInLine {
       valInLine fidl_vector
} [packed]
fidl_test_nullable_StructWithNullableVectorOutOfLine {
       valOutOfLine array[int32]
} [packed]
fidl_test_nullable_StructWithNullableVectorHandles {
       void void
} [packed]
fidl_test_nullable_StructWithNullableHandleInLine {
       val flags[fidl_handle_presence, int32]
} [packed]
fidl_test_nullable_StructWithNullableHandleOutOfLine {
       void void
} [packed]
fidl_test_nullable_StructWithNullableHandleHandles {
       val zx_vmo
} [packed]
fidl_test_nullable_StructWithNullableProtocolInLine {
       val flags[fidl_handle_presence, int32]
} [packed]
fidl_test_nullable_StructWithNullableProtocolOutOfLine {
       void void
} [packed]
fidl_test_nullable_StructWithNullableProtocolHandles {
       val zx_chan_fidl_test_nullable_SimpleProtocol_client
} [packed]
fidl_test_nullable_StructWithNullableRequestInLine {
       val flags[fidl_handle_presence, int32]
} [packed]
fidl_test_nullable_StructWithNullableRequestOutOfLine {
       void void
} [packed]
fidl_test_nullable_StructWithNullableRequestHandles {
       val zx_chan_fidl_test_nullable_SimpleProtocol_server
} [packed]
fidl_test_nullable_Int32WrapperInLine {
       val int32
} [packed]
fidl_test_nullable_Int32WrapperOutOfLine {
       void void
} [packed]
fidl_test_nullable_Int32WrapperHandles {
       void void
} [packed]
fidl_test_nullable_StructWithNullableStructInLine {
       valInLine fidl_test_nullable_Int32WrapperInLine
} [packed]
fidl_test_nullable_StructWithNullableStructOutOfLine {
       valOutOfLine fidl_test_nullable_Int32WrapperOutOfLine
} [packed]
fidl_test_nullable_StructWithNullableStructHandles {
       val fidl_test_nullable_Int32WrapperHandles
} [packed]
fidl_test_nullable_StructWithNullableUnionInLine {
       valInLine fidl_test_nullable_SimpleUnionInLine
} [packed]
fidl_test_nullable_StructWithNullableUnionOutOfLine {
       void void
} [packed]
fidl_test_nullable_StructWithNullableUnionHandles {
       void void
} [packed]
fidl_test_nullable_SimpleUnionInLine [
       a fidl_union_member[1, int32]
       b fidl_union_member[2, int32]
]
fidl_test_nullable_SimpleUnionOutOfLine [
       void void
][varlen]
fidl_test_nullable_SimpleUnionHandles [
       void void
][varlen]


fidl_test_nullable_SimpleProtocolAddRequest {
       hdr fidl_message_header[1238508415331800925]
       a int32
       b int32
} [packed]
fidl_test_nullable_SimpleProtocolAddRequestHandles {
       void void
} [packed]
fidl_test_nullable_SimpleProtocolAddResponse {
       hdr fidl_message_header[1238508415331800925]
       sum int32
} [packed]
fidl_test_nullable_SimpleProtocolAddResponseHandles {
       void void
} [packed]

resource zx_chan_fidl_test_nullable_SimpleProtocol_client[zx_chan]
resource zx_chan_fidl_test_nullable_SimpleProtocol_server[zx_chan]

zx_channel_create$fidl_test_nullable_SimpleProtocol(options const[0], out0 ptr[out, zx_chan_fidl_test_nullable_SimpleProtocol_client], out1 ptr[out, zx_chan_fidl_test_nullable_SimpleProtocol_server])
fdio_service_connect$fidl_test_nullable_SimpleProtocol(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_nullable_SimpleProtocol_server)
zx_channel_call$fidl_test_nullable_SimpleProtocolAdd(handle zx_chan_fidl_test_nullable_SimpleProtocol_client, options const[0], deadline zx_time, args ptr[in, fidl_call_args[fidl_test_nullable_SimpleProtocolAddRequest, fidl_test_nullable_SimpleProtocolAddRequestHandles, array[int8, ZX_CHANNEL_MAX_MSG_BYTES], fidl_test_nullable_SimpleProtocolAddResponseHandles]], actual_bytes ptr[out, int32], actual_handles ptr[out, int32])

