// Copyright 2015 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.

// WARNING this file was generated by generate_nacl_bindings.py
// Do not edit by hand.

#ifndef MOJO_PUBLIC_PLATFORM_NACL_MOJO_IRT_H_
#define MOJO_PUBLIC_PLATFORM_NACL_MOJO_IRT_H_

#include "mojo/public/c/system/buffer.h"
#include "mojo/public/c/system/data_pipe.h"
#include "mojo/public/c/system/handle.h"
#include "mojo/public/c/system/message_pipe.h"
#include "mojo/public/c/system/result.h"
#include "mojo/public/c/system/time.h"

#define NACL_IRT_MOJO_v0_1 "nacl-irt-mojo-0.1"

struct nacl_irt_mojo {
  MojoResult (*_MojoGetInitialHandle)(MojoHandle* handle);
  MojoTimeTicks (*MojoGetTimeTicksNow)();
  MojoResult (*MojoClose)(MojoHandle handle);
  MojoResult (*MojoWait)(MojoHandle handle,
                         MojoHandleSignals signals,
                         MojoDeadline deadline,
                         struct MojoHandleSignalsState* signals_state);
  MojoResult (*MojoWaitMany)(const MojoHandle* handles,
                             const MojoHandleSignals* signals,
                             uint32_t num_handles,
                             MojoDeadline deadline,
                             uint32_t* result_index,
                             struct MojoHandleSignalsState* signals_states);
  MojoResult (*MojoCreateMessagePipe)(
      const struct MojoCreateMessagePipeOptions* options,
      MojoHandle* message_pipe_handle0,
      MojoHandle* message_pipe_handle1);
  MojoResult (*MojoWriteMessage)(MojoHandle message_pipe_handle,
                                 const void* bytes,
                                 uint32_t num_bytes,
                                 const MojoHandle* handles,
                                 uint32_t num_handles,
                                 MojoWriteMessageFlags flags);
  MojoResult (*MojoReadMessage)(MojoHandle message_pipe_handle,
                                void* bytes,
                                uint32_t* num_bytes,
                                MojoHandle* handles,
                                uint32_t* num_handles,
                                MojoReadMessageFlags flags);
  MojoResult (*MojoCreateDataPipe)(
      const struct MojoCreateDataPipeOptions* options,
      MojoHandle* data_pipe_producer_handle,
      MojoHandle* data_pipe_consumer_handle);
  MojoResult (*MojoSetDataPipeProducerOptions)(
      MojoHandle data_pipe_producer_handle,
      const struct MojoDataPipeProducerOptions* options);
  MojoResult (*MojoGetDataPipeProducerOptions)(
      MojoHandle data_pipe_producer_handle,
      struct MojoDataPipeProducerOptions* options,
      uint32_t options_num_bytes);
  MojoResult (*MojoWriteData)(MojoHandle data_pipe_producer_handle,
                              const void* elements,
                              uint32_t* num_bytes,
                              MojoWriteDataFlags flags);
  MojoResult (*MojoBeginWriteData)(MojoHandle data_pipe_producer_handle,
                                   void** buffer,
                                   uint32_t* buffer_num_bytes,
                                   MojoWriteDataFlags flags);
  MojoResult (*MojoEndWriteData)(MojoHandle data_pipe_producer_handle,
                                 uint32_t num_bytes_written);
  MojoResult (*MojoSetDataPipeConsumerOptions)(
      MojoHandle data_pipe_consumer_handle,
      const struct MojoDataPipeConsumerOptions* options);
  MojoResult (*MojoGetDataPipeConsumerOptions)(
      MojoHandle data_pipe_consumer_handle,
      struct MojoDataPipeConsumerOptions* options,
      uint32_t options_num_bytes);
  MojoResult (*MojoReadData)(MojoHandle data_pipe_consumer_handle,
                             void* elements,
                             uint32_t* num_bytes,
                             MojoReadDataFlags flags);
  MojoResult (*MojoBeginReadData)(MojoHandle data_pipe_consumer_handle,
                                  const void** buffer,
                                  uint32_t* buffer_num_bytes,
                                  MojoReadDataFlags flags);
  MojoResult (*MojoEndReadData)(MojoHandle data_pipe_consumer_handle,
                                uint32_t num_bytes_read);
  MojoResult (*MojoCreateSharedBuffer)(
      const struct MojoCreateSharedBufferOptions* options,
      uint64_t num_bytes,
      MojoHandle* shared_buffer_handle);
  MojoResult (*MojoDuplicateBufferHandle)(
      MojoHandle buffer_handle,
      const struct MojoDuplicateBufferHandleOptions* options,
      MojoHandle* new_buffer_handle);
  MojoResult (*MojoGetBufferInformation)(MojoHandle buffer_handle,
                                         struct MojoBufferInformation* info,
                                         uint32_t info_num_bytes);
  MojoResult (*MojoMapBuffer)(MojoHandle buffer_handle,
                              uint64_t offset,
                              uint64_t num_bytes,
                              void** buffer,
                              MojoMapBufferFlags flags);
  MojoResult (*MojoUnmapBuffer)(void* buffer);
};

#ifdef __cplusplus
extern "C" {
#endif

size_t mojo_irt_query(const char* interface_ident,
                      void* table,
                      size_t tablesize);

#ifdef __cplusplus
}
#endif

#endif  // MOJO_PUBLIC_PLATFORM_NACL_MOJO_IRT_H_
