line source
+ − /*
+ − +-----------------------------------------------------------------------------
+ − | Project : GSM-F&D (8411)
+ − | Modul : ACI_BAT
+ − +-----------------------------------------------------------------------------
+ − | 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 : This BAT wrapper modul is ...
+ − |
+ − +-----------------------------------------------------------------------------
+ − */
+ −
+ − #include "aci_all.h" /* includes prim.h, which includes p_bat.h */
+ − #include "aci_cmh.h" /* prototypes of sAT_,qAT_,tAT_ */
+ − #include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */
+ − #include "aci_bat.h"
+ − #include "ati_cmd.h"
+ − #include "aci_cmd.h"
+ − #include "aci_mem.h" /* MAKROS ACI_MALLOC, ACI_MFREE*/
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PercentPBCF |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Select Phonebook Configuration.
+ − */
+ −
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PercentPBCF (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − 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 ("sBAT_PercentPBCF()");
+ −
+ − ldn = (T_ACI_PBCF_LDN)cmd->params.ptr_set_percent_pbcf->ldn;
+ − lrn = (T_ACI_PBCF_LRN)cmd->params.ptr_set_percent_pbcf->lrn;
+ − lmn = (T_ACI_PBCF_LMN)cmd->params.ptr_set_percent_pbcf->lmn;
+ −
+ − /*
+ − * Call the corresponding sAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − /* for BAT we use the old spec, which means the third param is not supported */
+ − ret = (T_ACI_BAT_RSLT)sAT_PercentPBCF(src_infos_psi->srcId, ldn, lrn, lmn);
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : qBAT_PlusCPBS |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT qBAT_PercentPBCF (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − 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 ("qBAT_PercentPBCF()");
+ −
+ − /*
+ − * Call the corresponding qAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)qAT_PercentPBCF(src_infos_psi->srcId, &ldn, &lrn, &lmn);
+ −
+ − /*
+ − * If the query completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_que_percent_pbcf pbcf_data;
+ −
+ − resp.ctrl_response=BAT_RES_QUE_PERCENT_PBCF;
+ − resp.response.ptr_que_percent_pbcf = &pbcf_data;
+ −
+ − /*
+ − * This relies on T_BAT_percent_pbcf_ldn being identical to
+ − * T_ACI_PBCF_LDN and so forth for LRN and LMN.
+ − */
+ − pbcf_data.ldn=(T_BAT_percent_pbcf_ldn)ldn;
+ − pbcf_data.lrn=(T_BAT_percent_pbcf_ldn)lrn;
+ − pbcf_data.lmn=(T_BAT_percent_pbcf_ldn)lmn;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PlusCPBS |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Select phonebook memory storage.
+ − */
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBS (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_PB_STOR stor;
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCPBS()");
+ −
+ − /*
+ − * This relies on T_BAT_storage being identical to
+ − * T_ACI_PB_STOR.
+ − */
+ − stor=(T_ACI_PB_STOR)cmd->params.ptr_set_plus_cpbs->storage;
+ −
+ − /*
+ − * Call the corresponding sAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − /* for BAT we use the old spec, which means the third param is not supported */
+ − ret=(T_ACI_BAT_RSLT)sAT_PlusCPBS(src_infos_psi->srcId,stor, NULL);
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : qBAT_PlusCPBS |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT qBAT_PlusCPBS (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_PB_STOR stor;
+ − SHORT used;
+ − SHORT total;
+ −
+ − TRACE_FUNCTION ("qBAT_PlusCPBS()");
+ −
+ − /*
+ − * Call the corresponding qAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)qAT_PlusCPBS(src_infos_psi->srcId,&stor,&used,&total);
+ −
+ − /*
+ − * If the query completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_que_plus_cpbs cpbs_data;
+ −
+ − resp.ctrl_response=BAT_RES_QUE_PLUS_CPBS;
+ − resp.response.ptr_que_plus_cpbs=&cpbs_data;
+ −
+ − /*
+ − * This relies on T_BAT_storage being identical to
+ − * T_ACI_PB_STOR.
+ − */
+ − cpbs_data.storage=(T_BAT_storage)stor;
+ −
+ − cpbs_data.total=(S16)total;
+ − cpbs_data.used=(S16)used;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : qBAT_PercentCPBS |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPBS (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_PB_STOR stor;
+ − SHORT used;
+ − SHORT total;
+ − SHORT first;
+ −
+ − TRACE_FUNCTION ("qBAT_PercentCPBS()");
+ −
+ − /*
+ − * Call the corresponding qAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)qAT_PercentCPBS(src_infos_psi->srcId,&stor,&used,&total,&first);
+ −
+ − /*
+ − * If the query completes, send the response now.
+ − */
+ − if (ret EQ ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_que_percent_cpbs cpbs_data;
+ −
+ − resp.ctrl_response=BAT_RES_QUE_PERCENT_CPBS;
+ − resp.response.ptr_que_percent_cpbs=&cpbs_data;
+ −
+ − /*
+ − * This relies on T_BAT_storage being identical to
+ − * T_ACI_PB_STOR.
+ − */
+ − cpbs_data.storage=(T_BAT_storage)stor;
+ −
+ − cpbs_data.total=(S16)total;
+ − cpbs_data.used=(S16)used;
+ − cpbs_data.first=(S16)first;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PlusCPBW |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBW (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − SHORT index;
+ − CHAR number[BAT_MAX_CPBW_NUMBER_LEN+1];
+ − CHAR *p_number;
+ − T_ACI_TOA toa;
+ − T_ACI_TOA *p_toa;
+ − T_ACI_PB_TEXT text;
+ − T_ACI_PB_TEXT *p_text;
+ − T_ACI_VP_ABS dmy_date_time;
+ − T_BAT_cmd_set_plus_cpbw *cpbw;
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCPBW()");
+ −
+ − /*
+ − * Get a pointer to the CPBW structure for convenience.
+ − */
+ − cpbw=cmd->params.ptr_set_plus_cpbw;
+ −
+ − index=(SHORT)cpbw->index;
+ −
+ − if (cpbw->v_number==TRUE)
+ − {
+ − /*
+ − * The idea here is to get the 'number' parameter into a
+ − * null terminated string, which is what sAT_PlusCPBW() expects, but
+ − * is not guaranteed by BAT.
+ − */
+ − memset(number,0,sizeof(number));
+ − memcpy(number,cpbw->number,cpbw->c_number);
+ − p_number=number;
+ −
+ − /*
+ − * BAT stores the type of address in a single value.
+ − */
+ − if (cpbw->type!=-1)
+ − {
+ − toa=toa_demerge(cpbw->type);
+ − p_toa=&toa;
+ − }
+ − else
+ − {
+ − p_toa=NULL;
+ − }
+ − }
+ − else
+ − {
+ − p_number=NULL;
+ − p_toa=NULL;
+ − }
+ −
+ − /*
+ − * Associated text
+ − */
+ − if (cpbw->v_text==TRUE)
+ − {
+ − USHORT len;
+ −
+ − /*
+ − * Convert from the currently selected character set into the
+ − * SIM format.
+ − */
+ − utl_chsetToSim(
+ − (UBYTE *)cpbw->text,
+ − (USHORT)cpbw->c_text,
+ − (UBYTE *)text.data,
+ − &len,
+ − GSM_ALPHA_Def);
+ −
+ − /*
+ − * Set the length. Note that we cannot do this by passing a
+ − * reference to text.len into utl_chsetToSim() because it is
+ − * the wrong type.
+ − */
+ − text.len=(UBYTE)len;
+ −
+ − text.cs=CS_Sim;
+ −
+ − p_text=&text;
+ − }
+ − else
+ − {
+ − p_text=NULL;
+ − }
+ −
+ − /*
+ − * Call the corresponding sAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=sAT_PlusCPBW(
+ − src_infos_psi->srcId,
+ − index,
+ − p_number,
+ − p_toa,
+ − p_text,
+ − &dmy_date_time);
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : tBAT_PlusCPBW |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT tBAT_PlusCPBW (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − SHORT first;
+ − SHORT last;
+ − UBYTE nlength;
+ − UBYTE tlength;
+ −
+ − TRACE_FUNCTION ("tBAT_PlusCPBW()");
+ −
+ − /*
+ − * Call the corresponding tAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)tAT_PlusCPBW(src_infos_psi->srcId,&first,&last,&nlength,&tlength);
+ −
+ − /*
+ − * If the command completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_tst_plus_cpbw cpbw_data;
+ −
+ − resp.ctrl_response=BAT_RES_TST_PLUS_CPBW;
+ − resp.response.ptr_tst_plus_cpbw=&cpbw_data;
+ −
+ − cpbw_data.index1=(U8)first;
+ − cpbw_data.index2=(U8)last;
+ − cpbw_data.nlength=(S16)nlength;
+ − cpbw_data.tlength=(S16)tlength;
+ −
+ − #pragma message(__TODO__"+CPBW types")
+ − cpbw_data.c_types=0;
+ − cpbw_data.types[0]=0;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PlusCPBR |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Read phonebook entries. If the application wants to read
+ − more than ACI_BAT_MAX_RESPONSES, then the responses are
+ − sent block by block (one block = ACI_BAT_MAX_RESPONSES).
+ − */
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBR_CB (T_ACI_DTI_PRC_PSI *src_infos_psi)
+ − {
+ − T_BAT_cmd_send cmd;
+ − T_BAT_cmd_set_plus_cpbr cpbr;
+ −
+ − cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBR;
+ − cmd.params.ptr_set_plus_cpbr = &cpbr;
+ −
+ − cpbr.index1 = (U8)src_infos_psi->index1;
+ − cpbr.index2 = (S16)src_infos_psi->index2;
+ −
+ − return (sBAT_PlusCPBR(src_infos_psi, &cmd));
+ − }
+ −
+ −
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBR (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − SHORT start_idx;
+ − SHORT stop_idx;
+ − SHORT last_idx = ACI_NumParmNotPresent;
+ − T_ACI_PB_ENTR pb_lst[MAX_PB_ENTR];
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCPBR()");
+ −
+ − /* define here the variables, which are passed as parameters to sAT_PlusCPBR */
+ − start_idx = (SHORT)cmd->params.ptr_set_plus_cpbr->index1;
+ − stop_idx = (SHORT)cmd->params.ptr_set_plus_cpbr->index2;
+ −
+ − ret = (T_ACI_BAT_RSLT)sAT_PlusCPBR(src_infos_psi->srcId, start_idx, stop_idx, &last_idx, &pb_lst[0]);
+ − if (ret EQ ACI_BAT_CMPL)
+ − {
+ − SHORT i;
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_set_plus_cpbr cpbr_data;
+ −
+ − resp.ctrl_response = BAT_RES_SET_PLUS_CPBR;
+ − resp.response.ptr_set_plus_cpbr = &cpbr_data;
+ −
+ − /*
+ − * sAT_PlusCPBR() provides in pb_lst[] up to five entries (MAX_PB_ENTR)
+ − */
+ − for (i = 0; ((i < MAX_PB_ENTR) AND (pb_lst[i].index NEQ ACI_NumParmNotPresent)); i++)
+ − {
+ − USHORT len_cvtd_text=0;
+ −
+ − cpbr_data.index = (U8)pb_lst[i].index;
+ −
+ − cpbr_data.c_number = strlen((CHAR*)pb_lst[i].number);
+ −
+ − cpbr_data.c_number = (cpbr_data.c_number > BAT_MAX_CPBR_NUMBER_LEN)
+ − ? BAT_MAX_CPBR_NUMBER_LEN
+ − : cpbr_data.c_number;
+ −
+ − strncpy((CHAR*)cpbr_data.number, pb_lst[i].number, cpbr_data.c_number+1); /* Include null terminator for Resp_.. () */
+ −
+ − /* BAT stores the type of address in a single 8-bit value. */
+ − cpbr_data.type = toa_merge(pb_lst[i].type);
+ −
+ − /*
+ − * Convert the data read from the SIM into the currently
+ − * selected character set.
+ − */
+ − utl_chsetFromSim(
+ − (UBYTE *)pb_lst[i].text.data,
+ − pb_lst[i].text.len,
+ − (UBYTE *)cpbr_data.text,
+ − BAT_MAX_CPBR_TEXT_LEN,
+ − &len_cvtd_text,
+ − GSM_ALPHA_Def);
+ −
+ − cpbr_data.c_text=(U8)len_cvtd_text;
+ −
+ − TRACE_EVENT_P2("sBAT_PlusCPBR(): index = %i c_text = %d", cpbr_data.index, cpbr_data.c_text);
+ −
+ − /* vsi_t_sleep (aci_handle, 500); */
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ − /* remember updated start index and initial stop index for possible next block of entries to send to APP */
+ − src_infos_psi->index1 = last_idx + 1;
+ − src_infos_psi->index2 = stop_idx;
+ − }
+ − else
+ − {
+ − ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown);
+ − return(ACI_BAT_FAIL);
+ − }
+ −
+ − if (last_idx < stop_idx)
+ − {
+ − src_infos_psi->large_type = TRUE;
+ − return (ACI_BAT_EXCT);
+ − }
+ −
+ − src_infos_psi->large_type = FALSE;
+ − return (ACI_BAT_CMPL);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : tBAT_PlusCPBR |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ −
+ − GLOBAL T_ACI_BAT_RSLT tBAT_PlusCPBR (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret=ACI_BAT_FAIL;
+ − SHORT first;
+ − SHORT last;
+ − UBYTE nlength;
+ − UBYTE tlength;
+ −
+ − TRACE_FUNCTION ("tBAT_PlusCPBR()");
+ −
+ − /*
+ − * Call the corresponding tAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)tAT_PlusCPBR(src_infos_psi->srcId,&first,&last,&nlength,&tlength);
+ −
+ − /*
+ − * If the command completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_tst_plus_cpbr cpbr_data;
+ −
+ − resp.ctrl_response=BAT_RES_TST_PLUS_CPBR;
+ − resp.response.ptr_tst_plus_cpbr=&cpbr_data;
+ −
+ − cpbr_data.index_f=(U8)first;
+ − cpbr_data.index_l=(U8)last;
+ − cpbr_data.nlength=(S16)nlength;
+ − cpbr_data.tlength=(S16)tlength;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PlusCPBF |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBF_CB (T_ACI_DTI_PRC_PSI *src_infos_psi)
+ − {
+ − 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;
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCPBF_CB()");
+ −
+ − /* restore search string if ongoing command */
+ − if ( src_infos_psi->search_str_ptr NEQ NULL )
+ − {
+ − TRACE_EVENT("Restore search string");
+ − /* index 1 stores the length of the string in the case of cpbf */
+ − cpbf.c_findtext = (U8)src_infos_psi->index1;
+ − memcpy(cpbf.findtext, src_infos_psi->search_str_ptr, BAT_MAX_CPBF_FIND_TEXT_LEN);
+ − }
+ − return (sBAT_PlusCPBF(src_infos_psi, &cmd));
+ − }
+ −
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBF (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_PB_TEXT pbtext;
+ − USHORT len;
+ − T_ACI_BAT_RSLT ret;
+ − T_BAT_cmd_set_plus_cpbf *cpbf_cmd;
+ − SHORT found = -1;
+ − T_ACI_PB_ENTR pb[MAX_PB_ENTR];
+ − SHORT i;
+ − T_ACI_CPBF_MOD search_mode; // replaced by global var
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_set_plus_cpbf cpbf_rsp;
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCPBF()");
+ −
+ − resp.ctrl_response = BAT_RES_SET_PLUS_CPBF;
+ − resp.response.ptr_set_plus_cpbf = &cpbf_rsp;
+ −
+ − /*
+ − * Get a pointer to the CPBF data for convenience.
+ − */
+ − cpbf_cmd = cmd->params.ptr_set_plus_cpbf;
+ −
+ − /*
+ − * We may have to call sAT_PlusCPBF() more than once, if there are
+ − * more than MAX_PB_ENTR entries found. The search mode is used
+ − * to tell the ACI whether this is a new search or a continuation of
+ − * the old one.
+ − * If there has been a valid string pointer saved to the search_str_ptr
+ − * the seek has to be continued.
+ − */
+ −
+ − if ((src_infos_psi->search_str_ptr NEQ NULL)
+ − AND (strncmp(src_infos_psi->search_str_ptr, cpbf_cmd->findtext, cpbf_cmd->c_findtext) EQ 0))
+ − {
+ − found = src_infos_psi->index2; /* recover number found*/
+ − search_mode = CPBF_MOD_NextSearch;
+ − TRACE_EVENT_P1("Stored Search string: %s", src_infos_psi->search_str_ptr);
+ − TRACE_EVENT_P1("Stored String length: %d", src_infos_psi->index1);
+ − }
+ − else
+ − {
+ − search_mode = CPBF_MOD_NewSearch;
+ − }
+ −
+ − /*
+ − * If the search string has zero length or is larger than the ACI function
+ − * can handle then there's no point continuing.
+ − * In fact there should be a differentiation between UCS2 and 8bit based coding schemes.
+ − * Additionally it has to be considered that the string given within the BAT command is ACSII encoded.
+ − */
+ − if (((ati_user_output_cfg[src_infos_psi->srcId].cscsChset EQ CSCS_CHSET_Ucs2)
+ − && ((cpbf_cmd->c_findtext>BAT_MAX_CPBF_FIND_TEXT_LEN)||(cpbf_cmd->c_findtext<1)) )
+ − ||
+ − ((ati_user_output_cfg[src_infos_psi->srcId].cscsChset NEQ CSCS_CHSET_Ucs2)
+ − && ((cpbf_cmd->c_findtext>MAX_PHB_NUM_LEN)||(cpbf_cmd->c_findtext<1)) ) )
+ − {
+ − ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown);
+ − return(ACI_BAT_FAIL);
+ − }
+ −
+ − TRACE_EVENT_P1("Search string: %s", cpbf_cmd->findtext);
+ − TRACE_EVENT_P1("String length: %d", cpbf_cmd->c_findtext);
+ −
+ − utl_chsetToSim(
+ − (UBYTE *)cpbf_cmd->findtext,
+ − (USHORT)cpbf_cmd->c_findtext,
+ − (UBYTE *)pbtext.data,
+ − &len,
+ − GSM_ALPHA_Def);
+ −
+ − if (len > MAX_PHB_NUM_LEN)
+ − {
+ − /*
+ − * Shouldn't get here as that would mean that memory has been
+ − * overwritten. Currently utl_chsetToSim() has no specific mechanism
+ − * to prevent this.
+ − */
+ − ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_TxtToLong);
+ − return(ACI_BAT_FAIL);
+ − }
+ −
+ − pbtext.len = (UBYTE)len;
+ − pbtext.cs = (T_ACI_CS)CS_Sim;
+ −
+ −
+ − /*
+ − * Call the corresponding sAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ −
+ − TRACE_EVENT_P1("search_mode: %d", search_mode);
+ − TRACE_EVENT_P1("pbtext.data: %s", pbtext.data);
+ − TRACE_EVENT_P1("pbtext.len: %d", pbtext.len);
+ −
+ −
+ − /* found is not overwritten in the case of NEXT_SEARCH */
+ − ret=(T_ACI_BAT_RSLT)sAT_PlusCPBF(
+ − src_infos_psi->srcId,
+ − &pbtext,
+ − search_mode,
+ − &found,
+ − pb);
+ −
+ − TRACE_EVENT_P1("sAT_PlusCPBF returns: %d", ret);
+ − TRACE_EVENT_P1("-- found entries: %d", found);
+ −
+ − /*
+ − * If the command fails, get out now.
+ − */
+ − if (ret!=ACI_BAT_CMPL)
+ − return(ret);
+ −
+ − /*
+ − * We have received a list, however the BAT response only
+ − * allows for single items. So we must send each one
+ − * individually.
+ − */
+ − for (i=0;((i<found) && (i<MAX_PB_ENTR));i++)
+ − {
+ − USHORT len_cvtd_text=0;
+ −
+ − cpbf_rsp.index=(U8)pb[i].index;
+ −
+ − TRACE_EVENT("send the found entry");
+ − strncpy((CHAR*)cpbf_rsp.number,pb[i].number,BAT_MAX_CPBF_NUMBER_LEN);
+ − cpbf_rsp.c_number=strlen((CHAR*)cpbf_rsp.number);
+ −
+ − /*
+ − * BAT stores the type of address in a single 8-bit value.
+ − */
+ − cpbf_rsp.type=toa_merge(pb[i].type);
+ −
+ − /*
+ − * Convert the data read from the SIM into the currently
+ − * selected character set.
+ − */
+ − utl_chsetFromSim(
+ − (UBYTE *)pb[i].text.data,
+ − pb[i].text.len,
+ − (UBYTE *)cpbf_rsp.text,
+ − BAT_MAX_CPBF_TEXT_LEN,
+ − &len_cvtd_text,
+ − GSM_ALPHA_Def);
+ −
+ − cpbf_rsp.c_text=(U8)len_cvtd_text;
+ −
+ − /* vsi_t_sleep (aci_handle, 500); */
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − /*
+ − * Set the search mode for the next iteration, should there be
+ − * one.
+ − */
+ −
+ − if (found>MAX_PB_ENTR)
+ − {
+ − TRACE_EVENT("More entries found");
+ − /* remember the string to search for (only necessary for first iteration)*/
+ − if (search_mode EQ CPBF_MOD_NewSearch)
+ − {
+ − TRACE_EVENT("Store string");
+ − src_infos_psi->index1 = (U16)cpbf_cmd->c_findtext; /* str length */
+ − ACI_MALLOC(src_infos_psi->search_str_ptr, BAT_MAX_CPBF_FIND_TEXT_LEN);
+ − memcpy(src_infos_psi->search_str_ptr, cpbf_cmd->findtext, BAT_MAX_CPBF_FIND_TEXT_LEN);
+ − }
+ − /* This is a multi-line response */
+ − src_infos_psi->large_type = TRUE;
+ − /* Save the number of found items - MAX_PB_ENTR send to user */
+ − src_infos_psi->index2 = found - MAX_PB_ENTR;
+ − /* Still executing */
+ − ret = ACI_BAT_EXCT;
+ − }
+ − else /* no further entries to find */
+ − {
+ − TRACE_EVENT("reset search string");
+ − /* reset search string info for iterations */
+ − src_infos_psi->index1 = 0; /* str length reset */
+ − src_infos_psi->index2 = 0; /* number found reset */
+ − if (src_infos_psi->search_str_ptr NEQ NULL) /* str mem reset, if necessary */
+ − {
+ − ACI_MFREE(src_infos_psi->search_str_ptr);
+ − src_infos_psi->search_str_ptr = NULL;
+ − }
+ − /* This is NO multiline response */
+ − src_infos_psi->large_type = FALSE;
+ − /* completed */
+ − ret = ACI_BAT_CMPL;
+ − }
+ −
+ − return (ret);
+ −
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : tBAT_PlusCPBF |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT tBAT_PlusCPBF (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − UBYTE nlength;
+ − UBYTE tlength;
+ −
+ − TRACE_FUNCTION ("tBAT_PlusCPBF()");
+ −
+ − /*
+ − * Call the corresponding ACI function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)tAT_PlusCPBF(src_infos_psi->srcId,&nlength,&tlength);
+ −
+ − /*
+ − * If the command completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_tst_plus_cpbf cpbf_data;
+ −
+ − resp.ctrl_response=BAT_RES_TST_PLUS_CPBF;
+ − resp.response.ptr_tst_plus_cpbf=&cpbf_data;
+ −
+ − cpbf_data.nlength=(S16)nlength;
+ − cpbf_data.tlength=(S16)tlength;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PlusCSVM |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCSVM (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_TOA toa;
+ − CHAR number[BAT_MAX_CSVM_NUMBER_LEN+1];
+ − CHAR *pnumber;
+ − T_ACI_CSVM_MOD mode;
+ − T_BAT_cmd_set_plus_csvm *csvm;
+ − UBYTE num_len;
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCSVM()");
+ −
+ − /*
+ − * Get a pointer to the BAT structure for convenience.
+ − */
+ − csvm=cmd->params.ptr_set_plus_csvm;
+ −
+ − /*
+ − * This assumes that T_ACI_CSVM_MOD and T_BAT_plus_csvm_mode are
+ − * equivalent. They are, except that the ACI version has a
+ − * NotPresent value - this is not a problem here as we are converting
+ − * from BAT format to ACI format.
+ − */
+ − mode=(T_ACI_CSVM_MOD)csvm->mode;
+ −
+ − if (csvm->v_number==TRUE)
+ − {
+ − /*
+ − * I don't think that CSVM requires a null-terminated string, but
+ − * it's best to err on the side of caution.
+ − */
+ − pnumber=number;
+ − memset(number,0,sizeof(number));
+ − memcpy(number,csvm->number,BAT_MAX_CSVM_NUMBER_LEN);
+ −
+ − if (csvm->c_number>BAT_MAX_CSVM_NUMBER_LEN)
+ − num_len=(UBYTE)BAT_MAX_CSVM_NUMBER_LEN;
+ − else
+ − num_len=(UBYTE)csvm->c_number;
+ − }
+ − else
+ − {
+ − pnumber=NULL;
+ − num_len=0;
+ − }
+ −
+ − /*
+ − * BAT stores the type of address in a single 8-bit value. We need to
+ − * convert this to the ACI format.
+ − */
+ − toa=toa_demerge(csvm->type);
+ −
+ − /*
+ − * Call the corresponding ACI function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)sAT_PlusCSVM(src_infos_psi->srcId,mode,pnumber,num_len,&toa);
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : qBAT_PlusCSVM |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT qBAT_PlusCSVM (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+ − T_ACI_CSVM_MOD mode;
+ − CHAR number[BAT_MAX_CSVM_NUMBER_LEN+1];
+ − SHORT toa_val;
+ −
+ − TRACE_FUNCTION ("qBAT_PlusCSVM()");
+ −
+ − /*
+ − * Call the corresponding qAT function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)qAT_PlusCSVM(
+ − src_infos_psi->srcId,
+ − &mode,
+ − number,
+ − BAT_MAX_CSVM_NUMBER_LEN,
+ − &toa_val);
+ −
+ − /*
+ − * If the query completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_que_plus_csvm csvm_data;
+ −
+ − resp.ctrl_response=BAT_RES_QUE_PLUS_CSVM;
+ − resp.response.ptr_que_plus_csvm=&csvm_data;
+ −
+ − /*
+ − * We can't just cast the ACI value to the BAT value as it
+ − * might be CSVM_MOD_NotPresent, for which the BAT has no
+ − * equivalent.
+ − */
+ − csvm_data.mode=(mode==CSVM_MOD_Enable) ? BAT_CSVM_MODE_ENABLE:BAT_CSVM_MODE_DISABLE;
+ −
+ − /*
+ − * We trust the ACI to give us a null-terminated string.
+ − */
+ − strcpy((CHAR*)csvm_data.number,number);
+ − csvm_data.c_number=strlen((CHAR*)csvm_data.number);
+ −
+ − /*
+ − * Note that in this instance the ACI is giving us the TOA as
+ − * a single number, rather than in its usual T_ACI_TOA format.
+ − */
+ − csvm_data.type=(U8)toa_val;
+ −
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : sBAT_PlusCLAN |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT sBAT_PlusCLAN (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_LAN_SUP lng;
+ − CHAR str[BAT_MAX_CLAN_CODE_LEN+1];
+ − USHORT i;
+ −
+ − TRACE_FUNCTION ("sBAT_PlusCLAN()");
+ −
+ − /*
+ − * Ensure that we have a null-terminated string.
+ − */
+ − memset(str,0,sizeof(str));
+ − memcpy(str,cmd->params.ptr_set_plus_clan->code,BAT_MAX_CLAN_CODE_LEN);
+ −
+ − lng.str=NULL;
+ −
+ − /*
+ − * The BAT provides the language in string form only, we must also
+ − * calculate the corresponding value. To do this we use the lookup
+ − * table "lngs".
+ − *
+ − * GSM 07.07 says that "AUTO" should be used for automatic mode, but
+ − * the (ATI) code uses "au". Here we want to accept both.
+ − */
+ − if (!strcmp(str,"AUTO"))
+ − {
+ − lng.lng=CLAN_LNG_AUT;
+ − lng.str="AUTO";
+ − }
+ − else
+ − {
+ − for (i=0;lngs[i].str;i++)
+ − {
+ − if (!strcmp(lngs[i].str,str))
+ − {
+ − lng.str=lngs[i].str;
+ − lng.lng=lngs[i].lng;
+ − break;
+ − }
+ − }
+ − }
+ −
+ − if (lng.str==NULL)
+ − {
+ − /*
+ − * Can't work out the language so give up.
+ − */
+ − ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_OpNotSupp);
+ − return(ACI_BAT_FAIL);
+ − }
+ −
+ − /*
+ − * Call the corresponding ACI function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)sAT_PlusCLAN(src_infos_psi->srcId,&lng);
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : qBAT_PlusCLAN |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT qBAT_PlusCLAN (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_LAN_SUP lng;
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_que_plus_clan clan_data;
+ −
+ − TRACE_FUNCTION ("qBAT_PlusCLAN()");
+ −
+ − resp.ctrl_response=BAT_RES_QUE_PLUS_CLAN;
+ − resp.response.ptr_que_plus_clan=&clan_data;
+ −
+ − memset(&clan_data,0,sizeof(clan_data));
+ − lng.str=(CHAR *)clan_data.code;
+ −
+ − /*
+ − * Call the corresponding ACI function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − * We are trusting this function not to deliver too long
+ − * a string. At the time of writing, it can only give us two
+ − * characters, which we easily have room for in the BAT
+ − * message.
+ − */
+ − ret=(T_ACI_BAT_RSLT)qAT_PlusCLAN(src_infos_psi->srcId,&lng);
+ −
+ − /*
+ − * If the query completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − clan_data.c_code=strlen(lng.str);
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ −
+ − return(ret);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT |
+ − | STATE : code ROUTINE : tBAT_PlusCLAN |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE :
+ − */
+ − GLOBAL T_ACI_BAT_RSLT tBAT_PlusCLAN (T_ACI_DTI_PRC_PSI *src_infos_psi,
+ − T_BAT_cmd_send *cmd)
+ − {
+ − T_ACI_BAT_RSLT ret;
+ − T_ACI_LAN_SUP lng[MAX_LAN];
+ − SHORT last_idx;
+ −
+ − TRACE_FUNCTION ("tBAT_PlusCLAN()");
+ −
+ − /*
+ − * Call the corresponding ACI function. T_ACI_BAT_RSLT is
+ − * assumed to be equivalent to T_ACI_RESULT.
+ − */
+ − ret=(T_ACI_BAT_RSLT)tAT_PlusCLAN(src_infos_psi->srcId,&last_idx,lng);
+ −
+ − /*
+ − * If the command completes, send the response now.
+ − */
+ − if (ret==ACI_BAT_CMPL)
+ − {
+ − USHORT i;
+ − T_BAT_cmd_response resp;
+ − T_BAT_res_tst_plus_clan clan_data;
+ −
+ − resp.ctrl_response=BAT_RES_TST_PLUS_CLAN;
+ − resp.response.ptr_tst_plus_clan=&clan_data;
+ −
+ − /*
+ − * We have received a list, however the BAT response only
+ − * allows for single items. So we must send each one
+ − * individually.
+ − */
+ − for (i=0;i<last_idx;i++)
+ − {
+ − clan_data.c_code=strlen(lng[i].str);
+ −
+ − /*
+ − * Discard any languages for which the string is too long for
+ − * BAT (this should never happen).
+ − */
+ − if (clan_data.c_code<=BAT_MAX_CLAN_CODE_LEN)
+ − {
+ − memcpy(clan_data.code,lng[i].str,BAT_MAX_CLAN_CODE_LEN);
+ − aci_bat_send(src_infos_psi,&resp);
+ − }
+ − }
+ − }
+ −
+ − return(ret);
+ − }
+ −