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

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