/* $Id$ */
/* 
 * Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJ_FILE_IO_H__
#define __PJ_FILE_IO_H__

/**
 * @file file_io.h
 * @brief Simple file I/O abstraction.
 */
#include <pj/types.h>

PJ_BEGIN_DECL 

/**
 * @defgroup PJ_FILE_IO File I/O
 * @ingroup PJ_IO
 * @{
 *
 * This file contains functionalities to perform file I/O. The file
 * I/O can be implemented with various back-end, either using native
 * file API or ANSI stream. 
 *
 * @section pj_file_size_limit_sec Size Limits
 *
 * There may be limitation on the size that can be handled by the
 * #pj_file_setpos() or #pj_file_getpos() functions. The API itself
 * uses 64-bit integer for the file offset/position (where available); 
 * however some backends (such as ANSI) may only support signed 32-bit 
 * offset resolution.
 *
 * Reading and writing operation uses signed 32-bit integer to indicate
 * the size.
 *
 *
 */

/**
 * These enumerations are used when opening file. Values PJ_O_RDONLY,
 * PJ_O_WRONLY, and PJ_O_RDWR are mutually exclusive. Value PJ_O_APPEND
 * can only be used when the file is opened for writing. 
 */
enum pj_file_access
{
    PJ_O_RDONLY     = 0x1101,   /**< Open file for reading.             */
    PJ_O_WRONLY     = 0x1102,   /**< Open file for writing.             */
    PJ_O_RDWR       = 0x1103,   /**< Open file for reading and writing. 
                                     File will be truncated.            */
    PJ_O_APPEND     = 0x1108,   /**< Append to existing file.           */
};

/**
 * The seek directive when setting the file position with #pj_file_setpos.
 */
enum pj_file_seek_type
{
    PJ_SEEK_SET     = 0x1201,   /**< Offset from beginning of the file. */
    PJ_SEEK_CUR     = 0x1202,   /**< Offset from current position.      */
    PJ_SEEK_END     = 0x1203,   /**< Size of the file plus offset.      */
};

/**
 * Open the file as specified in \c pathname with the specified
 * mode, and return the handle in \c fd. All files will be opened
 * as binary.
 *
 * @param pool          Pool to allocate memory for the new file descriptor.
 * @param pathname      The file name to open.
 * @param flags         Open flags, which is bitmask combination of
 *                      #pj_file_access enum. The flag must be either
 *                      PJ_O_RDONLY, PJ_O_WRONLY, or PJ_O_RDWR. When file
 *                      writing is specified, existing file will be 
 *                      truncated unless PJ_O_APPEND is specified.
 * @param fd            The returned descriptor.
 *
 * @return              PJ_SUCCESS or the appropriate error code on error.
 */
PJ_DECL(pj_status_t) pj_file_open(pj_pool_t *pool,
                                  const char *pathname, 
                                  unsigned flags,
                                  pj_oshandle_t *fd);

/**
 * Close an opened file descriptor.
 *
 * @param fd            The file descriptor.
 *
 * @return              PJ_SUCCESS or the appropriate error code on error.
 */
PJ_DECL(pj_status_t) pj_file_close(pj_oshandle_t fd);

/**
 * Write data with the specified size to an opened file.
 *
 * @param fd            The file descriptor.
 * @param data          Data to be written to the file.
 * @param size          On input, specifies the size of data to be written.
 *                      On return, it contains the number of data actually
 *                      written to the file.
 *
 * @return              PJ_SUCCESS or the appropriate error code on error.
 */
PJ_DECL(pj_status_t) pj_file_write(pj_oshandle_t fd,
                                   const void *data,
                                   pj_ssize_t *size);

/**
 * Read data from the specified file. When end-of-file condition is set,
 * this function will return PJ_SUCCESS but the size will contain zero.
 *
 * @param fd            The file descriptor.
 * @param data          Pointer to buffer to receive the data.
 * @param size          On input, specifies the maximum number of data to
 *                      read from the file. On output, it contains the size
 *                      of data actually read from the file. It will contain
 *                      zero when EOF occurs.
 *
 * @return              PJ_SUCCESS or the appropriate error code on error.
 *                      When EOF occurs, the return is PJ_SUCCESS but size
 *                      will report zero.
 */
PJ_DECL(pj_status_t) pj_file_read(pj_oshandle_t fd,
                                  void *data,
                                  pj_ssize_t *size);

/**
 * Set file position to new offset according to directive \c whence.
 *
 * @param fd            The file descriptor.
 * @param offset        The new file position to set.
 * @param whence        The directive.
 *
 * @return              PJ_SUCCESS or the appropriate error code on error.
 */
PJ_DECL(pj_status_t) pj_file_setpos(pj_oshandle_t fd,
                                    pj_off_t offset,
                                    enum pj_file_seek_type whence);

/**
 * Get current file position.
 *
 * @param fd            The file descriptor.
 * @param pos           On return contains the file position as measured
 *                      from the beginning of the file.
 *
 * @return              PJ_SUCCESS or the appropriate error code on error.
 */
PJ_DECL(pj_status_t) pj_file_getpos(pj_oshandle_t fd,
                                    pj_off_t *pos);

/** @} */


PJ_END_DECL

#endif  /* __PJ_FILE_IO_H__ */

