line source
/*-----------------------Include Files---------------------------------*/
#define ENTITY_MFW
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#if defined (NEW_FRAME)
#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"
#else
#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#endif
#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif
#ifndef GPRS
#include "ffs/ffs.h"
#undef GPRS /* ffs.h anyhow defines GPRS: has to be undef ifndef GPRS */
#else /* GPRS */
#include "ffs/ffs.h"
#endif /* GPRS */
#ifndef PCM_2_FFS
#include "ffs_coat.h"
#endif
#ifdef SIM_TOOLKIT
//#include "mfw_sat.h"
#endif
#include "message.h"
#include "prim.h"
#include "aci_cmh.h"
#if defined (FAX_AND_DATA)
#include "aci_fd.h"
#endif
#ifdef GPRS
#include "gprs.h"
#endif
#include "dti_conn_mng.h"
#include "phb.h"
#include "psa.h"
#include "cmh.h"
#include "cmh_phb.h"
#include "psa.h"
#include "psa_sim.h"
#include "cus_aci.h"
#include "cmh_mm.h"
#include "cmh_sim.h"
#include "CPHS_mod.h"
/*--------------------- Constant definitions ---------------------------*/
#define MFW_INVALID_SIM_DATA 0xFF
#define MAX_CPHS_ENTRY 4
#define MAX_PCM_MAILBOX_LEN 10
#define NO_ALLOCATED 0
#define FALSE 0
#define TRUE 1
#define LONG_NAME 26
#define SHORT_NAME 10
#define SP_NAME 17
#define NUMERIC_LENGTH 6
#ifdef TI_PS_FFS_PHB
#define PHB_MAX_LEN MAX_PHB_NUM_LEN /* Phonebook number length + '\0' */
#else
//GW-SPR#762- 40 digit phonebook size.
#ifdef PHONEBOOK_EXTENSION
#define PHB_MAX_LEN 41 /* Phonebook number length + '\0' */
#else
#define PHB_MAX_LEN 21 /* Phonebook number length + '\0' */
#endif /* else, #ifdef PHONEBOOK_EXTENSION */
#endif /* else, #ifdef TI_PS_FFS_PHB */
/*--------------------- Types --------------------------------------*/
typedef enum /* numbering plan identifier */
{
CPHS_NPI_UNKNOWN,
CPHS_NPI_ISDN = 1,
CPHS_NPI_DATA = 3,
CPHS_NPI_TELEX = 4,
CPHS_NPI_NATIONAL = 8,
CPHS_NPI_PRIVATE = 9,
CPHS_NPI_M_ERMES = 10,
CPHS_NPI_M_CTS = 11
} T_PHB_NPI;
typedef enum /* type of number */
{
CPHS_TON_UNKNOWN,
CPHS_TON_INTERNATIONAL,
CPHS_TON_NATIONAL,
CPHS_TON_NET_SPECIFIC,
CPHS_TON_DED_ACCESS,
CPHS_TON_ALPHA_NUMERIC,
CPHS_TON_ABBREVIATED,
CPHS_TON_EXTENDED
} T_CPHS_PHB_TON;
typedef enum /* CPHS service */
{
CPHS_CSP = 1, /* customer service profile */
CPHS_SST, /* service string table */
CPHS_MB_NUMBER, /* mailbox numbers */
CHPS_NAME_SHORT, /* operator name shortform */
CHPS_INFO_NUMBERS /* information numbers */
} T_CPHS_SERVICE;
#define CPHS_SERVICE_TABLE 2 /* size of CPHS service table */
#define CPHS_INFO_SIZE 3 /* size of CPHS information field (6F16) */
#define CPHS_ONS_SIZE 20 /* size of operator name string (6F14) - read first 20 bytes only */
#define CPHS_ONSF_SIZE 10 /* size of operator name short form (6F18) */
#define CPHS_MIN_MBN_SIZE 14
#define CPHS_MBS_SIZE 2 /* size of voice message waiting flag (6F11) */
#define CPHS_CFF_SIZE 2 /* size of call forwarding flags (6F13) */
#define CPHS_ALS_SIZE 1 /* size of alternate line service (6F9F) */
#define CPHS_ALSS_SIZE 1 /* size of alternate line service status (6F92) */
#define CPHS_CSP_SIZE 20 /* size of customer service profile (6F15) */
#define CPHS_MIN_INS_SIZE 5
typedef struct {
T_CPHS_OPN opName;
T_CPHS_MAILBOX_NUM_LIST mbNum;
T_CPHS_LINE_IND mbStatus;
T_CPHS_LINE_IND dvStatus;
T_CPHS_ALS_INFO alsStatus;
T_CPHS_ALS_LINE Line1_desc;
T_CPHS_ALS_LINE Line2_desc;
T_CPHS_CSP csProfile;
T_CPHS_INFO_NUM_LIST* numList;
T_CPHS_INFO_NUM_ENTRY* infoEntry;
T_CPHS_ROAMING_IND roaming_ind;
UBYTE mbnData[40]; // it should be allocated dynamically.
UBYTE mbsData[CPHS_MBS_SIZE]; // it should be allocated dynamically.
UBYTE dvData[CPHS_CFF_SIZE]; // it should be allocated dynamically.
// T_CPHS_READ_SIM_ENTRY read_sim_entry;//MC
UBYTE cphsStatus;
UBYTE cphsPhase;
UBYTE cphsServTab[CPHS_SERVICE_TABLE];
UBYTE maxRec;
T_CPHS_MAILBOX_NUM_ENTRY MbnEntry;
T_CPHS_MAILBOX_NUM_ENTRY *vcEntry;
T_CPHS_SIMOP_STATUS simStatus;
UBYTE alsData;
UBYTE idxLevel;
UBYTE startIdx;
UBYTE cphsUpdate ;
ULONG cphsPrevRead;
T_CPHS_CB_FUNC InfoNumberListCB;
T_CPHS_CB_FUNC InfoNumberCB;
T_CPHS_CB_FUNC RefreshCB;
}T_CPHS_CACHED_DATA;
static T_CPHS_CACHED_DATA* cphs_data = NULL;
void Cphs_support_check (void);
UBYTE Cphs_ssc (UBYTE nr, UBYTE * serv_table);
void Cphs_update_info_cnf (SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_read_information(SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_read_csp(SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_read_cff(SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_read_mbs(SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_read_mbn(SHORT table_id);
void Cphs_read_onsf(SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_read_ons(SHORT errCode, UBYTE *data, UBYTE dataLen);
void Cphs_get_csp ();
void Cphs_get_mailbox (void);
void Cphs_read_sim_dat_cb(SHORT table_id);
BOOL Cphs_read_sim_dat(USHORT data_id, UBYTE len, UBYTE max_length);
T_CPHS_RET Cphs_set_divert_status (T_CPHS_FLAG_STATUS line1,
T_CPHS_FLAG_STATUS line2,
T_CPHS_FLAG_STATUS fax,
T_CPHS_FLAG_STATUS data);
T_CPHS_RET Cphs_set_mailbox_status (T_CPHS_FLAG_STATUS line1,
T_CPHS_FLAG_STATUS line2,
T_CPHS_FLAG_STATUS fax,
T_CPHS_FLAG_STATUS data);
void Cphs_operator_name (void);
void Cphs_get_mailbox_status ();
void Cphs_get_divert_status () ;
void Cphs_write_eeprom_mailbox(T_CPHS_MAILBOX_NUM_ENTRY *entry);
void Cphs_read_eeprom_mailbox(void);
void Cphs_build_mbn_data(UBYTE *data, UBYTE len);
void Cphs_req_info_num_read(UBYTE rcd_num, UBYTE dataLen);
void Cphs_get_info_num (UBYTE level, UBYTE startIndex);
void Cphs_read_info_num(SHORT table_id);
void Cphs_read_first_info_num(SHORT table_id);
void Cphs_read_sim_rcd_cb (SHORT table_id);
BOOL Cphs_read_sim_rcd(USHORT data_id, UBYTE rcd_num, UBYTE len);
void Cphs_select_info_num (UBYTE index) ;
void Cphs_write_sim_dat_cb(SHORT table_id);
BOOL Cphs_write_sim_dat(USHORT data_id, UBYTE *data, UBYTE length);
void Cphs_write_sim_rcd_cb (SHORT table_id);
BOOL Cphs_write_sim_rcd(USHORT data_id, UBYTE rcd_num,
UBYTE *data, UBYTE dataLen);
void Cphs_read_eeprom_als_desc();
void Cphs_write_eeprom_als_desc(T_CPHS_ALS_LINE* line);
T_CPHS_RET Cphs_write_eeprom_als(T_CPHS_ALS_INFO* info);
T_CPHS_RET Cphs_read_eeprom_als(T_CPHS_ALS_INFO* info);
void Cphs_get_als_info ();
T_CPHS_PHB_TON cvtTon(T_ACI_TOA_TON ton);
/* initializes CPHS module, reads CPHS data fields from SIM and caches */
/* the read data. */
#ifdef _TESTING__
T_CPHS_INFO_NUM_LIST num_list;
T_CPHS_INFO_NUM_ENTRY num_entry;
int Info_Numbers_Callback(T_CPHS_INFO_NUM_LIST* list, T_CPHS_INFO_NUM_ENTRY* entry)
{ char debug[50];
TRACE_FUNCTION("Info_Numbers_Callback()");
if (list != NULL)
{ sprintf(debug, "INFO_NUMLIST:%s, count:%d",(char*)list->entry[0].alpha.data, list->count);
TRACE_EVENT(debug);
}
if (entry != NULL)
{
sprintf(debug, "INFO_NUM:%s",(char*)entry->alpha.data);
TRACE_EVENT(debug);
}
if (list == NULL && entry == NULL)
TRACE_EVENT("REFRESH DONE!!!!");
}
void Cphs_reading_test()
{ T_CPHS_ALS_INFO als_info;
T_CPHS_ALS_LINE als_line;
T_CPHS_INFO cphs_info;
T_CPHS_CSP cphs_csp;
T_CPHS_LINE_IND dv_ind;
T_CPHS_MAILBOX_NUM_LIST mb_nums;
T_CPHS_OPN op_name;
T_CPHS_ROAMING_IND roam_ind;
char debug[60];
//cphs_Init(Info_Numbers_Callback);
cphs_refresh(Info_Numbers_Callback);
//cphs_getInfoNumbers(&num_list,1,1, Info_Numbers_Callback);
/*cphs_getAlsInfo(&als_info);
sprintf(debug,"line:%d, locked:%d", als_info.line, als_info.locked);
TRACE_FUNCTION(debug);
als_line.line = CPHS_LINE_INDEX_LINE2;
cphs_getAlsLineDescr(&als_line);
sprintf(debug,"line:%d, desc:%0.22s", als_line.line, als_line.description.data);
TRACE_EVENT(debug);
cphs_getVoiceMessageInd(&dv_ind);
sprintf(debug, "VM result:%d, line1:%d, line2: %d", dv_ind.result, dv_ind.line1, dv_ind.line2);
TRACE_EVENT(debug);
cphs_getCPHSInfo(&cphs_info);
sprintf(debug, "Phase:%d InfoNum:%d, shortname:%d, mb:%d", cphs_info.phase, cphs_info.info_num, cphs_info.opn_short, cphs_info.mailbox_num);
TRACE_EVENT(debug);
cphs_getCSP(&cphs_csp);
sprintf(debug, "Result: %d, CSP:%x,%x,%x,%x,%x,%x", cphs_csp.result, cphs_csp.csp[0].services, cphs_csp.csp[1].services,
cphs_csp.csp[2].services, cphs_csp.csp[3].services, cphs_csp.csp[4].services, cphs_csp.csp[5].services);
TRACE_EVENT(debug);
//#ifdef FRED
cphs_getDivertCallInd(&dv_ind);
sprintf(debug, "Divert result: %d, line1:%d, line2:%d", dv_ind.result, dv_ind.line1, dv_ind.line2);
TRACE_EVENT(debug);
//#endif
cphs_getOPN(&op_name);
sprintf(debug, "res:%d long_name:%s, short_name%0.22s", op_name.result, op_name.long_name, op_name.short_name);
TRACE_EVENT(debug);
cphs_getRoamingInd(&roam_ind);
sprintf(debug, "Roaming ind: %d", roam_ind);
TRACE_EVENT(debug);
cphs_getMailboxNumbers(&mb_nums);
sprintf(debug, "MBN result: %d, count:%d, first:%0.22s",mb_nums.result, mb_nums.count, mb_nums.entries[0].number);
TRACE_EVENT(debug);*/
}
void Cphs_writing_test()
{ T_CPHS_ALS_INFO als_info;
T_CPHS_ALS_LINE als_line;
T_CPHS_LINE_IND dv_ind;
T_CPHS_ROAMING_IND roam_ind;
char debug[50];
cphs_Init(Info_Numbers_Callback);
//cphs_refresh(Info_Numbers_Callback);
als_line.line = CPHS_LINE_INDEX_LINE2;
memcpy(als_line.description.data, (UBYTE*)"Second Line !!", 8);
als_line.description.len = 8;
cphs_setAlsLineDescr(als_line);
als_info.line = CPHS_LINE_INDEX_LINE2;
als_info.locked= CPHS_LINEFLAG_SET;
cphs_setAlsInfo(&als_info);
cphs_setDivertCallInd(CPHS_LINE_INDEX_LINE1, CPHS_LINEFLAG_NOT_SET);
cphs_setDivertCallInd(CPHS_LINE_INDEX_LINE2, CPHS_LINEFLAG_SET);
cphs_setVoiceMessageInd(CPHS_LINE_INDEX_LINE1, CPHS_LINEFLAG_NOT_SET);
cphs_setVoiceMessageInd(CPHS_LINE_INDEX_LINE2, CPHS_LINEFLAG_SET);
roam_ind = CPHS_ROAMING_OFF;
cphs_setRoamingInd(&roam_ind);
//cphs_selectInfoNumber(2, &num_entry, Info_Numbers_Callback);
}
#endif
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_Init |
+--------------------------------------------------------------------+
*/
T_CPHS_RET cphs_Init(T_CPHS_CB_FUNC callback)
{ //check if already initilaised?
if (cphs_data)
return CPHS_IS_OK;
cphs_data = (T_CPHS_CACHED_DATA*)malloc(sizeof(T_CPHS_CACHED_DATA));
if (cphs_data)
{ cphs_data->cphsStatus = CPHS_NOT_PRESENT;
cphs_data->simStatus = SIMOP_UNKNOWN;
cphs_data->cphsUpdate = FALSE;
cphs_data->cphsPrevRead = 0;
cphs_data->InfoNumberListCB = NULL;
cphs_data->InfoNumberCB = NULL;
Cphs_support_check();
cphs_refresh(callback);
return CPHS_IS_OK;
}
else
return CPHS_FAIL;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_refresh() |
+--------------------------------------------------------------------+
*/
/* reads CPHS data fields from SIM and updates the cached CPHS data */
T_CPHS_RET cphs_refresh(T_CPHS_CB_FUNC callback)
{ T_CPHS_RET res;
if (cphs_data EQ NULL)
{ TRACE_EVENT("CPHS not initialised");
return CPHS_NOT_INIT;
}
//get call divert indicator
Cphs_get_divert_status ();
cphs_data->RefreshCB = callback; //set call back function
//get mailbox numbers
/*Cphs_get_mailbox ();
Cphs_operator_name ();
//get voice message indicator
Cphs_read_eeprom_als_desc();
//get als line description
Cphs_get_mailbox_status ();
//get CSP
Cphs_get_csp ();*/
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_Exit() |
+--------------------------------------------------------------------+
*/
/* de-initializes CPHS module */
T_CPHS_RET cphs_Exit()
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
free(cphs_data);
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getOPN |
+--------------------------------------------------------------------+
*/
/* reads from SIM the operator long name and if available the short */
/* name, too */
T_CPHS_RET cphs_getOPN ( T_CPHS_OPN *opn )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (opn EQ NULL)
return CPHS_FAIL;
memcpy(opn, &cphs_data->opName, sizeof(T_CPHS_OPN));
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getRoamingInd |
+--------------------------------------------------------------------+
*/
/* checks if roaming is active */
T_CPHS_RET cphs_getRoamingInd ( T_CPHS_ROAMING_IND *indicator )
{
#ifndef NEPTUNE_BOARD
/*
T_ACI_COPS_MOD mode;
T_ACI_COPS_FRMT format;
CHAR oper[30];
T_OPER_NTRY* plmn_entry;
SHORT mccBuf, mncBuf;
char debug[50];
UBYTE numeric[8];
char ** end;
memset(oper, 0, 30);
*/
#else
T_ACI_COPS_MOD mode;
T_ACI_COPS_FRMT format;
CHAR oper[30];
T_OPER_NTRY* plmn_entry;
SHORT mccBuf, mncBuf;
char debug[50];
UBYTE numeric[8];
char ** end;
memset(oper, 0, 30);
#endif
if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (indicator EQ NULL)
return CPHS_FAIL;
#ifndef NEPTUNE_BOARD
*indicator = cphs_data->roaming_ind;
#else
memcpy(indicator, &cphs_data->roaming_ind, sizeof(T_CPHS_ROAMING_IND));
#endif
/*
qAT_PlusCOPS (CMD_SRC_NONE,&mode,&format,oper );
//get current MCC
if (format == COPS_FRMT_Long OR format == COPS_FRMT_Short)
{ sAT_PlusCOPSE(oper, format, NULL, NULL, numeric);
// plmn_entry = cmhMM_FindName( oper, format );
numeric[3] = 0;//terminate string before MNC
plmn_entry->mcc = strtol((char*)numeric,end,16 );
}
if (format == COPS_FRMT_Numeric)
{ //plmn_entry = cmhMM_FindNumeric( oper );
oper[3] = 0;
plmn_entry->mcc = strtol((char*)oper, end, 16);
}
//get "Home MCC"
cmhSIM_GetHomePLMN ( &mccBuf, &mncBuf );
//currently qAT_PlusCOPS is not returning the correct format
//cmhMM_FindName/Numeric rely on PCM which does not work
sprintf(debug, "Home MCC %d, current MCC %d COPS fmt:%d", plmn_entry->mcc, mccBuf, format);
TRACE_EVENT(debug);
if (plmn_entry->mcc == mccBuf)
*indicator = CPHS_ROAMING_OFF;
else
*indicator = CPHS_ROAMING_ON;
*/
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getVoiceMessageInd |
+--------------------------------------------------------------------+
*/
/* reads from SIM if voice mails are waiting for the available lines */
/* (line1, line2, fax, data) */
T_CPHS_RET cphs_getVoiceMessageInd( T_CPHS_LINE_IND *indicator )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (indicator EQ NULL)
return CPHS_FAIL;
memcpy(indicator, &cphs_data->mbStatus, sizeof(T_CPHS_LINE_IND));
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_setVoiceMessageInd |
+--------------------------------------------------------------------+
*/
/* sets on SIM the voice mail waiting flag for the given lines in the */
/* parameter line_mask. The bitmask will be created by oring the lines.*/
/* The bits for the lines are defined in T_CPHS_LINE_INDEX. */
T_CPHS_RET cphs_setVoiceMessageInd( UBYTE line_mask,
T_CPHS_FLAG_STATUS flag )
{
if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (CPHS_LINE_INDEX_LINE1 & line_mask)
{ cphs_data->mbStatus.line1 = flag;
TRACE_EVENT("Setting Line 1 VM");
Cphs_set_mailbox_status(flag,CPHS_FLAG_NOT_PRESENT ,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
}
if (CPHS_LINE_INDEX_LINE2 & line_mask)
{ TRACE_EVENT("SEtting line 2 VM");
cphs_data->mbStatus.line2 = flag;
Cphs_set_mailbox_status(CPHS_FLAG_NOT_PRESENT, flag,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
}
if (CPHS_LINE_INDEX_FAX & line_mask)
{ cphs_data->mbStatus.fax = flag;
Cphs_set_mailbox_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,flag,CPHS_FLAG_NOT_PRESENT);
}
if (CPHS_LINE_INDEX_DATA & line_mask)
{ cphs_data->mbStatus.data = flag;
Cphs_set_mailbox_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT,flag);
}
return CPHS_EXEC;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getDivertCallInd |
+--------------------------------------------------------------------+
*/
/* reads from SIMif calls shall be diverted for the available lines */
/* (line1, line2, fax, data) */
T_CPHS_RET cphs_getDivertCallInd (T_CPHS_LINE_IND *indicator )
{
if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (ind EQ NULL)
return CPHS_FAIL;
memcpy(indicator, &cphs_data->dvStatus, sizeof(T_CPHS_LINE_IND));
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_setDivertCallInd |
+--------------------------------------------------------------------+
*/
/* sets on SIM the divert call flag for the given lines in the */
/* parameter line_mask. The bitmask will be created by oring the lines.*/
/* The bits for the lines are defined in T_CPHS_LINE_INDEX. */
T_CPHS_RET cphs_setDivertCallInd ( UBYTE line_mask,
T_CPHS_FLAG_STATUS flag )
{
if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (CPHS_LINE_INDEX_LINE1 & line_mask)
{ cphs_data->dvStatus.line1 = flag;
TRACE_EVENT("Setting line 1 divert");
Cphs_set_divert_status(flag,CPHS_FLAG_NOT_PRESENT ,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
}
if (CPHS_LINE_INDEX_LINE2 & line_mask)
{ cphs_data->dvStatus.line2 = flag;
TRACE_EVENT("Setting line 2 divert");
Cphs_set_divert_status(CPHS_FLAG_NOT_PRESENT, flag,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
}
if (CPHS_LINE_INDEX_FAX & line_mask)
{ cphs_data->dvStatus.fax = flag;
Cphs_set_divert_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,flag,CPHS_FLAG_NOT_PRESENT);
}
if (CPHS_LINE_INDEX_DATA & line_mask)
{ cphs_data->dvStatus.data = flag;
Cphs_set_divert_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT,flag);
}
return CPHS_EXEC;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getAlsInfo |
+--------------------------------------------------------------------+
*/
/* reads from SIM the information of alternate line service */
/* ( selected line, alternate line service locked/unlocked) */
T_CPHS_RET cphs_getAlsInfo ( T_CPHS_ALS_INFO *info )
{
if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (info EQ NULL)
return CPHS_FAIL;
//memcpy(info, &cphs_data->alsStatus, sizeof( T_CPHS_ALS_INFO));
Cphs_read_eeprom_als(info);
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_setAlsInfo|
+--------------------------------------------------------------------+
*/
/* sets on SIM the informtion of alternate line service / selects the */
/* active line */
T_CPHS_RET cphs_setAlsInfo ( T_CPHS_ALS_INFO *info )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (info EQ NULL)
return CPHS_FAIL;
//memcpy(&cphs_data->alsStatus, info, sizeof(T_CPHS_ALS_INFO));
return Cphs_write_eeprom_als(info);
//return CPHS_EXEC;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getAlsLineDescr |
+--------------------------------------------------------------------+
*/
/* reads the (alpha)numeric description for the given line */
T_CPHS_RET cphs_getAlsLineDescr ( T_CPHS_ALS_LINE* line )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (line EQ NULL)
return CPHS_FAIL;
Cphs_read_eeprom_als_desc();
if (line->line EQ CPHS_LINE_INDEX_LINE1)
{ memcpy(line,&cphs_data->Line1_desc, sizeof(T_CPHS_ALS_LINE));
return CPHS_IS_OK;
}
if (line->line EQ CPHS_LINE_INDEX_LINE2)
{ memcpy( line, &cphs_data->Line2_desc,sizeof(T_CPHS_ALS_LINE));
return CPHS_IS_OK;
}
return CPHS_FAIL;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE :cphs_setAlsLineDescr |
+--------------------------------------------------------------------+
*/
/* sets a (alpha)numeric description for the given line */
T_CPHS_RET cphs_setAlsLineDescr ( T_CPHS_ALS_LINE line )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (line.line EQ CPHS_LINE_INDEX_LINE1)
{ memcpy(&cphs_data->Line1_desc,&line, sizeof(T_CPHS_ALS_LINE));
Cphs_write_eeprom_als_desc(&cphs_data->Line1_desc);
return CPHS_IS_OK;
}
if (line.line EQ CPHS_LINE_INDEX_LINE2)
{ memcpy(&cphs_data->Line2_desc, &line, sizeof(T_CPHS_ALS_LINE));
Cphs_write_eeprom_als_desc(&cphs_data->Line2_desc);
return CPHS_IS_OK;
}
return CPHS_FAIL;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_setRoamingInd |
+--------------------------------------------------------------------+
*/
T_CPHS_RET cphs_setRoamingInd ( T_CPHS_ROAMING_IND* indicator )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (*indicator EQ CPHS_ROAMING_OFF OR *indicator EQ CPHS_ROAMING_ON)
{ cphs_data->roaming_ind = *indicator;
return CPHS_IS_OK;
}
else
return CPHS_FAIL;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_checkEmergencyCall |
+--------------------------------------------------------------------+
*/
/* check if the current call number(ASCII encoded) is an emergency number supported */
/* by CPHS. */
T_CPHS_RET cphs_checkEmergencyCall( char* num )
{ char** end;
if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (num EQ NULL)
return CPHS_FAIL;
if (strtol(num, end, 10)EQ CPHS_EMERGENCY_NUM_112 OR
strtol(num, end, 10)EQ CPHS_EMERGENCY_NUM_999)
return CPHS_IS_OK;
else
return CPHS_FAIL;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getCPHSInfo |
+--------------------------------------------------------------------+
*/
/* reads from SIM the phase of the SIM and which optional datafields */
/* are present in the SIM */
/* (operator name shortform, mailbox numbers, service string table, */
/* information numbers) */
T_CPHS_RET cphs_getCPHSInfo ( T_CPHS_INFO *info )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (info !=NULL)
{
info->phase = cphs_data->cphsPhase;
info->csp = Cphs_ssc(CPHS_CSP, cphs_data->cphsServTab);
info->mailbox_num = Cphs_ssc(CPHS_MB_NUMBER, cphs_data->cphsServTab);
if (cphs_data->cphsPhase EQ 1) /* phase 1 only */
info->sst = Cphs_ssc(CPHS_SST, cphs_data->cphsServTab);
else /* not support */
info->sst = NO_ALLOCATED;
if (cphs_data->cphsPhase EQ 2) /* phase 2 only */
{
info->opn_short = Cphs_ssc(CHPS_NAME_SHORT, cphs_data->cphsServTab);
info->info_num = Cphs_ssc(CHPS_INFO_NUMBERS, cphs_data->cphsServTab);
}
else /* not support */
{
info->opn_short = NO_ALLOCATED;
info->info_num = NO_ALLOCATED;
}
return CPHS_IS_OK;
}
return CPHS_FAIL;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getCSP |
+--------------------------------------------------------------------+
*/
/* reads all entries of the customer service profile and fills */
T_CPHS_RET cphs_getCSP ( T_CPHS_CSP *csp )
{ if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (csp EQ NULL)
return CPHS_FAIL;
memcpy(csp, &cphs_data->csProfile, sizeof(T_CPHS_CSP));
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getMailboxNumbers |
+--------------------------------------------------------------------+
*/
/* reads all mailbox numbers from the SIM fills all mailbox number */
/* entries in the mailbox number list */
T_CPHS_RET cphs_getMailboxNumbers ( T_CPHS_MAILBOX_NUM_LIST *nums )
{if (cphs_data EQ NULL)
return CPHS_NOT_INIT;
if (nums EQ NULL)
return CPHS_FAIL;
memcpy(nums, &cphs_data->mbNum, sizeof(T_CPHS_CSP));
return CPHS_IS_OK;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_getInfoNumbers|
+--------------------------------------------------------------------+
*/
/* reads all information numbers from the SIM fills all information */
/* numbers into the array of pointers to information number lists down to the level specified */
//MC-Not sure about the format of this as current mfw_cphs code returns an information number list
//with only 4 entries
T_CPHS_RET cphs_getInfoNumbers ( T_CPHS_INFO_NUM_LIST *nums, UBYTE level, UBYTE start_index, T_CPHS_CB_FUNC callback)
{ cphs_data->InfoNumberListCB = callback;
cphs_data->numList=nums;
Cphs_get_info_num(level, start_index);
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_selectInfoNumber |
+--------------------------------------------------------------------+
PURPOSE : reads the information number entry given by level and index from
the SIM
*/
T_CPHS_RET cphs_selectInfoNumber ( USHORT index,
T_CPHS_INFO_NUM_ENTRY *num, T_CPHS_CB_FUNC callback)
{ cphs_data->InfoNumberCB = callback;
cphs_data->infoEntry= num;
Cphs_select_info_num(index);
//num = &cphs_data->infoEntry;
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_support_check |
+--------------------------------------------------------------------+
PURPOSE : Check whether CPHS is supported.
*/
void Cphs_support_check (void)
{
TRACE_FUNCTION ("Cphs_support_check()");
/* Read CPHS information filed (6F16 - 3 bytes) from SIM card */
if (!Cphs_read_sim_dat(SIM_CPHS_CINF, NOT_PRESENT_8BIT, CPHS_INFO_SIZE))
{
/* Read failed */
cphs_data->cphsStatus = CPHS_NOT_PRESENT;
}
}
/*
+--------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_operator_name |
+--------------------------------------------------------------------+
PURPOSE : Request the network operator name
*/
void Cphs_operator_name (void)
{
TRACE_FUNCTION ("Cphs_operator_name()");
/* Check CPHS support status */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
return;
/* Read operator name sring */
if (!Cphs_read_sim_dat(SIM_CPHS_ONSTR, NOT_PRESENT_8BIT, CPHS_ONS_SIZE))
{
/* Read operator name sring failed */
cphs_data->opName.long_name.len = 0;
/* Read operator name shortform */
if ((cphs_data->cphsPhase NEQ 2) OR
(Cphs_ssc(CHPS_NAME_SHORT, cphs_data->cphsServTab) NEQ ALLOCATED_AND_ACTIVATED) OR
!Cphs_read_sim_dat(SIM_CPHS_ONSHF, NOT_PRESENT_8BIT, CPHS_ONSF_SIZE) )
{
/* Read operator name shortform failed.
*/
cphs_data->opName.short_name.len = 0;
cphs_data->opName.result = SIMOP_READ_ERR;
}
}
}
/*
+-------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_get_mailbox_status |
+-------------------------------------------------------------------------+
PURPOSE : get the voice message waiting flag
*/
void Cphs_get_mailbox_status ()
{
TRACE_FUNCTION ("Cphs_get_mailbox_status()");
/* Check CPHS support status. */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
return ;
/* Read voice message waiting flag.
When this reading failed, send event with "read error" parameter to MMI */
if (!Cphs_read_sim_dat(SIM_CPHS_VMW, NOT_PRESENT_8BIT, CPHS_MBS_SIZE))
{
cphs_data->mbStatus.result = SIMOP_READ_ERR;
TRACE_EVENT("Reading mailbox status failed");
}
}
/*
+------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_get_divert_status |
+------------------------------------------------------------------------+
PURPOSE : Request the call forwarding flags
*/
void Cphs_get_divert_status ()
{
TRACE_FUNCTION ("Cphs_get_divert_status()");
/* Check CPHS support status. */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
return;
/* Read call forwarding flags.
When this reading failed, send event with "read error" parameter to MMI */
if (!Cphs_read_sim_dat(SIM_CPHS_CFF, NOT_PRESENT_8BIT, CPHS_CFF_SIZE))
{
cphs_data->dvStatus.result = SIMOP_READ_ERR;
}
}
/*
+---------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_get_als_info |
+---------------------------------------------------------------------+
PURPOSE : Request the Status of Alternate Line Service information
(first read selected ALS line, dann status of this line).
When the field does not exist in SIM, read it from EEPROM.
*/
//ATM, cannot get als lock status from SIM
/*void Cphs_get_als_info ()
{
TRACE_EVENT ("Cphs_get_als_info()");
Cphs_read_eeprom_als();
}*/
/*
+---------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_get_csp |
+---------------------------------------------------------------------+
PURPOSE : Request the customer service profile
*/
void Cphs_get_csp ()
{
UBYTE res;
TRACE_FUNCTION ("Cphs_get_csp()");
/* Check CPHS support status. */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
return ;
/* check CPHS service table */
res = Cphs_ssc(CPHS_CSP, cphs_data->cphsServTab);
if ( res NEQ ALLOCATED_AND_ACTIVATED)
return;
/* Read customer service profile.
When this reading failed, send event with empty parameter array to MMI */
if (!Cphs_read_sim_dat(SIM_CPHS_CSP, NOT_PRESENT_8BIT, CPHS_CSP_SIZE))
{
cphs_data->csProfile.result = SIMOP_READ_ERR;
memset(cphs_data->csProfile.csp, 0, sizeof(cphs_data->csProfile.csp));
}
}
/*
+---------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_get_mailbox |
+---------------------------------------------------------------------+
PURPOSE : Request the customer service profile
*/
void Cphs_get_mailbox (void)
{
TRACE_FUNCTION ("Cphs_get_mailbox()");
cphs_data->mbNum.count = 0;
/* Check CPHS support status.
When CPHS is not support, read mailbox numbers from EEPROM */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
{
Cphs_read_eeprom_mailbox();
return;
}
/* Check CPHS service table.
When CPHS is not support, read mailbox numbers from EEPROM */
if (Cphs_ssc(CPHS_MB_NUMBER, cphs_data->cphsServTab) NEQ ALLOCATED_AND_ACTIVATED)
{
TRACE_EVENT("CPHS doesn't support mailbox");
Cphs_read_eeprom_mailbox();
return;
}
/* Read mailbox numbers from SIM.
When this reading failed, read mailbox numbers from EEPROM */
//cphs_data->simStatus = SIMOP_UNKNOWN;
if (!Cphs_read_sim_rcd(SIM_CPHS_MBXN, 1, 0)) /* read the first record */
{ TRACE_EVENT("Mailbox Sim read failed");
Cphs_read_eeprom_mailbox();
}
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_ssc |
+----------------------------------------------------------------------+
PURPOSE : Check CPHS service status.
*/
UBYTE Cphs_ssc (UBYTE nr, UBYTE * serv_table)
{
UBYTE value;
TRACE_FUNCTION ("Cphs_ssc()");
serv_table = serv_table + (nr-1)/4;
value = * serv_table;
value = value >> (((nr-1) & 3) * 2);
value = value & 3;
return value;
}
/*
+------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_set_mailbox_status|
+------------------------------------------------------------------------+
PURPOSE : Set the mailbox status on each line
*/
T_CPHS_RET Cphs_set_mailbox_status (T_CPHS_FLAG_STATUS line1,
T_CPHS_FLAG_STATUS line2,
T_CPHS_FLAG_STATUS fax,
T_CPHS_FLAG_STATUS data)
{
UBYTE result;
char debug[50];
TRACE_FUNCTION ("Cphs_set_mailbox_status()");
/* Check CPHS support status. */
// if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
// return CPHS_FAIL;
sprintf(debug, "Original mailbox status: %x%x",cphs_data->mbsData[0],cphs_data->mbsData[1]);
TRACE_EVENT(debug);
/* Write status in buffer */
if (line1 EQ CPHS_LINEFLAG_SET OR
line1 ==CPHS_LINEFLAG_NOT_SET )
{ /* low Nibble */
cphs_data->mbsData[0]&=0xF0; //get rid of low nibble
cphs_data->mbsData[0] += (line1&0x0F);
}
/* else
cphs_data->mbsData[0] |= 0x0F;*/
if (line2 EQ CPHS_LINEFLAG_SET OR
line2 EQ CPHS_LINEFLAG_NOT_SET )
{ cphs_data->mbsData[0]&=0x0F; //get rid of high nibble
cphs_data->mbsData[0] += (line2 << 4)&0xF0; /* high Nibble */
}
/* else
cphs_data->mbsData[0] = 0xF0 | cphs_data->mbsData[0];*/
if (fax EQ CPHS_LINEFLAG_SET OR
fax EQ CPHS_LINEFLAG_NOT_SET )
{cphs_data->mbsData[1]&=0xF0; //get rid of low nibble
cphs_data->mbsData[1] += fax&0x0F; /* low Nibble */
}
/* else
cphs_data->mbsData[1] |= 0x0F;*/
if (data EQ CPHS_LINEFLAG_SET OR
data EQ CPHS_LINEFLAG_NOT_SET )
{ cphs_data->mbsData[1]&=0x0F; //get rid of high nibble
cphs_data->mbsData[1] += (data << 4)&0xF0; /* high Nibble */
}
/* else
cphs_data->mbsData[1] = 0xF0 | cphs_data->mbsData[1];*/
sprintf(debug, "MBS Data:%x%x", cphs_data->mbsData[0], cphs_data->mbsData[1]);
TRACE_EVENT(debug);
/* Read voice message waiting flag to determine the size */
cphs_data->simStatus = SIMOP_WRITE_OK;
if (!Cphs_read_sim_dat(SIM_CPHS_VMW, NOT_PRESENT_8BIT, CPHS_MBS_SIZE))
//if (!Cphs_write_sim_dat(SIM_CPHS_VMW, cphs_data->mbsData, CPHS_MBS_SIZE))
{ TRACE_EVENT("Mailbox status SIM write failed");
return CPHS_SIM_WRITE_ERROR;
}
}
/*
+------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_set_divert_status|
+------------------------------------------------------------------------+
PURPOSE : Set the divert status on each line
*/
T_CPHS_RET Cphs_set_divert_status (T_CPHS_FLAG_STATUS line1,
T_CPHS_FLAG_STATUS line2,
T_CPHS_FLAG_STATUS fax,
T_CPHS_FLAG_STATUS data)
{
UBYTE result;
char debug[50];
TRACE_FUNCTION ("Cphs_set_divert_status()");
/* Check CPHS support status. */
// if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
// return cphs_data->cphsStatus;
sprintf(debug, "Original divert status: %x%x",cphs_data->dvData[0],cphs_data->dvData[1]);
TRACE_EVENT(debug);
/* Write status in buffer */
if (line1 EQ CPHS_LINEFLAG_SET OR
line1 EQ CPHS_LINEFLAG_NOT_SET )
{ cphs_data->dvData[0] &= 0xF0; //zero low nibble
cphs_data->dvData[0] += line1&0x0F; /* low Nibble */
}
/*else
cphs_data->dvData[0] |= 0x0F;*/
if (line2 EQ CPHS_LINEFLAG_SET OR
line2 EQ CPHS_LINEFLAG_NOT_SET )
{cphs_data->dvData[0] &= 0x0F; //zero high nibble
cphs_data->dvData[0] += (line2 << 4)&0xF0; /* high Nibble */
}
/*else
cphs_data->dvData[0] = 0xF0 | cphs_data->dvData[0];*/
if (fax EQ CPHS_LINEFLAG_SET OR
fax EQ CPHS_LINEFLAG_NOT_SET )
{ cphs_data->dvData[0] &= 0xF0; //zero low nibble
cphs_data->dvData[1] += fax&0x0F; /* low Nibble */
}
/* else
cphs_data->dvData[1] |= 0x0F;*/
if (data EQ CPHS_LINEFLAG_SET OR
data EQ CPHS_LINEFLAG_NOT_SET )
{ cphs_data->dvData[1] &= 0x0F; //zero high nibble
cphs_data->dvData[1] += (data << 4)&0xF0; /* high Nibble */
}
/*else
cphs_data->dvData[1] = 0xF0 | cphs_data->dvData[1];*/
sprintf(debug, "Divert Data:%x%x", cphs_data->dvData[0], cphs_data->dvData[1]);
TRACE_EVENT(debug);
/* Read call forwarding flag to determine the size */
cphs_data->simStatus = SIMOP_WRITE_OK;
if (!Cphs_read_sim_dat(SIM_CPHS_CFF, NOT_PRESENT_8BIT, CPHS_CFF_SIZE))
{ TRACE_EVENT("Mailbox SIM write failed");
return SIMOP_WRITE_ERR;
//cphs_sign_exec(E_CPHS_SET_DV_STAT, &result);
}
/* PATCH VO 22.01.01 end */
return cphs_data->cphsStatus;
}
/*CPHS_RET cphs_set_als_status (T_CPHS_ALS_INFO status)
{
UBYTE result;
//T_MFW_SIM_PIN_STATUS pinStatus;
//TRACE_EVENT ("cphs_set_als_status()");
/* check PIN 2 requirement */
/*pinStatus.type = MFW_SIM_PIN2;
sim_pin_status(&pinStatus);
if (pinStatus.set NEQ MFW_SIM_NO_PIN)
return MFW_SIM_PIN2_REQ;
/* check given parameter */
/*if (status NEQ MFW_LINE_LOCKED AND
status NEQ MFW_LINE_UNLOCKED )
{
result = MFW_SIMOP_WRITE_ERR;
//cphs_sign_exec(E_CPHS_SET_ALS_STATUS, &result);
return CPHS_ERR;
}*/
/* cphs_data->alsData = (UBYTE)status.locked;*/
/* write lock status in EEPROM */
//MC cphs_write_eeprom_alss(&result);
//cphs_sign_exec(E_CPHS_SET_LINE, &result);
// }
/* return CPHS_IS_OK;
}*/
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_read_sim_dat |
+----------------------------------------------------------------------+
PURPOSE : Request to read SIM card.
*/
BOOL Cphs_read_sim_dat(USHORT data_id, UBYTE len, UBYTE max_length)
{
T_ACI_RETURN res;
TRACE_FUNCTION ("Cphs_read_sim_dat()");
res = cmhSIM_ReadTranspEF ( CMD_SRC_NONE,
AT_CMD_NONE,
data_id,
0,
max_length,
NULL,
Cphs_read_sim_dat_cb);
if (res NEQ AT_EXCT)
return FALSE;
return TRUE;
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_read_sim_dat_cb |
+----------------------------------------------------------------------+
PURPOSE : Call back for SIM read.
*/
void Cphs_read_sim_dat_cb(SHORT table_id)
{
UBYTE dataLen;
UBYTE result;
switch (simShrdPrm.atb[table_id].reqDataFld)
{
case SIM_CPHS_CINF: /* CPHS information */
if (!cphs_data->cphsUpdate)
Cphs_read_information(simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
/*#ifdef SIM_TOOLKIT
else
Cphs_update_info_cnf(simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
#endif*/
break;
case SIM_CPHS_ONSTR: /* operator name string */
Cphs_read_ons(simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
break;
case SIM_CPHS_ONSHF: /* operator name short form */
Cphs_read_onsf(simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
Cphs_get_mailbox_status();//get next item
break;
case SIM_CPHS_VMW: /* voice message waiting flag */
if (cphs_data->simStatus EQ SIMOP_WRITE_OK)
{
/* Determine the size of this field, and write the data.
When the writing is not possible, write this voice
message waiting flag in EEPROM. */
cphs_data->simStatus = SIMOP_UNKNOWN;
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
#else
if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
#endif
{
dataLen = simShrdPrm.atb[table_id].dataLen;
/* Write voice message waiting flag.
When this writing failed, send event with "write error" parameter to MMI */
if (!Cphs_write_sim_dat(SIM_CPHS_VMW, cphs_data->mbsData, dataLen))
{
cphs_data->mbStatus.result = SIMOP_WRITE_ERR;
cphs_data->mbStatus.line1 = CPHS_FLAG_NOT_PRESENT;
cphs_data->mbStatus.line2 = CPHS_FLAG_NOT_PRESENT;
cphs_data->mbStatus.fax = CPHS_FLAG_NOT_PRESENT;
cphs_data->mbStatus.data = CPHS_FLAG_NOT_PRESENT;
}
}
else
{
cphs_data->mbStatus.result = SIMOP_WRITE_ERR;
//cphs_sign_exec(E_CPHS_SET_VC_STAT, &result);
cphs_data->mbStatus.line1 = CPHS_FLAG_NOT_PRESENT;
cphs_data->mbStatus.line2 = CPHS_FLAG_NOT_PRESENT;
cphs_data->mbStatus.fax = CPHS_FLAG_NOT_PRESENT;
cphs_data->mbStatus.data = CPHS_FLAG_NOT_PRESENT;
}
}
else
/* PATCH VO 22.01.01 end */
{
Cphs_read_mbs (simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
Cphs_get_csp();
}
break;
case SIM_CPHS_CFF: /* call forwarding flag */
/* PATCH VO 22.01.01 */
if (cphs_data->simStatus EQ SIMOP_WRITE_OK)
{
/* Determine the size of this field, and write the data.
When the writing is not possible, write this voice
message waiting flag in EEPROM. */
cphs_data->simStatus = SIMOP_UNKNOWN;
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
#else
if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
#endif
{
dataLen = simShrdPrm.atb[table_id].dataLen;
/* Write call forwarding flag.
When this writing failed, send event with "write error" parameter to MMI */
if (!Cphs_write_sim_dat(SIM_CPHS_CFF, cphs_data->dvData, dataLen))
{ TRACE_EVENT("Divert write failed");
cphs_data->dvStatus.result = SIMOP_WRITE_ERR;
cphs_data->dvStatus.line1 = CPHS_FLAG_NOT_PRESENT;
cphs_data->dvStatus.line2 = CPHS_FLAG_NOT_PRESENT;
cphs_data->dvStatus.fax = CPHS_FLAG_NOT_PRESENT;
cphs_data->dvStatus.data = CPHS_FLAG_NOT_PRESENT;
}
}
else
{TRACE_EVENT("Sim error while writing");
cphs_data->dvStatus.result = SIMOP_WRITE_ERR;
cphs_data->dvStatus.line1 = CPHS_FLAG_NOT_PRESENT;
cphs_data->dvStatus.line2 = CPHS_FLAG_NOT_PRESENT;
cphs_data->dvStatus.fax = CPHS_FLAG_NOT_PRESENT;
cphs_data->dvStatus.data = CPHS_FLAG_NOT_PRESENT;
}
}
else
/* PATCH VO 22.01.01 end */
{Cphs_get_mailbox();
Cphs_read_cff (simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
}
break;
case SIM_CPHS_CSP: /* customer service profile */
Cphs_read_csp (simShrdPrm.atb[table_id].errCode,
simShrdPrm.atb[table_id].exchData,
simShrdPrm.atb[table_id].dataLen);
//All CPHS data fields have now been read
//so call callback function to alert client layer
break;
default:
break;
}
simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_read_sim_rcd |
+----------------------------------------------------------------------+
PURPOSE : Request to read SIM card.
*/
BOOL Cphs_read_sim_rcd(USHORT data_id, UBYTE rcd_num, UBYTE len)
{
T_ACI_RETURN res;
UBYTE dataLen;
TRACE_FUNCTION ("Cphs_read_sim_rcd()");
if (rcd_num EQ 1)
dataLen = UCHAR_MAX;
else
dataLen = len;
res = cmhSIM_ReadRecordEF ( CMD_SRC_NONE,
AT_CMD_NONE,
data_id,
rcd_num,
dataLen,
NULL,
Cphs_read_sim_rcd_cb);
if (res NEQ AT_EXCT)
return FALSE;
return TRUE;
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_read_sim_rcd_cb |
+----------------------------------------------------------------------+
PURPOSE : Request to read SIM card.
*/
void Cphs_read_sim_rcd_cb (SHORT table_id)
{
UBYTE dataLen;
char debug[25];
sprintf(debug, "SIM Error code!!!%d", simShrdPrm.atb[table_id].errCode);
TRACE_FUNCTION ("Cphs_read_sim_rcd_cb()");
TRACE_EVENT(debug);
switch (simShrdPrm.atb[table_id].reqDataFld)
{
case SIM_CPHS_MBXN: /* mailbox numbers */
if (cphs_data->simStatus EQ SIMOP_WRITE_OK)
{
/* Determine the size of record, and write a new record.
When the writing is not possible, write this mailbox
number in EEPROM. */
cphs_data->simStatus = SIMOP_UNKNOWN;
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
#else
if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
#endif
{
dataLen = simShrdPrm.atb[table_id].dataLen;
/* allocate mbnData (sizeof(dataLen)) */
Cphs_build_mbn_data(cphs_data->mbnData, dataLen);
if (!Cphs_write_sim_rcd(SIM_CPHS_MBXN, cphs_data->vcEntry->index,
cphs_data->mbnData, dataLen))
Cphs_write_eeprom_mailbox(cphs_data->vcEntry);
}
else
Cphs_write_eeprom_mailbox(cphs_data->vcEntry);
}
else
Cphs_read_mbn(table_id);
break;
case SIM_CPHS_INFN: /* information numbers */
if (simShrdPrm.atb[table_id].recNr EQ 1)
{
if ((cphs_data->startIdx EQ 1) AND (cphs_data->simStatus EQ SIMOP_READ_OK))
Cphs_read_info_num(table_id);
else
Cphs_read_first_info_num(table_id);
}
else
Cphs_read_info_num(table_id);
break;
case SIM_CPHS_INFN2: /* information numbers 2 - 7F10 'EA01' selected if SIM_CPHS_INFN '6F19' isn't there*/
if (simShrdPrm.atb[table_id].recNr EQ 1)
{
if ((cphs_data->startIdx EQ 1) AND (cphs_data->simStatus EQ SIMOP_READ_OK))
Cphs_read_info_num(table_id);
else
Cphs_read_first_info_num(table_id);
}
else
Cphs_read_info_num(table_id);
break;
default:
break;
}
simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_write_sim_rcd |
+----------------------------------------------------------------------+
PURPOSE : Request to write SIM card.
*/
BOOL Cphs_write_sim_rcd(USHORT data_id, UBYTE rcd_num,
UBYTE *data, UBYTE dataLen)
{
T_ACI_RETURN res;
TRACE_FUNCTION ("Cphs_read_sim_rcd()");
res = cmhSIM_WriteRecordEF (CMD_SRC_NONE,
AT_CMD_NONE,
data_id,
rcd_num,
dataLen,
data,
Cphs_write_sim_rcd_cb);
if (res NEQ AT_EXCT)
return FALSE;
return TRUE;
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_write_sim_rcd_cb |
+----------------------------------------------------------------------+
PURPOSE : callback of SIM card writing.
*/
void Cphs_write_sim_rcd_cb (SHORT table_id)
{
UBYTE result;
char debug[30];
TRACE_FUNCTION ("Cphs_write_sim_rcd_cb()");
sprintf(debug, "SIM Error code!!!%d", simShrdPrm.atb[table_id].errCode);
TRACE_EVENT(debug);
switch (simShrdPrm.atb[table_id].reqDataFld)
{
case SIM_CPHS_MBXN: /* mailbox numbers */
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
#else
if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
#endif
{
cphs_data->mbNum.result = SIMOP_WRITE_OK;
//cphs_sign_exec(E_CPHS_SET_VC_NUM, &result);
}
else
{
Cphs_write_eeprom_mailbox(cphs_data->vcEntry);
}
break;
default:
break;
}
simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
}
/*
+--------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_first_info_num |
+--------------------------------------------------------------------------+
PURPOSE : Read first record of information numbers
*/
void Cphs_read_first_info_num(SHORT table_id)
{
//UBYTE* pData; /* points to data buffer */
UBYTE dataLen;
TRACE_FUNCTION ("Cphs_read_first_info_num()");
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode NEQ CAUSE_SIM_NO_ERROR ) /* VO patch 040501 - remove dataLen and pData check */
#else
if ( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR ) /* VO patch 040501 - remove dataLen and pData check */
#endif
{
if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Read entry of information numbers */
{
cphs_data->simStatus = SIMOP_UNKNOWN;
cphs_data->infoEntry->result = SIMOP_READ_ERR;
if (cphs_data->InfoNumberCB != NULL)
(cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
}
else
{// if we are here then its possible the read of 7F20 6F19 failed.
// so we must try reading 7F10 EA01 instead.
if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN)
{
if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, 1, 0))
{
cphs_data->infoEntry->result = SIMOP_READ_ERR;
if (cphs_data->InfoNumberCB != NULL)
(cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
}
else
{
cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
}
}
else
{ if (cphs_data->InfoNumberListCB != NULL)
(cphs_data->InfoNumberListCB)(cphs_data->numList, NULL);
}
}
}
else
{
cphs_data->maxRec = simShrdPrm.atb[table_id].recMax;
dataLen = simShrdPrm.atb[table_id].dataLen;
if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Read entry of information numbers */
{
/* VO patch 040501 - add dataLen check: if (patch) else ... */
if (dataLen < CPHS_MIN_INS_SIZE )
{
cphs_data->simStatus = SIMOP_UNKNOWN;
cphs_data->infoEntry->result = SIMOP_READ_ERR;
}
else
Cphs_req_info_num_read(cphs_data->startIdx, dataLen);
}
else /* Read list of information numbers */
{
/* VO patch 040501 - add dataLen check: if (patch) else ... */
if (dataLen >= CPHS_MIN_INS_SIZE )
{
if (cphs_data->idxLevel EQ 1) /* read this entry */
Cphs_read_info_num(table_id);
else /* read the startIndex record */
Cphs_req_info_num_read(cphs_data->startIdx, dataLen);
}
}
}
}
T_PHB_NPI cvtNpi(T_ACI_TOA_NPI npi)
{
switch (npi)
{
case NPI_NotPresent:
case NPI_Unknown: return CPHS_NPI_UNKNOWN;
case NPI_IsdnTelephony: return CPHS_NPI_ISDN;
case NPI_Data: return CPHS_NPI_DATA;
case NPI_Telex: return CPHS_NPI_TELEX;
case NPI_Private: return CPHS_NPI_PRIVATE;
case NPI_National: return CPHS_NPI_NATIONAL;
#ifdef FF_2TO1_PS
case NPI_Ermes: return CPHS_NPI_M_ERMES;
case NPI_Cts: return CPHS_NPI_M_CTS;
#else
case NPI_ERMES: return CPHS_NPI_M_ERMES;
case NPI_CTS: return CPHS_NPI_M_CTS;
#endif
default: return npi;
}
}
/*
+---------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_info_num |
+---------------------------------------------------------------------+
PURPOSE : Read first record of information numbers
*/
void Cphs_read_info_num(SHORT table_id)
{
UBYTE* pData; /* points to data buffer */
UBYTE dataLen;
UBYTE alphaLen;
UBYTE recNr;
T_ACI_TOA type;
TRACE_FUNCTION ("Cphs_read_info_num()");
pData = simShrdPrm.atb[table_id].exchData;
dataLen = simShrdPrm.atb[table_id].dataLen;
recNr = simShrdPrm.atb[table_id].recNr;
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR OR
#endif
pData EQ NULL OR
dataLen < CPHS_MIN_INS_SIZE )
{
if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Read entry of information numbers */
{
cphs_data->simStatus = SIMOP_UNKNOWN;
cphs_data->infoEntry->result = SIMOP_READ_ERR;
TRACE_EVENT("Info num read error");
if (cphs_data->InfoNumberCB != NULL)
(cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
}
else
{// if we are here then its possible the read of 7F20 6F19 failed.
// so we must try reading 7F10 EA01 instead.
if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN2)
{
if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, 1, 0))
{
cphs_data->infoEntry->result = SIMOP_READ_ERR;
if (cphs_data->InfoNumberCB != NULL)
(cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
}
else
{
cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
}
}
else
{ if (cphs_data->InfoNumberListCB != NULL)
(cphs_data->InfoNumberListCB)(cphs_data->numList, NULL);
}
}
(cphs_data->InfoNumberListCB)(cphs_data->numList, NULL);
}
else
{
if (cphs_data->simStatus EQ SIMOP_READ_OK)
{
/* Read entry of information numbers */
alphaLen = *pData;
if (alphaLen)
{
/* copy/encode entry */
cphs_data->infoEntry->index = recNr;
cphs_data->infoEntry->entryStat = *(pData + 1);
cmhPHB_getMfwTagNt(pData + 2, alphaLen,
cphs_data->infoEntry->alpha.data, &cphs_data->infoEntry->alpha.len);
pData += alphaLen + 2;
if (*pData NEQ 0xFF)
{
cmhPHB_getAdrStr ( (CHAR *)cphs_data->infoEntry->number,
3, /* length of number */
pData + 2,
*pData );
cmhPHB_toaDmrg ( *( pData + 1 ), &type );
cphs_data->infoEntry->ton = cvtTon(type.ton);
cphs_data->infoEntry->npi = cvtNpi(type.npi);
cphs_data->infoEntry->entryStat = cphs_data->infoEntry->entryStat | 0x80;
}
else
{
cphs_data->infoEntry->number[0] = '\0';
cphs_data->infoEntry->ton = CPHS_TON_UNKNOWN;
cphs_data->infoEntry->npi = CPHS_NPI_UNKNOWN;
}
}
cphs_data->infoEntry->result = SIMOP_READ_OK;
if (cphs_data->InfoNumberCB != NULL)
(cphs_data->InfoNumberCB)((T_CPHS_INFO_NUM_LIST*)NULL, cphs_data->infoEntry);
return;
}
else if ((*(pData + 1) & 0x0F) > cphs_data->idxLevel)
{
/* This is not wished index level. Read the next */
recNr++;
Cphs_req_info_num_read(recNr, dataLen);
}
else
{
/* This is the wished index level. Read it. */
alphaLen = *pData;
if (alphaLen) /* check alpha length */
{
/* copy/encode this entry in list */
cphs_data->numList->level = cphs_data->idxLevel;
cphs_data->numList->entry[cphs_data->numList->count].index = recNr;
cphs_data->numList->entry[cphs_data->numList->count].entryStat = *(pData + 1) & 0x7F; /* set bit 8 to 0 */
cmhPHB_getMfwTagNt(pData + 2, alphaLen,
cphs_data->numList->entry[cphs_data->numList->count].alpha.data,
&cphs_data->numList->entry[cphs_data->numList->count].alpha.len);
pData += alphaLen + 2;
if (*pData NEQ 0xFF)
{
cphs_data->numList->entry[cphs_data->numList->count].entryStat = cphs_data->numList->entry[cphs_data->numList->count].entryStat | 0x80;
}
cphs_data->numList->count++;
}
recNr++;
/* Read the next record */
Cphs_req_info_num_read(recNr, dataLen);
}
}
}
/*
+------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_req_info_num_read |
+------------------------------------------------------------------------+
PURPOSE : Read customer service profile
*/
void Cphs_req_info_num_read(UBYTE rcd_num, UBYTE dataLen)
{
TRACE_FUNCTION ("Cphs_req_info_num_read()");
if (rcd_num > cphs_data->maxRec)
{ if (cphs_data->InfoNumberListCB != NULL)
(cphs_data->InfoNumberListCB)(cphs_data->numList, (T_CPHS_INFO_NUM_ENTRY*) NULL);
return;
}
else
{
if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN)
{
if (Cphs_read_sim_rcd(SIM_CPHS_INFN, rcd_num, dataLen))
{
cphs_data->cphsPrevRead = SIM_CPHS_INFN;
}
}
else
{
if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN2)
{
if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, rcd_num, dataLen))
if (cphs_data->InfoNumberListCB != NULL)
(cphs_data->InfoNumberListCB)(cphs_data->numList, (T_CPHS_INFO_NUM_ENTRY*) NULL);
else
{
cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
}
}
}
}
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_build_mbn_data |
+----------------------------------------------------------------------+
PURPOSE : Build mailbox number data in SIM format.
*/
void Cphs_build_mbn_data(UBYTE *data, UBYTE len)
{
UBYTE alphaLen;
UBYTE numLen;
UBYTE *pNumber;
UBYTE i, j;
TRACE_FUNCTION ("Cphs_build_mbn_data()");
memset(data, MFW_INVALID_SIM_DATA, len);
/* alpha data */
if (len <= CPHS_MIN_MBN_SIZE)
alphaLen = 0;
else
alphaLen = len - CPHS_MIN_MBN_SIZE;
i = MINIMUM (alphaLen, cphs_data->vcEntry->alpha.len);
for ( j = 0; j < i; j++ )
data[j] = cphs_data->vcEntry->alpha.data[j];
data += alphaLen;
/* number data and TON/NPI data */
if ( cphs_data->vcEntry->number[0] EQ '+' )
{
cphs_data->vcEntry->ton = TON_International;
pNumber = &cphs_data->vcEntry->number[1];
}
else
pNumber = &cphs_data->vcEntry->number[0];
cmhPHB_getAdrBcd ( data + 2, &numLen,
PHB_MAX_LEN, (CHAR *)pNumber );
*data = numLen + 1;
*(data + 1) = ((( cphs_data->vcEntry -> ton << 4 ) & 0xF0 ) + ( cphs_data->vcEntry -> npi & 0x0F )) | 0x80;
data += 12;
/* capability/configuration identifier data and EXT identifier data */
*data = 0xFF;
*(data + 1) = 0xFF;
}
/*
+--------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_eeprom_mailbox |
+--------------------------------------------------------------------------+
PURPOSE : Read mailbox number from EEPROM
*/
void Cphs_read_eeprom_mailbox(void)
{
U8 version;
#ifdef PCM_2_FFS
EF_MBN mbn;
#else
T_PSPDF_MBN mbn;
#endif
T_ACI_TOA numTp;
int i;
USHORT max_rcd;
TRACE_FUNCTION("Cphs_read_eeprom_mailbox()");
for (i=0; i<MAX_CPHS_ENTRY; i++)
{
//switching from PCM to FFS
#ifdef PCM_2_FFS
if (ffs_fread("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
#else
if (FFS_fread("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
#endif
{
if (mbn.len)
{
cphs_data->mbNum.entries[cphs_data->mbNum.count].index = i+1;
cmhPHB_getAdrStr ( (char *)cphs_data->mbNum.entries[cphs_data->mbNum.count].number,
PHB_MAX_LEN - 1, mbn.mbNum, mbn.len );
cmhPHB_getMfwTagNt ( mbn.alphId, 10,
cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.data,
&cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.len );
cmhPHB_toaDmrg ( mbn.numTp, &numTp );
cphs_data->mbNum.entries[cphs_data->mbNum.count].ton = cvtTon(numTp.ton);
cphs_data->mbNum.entries[cphs_data->mbNum.count].npi = cvtNpi(numTp.npi);
cphs_data->mbNum.entries[cphs_data->mbNum.count].service = i;
cphs_data->mbNum.count++;
}
}
}
}
/*
+---------------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_write_eeprom_mailbox |
+---------------------------------------------------------------------------+
PURPOSE : Write mailbox number in EEPROM
*/
void Cphs_write_eeprom_mailbox(T_CPHS_MAILBOX_NUM_ENTRY *entry)
{
T_ACI_PB_TEXT text;
UBYTE len;
#ifdef PCM_2_FFS
EF_MBN mbn;
#else
T_PSPDF_MBN mbn;
#endif
T_ACI_TOA type;
UBYTE *pNumber;
UBYTE result;
UBYTE outLen;
TRACE_FUNCTION("Cphs_write_eeprom_mailbox");
len = MINIMUM ( MAX_PCM_MAILBOX_LEN, entry->alpha.len);
text.len = len;
memcpy(text.data, entry->alpha.data, len);
text.cs = CS_Sim;
cmhPHB_getMfwTagSim ( &text, mbn.alphId, &outLen, MAX_PCM_MAILBOX_LEN );
if ( entry->number[0] EQ '+')
{
type.ton = TON_International;
pNumber = &entry->number[1];
}
else
{
type.ton = entry->ton;
pNumber = &entry->number[0];
}
type.npi = entry->npi;
//MC- switching from PCM to FFS
cmhPHB_toaMrg ( &type, &mbn.numTp );
cmhPHB_getAdrBcd ((UBYTE*) mbn.mbNum, &mbn.len,
MAX_PCM_MAILBOX_LEN, (CHAR *)pNumber );
mbn.len++;
//if (pcm_WriteRecord((UBYTE *)EF_MBN_ID, (USHORT)entry->index,
// SIZE_EF_MBN, (UBYTE *)&mbn) EQ PCM_OK)
// if (flash_write() EQ EFFS_OK)
#ifdef PCM_2_FFS
if (ffs_fwrite("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
#else
if (FFS_fwrite("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
#endif
cphs_data->mbNum.result = SIMOP_WRITE_OK;
else
cphs_data->mbNum.result = SIMOP_WRITE_ERR;
}
/*
+----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_select_info_num |
+----------------------------------------------------------------------+
PURPOSE : read a information number entry
*/
void Cphs_select_info_num (UBYTE index)
{
TRACE_FUNCTION ("Cphs_select_info_num()");
/* check CPHS service table */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
return ;
/* Read a information number entry.
When this reading failed, send event with "read error" parameter to MMI */
cphs_data->simStatus = SIMOP_READ_OK;
cphs_data->startIdx = index;
// By now we know if 6F19 or EA01 are present for reading info. num entries from
// So lets use this knowledge.
if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN)
{
if (!Cphs_read_sim_rcd(SIM_CPHS_INFN, 1, 0))
{
cphs_data->infoEntry->result = SIMOP_READ_ERR;
//cphs_sign_exec(E_CPHS_GET_INFO_NUM, &infoEntry);
(cphs_data->InfoNumberCB)((T_CPHS_INFO_NUM_LIST*) NULL, cphs_data->infoEntry);
}
else
{
cphs_data->cphsPrevRead = SIM_CPHS_INFN;
}
}
else
{
if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN2)
{
if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, 1, 0))
{
cphs_data->infoEntry->result = SIMOP_READ_ERR;
//cphs_sign_exec(E_CPHS_GET_INFO_NUM, &infoEntry);
(cphs_data->InfoNumberCB)((T_CPHS_INFO_NUM_LIST*)NULL, cphs_data->infoEntry);
}
else
{
cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
}
}
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_ons |
+-----------------------------------------------------------------------+
PURPOSE : Read operator name short form
*/
void Cphs_read_ons(SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
TRACE_FUNCTION ("Cphs_read_ons()");
ptr = data;
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
// dataLen < MFW_CPHS_ONS_SIZE )
dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
{
cphs_data->opName.long_name.len = 0;
}
else
{
cmhPHB_getMfwTagNt(ptr, (UBYTE)MINIMUM(LONG_NAME, dataLen),
cphs_data->opName.long_name.data, &cphs_data->opName.long_name.len);
//cphs_data->opName.long_name.dcs = MFW_DCS_SIM;
/* Read operator name shortform */
if ((cphs_data->cphsPhase NEQ 2) OR
(Cphs_ssc(CHPS_NAME_SHORT, cphs_data->cphsServTab) NEQ ALLOCATED_AND_ACTIVATED) OR
!Cphs_read_sim_dat(SIM_CPHS_ONSHF, NOT_PRESENT_8BIT, CPHS_ONSF_SIZE) )
{
cphs_data->opName.short_name.len = 0;
}
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_onsf |
+-----------------------------------------------------------------------+
PURPOSE : Read operator name short form
*/
void Cphs_read_onsf(SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
TRACE_FUNCTION ("Cphs_read_onsf()");
ptr = data;
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
dataLen < CPHS_ONSF_SIZE )
{
cphs_data->opName.short_name.len = 0;
}
else
{
cmhPHB_getMfwTagNt(ptr, CPHS_ONSF_SIZE,
cphs_data->opName.short_name.data, &cphs_data->opName.short_name.len);
//cphs_data->opName.shortName.dcs = MFW_DCS_SIM;
}
//cphs_sign_exec(E_CPHS_OP_NAME, &opName);
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cvtTon |
+-----------------------------------------------------------------------+
PURPOSE : Convert Type of Number
*/
T_CPHS_PHB_TON cvtTon(T_ACI_TOA_TON ton)
{
switch (ton)
{
case TON_NotPresent:
case TON_Unknown: return CPHS_TON_UNKNOWN;
case TON_International: return CPHS_TON_INTERNATIONAL;
case TON_National: return CPHS_TON_NATIONAL;
case TON_NetSpecific: return CPHS_TON_NET_SPECIFIC;
case TON_DedAccess: return CPHS_TON_DED_ACCESS;
case TON_Alphanumeric: return CPHS_TON_ALPHA_NUMERIC;
case TON_Abbreviated: return CPHS_TON_ABBREVIATED;
case TON_Extended: return CPHS_TON_EXTENDED;
default: return ton;
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_read_mbn |
+-----------------------------------------------------------------------+
PURPOSE : Read mailbox number into runtime variables
*/
void Cphs_read_mbn(SHORT table_id)
{
UBYTE* pData; /* points to data buffer */
UBYTE alphaLen;
UBYTE dataLen;
UBYTE recNr;
T_ACI_TOA type;
TRACE_FUNCTION ("Cphs_read_mbn()");
pData = simShrdPrm.atb[table_id].exchData;
dataLen = simShrdPrm.atb[table_id].dataLen;
recNr = simShrdPrm.atb[table_id].recNr;
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR OR
#endif
pData EQ NULL OR
dataLen < CPHS_MIN_MBN_SIZE )
{//MC FFS ?
/* if (recNr <= 1)
{
Cphs_read_eeprom_mailbox();
return;
}
else
cphs_sign_exec(E_CPHS_GET_VC_NUM, &mbNum);*/
TRACE_EVENT("MB read error");
return;
}
else /* no read error */
{
if (recNr EQ 1)
{
cphs_data->maxRec = simShrdPrm.atb[table_id].recMax;
}
alphaLen = dataLen - CPHS_MIN_MBN_SIZE;
/* Copy/encode data */
if (*(pData + alphaLen + 2) NEQ 0xFF)
{
cphs_data->mbNum.entries[cphs_data->mbNum.count].index = recNr;
cmhPHB_getMfwTagNt(pData, alphaLen,
cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.data,
&cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.len);
pData += alphaLen;
cmhPHB_getAdrStr ( (CHAR *)cphs_data->mbNum.entries[cphs_data->mbNum.count].number,
PHB_MAX_LEN - 1,
pData + 2,
*pData );
cmhPHB_toaDmrg ( *( pData + 1 ), &type );
cphs_data->mbNum.entries[cphs_data->mbNum.count].ton = cvtTon(type.ton);
cphs_data->mbNum.entries[cphs_data->mbNum.count].npi = cvtNpi(type.npi);
pData += 12;
if ( *pData NEQ 0xFF )
{
/* read bearer capability EF */
/* return; */
}
cphs_data->mbNum.count++;
cphs_data->mbNum.result = SIMOP_READ_OK;
}
recNr++;
if (recNr > cphs_data->maxRec)
{ TRACE_FUNCTION("got CPHS Mailbox nos");
Cphs_operator_name();//get next CPHS item
return;
}
if (recNr <= cphs_data->maxRec)
{
/* Read the next entry */
Cphs_read_sim_rcd(SIM_CPHS_MBXN, recNr, dataLen);
}
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_mbs |
+-----------------------------------------------------------------------+
PURPOSE : Read voice message waiting flag
*/
void Cphs_read_mbs(SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
int i; /* PATCH VO 22.01.01 */
char debug[50];
TRACE_FUNCTION ("Cphs_read_mbs()");
ptr = data;
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
//dataLen < MFW_CPHS_MBS_SIZE )
dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
{
cphs_data->mbStatus.result = SIMOP_READ_ERR;
}
else
{
sprintf(debug, "Retrieved mailbox status: %x%x",ptr[0],ptr[1]);
TRACE_EVENT(debug);
memset(&cphs_data->mbStatus, CPHS_FLAG_NOT_PRESENT, sizeof(cphs_data->mbStatus));
cphs_data->mbStatus.result = SIMOP_READ_OK;
for (i=0; i<dataLen; i++)
{
switch (i)
{
case 0:
cphs_data->mbStatus.line1 = ptr[i] & 0x0F/*0x01*/;
cphs_data->mbStatus.line2 = ( ptr[i] >> 4 ) & 0x0F/*0x01*/;
break;
case 1:
cphs_data->mbStatus.fax = ptr[i] & 0x0F/*0x01*/;
cphs_data->mbStatus.data = ( ptr[i] >> 4 ) & 0x0F/*0x01*/;
break;
default:
break;
}
}
/* PATCH VO 22.01.01 END */
//Not sure about this
//memcpy(cphs_data->mbsData, ptr, CPHS_MBS_SIZE);
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_cff |
+-----------------------------------------------------------------------+
PURPOSE : Read call forwarding flag
*/
void Cphs_read_cff(SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
int i; /* PATCH VO 22.01.01 */
char debug[50];
TRACE_EVENT ("Cphs_read_cff()");
ptr = data;
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
//dataLen < MFW_CPHS_CFF_SIZE )
dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
{
cphs_data->dvStatus.result = SIMOP_READ_ERR;
}
else
{
sprintf(debug, "Retrieved divert status: %x%x",ptr[0],ptr[1]);
TRACE_EVENT(debug);
memset(&cphs_data->dvStatus, CPHS_FLAG_NOT_PRESENT, sizeof(cphs_data->dvStatus));
cphs_data->dvStatus.result = SIMOP_READ_OK;
for (i=0; i<dataLen; i++)
{
switch (i)
{
case 0:
cphs_data->dvStatus.line1 = ptr[i] & /*0x0F*/0x01;
cphs_data->dvStatus.line2 = ( ptr[i] >> 4 ) & /*0x0F*/0x01;
break;
case 1:
cphs_data->dvStatus.fax = ptr[i] & /*0x0F*/0x01;
cphs_data->dvStatus.data = ( ptr[i] >> 4 ) & /*0x0F*/0x01;
break;
default:
break;
}
}
/* PATCH VO 22.01.01 END */
//not sure about this bit
//memcpy(cphs_data->dvData, ptr, CPHS_CFF_SIZE);
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_read_csp |
+-----------------------------------------------------------------------+
PURPOSE : Read customer service profile
*/
void Cphs_read_csp(SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
UBYTE flag;
int i;
TRACE_FUNCTION ("Cphs_read_csp()");
ptr = data;
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
// dataLen < MFW_CPHS_CSP_SIZE )
dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
{
if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Used for read information numbers */
{
cphs_data->simStatus = SIMOP_UNKNOWN;
//cphs_sign_exec(E_CPHS_GET_INFO_LIST, &numList);
}
else
{
cphs_data->csProfile.result = SIMOP_READ_ERR;
memset(cphs_data->csProfile.csp, 0, sizeof(cphs_data->csProfile.csp));
//cphs_sign_exec(E_CPHS_GET_CSP, &csProfile);
if (cphs_data->RefreshCB != NULL)
(cphs_data->RefreshCB)(NULL, NULL);
}
}
else
{
if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Used for read information numbers */
{
cphs_data->simStatus = SIMOP_UNKNOWN;
/* check the service group code */
flag = 0;
//for (i = 0; i < MFW_CPHS_CSP_SIZE; i += 2)
for (i = 0; i < dataLen; i += 2) /* PATCH VO 22.01.01: use the actual length in the SIM card */
{
if (ptr[i] EQ 0xD5 AND ptr[i+1] EQ 0xFF)
flag = 1;
}
if (!flag)
{
// cphs_sign_exec(E_CPHS_GET_INFO_LIST, &numList);
return;
}
/* Read the first information numbers record */
if (!Cphs_read_sim_rcd(SIM_CPHS_INFN, 1, 0))
{ //cphs_sign_exec(E_CPHS_GET_INFO_LIST, &numList);
TRACE_EVENT("Can't read info num rcd");
return;
}
else
cphs_data->cphsPrevRead = SIM_CPHS_INFN;
}
else
{
cphs_data->csProfile.result = SIMOP_READ_OK;
TRACE_EVENT("CPHS valid CSP");
//memcpy(cphs_data->csProfile.csp, ptr, sizeof(cphs_data->csProfile.csp));
for (i=0; i<(dataLen/2); i++)
{
cphs_data->csProfile.csp[i].group_code = ptr[2*i];
cphs_data->csProfile.csp[i].services =ptr[2*i + 1];
}
if (cphs_data->RefreshCB != NULL)
(cphs_data->RefreshCB)(NULL, NULL);
// cphs_sign_exec(E_CPHS_GET_CSP, &cphs_data->csProfile);
}
}
}
void Cphs_read_information(SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
UBYTE len;
TRACE_FUNCTION ("Cphs_read_information()");
ptr = data;
len = dataLen;
memset(cphs_data->cphsServTab, 0, sizeof(cphs_data->cphsServTab));
/* PATCH VO 22.01.01 END */
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
//dataLen < MFW_CPHS_INFO_SIZE)
dataLen <= 0) /* PATCH VO 22.01.01: not check a certain length */
{
cphs_data->cphsStatus = CPHS_NOT_PRESENT;
//cphs_sign_exec(E_CPHS_IND, &cphsStatus);
}
else
{
cphs_data->cphsPhase = *ptr;
len--;
if (len > 0)
{
ptr++;
memcpy (cphs_data->cphsServTab, ptr, MINIMUM(len, CPHS_SERVICE_TABLE));
}
/* PATCH VO 22.01.01 END */
cphs_data->cphsStatus = CPHS_IS_OK;
TRACE_EVENT("CPHS supported");
//cphs_sign_exec(E_CPHS_IND, &cphsStatus);
}
}
#ifdef FRED //commented this func out because of build problems
#ifdef SIM_TOOLKIT
/*
+---------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : Cphs_update_info_cnf |
+---------------------------------------------------------------------+
PURPOSE : call back for SIM file read
*/
void Cphs_update_info_cnf (SHORT errCode, UBYTE *data, UBYTE dataLen)
{
UBYTE *ptr;
TRACE_FUNCTION ("Cphs_update_info_cnf()");
cphs_data->cphsUpdate = FALSE; /* reset flag */
ptr = data;
#ifdef FF_2TO1_PS
if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
#else
if ( errCode NEQ SIM_NO_ERROR OR
#endif
ptr EQ NULL OR
dataLen < CPHS_INFO_SIZE)
{
satUpdateFiles(TRUE, SIM_CPHS_CINF);
}
else
{
cphs_data->cphsPhase = *ptr;
ptr++;
memcpy (cphs_data->cphsServTab, ptr, CPHS_SERVICE_TABLE*sizeof(UBYTE));
cphs_data->cphsStatus = CPHS_IS_OK;
satUpdateFiles ( TRUE, SIM_CPHS_CINF );
}
}
#endif
#endif
BOOL Cphs_write_sim_dat(USHORT data_id, UBYTE *data, UBYTE length)
{
T_ACI_RETURN res;
TRACE_FUNCTION ("Cphs_write_sim_dat()");
res = cmhSIM_WriteTranspEF (CMD_SRC_NONE,
AT_CMD_NONE,
data_id,
0,
length,
data,
Cphs_write_sim_dat_cb);
if (res NEQ AT_EXCT)
return FALSE;
return TRUE;
}
/*
+----------------------------------------------------------------------+
| MODULE: CPHS standalone module |
| STATE : code ROUTINE: Cphs_write_sim_dat_cb |
+----------------------------------------------------------------------+
PURPOSE : callback of SIM card writing.
*/
void Cphs_write_sim_dat_cb(SHORT table_id)
{
UBYTE result;
char debug[30];
TRACE_FUNCTION ("sim_write_sim_dat_cb()");
sprintf(debug, "SIM Error code!!!%d", simShrdPrm.atb[table_id].errCode);
TRACE_EVENT(debug);
switch (simShrdPrm.atb[table_id].reqDataFld)
{
case SIM_CPHS_VMW: /* voice message waiting flag */
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
#else
if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
#endif
{
cphs_data->mbStatus.result = SIMOP_WRITE_OK;
}
else
{
cphs_data->mbStatus.result = SIMOP_WRITE_ERR;
}
break;
case SIM_CPHS_CFF: /* call forwarding flag */
#ifdef FF_2TO1_PS
if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
#else
if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
#endif
{
cphs_data->dvStatus.result = SIMOP_WRITE_OK;
TRACE_EVENT("Divert Write successful");
}
else
{
cphs_data->dvStatus.result = SIMOP_WRITE_ERR;
TRACE_EVENT("Divert Write Failed");
}
break;
default:
break;
}
simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_read_eeprom_als |
+-----------------------------------------------------------------------+
PURPOSE : Read alternate line service information from EEPROM
*/
T_CPHS_RET Cphs_read_eeprom_als(T_CPHS_ALS_INFO* info)
{ char read_result;
char debug[50];
#ifdef PCM_2_FFS
read_result =ffs_fread("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
#else
read_result =FFS_fread("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
#endif
if (read_result == EFFS_OK)
{ info->result = SIMOP_READ_OK;
return CPHS_IS_OK;
}
else
{ info->result = SIMOP_READ_ERR;
sprintf(debug, "ALS info read error:%d", read_result);
TRACE_EVENT(debug);
return CPHS_SIM_READ_ERROR;
}
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_write_eeprom_als |
+-----------------------------------------------------------------------+
PURPOSE : Write selected alternate line/lock status in EEPROM
*/
T_CPHS_RET Cphs_write_eeprom_als(T_CPHS_ALS_INFO* info)
{ char write_result;
T_ACI_ALS_MOD alsMode;
T_CPHS_RET return_result;
#ifdef PCM_2_FFS
write_result =ffs_fwrite("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
#else
write_result =FFS_fwrite("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
#endif
if (write_result >= EFFS_OK)
{ info->result = SIMOP_WRITE_OK;
return_result = CPHS_IS_OK;
TRACE_EVENT("ALS info write OK");
}
else
{ info->result = SIMOP_WRITE_ERR;
return_result = CPHS_SIM_WRITE_ERROR;
TRACE_EVENT("ALS info write error");
}
if (cphs_data->alsStatus.line EQ CPHS_LINE_INDEX_LINE1)
alsMode = ALS_MOD_SPEECH;
if (cphs_data->alsStatus.line EQ CPHS_LINE_INDEX_LINE2)
alsMode = ALS_MOD_AUX_SPEECH;
sAT_PercentALS(CMD_SRC_LCL, alsMode);
return return_result;
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_write_eeprom_als_desc |
+-----------------------------------------------------------------------+
PURPOSE : Write ALS line description in EEPROM
*/
void Cphs_write_eeprom_als_desc(T_CPHS_ALS_LINE* line)
{ char write_result = -1;
T_CPHS_ALS_LINE* desc;
if (line->line EQ CPHS_LINE_INDEX_LINE1)
{ desc = &cphs_data->Line1_desc;
#ifdef PCM_2_FFS
write_result =ffs_fwrite("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
#else
write_result =FFS_fwrite("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
#endif
}
if (line->line EQ CPHS_LINE_INDEX_LINE2)
{ desc = &cphs_data->Line2_desc;
#ifdef PCM_2_FFS
write_result =ffs_fwrite("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
#else
write_result =FFS_fwrite("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
#endif
}
if (write_result >= EFFS_OK)
desc->result = SIMOP_WRITE_OK;
else
desc->result = SIMOP_WRITE_ERR;
}
/*
+-----------------------------------------------------------------------+
| MODULE : CPHS standalone module |
| STATE : code ROUTINE : cphs_read_eeprom_als_desc |
+-----------------------------------------------------------------------+
PURPOSE : read ALS line description from EEPROM
*/
void Cphs_read_eeprom_als_desc()
{ char read_result = -1;
T_CPHS_ALS_LINE* desc;
#ifdef PCM_2_FFS
read_result =ffs_fread("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
#else
read_result =FFS_fread("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
#endif
if (read_result >= EFFS_OK)
cphs_data->Line1_desc.result = SIMOP_READ_OK;
else
cphs_data->Line1_desc.result = SIMOP_READ_ERR;
#ifdef PCM_2_FFS
read_result =ffs_fread("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
#else
read_result =FFS_fread("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
#endif
if (read_result EQ EFFS_OK)
cphs_data->Line2_desc.result = SIMOP_READ_OK;
else
cphs_data->Line2_desc.result = SIMOP_READ_ERR;
}
void Cphs_get_info_num (UBYTE level, UBYTE startIndex)
{
UBYTE res;
TRACE_FUNCTION ("cphs_get_info_num()");
/* check CPHS service table */
if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
return;
if (level < 1 OR
startIndex < 1 )
return;
/* check CPHS service table for customer service profile */
/* res = Cphs_ssc(CPHS_CSP, cphs_data->cphsServTab);
if ( res NEQ ALLOCATED_AND_ACTIVATED)
return;*/
/* check CPHS service table for information numbers */
/* res = Cphs_ssc(CHPS_INFO_NUMBERS, cphs_data->cphsServTab);
if ( res NEQ ALLOCATED_AND_ACTIVATED)
return;*/
/* Read customer service profile to check
whether information numbers are supported. */
cphs_data->numList->count = 0;
cphs_data->idxLevel = level;
cphs_data->startIdx = startIndex;
cphs_data->simStatus = SIMOP_READ_OK;
if (!Cphs_read_sim_dat(SIM_CPHS_CSP, NOT_PRESENT_8BIT, CPHS_CSP_SIZE))
{
cphs_data->simStatus = SIMOP_UNKNOWN;
TRACE_EVENT("FAiled in reading CSP for Info nums");
return;
}
return;
}
/* checks the lock status of the given lock type. On successfull check */
/* the status will be returned. If an error occured SIMLOCK_FAIL will */
T_SIMLOCK_RET simlock_checkLock ( T_SIMLOCK_TYPE type )
{
return SIMLOCK_FAIL;
}