# 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/inheritance/c/fidl.h>


fidl_test_inheritance_superfooRequest {
       hdr fidl_message_header[4999045011615110827]
       sInLine fidl_string
       sOutOfLine fidl_aligned[stringnoz]
} [packed]
fidl_test_inheritance_superfooRequestHandles {
       void void
} [packed]
fidl_test_inheritance_superfooResponse {
       hdr fidl_message_header[4999045011615110827]
       y int64
} [packed]
fidl_test_inheritance_superfooResponseHandles {
       void void
} [packed]

resource zx_chan_fidl_test_inheritance_super_client[zx_chan]
resource zx_chan_fidl_test_inheritance_super_server[zx_chan]

zx_channel_create$fidl_test_inheritance_super(options const[0], out0 ptr[out, zx_chan_fidl_test_inheritance_super_client], out1 ptr[out, zx_chan_fidl_test_inheritance_super_server])
fdio_service_connect$fidl_test_inheritance_super(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_inheritance_super_server)
zx_channel_call$fidl_test_inheritance_superfoo(handle zx_chan_fidl_test_inheritance_super_client, options const[0], deadline zx_time, args ptr[in, fidl_call_args[fidl_test_inheritance_superfooRequest, fidl_test_inheritance_superfooRequestHandles, array[int8, ZX_CHANNEL_MAX_MSG_BYTES], fidl_test_inheritance_superfooResponseHandles]], actual_bytes ptr[out, int32], actual_handles ptr[out, int32])


fidl_test_inheritance_subfooRequest {
       hdr fidl_message_header[4999045011615110827]
       sInLine fidl_string
       sOutOfLine fidl_aligned[stringnoz]
} [packed]
fidl_test_inheritance_subfooRequestHandles {
       void void
} [packed]
fidl_test_inheritance_subfooResponse {
       hdr fidl_message_header[4999045011615110827]
       y int64
} [packed]
fidl_test_inheritance_subfooResponseHandles {
       void void
} [packed]

resource zx_chan_fidl_test_inheritance_sub_client[zx_chan]
resource zx_chan_fidl_test_inheritance_sub_server[zx_chan]

zx_channel_create$fidl_test_inheritance_sub(options const[0], out0 ptr[out, zx_chan_fidl_test_inheritance_sub_client], out1 ptr[out, zx_chan_fidl_test_inheritance_sub_server])
fdio_service_connect$fidl_test_inheritance_sub(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_inheritance_sub_server)
zx_channel_call$fidl_test_inheritance_subfoo(handle zx_chan_fidl_test_inheritance_sub_client, options const[0], deadline zx_time, args ptr[in, fidl_call_args[fidl_test_inheritance_subfooRequest, fidl_test_inheritance_subfooRequestHandles, array[int8, ZX_CHANNEL_MAX_MSG_BYTES], fidl_test_inheritance_subfooResponseHandles]], actual_bytes ptr[out, int32], actual_handles ptr[out, int32])

