/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 ************************************************************************
 * @file         M4OSA_FileReader.h
 * @ingroup      OSAL
 * @brief        File reader
 * @note         This file declares functions and types to read a file.
 ************************************************************************
*/


#ifndef M4OSA_FILEREADER_H
#define M4OSA_FILEREADER_H


#include "M4OSA_Types.h"
#include "M4OSA_Error.h"
#include "M4OSA_FileCommon.h"
#include "M4OSA_Memory.h"



/** This enum defines the option ID to be used in M4OSA_FileReadGetOption()
    and M4OSA_FileReadSetOption()*/
typedef enum M4OSA_FileReadOptionID
{
   /** Get the file size (M4OSA_fpos*)*/
   M4OSA_kFileReadGetFileSize
                  = M4OSA_OPTION_ID_CREATE(M4_READ, M4OSA_FILE_READER, 0x01),

      /** Get the file attributes (M4OSA_FileAttribute*)*/
   M4OSA_kFileReadGetFileAttribute
                  = M4OSA_OPTION_ID_CREATE(M4_READ, M4OSA_FILE_READER, 0x02),

   /** Get the file URL, provided by the M4OSA_FileReadOpen (M4OSA_Char*)*/
   M4OSA_kFileReadGetURL
                  = M4OSA_OPTION_ID_CREATE(M4_READ, M4OSA_FILE_READER, 0x03),

   /** Get the file position (M4OSA_fpos*)*/
   M4OSA_kFileReadGetFilePosition
                  = M4OSA_OPTION_ID_CREATE(M4_READ, M4OSA_FILE_READER, 0x04),

   /** Check end of file: TRUE if the EOF has been reached, FALSE else
       (M4OSA_Bool*)*/
   M4OSA_kFileReadIsEOF
                  = M4OSA_OPTION_ID_CREATE(M4_READ, M4OSA_FILE_READER, 0x05),

   /** Check lock of file */
   M4OSA_kFileReadLockMode
                  = M4OSA_OPTION_ID_CREATE(M4_READWRITE, M4OSA_FILE_READER, 0x06)

} M4OSA_FileReadOptionID;





/** This structure stores the set of the function pointer to access to a
    file in read mode*/
typedef struct
{
   M4OSA_ERR (*openRead)   (M4OSA_Context* context,
                            M4OSA_Void* fileDescriptor,
                            M4OSA_UInt32 fileModeAccess);

   M4OSA_ERR (*readData)   (M4OSA_Context context,
                            M4OSA_MemAddr8 buffer,
                            M4OSA_UInt32* size);

   M4OSA_ERR (*seek)       (M4OSA_Context context,
                            M4OSA_FileSeekAccessMode seekMode,
                            M4OSA_FilePosition* position);

   M4OSA_ERR (*closeRead)  (M4OSA_Context context);

   M4OSA_ERR (*setOption)  (M4OSA_Context context,
                            M4OSA_FileReadOptionID optionID,
                            M4OSA_DataOption optionValue);

   M4OSA_ERR (*getOption)  (M4OSA_Context context,
                            M4OSA_FileReadOptionID optionID,
                            M4OSA_DataOption *optionValue);
} M4OSA_FileReadPointer;

#ifdef __cplusplus
extern "C"
{
#endif

M4OSAL_FILE_EXPORT_TYPE M4OSA_ERR M4OSA_fileReadOpen        (M4OSA_Context* context,
                                     M4OSA_Void* fileDescriptor,
                                     M4OSA_UInt32 fileModeAccess);

M4OSAL_FILE_EXPORT_TYPE M4OSA_ERR M4OSA_fileReadData        (M4OSA_Context context,
                                     M4OSA_MemAddr8 buffer,
                                     M4OSA_UInt32* size);

M4OSAL_FILE_EXPORT_TYPE M4OSA_ERR M4OSA_fileReadSeek        (M4OSA_Context context,
                                     M4OSA_FileSeekAccessMode seekMode,
                                     M4OSA_FilePosition* position);

M4OSAL_FILE_EXPORT_TYPE M4OSA_ERR M4OSA_fileReadClose       (M4OSA_Context context);

M4OSAL_FILE_EXPORT_TYPE M4OSA_ERR M4OSA_fileReadGetOption   (M4OSA_Context context,
                                     M4OSA_FileReadOptionID optionID,
                                     M4OSA_DataOption *optionValue);

M4OSAL_FILE_EXPORT_TYPE M4OSA_ERR M4OSA_fileReadSetOption   (M4OSA_Context context,
                                     M4OSA_FileReadOptionID optionID,
                                     M4OSA_DataOption optionValue);

#ifdef __cplusplus
}
#endif

#endif   /*M4OSA_FILEREADER_H*/