/* Copyright (c) 2012 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.
*/
/* From ppb_file_io.idl modified Tue Oct 22 15:09:47 2013. */
#ifndef PPAPI_C_PPB_FILE_IO_H_
#define PPAPI_C_PPB_FILE_IO_H_
#include "ppapi/c/pp_array_output.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_file_info.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_macros.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/pp_time.h"
#define PPB_FILEIO_INTERFACE_1_0 "PPB_FileIO;1.0"
#define PPB_FILEIO_INTERFACE_1_1 "PPB_FileIO;1.1"
#define PPB_FILEIO_INTERFACE PPB_FILEIO_INTERFACE_1_1
/**
* @file
* This file defines the API to create a file i/o object.
*/
/**
* @addtogroup Enums
* @{
*/
/**
* The PP_FileOpenFlags enum contains file open constants.
*/
typedef enum {
/** Requests read access to a file. */
PP_FILEOPENFLAG_READ = 1 << 0,
/**
* Requests write access to a file. May be combined with
* <code>PP_FILEOPENFLAG_READ</code> to request read and write access.
*/
PP_FILEOPENFLAG_WRITE = 1 << 1,
/**
* Requests that the file be created if it does not exist. If the file
* already exists, then this flag is ignored unless
* <code>PP_FILEOPENFLAG_EXCLUSIVE</code> was also specified, in which case
* FileIO::Open() will fail.
*/
PP_FILEOPENFLAG_CREATE = 1 << 2,
/**
* Requests that the file be truncated to length 0 if it exists and is a
* regular file. <code>PP_FILEOPENFLAG_WRITE</code> must also be specified.
*/
PP_FILEOPENFLAG_TRUNCATE = 1 << 3,
/**
* Requests that the file is created when this flag is combined with
* <code>PP_FILEOPENFLAG_CREATE</code>. If this flag is specified, and the
* file already exists, then the FileIO::Open() call will fail.
*/
PP_FILEOPENFLAG_EXCLUSIVE = 1 << 4,
/**
* Requests write access to a file, but writes will always occur at the end of
* the file. Mututally exclusive with <code>PP_FILEOPENFLAG_WRITE</code>.
*
* This is only supported in version 1.2 (Chrome 29) and later.
*/
PP_FILEOPENFLAG_APPEND = 1 << 5
} PP_FileOpenFlags;
PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_FileOpenFlags, 4);
/**
* @}
*/
/**
* @addtogroup Interfaces
* @{
*/
/**
* The <code>PPB_FileIO</code> struct is used to operate on a regular file
* (PP_FileType_Regular).
*/
struct PPB_FileIO_1_1 {
/**
* Create() creates a new FileIO object.
*
* @param[in] instance A <code>PP_Instance</code> identifying the instance
* with the file.
*
* @return A <code>PP_Resource</code> corresponding to a FileIO if
* successful or 0 if the module is invalid.
*/
PP_Resource (*Create)(PP_Instance instance);
/**
* IsFileIO() determines if the provided resource is a FileIO.
*
* @param[in] resource A <code>PP_Resource</code> corresponding to a FileIO.
*
* @return <code>PP_TRUE</code> if the resource is a
* <code>PPB_FileIO</code>, <code>PP_FALSE</code> if the resource is
* invalid or some type other than <code>PPB_FileIO</code>.
*/
PP_Bool (*IsFileIO)(PP_Resource resource);
/**
* Open() opens the specified regular file for I/O according to the given
* open flags, which is a bit-mask of the <code>PP_FileOpenFlags</code>
* values. Upon success, the corresponding file is classified as "in use"
* by this FileIO object until such time as the FileIO object is closed
* or destroyed.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a
* FileIO.
* @param[in] file_ref A <code>PP_Resource</code> corresponding to a file
* reference.
* @param[in] open_flags A bit-mask of the <code>PP_FileOpenFlags</code>
* values.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Open().
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
*/
int32_t (*Open)(PP_Resource file_io,
PP_Resource file_ref,
int32_t open_flags,
struct PP_CompletionCallback callback);
/**
* Query() queries info about the file opened by this FileIO object. The
* FileIO object must be opened, and there must be no other operations
* pending.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a
* FileIO.
* @param[out] info The <code>PP_FileInfo</code> structure representing all
* information about the file.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Query(). <code>info</code> must remain valid until after the
* callback runs. If you pass a blocking callback, <code>info</code> must
* remain valid until after Query() returns.
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
* PP_ERROR_FAILED will be returned if the file isn't opened, and
* PP_ERROR_INPROGRESS will be returned if there is another operation pending.
*/
int32_t (*Query)(PP_Resource file_io,
struct PP_FileInfo* info,
struct PP_CompletionCallback callback);
/**
* Touch() Updates time stamps for the file opened by this FileIO object.
* This function will fail if the FileIO object has not been opened. The
* FileIO object must be opened, and there must be no other operations
* pending.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
* @param[in] last_access_time The last time the FileIO was accessed.
* @param[in] last_modified_time The last time the FileIO was modified.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Touch().
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
* PP_ERROR_FAILED will be returned if the file isn't opened, and
* PP_ERROR_INPROGRESS will be returned if there is another operation pending.
*/
int32_t (*Touch)(PP_Resource file_io,
PP_Time last_access_time,
PP_Time last_modified_time,
struct PP_CompletionCallback callback);
/**
* Read() reads from an offset in the file. The size of the buffer must be
* large enough to hold the specified number of bytes to read. This function
* might perform a partial read, meaning all the requested bytes
* might not be returned, even if the end of the file has not been reached.
* The FileIO object must have been opened with read access.
*
* ReadToArray() is preferred to Read() when doing asynchronous operations.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
* @param[in] offset The offset into the file.
* @param[in] buffer The buffer to hold the specified number of bytes read.
* @param[in] bytes_to_read The number of bytes to read from
* <code>offset</code>.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Read(). <code>buffer</code> must remain valid until after
* the callback runs. If you pass a blocking callback, <code>buffer</code>
* must remain valid until after Read() returns.
*
* @return The number of bytes read or an error code from
* <code>pp_errors.h</code>. If the return value is 0, then end-of-file was
* reached. It is valid to call Read() multiple times with a completion
* callback to queue up parallel reads from the file, but pending reads
* cannot be interleaved with other operations.
*/
int32_t (*Read)(PP_Resource file_io,
int64_t offset,
char* buffer,
int32_t bytes_to_read,
struct PP_CompletionCallback callback);
/**
* Write() writes to an offset in the file. This function might perform a
* partial write. The FileIO object must have been opened with write access.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
* @param[in] offset The offset into the file.
* @param[in] buffer The buffer to hold the specified number of bytes read.
* @param[in] bytes_to_write The number of bytes to write to
* <code>offset</code>.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Write().
*
* @return The number of bytes written or an error code from
* <code>pp_errors.h</code>. If the return value is 0, then end-of-file was
* reached. It is valid to call Write() multiple times with a completion
* callback to queue up parallel writes to the file, but pending writes
* cannot be interleaved with other operations.
*/
int32_t (*Write)(PP_Resource file_io,
int64_t offset,
const char* buffer,
int32_t bytes_to_write,
struct PP_CompletionCallback callback);
/**
* SetLength() sets the length of the file. If the file size is extended,
* then the extended area of the file is zero-filled. The FileIO object must
* have been opened with write access and there must be no other operations
* pending.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
* @param[in] length The length of the file to be set.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of SetLength().
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
* PP_ERROR_FAILED will be returned if the file isn't opened, and
* PP_ERROR_INPROGRESS will be returned if there is another operation pending.
*/
int32_t (*SetLength)(PP_Resource file_io,
int64_t length,
struct PP_CompletionCallback callback);
/**
* Flush() flushes changes to disk. This call can be very expensive! The
* FileIO object must have been opened with write access and there must be no
* other operations pending.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Flush().
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
* PP_ERROR_FAILED will be returned if the file isn't opened, and
* PP_ERROR_INPROGRESS will be returned if there is another operation pending.
*/
int32_t (*Flush)(PP_Resource file_io, struct PP_CompletionCallback callback);
/**
* Close() cancels any IO that may be pending, and closes the FileIO object.
* Any pending callbacks will still run, reporting
* <code>PP_ERROR_ABORTED</code> if pending IO was interrupted. It is not
* valid to call Open() again after a call to this method.
* <strong>Note:</strong> If the FileIO object is destroyed, and it is still
* open, then it will be implicitly closed, so you are not required to call
* Close().
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
*/
void (*Close)(PP_Resource file_io);
/**
* ReadToArray() reads from an offset in the file. A PP_ArrayOutput must be
* provided so that output will be stored in its allocated buffer. This
* function might perform a partial read. The FileIO object must have been
* opened with read access.
*
* @param[in] file_io A <code>PP_Resource</code> corresponding to a file
* FileIO.
* @param[in] offset The offset into the file.
* @param[in] max_read_length The maximum number of bytes to read from
* <code>offset</code>.
* @param[in] output A <code>PP_ArrayOutput</code> to hold the output data.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of ReadToArray().
*
* @return The number of bytes read or an error code from
* <code>pp_errors.h</code>. If the return value is 0, then end-of-file was
* reached. It is valid to call ReadToArray() multiple times with a completion
* callback to queue up parallel reads from the file, but pending reads
* cannot be interleaved with other operations.
*/
int32_t (*ReadToArray)(PP_Resource file_io,
int64_t offset,
int32_t max_read_length,
struct PP_ArrayOutput* output,
struct PP_CompletionCallback callback);
};
typedef struct PPB_FileIO_1_1 PPB_FileIO;
struct PPB_FileIO_1_0 {
PP_Resource (*Create)(PP_Instance instance);
PP_Bool (*IsFileIO)(PP_Resource resource);
int32_t (*Open)(PP_Resource file_io,
PP_Resource file_ref,
int32_t open_flags,
struct PP_CompletionCallback callback);
int32_t (*Query)(PP_Resource file_io,
struct PP_FileInfo* info,
struct PP_CompletionCallback callback);
int32_t (*Touch)(PP_Resource file_io,
PP_Time last_access_time,
PP_Time last_modified_time,
struct PP_CompletionCallback callback);
int32_t (*Read)(PP_Resource file_io,
int64_t offset,
char* buffer,
int32_t bytes_to_read,
struct PP_CompletionCallback callback);
int32_t (*Write)(PP_Resource file_io,
int64_t offset,
const char* buffer,
int32_t bytes_to_write,
struct PP_CompletionCallback callback);
int32_t (*SetLength)(PP_Resource file_io,
int64_t length,
struct PP_CompletionCallback callback);
int32_t (*Flush)(PP_Resource file_io, struct PP_CompletionCallback callback);
void (*Close)(PP_Resource file_io);
};
/**
* @}
*/
#endif /* PPAPI_C_PPB_FILE_IO_H_ */