FreeCalypso > hg > tcs211-pirelli
view g23m/condat/ms/src/atb/ATBPbFS.c @ 18:a0c4fd5c7430
pdt_2092 builds for Openmoko memory configuration
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Sun, 06 Sep 2015 03:05:37 +0000 |
parents | 509db1a7b7b8 |
children |
line wrap: on
line source
#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; }