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


#ifndef M4OSA_FILECOMMON_H
#define M4OSA_FILECOMMON_H

#include "M4OSA_Types.h"
#include "M4OSA_Time.h"
#include "M4OSA_Error.h"
#include "M4OSA_OptionID.h"


typedef M4OSA_Int32 M4OSA_FilePosition;

/** This enum defines the application mode access.
 *  ie, the application uses a file descriptor to read or to write  or
 *  both to read and write at the same time.
 *  This structure is used for MM project only. It enables to read and write to a file
 *  with one descriptor.
 */
typedef enum
{
   M4OSA_kDescNoneAccess    = 0x00,
   M4OSA_kDescReadAccess    = 0x01,    /** The Descriptor reads only from the file */
   M4OSA_kDescWriteAccess    = 0x02,    /** The Descriptor writes only from the file*/
   M4OSA_kDescRWAccess        = 0x03    /** The Descriptor reads and writes from/in the file*/
} M4OSA_DescrModeAccess;


/** This enum defines the file mode access. Both text mode as binary mode
    cannot be set together.*/
typedef enum
{
   /** The file must be accessed in read only mode*/
   M4OSA_kFileRead             = 0x01,
   /** The file must be accessed in write only mode*/
   M4OSA_kFileWrite            = 0x02,
   /** The file must be accessed in append mode (An existing file must
       be available to append data)*/
   M4OSA_kFileAppend           = 0x04,
   /** If the file does not exist, it will be created*/
   M4OSA_kFileCreate           = 0x08,
   /** Data are processed as binary one, there is no data management*/
   M4OSA_kFileIsTextMode       = 0x10
} M4OSA_FileModeAccess;


/** This type is used to store a date.*/
typedef struct
{
   /** Time scale (tick number per second)*/
   M4OSA_UInt32 timeScale;
   /** Date expressed in the time scale*/
   M4OSA_Time   time;
   /** Year of the absolute time (1900, 1970 or 2000)*/
   M4OSA_UInt32 referenceYear;
} M4OSA_Date;


/** This strucure defines the file attributes*/
typedef struct
{
   /** The file mode access*/
   M4OSA_FileModeAccess    modeAccess;
   /** The creation date*/
   M4OSA_Date              creationDate;
   /** The last modification date*/
   M4OSA_Date              modifiedDate;
   /** The last access date (read)*/
   M4OSA_Date              lastAccessDate;
} M4OSA_FileAttribute;



/** This enum defines the seek behavior*/
typedef enum M4OSA_FileSeekAccessMode
{
   /** Relative to the beginning of the file*/
   M4OSA_kFileSeekBeginning            = 0x01,
   /** Relative to the end of the file*/
   M4OSA_kFileSeekEnd                  = 0x02,
   /** Relative to the current file position*/
   M4OSA_kFileSeekCurrent              = 0x03
} M4OSA_FileSeekAccessMode;


/* Error codes */
#define M4ERR_FILE_NOT_FOUND         M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_COMMON, 0x000001)
#define M4ERR_FILE_LOCKED            M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_COMMON, 0x000002)
#define M4ERR_FILE_BAD_MODE_ACCESS   M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_COMMON, 0x000003)
#define M4ERR_FILE_INVALID_POSITION  M4OSA_ERR_CREATE(M4_ERR, M4OSA_FILE_COMMON, 0x000004)


#endif /*M4OSA_FILECOMMON_H*/