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 * @file         M4OSA_FileReader.c
19855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @author       Cedric Lecoutre (cedric.lecoutre@philips.com)
20855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *               Laurent Fay (laurent.fay@philips.com)
21855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @par Org:     Philips Digital Systems Laboratories - Paris (PDSL-P)
22855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief        File reader for Android
23855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note         This file implements functions to read a file.
24855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
25855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
26855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
27855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
28855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Debug.h"
29855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_FileCommon_priv.h"
30855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_FileReader.h"
31855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_FileReader_priv.h"
32855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Memory.h"
33855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
34855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
35855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Semaphore.h"
36855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
37855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
38855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
39855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
40855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
41855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief      This function opens the provided URL and returns its context.
42855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             If an error occured, the context is set to NULL.
43855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param      context: (OUT) Context of the core file reader
44855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param      url: (IN) URL of the input file
45855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param      fileModeAccess: (IN) File mode access
46855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4NO_ERROR: there is no error
47855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_PARAMETER: at least one parameter is NULL
48855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_ALLOC: there is no more memory available
49855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_NOT_IMPLEMENTED: the URL does not match with the supported
50855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             file
51855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_FILE_NOT_FOUND: the file cannot be found
52855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_FILE_LOCKED: the file is locked by an other
53855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             application/process
54855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_FILE_BAD_MODE_ACCESS: the file mode access is not correct
55855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
56855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
57855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadOpen(M4OSA_Context* pContext, M4OSA_Void* pFileDescriptor,
58855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                             M4OSA_UInt32 fileModeAccess)
59855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
60855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE1_3("M4OSA_fileReadOpen : pC = 0x%p  fd = 0x%p  mode = %lu",
61855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                     pContext, pFileDescriptor, fileModeAccess);
62855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
63855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4OSA_fileCommonOpen(M4OSA_FILE_READER, pContext,
64855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                               pFileDescriptor, fileModeAccess);
65855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
66855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
67855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
68855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
69855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @brief      This function reads the 'size' bytes in the core file reader
70855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             (selected by its 'context') and writes the data to the 'data'
71855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             pointer.
72855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @note       If 'size' byte cannot be read in the core file reader, 'size'
73855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             parameter is updated to match the correct
74855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @note       number of read bytes.
75855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param      context: (IN/OUT) Context of the core file reader
76855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param      buffer: (OUT) Data pointer of the read data
77855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @param      size: (IN/OUT) Size of the data to read (in bytes)
78855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4NO_ERROR: there is no error
79855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_PARAMETER: at least one parameter is NULL
80855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
81855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4ERR_ALLOC: there is no more memory available
82855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi* @return     M4WAR_NO_DATA_YET: there is no enough data to fill the 'data'
83855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*             buffer, so the size parameter has been updated.
84855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
85855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
86855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadData(M4OSA_Context pContext, M4OSA_MemAddr8 data,
87855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                            M4OSA_UInt32* pSize)
88855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
89855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileContext* pFileContext = pContext;
90855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR    err = M4NO_ERROR;
91855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_Int32    uiSizeRead;
92855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
93855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_2("M4OSA_fileReadData : data = 0x%p  size = %lu",
94855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    data, (M4OSA_NULL != pSize) ? (*pSize) : 0);
95855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
96855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
97855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  "M4OSA_fileReadData: pContext is M4OSA_NULL");
98855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == data, M4ERR_PARAMETER,
99855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                      "M4OSA_fileReadData: data is M4OSA_NULL");
100855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pSize, M4ERR_PARAMETER,
101855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                     "M4OSA_fileReadData: pSize is M4OSA_NULL");
102855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
103855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context,
104855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4ERR_BAD_CONTEXT, "M4OSA_fileReadData: semaphore_context is M4OSA_NULL");
105855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
106855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
107855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(M4OSA_kDescRWAccess == pFileContext->m_DescrModeAccess) /* read write */
108855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
109855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        uiSizeRead = fread(data, sizeof(M4OSA_Char), *pSize,
110855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                       pFileContext->file_desc);
111855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(-1 == uiSizeRead)
112855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
113855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            /* handle is invalid, or the file is not open for reading, or the file is locked */
114855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pSize = 0;
115855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4ERR_BAD_CONTEXT;
116855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
117855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
118855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
119aa382f3637a68361989d5b70e3184bddcc472d3dhongteng            pFileContext->read_position = pFileContext->read_position + uiSizeRead;
120855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if ((M4OSA_UInt32)uiSizeRead < *pSize)
121855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
122855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                *pSize = uiSizeRead;
123855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* This is the end of file */
124855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                pFileContext->b_is_end_of_file = M4OSA_TRUE;
125855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                err = M4WAR_NO_DATA_YET;
126855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
127855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            else
128855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
129855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                *pSize = uiSizeRead;
130855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
131855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
132855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
133855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return err;
134855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
135855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
136855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
137855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
138855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
139855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
140855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(pFileContext->current_seek != SeekRead)
141855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
142855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* fseek to the last read position */
143855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4OSA_fileCommonSeek(pContext, M4OSA_kFileSeekBeginning,
144855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                &(pFileContext->read_position));
145855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(M4OSA_ERR_IS_ERROR(err))
146855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
147855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_DEBUG(err, "M4OSA_fileReadData: M4OSA_fileCommonSeek");
148855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
149855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
150855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphorePost(pFileContext->semaphore_context);
151855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
152855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
153855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return err;
154855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
155855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
156855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        pFileContext->current_seek = SeekRead;
157855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
158855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
159855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /* Read data */
160855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    uiSizeRead = fread(data, sizeof(M4OSA_Char), *pSize,
161855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                       pFileContext->file_desc);
162855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(-1 == uiSizeRead)
163855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
164855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* handle is invalid, or the file is not open for reading,
165855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         or the file is locked */
166855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        *pSize = 0;
167855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4ERR_BAD_CONTEXT;
168855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
169855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    else
170855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
171aa382f3637a68361989d5b70e3184bddcc472d3dhongteng        pFileContext->read_position = pFileContext->read_position + uiSizeRead;
172855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if ((M4OSA_UInt32)uiSizeRead < *pSize)
173855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
174855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pSize = uiSizeRead;
175855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
176855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            /* This is the end of file */
177855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            pFileContext->b_is_end_of_file = M4OSA_TRUE;
178855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
179855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err = M4WAR_NO_DATA_YET;
180855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
181855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
182855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
183855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pSize = uiSizeRead;
184855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
185855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
186855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
187855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
188855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_semaphorePost(pFileContext->semaphore_context);
189855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
190855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
191855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
192855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
193855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
194855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
195855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
196855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
197855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
198855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This function seeks at the provided position in the core file
199855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             reader (selected by its 'context'). The position is related to
200855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             the seekMode parameter it can be either from the beginning, from
201855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             the end or from the current postion. To support large file
202855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             access (more than 2GBytes), the position is provided on a 64
203855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             bits.
204855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       If this function returns an error the current position pointer
205855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             in the file must not change. Else the current
206855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             position pointer must be updated.
207855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context: (IN/OUT) Context of the core file reader
208855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      seekMode: (IN) Seek access mode
209855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      position: (IN/OUT) Position in the file
210855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
211855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
212855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
213855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_ALLOC: there is no more memory available
214855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_FILE_INVALID_POSITION: the position cannot be reached
215855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
216855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
217855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
218855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadSeek(M4OSA_Context pContext, M4OSA_FileSeekAccessMode seekMode,
219855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                             M4OSA_FilePosition* pPosition)
220855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
221855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileContext* pFileContext = (M4OSA_FileContext*)pContext;
222855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_ERR err;
223855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
224855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_2("M4OSA_fileReadSeek : mode = %d  pos = %lu", seekMode,
225855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  (pPosition != M4OSA_NULL) ? (*pPosition) : 0);
226855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
227855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
228855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  "M4OSA_fileReadSeek: pContext is M4OSA_NULL");
229855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(0 == seekMode, M4ERR_PARAMETER,
230855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                           "M4OSA_fileReadSeek: seekMode is 0");
231855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pPosition, M4ERR_PARAMETER,
232855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                 "M4OSA_fileReadSeek: pPosition is M4OSA_NULL");
233855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
234855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context,
235855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4ERR_BAD_CONTEXT, "M4OSA_fileReadSeek: semaphore_context is M4OSA_NULL");
236855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
237855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
238855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if (M4OSA_kDescRWAccess == pFileContext->m_DescrModeAccess)
239855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
240855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_UInt32    SeekModeOption;
241855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         /* Go to the desired position */
242855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if (M4OSA_kFileSeekBeginning == seekMode)
243855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
244855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            SeekModeOption = SEEK_SET;
245855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
246855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else if (M4OSA_kFileSeekEnd == seekMode)
247855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
248855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            SeekModeOption = SEEK_END;
249855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
250855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else if (M4OSA_kFileSeekCurrent == seekMode)
251855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
252855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            SeekModeOption = SEEK_CUR;
253855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
254855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
255855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
256855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_TRACE1_0("M4OSA_fileReadSeek: END WITH ERROR !!! (CONVERION ERROR FOR THE SEEK MODE)");
257855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4ERR_PARAMETER;
258855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
259855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
260855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /**
261855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         * Go to the desired position */
262855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = fseek(pFileContext->file_desc, *pPosition, SeekModeOption);
263855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(err != 0)
264855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
265855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            /* converts the error to PSW format*/
266855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            err=((M4OSA_UInt32)(M4_ERR)<<30)+(((M4OSA_FILE_WRITER)&0x003FFF)<<16)+(M4OSA_Int16)(err);
267855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_TRACE1_1("M4OSA_FileReadSeek error:%x",err);
268855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
269855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        else
270855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
271855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4NO_ERROR;
272855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
273855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
274855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* Return without error */
275855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return err;
276855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
277855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
278855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
279855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
280855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
281855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
282855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
283855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(pFileContext->current_seek != SeekRead)
284855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
285855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
286855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        /* fseek to the last read position */
287855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        err = M4OSA_fileCommonSeek(pContext, M4OSA_kFileSeekBeginning,
288855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                &(pFileContext->read_position));
289855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        if(M4OSA_ERR_IS_ERROR(err))
290855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
291855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_DEBUG(err, "M4OSA_fileReadData: M4OSA_fileCommonSeek");
292855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
293855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
294855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphorePost(pFileContext->semaphore_context);
295855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
296855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
297855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return err;
298855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
299855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
300855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        pFileContext->current_seek = SeekRead;
301855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
302855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
303855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    err = M4OSA_fileCommonSeek(pContext, seekMode, pPosition);
304855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(M4OSA_ERR_IS_ERROR(err))
305855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
306855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        M4OSA_DEBUG(err, "M4OSA_fileReadData: M4OSA_fileCommonSeek");
307855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
308855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    else
309855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
310aa382f3637a68361989d5b70e3184bddcc472d3dhongteng        pFileContext->read_position = *pPosition;
311855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
312855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
313855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
314855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_semaphorePost(pFileContext->semaphore_context);
315855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
316855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
317855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return err;
318855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
319855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
320855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
321855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
322855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
323855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This function asks the core file reader to close the file
324855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             (associated to the context).
325855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       The context of the core file reader is freed.
326855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      pContext: (IN/OUT) Context of the core file reader
327855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
328855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
329855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
330855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_ALLOC: there is no more memory available
331855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
332855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
333855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadClose(M4OSA_Context pContext)
334855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
335855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileContext* pFileContext = (M4OSA_FileContext*)pContext;
336855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
337855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE1_1("M4OSA_fileReadClose : pC = 0x%p", pContext);
338855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
339855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
340855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                 "M4OSA_fileReadClose: pContext is M4OSA_NULL");
341855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
342855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    if(M4OSA_FILE_WRITER == pFileContext->coreID_write)
343855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
344855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        return M4NO_ERROR;
345855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
346855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
347855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4OSA_fileCommonClose(M4OSA_FILE_READER, pContext);
348855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
349855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
350855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
351855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
352855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
353855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
354855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
355855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This function asks the core file reader to return the value
356855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             associated with the optionID. The caller is responsible for
357855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             allocating/de-allocating the memory of the value field.
358855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       'value' must be cast according to the type related to the
359855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             optionID As the caller is responsible for
360855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             allocating/de-allocating the 'value' field, the callee must copy
361855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             this field to its internal variable.
362855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      pContext: (IN/OUT) Context of the core file reader
363855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      pOptionID: (IN) ID of the option
364855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      pOptionValue: (OUT) Value of the option
365855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
366855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
367855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
368855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_OPTION_ID: the optionID is not a valid one
369855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_WRITE_ONLY: this option is a write only one
370855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_NOT_IMPLEMENTED: this option is not implemented
371855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
372855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
373855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadGetOption(M4OSA_Context pContext, M4OSA_FileReadOptionID optionID,
374855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4OSA_DataOption* pOptionValue)
375855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
376855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileContext* pFileContext = pContext;
377855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
378855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_1("M4OSA_fileReadGetOption : option = 0x%x", optionID);
379855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
380855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
381855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                             "M4OSA_fileReadGetOption: pContext is M4OSA_NULL");
382855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(optionID == 0, M4ERR_PARAMETER,
383855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                      "M4OSA_fileReadGetOption: optionID is 0");
384855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pOptionValue, M4ERR_PARAMETER,
385855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                         "M4OSA_fileReadGetOption: pOptionValue is M4OSA_NULL");
386855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
387855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_COREID(optionID, M4OSA_FILE_READER),
388855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                M4ERR_BAD_OPTION_ID, "M4OSA_fileReadGetOption");
389855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_READABLE(optionID),
390855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                   M4ERR_WRITE_ONLY, "M4OSA_fileReadGetOption");
391855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
392855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context,
393855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4ERR_BAD_CONTEXT,
394855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  "M4OSA_fileReadGetOption: semaphore_context is M4OSA_NULL");
395855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
396855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
397855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    switch(optionID)
398855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
399855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_FILE_READ_GET_FILE_POSITION == M4OSA_TRUE)
400855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    case M4OSA_kFileReadGetFilePosition:
401855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
402855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_FilePosition* pPosition = (M4OSA_FilePosition*)pOptionValue;
403855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
404855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
405855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
406855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
407855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
408855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pPosition = pFileContext->read_position;
409855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
410855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
411855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphorePost(pFileContext->semaphore_context);
412855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
413855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
414855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4NO_ERROR;
415855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
416855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_FILE_READ_GET_FILE_POSITION*/
417855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
418855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_FILE_READ_IS_EOF == M4OSA_TRUE)
419855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    case M4OSA_kFileReadIsEOF:
420855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
421855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_Bool* bIsEndOfFile = (M4OSA_Bool*)pOptionValue;
422855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
423855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
424855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
425855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
426855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
427855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *bIsEndOfFile = pFileContext->b_is_end_of_file;
428855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
429855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
430855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphorePost(pFileContext->semaphore_context);
431855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
432855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
433855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4NO_ERROR;
434855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
435855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_FILE_READ_IS_EOF*/
436855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
437855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
438855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_FILE_READ_GET_FILE_SIZE == M4OSA_TRUE)
439855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    case M4OSA_kFileReadGetFileSize:
440855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
441855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_FilePosition* pPosition = (M4OSA_FilePosition*)pOptionValue;
442855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_Int32 iSavePos    = 0;
443855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_Int32 iSize        = 0;
444855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
445855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
446855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
447855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
448855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            /**
449855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            * Bugfix: update the file size.
450855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            * When a file is in read mode, may be another application is writing in.
451855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            * So, we have to update the file size */
452855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            iSavePos = ftell(pFileContext->file_desc);            /*1- Check the first position */
453855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            fseek(pFileContext->file_desc, 0, SEEK_END);        /*2- Go to the end of the file */
454855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            iSize = ftell(pFileContext->file_desc);                /*3- Check the file size*/
455855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            fseek(pFileContext->file_desc, iSavePos, SEEK_SET);    /*4- go to the first position*/
456855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            pFileContext->file_size = iSize;
457855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
458855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *pPosition = pFileContext->file_size;
459855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
460855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
461855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_semaphorePost(pFileContext->semaphore_context);
462855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
463855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
464855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4NO_ERROR;
465855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
466855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_FILE_READ_GET_FILE_SIZE*/
467855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
468855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_FILE_READ_GET_FILE_ATTRIBUTE == M4OSA_TRUE)
469855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    case M4OSA_kFileReadGetFileAttribute:
470855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
471855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4OSA_fileCommonGetAttribute(pContext,
472855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                            (M4OSA_FileAttribute*)pOptionValue);
473855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
474855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_FILE_READ_GET_FILE_ATTRIBUTE*/
475855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
476855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_FILE_READ_GET_URL == M4OSA_TRUE)
477855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    case M4OSA_kFileReadGetURL:
478855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
479855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4OSA_fileCommonGetURL(pContext, (M4OSA_Char**)pOptionValue);
480855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
481855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_FILE_READ_GET_URL*/
482855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
483855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileReadLockMode:
484855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
485855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            *(M4OSA_UInt32*)pOptionValue = pFileContext->m_uiLockMode;
486855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4NO_ERROR;
487855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
488855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
489855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
490855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG(M4ERR_NOT_IMPLEMENTED, "M4OSA_fileReadGetOption");
491855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
492855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    return M4ERR_NOT_IMPLEMENTED;
493855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
494855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
495855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
496855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
497855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @fn         M4OSA_ERR M4OSA_fileReadSetOption (M4OSA_Context context,
498855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *                       M4OSA_OptionID optionID, M4OSA_DataOption optionValue))
499855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This function asks the core file reader to set the value associated with the optionID.
500855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             The caller is responsible for allocating/de-allocating the memory of the value field.
501855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       As the caller is responsible for allocating/de-allocating the 'value' field, the callee must copy this field
502855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             to its internal variable.
503855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      pContext: (IN/OUT) Context of the core file reader
504855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      optionID: (IN) ID of the option
505855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      value: (IN) Value of the option
506855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
507855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
508855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
509855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_OPTION_ID: the optionID is not a valid one
510855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_READ_ONLY: this option is a read only one
511855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_NOT_IMPLEMENTED: this option is not implemented
512855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
513855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
514855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_fileReadSetOption(M4OSA_Context pContext,
515855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4OSA_FileReadOptionID optionID,
516855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4OSA_DataOption optionValue)
517855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
518855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_FileContext* pFileContext = pContext;
519855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
520855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_TRACE2_1("M4OSA_fileReadSetOption : option = 0x%x", optionID);
521855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
522855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
523855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                             "M4OSA_fileReadSetOption: pContext is M4OSA_NULL");
524855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(0 == optionID, M4ERR_PARAMETER,
525855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                     "M4OSA_fileReadSetOption");
526855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_COREID(optionID, M4OSA_FILE_READER),
527855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                M4ERR_BAD_OPTION_ID, "M4OSA_fileReadSetOption");
528855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
529855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_WRITABLE(optionID),
530855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    M4ERR_READ_ONLY, "M4OSA_fileReadSetOption");
531855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
532855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context,
533855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4ERR_BAD_CONTEXT,
534855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  "M4OSA_fileReadSetOption: semaphore_context is M4OSA_NULL");
535855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
536855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
537855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    switch(optionID)
538855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    {
539855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        case M4OSA_kFileReadLockMode:
540855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        {
541855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            pFileContext->m_uiLockMode= (M4OSA_UInt32)*(M4OSA_UInt32*)optionValue;
542855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4NO_ERROR;
543855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        }
544855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        default:
545855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_DEBUG(M4ERR_NOT_IMPLEMENTED, "M4OSA_fileReadSetOption");
546855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return M4ERR_NOT_IMPLEMENTED;
547855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    }
548855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
549855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
550