1855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*
2855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
3855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
4855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
5855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * you may not use this file except in compliance with the License.
6855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * You may obtain a copy of the License at
7855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
8855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
9855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
10855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
11855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
12855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * See the License for the specific language governing permissions and
14855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * limitations under the License.
15855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi */
16855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
17855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
18855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
19855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @file         M4OSA_FileReader_optim.c
20855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief
21855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note         This file implements functions to manipulate filesystem access
22855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
23855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
24855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
25855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/** Addition of Trace ID **/
26855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_CoreID.h"
27855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Error.h"
28855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
29855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4TRACE_ID
30855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#undef M4TRACE_ID
31855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
32855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4TRACE_ID    M4OSA_FILE_READER
33855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
34855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
35855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_FileCommon.h"
36855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_FileReader.h"
37855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_FileWriter.h"
38855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Memory.h"
39855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Debug.h"
40855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
41855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "LVOSA_FileReader_optim.h"
42855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
43855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4OSA_READER_OPTIM_USE_OSAL_IF
44855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifndef M4OSA_READER_OPTIM_USE_OSAL_IF
45855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    #include "M4OSA_FileAccess.h"
46855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
47855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
48855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4ERR_CHECK_NULL_RETURN_VALUE(retval, pointer) if ((pointer) == M4OSA_NULL) return (retval);
49855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
50855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
51855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
52855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
53855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
54855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
55855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * File reader cache buffers parameters (size, number of buffers, etc)
56855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
57855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
58855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4OSA_READBUFFER_SIZE    1024*16
59855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4OSA_READBUFFER_NB        2
60855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4OSA_READBUFFER_NONE    -1
61855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define M4OSA_EOF               -1
62855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
63855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#define MAX_FILLS_SINCE_LAST_ACCESS    M4OSA_READBUFFER_NB*2
64855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
65855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
66855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
67855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * structure    M4OSA_FileReader_Buffer
68855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief       This structure defines the File reader Buffers context (private)
69855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
70855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
71855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargitypedef struct
72855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
73855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_MemAddr8      data;        /**< buffer data */
74855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition  size;        /**< size of the buffer */
75855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition  filepos;    /**< position in the file where the buffer starts */
76855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition  remain;        /**< data amount not already copied from buffer */
77855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt32        nbFillSinceLastAcess;    /**< To know since how many time we didn't use this buffer */
78855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi} M4OSA_FileReader_Buffer_optim;
79855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
80855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
81855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
82855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * structure    M4OSA_FileReader_Context
83855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief       This structure defines the File reader context (private)
84855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note        This structure is used for all File Reader calls to store the context
85855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ******************************************************************************
86855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
87855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargitypedef struct
88855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
89855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Bool              IsOpened;       /**< Micro state machine */
90855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileAttribute     FileAttribute;  /**< Opening mode */
91855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition         readFilePos;    /**< Effective position of the GFL read pointer */
92855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition         absolutePos;    /**< Virtual position for next reading */
93855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition         fileSize;        /**< Size of the file */
94855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
95855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_Buffer_optim buffer[M4OSA_READBUFFER_NB];  /**< Read buffers */
96855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
97855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Void*             aFileDesc;  /**< File descriptor */
98855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
99855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
100855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReadPointer*     FS;            /**< Filesystem interface */
101855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
102855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileSystem_FctPtr *FS;        /**< Filesystem interface */
103855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
104855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
105855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi} M4OSA_FileReader_Context_optim;
106855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
107855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/* __________________________________________________________ */
108855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|                                                          |*/
109855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|    Global function for handling low level read access    |*/
110855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|__________________________________________________________|*/
111855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
112855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargistatic M4OSA_FileReadPointer* gv_NXPSW_READOPT_lowLevelFunctions;
113855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
114855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR NXPSW_FileReaderOptim_init(M4OSA_Void *lowLevel_functionPointers, M4OSA_Void *optimized_functionPointers)
115855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
116855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReadPointer* lowLevel_fp  = (M4OSA_FileReadPointer*) lowLevel_functionPointers;
117855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReadPointer* optimized_fp = (M4OSA_FileReadPointer*) optimized_functionPointers;
118855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
119855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    //Set the optimized functions, to be called by the user
120855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    optimized_fp->openRead  = M4OSA_fileReadOpen_optim;
121855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    optimized_fp->readData  = M4OSA_fileReadData_optim;
122855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    optimized_fp->seek      = M4OSA_fileReadSeek_optim;
123855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    optimized_fp->closeRead = M4OSA_fileReadClose_optim;
124855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    optimized_fp->setOption = M4OSA_fileReadSetOption_optim;
125855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    optimized_fp->getOption = M4OSA_fileReadGetOption_optim;
126855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
127855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
128855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4NO_ERROR;
129855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
130855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
131855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR NXPSW_FileReaderOptim_cleanUp()
132855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
133855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
134855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    gv_NXPSW_READOPT_lowLevelFunctions = M4OSA_NULL;
135855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
136855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4NO_ERROR;
137855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
138855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
139855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
140855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR NXPSW_FileReaderOptim_getLowLevelFunctions(M4OSA_Void **FS)
141855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
142855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReadPointer** pFunctionsPointer = (M4OSA_FileReadPointer**) FS;
143855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    *pFunctionsPointer = gv_NXPSW_READOPT_lowLevelFunctions;
144855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4NO_ERROR;
145855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
146855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
147855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
148855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/* __________________________________________________________ */
149855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|                                                          |*/
150855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|        Buffer handling functions for Read access         |*/
151855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|__________________________________________________________|*/
152855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
153855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
154855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_FileReader_BufferInit(M4OSA_FileReader_Context_optim* apContext)
155855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
156855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
157855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt8 i;
158855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
159855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
160855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
161855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].data = M4OSA_NULL;
162855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].size = 0;
163855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].filepos = 0;
164855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].remain = 0;
165855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
166855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
167855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
168855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
169694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        apContext->buffer[i].data = (M4OSA_MemAddr8) M4OSA_32bitAlignedMalloc(M4OSA_READBUFFER_SIZE,
170694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            M4OSA_FILE_READER, (M4OSA_Char *)"M4OSA_FileReader_BufferInit");
171855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_ALLOC, apContext->buffer[i].data);
172855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
173855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
174855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4NO_ERROR;
175855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
176855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
177855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
178855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_Void M4OSA_FileReader_BufferFree(M4OSA_FileReader_Context_optim* apContext)
179855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
180855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
181855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int8 i;
182855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
183855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
184855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(apContext->buffer[i].data != M4OSA_NULL)
185694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu            free(apContext->buffer[i].data);
186855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
187855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
188855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
189855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_FilePosition M4OSA_FileReader_BufferCopy(M4OSA_FileReader_Context_optim* apContext,
190855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                               M4OSA_Int8 i, M4OSA_FilePosition pos,
191855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                               M4OSA_FilePosition size, M4OSA_MemAddr8 pData)
192855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
193855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
194855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition copysize;
195855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition offset;
196855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
197855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(apContext->buffer[i].size == M4OSA_EOF) return M4OSA_EOF;
198855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
199855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(   (pos < apContext->buffer[i].filepos)
200855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       || (pos > (apContext->buffer[i].filepos + apContext->buffer[i].size - 1)) )
201855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
202855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return 0; /* nothing copied */
203855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
204855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
205855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    offset = pos - apContext->buffer[i].filepos;
206855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
207855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    copysize = apContext->buffer[i].size - offset;
208855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    copysize = (size < copysize) ? size : copysize;
209855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
21032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu    memcpy((void *)pData, (void *)(apContext->buffer[i].data + offset), copysize);
211855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
212855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->buffer[i].remain -= copysize;
213855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->buffer[i].nbFillSinceLastAcess = 0;
214855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
215855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return copysize;
216855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
217855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
218855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
219855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_FileReader_BufferFill(M4OSA_FileReader_Context_optim* apContext,
220855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       M4OSA_Int8 i, M4OSA_FilePosition pos)
221855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
222855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
223855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition     gridPos;
224855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition    tempPos;
225855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt32        bufferSize;
226855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition     diff;
227855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition     size;
228855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR             err = M4NO_ERROR;
229855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
230855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR             errno = M4NO_ERROR;
231855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt32         fileReadSize = 0;
232855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition     fileSeekPosition = 0;
233855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
234855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int32         ret_val;
235855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt16         errno;
236855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
237855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
238855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE3_4("BufferFill  i = %d  pos = %ld  read = %ld  old = %ld", i, pos,
239855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                              apContext->readFilePos, apContext->buffer[i].filepos);
240855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
241855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Avoid cycling statement because of EOF */
242855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(pos >= apContext->fileSize)
243855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4WAR_NO_MORE_AU;
244855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
245855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Relocate to absolute postion if necessary */
246855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    bufferSize = M4OSA_READBUFFER_SIZE;
247855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    tempPos = (M4OSA_FilePosition) (pos / bufferSize);
248855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    gridPos = tempPos * M4OSA_READBUFFER_SIZE;
249855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    diff = gridPos - apContext->readFilePos;
250855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
251855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(diff != 0)
252855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
253855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
254855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        fileSeekPosition = diff;
255855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        errno = apContext->FS->seek(apContext->aFileDesc, M4OSA_kFileSeekCurrent,
256855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    &fileSeekPosition);
257855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->readFilePos = gridPos;
258855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
259855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(M4NO_ERROR != errno)
260855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
261855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = errno;
262855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_TRACE1_1("M4OSA_FileReader_BufferFill ERR1 = 0x%x", err);
263855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return err;
264855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
265855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
266855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
267855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        ret_val = apContext->FS->pFctPtr_Seek(apContext->aFileDesc, diff,
268855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                               M4OSA_kFileSeekCurrent, &errno);
269855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->readFilePos = gridPos;
270855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
271855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(ret_val != 0)
272855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
273855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_READER, errno);
274855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_TRACE1_1("M4OSA_FileReader_BufferFill ERR1 = 0x%x", err);
275855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return err;
276855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
277855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_READER_OPTIM_USE_OSAL_IF*/
278855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
279855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
280855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->buffer[i].filepos = apContext->readFilePos;
281855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
282855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Read Data */
283855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
284855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    fileReadSize = M4OSA_READBUFFER_SIZE;
285855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    errno = apContext->FS->readData(apContext->aFileDesc,
286855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                      (M4OSA_MemAddr8)apContext->buffer[i].data, &fileReadSize);
287855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
288855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    size = (M4OSA_FilePosition)fileReadSize;
289855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if ((M4NO_ERROR != errno)&&(M4WAR_NO_DATA_YET != errno))
290855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
291855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].size = M4OSA_EOF;
292855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].remain = 0;
293855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
294855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = errno;
295855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE1_1("M4OSA_FileReader_BufferFill ERR2 = 0x%x", err);
296855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return err;
297855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
298855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
299855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    size = apContext->FS->pFctPtr_Read(apContext->aFileDesc,
300855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        (M4OSA_UInt8 *)apContext->buffer[i].data, M4OSA_READBUFFER_SIZE, &errno);
301855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(size == -1)
302855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
303855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].size = M4OSA_EOF;
304855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].remain = 0;
305855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
306855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_READER, errno);
307855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE1_1("M4OSA_FileReader_BufferFill ERR2 = 0x%x", err);
308855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return err;
309855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
310855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
311855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
312855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->buffer[i].size = size;
313855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->buffer[i].remain = size;
314855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->buffer[i].nbFillSinceLastAcess = 0;
315855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
316855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Retrieve current position */
317855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
318855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    errno = apContext->FS->getOption(apContext->aFileDesc,
319855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                     M4OSA_kFileReadGetFilePosition,
320855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                     (M4OSA_DataOption*) &apContext->readFilePos);
321855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
322855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4NO_ERROR != errno)
323855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
324855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = errno;
325855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE1_1("M4OSA_FileReader_BufferFill ERR3 = 0x%x", err);
326855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
327855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    else if(   (apContext->buffer[i].size >= 0)
328855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       && (apContext->buffer[i].size < M4OSA_READBUFFER_SIZE) )
329855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
330855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4WAR_NO_DATA_YET;
331855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE2_0("M4OSA_FileReader_BufferFill returns NO DATA YET");
332855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return err;
333855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
334855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
335855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->readFilePos = apContext->FS->pFctPtr_Tell(apContext->aFileDesc, &errno);
336855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
337855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(   (apContext->buffer[i].size >= 0)
338855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       && (apContext->buffer[i].size < M4OSA_READBUFFER_SIZE) )
339855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
340855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4WAR_NO_DATA_YET;
341855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE1_1("M4OSA_FileReader_BufferFill ERR3 = 0x%x", err);
342855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return err;
343855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
344855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_READER_OPTIM_USE_OSAL_IF*/
345855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
346855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Return without error */
347855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4NO_ERROR;
348855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
349855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
350855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
351855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_Int8 M4OSA_FileReader_BufferMatch(M4OSA_FileReader_Context_optim* apContext,
352855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                        M4OSA_FilePosition pos)
353855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
354855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
355855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int8 i;
356855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
357855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
358855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Select the buffer which matches with given pos */
359855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
360855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
361855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(   (pos >= apContext->buffer[i].filepos)
362855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           && (pos < (apContext->buffer[i].filepos + apContext->buffer[i].size)) )
363855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
364855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return i;
365855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
366855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
367855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4OSA_READBUFFER_NONE;
368855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
369855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
370855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
371855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_Int8 M4OSA_FileReader_BufferSelect(M4OSA_FileReader_Context_optim* apContext,
372855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                         M4OSA_Int8 current_i)
373855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
374855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
375855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int8 i,j;
376855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition min_amount,max_amount;
377855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int8 min_i,max_count;
378855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
379855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* update nbFillSinceLastAcess field */
380855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
381855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
382855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->buffer[i].nbFillSinceLastAcess ++;
383855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
384855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
385855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Plan A : Scan for empty buffer */
386855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
387855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
388855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(apContext->buffer[i].remain == 0)
389855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
390855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return i;
391855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
392855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
393855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
394855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    max_count = M4OSA_READBUFFER_NB;
395855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    max_amount = MAX_FILLS_SINCE_LAST_ACCESS;
396855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
397855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Plan B : Scan for dead buffer */
398855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
399855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
400855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(apContext->buffer[i].nbFillSinceLastAcess >= (M4OSA_UInt32) max_amount)
401855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
402855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            max_amount = apContext->buffer[i].nbFillSinceLastAcess;
403855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            max_count = i;
404855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
405855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
406855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(max_count<M4OSA_READBUFFER_NB)
407855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
408855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE2_2("DEAD BUFFER: %d, %d",max_count,apContext->buffer[max_count].nbFillSinceLastAcess);
409855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return max_count;
410855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
411855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
412855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    min_i = current_i;
413855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    min_amount = M4OSA_READBUFFER_SIZE;
414855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
415855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Select the buffer which is the most "empty" */
416855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    for(i=0; i<M4OSA_READBUFFER_NB; i++)
417855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
418855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        j = (i+current_i)%M4OSA_READBUFFER_NB;
419855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
420855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(apContext->buffer[j].remain < min_amount)
421855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
422855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            min_amount = apContext->buffer[j].remain;
423855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            min_i = j;
424855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
425855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
426855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
427855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return min_i;
428855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
429855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
430855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
431855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
432855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_FileReader_CalculateSize(M4OSA_FileReader_Context_optim* apContext)
433855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**************************************************************/
434855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
435855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR            err = M4NO_ERROR;
436855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
437855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR            errno = M4NO_ERROR;
438855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
439855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int32          ret_val;
440855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt16         errno;
441855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
442855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
443855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* go to the end of file*/
444855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
445855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    errno = apContext->FS->getOption(apContext->aFileDesc, M4OSA_kFileReadGetFileSize,
446855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                        (M4OSA_DataOption*) &apContext->fileSize);
447855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4NO_ERROR != errno)
448855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
449855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = errno;
450855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE1_1("M4OSA_FileReader_CalculateSize ERR = 0x%x", err);
451855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
452855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
453855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    ret_val = apContext->FS->pFctPtr_Seek(apContext->aFileDesc, 0, M4OSA_kFileSeekEnd, &errno);
454855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
455855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (ret_val != 0)
456855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
457855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->readFilePos = M4OSA_EOF;
458855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_READER, errno);
459855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE1_1("M4OSA_FileReader_CalculateSize ERR = 0x%x", err);
460855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
461855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    else
462855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
463855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* Retrieve size of the file */
464855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->fileSize = apContext->FS->pFctPtr_Tell(apContext->aFileDesc, &errno);
465855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        apContext->readFilePos = apContext->fileSize;
466855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
467855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_READER_OPTIM_USE_OSAL_IF*/
468855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
469855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
470855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
471855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
472855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
473855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/* __________________________________________________________ */
474855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|                                                          |*/
475855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|                   OSAL filesystem API                    |*/
476855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*|__________________________________________________________|*/
477855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
478855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
479855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
480855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief       This method opens the provided fileDescriptor and returns its context.
481855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pContext:       (OUT) File reader context.
482855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pFileDescriptor :       (IN) File Descriptor of the input file.
483855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       FileModeAccess :        (IN) File mode access.
484855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4NO_ERROR: there is no error
485855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_PARAMETER pContext or fileDescriptor is NULL
486855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_ALLOC     there is no more memory available
487855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_FILE_BAD_MODE_ACCESS      the file mode access is not correct (it must be either isTextMode or read)
488855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_FILE_NOT_FOUND The file can not be opened.
489855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
490855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
491855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
492855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR M4OSA_fileReadOpen_optim(M4OSA_Context* pContext,
493855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       M4OSA_Void* pFileDescriptor,
494855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       M4OSA_UInt32 FileModeAccess)
495855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
496855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR M4OSA_fileReadOpen_optim(M4OSA_Context* pContext,
497855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       M4OSA_Void* pFileDescriptor,
498855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       M4OSA_UInt32 FileModeAccess,
499855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       M4OSA_FileSystem_FctPtr *FS)
500855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
501855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
502855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_Context_optim* apContext = M4OSA_NULL;
503855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
504855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR   err       = M4NO_ERROR;
505855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Void* aFileDesc = M4OSA_NULL;
506855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Bool  buffers_allocated = M4OSA_FALSE;
507855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
508855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR errno = M4NO_ERROR;
509855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
510855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt16 errno;
511855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_READER_OPTIM_USE_OSAL_IF*/
512855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
513855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_3("M4OSA_fileReadOpen_optim p = 0x%p fd = %s mode = %lu", pContext,
514855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                   pFileDescriptor, FileModeAccess);
515855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
516855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*      Check input parameters */
517855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext);
518855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pFileDescriptor);
519855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
520855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    *pContext = M4OSA_NULL;
521855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
522855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*      Allocate memory for the File reader context. */
523694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    apContext = (M4OSA_FileReader_Context_optim *)M4OSA_32bitAlignedMalloc(sizeof(M4OSA_FileReader_Context_optim),
524d67e9da63323d965760337913f86de28024531a4Basavapatna Dattaguru                                      M4OSA_FILE_READER, (M4OSA_Char *)"M4OSA_FileReader_Context_optim");
525855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
526855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_ALLOC, apContext);
527855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
528855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Set filesystem interface */
529855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
530855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
531855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*Set the optimized functions, to be called by the user*/
532855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
533694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    apContext->FS = (M4OSA_FileReadPointer*) M4OSA_32bitAlignedMalloc(sizeof(M4OSA_FileReadPointer),
534d67e9da63323d965760337913f86de28024531a4Basavapatna Dattaguru                                       M4OSA_FILE_READER, (M4OSA_Char *)"M4OSA_FileReaderOptim_init");
535855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4OSA_NULL==apContext->FS)
536855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
537d67e9da63323d965760337913f86de28024531a4Basavapatna Dattaguru        M4OSA_TRACE1_0("M4OSA_FileReaderOptim_init - ERROR : allocation failed");
538855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4ERR_ALLOC;
539855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
540855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS->openRead  = M4OSA_fileReadOpen;
541855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS->readData  = M4OSA_fileReadData;
542855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS->seek      = M4OSA_fileReadSeek;
543855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS->closeRead = M4OSA_fileReadClose;
544855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS->setOption = M4OSA_fileReadSetOption;
545855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS->getOption = M4OSA_fileReadGetOption;
546d67e9da63323d965760337913f86de28024531a4Basavapatna Dattaguru#else
547855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FS = FS;
548855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
549855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
550855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Verify access mode */
551855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (   ((FileModeAccess & M4OSA_kFileAppend) != 0)
552855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        || ((FileModeAccess & M4OSA_kFileRead) == 0))
553855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
554855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4ERR_FILE_BAD_MODE_ACCESS;
555855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        goto cleanup;
556855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
557855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
558855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Open file in read mode */
559855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if((FileModeAccess & M4OSA_kFileCreate) != 0)
560855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
561855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4ERR_FILE_BAD_MODE_ACCESS;
562855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
563855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    else
564855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
565855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if ((FileModeAccess & M4OSA_kFileRead))
566855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
567855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            /* File is opened in read only*/
568855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
569855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            errno = apContext->FS->openRead(&aFileDesc, pFileDescriptor, FileModeAccess);
570855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
571855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if ((aFileDesc == M4OSA_NULL)||(M4NO_ERROR != errno))
572855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
573855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* converts the error to PSW format*/
574855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                err = errno;
575855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                M4OSA_TRACE2_1("M4OSA_fileReadOpen_optim ERR1 = 0x%x", err);
576855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                apContext->IsOpened = M4OSA_FALSE;
577855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
578855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
579855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            aFileDesc = apContext->FS->pFctPtr_Open(pFileDescriptor, FileModeAccess, &errno);
580855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
581855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if (aFileDesc == M4OSA_NULL)
582855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
583855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* converts the error to PSW format*/
584855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                err = M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_READER, errno);
585855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                M4OSA_TRACE2_1("M4OSA_fileReadOpen_optim ERR1 = 0x%x", err);
586855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                apContext->IsOpened = M4OSA_FALSE;
587855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
588855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
589855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
590855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            else
591855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
592855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                apContext->IsOpened = M4OSA_TRUE;
593855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
594855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
595855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
596855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
597855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4ERR_FILE_BAD_MODE_ACCESS;
598855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
599855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
600855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
601855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4NO_ERROR != err) goto cleanup;
602855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
603855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Allocate buffers */
604855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    err = M4OSA_FileReader_BufferInit(apContext);
605855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    buffers_allocated = M4OSA_TRUE;
606855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
607855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4NO_ERROR != err) goto cleanup;
608855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
609855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Initialize parameters */
610855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->fileSize = 0;
611855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->absolutePos = 0;
612855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->readFilePos = 0;
613855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
614855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Retrieve the File Descriptor*/
615855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->aFileDesc = aFileDesc;
616855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
617855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Retrieve the File mode Access */
618855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->FileAttribute.modeAccess = (M4OSA_FileModeAccess) FileModeAccess;
619855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
620855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*Retrieve the File reader context */
621855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    *pContext= (M4OSA_Context)apContext;
622855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
623855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Compute file size */
624855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    err = M4OSA_FileReader_CalculateSize(apContext);
625855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
626855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4NO_ERROR != err) goto cleanup;
627855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
628855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4NO_ERROR;
629855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
630855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargicleanup:
631855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
632855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* free context */
633855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4OSA_NULL != apContext)
634855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
635855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(buffers_allocated == M4OSA_TRUE)
636855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
637855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_FileReader_BufferFree(apContext);
638855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
639855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
640694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free( apContext);
641855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        *pContext = M4OSA_NULL;
642855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
643855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
644855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_1 ("M4OSA_fileReadOpen_optim: returns error 0x%0x", err)
645855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
646855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
647855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
648855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
649855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
650855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief       This method reads the 'size' bytes in the core file reader (selected by its 'context')
651855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*                      and writes the data to the 'data' pointer. If 'size' byte can not be read in the core file reader,
652855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*                      'size' parameter is updated to match the correct number of read bytes.
653855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pContext:       (IN) File reader context.
654855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pData : (OUT) Data pointer of the read data.
655855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pSize : (INOUT) Size of the data to read (in byte).
656855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4NO_ERROR: there is no error
657855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_PARAMETER pSize, fileDescriptor or pData is NULL
658855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_ALLOC     there is no more memory available
659855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_BAD_CONTEXT       provided context is not a valid one.
660855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
661855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
662855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadData_optim(M4OSA_Context pContext,M4OSA_MemAddr8 pData,
663855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                            M4OSA_UInt32* pSize)
664855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
665855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_Context_optim* apContext =
666855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                     (M4OSA_FileReader_Context_optim*) pContext;
667855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
668855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR err;
669855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition aSize;
670855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FilePosition copiedSize;
671855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int8 selected_buffer, current_buffer;
672855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
673855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE3_3("M4OSA_fileReadData_optim p = 0x%p  d = 0x%p  s = %lu",
674855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                       pContext, pData, *pSize);
675855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
676855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Check input parameters */
677855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_BAD_CONTEXT, apContext);
678855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pData);
679855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pSize);
680855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
681855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (apContext->IsOpened != M4OSA_TRUE)
682855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
683855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4ERR_BAD_CONTEXT;
684855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
685855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
686855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Prevent reading beyond EOF */
687855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if((*pSize > 0) && (apContext->absolutePos >= apContext->fileSize))
688855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
689855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        copiedSize = 0;
690855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4WAR_NO_MORE_AU;
691855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        goto cleanup;
692855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
693855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
694855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Check if data can be read from a buffer */
695855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* If not, fill one according to quantized positions */
696855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    copiedSize = 0;
697855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    err = M4NO_ERROR;
698855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
699855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    selected_buffer = M4OSA_FileReader_BufferMatch(apContext, apContext->absolutePos);
700855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
701855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(selected_buffer == M4OSA_READBUFFER_NONE)
702855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
703855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        selected_buffer = M4OSA_FileReader_BufferSelect(apContext, 0);
704855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4OSA_FileReader_BufferFill(apContext, selected_buffer,
705855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                        apContext->absolutePos);
706855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
707855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
708855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(err != M4NO_ERROR)
709855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
710855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(err == M4WAR_NO_DATA_YET)
711855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
712855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if (*pSize <= (M4OSA_UInt32)apContext->buffer[selected_buffer].size)
713855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
714855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                err = M4NO_ERROR;
715855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
716855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            else
717855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
718855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                copiedSize = (M4OSA_UInt32)apContext->buffer[selected_buffer].size;
719855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /*copy the content into pData*/
720855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                M4OSA_FileReader_BufferCopy(apContext, selected_buffer,
721855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                     apContext->absolutePos, copiedSize, pData);
722855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                goto cleanup;
723855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
724855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
725855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
726855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
727855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            goto cleanup;
728855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
729855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
730855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
731855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE3_3("read  size = %lu  buffer = %d  pos = %ld", *pSize,
732855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                       selected_buffer, apContext->absolutePos);
733855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
734855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Copy buffer into pData */
735855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    while(((M4OSA_UInt32)copiedSize < *pSize) && (err == M4NO_ERROR))
736855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
737855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        aSize = M4OSA_FileReader_BufferCopy(apContext, selected_buffer,
738855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                            apContext->absolutePos+copiedSize,
739855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                            *pSize-copiedSize, pData+copiedSize);
740855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        copiedSize += aSize;
741855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
742855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(aSize == 0)
743855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
744855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4WAR_NO_DATA_YET;
745855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
746855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
747855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
748855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if((M4OSA_UInt32)copiedSize < *pSize)
749855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
750855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                current_buffer = selected_buffer;
751855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                selected_buffer = M4OSA_FileReader_BufferMatch(apContext,
752855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                             apContext->absolutePos+copiedSize);
753855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
754855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                if(selected_buffer == M4OSA_READBUFFER_NONE)
755855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                {
756855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    selected_buffer = M4OSA_FileReader_BufferSelect(apContext,
757855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                                current_buffer);
758855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    err = M4OSA_FileReader_BufferFill(apContext, selected_buffer,
759855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                             apContext->absolutePos+copiedSize);
760855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
761855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    if(err != M4NO_ERROR)
762855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    {
763855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        if(err == M4WAR_NO_DATA_YET)
764855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        {
765855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            /*If we got all the data that we wanted, we should return no error*/
766855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            if ((*pSize-copiedSize) <= (M4OSA_UInt32)apContext->buffer[selected_buffer].size)
767855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            {
768855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                err = M4NO_ERROR;
769855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            }
770855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            /*If we did not get enough data, we will return NO_DATA_YET*/
771855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
772855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            /*copy the data read*/
773855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            aSize = M4OSA_FileReader_BufferCopy(apContext, selected_buffer,
774855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                               apContext->absolutePos+copiedSize,
775855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                               *pSize-copiedSize, pData+copiedSize);
776855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            copiedSize += aSize;
777855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
778855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            /*we reached end of file, so stop trying to read*/
779855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            goto cleanup;
780855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        }
781855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        if (err == M4WAR_NO_MORE_AU)
782855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        {
783855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            err = M4WAR_NO_DATA_YET;
784855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
785855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            /*copy the data read*/
786855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            aSize = M4OSA_FileReader_BufferCopy(apContext, selected_buffer,
787855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                             apContext->absolutePos+copiedSize,
788855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                             *pSize-copiedSize, pData+copiedSize);
789855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            copiedSize += aSize;
790855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
791855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            /*we reached end of file, so stop trying to read*/
792855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            goto cleanup;
793855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
794855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        }
795855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        else
796855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        {
797855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            goto cleanup;
798855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        }
799855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    }
800855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                }
801855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
802855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
803855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
804855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
805855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargicleanup :
806855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
807855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Update the new position of the pointer */
808855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->absolutePos = apContext->absolutePos + copiedSize;
809855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
810855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if((err != M4NO_ERROR)&&(err!=M4WAR_NO_DATA_YET))
811855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
812855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE2_3("M4OSA_fileReadData_optim size = %ld  copied = %ld  err = 0x%x",
813855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                           *pSize, copiedSize, err);
814855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
815855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
816855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Effective copied size must be returned */
817855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    *pSize = copiedSize;
818855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
819855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
820855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Read is done */
821855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
822855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
823855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
824855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
825855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
826855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief       This method seeks at the provided position in the core file reader (selected by its 'context').
827855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              The position is related to the seekMode parameter it can be either :
828855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              From the beginning (position MUST be positive) : end position = position
829855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              From the end (position MUST be negative) : end position = file size + position
830855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              From the current position (signed offset) : end position = current position + position.
831855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pContext:       (IN) File reader context.
832855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       SeekMode :      (IN) Seek access mode.
833855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pPosition :     (IN) Position in the file.
834855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4NO_ERROR: there is no error
835855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_PARAMETER Seekmode or fileDescriptor is NULL
836855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_ALLOC     there is no more memory available
837855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_BAD_CONTEXT       provided context is not a valid one.
838855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_FILE_INVALID_POSITION the position cannot be reached.
839855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
840855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
841855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadSeek_optim( M4OSA_Context pContext, M4OSA_FileSeekAccessMode SeekMode,
842855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                              M4OSA_FilePosition* pPosition)
843855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
844855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_Context_optim* apContext = (M4OSA_FileReader_Context_optim*) pContext;
845855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
846855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE3_3("M4OSA_fileReadSeek_optim p = 0x%p mode = %d pos = %d", pContext,
847855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                             SeekMode, *pPosition);
848855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
849855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Check input parameters */
850855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_BAD_CONTEXT, apContext);
851855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pPosition);
852855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, SeekMode);
853855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
854855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (apContext->IsOpened != M4OSA_TRUE)
855855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
856855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4ERR_BAD_CONTEXT;       /*< The context can not be correct */
857855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
858855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
859855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Go to the desired position */
860855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    switch(SeekMode)
861855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
862855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileSeekBeginning :
863855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if(*pPosition < 0) {
864855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                return M4ERR_PARAMETER; /**< Bad SeekAcess mode */
865855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
866855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            apContext->absolutePos = *pPosition;
867855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pPosition = apContext->absolutePos;
868855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
869855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
870855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileSeekEnd :
871855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if(*pPosition > 0) {
872855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                return M4ERR_PARAMETER; /**< Bad SeekAcess mode */
873855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
874855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            apContext->absolutePos = apContext->fileSize + *pPosition;
875855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pPosition = apContext->absolutePos;
876855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
877855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
878855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileSeekCurrent :
879855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if(((apContext->absolutePos + *pPosition) > apContext->fileSize) ||
880855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                ((apContext->absolutePos + *pPosition) < 0)){
881855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                return M4ERR_PARAMETER; /**< Bad SeekAcess mode */
882855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
883855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            apContext->absolutePos = apContext->absolutePos + *pPosition;
884855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pPosition = apContext->absolutePos;
885855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
886855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
887855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        default :
888855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4ERR_PARAMETER; /**< Bad SeekAcess mode */
889855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
890855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
891855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
892855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Return without error */
893855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
894855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
895855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
896855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
897855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
898855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief       This method asks the core file reader to close the file
899855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              (associated to the context) and also frees the context.
900855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pContext:       (IN) File reader context.
901855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4NO_ERROR: there is no error
902855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_BAD_CONTEXT       provided context is not a valid one.
903855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
904855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
905855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadClose_optim(M4OSA_Context pContext)
906855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
907855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_Context_optim* apContext = (M4OSA_FileReader_Context_optim*) pContext;
908855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
909855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
910855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
911855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR errno = M4NO_ERROR;
912855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
913855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_UInt16 errno;
914855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
915855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
916855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_1("M4OSA_fileReadClose_optim p = 0x%p", pContext );
917855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
918855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Check input parameters */
919855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_BAD_CONTEXT, apContext);
920855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
921855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (apContext->IsOpened != M4OSA_TRUE)
922855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
923855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4ERR_BAD_CONTEXT;       /**< The context can not be correct */
924855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
925855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
926855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* buffer */
927855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_BufferFree(apContext);
928855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
929855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Close the file */
930855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_READER_OPTIM_USE_OSAL_IF
931855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    errno = apContext->FS->closeRead(apContext->aFileDesc);
932855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
933855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4NO_ERROR != errno)
934855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
935855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* converts the error to PSW format*/
936855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = errno;
937855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE2_1("M4OSA_fileReadClose_optim ERR1 = 0x%x", err);
938855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
939855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
940855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    aRet_Val = apContext->FS->pFctPtr_Close(apContext->aFileDesc, &errno);
941855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
942855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (aRet_Val != 0)
943855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
944855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* converts the error to PSW format*/
945855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_READER, errno);
946855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_TRACE2_1("M4OSA_fileReadClose_optim ERR1 = 0x%x", err);
947855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
948855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_READER_OPTIM_USE_OSAL_IF*/
949855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
950855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    apContext->IsOpened = M4OSA_FALSE;
951855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
952855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    //>>>> GLM20090212 : set the low level function statically
953855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (apContext->FS != M4OSA_NULL)
954855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
955694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu        free( apContext->FS);
956855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
957855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    //<<<< GLM20090212 : set the low level function statically
958855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
959855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Free the context */
960694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu    free(apContext);
961855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
962855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Return without error */
963855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
964855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
965855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
966855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
967855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
968855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief       This is a dummy function required to maintain function pointer
969855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              structure.
970855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @note        This is a dummy function required to maintain function pointer
971855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              structure.
972855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pContext:       (IN) Execution context.
973855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       OptionId :      (IN) Id of the option to set.
974855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       OptionValue :   (IN) Value of the option.
975855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4NO_ERROR: there is no error
976855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
977855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
978855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadSetOption_optim(M4OSA_Context pContext,
979855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                        M4OSA_FileReadOptionID OptionID,
980855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                        M4OSA_DataOption OptionValue)
981855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
982855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
983855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
984855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
985855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
986855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
987855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
988855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief       This method asks the core file reader to return the value associated
989855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              with the optionID.The caller is responsible for allocating/de-allocating
990855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*              the memory of the value field.
991855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @note        The options handled by the component depend on the implementation
992855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*                                                               of the component.
993855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pContext:       (IN) Execution context.
994855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       OptionId :      (IN) Id of the option to set.
995855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param       pOptionValue :  (OUT) Value of the option.
996855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4NO_ERROR: there is no error
997855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_BAD_CONTEXT       pContext is NULL
998855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_BAD_OPTION_ID the option id is not valid.
999855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return      M4ERR_NOT_IMPLEMENTED The option is not implemented yet.
1000855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi******************************************************************************
1001855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
1002855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadGetOption_optim(M4OSA_Context pContext,
1003855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                        M4OSA_FileReadOptionID OptionID,
1004855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                        M4OSA_DataOption* pOptionValue)
1005855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
1006855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileReader_Context_optim* apContext = (M4OSA_FileReader_Context_optim*) pContext;
1007855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR err = M4NO_ERROR;
1008855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1009855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*  Check input parameters */
1010855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_BAD_CONTEXT, apContext);
1011855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1012855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (apContext->IsOpened != M4OSA_TRUE)
1013855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
1014855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4ERR_BAD_CONTEXT;       /**< The context can not be correct */
1015855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
1016855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1017855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Get the desired option if it is avalaible */
1018855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    switch(OptionID)
1019855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
1020855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* Get File Size */
1021855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileReadGetFileSize:/**< Get size of the file, limited to 32 bit size */
1022855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1023855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            (*(M4OSA_UInt32 *)pOptionValue) = apContext->fileSize;
1024855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
1025855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1026855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* Check End of file Occurs */
1027855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileReadIsEOF :     /**< See if we are at the end of the file */
1028855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1029855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            (*(M4OSA_Bool *)pOptionValue) = (apContext->absolutePos >= apContext->fileSize) ? M4OSA_TRUE : M4OSA_FALSE;
1030855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
1031855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1032855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* Get File Position */
1033855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileReadGetFilePosition :   /**< Get file position */
1034855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1035855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *(M4OSA_FilePosition *)pOptionValue = apContext->absolutePos;
1036855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
1037855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1038855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* Get Attribute */
1039855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileReadGetFileAttribute :  /**< Get the file attribute = access mode */
1040855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1041855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            (*(M4OSA_FileAttribute *)pOptionValue).modeAccess = apContext->FileAttribute.modeAccess;
1042855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
1043855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1044855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        default:
1045855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            /**< Bad option ID */
1046855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4ERR_BAD_OPTION_ID;
1047855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            break;
1048855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
1049855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
1050855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*Return without error */
1051855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
1052855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
1053