FreeCalypso > hg > fc-magnetite
diff src/g23m-aci/aci/ati_phb.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2016 02:02:43 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/aci/ati_phb.c Tue Oct 11 02:02:43 2016 +0000 @@ -0,0 +1,1412 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-F&D (8411) +| Modul : ATI ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : AT commands related to phonebook. ++----------------------------------------------------------------------------- +*/ + +#ifndef ATI_PHB_C +#define ATI_PHB_C + +#undef DUMMY_ATI_STRINGS + +#include "aci_all.h" + +#include "aci_lst.h" +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_io.h" +#include "aci_cmd.h" +#include "l4_tim.h" +#include "phb.h" + +#ifdef FAX_AND_DATA +#include "aci_fd.h" +#endif /* of #ifdef FAX_AND_DATA */ + +#include "aci_mem.h" +#include "psa.h" +#include "cmh.h" +#include "pcm.h" +#include "aci_prs.h" + +#include "ati_int.h" + +#ifdef FF_ATI_BAT + +#include "typedefs.h" +#include "gdd.h" +#include "bat.h" + +#include "ati_bat.h" + +#endif /* FF_ATI_BAT */ + +/* Global variables for reading PHB entries */ +LOCAL SHORT phb_start_idx, phb_stop_idx; + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : atPlusCPBS | ++--------------------------------------------------------------------+ + + PURPOSE : +CPBS (Select Phonebook memory storage) +*/ + +GLOBAL T_ATI_RSLT setatPlusCPBS(char *cl, UBYTE srcId) +{ + T_ACI_RETURN ret = AT_FAIL; + T_ACI_PB_STOR stor = PB_STOR_NotPresent; + CHAR pin2[MAX_PWD_LENGTH] = {0}; + CHAR sto_str[3]={0}; + SHORT i; + + TRACE_FUNCTION("setatPlusCPBS()"); + + cl = parse(cl,"sn",(LONG)3,sto_str,(LONG)MAX_PWD_LENGTH,pin2); + if(!cl OR *sto_str EQ '\0') + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + strupper(sto_str); + for(i=0;phb_mem_names[i].name NEQ 0;i++) + { + if (!strcmp(phb_mem_names[i].name,sto_str) ) + { + stor=phb_mem_names[i].stor; + break; + } + } + if(phb_mem_names[i].name EQ 0) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_cpbs my_bat_set_plus_cpbs = {0}; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCPBS() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBS; + cmd.params.ptr_set_plus_cpbs = &my_bat_set_plus_cpbs; + + my_bat_set_plus_cpbs.storage = (T_BAT_storage)stor; + + src_params->curAtCmd = AT_CMD_CPBS; + srcId_cb = srcId; + bat_send(ati_bat_get_client(srcId), &cmd); + srcId_cb = srcId; + return ATI_EXCT; /* executing, because response is passed by callback function */ + } +#else /* no FF_ATI_BAT */ + ret = sAT_PlusCPBS((T_ACI_CMD_SRC)srcId,stor,pin2); + if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + } + + return (map_aci_2_ati_rslt(ret)); +#endif /* no FF_ATI_BAT */ +} + + +GLOBAL T_ATI_RSLT queatPlusCPBS(char *cl, UBYTE srcId) +{ +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + TRACE_FUNCTION("queatPlusCPBS() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_QUE_PLUS_CPBS; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_que_plus_cpbs = &dummy; + bat_send(ati_bat_get_client(srcId), &cmd); + return ATI_EXCT; /* executing, because response is passed by callback function */ + } +#else /* no FF_ATI_BAT */ + + T_ACI_RETURN ret = AT_FAIL; + T_ACI_PB_STOR stor; + SHORT used; + SHORT total; + SHORT i; + + TRACE_FUNCTION("queatPlusCPBS()"); + + ret = qAT_PlusCPBS((T_ACI_CMD_SRC)srcId,&stor,&used,&total); + if (ret EQ AT_CMPL) + { + for(i=0;phb_mem_names[i].name NEQ NULL;i++) + { + if (phb_mem_names[i].stor EQ stor) + { + sprintf(g_sa,"+CPBS: \"%s\",%d,%d",phb_mem_names[i].name,used,total); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + break; + } + } + } + else if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); +#endif /* no FF_ATI_BAT */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : queatPercentCPBS | ++--------------------------------------------------------------------+ + + PURPOSE : %CPBS (Phonebook memory storage) +*/ +GLOBAL T_ATI_RSLT queatPercentCPBS(char *cl, UBYTE srcId) +{ +#ifdef FF_ATI_BAT + + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + TRACE_FUNCTION("queatPercentCPBS() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params=BAT_CMD_QUE_PERCENT_CPBS; + dummy.bat_dummy=0xFF; + cmd.params.ptr_que_percent_cpbs=&dummy; + + bat_send(ati_bat_get_client(srcId),&cmd); + + /* + * Return value indicates executing, the response will come via + * the callback function. + */ + return(ATI_EXCT); + +#else /* FF_ATI_BAT */ + + char *me="%CPBS: "; + T_ACI_RETURN ret; + T_ACI_PB_STOR stor; + SHORT used,total,first,i; + SHORT used_ext, total_ext; + + TRACE_FUNCTION("queatPercentCPBS()"); + + /* + * Call the corresponding ACI function. + */ + ret=qAT_PercentCPBS ((T_ACI_CMD_SRC)srcId, + &stor, + &used, &total, + &first, + &used_ext, &total_ext); + + /* + * If the query completes successfully, build and send the + * answer. + */ + if (ret EQ AT_CMPL) + { + /* + * Run through the list of names to get the name of the + * currently selected phonebook. + */ + for(i=0;phb_mem_names[i].name NEQ NULL;i++) + { + if (phb_mem_names[i].stor EQ stor) + { + sprintf (g_sa,"%s\"%s\",%d,%d,%d,%d,%d", me, phb_mem_names[i].name, + used, total, + first, + used_ext, total_ext); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + break; + } + } + } + + return (map_aci_2_ati_rslt(ret)); + +#endif /* FF_ATI_BAT */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : atPlusCPBW | ++--------------------------------------------------------------------+ + + PURPOSE : +CPBW (Write Phonebook entry) +*/ +GLOBAL T_ATI_RSLT setatPlusCPBW(char *cl, UBYTE srcId) +{ + + UBYTE pb_status; + T_ACI_RETURN ret = AT_FAIL; + CHAR *p_number = NULL; + CHAR text [MAX_ALPHA_LEN * 4] = {0x00}; + USHORT lenText = 0; + T_ACI_TOA *p_toa = NULL, + type; + + SHORT toa_val = 0, + index = -1; +#ifndef FF_ATI_BAT + T_ACI_PB_TEXT *p_text = NULL; + T_ACI_PB_TEXT cvtdText; + USHORT lenCvtd = 0; + T_ACI_VP_ABS dmyDateTime; +#endif /* !FF_ATI_BAT */ + + T_ACI_PB_STOR stor; + SHORT used; + SHORT total; + CHAR numBuf[MAX_PHB_NUM_LEN]; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + memset( numBuf, 0, sizeof(numBuf)); + + TRACE_FUNCTION("setatPlusCPBW()"); + + + ret = qAT_PlusCPBS((T_ACI_CMD_SRC)srcId,&stor,&used,&total); + TRACE_EVENT_P1("Current phonebook storage: %d", stor); + +#ifdef TI_PS_FFS_PHB + if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + return ATI_FAIL; + } +#endif + + if (ret EQ AT_CMPL AND + stor EQ PB_STOR_Ed) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + + if ( ati_user_output_cfg[srcId].cscsChset EQ CSCS_CHSET_Gsm) + { + cl=parse(cl,"rsrz", + &index, + (LONG)MAX_PHB_NUM_LEN, + numBuf, + &toa_val, + (LONG)MAX_ALPHA_LEN, + strlen(cl), + cl, + &lenText, + text); + } + else + { + cl=parse(cl,"rsrz", + &index, + (LONG)MAX_PHB_NUM_LEN, + numBuf, + &toa_val, + (LONG)MAX_ALPHA_LEN * 4, + strlen(cl), + cl, + &lenText, + text); + } + + if(!cl) + { + TRACE_ERROR("ERROR: parsing failed !!!"); + index = get_parse_index(); /* get the problematic component */ + switch (index) + { + case 2: /* component 2 is the number */ + cmdCmeError(CME_ERR_DialToLong); + break; + case 4: /* component 4 is the alpha tag */ + cmdCmeError(CME_ERR_TxtToLong); + break; + default: + cmdCmeError(CME_ERR_OpNotAllow); + break; + } + return ATI_FAIL; + } + + /* If the phonebook status is not PHB_READY then SIM BUSY error is indicated to the user.*/ + pb_status_req(&pb_status); /* get phone book status */ + + TRACE_EVENT_P1("Current phonebook status: %d", pb_status); + if (pb_status NEQ PHB_READY) + { + if(pb_status EQ PHB_BUSY) + { + TRACE_EVENT("Error: Phonebook is busy accessing the SIM"); + cmdCmeError(CME_ERR_SimBusy); + } + else if(pb_status EQ PHB_UNKNOWN) + { + TRACE_EVENT("Error: Phonebook status unknown"); + cmdCmeError(CME_ERR_Unknown); + } + return ATI_FAIL; + } + + if( index > total) /* phonebook index is greater than max. */ + { /* possible index of SIM */ + TRACE_EVENT("Error: phonebook index is greater than max possible index of SIM"); + cmdCmeError(CME_ERR_InvIdx); + return ATI_FAIL; + } + + if (toa_val > 0) + { + type=toa_demerge(toa_val); + p_toa=&type; + } + else + p_toa=NULL; + + if (numBuf[0] EQ '\0') + p_number=NULL; + else + p_number=numBuf; + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_cpbw my_bat_set_plus_cpbw = {0}; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCPBW() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBW; + cmd.params.ptr_set_plus_cpbw = &my_bat_set_plus_cpbw; + + my_bat_set_plus_cpbw.index = (S16)index; + + /* Load the phone number in BAT struct - if there is one */ + if (p_number) + { + if (strlen(p_number)>BAT_MAX_CPBW_NUMBER_LEN) + { + /* + * If the number is too big for the BAT structure we can't do + * anything meaningful, so get out now. + */ + cmdCmeError(CME_ERR_Unknown); + return ATI_FAIL; + } + + my_bat_set_plus_cpbw.c_number = strlen(p_number); + my_bat_set_plus_cpbw.v_number = TRUE; + memcpy(my_bat_set_plus_cpbw.number, p_number,BAT_MAX_CPBW_NUMBER_LEN); + } + else + { + my_bat_set_plus_cpbw.v_number = FALSE; + } + + /* + * Load the associated text in BAT struct - if there is any + */ + if ((lenText EQ 0) AND (p_number EQ NULL)) + { + my_bat_set_plus_cpbw.v_text = FALSE; + } + else + { + /* + * If the associated text is too big for the BAT structure it + * will be truncated. + */ + if (lenText>BAT_MAX_CPBW_TEXT_LEN) + my_bat_set_plus_cpbw.c_text = BAT_MAX_CPBW_TEXT_LEN; + else + my_bat_set_plus_cpbw.c_text = (U8)lenText; + + my_bat_set_plus_cpbw.v_text = TRUE; + memcpy(my_bat_set_plus_cpbw.text, text, BAT_MAX_CPBW_TEXT_LEN); + } + + /* Load type as string input */ + if (p_toa) + my_bat_set_plus_cpbw.type = (S16)toa_val; + else + my_bat_set_plus_cpbw.type = (S16)-1; + + src_params->curAtCmd = AT_CMD_CPBW; + srcId_cb = srcId; + bat_send(ati_bat_get_client(srcId), &cmd); + + return ATI_EXCT; /* executing, because response is passed by callback function */ + } + +#else /* no FF_ATI_BAT */ + + if( lenText NEQ 0 ) + { + srcId_cb = srcId; + utl_chsetToSim ((UBYTE*)text, lenText, (UBYTE*)cvtdText.data, + &lenCvtd, GSM_ALPHA_Def); + } + cvtdText.cs = CS_Sim; + + /* when the text and the number are both empty, set p_text to NULL */ + if (lenCvtd EQ 0 AND p_number EQ NULL) + { + p_text = NULL; + } + else + { + p_text = &cvtdText; + cvtdText.len = (UBYTE)lenCvtd; + } + + ret = sAT_PlusCPBW((T_ACI_CMD_SRC)srcId, index, p_number, p_toa, p_text, &dmyDateTime); + switch (ret) + { + case AT_FAIL: + switch (ACI_ERR_DESC_CLASS( aciErrDesc )) + { + case ACI_ERR_CLASS_Cme: + cmdCmeError( (T_ACI_CME_ERR)ACI_ERR_DESC_NR( aciErrDesc ) ); + break; + case ACI_ERR_CLASS_Cms: + case ACI_ERR_CLASS_Ceer: + case ACI_ERR_CLASS_Ext: + default: + cmdCmeError(CME_ERR_Unknown); + break; + } + break; + case AT_EXCT: + src_params->curAtCmd = AT_CMD_CPBW; + break; + + case AT_BUSY: + cmdCmeError(CME_ERR_SimBusy); + break; + } + return (map_aci_2_ati_rslt(ret)); +#endif /* no FF_ATI_BAT */ +} + +GLOBAL T_ATI_RSLT tesatPlusCPBW(char *cl, UBYTE srcId) +{ +#ifdef FF_ATI_BAT + + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + TRACE_FUNCTION("queatPlusCPBW() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_TST_PLUS_CPBW; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_tst_plus_cpbw = &dummy; + + bat_send(ati_bat_get_client(srcId), &cmd); + + return ATI_EXCT; /* executing, because response is passed by callback function */ + +#else /* no FF_ATI_BAT */ + + char *me = "+CPBW: "; + T_ACI_RETURN ret = AT_FAIL; + + SHORT first_idx, + last_idx; + UBYTE nlength, + tlength; + CHAR numBuf[MAX_PHB_NUM_LEN]; + + memset( numBuf, 0, sizeof(numBuf)); + + TRACE_FUNCTION("tesatPlusCPBW()"); + + ret = tAT_PlusCPBW((T_ACI_CMD_SRC)srcId,&first_idx,&last_idx,&nlength,&tlength); + if(ret EQ AT_CMPL) + { + sprintf(g_sa,"%s(%d-%d),%d,%s,%d",me,first_idx,last_idx,nlength,"(128-201)",tlength); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + } + else + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); +#endif /* no FF_ATI_BAT */ +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ACI_CMD | +| STATE : code ROUTINE : cmd_readCPBRBlock | ++-------------------------------------------------------------------+ + + PURPOSE : This is the functional counterpart of the +CPBR + AT command which is responsible for reading phonebook + entries from memory, 5 at a time. + + */ +GLOBAL T_ACI_RETURN cmd_readCPBRBlock ( UBYTE srcId) +{ + CHAR cvtdText[4*MAX_ALPHA_LEN] = {0x00}; /* need enough space for UCS2 strings */ + USHORT lenCvtdText = 0; + USHORT pos = 0; + SHORT last_idx = ACI_NumParmNotPresent; + SHORT i; + T_ACI_PB_LST pblst; + UBYTE type; + T_ACI_RETURN ret = AT_FAIL; + + TRACE_FUNCTION ("cmd_readCPBRBlock ()"); + + ret = sAT_PlusCPBR((T_ACI_CMD_SRC) srcId,phb_start_idx,phb_stop_idx,&last_idx,pblst); + + if (ret EQ AT_CMPL) + { + for ( i = 0; + i < MAX_PB_ENTR; + i++ ) + { + if(pblst[i].index EQ ACI_NumParmNotPresent) + { + break; /* All entries are read */ + } + + type = toa_merge(pblst[i].type); + + pos=sprintf(g_sa,"+CPBR: %d,\"%s\",%d,", + pblst[i].index, + pblst[i].number, + type); + + srcId_cb = srcId; + utl_chsetFromSim((UBYTE*)pblst[i].text.data, + pblst[i].text.len, + (UBYTE*)cvtdText, + sizeof(cvtdText), + &lenCvtdText, + GSM_ALPHA_Def); + + pos+=sprints(g_sa+pos,cvtdText,lenCvtdText); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + } + + phb_start_idx = last_idx; + + /* To read next entry */ + phb_start_idx++; + + if(phb_start_idx EQ (phb_stop_idx + 1)) + { + return AT_CMPL; + } + else + { + /* Still entries to read */ + return AT_EXCT; + } + } + else + { + cmdCmeError(CME_ERR_Unknown); + return AT_FAIL; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ACI_CMD | +| STATE : code ROUTINE : cmd_PlusCPBR_CB | ++-------------------------------------------------------------------+ + + PURPOSE : This is the functional counterpart of the +CPBR + AT command which is responsible for reading phonebook + entries from memory. + + This is a callback function for reading remaining + phonebook entries called from sap_dti.c. + This function reads 5 entries from where the last + reading had stopped. +*/ +GLOBAL void cmd_PlusCPBR_CB ( UBYTE srcId) +{ + T_ACI_RETURN ret; + + TRACE_FUNCTION ("cmd_PlusCPBR_CB()"); + + /* Call cmd_readCPBRBlock() + when still entries are to be read */ + if(phb_stop_idx >= phb_start_idx) + { + ret = cmd_readCPBRBlock(srcId); + + switch(ret) + { + case AT_EXCT: + /* Still entries to read */ + return; + + case AT_CMPL: + /* All the entries are read */ + R_AT( RAT_OK, (T_ACI_CMD_SRC) srcId ) + (AT_CMD_CPBR); + break; + + default: + /* Failed to read entries */ + R_AT( RAT_CME, (T_ACI_CMD_SRC) srcId ) + ( AT_CMD_CPBR, CME_ERR_Unknown); + } + } +} +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : atPlusCPBR | ++--------------------------------------------------------------------+ + + PURPOSE : +CPBR (Read Phonebook Entry) +*/ + +GLOBAL T_ATI_RSLT setatPlusCPBR(char *cl, UBYTE srcId) +{ + T_ACI_RETURN ret; + + TRACE_FUNCTION("setatPlusCPBR()"); + + phb_start_idx = ACI_NumParmNotPresent; + phb_stop_idx = ACI_NumParmNotPresent; + + cl = parse(cl,"rr",&phb_start_idx,&phb_stop_idx); + if(!cl OR phb_start_idx > MAX_PB_INDEX OR phb_start_idx < 0 OR phb_stop_idx > MAX_PB_INDEX) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + if(phb_stop_idx EQ ACI_NumParmNotPresent) + { + phb_stop_idx=phb_start_idx; + } + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_cpbr my_bat_set_plus_cpbr = {0}; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCPBR() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBR; + cmd.params.ptr_set_plus_cpbr = &my_bat_set_plus_cpbr; + + my_bat_set_plus_cpbr.index1 = (U8) phb_start_idx; + my_bat_set_plus_cpbr.index2 = (S16) phb_stop_idx; + + src_params->curAtCmd = AT_CMD_CPBR; + srcId_cb = srcId; + bat_send(ati_bat_get_client(srcId), &cmd); + + return ATI_EXCT; /* executing, because response is passed by callback function */ + } +#else /* no FF_ATI_BAT */ + + /* Read 5 entries at a time */ + ret = cmd_readCPBRBlock(srcId); + +#endif /* no FF_ATI_BAT */ + + return (map_aci_2_ati_rslt(ret)); +} + +GLOBAL T_ATI_RSLT tesatPlusCPBR(char *cl, UBYTE srcId) +{ +#ifdef FF_ATI_BAT + + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + TRACE_FUNCTION("tesatPlusCPBR() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_TST_PLUS_CPBR; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_tst_plus_cpbr = &dummy; + + bat_send(ati_bat_get_client(srcId), &cmd); + + return ATI_EXCT; /* executing, because response is passed by callback function */ + +#else /* no FF_ATI_BAT */ + + T_ACI_RETURN ret = AT_FAIL; + SHORT first_idx, + last_idx = ACI_NumParmNotPresent; + UBYTE nlength, + tlength; + + TRACE_FUNCTION("tesatPlusCPBR()"); + + ret = tAT_PlusCPBR((T_ACI_CMD_SRC)srcId,&first_idx,&last_idx,&nlength,&tlength); + if(ret EQ AT_CMPL) + { + sprintf(g_sa,"+CPBR: (%d-%d),%d,%d",first_idx,last_idx,nlength,tlength); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + } + else + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : atPlusCPBF | ++--------------------------------------------------------------------+ + + PURPOSE : +CPBF (Find Text in Phonebook) +*/ + +GLOBAL T_ATI_RSLT setatPlusCPBF(char *cl, UBYTE srcId) +{ +#ifndef FF_ATI_BAT + T_ACI_RETURN ret = AT_FAIL; +#ifndef NO_ASCIIZ + CHAR cvtdFindstr[MAX_ALPHA_LEN] = {0x00}; +#endif + USHORT lenCvtdFindstr = 0; + CHAR cvtdText [2*MAX_ALPHA_LEN] = {0x00}; + USHORT lenCvtdText = 0; + USHORT pos = 0; + + SHORT i, + j; + SHORT found; + T_ACI_PB_LST pblst; + UBYTE type; + +#ifdef NO_ASCIIZ + T_ACI_PB_TEXT pbText; +#endif /* #ifdef NO_ASCIIZ */ + +#endif /* FF_ATI_BAT */ + + CHAR findstr [MAX_ALPHA_LEN] = {0x00}; + USHORT lenFindstr = 0; + + TRACE_FUNCTION("setatPlusCPBF()"); + + cl=parse(cl,"z", + (LONG)MAX_ALPHA_LEN, + strlen(cl), + cl, + &lenFindstr, + findstr); + if(!cl OR lenFindstr EQ 0) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + srcId_cb = srcId; + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_cpbf cpbf; + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBF; + cmd.params.ptr_set_plus_cpbf=&cpbf; + + /* + * Check that the string isn't too long for the BAT message. + */ + if (lenFindstr>BAT_MAX_CPBF_FIND_TEXT_LEN) + { + cmdCmeError(CME_ERR_Unknown); + return ATI_FAIL; + } + + cpbf.c_findtext=(U8)lenFindstr; + memcpy(cpbf.findtext,findstr,lenFindstr); + + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } +#else /* no FF_ATI_BAT */ + +#ifdef NO_ASCIIZ + utl_chsetToSim ( (UBYTE*)findstr, + lenFindstr, + pbText.data, + &lenCvtdFindstr, + GSM_ALPHA_Def ); + + pbText.cs = CS_Sim; + pbText.len = (UBYTE)lenCvtdFindstr; + + ret = sAT_PlusCPBF( (T_ACI_CMD_SRC)srcId, &pbText, CPBF_MOD_NewSearch, + &found, &pblst[0] ); +#else /* #ifdef NO_ASCIIZ */ + utl_chsetToGsm ( (UBYTE*)findstr, + lenFindstr, + (UBYTE*)cvtdFindstr, + &lenCvtdFindstr, +#ifdef REL99 + sizeof(cvtdFindstr), +#endif /* REL99 */ + GSM_ALPHA_Int ); + + ret = sAT_PlusCPBF( srcId, cvtdFindstr, CPBF_MOD_NewSearch, + &found, &pblst[0] ); +#endif /* #ifdef NO_ASCIIZ */ + if (ret EQ AT_CMPL) + { + i=0; + while(i<MAX_PB_ENTR AND i < found) + { + type = toa_merge(pblst[i].type); + + pos=sprintf(g_sa,"+CPBF: %d,\"%s\",%d,", + pblst[i].index, + pblst[i].number, + type); + utl_chsetFromSim((UBYTE*)pblst[i].text.data, + pblst[i].text.len, + (UBYTE*)cvtdText, + sizeof(cvtdText), + &lenCvtdText, + GSM_ALPHA_Def); + pos+=sprints(g_sa+pos,cvtdText,lenCvtdText); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + i++; + } + if (found > MAX_PB_ENTR) + { + while(i < found) + { +#ifdef NO_ASCIIZ + ret = sAT_PlusCPBF( (T_ACI_CMD_SRC)srcId, &pbText, + CPBF_MOD_NextSearch, &found, &pblst[0] ); +#else /* #ifdef NO_ASCIIZ */ + ret = sAT_PlusCPBF( srcId, cvtdFindstr, + CPBF_MOD_NextSearch, &found, &pblst[0] ); +#endif /* #ifdef NO_ASCIIZ */ + if (ret EQ AT_CMPL) + { + for(j=0;j < MAX_PB_ENTR AND i < found;j++) + { + type = toa_merge(pblst[j].type); + + pos=sprintf(g_sa,"+CPBF: %d,\"%s\",%d,", + pblst[j].index, + pblst[j].number, + type); + utl_chsetFromGsm((UBYTE*)pblst[j].text.data, + pblst[j].text.len, + (UBYTE*)cvtdText, + sizeof(cvtdText), + &lenCvtdText, + GSM_ALPHA_Def); + pos+=sprints(g_sa+pos,cvtdText,lenCvtdText); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + i++; + } + } + else + { + i = found; /* Ensure at least termination of loop */ + } + } + } + } + else + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +GLOBAL T_ATI_RSLT tesatPlusCPBF(char *cl, UBYTE srcId) +{ +#ifndef FF_ATI_BAT + T_ACI_RETURN ret = AT_FAIL; + UBYTE nlength, + tlength; +#endif + + TRACE_FUNCTION("tesatPlusCPBF()"); + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + cmd.ctrl_params = BAT_CMD_TST_PLUS_CPBF; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_tst_plus_cpbf = &dummy; + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } +#else /* no FF_ATI_BAT */ + + ret = tAT_PlusCPBF((T_ACI_CMD_SRC)srcId,&nlength,&tlength); + if(ret EQ AT_CMPL) + { + resp_disp(srcId, cl,"bb",&nlength,&tlength); + } + else + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : atPlusCSVM | ++--------------------------------------------------------------------+ + + PURPOSE : +CSVM command (Set Voice Mail Number ) +*/ + +GLOBAL T_ATI_RSLT setatPlusCSVM (char *cl, UBYTE srcId) +{ + + T_ACI_CSVM_MOD mode = CSVM_MOD_NotPresent; + T_ACI_RETURN ret = AT_FAIL; + T_ACI_TOA type; + SHORT toa_val=0; + CHAR numBuf[MAX_CC_ORIG_NUM_LEN]; + + TRACE_FUNCTION("setatPlusCSVM()"); + + memset( numBuf, 0, sizeof(numBuf)); + + cl=parse(cl,"dsr",&mode,(LONG)MAX_CC_ORIG_NUM_LEN, + numBuf,&toa_val); + + if(!cl) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + if ( mode EQ CSVM_MOD_Enable AND + numBuf[0] EQ '\0' OR + toa_val < 0) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + if(toa_val NEQ 0) + { + type=toa_demerge(toa_val); + } + else + { + cmh_setToaDef(numBuf,&type); + } + + +#ifdef FF_ATI_BAT + + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_csvm csvm; + UBYTE len; + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CSVM; + cmd.params.ptr_set_plus_csvm=&csvm; + + len=strlen(numBuf); + + csvm.mode=(T_BAT_plus_csvm_mode)mode; + + if ((len) AND (len<=BAT_MAX_CSVM_NUMBER_LEN)) + { + csvm.v_number=TRUE; + csvm.c_number=(U8)len; + memcpy(csvm.number,numBuf,len); + } + else + { + csvm.v_number=FALSE; + } + csvm.type=(S16)toa_val; + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } + +#else /* no FF_ATI_BAT */ + + ret = sAT_PlusCSVM((T_ACI_CMD_SRC)srcId, mode, numBuf, (UBYTE)strlen(numBuf), &type); + + if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +GLOBAL T_ATI_RSLT queatPlusCSVM (char *cl, UBYTE srcId) +{ + T_ACI_CSVM_MOD mode=CSVM_MOD_NotPresent; + T_ACI_RETURN ret = AT_FAIL; + SHORT toa_val=0; + CHAR numBuf[MAX_CC_ORIG_NUM_LEN]; + + TRACE_FUNCTION("queatPlusCSVM()"); + + memset( numBuf, 0, sizeof(numBuf)); + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + cmd.ctrl_params = BAT_CMD_QUE_PLUS_CSVM; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_que_plus_csvm = &dummy; + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } +#else /* no FF_ATI_BAT */ + + ret = qAT_PlusCSVM((T_ACI_CMD_SRC)srcId, &mode, numBuf, sizeof(numBuf), &toa_val); + if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + } + else + { + sprintf(g_sa,"+CSVM: %d,\"%s\",%d",mode,numBuf,toa_val); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + } + + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : atPlusCLAN | ++--------------------------------------------------------------------+ + + PURPOSE : +CLAN command (Set language) +*/ + +GLOBAL T_ATI_RSLT setatPlusCLAN (CHAR *cl, UBYTE srcId) +{ + T_ACI_RETURN ret = AT_FAIL; + CHAR lng_str[CLAN_CODE_LEN+1]={0}; + SHORT i; + T_ACI_LAN_SUP lngCde; + CHAR *auptr="au"; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPlusCLAN()"); + + cl = parse(cl,"s",(LONG)3,lng_str); + if(!cl OR *lng_str EQ '\0') + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + if (strcmp(lng_str, auptr)) + { + for(i=0;lngs[i].str NEQ 0;i++) + { + if (!strcmp(lngs[i].str,lng_str)) + { + lngCde.str=lngs[i].str; + lngCde.lng=lngs[i].lng; + break; + } + } + if(lngs[i].str EQ 0) + { + cmdCmeError(CME_ERR_OpNotSupp); + return ATI_FAIL; + } + } + else + { + lngCde.str = lng_str; + lngCde.lng = CLAN_LNG_AUT; + } + +#ifdef FF_ATI_BAT + + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_plus_clan clan; + UBYTE len; + + cmd.ctrl_params = BAT_CMD_SET_PLUS_CLAN; + cmd.params.ptr_set_plus_clan=&clan; + + len=strlen(lng_str); + + if (len>BAT_MAX_CLAN_CODE_LEN) + { + cmdCmeError(CME_ERR_Unknown); + return ATI_FAIL; + } + + memcpy(clan.code,lng_str,len); + clan.c_code=(U8)len; + bat_send(ati_bat_get_client(srcId), &cmd); + src_params->curAtCmd=AT_CMD_CLAN; + return(ATI_EXCT); + } + +#else /* no FF_ATI_BAT */ + + ret = sAT_PlusCLAN((T_ACI_CMD_SRC)srcId,&lngCde); + if (ret EQ AT_EXCT) + { + src_params->curAtCmd = AT_CMD_CLAN; + } + else if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + } + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +GLOBAL T_ATI_RSLT queatPlusCLAN(char *cl, UBYTE srcId) +{ +#ifndef FF_ATI_BAT + CHAR *me="+CLAN: "; + T_ACI_RETURN ret = AT_FAIL; + T_ACI_LAN_SUP lngCde; + CHAR lang_buffer[3]; /* 2 chars for language + 0 terminated string */ + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); +#endif + + TRACE_FUNCTION("queatPlusCLAN()"); + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + cmd.ctrl_params = BAT_CMD_QUE_PLUS_CLAN; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_que_plus_clan = &dummy; + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } +#else /* no FF_ATI_BAT */ + + /* to be sure that last cipher is 0 (string)*/ + memset(lang_buffer, 0, sizeof(lang_buffer)); + lngCde.str = lang_buffer; + + ret = qAT_PlusCLAN((T_ACI_CMD_SRC)srcId, &lngCde); + switch(ret) + { + case(AT_CMPL): + sprintf(g_sa,"%s%s", me, lngCde.str); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + break; + + case(AT_EXCT): + src_params->curAtCmd = AT_CMD_CLAN; + break; + + case(AT_BUSY): + cmdCmeError(CME_ERR_SimBusy); + break; + + default: + cmdCmeError(CME_ERR_Unknown); + break; + } + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +GLOBAL T_ATI_RSLT tesatPlusCLAN (CHAR *cl, UBYTE srcId) +{ +#ifndef FF_ATI_BAT + char *me="+CLAN: "; + T_ACI_RETURN ret = AT_FAIL; + T_ACI_LAN_SUP lnglst[MAX_LAN]; + SHORT lastIdx; + UBYTE i; + SHORT pos; +#endif + + TRACE_FUNCTION("tesatPlusCLAN()"); + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + cmd.ctrl_params = BAT_CMD_TST_PLUS_CLAN; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_tst_plus_clan = &dummy; + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } +#else /* no FF_ATI_BAT */ + + ret = tAT_PlusCLAN((T_ACI_CMD_SRC)srcId, &lastIdx, &lnglst[0] ); + if (ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + return ATI_FAIL; + } + + pos=sprintf(g_sa,"%s",me); + + for(i=0;i<lastIdx;i++) + { + pos += sprintf(g_sa+pos,"%s,",lnglst[i].str); + } + + g_sa[pos-1] = '\0'; + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + return (map_aci_2_ati_rslt(ret)); + +#endif /* no FF_ATI_BAT */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | +| STATE : code ROUTINE : setatPercentPBCF | ++--------------------------------------------------------------------+ + + PURPOSE : %PBCF command (Set phonebook configuration) +*/ + +GLOBAL T_ATI_RSLT setatPercentPBCF (CHAR *cl, UBYTE srcId) +{ + T_ACI_PBCF_LDN ldn = PBCF_LDN_NotPresent; + T_ACI_PBCF_LRN lrn = PBCF_LRN_NotPresent; + T_ACI_PBCF_LMN lmn = PBCF_LMN_NotPresent; + T_ACI_RETURN ret = AT_FAIL; + + cl = parse (cl, "ddd", &ldn, &lrn, &lmn); + + /*lint -e685 always evaluates to false*/ + if (!cl OR + ldn < PBCF_LDN_NotPresent OR ldn > PBCF_LDN_Disable OR + lrn < PBCF_LRN_NotPresent OR lrn > PBCF_LRN_Disable OR + lmn < PBCF_LMN_NotPresent OR lmn > PBCF_LMN_Disable) + { + cmdCmeError(CME_ERR_OpNotAllow); + return ATI_FAIL; + } + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_percent_pbcf pbcf; + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); + + TRACE_FUNCTION("setatPercentPBCF() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_SET_PERCENT_PBCF; + cmd.params.ptr_set_percent_pbcf=&pbcf; + + pbcf.ldn = (T_BAT_percent_pbcf_ldn)ldn; + pbcf.lrn = (T_BAT_percent_pbcf_lrn)lrn; + pbcf.lmn = (T_BAT_percent_pbcf_lmn)lmn; + + bat_send(ati_bat_get_client(srcId), &cmd); + src_params->curAtCmd=AT_CMD_P_PBCF; + return(ATI_EXCT); + } + +#else /* FF_ATI_BAT */ + TRACE_FUNCTION("setatPercentPBCF()"); + + ret = sAT_PercentPBCF((T_ACI_CMD_SRC)srcId, ldn, lrn, lmn); + + if(ret EQ AT_FAIL) + { + cmdCmeError(CME_ERR_Unknown); + return ATI_FAIL; + } + + return (map_aci_2_ati_rslt(ret)); + +#endif /* FF_ATI_BAT */ +} + + +GLOBAL T_ATI_RSLT queatPercentPBCF (CHAR *cl, UBYTE srcId) +{ +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_no_parameter dummy; + + TRACE_FUNCTION("queatPercentPBCF() calls bat_send() <=== as APPLICATION"); + + cmd.ctrl_params = BAT_CMD_QUE_PERCENT_PBCF; + dummy.bat_dummy = 0xFF; + cmd.params.ptr_que_percent_pbcf = &dummy; + bat_send(ati_bat_get_client(srcId), &cmd); + return(ATI_EXCT); + } + +#else /* FF_ATI_BAT */ + CHAR *me = "%PBCF: "; + T_ACI_PBCF_LDN ldn = PBCF_LDN_NotPresent; + T_ACI_PBCF_LRN lrn = PBCF_LRN_NotPresent; + T_ACI_PBCF_LMN lmn = PBCF_LMN_NotPresent; + + TRACE_FUNCTION("queatPercentPBCF()"); + + qAT_PercentPBCF ((T_ACI_CMD_SRC)srcId, &ldn, &lrn, &lmn); + + sprintf (g_sa, "%s%d, %d, %d", me, ldn, lrn, lmn); + io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); + + return (ATI_CMPL); +#endif /* FF_ATI_BAT */ +} + +#endif /* ATI_PHB_C */