# 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()

  # 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')

  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')

  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('MojoSetDataPipeProducerOptions', 'MojoResult')
  f.Param('data_pipe_producer_handle').In('MojoHandle')
  p = f.Param('options')
  p.InExtensibleStruct('MojoDataPipeProducerOptions').Optional()

  f = mojo.Func('MojoGetDataPipeProducerOptions', 'MojoResult')
  f.Param('data_pipe_producer_handle').In('MojoHandle')
  p = f.Param('options')
  p.OutExtensibleStruct('MojoDataPipeProducerOptions', 'options_num_bytes')
  f.Param('options_num_bytes').In('uint32_t')

  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')
  # TODO(ncbray): support two-stage reads and writes.
  # https://code.google.com/p/chromium/issues/detail?id=401761
  f.IsBrokenInNaCl()

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

  f = mojo.Func('MojoSetDataPipeConsumerOptions', 'MojoResult')
  f.Param('data_pipe_consumer_handle').In('MojoHandle')
  p = f.Param('options')
  p.InExtensibleStruct('MojoDataPipeConsumerOptions').Optional()

  f = mojo.Func('MojoGetDataPipeConsumerOptions', 'MojoResult')
  f.Param('data_pipe_consumer_handle').In('MojoHandle')
  p = f.Param('options')
  p.OutExtensibleStruct('MojoDataPipeConsumerOptions', 'options_num_bytes')
  f.Param('options_num_bytes').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')
  # TODO(ncbray): support two-stage reads and writes.
  # https://code.google.com/p/chromium/issues/detail?id=401761
  f.IsBrokenInNaCl()

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

  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('MojoGetBufferInformation', 'MojoResult')
  f.Param('buffer_handle').In('MojoHandle')
  p = f.Param('info')
  p.OutExtensibleStruct('MojoBufferInformation', 'info_num_bytes')
  f.Param('info_num_bytes').In('uint32_t')

  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')
  # TODO(ncbray): support mmaping.
  # https://code.google.com/p/chromium/issues/detail?id=401761
  f.IsBrokenInNaCl()

  f = mojo.Func('MojoUnmapBuffer', 'MojoResult')
  f.Param('buffer').In('void*')
  # TODO(ncbray): support mmaping.
  # https://code.google.com/p/chromium/issues/detail?id=401761
  f.IsBrokenInNaCl()

  mojo.Finalize()

  return mojo
