# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# pylint: disable=F0401

import interface_dsl

def MakeInterface():
  mojo = interface_dsl.Interface()

  f = mojo.Func('MojoCreateSharedBuffer', 'MojoResult')
  p = f.Param('options')
  p.InExtensibleStruct('MojoCreateSharedBufferOptions').Optional()
  f.Param('num_bytes').In('uint64_t')
  f.Param('shared_buffer_handle').Out('MojoHandle')

  f = mojo.Func('MojoDuplicateBufferHandle', 'MojoResult')
  f.Param('buffer_handle').In('MojoHandle')
  p = f.Param('options')
  p.InExtensibleStruct('MojoDuplicateBufferHandleOptions').Optional()
  f.Param('new_buffer_handle').Out('MojoHandle')

  f = mojo.Func('MojoMapBuffer', 'MojoResult')
  f.Param('buffer_handle').In('MojoHandle')
  f.Param('offset').In('uint64_t')
  f.Param('num_bytes').In('uint64_t')
  f.Param('buffer').Out('void*')
  f.Param('flags').In('MojoMapBufferFlags')

  f = mojo.Func('MojoUnmapBuffer', 'MojoResult')
  f.Param('buffer').In('void*')

  f = mojo.Func('MojoCreateDataPipe', 'MojoResult')
  p = f.Param('options')
  p.InExtensibleStruct('MojoCreateDataPipeOptions').Optional()
  f.Param('data_pipe_producer_handle').Out('MojoHandle')
  f.Param('data_pipe_consumer_handle').Out('MojoHandle')

  f = mojo.Func('MojoWriteData', 'MojoResult')
  f.Param('data_pipe_producer_handle').In('MojoHandle')
  f.Param('elements').InArray('void', 'num_bytes')
  f.Param('num_bytes').InOut('uint32_t')
  f.Param('flags').In('MojoWriteDataFlags')

  f = mojo.Func('MojoBeginWriteData', 'MojoResult')
  f.Param('data_pipe_producer_handle').In('MojoHandle')
  f.Param('buffer').Out('void*')
  f.Param('buffer_num_bytes').InOut('uint32_t')
  f.Param('flags').In('MojoWriteDataFlags')

  f = mojo.Func('MojoEndWriteData', 'MojoResult')
  f.Param('data_pipe_producer_handle').In('MojoHandle')
  f.Param('num_bytes_written').In('uint32_t')

  f = mojo.Func('MojoReadData', 'MojoResult')
  f.Param('data_pipe_consumer_handle').In('MojoHandle')
  f.Param('elements').OutArray('void', 'num_bytes')
  f.Param('num_bytes').InOut('uint32_t')
  f.Param('flags').In('MojoReadDataFlags')

  f = mojo.Func('MojoBeginReadData', 'MojoResult')
  f.Param('data_pipe_consumer_handle').In('MojoHandle')
  f.Param('buffer').Out('const void*')
  f.Param('buffer_num_bytes').InOut('uint32_t')
  f.Param('flags').In('MojoReadDataFlags')

  f = mojo.Func('MojoEndReadData', 'MojoResult')
  f.Param('data_pipe_consumer_handle').In('MojoHandle')
  f.Param('num_bytes_read').In('uint32_t')

  f = mojo.Func('MojoGetTimeTicksNow', 'MojoTimeTicks')

  f = mojo.Func('MojoClose', 'MojoResult')
  f.Param('handle').In('MojoHandle')

  f = mojo.Func('MojoWait', 'MojoResult')
  f.Param('handle').In('MojoHandle')
  f.Param('signals').In('MojoHandleSignals')
  f.Param('deadline').In('MojoDeadline')
  f.Param('signals_state').OutFixedStruct('MojoHandleSignalsState').Optional()

  f = mojo.Func('MojoWaitMany', 'MojoResult')
  f.Param('handles').InArray('MojoHandle', 'num_handles')
  f.Param('signals').InArray('MojoHandleSignals', 'num_handles')
  f.Param('num_handles').In('uint32_t')
  f.Param('deadline').In('MojoDeadline')
  f.Param('result_index').Out('uint32_t').Optional()
  p = f.Param('signals_states')
  p.OutFixedStructArray('MojoHandleSignalsState', 'num_handles').Optional()

  f = mojo.Func('MojoCreateMessagePipe', 'MojoResult')
  p = f.Param('options')
  p.InExtensibleStruct('MojoCreateMessagePipeOptions').Optional()
  f.Param('message_pipe_handle0').Out('MojoHandle')
  f.Param('message_pipe_handle1').Out('MojoHandle')

  f = mojo.Func('MojoWriteMessage', 'MojoResult')
  f.Param('message_pipe_handle').In('MojoHandle')
  f.Param('bytes').InArray('void', 'num_bytes').Optional()
  f.Param('num_bytes').In('uint32_t')
  f.Param('handles').InArray('MojoHandle', 'num_handles').Optional()
  f.Param('num_handles').In('uint32_t')
  f.Param('flags').In('MojoWriteMessageFlags')

  f = mojo.Func('MojoReadMessage', 'MojoResult')
  f.Param('message_pipe_handle').In('MojoHandle')
  f.Param('bytes').OutArray('void', 'num_bytes').Optional()
  f.Param('num_bytes').InOut('uint32_t').Optional()
  f.Param('handles').OutArray('MojoHandle', 'num_handles').Optional()
  f.Param('num_handles').InOut('uint32_t').Optional()
  f.Param('flags').In('MojoReadMessageFlags')

  # This function is not provided by the Mojo system APIs, but instead allows
  # trusted code to provide a handle for use by untrusted code. See the
  # implementation in mojo_syscall.cc.tmpl.
  f = mojo.Func('_MojoGetInitialHandle', 'MojoResult')
  f.Param('handle').Out('MojoHandle')

  mojo.Finalize()

  return mojo
