Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 /**
     17  ************************************************************************
     18  * @file         M4OSA_FileWriter.c
     19  * @brief        File writer for Android
     20  * @note         This file implements functions to write in a file.
     21  ************************************************************************
     22 */
     23 
     24 #include "M4OSA_Debug.h"
     25 #include "M4OSA_FileCommon_priv.h"
     26 #include "M4OSA_FileWriter.h"
     27 #include "M4OSA_FileWriter_priv.h"
     28 #include "M4OSA_Memory.h"
     29 
     30 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
     31 #include "M4OSA_Semaphore.h"
     32 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
     33 
     34 /**
     35  ************************************************************************
     36  * @brief      This function opens the provided URL and returns its context.
     37  *             If an error occured, the context is set to NULL.
     38  * @param      pContext: (OUT) Context of the core file writer
     39  * @param      pUrl: (IN) URL of the input file
     40  * @param      fileModeAccess: (IN) File mode access
     41  * @return     M4NO_ERROR: there is no error
     42  * @return     M4ERR_PARAMETER: at least one parameter is NULL
     43  * @return     M4ERR_ALLOC: there is no more memory available
     44  * @return     M4ERR_NOT_IMPLEMENTED: the URL does not match with the supported
     45  *             file
     46  * @return     M4ERR_FILE_NOT_FOUND: the file cannot be found
     47  * @return     M4ERR_FILE_LOCKED: the file is locked by an other
     48  *             application/process
     49  * @return     M4ERR_FILE_BAD_MODE_ACCESS: the file mode access is not correct
     50  ************************************************************************
     51 */
     52 M4OSA_ERR M4OSA_fileWriteOpen(M4OSA_Context* pContext, M4OSA_Void* pUrl,
     53                               M4OSA_UInt32 fileModeAccess)
     54 {
     55     M4OSA_TRACE1_3("M4OSA_fileWriteOpen : pC = 0x%p  fd = 0x%p  mode = %d",
     56                                                 pContext, pUrl, fileModeAccess);
     57 
     58     return M4OSA_fileCommonOpen(M4OSA_FILE_WRITER, pContext, pUrl,
     59                                 fileModeAccess);
     60 }
     61 
     62 
     63 /**
     64  ************************************************************************
     65  * @brief      This function writes the 'size' bytes stored at 'data' memory
     66  *             in the file selected by its context.
     67  * @note       The caller is responsible for allocating/de-allocating the
     68  *             memory for 'data' parameter.
     69  * @note       Moreover the data pointer must be allocated to store at least
     70  *             'size' bytes.
     71  * @param      pContext: (IN/OUT) Context of the core file reader
     72  * @param      buffer: (IN) Data pointer of the write data
     73  * @param      size: (IN) Size of the data to write (in bytes)
     74  * @return     M4NO_ERROR: there is no error
     75  * @return     M4ERR_PARAMETER: at least one parameter is NULL
     76  * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
     77  * @return     M4ERR_ALLOC: there is no more memory available
     78  ************************************************************************
     79 */
     80 M4OSA_ERR M4OSA_fileWriteData(M4OSA_Context pContext, M4OSA_MemAddr8 data,
     81                               M4OSA_UInt32 uiSize)
     82 {
     83     M4OSA_FileContext* pFileContext = pContext;
     84     M4OSA_ERR err;
     85     M4OSA_UInt32 uiSizeWrite;
     86 
     87     M4OSA_TRACE2_2("M4OSA_fileWriteData : data = 0x%p  size = %lu", data,
     88                                                                         uiSize);
     89 
     90     M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
     91                                  "M4OSA_fileWriteData: pContext is M4OSA_NULL");
     92     M4OSA_DEBUG_IF2(M4OSA_NULL == data, M4ERR_PARAMETER,
     93                                      "M4OSA_fileWriteData: data is M4OSA_NULL");
     94     M4OSA_DEBUG_IF2(0 == uiSize, M4ERR_PARAMETER,
     95                                             "M4OSA_fileWriteData: uiSize is 0");
     96 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
     97     M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context,
     98                                   M4ERR_BAD_CONTEXT,
     99                                   "M4OSA_fileWriteData: semaphore_context is M4OSA_NULL");
    100 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    101 
    102     if (M4OSA_kDescRWAccess == pFileContext->m_DescrModeAccess)
    103     {
    104         M4OSA_UInt32    WriteSize;
    105         err = M4NO_ERROR;
    106         WriteSize = fwrite((void *)data,1, uiSize, pFileContext->file_desc);
    107         if(WriteSize != uiSize)
    108         {
    109             /* converts the error to PSW format*/
    110             err = ((M4OSA_UInt32)(M4_ERR)<<30)+(((M4OSA_FILE_WRITER)&0x003FFF)<<16)+(M4OSA_Int16)(WriteSize);
    111             M4OSA_TRACE1_1("M4OSA_FileWriteData error:%x",err);
    112         }
    113         fflush(pFileContext->file_desc);
    114 
    115         pFileContext->write_position = pFileContext->write_position + WriteSize;
    116 
    117         /* Update the file size */
    118         if(pFileContext->write_position > pFileContext->file_size)
    119         {
    120             pFileContext->file_size = pFileContext->write_position;
    121         }
    122         return err;
    123     }
    124 
    125 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    126     M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
    127 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    128 
    129     if(pFileContext->current_seek != SeekWrite)
    130     {
    131         /* fseek to the last read position */
    132         err = M4OSA_fileCommonSeek(pContext, M4OSA_kFileSeekBeginning,
    133             &(pFileContext->write_position));
    134 
    135         if(M4OSA_ERR_IS_ERROR(err))
    136         {
    137 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    138             M4OSA_semaphorePost(pFileContext->semaphore_context);
    139 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    140             M4OSA_DEBUG(err, "M4OSA_fileWriteData: M4OSA_fileCommonSeek");
    141             return err;
    142         }
    143 
    144         pFileContext->current_seek = SeekWrite;
    145     }
    146 
    147     /* Write data */
    148     uiSizeWrite = fwrite(data, sizeof(M4OSA_Char), uiSize, pFileContext->file_desc);
    149 
    150     if(uiSizeWrite == (M4OSA_UInt32)-1)
    151     {
    152 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    153         M4OSA_semaphorePost(pFileContext->semaphore_context);
    154 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    155 
    156         /* An error occured */
    157 
    158         M4OSA_DEBUG(M4ERR_BAD_CONTEXT, "M4OSA_fileWriteData: fwrite failed");
    159         return M4ERR_BAD_CONTEXT;
    160     }
    161 
    162     pFileContext->write_position = pFileContext->write_position + uiSizeWrite;
    163 
    164     /* Update the file size */
    165     if(pFileContext->write_position > pFileContext->file_size)
    166     {
    167         pFileContext->file_size = pFileContext->write_position;
    168     }
    169 
    170     if((M4OSA_UInt32)uiSizeWrite < uiSize)
    171     {
    172 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    173         M4OSA_semaphorePost(pFileContext->semaphore_context);
    174 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    175 
    176         M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_fileWriteData");
    177         return M4ERR_ALLOC;
    178     }
    179 
    180 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    181     M4OSA_semaphorePost(pFileContext->semaphore_context);
    182 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    183 
    184     return M4NO_ERROR;
    185 }
    186 
    187 
    188 /**
    189  ************************************************************************
    190  * @brief      This function seeks at the provided position in the core file
    191  *             writer (selected by its 'context'). The position is related to
    192  *             the seekMode parameter it can be either from the beginning,
    193  *             from the end or from the current postion. To support large file
    194  *             access (more than 2GBytes), the position is provided on a 64
    195  *             bits.
    196  * @note       If this function returns an error the current position pointer
    197  *             in the file must not change. Else the current position pointer
    198  *             must be updated.
    199  * @param      pContext: (IN/OUT) Context of the core file reader
    200  * @param      seekMode: (IN) Seek access mode
    201  * @param      position: (IN/OUT) Position in the file
    202  * @return     M4NO_ERROR: there is no error
    203  * @return     M4ERR_PARAMETER: at least one parameter is NULL
    204  * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
    205  * @return     M4ERR_ALLOC: there is no more memory available
    206  * @return     M4ERR_FILE_INVALID_POSITION: the position cannot be reached
    207  ************************************************************************
    208                               */
    209 M4OSA_ERR M4OSA_fileWriteSeek(M4OSA_Context pContext, M4OSA_FileSeekAccessMode seekMode,
    210                               M4OSA_FilePosition* pPosition)
    211 {
    212     M4OSA_FileContext* pFileContext = (M4OSA_FileContext*)pContext;
    213     M4OSA_ERR err;
    214 
    215     M4OSA_TRACE2_2("M4OSA_fileWriteSeek : mode = %d  pos = %lu",
    216                         seekMode, (M4OSA_NULL != pPosition) ? (*pPosition) : 0);
    217 
    218     M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
    219                                  "M4OSA_fileWriteSeek: pContext is M4OSA_NULL");
    220     M4OSA_DEBUG_IF2(0 == seekMode, M4ERR_PARAMETER,
    221                                           "M4OSA_fileWriteSeek: seemMode is 0");
    222     M4OSA_DEBUG_IF2(M4OSA_NULL == pPosition, M4ERR_PARAMETER,
    223                                 "M4OSA_fileWriteSeek: pPosition is M4OSA_NULL");
    224 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    225     M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context, M4ERR_BAD_CONTEXT,
    226                         "M4OSA_fileWriteSeek: semaphore_context is M4OSA_NULL");
    227 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    228 
    229     if (M4OSA_kDescRWAccess == pFileContext->m_DescrModeAccess) /* read write */
    230     {
    231          M4OSA_UInt32    SeekModeOption;
    232         /*The position for the seek mode between the SHP and the OSAl part are different */
    233         if (M4OSA_kFileSeekBeginning == seekMode)
    234         {
    235             SeekModeOption = SEEK_SET;
    236         }
    237         else if (M4OSA_kFileSeekEnd == seekMode)
    238         {
    239             SeekModeOption = SEEK_END;
    240         }
    241         else if (M4OSA_kFileSeekCurrent == seekMode)
    242         {
    243             SeekModeOption = SEEK_CUR;
    244         }
    245         else
    246         {
    247             M4OSA_TRACE1_0("M4OSA_fileWriteSeek: END WITH ERROR !!! (CONVERION ERROR FOR THE SEEK MODE) ");
    248             return M4ERR_PARAMETER;
    249         }
    250 
    251         /**
    252          * Go to the desired position */
    253         err = fseek(pFileContext->file_desc,*pPosition,SeekModeOption);
    254         if(err != 0)
    255         {
    256             /* converts the error to PSW format*/
    257             err=((M4OSA_UInt32)(M4_ERR)<<30)+(((M4OSA_FILE_WRITER)&0x003FFF)<<16)+(M4OSA_Int16)(err);
    258             M4OSA_TRACE1_1("M4OSA_FileWriteSeek error:%x",err);
    259         }
    260         else
    261         {
    262             return M4NO_ERROR;
    263         }
    264 
    265         return err;
    266     }
    267 
    268 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    269     M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
    270 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    271 
    272     err = M4OSA_fileCommonSeek(pContext, seekMode, pPosition);
    273 
    274     if(M4OSA_ERR_IS_ERROR(err))
    275     {
    276         M4OSA_DEBUG(err, "M4OSA_fileWriteSeek: M4OSA_fileCommonSeek");
    277 
    278 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    279         M4OSA_semaphorePost(pFileContext->semaphore_context);
    280 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    281 
    282         return err;
    283     }
    284 
    285     pFileContext->write_position = *pPosition;
    286 
    287     pFileContext->current_seek = SeekWrite;
    288 
    289 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    290     M4OSA_semaphorePost(pFileContext->semaphore_context);
    291 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    292 
    293     return M4NO_ERROR;
    294 }
    295 
    296 
    297 /**
    298  ************************************************************************
    299  * @brief      This function asks the core file writer to close the file
    300  *             (associated to the context).
    301  * @note       The context of the core file writer is freed.
    302  * @param      pContext: (IN/OUT) Context of the core file writer
    303  * @return     M4NO_ERROR: there is no error
    304  * @return     M4ERR_PARAMETER: at least one parameter is NULL
    305  * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
    306  * @return     M4ERR_ALLOC: there is no more memory available
    307 ************************************************************************
    308 */
    309 
    310 M4OSA_ERR M4OSA_fileWriteClose(M4OSA_Context pContext)
    311 {
    312     M4OSA_FileContext* pFileContext = (M4OSA_FileContext*)pContext;
    313 
    314     M4OSA_TRACE1_1("M4OSA_fileWriteClose : pC = 0x%p", pContext);
    315 
    316     M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
    317                                 "M4OSA_fileWriteClose: pContext is M4OSA_NULL");
    318 
    319     return M4OSA_fileCommonClose(M4OSA_FILE_WRITER, pContext);
    320 }
    321 
    322 
    323 /**
    324  ************************************************************************
    325  * @brief      This function flushes the stream associated to the context.
    326  * @param      pContext: (IN/OUT) Context of the core file writer
    327  * @return     M4NO_ERROR: there is no error
    328  * @return     M4ERR_PARAMETER: at least one parameter is NULL
    329  * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
    330  ************************************************************************
    331 */
    332 M4OSA_ERR M4OSA_fileWriteFlush(M4OSA_Context pContext)
    333 {
    334     M4OSA_FileContext* pFileContext = pContext;
    335     M4OSA_ERR    err = M4NO_ERROR;
    336 
    337     M4OSA_TRACE2_1("M4OSA_fileWriteFlush : pC = 0x%p", pContext);
    338 
    339     M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
    340                                 "M4OSA_fileWriteFlush: pcontext is M4OSA_NULL");
    341 
    342 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    343     M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context, M4ERR_BAD_CONTEXT,
    344                        "M4OSA_fileWriteFlush: semaphore_context is M4OSA_NULL");
    345 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    346 
    347 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    348     M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
    349 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    350 
    351     if (fflush(pFileContext->file_desc) != 0)
    352     {
    353         err = M4ERR_BAD_CONTEXT;
    354     }
    355 
    356 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    357     M4OSA_semaphorePost(pFileContext->semaphore_context);
    358 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    359 
    360     return err;
    361 }
    362 
    363 
    364 /**
    365  ************************************************************************
    366  * @brief      This function asks the core file writer to return the value
    367  *             associated with the optionID.
    368  *             The caller is responsible for allocating/de-allocating the
    369  *             memory of the value field.
    370  * @note       'value' must be cast according to the type related to the
    371  *             optionID
    372  *             As the caller is responsible for allocating/de-allocating the
    373  *             'value' field, the callee must copy this field
    374  *             to its internal variable.
    375  * @param      pContext: (IN/OUT) Context of the core file writer
    376  * @param      optionID: (IN) ID of the option
    377  * @param      value: (OUT) Value of the option
    378  * @return     M4NO_ERROR: there is no error
    379  * @return     M4ERR_PARAMETER: at least one parameter is NULL
    380  * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
    381  * @return     M4ERR_BAD_OPTION_ID: the optionID is not a valid one
    382  * @return     M4ERR_WRITE_ONLY: this option is a write only one
    383  * @return     M4ERR_NOT_IMPLEMENTED: this option is not implemented
    384 ************************************************************************
    385 */
    386 
    387 M4OSA_ERR M4OSA_fileWriteGetOption(M4OSA_Context pContext, M4OSA_OptionID optionID,
    388                                    M4OSA_DataOption* pOptionValue)
    389 {
    390     M4OSA_FileContext* pFileContext = pContext;
    391 
    392     M4OSA_TRACE2_1("M4OSA_fileWriteGetOption : option = 0x%x", optionID);
    393 
    394     M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
    395                             "M4OSA_fileWriteGetOption: pContext is M4OSA_NULL");
    396     M4OSA_DEBUG_IF2(optionID == 0, M4ERR_PARAMETER, "M4OSA_fileWriteGetOption");
    397     M4OSA_DEBUG_IF2(M4OSA_NULL == pOptionValue, M4ERR_PARAMETER,
    398                          "M4OSA_fileWriteGetOption: pOtionValue is M4OSA_NULL");
    399 
    400     M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_COREID(optionID, M4OSA_FILE_WRITER),
    401                                M4ERR_BAD_OPTION_ID, "M4OSA_fileWriteGetOption");
    402     M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_READABLE(optionID), M4ERR_WRITE_ONLY,
    403                                                     "M4OSA_fileWriteGetOption");
    404 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    405     M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context, M4ERR_BAD_CONTEXT,
    406                    "M4OSA_fileWriteGetOption: semaphore_context is M4OSA_NULL");
    407 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    408 
    409     switch(optionID)
    410     {
    411 #if(M4OSA_OPTIONID_FILE_WRITE_GET_FILE_POSITION == M4OSA_TRUE)
    412     case M4OSA_kFileWriteGetFilePosition:
    413         {
    414             M4OSA_FilePosition* position = (M4OSA_FilePosition*)pOptionValue;
    415 
    416 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    417             M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
    418 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    419 
    420             *position = pFileContext->write_position;
    421 
    422 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    423             M4OSA_semaphorePost(pFileContext->semaphore_context);
    424 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    425 
    426             return M4NO_ERROR;
    427         }
    428 #endif /*M4OSA_OPTIONID_FILE_WRITE_GET_FILE_POSITION*/
    429 
    430 #if(M4OSA_OPTIONID_FILE_WRITE_GET_FILE_SIZE == M4OSA_TRUE)
    431     case M4OSA_kFileWriteGetFileSize:
    432         {
    433             M4OSA_FilePosition* position = (M4OSA_FilePosition*)pOptionValue;
    434 
    435             if(M4OSA_kDescRWAccess == pFileContext->m_DescrModeAccess)
    436             {
    437                 M4OSA_Int32 iSavePos    = 0;
    438                 M4OSA_Int32 iSize        = 0;
    439 
    440                 iSavePos = ftell(pFileContext->file_desc);            /*1- Check the first position */
    441                 fseek(pFileContext->file_desc, 0, SEEK_END);        /*2- Go to the end of the file */
    442                 *position = ftell(pFileContext->file_desc);            /*3- Check the file size*/
    443                 fseek(pFileContext->file_desc, iSavePos, SEEK_SET);    /*4- go to the first position*/
    444                 return M4NO_ERROR;
    445             }
    446 
    447 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    448             M4OSA_semaphoreWait(pFileContext->semaphore_context, M4OSA_WAIT_FOREVER);
    449 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    450 
    451             *position = pFileContext->file_size;
    452 
    453 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    454             M4OSA_semaphorePost(pFileContext->semaphore_context);
    455 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    456 
    457             return M4NO_ERROR;
    458         }
    459 #endif /*M4OSA_OPTIONID_FILE_WRITE_GET_FILE_SIZE*/
    460 
    461 #if(M4OSA_OPTIONID_FILE_WRITE_GET_URL == M4OSA_TRUE)
    462     case M4OSA_kFileWriteGetURL:
    463         {
    464             return M4OSA_fileCommonGetURL (pContext, (M4OSA_Char**)pOptionValue);
    465         }
    466 #endif /*M4OSA_OPTIONID_FILE_WRITE_GET_URL*/
    467 
    468 #if(M4OSA_OPTIONID_FILE_WRITE_GET_FILE_ATTRIBUTE == M4OSA_TRUE)
    469     case M4OSA_kFileWriteGetAttribute:
    470         {
    471             return M4OSA_fileCommonGetAttribute(pContext,
    472                 (M4OSA_FileAttribute*)pOptionValue);
    473         }
    474 #endif /*M4OSA_OPTIONID_FILE_WRITE_GET_FILE_ATTRIBUTE*/
    475 
    476 #if(M4OSA_OPTIONID_FILE_WRITE_GET_READER_CONTEXT == M4OSA_TRUE)
    477     case M4OSA_kFileWriteGetReaderContext:
    478         {
    479             M4OSA_FileModeAccess access = pFileContext->access_mode;
    480 
    481             M4OSA_DEBUG_IF1(!(access & M4OSA_kFileRead), M4ERR_BAD_CONTEXT,
    482                 "M4OSA_fileWriteGetOption: M4OSA_kFileRead");
    483 
    484             M4OSA_DEBUG_IF1(!(access & M4OSA_kFileWrite), M4ERR_BAD_CONTEXT,
    485                 "M4OSA_fileWriteGetOption: M4OSA_kFileWrite");
    486 
    487             pFileContext->coreID_read = M4OSA_FILE_READER;
    488 
    489             *pOptionValue = pContext;
    490 
    491             return M4NO_ERROR;
    492         }
    493 #endif /*M4OSA_OPTIONID_FILE_WRITE_GET_READER_CONTEXT*/
    494 
    495     case M4OSA_kFileWriteLockMode:
    496         {
    497             *(M4OSA_UInt32*)pOptionValue = pFileContext->m_uiLockMode;
    498             return M4NO_ERROR;
    499         }
    500 
    501     }
    502 
    503     M4OSA_DEBUG(M4ERR_NOT_IMPLEMENTED, "M4OSA_fileWriteGetOption");
    504 
    505     return M4ERR_NOT_IMPLEMENTED;
    506 }
    507 
    508 
    509 /**
    510 ************************************************************************
    511 * @brief      This function asks the core file writer to set the value
    512 *             associated with the optionID.
    513 *             The caller is responsible for allocating/de-allocating the
    514 *             memory of the value field.
    515 * @note       As the caller is responsible for allocating/de-allocating the
    516 *             'value' field, the callee must copy this field to its internal
    517 *             variable.
    518 * @param      pContext: (IN/OUT) Context of the core file writer
    519 * @param      optionID: (IN) ID of the option
    520 * @param      value: (IN) Value of the option
    521 * @return     M4NO_ERROR: there is no error
    522 * @return     M4ERR_PARAMETER: at least one parameter is NULL
    523 * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
    524 * @return     M4ERR_BAD_OPTION_ID: the optionID is not a valid one
    525 * @return     M4ERR_READ_ONLY: this option is a read only one
    526 * @return     M4ERR_NOT_IMPLEMENTED: this option is not implemented
    527 ************************************************************************
    528 */
    529 
    530 M4OSA_ERR M4OSA_fileWriteSetOption(M4OSA_Context pContext,
    531                                    M4OSA_OptionID optionID,
    532                                    M4OSA_DataOption optionValue)
    533 {
    534     M4OSA_FileContext* pFileContext = pContext;
    535 
    536     M4OSA_TRACE2_1("M4OSA_fileWriteSetOption : option = 0x%x", optionID);
    537 
    538     M4OSA_DEBUG_IF2(M4OSA_NULL == pContext, M4ERR_PARAMETER,
    539                                                     "M4OSA_fileWriteSetOption");
    540 
    541     M4OSA_DEBUG_IF2(0 == optionID, M4ERR_PARAMETER, "M4OSA_fileWriteSetOption");
    542 
    543     M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_COREID(optionID, M4OSA_FILE_WRITER),
    544         M4ERR_BAD_OPTION_ID, "M4OSA_fileWriteSetOption");
    545 
    546     M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_WRITABLE(optionID), M4ERR_READ_ONLY,
    547                                                      "M4OSA_fileReadSetOption");
    548 
    549 #ifdef M4OSA_FILE_BLOCK_WITH_SEMAPHORE
    550     M4OSA_DEBUG_IF2(M4OSA_NULL == pFileContext->semaphore_context, M4ERR_BAD_CONTEXT,
    551                    "M4OSA_fileWriteSetOption: semaphore_context is M4OSA_NULL");
    552 #endif /* M4OSA_FILE_BLOCK_WITH_SEMAPHORE */
    553 
    554     switch(optionID)
    555     {
    556         case M4OSA_kFileWriteLockMode:
    557         {
    558             pFileContext->m_uiLockMode = (M4OSA_UInt32)*(M4OSA_UInt32*)optionValue;
    559             return M4NO_ERROR;
    560         }
    561 
    562         case M4OSA_kFileWriteDescMode:
    563         {
    564             pFileContext->m_DescrModeAccess = (M4OSA_Int32)*(M4OSA_Int32*)optionValue;
    565             return M4NO_ERROR;
    566         }
    567 
    568         default:
    569             return M4ERR_NOT_IMPLEMENTED;
    570     }
    571 
    572     return M4ERR_NOT_IMPLEMENTED;
    573 }
    574 
    575