FreeCalypso > hg > tcs211-l1-reconst
diff g23m/condat/ms/src/atb/ATBPbFS.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/atb/ATBPbFS.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,723 @@ +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" + +#include <stdio.h> +#include <string.h> + +#include "mfw_mfw.h" +#include "mfw_sys.h" + +#include "cus_aci.h" +#include "prim.h" +#include "pcm.h" + +/* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/ +#ifndef NEPTUNE_BOARD +/* END ADD: Sumit : Req ID: : 31-Mar-2005*/ +#include "ffs/ffs.h" +/* BEGIN ADD: Sumit : Req ID: : 31-Mar-2005*/ +#else +#include "ffs.h" +#endif +/* END ADD: Sumit : Req ID: : 31-Mar-2005*/ + +#include "ffs_coat.h" +#include "ATBPb.h" +#include "ATBPbFS.h" + +T_PB_FSDATA fsdata; + +UBYTE empty_rec[2] = {0xFF,0}; + +EXTERN T_HANDLE aci_handle; +#define hCommMMI aci_handle + +/******************************************************************************* + + $Function: FS_pb_GetPhonebook + + $Description: Checks to see if FFS phonebook is present, and if it is selected. If it + is not present, creates info file with default parameters. + + $Returns: PB_OK Action completed OK. + PB_EXCT Action currently executing, callback awaited. + PB_ERROR Error. + + $Arguments: phonebook_id The phonebook identifier + current_type Place to store type of phonebook selected. + +*******************************************************************************/ + +PB_RET FS_pb_GetPhonebook(SHORT phonebook_id, T_PB_TYPE *current_type) +{ + T_PB_FSINFO info; + + tracefunction("FS_pb_GetPhonebook"); + + fsdata.info_file = FFS_open("/mmi/pbinfo", FFS_O_RDWR); + + if (fsdata.info_file<0) + { + /* File does not exist. Attempt to create it. */ + + fsdata.info_file = FFS_open("/mmi/pbinfo", FFS_O_RDWR | FFS_O_CREATE); + if (fsdata.info_file<0) + { + trace("** Cannot create file - flash phonebook not available **"); + return PB_FILEWRITEFAIL; + } + + /* Have opened file. Set phonebook to SIM and store setting. */ + + info.type_selected = PB_TYPE_SIM; + info.records_max = PB_RECORDS_MAX; + info.alpha_max = PB_ALPHATAG_MAX; + info.number_max = PB_NUMBER_MAX; + info.ext_max = PB_EXT_MAX; + + FFS_write(fsdata.info_file, (void *)&info, sizeof(T_PB_FSINFO)); + FFS_close(fsdata.info_file); + } + else + { + FFS_read(fsdata.info_file, (void *)&info, sizeof(T_PB_FSINFO)); + FFS_close(fsdata.info_file); + } + + /* Check to make sure parameters are in acceptable range */ + + if (info.records_max<0 || info.records_max>PB_RECORDS_UPPER_LIMIT) + info.records_max = PB_RECORDS_UPPER_LIMIT; + + if (info.alpha_max<0 || info.alpha_max>PB_ALPHATAG_UPPER_LIMIT) + info.alpha_max = PB_ALPHATAG_UPPER_LIMIT; + + if (info.number_max<0 || info.number_max>PB_NUMBER_UPPER_LIMIT) + info.number_max = PB_NUMBER_UPPER_LIMIT; + + if (info.ext_max<0 || info.ext_max>PB_EXT_UPPER_LIMIT) + info.ext_max = PB_EXT_UPPER_LIMIT; + + fsdata.records_max = info.records_max; + fsdata.alpha_max = info.alpha_max; + fsdata.number_max = info.number_max; + fsdata.ext_max = info.ext_max; + fsdata.record_size = info.alpha_max*sizeof(USHORT)+info.number_max/2+info.ext_max+sizeof(UBYTE); + + *current_type = info.type_selected; + + return PB_OK; +} + + +/******************************************************************************* + + $Function: FS_pb_SetPhonebook + + $Description: Select a phonebook + + $Returns: PB_OK Action completed OK. + PB_EXCT Action currently executing, callback awaited. + PB_ERROR Error. + + $Arguments: phonebook_id The phonebook identifier + current_type New value for selected phonebook + +*******************************************************************************/ + +PB_RET FS_pb_SetPhonebook(SHORT phonebook_id, T_PB_TYPE current_type) +{ + T_PB_FSINFO info; + T_FFS_SIZE size; + T_FFS_RET fsret; + + tracefunction("FS_pb_SetPhonebook"); + + /* Have opened file. Read in current settings. */ + + size = FFS_file_read("/mmi/pbinfo", (void *)&info, sizeof(T_PB_FSINFO)); + + if (size<=0) + { + return PB_FILEREADFAIL; + } + + info.type_selected = current_type; + + fsret = FFS_file_write("/mmi/pbinfo", (void *)&info, sizeof(T_PB_FSINFO), FFS_O_TRUNC); + + if (fsret!=EFFS_OK) + return PB_FILEWRITEFAIL; + + return PB_OK; +} + + +/******************************************************************************* + + $Function: FS_pb_Initialise + + $Description: Creates the necessary phonebook file(s) if they do not already exist. + + $Returns: PB_OK Action completed OK. + PB_EXCT Action currently executing, callback awaited. + PB_FILEREADFAIL File read encountered an error + PB_FILEWRITEFAIL File write encountered an error + + + $Arguments: phonebook_id The phonebook identifier + type Type of phonebook. + records_max Indicates the maximum number of entries the + phonebook can hold. + alpha_max Maximum size of unicode alpha tag in characters + number_max Maximum size of phone number in characters + ext_max Maximum size of extended data in bytes + +*******************************************************************************/ + +PB_RET FS_pb_Initialise(SHORT phonebook_id, T_PB_TYPE type, SHORT records_max, + SHORT alpha_max, SHORT number_max, SHORT ext_max) +{ + SHORT phys_index; + USHORT charIndex; + char filename[30]; + SHORT fileIndex; + SHORT recIndex; + UBYTE newfile; + T_FFS_RET retvalue; + T_FFS_SIZE sizevalue; + UBYTE *blankRec; + + tracefunction("FS_pb_Initialise"); + + fsdata.file = NULL; + fsdata.fileID = -1; + + /* Create blank record */ + + blankRec = (UBYTE *)mfwAlloc(fsdata.record_size); + memset(blankRec, 0xFF, fsdata.record_size); + + /* Create files */ + + trace("Creating files..."); + + for (phys_index = 0; phys_index<records_max; phys_index++) + { + FS_file_GetIndex(phys_index, &fileIndex, &recIndex); + + /* Check if we're starting a new file */ + + if (recIndex == 0 ) + { + if (fileIndex!=0) + { + retvalue = FFS_close(fsdata.file); + fsdata.file = NULL; + fsdata.fileID = -1; + trace_P2("Closing file %d, result %d",fsdata.file, retvalue); + } + + FS_file_GetName(filename, phonebook_id, fileIndex); + + fsdata.file = FFS_open(filename, FFS_O_RDWR); + trace_P2("Try to open file %s, result %d",filename, fsdata.file); + if (fsdata.file<0) + { + fsdata.file = FFS_open(filename, FFS_O_RDWR | FFS_O_CREATE); + fsdata.fileID = fileIndex; + trace_P2("Create file %s, result %d",filename, fsdata.file); + newfile = TRUE; + } + else + newfile = FALSE; + } + + if (newfile) + { + sizevalue = FFS_write(fsdata.file, (void *)blankRec, fsdata.record_size); + trace_P2("Writing record %d, result %d",phys_index, sizevalue); + } + } + + /* Close the last file */ + retvalue = FFS_close(fsdata.file); + trace_P2("Closing last file %d, result %d",fsdata.file, retvalue); + + fsdata.file = NULL; + fsdata.fileID = -1; + + /* Get rid of blank record */ + + mfwFree(blankRec, fsdata.record_size); + +#ifdef BLOCKING + return PB_OK; +#else + return PB_EXCT; +#endif +} + + +/******************************************************************************* + + $Function: FS_pb_ReadRec + + $Description: Reads a record from the physical position index. + + $Returns: PB_OK Action completed OK. + PB_EXCT Action currently executing, callback awaited. + PB_FILEREADFAIL File read encountered an error + + $Arguments: phonebook_id The phonebook identifier + phys_index Physical index of the record to read. + record Structure in which to store record data (allocated by + caller). + +*******************************************************************************/ + +PB_RET FS_pb_ReadRec(SHORT phonebook_id, SHORT phys_index, T_PB_RECORD *record) +{ + SHORT charIndex; + UBYTE *recordstore; + SHORT fileIndex; + SHORT recIndex; + T_FFS_SIZE bytesRead; + T_FFS_RET ffsret; + USHORT *unicode; + + tracefunction("FS_pb_ReadRec"); + + /* Make sure record exists */ + + if (phys_index>=fsdata.records_max) + return PB_RECDOESNOTEXIST; + + /* Open the file */ + + recIndex = FS_file_OpenForRec(phonebook_id, phys_index); + + /* Find the record in the file */ + + FFS_seek(fsdata.file, fsdata.record_size*recIndex, FFS_SEEK_SET); + + /* Read the record */ + + recordstore = (UBYTE *)mfwAlloc(fsdata.record_size); + + bytesRead = FFS_read(fsdata.file, (void *)recordstore, fsdata.record_size); + + /* Copy alpha tag */ + + unicode = (USHORT *)recordstore; + charIndex = 0; + + do + { + record->alpha.data[charIndex] = unicode[charIndex]; + if (unicode[charIndex]!=0) + charIndex++; + } + while (unicode[charIndex]!=0 && unicode[charIndex]!=0xFFFF && charIndex<fsdata.alpha_max); + + + record->alpha.length = charIndex; + + /* Copy number */ + + memcpy((UBYTE *)record->number, (UBYTE *)&recordstore[fsdata.alpha_max*sizeof(USHORT)], fsdata.number_max/2); + + /* Copy ton/npi */ + + record->ton_npi = recordstore[fsdata.alpha_max*sizeof(USHORT)+fsdata.number_max/2]; + + mfwFree(recordstore, fsdata.record_size); + +#ifdef BLOCKING + return PB_OK; +#else + return PB_EXCT; +#endif + +} + + +/******************************************************************************* + + $Function: FS_pb_WriteRec + + $Description: Writes a record to the physical position index. + + $Returns: PB_OK Action completed OK. + PB_EXCT Action currently executing, callback awaited. + PB_FILEWRITEFAIL File write encountered an error + + $Arguments: phonebook_id The phonebook identifier + phys_index Physical index of the record to write. + record Record data to write to phonebook (allocated by caller). + +*******************************************************************************/ + + +PB_RET FS_pb_WriteRec(SHORT phonebook_id, SHORT phys_index, T_PB_RECORD *record) +{ + SHORT charIndex; + UBYTE *recordstore; + SHORT recIndex; + USHORT *unicode; + T_FFS_SIZE size; + + /* Make sure record exists */ + + if (phys_index>=fsdata.records_max) + return PB_RECDOESNOTEXIST; + + /* Copy alpha tag */ + + recordstore = (UBYTE *)mfwAlloc(fsdata.record_size); + + unicode = (USHORT *)recordstore; + + for (charIndex=0; charIndex<record->alpha.length; charIndex++) + { + unicode[charIndex] = record->alpha.data[charIndex]; + } + + unicode[charIndex] = 0; + + /* Copy number */ + + memcpy(&recordstore[fsdata.alpha_max*sizeof(USHORT)], record->number, fsdata.number_max/2); + + /* Copy ton/npi */ + + recordstore[fsdata.alpha_max*sizeof(USHORT)+fsdata.number_max/2] = record->ton_npi; + + /* Open the file */ + + recIndex = FS_file_OpenForRec(phonebook_id, phys_index); + + /* Find the record in the file */ + + FFS_seek(fsdata.file, fsdata.record_size*recIndex, FFS_SEEK_SET); + + /* Write record */ + + size = FFS_write(fsdata.file, (void *)recordstore, fsdata.record_size); + + mfwFree(recordstore, fsdata.record_size); + +#ifdef BLOCKING + return PB_OK; +#else + return PB_EXCT; +#endif + +} + + +/******************************************************************************* + + $Function: FS_pb_DeleteRec + + $Description: Deletes a record at a physical position index. + + $Returns: PB_OK Action completed OK. + PB_EXCT Action currently executing, callback awaited. + PB_FILEWRITEFAIL File write encountered an error + + $Arguments: phonebook_id The phonebook identifier + phys_index Physical index of the record to delete. + +*******************************************************************************/ + +PB_RET FS_pb_DeleteRec(SHORT phonebook_id, SHORT phys_index) +{ + UBYTE *recordstore; + char filename[30]; + SHORT fileIndex; + SHORT recIndex; + T_FFS_RET ffsret; + T_FFS_SIZE size; + + /* Make sure record exists */ + + if (phys_index>=fsdata.records_max) + return PB_RECDOESNOTEXIST; + + /* Allocate null buffer */ + + recordstore = (UBYTE *)mfwAlloc(fsdata.record_size); + memset(recordstore, 0xFF, fsdata.record_size); + + /* Open the file */ + + recIndex = FS_file_OpenForRec(phonebook_id, phys_index); + + /* Find the record in the file */ + + FFS_seek(fsdata.file, fsdata.record_size*recIndex, FFS_SEEK_SET); + + /* Write record */ + + size = FFS_write(fsdata.file, (void *)recordstore, fsdata.record_size); + + mfwFree(recordstore, fsdata.record_size); + +#ifdef BLOCKING + return PB_OK; +#else + return PB_EXCT; +#endif +} + + +/******************************************************************************* + + $Function: FS_pb_Finished + + $Description: Operation is over; close the last file. + + $Returns: PB_OK Action completed OK. + PB_ERROR Error. + + $Arguments: phonebook_id The phonebook identifier + + +*******************************************************************************/ + +PB_RET FS_pb_Finished(SHORT phonebook_id) +{ + T_FFS_RET ret; + + if (fsdata.fileID!=-1 && fsdata.file) + { + ret = FFS_close(fsdata.file); + } + + fsdata.file = NULL; + fsdata.fileID = -1; + + return PB_OK; +} + + +/******************************************************************************* + + $Function: FS_pb_ReadTables + + $Description: Read in index table files + + $Returns: PB_OK Action completed OK. + PB_ERROR Error. + + $Arguments: phonebook_id The phonebook identifier + records_used Number of entries in phonebook + name_table Table of entries ordered by name + number_table Table of entries ordered by number + +*******************************************************************************/ + +PB_RET FS_pb_ReadTables(SHORT phonebook_id, SHORT *records_used, SHORT *name_table, SHORT *number_table) +{ + T_FFS_RET ret; + T_FFS_FD file; + T_FFS_SIZE size; + + UBYTE writing; + + tracefunction("FS_pb_ReadTables"); + + /* Check if file wrote OK */ + + writing = 2; /* Dummy value to check for errors */ + size = FFS_file_read("/mmi/pbverify", (void *)&writing, sizeof(UBYTE)); + trace_P1("Try to read file /mmi/pbverify, size = %d", size); + + if (size<0) + { + ret = FFS_file_write("/mmi/pbverify", (void *)&writing, sizeof(UBYTE), FFS_O_CREATE); + trace_P1("Try to create file /mmi/pbverify, ret = %d", ret); + } + + trace_P1("Value of writing = %d", writing); + + if (writing==TRUE) /* Operation was aborted while reading tables file */ + { + trace("***ERROR - tables not written properly"); + return PB_FILEREADFAIL; + } + + /* Read in tables file */ + + file = FFS_open("/mmi/pbtables", FFS_O_RDWR); + trace_P1("Try to open file /mmi/pbtables, result %d", file); + + if (file<0) + { + return PB_FILEREADFAIL; + } + + FFS_read(file, (void *)records_used, sizeof(SHORT)); + FFS_read(file, (void *)name_table, fsdata.records_max*sizeof(SHORT)); + FFS_read(file, (void *)number_table, fsdata.records_max*sizeof(SHORT)); + + FFS_close(file); + + return PB_OK; +} + + +/******************************************************************************* + + $Function: FS_pb_WriteTables + + $Description: Update index table files + + $Returns: PB_OK Action completed OK. + PB_FILEWRITEFAIL + + $Arguments: phonebook_id The phonebook identifier + records_used Number of entries in phonebook + name_table Table of entries ordered by name + number_table Table of entries ordered by number + +*******************************************************************************/ + +PB_RET FS_pb_WriteTables(SHORT phonebook_id, SHORT records_used, SHORT *name_table, SHORT *number_table) +{ + T_FFS_RET ret; + T_FFS_FD file; + UBYTE writing; + + tracefunction("FS_pb_WriteTables"); + + /* Indicate that file writing is in progress */ + + writing = TRUE; + ret = FFS_file_write("/mmi/pbverify", (void *)&writing, sizeof(UBYTE), FFS_O_TRUNC); + trace_P1("1. Try to write file /mmi/pbverify, result = %d", ret); + + /* Update tables file */ + + file = FFS_open("/mmi/pbtables", FFS_O_RDWR); + trace_P1("Try to open file /mmi/pbtables, result %d", file); + + if (file<0) + { + file = FFS_open("/mmi/pbtables", FFS_O_RDWR | FFS_O_CREATE); + trace_P1("Create file /mmi/pbtables, result %d", file); + if (file<0) + { + trace("** Cannot create file - flash phonebook not available **"); + return PB_FILEWRITEFAIL; + } + } + + FFS_write(file, (void *)&records_used, sizeof(SHORT)); + FFS_write(file, (void *)name_table, fsdata.records_max*sizeof(SHORT)); + FFS_write(file, (void *)number_table, fsdata.records_max*sizeof(SHORT)); + + FFS_close(file); + + /* Indicate that file was written OK */ + + writing = FALSE; + ret = FFS_file_write("/mmi/pbverify", (void *)&writing, sizeof(UBYTE), FFS_O_TRUNC); + trace_P1("2. Try to write file /mmi/pbverify, result = %d", ret); + + return PB_OK; +} + + +/******************************************************************************* + + $Function: FS_file_GetIndex + + $Description: For a given physical index, return the file and record number. + + $Returns: None + + $Arguments: phys_index The physical record index + fileIndex Pointer to variable to store file index + recIndex Pointer to variable to store record index + + +*******************************************************************************/ + +void FS_file_GetIndex(SHORT phys_index, SHORT *fileIndex, SHORT *recIndex) +{ + *fileIndex = phys_index/PB_RECS_PER_FILE; + *recIndex = phys_index % PB_RECS_PER_FILE; + return; +} + +/******************************************************************************* + + $Function: FS_file_GetName + + $Description: For a given file index, return the filename. + + $Returns: None + + $Arguments: filename Pointer to string to store the filename + phonebook_id The identifier of the phonebook + fileIndex The index of the file + + +*******************************************************************************/ + +void FS_file_GetName(char *filename, SHORT phonebook_id, SHORT fileIndex) +{ + sprintf(filename, "/mmi/pb%d", fileIndex); + return; +} + +/******************************************************************************* + + $Function: FS_file_OpenForRec + + $Description: Open the appropriate file to access a specific record + + $Returns: None + + $Arguments: phonebook_id The phonebook identifier + phys_index The physical record index + + +*******************************************************************************/ + +SHORT FS_file_OpenForRec(SHORT phonebook_id, SHORT phys_index) +{ + SHORT fileIndex; + SHORT recIndex; + char filename[30]; + T_FFS_RET ffsret; + + /* Open file if it is not already open */ + + FS_file_GetIndex(phys_index, &fileIndex, &recIndex); + + if (fsdata.fileID!=fileIndex || fsdata.file==NULL) + { + /* Close currently open file */ + if (fsdata.file!=NULL) + { + ffsret = FFS_close(fsdata.file); + fsdata.file = NULL; + fsdata.fileID = -1; + } + + FS_file_GetName(filename, phonebook_id, fileIndex); + + fsdata.file = FFS_open(filename, FFS_O_RDWR); + trace_P2("Try to open file %s, result %d",filename, fsdata.file); + fsdata.fileID = fileIndex; + } + + return recIndex; +} +