FreeCalypso > hg > fc-magnetite
view src/g23m-aci/aci/ati_ret.c @ 516:1ed9de6c90bd
src/g23m-gsm/sms/sms_for.c: bogus malloc removed
The new error handling code that was not present in TCS211 blob version
contains a malloc call that is bogus for 3 reasons:
1) The memory allocation in question is not needed in the first place;
2) libc malloc is used instead of one of the firmware's proper ways;
3) The memory allocation is made inside a function and then never freed,
i.e., a memory leak.
This bug was caught in gcc-built FreeCalypso fw projects (Citrine
and Selenite) because our gcc environment does not allow any use of
libc malloc (any reference to malloc produces a link failure),
but this code from TCS3.2 is wrong even for Magnetite: if this code
path is executed repeatedly over a long time, the many small allocations
made by this malloc call without a subsequent free will eventually
exhaust the malloc heap provided by the TMS470 environment, malloc will
start returning NULL, and the bogus code will treat it as an error.
Because the memory allocation in question is not needed at all,
the fix entails simply removing it.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 22 Jul 2018 06:04:49 +0000 |
parents | 53929b40109c |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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 Command Interpreter Call-Back Functions +----------------------------------------------------------------------------- */ #ifndef ATI_RET_C #define ATI_RET_C #include "aci_all.h" /* defines FF_TIMEZONE */ #include "line_edit.h" #include "aci_cmh.h" /* uses FF_TIMEZONE */ #include "ati_cmd.h" #include "aci_cmd.h" #include "aci_io.h" #include "p_aci.h" #include "aci.h" #include "l4_tim.h" #include "ksd.h" #include "psa.h" #include "psa_sms.h" #include "psa_sim.h" #include "cmh.h" #include "cmh_sms.h" #include "psa_cc.h" #include "psa_ss.h" #include "cmh_ss.h" #include "cmh_cc.h" #include "cmh_mm.h" #include "psa_util.h" #include "cmh_mm.h" #ifdef DTI #include "dti.h" /* functionality of the dti library */ #endif #include "dti_conn_mng.h" #ifdef GPRS #include "gaci.h" #include "gaci_cmh.h" #include "psa_sm.h" #include "cmh_sm.h" #endif /* GPRS */ #include "aci_mem.h" #include "aci_lst.h" #ifdef UART #include "psa_uart.h" #include "cmh_uart.h" #endif #include "conc_sms.h" #ifdef FF_PSI #include "psa_psi.h" #include "cmh_psi.h" #endif /*FF_PSI*/ #ifdef GPRS #include "gaci_cmd.h" #endif #include "aci_cmd.h" #if defined FF_EOTD #include "cmh_lc.h" #endif #include "ati_int.h" #ifdef ACI #include "cmh_mmi.h" #endif /* ACI */ #ifdef FF_ATI GLOBAL T_CIEV_SIGNAL_BUFFER asCievSignalBuf; GLOBAL T_CIEV_SMSFULL_BUFFER asCievSmsFullBuf; EXTERN CHAR *CPIN_RESULT(T_ACI_CPIN_RSLT code); EXTERN UBYTE src_id_ext; /* this source runs currently an extension command */ EXTERN T_ATI_IO_MODE ati_get_mode (UBYTE srcId ); EXTERN T_ATI_RSLT ati_execute_cmd_line (T_ATI_SRC_PARAMS *src_params); /* * needed for rCI_Z */ EXTERN void ati_cmd_reset (UBYTE srcId); EXTERN void ati_zn_retrieve_params ( UBYTE srcId ); LOCAL UBYTE aci_writeCnumMsisdn (UBYTE srcId, T_ACI_CNUM_MSISDN* msisdn ); LOCAL void aci_frmtOutput ( UBYTE fo, UBYTE dcs, T_ACI_SM_DATA *data ); LOCAL void r_Plus_Percent_COPS( T_ACI_AT_CMD cmd, SHORT lastIdx, T_ACI_COPS_OPDESC * operLst); LOCAL void aci_format_plmn_name(T_full_name * plmn, UBYTE *out); /* typedef struct { char *name; T_ACI_FAC fac; } net_fac; */ LOCAL BOOL allowCCCM = TRUE; LOCAL UBYTE callTime = 0; LOCAL const SMS_Memory sms_mem [] = { {"ME", SMS_STOR_Me}, {"me", SMS_STOR_Me}, {"SM", SMS_STOR_Sm}, {"sm", SMS_STOR_Sm}, {0,SMS_STOR_Me} }; #if defined (SMS_PDU_SUPPORT) LOCAL void rCI_PlusCMTText ( T_MNSMS_MESSAGE_IND * mnsms_message_ind); LOCAL void rCI_PlusCDSText ( T_MNSMS_STATUS_IND * mnsms_status_ind ); LOCAL void rCI_PlusCBMText ( T_MMI_CBCH_IND * mmi_cbch_ind ); LOCAL void rCI_PlusCMGSText( T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf); LOCAL void rCI_PlusCMSSText( T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf); LOCAL void rCI_PlusCMGCText( T_MNSMS_COMMAND_CNF * mnsms_command_cnf); #ifdef REL99 LOCAL void rCI_PercentCMGRSText ( UBYTE mode, T_MNSMS_RETRANS_CNF * mnsms_retrans_cnf, T_MNSMS_SEND_PROG_IND * mnsms_send_prog_ind ); #endif /* REL99 */ #endif LOCAL void rCI_Plus_Percent_CMGLText ( T_MNSMS_READ_CNF *mnsms_read_cnf, T_ACI_AT_CMD cmd); LOCAL void rCI_Plus_Percent_CMGRText ( T_MNSMS_READ_CNF * mnsms_read_cnf, T_ACI_CMGR_CBM * cbm, T_ACI_AT_CMD cmd); LOCAL void rCI_Plus_Percent_CMGLTextSP ( T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_AT_CMD cmdId); LOCAL void rCI_Plus_Percent_CMGRTextSP ( T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_AT_CMD cmdId); GLOBAL CHAR *sms_status (T_ACI_SMS_STAT stat) /* used in text mode by CMGL and CMGR */ { switch(stat) { case(SMS_STAT_Invalid): return "INVALID MESSAGE"; case(SMS_STAT_RecUnread): return "REC UNREAD"; case(SMS_STAT_RecRead): return "REC READ"; case(SMS_STAT_StoUnsent): return "STO UNSENT"; case(SMS_STAT_StoSent): return "STO SENT"; case(SMS_STAT_All): return "ALL"; default: return 0; } } GLOBAL char *ring_stat(T_ACI_CRING_SERV_TYP type) { switch(type) { case(CRING_SERV_TYP_NotPresent): return "Not Present"; case(CRING_SERV_TYP_Async): return "ASYNC"; case(CRING_SERV_TYP_Sync): return "SYNC"; case(CRING_SERV_TYP_RelAsync): return "REL ASYNC"; case(CRING_SERV_TYP_RelSync): return "REL SYNC"; case(CRING_SERV_TYP_Fax): return "FAX"; case(CRING_SERV_TYP_Voice): return "VOICE"; case(CRING_SERV_TYP_AuxVoice): return "AUX VOICE"; default: return "Error"; } } #define RING_STAT_LTH 15 /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_OK | +--------------------------------------------------------------------+ PURPOSE : handles AT_OK call back */ GLOBAL void rCI_OK ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId ) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_OK()"); src_params->curAtCmd = AT_CMD_NONE; switch (cmdId) { case (AT_CMD_D): TRACE_EVENT("AT command line successfully processed") ; /*lint -fallthrough*/ case (AT_CMD_NONE): case (AT_CMD_EXT): #if FF_FAX case (AT_CMD_FDR): case (AT_CMD_FDT): case (AT_CMD_FKS): #endif /* * tell line edit that the cmd line is finished/aborted * and to be able to receive a new one */ ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); io_sendConfirm (srcId, cmdAtError(atOk), ATI_NORMAL_OUTPUT); curAbrtCmd = AT_CMD_NONE; cmdErrStr = NULL; break; default: /* * there are possibly further AT cmds after re-entering the ACI context */ /* this is only a bypass for ATI sources which uses the functional interface */ if (src_params->cmd_state EQ CMD_IDLE) { io_sendConfirm (src_params->src_id, cmdAtError(atOk), ATI_NORMAL_OUTPUT); } else { /* * there are possibly further AT cmds after re-entering the ACI context */ ati_execute_cmd_line (src_params); } break; } #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( cmdId, RAT_OK, CPI_MSG_NotPresent ); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_NO_CARRIER | +--------------------------------------------------------------------+ PURPOSE : handles AT_NO_CARRIER call back */ GLOBAL void rCI_NO_CARRIER ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId, SHORT cId ) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_NO_CARRIER()"); if ( src_params->curAtCmd EQ AT_CMD_D OR src_params->curAtCmd EQ AT_CMD_A OR src_params->curAtCmd EQ AT_CMD_H OR src_params->curAtCmd EQ AT_CMD_CGDATA OR src_params->curAtCmd EQ AT_CMD_CGANS #ifdef FF_FAX OR src_params->curAtCmd EQ AT_CMD_FDR OR src_params->curAtCmd EQ AT_CMD_FDT #endif ) { ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); src_params->curAtCmd = AT_CMD_NONE; io_sendConfirm(srcId, cmdAtError(atNoCarrier), (T_ATI_OUTPUT_TYPE)(ATI_ERROR_OUTPUT | ATI_RESULT_CODE_OUTPUT)); } else { /* * According to the v25ter NO CARRIER is stated as a final result code. * * This implementation differ in this case from the standard. * There are two differnt reasons: * - Data transfer on a different source than the transfer was started * - NO CARRIER if the other peer of a CS call hangs up * * For the first reason the CONNECT will be the final result code (standard: intermediate) * For the second reason the ATD resuts an OK. */ io_sendIndication(srcId, cmdAtError(atNoCarrier), (T_ATI_OUTPUT_TYPE)(ATI_FORCED_OUTPUT | ATI_RESULT_CODE_OUTPUT)); } cmdErrStr = NULL; #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( cmdId, RAT_NO_CARRIER, CPI_MSG_NotPresent ); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_BUSY | +--------------------------------------------------------------------+ PURPOSE : handles AT_BUSY call back */ GLOBAL void rCI_BUSY ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId, SHORT cId ) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_BUSY()"); src_params->curAtCmd = AT_CMD_NONE; ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); io_sendConfirm(srcId, cmdAtError(atBusy), ATI_ERROR_OUTPUT); #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( cmdId, RAT_BUSY, CPI_MSG_NotPresent ); #endif cmdErrStr = NULL; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_NO_ANSWER | +--------------------------------------------------------------------+ PURPOSE : handles AT_NO_ANSWER call back */ GLOBAL void rCI_NO_ANSWER ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId, SHORT cId ) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_NO_ANSWER()"); src_params->curAtCmd = AT_CMD_NONE; ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); io_sendConfirm(srcId, cmdAtError(atNoAnswer), ATI_ERROR_OUTPUT); cmdErrStr = NULL; #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( cmdId, RAT_NO_ANSWER, CPI_MSG_NotPresent ); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CONNECT | +--------------------------------------------------------------------+ PURPOSE : handles AT_CONNECT call back. flow_cntr = TRUE flow control active. flow_cntr = FALSE " " inactive. */ GLOBAL void rCI_CONNECT ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId, T_ACI_BS_SPEED speed, SHORT cId, BOOL flow_cntr ) { LONG val; LONG val_nv=-1; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); CHAR *cmd_key = ""; TRACE_FUNCTION("rCI_CONNECT()"); src_params->curAtCmd = AT_CMD_NONE; switch(speed) { case(BS_SPEED_300_V110): val=300; val_nv = 10; break; case(BS_SPEED_1200_V110): val=1200; val_nv = 11; break; case(BS_SPEED_2400_V110): val=2400; val_nv = 13; break; case(BS_SPEED_4800_V110): val=4800; val_nv = 14; break; case(BS_SPEED_9600_V110): val=9600; val_nv = 15; break; case(BS_SPEED_14400_V110): val=14400; val_nv = 16; break; case(BS_SPEED_19200_V110): val=19200; break; case(BS_SPEED_38400_V110): val=38400; break; default: val=-1; } if (src_params EQ NULL) { TRACE_EVENT_P1 ("[ERR] rCI_CONNECT(): srcId=%d not found", srcId); return; } #ifdef UART if (src_params->src_type EQ ATI_SRC_TYPE_UART) { T_ACI_DTI_PRC *uart_infos; uart_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId); if( flow_cntr ) { /* this is in case of fax sending */ BITFIELD_SET (uart_infos->data_cntr, UART_DTI_FLOW_OFF); } else { BITFIELD_CLEAR (uart_infos->data_cntr, UART_DTI_FLOW_OFF); } } #endif #ifdef FF_PSI if (src_params->src_type EQ ATI_SRC_TYPE_PSI) { T_ACI_DTI_PRC_PSI *psi_infos; psi_infos = find_element (psi_src_params, (UBYTE)srcId, cmhPSItest_srcId); if( flow_cntr ) { /* this is in case of fax sending */ BITFIELD_SET (psi_infos->data_cntr, PSI_DTI_FLOW_OFF); } else { BITFIELD_CLEAR (psi_infos->data_cntr, PSI_DTI_FLOW_OFF); } } #endif /*FF_PSI*/ if(val > 0 AND ati_user_output_cfg[srcId].atX > 0) { if(at.s1415.atV NEQ 0) /*Verbose case*/ { sprintf(g_sa,"CONNECT %d",val); io_sendConfirm(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT | ATI_CONNECT_OUTPUT)); } else if(val_nv > 0) /*Nonverbose case*/ { sprintf(g_sa,"%d",val_nv); io_sendConfirm(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT | ATI_CONNECT_OUTPUT) ); } else io_sendConfirm(srcId, cmdAtError(atConnect), (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT | ATI_CONNECT_OUTPUT)); } else { io_sendConfirm(srcId, cmdAtError(atConnect), (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT | ATI_CONNECT_OUTPUT)); } /* * tell line edit that the cmd line is finished/aborted * and to be able to receive a new one */ ati_get_cmds_key(cmdId, &cmd_key, NULL); TRACE_EVENT_P1("%s completed", cmd_key); ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); cmdErrStr = NULL; #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( cmdId, RAT_CONNECT, CPI_MSG_NotPresent ); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCME | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCME call back */ GLOBAL void rCI_PlusCME ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId, T_ACI_CME_ERR err ) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PLusCME()"); /* * tell line edit that the cmd line is finished/aborted * and to be able to receive a new one */ ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); /* * if (asynchroniously) extension command, reset the global src_id_ext */ if (src_id_ext EQ src_params->src_id) { src_id_ext = 0xFF; } if ( curAbrtCmd EQ AT_CMD_NONE ) { src_params->curAtCmd = AT_CMD_NONE; io_sendConfirm(srcId, cmdCmeError(err), ATI_ERROR_OUTPUT); cmdErrStr = NULL; #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( cmdId, RAT_CME, CPI_MSG_NotPresent ); #endif } else { curAbrtCmd = AT_CMD_NONE; io_sendMessage ( srcId, cmdCmeError ( CME_ERR_FailedToAbort ), (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT | ATI_RESULT_CODE_OUTPUT)); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCPIN | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCPIN call back */ GLOBAL void rCI_PlusCPIN (/*UBYTE srcId,*/ T_ACI_CPIN_RSLT rslt ) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PLusCPIN()"); src_params->curAtCmd = AT_CMD_NONE; sprintf(g_sa,"%s%s","+CPIN: ",CPIN_RESULT(rslt)); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } typedef enum { STAT_NotPresent = -1, STAT_Other, /* other than registered and Roaming */ STAT_Reg, STAT_Roam } T_ACI_NTW_STATUS; LOCAL T_ACI_NTW_STATUS get_raw_stat_among_CREG( T_ACI_CREG_STAT status ) { switch(status) { case(CREG_STAT_NotPresent): return(STAT_NotPresent); case(CREG_STAT_Reg): return(STAT_Reg); case(CREG_STAT_Roam): return(STAT_Roam); default: return(STAT_Other); } } #ifdef GPRS LOCAL T_ACI_NTW_STATUS get_raw_stat_among_CGREG( T_CGREG_STAT status ) { switch(status) { case(CGREG_STAT_REG_HOME): return(STAT_Reg); case(CGREG_STAT_REG_ROAM): return(STAT_Roam); default: return(STAT_Other); } } LOCAL T_ACI_NTW_STATUS get_raw_stat_among_P_CGREG( T_P_CGREG_STAT status ) { switch(status) { case(P_CGREG_STAT_REG_HOME): return(STAT_Reg); case(P_CGREG_STAT_REG_ROAM): return(STAT_Roam); default: return(STAT_Other); } } #endif /* GPRS */ /* function fills up registration status parameters according to type of user notification (+CREG/+CGREG/%CGREG) returns whether network status has changed or not: BOOL */ LOCAL BOOL get_registration_data_among_cmd( UBYTE srcId, int status, T_ATI_REG_MOD_LAC_CID *mod_lac_cid, T_ACI_NTW_STATUS *raw_status, CHAR *cmd_string, T_ACI_CREG_CMD cmd) { USHORT previous_status, current_status; current_status = previous_status = status; switch(cmd) { case(CREG_CMD): *mod_lac_cid = ati_user_output_cfg[srcId].creg.mod_lac_cid; previous_status = ati_user_output_cfg[srcId].creg.last_presented_state; *raw_status = get_raw_stat_among_CREG((T_ACI_CREG_STAT) current_status); strcpy(cmd_string, "+CREG: "); break; case(PercentCREG_CMD): *mod_lac_cid = ati_user_output_cfg[srcId].percent_creg.mod_lac_cid; previous_status = ati_user_output_cfg[srcId].percent_creg.last_presented_state; *raw_status = get_raw_stat_among_CREG((T_ACI_CREG_STAT) current_status); strcpy(cmd_string, "%CREG: "); break; #if defined (GPRS) AND defined (DTI) case(PlusCGREG_CMD): *mod_lac_cid = ati_gprs_user_output_cfg[srcId].plus_cgreg.mod_lac_cid; previous_status = ati_gprs_user_output_cfg[srcId].plus_cgreg.last_presented_state; *raw_status = get_raw_stat_among_CGREG((T_CGREG_STAT) current_status); strcpy(cmd_string, "+CGREG: "); break; case(PercentCGREG_CMD): *mod_lac_cid = ati_gprs_user_output_cfg[srcId].percent_cgreg.mod_lac_cid; previous_status = ati_gprs_user_output_cfg[srcId].percent_cgreg.last_presented_state; *raw_status = get_raw_stat_among_P_CGREG((T_P_CGREG_STAT) current_status); strcpy(cmd_string, "%CGREG: "); break; #endif } if( current_status NEQ previous_status) { return TRUE; } return FALSE; } LOCAL void update_last_presented_datas_among_cmd( UBYTE srcId, int status, USHORT lac, USHORT cid, T_ACI_CREG_CMD cmd) { T_ATI_REG_MOD_LAC_CID *mod_lac_cid; switch(cmd) { case(CREG_CMD): ati_user_output_cfg[srcId].creg.last_presented_state = (T_ACI_CREG_STAT)status; mod_lac_cid = &ati_user_output_cfg[srcId].creg.mod_lac_cid; break; case(PercentCREG_CMD): ati_user_output_cfg[srcId].percent_creg.last_presented_state = (T_ACI_CREG_STAT)status; mod_lac_cid = &ati_user_output_cfg[srcId].percent_creg.mod_lac_cid; break; #if defined (GPRS) AND defined (DTI) case(PlusCGREG_CMD): ati_gprs_user_output_cfg[srcId].plus_cgreg.last_presented_state = (T_CGREG_STAT)status; mod_lac_cid = &ati_gprs_user_output_cfg[srcId].plus_cgreg.mod_lac_cid; break; case(PercentCGREG_CMD): ati_gprs_user_output_cfg[srcId].percent_cgreg.last_presented_state = (T_P_CGREG_STAT)status; mod_lac_cid = &ati_gprs_user_output_cfg[srcId].percent_cgreg.mod_lac_cid; break; #endif /* GPRS */ default: return; } if( lac NEQ NOT_PRESENT_16BIT ) { mod_lac_cid->last_presented_lac = lac; } if( cid NEQ NOT_PRESENT_16BIT ) { mod_lac_cid->last_presented_cid = cid; } } /* function sends notification to user about network registration status. Functionnality centralised for either +CREG/+CGREG/%CGREG... */ GLOBAL void r_plus_percent_CREG ( UBYTE srcId, int status, USHORT lac, USHORT cid, T_ACI_CREG_CMD cmd, T_ACI_P_CREG_GPRS_IND gprs_ind, U8 rt, BOOL bActiveContext ) { T_ATI_CREG_MOD mode; T_ATI_REG_MOD_LAC_CID mod_lac_cid; USHORT previous_lac, previous_cid; BOOL network_status_has_changed = FALSE; BOOL cell_has_changed = FALSE; CHAR loc_info[LOC_INFO_STRLTH] = ""; /* enough to get e.g. ",A1F4, F4D0" */ CHAR coverage_info[COVERAGE_INFO_STRLTH] = ""; CHAR *ctxtInfo = ""; CHAR gprs_info[GPRS_INFO_STRLTH] = ""; /* enough to get e.g. ", 2" */ T_ACI_NTW_STATUS raw_status; CHAR cmd_key[KEY]; USHORT presented_lac = NOT_PRESENT_16BIT, presented_cid = NOT_PRESENT_16BIT; TRACE_FUNCTION("r_plus_percent_CREG()"); /* check whether cell has changed */ network_status_has_changed = get_registration_data_among_cmd( srcId, status, &mod_lac_cid, &raw_status, cmd_key, cmd ); if( network_status_has_changed ) { TRACE_EVENT_P3("cmd: %d, source: %d, new network status: %d !", cmd, srcId, status); } mode = mod_lac_cid.pres_mode; previous_lac = mod_lac_cid.last_presented_lac; previous_cid = mod_lac_cid.last_presented_cid; /* check whether cell has changed */ if( ((lac NEQ NOT_PRESENT_16BIT) AND (lac NEQ previous_lac)) OR ((cid NEQ NOT_PRESENT_16BIT) AND (cid NEQ previous_cid)) ) { if(raw_status EQ STAT_Reg OR raw_status EQ STAT_Roam) { /* cell info is only relevant when registered or in roaming */ TRACE_EVENT_P2("cell has changed !, lac: %04X, cId: %04X", lac, cid); cell_has_changed = TRUE; } } /* comma always needed */ if (cmd EQ PercentCREG_CMD OR mode EQ CREG_MOD_LOC_INF_ON_CTXACT) { strcat(loc_info,",,"); } /* check if presentation should occur */ switch( mode ) { case(CREG_MOD_NotPresent): case(CREG_MOD_OFF): /* no presentation to user */ return; case(CREG_MOD_ON): if( cmd EQ PercentCREG_CMD ) { sprintf(loc_info, ", , , %d, %d", gprs_ind, rt); } else if( !network_status_has_changed ) { return; } /* network status is available and has changed */ break; case(CREG_MOD_LOC_INF_ON_CTXACT): case(CREG_MOD_LOC_INF_ON): if( (raw_status EQ STAT_Reg OR raw_status EQ STAT_Roam) AND cell_has_changed ) { presented_lac = lac; presented_cid = cid; } else if( (raw_status EQ STAT_Reg OR raw_status EQ STAT_Roam) AND network_status_has_changed ) { /* show last presented lac/cid */ presented_lac = mod_lac_cid.last_presented_lac; presented_cid = mod_lac_cid.last_presented_cid; } else if( network_status_has_changed ) { /* mobile is not registered: do not show location information parameters have already been initialized, so no need to set them */ } else { if( cmd NEQ PercentCREG_CMD ) { TRACE_EVENT_P3("%s presentation denied. mode: %d, network status: %d", cmd_key, mode, status); return; } } if( presented_lac NEQ NOT_PRESENT_16BIT AND presented_cid NEQ NOT_PRESENT_16BIT ) { sprintf(loc_info, ",\"%04X\",\"%04X\"", presented_lac, presented_cid); } else if ( mode EQ CREG_MOD_LOC_INF_ON_CTXACT ) { sprintf(loc_info, ",,"); } else { /* else no location info to be shown */ if( cmd EQ PercentCREG_CMD ) { sprintf(loc_info, ",,"); } } if ( cmd EQ PercentCREG_CMD ) { sprintf(coverage_info, ",%d,%d",gprs_ind,rt); strcat(loc_info, coverage_info); } break; } #ifdef GPRS if ( (cmd EQ PercentCGREG_CMD) AND (mode EQ CREG_MOD_LOC_INF_ON_CTXACT) ) { if( bActiveContext EQ TRUE ) ctxtInfo = ",1"; else ctxtInfo = ",0"; } sprintf(g_sa,"%s%d%s%s%s", cmd_key, status, loc_info, gprs_info, ctxtInfo ); #endif /* GPRS */ if( (cmd EQ PercentCREG_CMD) OR (cmd EQ CREG_CMD) ) { sprintf(g_sa,"%s%d%s", cmd_key, status, loc_info); } io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); update_last_presented_datas_among_cmd( srcId, status, presented_lac, presented_cid, cmd ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCREG | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCREG call backs(change in network registration status) */ GLOBAL void rCI_PlusCREG ( T_ACI_CREG_STAT status, USHORT lac, USHORT cid ) { UBYTE srcId = srcId_cb; U8 rt = 0; TRACE_FUNCTION("rCI_PlusCREG()"); r_plus_percent_CREG ( srcId, status, lac, cid, CREG_CMD, P_CREG_GPRS_Support_Unknown, /*ACI-SPR-17218: ignored*/ rt, FALSE ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCREG | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCREG call backs(change in network registration status) */ GLOBAL void rCI_PercentCREG ( T_ACI_CREG_STAT status, USHORT lac, USHORT cid, T_ACI_P_CREG_GPRS_IND gprs_ind, U8 rt) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCREG()"); r_plus_percent_CREG ( srcId, status, lac, cid, PercentCREG_CMD, /*ACI-SPR-17218: introduced for %CREG*/ gprs_ind, rt, TRUE ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCRING | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCRING call back */ /* should be called when ringing indications should stop */ GLOBAL void ati_stop_ring(void) { TRACE_FUNCTION("ati_stop_ring()"); at.rngPrms.rngCnt = 1; at.rngPrms.isRng = FALSE; at.S[1] = 0; /* S1 register will hold the ring counts */ /* Reset the CLIP parameters to default values */ at.clipPrms.stat = CLIP_STAT_NotPresent; memset( at.clipPrms.number, 0, sizeof(at.clipPrms.number)); memset(&at.clipPrms.type, 0, sizeof(T_ACI_TOA)); at.clipPrms.validity = MNCC_PRES_NOT_PRES; memset( at.clipPrms.subaddr, 0, sizeof(at.clipPrms.subaddr)); memset(&at.clipPrms.satype, 0, sizeof(T_ACI_TOS)); #ifdef NO_ASCIIZ memset(&at.clipPrms.alpha, 0, sizeof(T_ACI_PB_TEXT)); #else memset(at.clipPrms.alpha, 0, sizeof(at.clipPrms.alpha)); #endif TIMERSTOP( ACI_TRING ); } GLOBAL void rCI_PlusCRING ( /*UBYTE srcId,*/ T_ACI_CRING_MOD mode, T_ACI_CRING_SERV_TYP type1, T_ACI_CRING_SERV_TYP type2 ) { static T_ACI_CMD_SRC first_ringing_srcId = CMD_SRC_NONE; /* Source which will handle the ringing-timer */ UBYTE srcId = srcId_cb, autoAnswerSrcId = at.rngPrms.srcID_S0; T_ACI_AT_CMD autoanswer_command; T_ACI_RETURN ret; int DTR=0; UBYTE DTR_behaviour = DTR_BEHAVIOUR_Ignore; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCRING()"); if (first_ringing_srcId EQ CMD_SRC_NONE) first_ringing_srcId = (T_ACI_CMD_SRC)srcId; /* catch the first source id for setting up the ring timer */ /* save ringing parameter at the first call to rCI_PlusCRING */ if( !at.rngPrms.isRng AND at.rngPrms.rngCnt EQ 1 AND /* this is only done on the first ring, not on any subsequent*/ srcId EQ first_ringing_srcId) /* only first source will reach the setting of "at.rngPrms.isRng = TRUE" */ { at.rngPrms.mode = mode; at.rngPrms.type1 = type1; at.rngPrms.type2 = type2; at.rngPrms.isRng = TRUE; } if (!at.rngPrms.isRng) { return; /* dont emmit any "RING" but escape here if ringing has been stopped in a multi-source configuration on any source in rhe RAT_CRING loop */ } at.S[1] = at.rngPrms.rngCnt; /* S1 register will return the ring counts */ /* check for automatic reject of an network initiated context activation */ #if defined (GPRS) AND defined (DTI) if( at.rngPrms.mode EQ CRING_MOD_Gprs AND first_ringing_srcId EQ srcId AND /* it is sufficent to check this only for one ringing source */ cmhSM_call_reject(at.rngPrms.rngCnt, mode) ) { TRACE_EVENT_P2("PDP context is to be automatically rejected: RING count: %d, srcId %d", at.rngPrms.rngCnt, srcId_cb); ati_stop_ring(); ret=sAT_PlusCGANS((T_ACI_CMD_SRC)srcId, 0, NULL, GPRS_CID_OMITTED); if( ret EQ AT_CMPL ) return; TRACE_EVENT_P1("auto reject return error: %d", ret); cmdAtError(atError); return; } #endif #ifdef UART if (src_params->src_type EQ ATI_SRC_TYPE_UART) { T_ACI_DTI_PRC *uart_infos; uart_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId); if (BITFIELD_CHECK (uart_infos->data_cntr, UART_DTI_SA_BIT)) DTR=1; } #endif #if defined (FF_PSI) AND defined (DTI) if (src_params->src_type EQ ATI_SRC_TYPE_PSI) { T_ACI_DTI_PRC_PSI *psi_infos; psi_infos = find_element (psi_src_params, (UBYTE)srcId, cmhPSItest_srcId); if (BITFIELD_CHECK (psi_infos->data_cntr, PSI_DTI_SA_BIT)) DTR=1; } #endif qAT_AndD ( (T_ACI_CMD_SRC)srcId, &DTR_behaviour); if(DTR EQ 0 AND DTR_behaviour EQ DTR_BEHAVIOUR_ClearCall) { /* V.250 6.2.9 Circuit 108 (Data terminal ready) behaviour: Automatic answer is disabled while circuit 108/2 remains off. */ ; /* Also don't emit any RING while 108/2 remains off */ } else { if (at.rngPrms.rngCnt EQ 1 OR !check_should_buffer_ind(src_params)) /* Ring indications are not buffered, except of the first one */ { if(ati_user_output_cfg[srcId].CRC_stat) { switch(mode) { case CRING_MOD_Direct: sprintf(g_sa,"+CRING: %s",ring_stat(at.rngPrms.type1)); break; case CRING_MOD_Alternate: sprintf(g_sa,"+CRING: %s/%s",ring_stat(at.rngPrms.type1),ring_stat(at.rngPrms.type2)); break; #if defined (GPRS) AND defined (DTI) case CRING_MOD_Gprs: sprintf(g_sa,"+CRING: %s", cmhSM_ring_gprs_par()); break; #endif /* GPRS AND DTI */ } } else { strcpy(g_sa, cmdAtError(atRing)); cmdErrStr = NULL; } io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* check for automatic answer */ #ifdef GPRS if( at.rngPrms.mode EQ CRING_MOD_Gprs ) { autoAnswerSrcId = (UBYTE)(at.rngPrms.srcID_CGAUTO NEQ (char)NOT_PRESENT_8BIT ? at.rngPrms.srcID_CGAUTO : at.rngPrms.srcID_S0); } #endif if( srcId EQ autoAnswerSrcId AND /* Caution !!! */ at.rngPrms.type1 NEQ CRING_SERV_TYP_Fax AND /* Never auto answer FAX calls !!! */ at.rngPrms.type1 NEQ CRING_SERV_TYP_AuxVoice AND /* Instead continue ringing! */ #if defined (GPRS) AND defined (DTI) cmhSM_call_answer(at.rngPrms.rngCnt, at.rngPrms.mode) EQ TRUE #else /* GPRS */ (at.S[0] AND at.rngPrms.rngCnt >= at.S[0]) #endif /* GPRS */ ) { TRACE_EVENT_P2("Call is to be automatically answered: RING count: %d, srcId %d", at.rngPrms.rngCnt, srcId_cb); ati_stop_ring(); #if defined (GPRS) AND defined (DTI) if ( at.rngPrms.mode EQ CRING_MOD_Gprs ) { ret = sAT_PlusCGANS((T_ACI_CMD_SRC)autoAnswerSrcId, 1, "PPP", INVALID_CID); autoanswer_command = AT_CMD_CGANS; } else #endif { ret = sAT_A((T_ACI_CMD_SRC)autoAnswerSrcId); autoanswer_command = AT_CMD_A; } if( ret EQ AT_EXCT ) { src_params->curAtCmd = autoanswer_command; return; } TRACE_EVENT_P1("auto answer return error: %d", ret); cmdAtError(atError); return; } } if( first_ringing_srcId EQ srcId AND /* only the first source will start the ringing timer */ at.rngPrms.isRng AND /* ringing is still valid? */ at.rngPrms.rngCnt EQ 1 ) /* since Timer is self-retriggering */ { TRACE_EVENT_P1("start RING timer on Source: %d", srcId); PTIMERSTART( TRING_VALUE, TRING_VALUE, ACI_TRING ); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCRING_OFF | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCRING off call back */ GLOBAL void rCI_PlusCRING_OFF ( /*UBYTE srcId,*/ SHORT cId ) { TRACE_FUNCTION("rCI_PlusCRING_OFF()"); if( at.rngPrms.isRng ) { ati_stop_ring(); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentSIMREM | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentSIMREM call back */ GLOBAL void rCI_PercentSIMREM ( /*UBYTE srcId,*/ T_ACI_SIMREM_TYPE srType ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentSIMREM()"); if (ati_user_output_cfg[srcId].SIMIND_stat) { sprintf (g_sa, "%s%d", "%SIMREM: ", srType); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentSIMINS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentSIMINS call back */ GLOBAL void rCI_PercentSIMINS ( /*UBYTE srcId,*/ T_ACI_CME_ERR err ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentSIMINS()"); if (ati_user_output_cfg[srcId].SIMIND_stat) { sprintf (g_sa, "%s%d", "%SIMINS: ", err); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentKSIR | +--------------------------------------------------------------------+ PURPOSE : handles PercentKSIR call back. Code is in aci_util.c to share the code with BAT */ GLOBAL void rCI_PercentKSIR ( /*UBYTE srcId,*/ T_ACI_KSIR * ksStat ) { TRACE_FUNCTION("rCI_PercentKSIR()"); utl_cb_percentKSIR (srcId_cb, ksStat); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCLIR | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCLIR call back */ GLOBAL void rCI_PlusCLIR ( /*UBYTE srcId,*/ T_ACI_CLIR_MOD mode, T_ACI_CLIR_STAT stat) { UBYTE srcId = srcId_cb; sprintf(g_sa,"+CLIR: %d,%d",mode,stat); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : ACI/MMI MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCSQ | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCSQ call back Shen,Chao */ #ifdef FF_PS_RSSI GLOBAL void rCI_PercentCSQ(UBYTE rssi, UBYTE ber, UBYTE actlevel, UBYTE min_access_level) #else GLOBAL void rCI_PercentCSQ(UBYTE rssi, UBYTE ber, UBYTE actlevel) #endif { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCSQ()"); #ifdef FF_PS_RSSI sprintf (g_sa, "%s %d, %d, %d, %d", "%CSQ: ",rssi, ber, actlevel, min_access_level); #else sprintf (g_sa, "%s %d, %d, %d", "%CSQ: ",rssi, ber, actlevel); #endif io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusClip | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCLIP call back */ #ifdef NO_ASCIIZ GLOBAL void rCI_PlusCLIP ( /*UBYTE srcId,*/ T_ACI_CLIP_STAT stat, CHAR * number, T_ACI_TOA * type, U8 validity, CHAR * subaddr, T_ACI_TOS * satype, T_ACI_PB_TEXT * alpha) #else /* ifdef NO_ASCIIZ */ GLOBAL void rCI_PlusCLIP ( /*UBYTE srcId, */ T_ACI_CLIP_STAT stat, CHAR* number, T_ACI_TOA* type, U8 validity, CHAR* subaddr, T_ACI_TOS* satype, CHAR* alpha) #endif /* ifdef NO_ASCIIZ */ { char* me = "+CLIP: "; SHORT pos = 0; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; UBYTE *uniAlpha = NULL; UBYTE uniAlphaLen = 0; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PLusCLIP()"); /* save CLIP parameter */ at.clipPrms.stat = stat; if ( number ) memcpy(at.clipPrms.number, number, strlen(number)); if ( type ) memcpy(&at.clipPrms.type, type, sizeof(T_ACI_TOA)); at.clipPrms.validity = validity; if ( subaddr ) memcpy(at.clipPrms.subaddr, subaddr, strlen(subaddr)); if ( satype ) memcpy(&at.clipPrms.satype, satype, sizeof(T_ACI_TOS)); #ifdef NO_ASCIIZ if ( alpha ) memcpy(&at.clipPrms.alpha, alpha, sizeof(T_ACI_PB_TEXT)); #else if ( alpha ) memcpy(at.clipPrms.alpha, alpha, strlen(alpha)); #endif #ifdef NO_ASCIIZ if ( alpha NEQ NULL ) { uniAlpha = alpha->data; uniAlphaLen = alpha->len; } #else /* ifdef NO_ASCIIZ */ if ( alpha NEQ NULL ) { uniAlpha = (UBYTE *)alpha; uniAlphaLen = strlen(alpha); } #endif /* ifdef NO_ASCIIZ */ pos = sprintf(g_sa,"%s",me); if ( stat EQ CLIP_STAT_NotPresent ) /*Function call when connection is made*/ { if ( ati_user_output_cfg[srcId].CLIP_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN )*/ ) { if (number) { pos += sprintf(g_sa+pos,"\"%s\",",number); if (type) pos += sprintf(g_sa+pos,"%d,",toa_merge(*type)); else pos += sprintf(g_sa+pos,","); } else pos += sprintf(g_sa+pos,"\"\",128,"); if (subaddr) { pos += sprintf(g_sa+pos,"\"%s\",",subaddr); if (satype) pos += sprintf(g_sa+pos,"%d,",tos_merge(*satype)); else pos += sprintf(g_sa+pos,","); } else if (alpha) pos += sprintf(g_sa+pos,"\"\",,"); else if (validity NEQ MNCC_PRES_NOT_PRES) pos += sprintf(g_sa+pos,","); if (alpha) { utl_chsetFromSim ( uniAlpha, uniAlphaLen, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def ); pos+=sprints(g_sa+pos,cvtdAlpha,lenCvtdAlpha); } else if (validity NEQ MNCC_PRES_NOT_PRES) pos += sprintf(g_sa+pos,","); if (validity NEQ MNCC_PRES_NOT_PRES) pos += sprintf(g_sa+pos,",%d",validity); ci_remTrailCom(g_sa, pos); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } else /* Answer for qA_PlusCLIP*/ { src_params->curAtCmd = AT_CMD_NONE; sprintf(g_sa+pos,"%d,%d",ati_user_output_cfg[srcId].CLIP_stat,stat); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCdip | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCDIP call back */ GLOBAL void rCI_PlusCDIP (CHAR * number, T_ACI_TOA * type, CHAR * subaddr, T_ACI_TOS * satype) { char* me = "+CDIP: "; SHORT pos = 0; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCDIP()"); pos = sprintf(g_sa,"%s",me); if ( ati_user_output_cfg[srcId].CDIP_stat) { if (number) { pos += sprintf(g_sa+pos,"\"%s\",",number); if (type) { pos += sprintf(g_sa+pos,"%d,",toa_merge(*type)); if (subaddr) /* Only check to display subaddr if Number and Type are present */ { pos += sprintf(g_sa+pos,"\"%s\",",subaddr); if (satype) pos += sprintf(g_sa+pos,"%d",tos_merge(*satype)); } } else /* No Number Type present */ { pos += sprintf(g_sa+pos,","); } } else /* No Number present */ { pos += sprintf(g_sa+pos,"\"\",128,"); } ci_remTrailCom(g_sa, pos); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCOLP | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCOLP call back */ #ifdef NO_ASCIIZ GLOBAL void rCI_PlusCOLP ( /*UBYTE srcId,*/ T_ACI_COLP_STAT stat, CHAR *number, T_ACI_TOA *type, CHAR *subaddr, T_ACI_TOS *satype, T_ACI_PB_TEXT *alpha) #else /* ifdef NO_ASCIIZ */ GLOBAL void rCI_PlusCOLP ( /*UBYTE srcId, */ T_ACI_COLP_STAT stat, CHAR *number, T_ACI_TOA *type, CHAR *subaddr, T_ACI_TOS *satype, CHAR *alpha) #endif /* ifdef NO_ASCIIZ */ { char* me = "+COLP: "; int pos = 0; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; UBYTE *uniAlpha = NULL; UBYTE uniAlphaLen = 0; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PLusCOLP()"); #ifdef NO_ASCIIZ if ( alpha NEQ NULL ) { uniAlpha = alpha->data; uniAlphaLen = alpha->len; } #else /* ifdef NO_ASCIIZ */ if ( alpha NEQ NULL ) { uniAlpha = (UBYTE *)alpha; uniAlphaLen = strlen(alpha); } #endif /* ifdef NO_ASCIIZ */ pos = sprintf(g_sa,"%s",me); if (stat EQ COLP_STAT_NotPresent) /* Function call if connection is made*/ { if ( at.flags.COLP_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN ) */ ) { if (number) { pos += sprintf(g_sa+pos,"\"%s\",",number); if (type) pos += sprintf(g_sa+pos,"%d,",toa_merge(*type)); else pos += sprintf(g_sa+pos,"128,"); } else pos += sprintf(g_sa+pos,"\"\",128,"); if (subaddr) { pos += sprintf(g_sa+pos,"\"%s\",",subaddr); if (satype) pos += sprintf(g_sa+pos,"%d,",tos_merge(*satype)); else pos += sprintf(g_sa+pos,","); } else pos += sprintf(g_sa+pos,",,"); if (alpha) { utl_chsetFromSim ( uniAlpha, uniAlphaLen, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def ); pos+=sprints(g_sa+pos,cvtdAlpha,lenCvtdAlpha); } ci_remTrailCom(g_sa,(USHORT)pos); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } else /* Answer for qAT_PlusCOLP*/ { src_params->curAtCmd = AT_CMD_NONE; if (at.flags.COLP_stat) sprintf(g_sa+pos,"1,%d",stat); else sprintf(g_sa+pos,"0,%d",stat); ci_remTrailCom(g_sa,(USHORT)strlen(g_sa)); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCOLR | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCOLR call back */ GLOBAL void rCI_PercentCOLR ( /*UBYTE srcId,*/ T_ACI_COLR_STAT stat) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCOLR()"); sprintf(g_sa, "%s: %d", "%COLR", stat); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_DR | +--------------------------------------------------------------------+ PURPOSE : handles AT_DR call back */ GLOBAL void rCI_PlusDR ( /*UBYTE srcId,*/ T_ACI_DR_TYP type ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PLusDR()"); if ( ati_user_output_cfg[srcId].DR_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN )*/ ) { sprintf(g_sa,"+DR: %d",type); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CR | +--------------------------------------------------------------------+ PURPOSE : handles AT_CR call back */ GLOBAL void rCI_PlusCR ( /*UBYTE srcId,*/ T_ACI_CRING_SERV_TYP service ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PLusCR()"); if ( ati_user_output_cfg[srcId].CR_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN ) */ ) { sprintf(g_sa,"+CR: %s",ring_stat(service)); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCOPS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCOPS call back */ GLOBAL void rCI_PlusCOPS(/*UBYTE srcId, */ SHORT lastIdx, T_ACI_COPS_OPDESC * operLst) { TRACE_FUNCTION("rCI_PLusCOPS()"); r_Plus_Percent_COPS(AT_CMD_COPS, lastIdx, operLst); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCOPS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PecentCOPS call back */ GLOBAL void rCI_PercentCOPS(/*UBYTE srcId, */ SHORT lastIdx, T_ACI_COPS_OPDESC * operLst) { TRACE_FUNCTION("rCI_PercentCOPS()"); r_Plus_Percent_COPS(AT_CMD_P_COPS, lastIdx, operLst); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_Plus_Percent_COPS | +--------------------------------------------------------------------+ PURPOSE : common functioality for rCI_PlusCOPS and rCI_PercentCOPS */ LOCAL void r_Plus_Percent_COPS ( T_ACI_AT_CMD cmd, SHORT lastIdx, T_ACI_COPS_OPDESC * operLst) { char *format; USHORT i; BOOL END_OF_LIST = FALSE; T_ACI_RETURN ret; SHORT startIdx=0; int pos=0; UBYTE srcId = srcId_cb; char longName[MAX_ALPHA_OPER_LEN] = { '\0' }; char shrtName[MAX_ALPHA_OPER_LEN] = { '\0' }; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("r_Plus_Percent_COPS()"); if (lastIdx < 0) /* no operLst available */ { TRACE_EVENT("No operator list available"); return; } if (lastIdx < MAX_OPER) { if(cmd EQ AT_CMD_P_COPS) { pos=sprintf(g_sa,"%s","%COPS: "); } else { pos=sprintf(g_sa,"%s","+COPS: "); } } src_params->curAtCmd = AT_CMD_NONE; for(i=0; i < MAX_OPER; i++) { if (operLst[i].status < 0) { END_OF_LIST = TRUE; break; } format = ",(%d,\"%s\",\"%s\",\"%s\")"; if (i EQ 0) format++; /* the first recond begins without a comma */ if (operLst[i].pnn EQ Read_EONS) { if (operLst[i].long_len) { switch (operLst[i].long_ext_dcs>>4 & 0x07) { case 0x00: /* GSM default alphabet */ utl_cvtPnn7To8((UBYTE *)operLst[i].longOper, operLst[i].long_len, operLst[i].long_ext_dcs, (UBYTE *)longName); break; case 0x01: /* UCS2 */ TRACE_ERROR ("Unhandled UCS2 in PNN entry"); break; default: TRACE_ERROR ("Unknown DCS in PNN entry"); break; } } if (operLst[i].shrt_len) { switch (operLst[i].shrt_ext_dcs>>4 & 0x07) { case 0x00: /* GSM default alphabet */ utl_cvtPnn7To8((UBYTE *)operLst[i].shortOper, operLst[i].shrt_len, operLst[i].shrt_ext_dcs, (UBYTE *)shrtName); break; case 0x01: /* UCS2 */ TRACE_ERROR ("ERROR: Unhandled UCS2"); break; default: TRACE_ERROR ("ERROR: Unknown DCS"); break; } } pos+=sprintf(g_sa+pos, format, operLst[i].status, longName, shrtName, operLst[i].numOper); } else { pos+=sprintf(g_sa+pos, format, operLst[i].status, operLst[i].longOper, operLst[i].shortOper, operLst[i].numOper); } /* Beware of overwriting of g_sa */ #ifdef _SIMULATION_ /* Option for line by line output in simulation */ if (pos > 1) /* line-by-line in simulation */ { io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); g_sa[0]='\0'; pos=0; } #else if ((unsigned)pos > sizeof(g_sa)-80) /* a single plmn should not exceed 80 bytes */ { io_sendMessageEx(srcId, g_sa, ATI_ECHO_OUTPUT); g_sa[0]='\0'; pos=0; } #endif /* _SIMULATION_ */ } if (i EQ MAX_PLMN_ID) END_OF_LIST = TRUE; if (!END_OF_LIST) { startIdx=lastIdx+1; do { if(cmd EQ AT_CMD_P_COPS) { ret=tAT_PercentCOPS((T_ACI_CMD_SRC)srcId,startIdx,&lastIdx,&operLst[0]); } else { ret=tAT_PlusCOPS((T_ACI_CMD_SRC)srcId,startIdx,&lastIdx,&operLst[0]); } if (ret EQ AT_CMPL) { END_OF_LIST=FALSE; for(i=0;i<MAX_OPER;i++) { if (operLst[i].status < 0) { END_OF_LIST = TRUE; break; } pos+=sprintf(g_sa+pos,",(%d,\"%s\",\"%s\",\"%s\")", operLst[i].status,operLst[i].longOper, operLst[i].shortOper,operLst[i].numOper); /* Beware of overwriting of g_sa */ #ifdef _SIMULATION_ if (pos > 1) /* line-by-line in simulation */ { io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); g_sa[0]='\0'; pos=0; } #else if ((unsigned)pos > sizeof(g_sa)-80) /* a single plmn should not exceed 80 bytes */ { io_sendMessageEx(srcId, g_sa, ATI_ECHO_OUTPUT); g_sa[0]='\0'; pos=0; } #endif /* _SIMULATION_ */ } } if (ret EQ AT_EXCT) { src_params->curAtCmd = cmd; break; } if (ret EQ AT_FAIL) { cmdCmeError(CME_ERR_Unknown); break; } } while(!END_OF_LIST); } if (END_OF_LIST) io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CCWA | +--------------------------------------------------------------------+ PURPOSE : handles AT_CCWA call back */ #ifdef NO_ASCIIZ GLOBAL void rCI_PlusCCWA ( /*UBYTE srcId,*/ T_ACI_CLSSTAT * clsStat, CHAR * number, T_ACI_TOA * type, U8 validity, T_ACI_CLASS class_type, T_ACI_PB_TEXT * alpha ) #else /* ifdef NO_ASCIIZ */ GLOBAL void rCI_PlusCCWA (/*UBYTE srcId, */ T_ACI_CLSSTAT * clsStat, CHAR * number, T_ACI_TOA * type, U8 validity, T_ACI_CLASS class_type, CHAR * alpha ) #endif /* ifdef NO_ASCIIZ */ { char* me = "+CCWA: "; int i = 0; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; UBYTE *uniAlpha = NULL; UBYTE uniAlphaLen = 0; UBYTE srcId = srcId_cb; T_ACI_CLASS test_class; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCCWA()"); #ifdef NO_ASCIIZ if ( alpha NEQ NULL ) { uniAlpha = alpha->data; uniAlphaLen = alpha->len; } #else /* ifdef NO_ASCIIZ */ if ( alpha NEQ NULL ) { uniAlpha = (UBYTE *)alpha; uniAlphaLen = strlen(alpha); } #endif /* ifdef NO_ASCIIZ */ if(clsStat) /*Callback for q_AT_PlusCCWA*/ { if (clsStat->status EQ STATUS_Active) { src_params->curAtCmd = AT_CMD_NONE; test_class = CLASS_Vce; while( test_class < 2*CLASS_Fax ) { if( clsStat->class_type & test_class ) { TRACE_EVENT_P1("test_class: %d", test_class); sprintf(g_sa,"%s%d,%d", me, clsStat->status, test_class); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } test_class *= CLASS_Dat; /* test next class */ } } else { sprintf ( g_sa, "%s0,%d",me, clsStat->class_type ); io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT ); } } else /*call waiting indication*/ { if ( at.flags.CCWA_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN )*/ ) { i=sprintf(g_sa,"%s",me); if (number) { i+=sprintf(g_sa+i,"\"%s\",",number); if (type) i+=sprintf(g_sa+i,"%d,",toa_merge(*type)); else i+=sprintf(g_sa+i,"128,"); } else i+=sprintf(g_sa+i,"\"\",128,"); if (class_type >=0) i+=sprintf(g_sa+i,"%d,",class_type); else i+=sprintf(g_sa+i,","); if (alpha) { utl_chsetFromSim ( uniAlpha, uniAlphaLen, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def ); i+=sprints(g_sa+i,cvtdAlpha,lenCvtdAlpha); } if (validity NEQ MNCC_PRES_NOT_PRES) { i += sprintf(g_sa+i,",%d",validity); } ci_remTrailCom(g_sa, (USHORT)i); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( AT_CMD_NONE, RAT_CCWA, CPI_MSG_NotPresent ); #endif } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CCFC | +--------------------------------------------------------------------+ PURPOSE : handles AT_CCFC call back */ GLOBAL void rCI_PlusCCFC (/*UBYTE srcId,*/ T_ACI_CCFC_SET* setting) { char *me="+CCFC: "; int i=0; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCCFC()"); src_params->curAtCmd = AT_CMD_NONE; if (setting) /*Callback for qAT_PlusCCFC*/ { if (setting->clsstat.status EQ STATUS_Active) { i=sprintf(g_sa,"%s",me); if (setting->clsstat.status NEQ STATUS_NotPresent) i+=sprintf(g_sa+i,"%d,",setting->clsstat.status); else i+=sprintf(g_sa+i,","); if (setting->clsstat.class_type NEQ CLASS_NotPresent) i+=sprintf(g_sa+i,"%d,",setting->clsstat.class_type); else i+=sprintf(g_sa+i,","); if (setting->number[0] NEQ 0x0 ) i+=sprintf(g_sa+i,"\"%s\",",setting->number); else i+=sprintf(g_sa+i,","); if (setting->type.npi NEQ NPI_NotPresent ) i+=sprintf(g_sa+i,"%d,",toa_merge(setting->type)); else i+=sprintf(g_sa+i,","); if (setting->subaddr[0] NEQ 0x0 ) i+=sprintf(g_sa+i,"\"%s\",",setting->subaddr); else i+=sprintf(g_sa+i,","); if (setting->satype.tos NEQ TOS_NotPresent ) i+=sprintf(g_sa+i,"%d,",tos_merge(setting->satype)); else i+=sprintf(g_sa+i,","); if (setting->time NEQ ACI_NumParmNotPresent) i+=sprintf(g_sa+i,"%d",setting->time); ci_remTrailCom(g_sa,(USHORT)strlen(g_sa)); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } else { sprintf ( g_sa, "%s0,%d",me, setting->clsstat.class_type ); io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT ); } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CLCK | +--------------------------------------------------------------------+ PURPOSE : handles AT_CLCK call back */ GLOBAL void rCI_PlusCLCK (/*UBYTE srcId,*/ T_ACI_CLSSTAT * clsStat) { char *me="+CLCK: "; UBYTE srcId = srcId_cb; T_ACI_CLASS test_class; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCLCK()"); src_params->curAtCmd = AT_CMD_NONE; if(clsStat) /*Callback for qAT_PlusCLCK*/ { if (clsStat->status EQ STATUS_Active) { test_class = CLASS_Vce; while( test_class < 2*CLASS_Sms ) { if( clsStat->class_type & test_class ) { sprintf(g_sa,"%s%d,%d",me,clsStat->status,test_class); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } test_class *= CLASS_Dat; /* test next class */ } } else { sprintf ( g_sa, "%s0,%d", me, clsStat->class_type ); io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT ); } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CRSM | +--------------------------------------------------------------------+ PURPOSE : handles AT_CRSM call back */ GLOBAL void rCI_PlusCRSM ( /*UBYTE srcId,*/ SHORT sw1, SHORT sw2, SHORT rspLen, UBYTE *rsp ) { int i=0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCRSM()"); i=sprintf(g_sa,"%s","+CRSM: "); if (sw1 NEQ ACI_NumParmNotPresent) i+=sprintf(g_sa+i,"%d,",sw1); else i+=sprintf(g_sa+i,","); if (sw2 NEQ ACI_NumParmNotPresent) i+=sprintf(g_sa+i,"%d,",sw2); else i+=sprintf(g_sa+i,","); if (rspLen AND rsp) { utl_binToHex( rsp, rspLen, g_sa+i ); } ci_remTrailCom(g_sa,(USHORT)strlen(g_sa)); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CSIM | +--------------------------------------------------------------------+ PURPOSE : handles AT_CSIM call back */ GLOBAL void rCI_PlusCSIM ( /*UBYTE srcId,*/ SHORT len, UBYTE *rsp ) { UBYTE i; UBYTE srcId = srcId_cb; SHORT rstLen = 0; SHORT tmpLen; TRACE_FUNCTION("rCI_PlusCSIM()"); i=sprintf(g_sa,"%s%d,","+CSIM: ",len*2); if (len AND rsp) { if( len*2+i > (MAX_CMD_LEN-1) ) rstLen = (len*2+i) - (MAX_CMD_LEN-1); tmpLen = (rstLen)?len-rstLen/2:len; utl_binToHex( rsp, tmpLen, g_sa+i ); io_sendMessageEx(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT|ATI_BEGIN_CRLF_OUTPUT )); while( rstLen ) { rsp += tmpLen; tmpLen = rstLen/2; rstLen =( tmpLen*2 > (MAX_CMD_LEN-1))?tmpLen*2 - (MAX_CMD_LEN-1):0; if(rstLen) tmpLen = tmpLen-rstLen/2; utl_binToHex( rsp, tmpLen, g_sa ); io_sendMessageEx(srcId, g_sa, ATI_NORMAL_OUTPUT); } g_sa[0] = '\0'; io_sendMessageEx(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT|ATI_END_CRLF_OUTPUT)); } else { io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CSMS | +--------------------------------------------------------------------+ PURPOSE : handles AT_CSMS call back */ GLOBAL void rCI_PlusCSMS ( /*UBYTE srcId,*/ T_ACI_CSMS_SERV service, T_ACI_CSMS_SUPP mt, T_ACI_CSMS_SUPP mo, T_ACI_CSMS_SUPP bm) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); char *me="+CSMS: "; TRACE_FUNCTION("rCI_PlusCSMS()"); src_params->curAtCmd = AT_CMD_NONE; if (service < 0) sprintf(g_sa,"%s%d,%d,%d",me,mt,mo,bm); else sprintf(g_sa,"%s%d,%d,%d,%d",me,service,mt,mo,bm); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_CPMS | +--------------------------------------------------------------------+ PURPOSE : handles AT_CPMS call back */ GLOBAL void rCI_PlusCPMS ( /*UBYTE srcId,*/ T_ACI_SMS_STOR_OCC * mem1, T_ACI_SMS_STOR_OCC * mem2, T_ACI_SMS_STOR_OCC * mem3 ) { CHAR* me = "+CPMS: "; CHAR memstr1[3] = {0}; CHAR memstr2[3] = {0}; CHAR memstr3[3] = {0}; BOOL f1 = TRUE; BOOL f2 = TRUE; BOOL f3 = TRUE; int i = 0; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCPMS()"); src_params->curAtCmd = AT_CMD_NONE; if ( cpmsCallType EQ QAT_CALL ) { for ( i=0; sms_mem[i].name NEQ NULL; i++ ) { if ( ( sms_mem[i].stor EQ mem1->mem ) AND f1 ) { strcpy ( memstr1, sms_mem[i].name ); f1 = FALSE; } if ( ( sms_mem[i].stor EQ mem2->mem ) AND f2 ) { strcpy ( memstr2, sms_mem[i].name ); f2 = FALSE; } if ( ( sms_mem[i].stor EQ mem3->mem ) AND f3 ) { strcpy ( memstr3, sms_mem[i].name ); f3 = FALSE; } } sprintf ( g_sa, "%s\"%s\",%d,%d,\"%s\",%d,%d,\"%s\",%d,%d", me, memstr1, mem1->used, mem1->total, memstr2, mem2->used, mem2->total, memstr3, mem3->used, mem3->total ); } else { sprintf ( g_sa, "%s%d,%d,%d,%d,%d,%d", me, mem1->used, mem1->total, mem2->used, mem2->total, mem3->used, mem3->total ); } io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT ); cpmsCallType = NONE_CALL; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMS call back */ GLOBAL void rCI_PlusCMS ( /*UBYTE srcId,*/ T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err, T_EXT_CMS_ERROR *conc_error) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PLusCMS()"); ledit_ctrl (srcId,LEDIT_CTRL_CMPL, NULL); if ( curAbrtCmd EQ AT_CMD_NONE ) { src_params->curAtCmd = AT_CMD_NONE; io_sendConfirm(srcId, cmdCmsError(err), ATI_NORMAL_OUTPUT); cmdErrStr = NULL; } else { curAbrtCmd = AT_CMD_NONE; io_sendMessage ( srcId, cmdCmsError ( CMS_ERR_FailedToAbort ), (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT | ATI_RESULT_CODE_OUTPUT)); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCBM | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCBM call back */ GLOBAL void rCI_PlusCBM ( T_MMI_CBCH_IND * mmi_cbch_ind ) { UBYTE srcId = srcId_cb; T_ATI_IO_MODE ioMode; #if defined (SMS_PDU_SUPPORT) T_ACI_CMGF_MOD mode; #endif TRACE_FUNCTION("rCI_PlusCBM()"); /* Check if the source invoking this function is the same as the one * interested in SMS indications */ /* Issue 25033 */ if (srcId NEQ smsShrdPrm.smsSrcId) return; ioMode = ati_get_mode( srcId_cb ); if ( !cnmiFlushInProgress AND (ioMode NEQ ATI_UNKN_MODE) AND ( (at.CNMI_mode EQ CNMI_MOD_Buffer) OR ((ioMode EQ ATI_DATA_MODE) AND (at.CNMI_mode EQ CNMI_MOD_BufferAndFlush)) ) ) { T_CNMI_IND ind; memcpy (&ind.cbm, mmi_cbch_ind, sizeof(T_MMI_CBCH_IND)); cmd_addCnmiNtry ( CNMI_CBM, &ind ); } else if ( cnmiFlushInProgress OR ( ioMode EQ ATI_CMD_MODE AND at.CNMI_mode NEQ CNMI_MOD_Buffer ) ) #if defined (SMS_PDU_SUPPORT) { /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) { /* * handle PDU mode */ rCI_PlusCBMPdu (mmi_cbch_ind); } else { /* * handle Text mode */ rCI_PlusCBMText (mmi_cbch_ind); } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCBM | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCBM call back */ LOCAL void rCI_PlusCBMText ( T_MMI_CBCH_IND * mmi_cbch_ind ) #endif /* SMS_PDU_SUPPORT */ { USHORT pos; USHORT lenCvtdData = 0; CHAR cvtdData[2*MAX_CBM_LEN] = {0x00}; UBYTE srcId = srcId_cb; USHORT sn; /* serial number */ USHORT mid; /* message identifier */ UBYTE dcs; /* data coding scheme */ UBYTE page; /* actual page number */ UBYTE pages; /* total number of pages */ T_ACI_CBM_DATA msg; /* cell broadcast message data */ TRACE_FUNCTION("rCI_PLusCBMText()"); /* *----------------------------------------------------------------- * process parameters for new message indication *----------------------------------------------------------------- */ sn = ( ( SHORT )mmi_cbch_ind->cbch_msg[0] << 8 ) + mmi_cbch_ind->cbch_msg[1]; mid = ( ( SHORT )mmi_cbch_ind->cbch_msg[2] << 8 ) + mmi_cbch_ind->cbch_msg[3]; dcs = mmi_cbch_ind->cbch_msg[4]; page = ( mmi_cbch_ind->cbch_msg[5] & 0xF0 ) >> 4; pages = ( mmi_cbch_ind->cbch_msg[5] & 0x0F ); /* *----------------------------------------------------------------- * process message data, expanding from 7 to 8 bit *----------------------------------------------------------------- */ cmhSMS_expdSmsCb ( dcs, &mmi_cbch_ind->cbch_msg[CBCH_HEAD_LEN], (UBYTE)(mmi_cbch_ind->cbch_len - CBCH_HEAD_LEN), msg.data, &msg.len ); pos=sprintf(g_sa,"+CBM: %d,%d,%d,%d,%d",sn,mid,dcs,page,pages); io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); if (msg.len > 0) { pos = 0; utl_cbmDtaToTe((UBYTE*)msg.data, msg.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, 0, (UBYTE)dcs); pos+=sprintq(g_sa+pos,cvtdData,lenCvtdData); io_sendMessageEx(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_INDICATION_OUTPUT + ATI_FORCED_OUTPUT + ATI_END_CRLF_OUTPUT)); } } #if !defined (SMS_PDU_SUPPORT) } /* rCI_PlusCBM */ #endif /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCDS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCDS call back */ GLOBAL void rCI_PlusCDS ( T_MNSMS_STATUS_IND * mnsms_status_ind ) { UBYTE srcId = srcId_cb; T_ATI_IO_MODE ioMode; #if defined (SMS_PDU_SUPPORT) T_ACI_CMGF_MOD mode; #endif TRACE_FUNCTION("rCI_PLusCDS()"); /* Check if the source invoking this function is the same as the one * interested in SMS indications */ /* Issue 25033 */ if (srcId NEQ smsShrdPrm.smsSrcId) return; ioMode = ati_get_mode( srcId_cb ); if ( !cnmiFlushInProgress AND (ioMode NEQ ATI_UNKN_MODE) AND ( (at.CNMI_mode EQ CNMI_MOD_Buffer) OR ((ioMode EQ ATI_DATA_MODE) AND (at.CNMI_mode EQ CNMI_MOD_BufferAndFlush)) ) ) { T_CNMI_IND ind; memcpy ( &ind.cds, mnsms_status_ind, sizeof ( T_MNSMS_STATUS_IND) ); cmd_addCnmiNtry ( CNMI_CDS, &ind ); } else if ( cnmiFlushInProgress OR ( ioMode EQ ATI_CMD_MODE AND at.CNMI_mode NEQ CNMI_MOD_Buffer ) ) #if defined (SMS_PDU_SUPPORT) { /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) { /* * handle PDU mode */ rCI_PlusCDSPdu (mnsms_status_ind); } else { /* * handle Text mode */ rCI_PlusCDSText (mnsms_status_ind); } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCDSText | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCDS call back for text mode */ LOCAL void rCI_PlusCDSText (T_MNSMS_STATUS_IND * mnsms_status_ind) #endif /* SMS_PDU_SUPPORT */ { UBYTE srcId = srcId_cb; T_ACI_CDS_SM* p_st; SHORT pos = 0; TRACE_FUNCTION("rCI_PLusCDSText()"); /* is the SM already decoded ? */ if (smsShrdPrm.pDecMsg) p_st = (T_ACI_CDS_SM*)smsShrdPrm.pDecMsg; else { ACI_MALLOC(smsShrdPrm.pDecMsg, sizeof(T_ACI_CDS_SM) ); p_st = (T_ACI_CDS_SM*)smsShrdPrm.pDecMsg; cmhSMS_cpyStatInd ( p_st, mnsms_status_ind); } pos=sprintf(g_sa,"+CDS: %d,%d,",p_st->fo, p_st->msg_ref); if (strlen(p_st->addr)) pos+=sprintf(g_sa+pos,"\"%s\"",p_st->addr); else pos+=sprintf(g_sa+pos,","); if( (p_st->toa.ton NEQ TON_NotPresent) AND (p_st->toa.npi NEQ NPI_NotPresent) ) pos+=sprintf(g_sa+pos,",%d",toa_merge(p_st->toa)); else pos+=sprintf(g_sa+pos,","); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", p_st->vpabs_scts.year [0], p_st->vpabs_scts.year [1], p_st->vpabs_scts.month [0], p_st->vpabs_scts.month [1], p_st->vpabs_scts.day [0], p_st->vpabs_scts.day [1], p_st->vpabs_scts.hour [0], p_st->vpabs_scts.hour [1], p_st->vpabs_scts.minute[0], p_st->vpabs_scts.minute[1], p_st->vpabs_scts.second[0], p_st->vpabs_scts.second[1], p_st->vpabs_scts.timezone); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\",%d", p_st->vpabs_dt.year [0], p_st->vpabs_dt.year [1], p_st->vpabs_dt.month [0], p_st->vpabs_dt.month [1], p_st->vpabs_dt.day [0], p_st->vpabs_dt.day [1], p_st->vpabs_dt.hour [0], p_st->vpabs_dt.hour [1], p_st->vpabs_dt.minute[0], p_st->vpabs_dt.minute[1], p_st->vpabs_dt.second[0], p_st->vpabs_dt.second[1], p_st->vpabs_dt.timezone , p_st->tp_status); io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); } #if !defined (SMS_PDU_SUPPORT) } /* rCI_PlusCDS */ #endif /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMT | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMT call back */ GLOBAL void rCI_PlusCMT (T_MNSMS_MESSAGE_IND* mnsms_message_ind) { UBYTE srcId = srcId_cb; T_ATI_IO_MODE ioMode; #if defined (SMS_PDU_SUPPORT) T_ACI_CMGF_MOD mode; #endif TRACE_EVENT_P1("rCI_PlusCMT(): source Id: %d", srcId); /* Check if the source invoking this function is the same as the one * interested in SMS indications */ /* Issue 25033 */ if (srcId NEQ smsShrdPrm.smsSrcId) return; ioMode = ati_get_mode( srcId ); if( ioMode EQ ATI_UNKN_MODE ) { TRACE_EVENT("rCI_PlusCMT(): unused source (unknown ioMode) -> return"); return; } if ( !cnmiFlushInProgress AND ( (at.CNMI_mode EQ CNMI_MOD_Buffer) OR ( (ioMode EQ ATI_DATA_MODE) AND (at.CNMI_mode EQ CNMI_MOD_BufferAndFlush)) ) ) { /* terminal is busy --> store data into CNMI buffer */ T_CNMI_IND ind; TRACE_EVENT("rCI_PlusCMT(): terminal busy or buffer mode --> store data into CNMI buffer"); memcpy ( &ind.cmt, mnsms_message_ind, sizeof ( T_MNSMS_MESSAGE_IND) ); cmd_addCnmiNtry ( CNMI_CMT, &ind ); if ( smsShrdPrm.cnma_ack_expected EQ TRUE ) { /* the acknowledge must be send automatically, because terminal is busy */ PALLOC (mnsms_ack_res, MNSMS_ACK_RES); TRACE_EVENT("rCI_PlusCMT(): send 'automatic' acknowledge (Phase2+ mode and buffer)"); mnsms_ack_res->resp = SMS_RP_ACK; mnsms_ack_res->sms_sdu.o_buf = 0; mnsms_ack_res->sms_sdu.l_buf = 0; PSENDX (SMS, mnsms_ack_res); smsShrdPrm.cnma_ack_expected = FALSE; } } else { /* flush in progress or terminal is not busy */ TRACE_EVENT("rCI_PlusCMT(): flush in progress or command mode --> show +CMT on terminal"); if ( cnmiFlushInProgress OR ( (ioMode EQ ATI_CMD_MODE) AND (at.CNMI_mode NEQ CNMI_MOD_Buffer) ) ) #if defined (SMS_PDU_SUPPORT) { /* request current mode (text or PDU) */ if( smsShrdPrm.CNMImt EQ 0 ) { TRACE_EVENT("rCI_PlusCMT(): +CNMI <mt>=0 --> no routing to terminal (error in SMS entity)"); return; } qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) { /* * handle PDU mode */ rCI_PlusCMTPdu (mnsms_message_ind); } else { /* * handle Text mode */ rCI_PlusCMTText (mnsms_message_ind); } } else { TRACE_EVENT_P3("rCI_PlusCMT(): cannot display the +CMT --> flushInProgess?: %d, ioMode: %d, CNMI Mode: % d", cnmiFlushInProgress, ioMode, at.CNMI_mode); } } } LOCAL void rCI_PlusCMTText (T_MNSMS_MESSAGE_IND* mnsms_message_ind) #endif /* SMS_PDU_SUPPORT */ { SHORT pos = 0; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; CHAR cvtdData[2*MAX_SM_LEN]; USHORT lenCvtdData; UBYTE srcId = srcId_cb; T_ACI_CMGL_SM* p_sm; #if defined FF_EOTD T_LOC_MLC_ADDRESS* lc_orig_addr_ptr; int i = 0; #endif CHAR cvtdAddr[4*MAX_SMS_ADDR_DIG]; USHORT lenCvtdAddr; TRACE_FUNCTION("rCI_PlusCMTText()"); pos=sprintf(g_sa,"+CMT: "); /* is the SM already decoded ? */ if (smsShrdPrm.pDecMsg) p_sm = smsShrdPrm.pDecMsg; else { ACI_MALLOC(smsShrdPrm.pDecMsg, sizeof(T_ACI_CMGL_SM) ); p_sm = smsShrdPrm.pDecMsg; /* Implements Measure # 110 */ cmhSMS_cpyMsgIndReadCnf (p_sm, &mnsms_message_ind->status, &mnsms_message_ind->sms_sdu, mnsms_message_ind->rec_num); } #if defined FF_EOTD memset(&lc_orig_addr,0,sizeof(T_LOC_MLC_ADDRESS)); lc_orig_addr_ptr = &lc_orig_addr; lc_orig_addr_ptr->toa.npi = p_sm->toa.npi; lc_orig_addr_ptr->toa.ton = p_sm->toa.ton; if(lc_orig_addr_ptr->toa.ton EQ TON_International) { lc_orig_addr_ptr->address[i] = '+'; i++; } strncpy(lc_orig_addr_ptr->address+i,p_sm->adress,sizeof(p_sm->adress)-(size_t)i); #endif /* FF_EOTD */ /* If toa is Alphanumeric then convert the GSM chars to the one used by TE chars */ if(p_sm->toa.ton EQ TON_Alphanumeric) /* Alphanumeric Destination Address */ { utl_chsetFromGsm ( (UBYTE*)p_sm->adress, (USHORT)strlen(p_sm->adress), (UBYTE*)cvtdAddr, sizeof(cvtdAddr), &lenCvtdAddr, GSM_ALPHA_Def ); pos+=sprintf(g_sa+pos,"\"%s\",", cvtdAddr); } else { pos+=sprintf(g_sa+pos,"\"%s\",",p_sm->adress); } #ifdef FF_ATI_BAT /* * Extracting the alphanumeric data from the phonebook at this point * would defeat the object (testing the BAT message). Having this * data stored globally represents an easier solution to the * problem of conveying it here. */ if (smsShrdPrm.alpha_len) { pos+=sprints(g_sa+pos,smsShrdPrm.alpha,smsShrdPrm.alpha_len); } #else if( p_sm->alpha.len > 0 ) { utl_chsetFromGsm((UBYTE*)p_sm->alpha.data, p_sm->alpha.len, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def); pos+=sprints(g_sa+pos,cvtdAlpha,lenCvtdAlpha); } #endif pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", /* SCTS */ p_sm->scts.year [0], p_sm->scts.year [1], p_sm->scts.month [0], p_sm->scts.month [1], p_sm->scts.day [0], p_sm->scts.day [1], p_sm->scts.hour [0], p_sm->scts.hour [1], p_sm->scts.minute[0], p_sm->scts.minute[1], p_sm->scts.second[0], p_sm->scts.second[1], p_sm->scts.timezone); if (ati_user_output_cfg[srcId].CSDH_stat) { if(strlen(p_sm->adress)) pos+=sprintf(g_sa+pos,",%d",toa_merge(p_sm->toa)); else pos+=sprintf(g_sa+pos,","); pos+=sprintf(g_sa+pos,",%d,%d,%d",p_sm->fo,p_sm->pid,p_sm->dcs); /*FO, PID, DCS*/ if(strlen(p_sm->sca)) { pos+=sprintf(g_sa+pos,",\"%s\"",p_sm->sca); pos+=sprintf(g_sa+pos,",%d",toa_merge(p_sm->tosca)); } else pos+=sprintf(g_sa+pos,",,"); } if (((UBYTE)p_sm->fo & TP_UDHI_MASK) EQ TP_UDHI_WITH_HEADER) { T_ACI_SM_DATA data; aci_frmtOutput(p_sm->fo, p_sm->dcs, &data); utl_smDtaToTe((UBYTE*)data.data, data.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, (UBYTE)p_sm->fo, (UBYTE)p_sm->dcs); if (ati_user_output_cfg[srcId].CSDH_stat) pos+=sprintf(g_sa+pos,",%d",data.len); io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); pos=sprintq(g_sa,cvtdData,lenCvtdData); io_sendMessageEx(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_INDICATION_OUTPUT + ATI_FORCED_OUTPUT + ATI_END_CRLF_OUTPUT)); } else { if (ati_user_output_cfg[srcId].CSDH_stat) pos+=sprintf(g_sa+pos,",%d",p_sm->data.len); io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); if (p_sm->data.len > 0) { utl_smDtaToTe((UBYTE*)p_sm->data.data, p_sm->data.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, (UBYTE)p_sm->fo, (UBYTE)p_sm->dcs); pos=sprintq(g_sa,cvtdData,lenCvtdData); } else { g_sa[0]='\0'; } io_sendMessageEx(srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_INDICATION_OUTPUT + ATI_FORCED_OUTPUT + ATI_END_CRLF_OUTPUT)); } } #if !defined (SMS_PDU_SUPPORT) } /* else in previous function */ } /* rCI_PlusCMT */ #endif /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMGR | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMGR call back (Read Message) */ GLOBAL void rCI_PlusCMGR ( T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_CMGR_CBM * cbm) { UBYTE msg_type; #if defined (SMS_PDU_SUPPORT) UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_Plus_Percent_CMGRPdu (mnsms_read_cnf, AT_CMD_CMGR); else #endif /* * handle Text mode */ { /* querying the type of the SM */ cmhSMS_SMSQueryType (&mnsms_read_cnf->sms_sdu, &msg_type); if (msg_type EQ TP_MTI_SMS_STATUS_REP) rCI_Plus_Percent_CMGRTextSP (mnsms_read_cnf, AT_CMD_CMGR); else rCI_Plus_Percent_CMGRText (mnsms_read_cnf, cbm, AT_CMD_CMGR); } } LOCAL void rCI_Plus_Percent_CMGRText (T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_CMGR_CBM * cbm, T_ACI_AT_CMD cmd ) { CHAR* buf; SHORT pos = 0; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; CHAR cvtdData[2*MAX_SM_LEN]; USHORT lenCvtdData; UBYTE srcId = srcId_cb; T_ACI_CMGL_SM* p_sm; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); char vpenh_str[15]; CHAR cvtdAddr[4*MAX_SMS_ADDR_DIG]; USHORT lenCvtdAddr; TRACE_FUNCTION("rCI_Plus_Percent_CMGRText()"); src_params->curAtCmd = AT_CMD_NONE; /* is the SM already decoded ? */ if (smsShrdPrm.pDecMsg) p_sm = smsShrdPrm.pDecMsg; else { ACI_MALLOC(smsShrdPrm.pDecMsg, sizeof(T_ACI_CMGL_SM) ); p_sm = smsShrdPrm.pDecMsg; /* Implements Measure # 110 */ cmhSMS_cpyMsgIndReadCnf (p_sm, &mnsms_read_cnf->status, &mnsms_read_cnf->sms_sdu, mnsms_read_cnf->rec_num); } buf=sms_status(p_sm->stat); if (buf) /* STATUS */ { if (cmd EQ AT_CMD_CMGR) { pos=sprintf(g_sa,"+CMGR: \"%s\"",buf); } else { pos=sprintf (g_sa, " %s: \"%s\"", "%CMGR", buf); } } else { if (cmd EQ AT_CMD_CMGR) { pos=sprintf(g_sa,"+CMGR: ,"); } else { pos=sprintf (g_sa, " %s", "%CMGR: ,"); } } /* If toa is Alphanumeric then convert the GSM chars to the one used by TE chars */ if(p_sm->toa.ton EQ TON_Alphanumeric) /* Alphanumeric Destination Address */ { utl_chsetFromGsm ( (UBYTE*)p_sm->adress, (USHORT)strlen(p_sm->adress), (UBYTE*)cvtdAddr, sizeof(cvtdAddr), &lenCvtdAddr, GSM_ALPHA_Def ); pos+=sprintf(g_sa+pos,",\"%s\"", cvtdAddr); } else { pos+=sprintf(g_sa+pos,",\"%s\"",p_sm->adress); /*Destination Address*/ } #ifdef FF_ATI_BAT /* * Extracting the alphanumeric data from the phonebook at this point * would defeat the object (testing the BAT message). Having this * data stored globally represents a quick and dirty solution to the * problem of conveying it here. */ if (smsShrdPrm.alpha_len) { pos+=sprints(g_sa+pos,smsShrdPrm.alpha,smsShrdPrm.alpha_len); } else { pos+=sprintf(g_sa+pos,","); } #else if (p_sm->alpha.len > 0) /*ALPHA*/ { pos+=sprintf(g_sa+pos,","); utl_chsetFromGsm((UBYTE*)p_sm->alpha.data, p_sm->alpha.len, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def); pos+=sprints(g_sa+pos,cvtdAlpha,lenCvtdAlpha); } else pos+=sprintf(g_sa+pos,","); #endif /*FF_ATI_BAT*/ if ((p_sm->fo & TP_MTI_MASK) EQ TP_MTI_SMS_DELIVER) { pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", p_sm->scts.year [0], p_sm->scts.year [1], p_sm->scts.month [0], p_sm->scts.month [1], p_sm->scts.day [0], p_sm->scts.day [1], p_sm->scts.hour [0], p_sm->scts.hour [1], p_sm->scts.minute[0], p_sm->scts.minute[1], p_sm->scts.second[0], p_sm->scts.second[1], p_sm->scts.timezone); } if(ati_user_output_cfg[srcId].CSDH_stat) { if(strlen(p_sm->adress)) /*TOA Destination*/ pos+=sprintf(g_sa+pos,",%d",toa_merge(p_sm->toa)); else pos+=sprintf(g_sa+pos,","); pos+=sprintf(g_sa+pos,",%d,%d,%d",p_sm->fo,p_sm->pid,p_sm->dcs); /*FO, PID, DCS*/ if ((p_sm->fo & TP_MTI_MASK) EQ TP_MTI_SMS_SUBMIT) { if ((p_sm->fo & TP_VPF_MASK) EQ TP_VPF_ABSOLUTE) { pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", p_sm->scts.year [0], p_sm->scts.year [1], p_sm->scts.month [0], p_sm->scts.month [1], p_sm->scts.day [0], p_sm->scts.day [1], p_sm->scts.hour [0], p_sm->scts.hour [1], p_sm->scts.minute[0], p_sm->scts.minute[1], p_sm->scts.second[0], p_sm->scts.second[1], p_sm->scts.timezone); } else if ((p_sm->fo & TP_VPF_MASK) EQ TP_VPF_ENHANCED) { aci_encodeVpenh ( vpenh_str, &p_sm->vp_enh ); pos+=sprintf(g_sa+pos,",\"%s\"",vpenh_str); } else if ((p_sm->fo & TP_VPF_MASK) EQ TP_VPF_RELATIVE) pos+=sprintf(g_sa+pos,",%d",p_sm->vp_rel); else pos+=sprintf(g_sa+pos,","); } if(strlen(p_sm->sca)) /*Destination Address*/ { pos+=sprintf(g_sa+pos,",\"%s\"",p_sm->sca); pos+=sprintf(g_sa+pos,",%d",toa_merge(p_sm->tosca)); } else pos+=sprintf(g_sa+pos,",,"); } if (((UBYTE)p_sm->fo & TP_UDHI_MASK) EQ TP_UDHI_WITH_HEADER) { T_ACI_SM_DATA data; aci_frmtOutput (p_sm->fo, p_sm->dcs, &data); utl_smDtaToTe((UBYTE*)data.data, data.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, (UBYTE)p_sm->fo, (UBYTE)p_sm->dcs); if(ati_user_output_cfg[srcId].CSDH_stat) pos+=sprintf(g_sa+pos,",%d",data.len); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); pos=sprintq(g_sa,cvtdData,lenCvtdData); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } else { if(ati_user_output_cfg[srcId].CSDH_stat) pos+=sprintf(g_sa+pos,",%d",p_sm->data.len); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); if (p_sm->data.len > 0) { utl_smDtaToTe( (UBYTE*)p_sm->data.data, p_sm->data.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, (UBYTE)p_sm->fo, (UBYTE)p_sm->dcs); pos=sprintq(g_sa,cvtdData,lenCvtdData); } else /* empty SMS passed */ { g_sa[0]='\0'; } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMTI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMTI call back */ GLOBAL void rCI_PlusCMTI ( /*UBYTE srcId,*/ T_ACI_SMS_STOR mem, UBYTE index) { UBYTE srcId = srcId_cb; char mem_str[3]; SHORT i; T_ATI_IO_MODE ioMode; /* Check if the source invoking this function is the same as the one * interested in SMS indications */ /* Issue 25033 */ if (srcId NEQ smsShrdPrm.smsSrcId) return; TRACE_EVENT_P1("rCI_PlusCMTI(): source Id: %d", srcId); ioMode = ati_get_mode( srcId_cb ); if ( !cnmiFlushInProgress AND (ioMode NEQ ATI_UNKN_MODE) AND ( (at.CNMI_mode EQ CNMI_MOD_Buffer) OR ((ioMode EQ ATI_DATA_MODE) AND (at.CNMI_mode EQ CNMI_MOD_BufferAndFlush)) ) ) { T_CNMI_IND ind; ind.cmti.mem = mem; ind.cmti.index = index; cmd_addCnmiNtry ( CNMI_CMTI, &ind ); } else if ( cnmiFlushInProgress OR ( ioMode EQ ATI_CMD_MODE AND at.CNMI_mode NEQ CNMI_MOD_Buffer ) ) { for (i=0;sms_mem[i].name NEQ 0;i++) { if (sms_mem[i].stor EQ mem) { strcpy(mem_str,sms_mem[i].name); break; } } sprintf(g_sa,"+CMTI: \"%s\",%d",mem_str,index); io_sendIndication(srcId, g_sa, ATI_FORCED_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMGS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMGS call back */ GLOBAL void rCI_PlusCMGS (T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf) #if defined (SMS_PDU_SUPPORT) { UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_PlusCMGSPdu (mnsms_submit_cnf); else /* * handle Text mode */ rCI_PlusCMGSText (mnsms_submit_cnf); } LOCAL void rCI_PlusCMGSText ( T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf ) #endif { SHORT pos = 0; T_ACI_VP_ABS scts; UBYTE srcId = srcId_cb; UBYTE *buf; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCMGSText()"); src_params->curAtCmd = AT_CMD_NONE; pos=sprintf(g_sa,"+CMGS: %d", mnsms_submit_cnf->tp_mr); if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus) { if (mnsms_submit_cnf->sms_sdu.l_buf) { /* skip SCA in SIM-PDU, buf points to SMS-SUBMIT-REPORT */ buf = mnsms_submit_cnf->sms_sdu.buf + mnsms_submit_cnf->sms_sdu.buf[0] + 1; /* advance to TP-SCTS */ if (mnsms_submit_cnf->cause EQ SMS_NO_ERROR) buf += 2; /* offset in SMS-SUBMIT-REPORT for RP-ACK */ else buf += 3; /* offset in SMS-SUBMIT-REPORT for RP-ERROR */ cmh_unpackSCTS (&scts, buf); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", /* SCTS */ scts.year [0], scts.year [1], scts.month [0], scts.month [1], scts.day [0], scts.day [1], scts.hour [0], scts.hour [1], scts.minute[0], scts.minute[1], scts.second[0], scts.second[1], scts.timezone); } } io_sendMessageEx( srcId, g_sa,(T_ATI_OUTPUT_TYPE) (ATI_NORMAL_OUTPUT | ATI_BEGIN_CRLF_OUTPUT | ATI_END_CRLF_OUTPUT)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMSS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMSS call back */ GLOBAL void rCI_PlusCMSS (T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf) #if defined (SMS_PDU_SUPPORT) { UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_PlusCMSSPdu (mnsms_submit_cnf); else /* * handle Text mode */ rCI_PlusCMSSText (mnsms_submit_cnf); } LOCAL void rCI_PlusCMSSText ( T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf ) #endif { SHORT pos = 0; T_ACI_VP_ABS scts; UBYTE srcId = srcId_cb; UBYTE *buf; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCMSSText()"); src_params->curAtCmd = AT_CMD_NONE; pos=sprintf(g_sa,"+CMSS: %d", mnsms_submit_cnf->tp_mr); if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus) { if (mnsms_submit_cnf->sms_sdu.l_buf) { /* skip SCA in SIM-PDU, buf points to SMS-SUBMIT-REPORT */ buf = mnsms_submit_cnf->sms_sdu.buf + mnsms_submit_cnf->sms_sdu.buf[0] + 1; /* advance to TP-SCTS */ if (mnsms_submit_cnf->cause EQ SMS_NO_ERROR) buf += 2; /* offset in SMS-SUBMIT-REPORT for RP-ACK */ else buf += 3; /* offset in SMS-SUBMIT-REPORT for RP-ERROR */ cmh_unpackSCTS (&scts, buf); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", /* SCTS */ scts.year [0], scts.year [1], scts.month [0], scts.month [1], scts.day [0], scts.day [1], scts.hour [0], scts.hour [1], scts.minute[0], scts.minute[1], scts.second[0], scts.second[1], scts.timezone); } } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMGW | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMGW call back */ GLOBAL void rCI_PlusCMGW ( /*UBYTE srcId,*/ UBYTE index) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PLusCMGW()"); src_params->curAtCmd = AT_CMD_NONE; sprintf(g_sa,"+CMGW: %d",index); io_sendMessageEx( srcId, g_sa,(T_ATI_OUTPUT_TYPE) (ATI_NORMAL_OUTPUT | ATI_BEGIN_CRLF_OUTPUT | ATI_END_CRLF_OUTPUT)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMGC | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMGC call back */ GLOBAL void rCI_PlusCMGC (T_MNSMS_COMMAND_CNF * mnsms_command_cnf) #if defined (SMS_PDU_SUPPORT) { UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_PlusCMGCPdu (mnsms_command_cnf); else /* * handle Text mode */ rCI_PlusCMGCText (mnsms_command_cnf); } LOCAL void rCI_PlusCMGCText ( T_MNSMS_COMMAND_CNF * mnsms_command_cnf ) #endif { SHORT pos = 0; T_ACI_VP_ABS scts; UBYTE srcId = srcId_cb; UBYTE *buf; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCMGCText()"); src_params->curAtCmd = AT_CMD_NONE; pos=sprintf(g_sa,"+CMGC: %d", mnsms_command_cnf->tp_mr); if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus) { if (mnsms_command_cnf->sms_sdu.l_buf) { /* skip SCA in SIM-PDU, buf points to SMS-STATUS-REPORT */ buf = mnsms_command_cnf->sms_sdu.buf + mnsms_command_cnf->sms_sdu.buf[0] + 1; /* advance to to TP-RA */ buf += 2; /* skip variable TP-RA and advance to TP-SCTS */ buf += (*buf+1)/2 + 2; /* length is in BCD digits! TON/NPI is also skipped */ cmh_unpackSCTS (&scts, buf); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", /* SCTS */ scts.year [0], scts.year [1], scts.month [0], scts.month [1], scts.day [0], scts.day [1], scts.hour [0], scts.hour [1], scts.minute[0], scts.minute[1], scts.second[0], scts.second[1], scts.timezone); } } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } #ifdef REL99 /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCMGRS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCMGRS call back */ GLOBAL void rCI_PercentCMGRS (UBYTE mode, T_MNSMS_RETRANS_CNF * mnsms_retrans_cnf, T_MNSMS_SEND_PROG_IND * mnsms_send_prog_ind) #if defined (SMS_PDU_SUPPORT) { UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mgf_mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mgf_mode); if (mgf_mode EQ CMGF_MOD_Pdu) { rCI_PercentCMGRSPdu (mode, mnsms_retrans_cnf, mnsms_send_prog_ind); } else { rCI_PercentCMGRSText (mode, mnsms_retrans_cnf, mnsms_send_prog_ind); } return; } LOCAL void rCI_PercentCMGRSText ( UBYTE mode, T_MNSMS_RETRANS_CNF * mnsms_retrans_cnf, T_MNSMS_SEND_PROG_IND * mnsms_send_prog_ind ) #endif { SHORT pos = 0; T_ACI_VP_ABS scts; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PercentCMGRSText()"); if (mode EQ CMGRS_MODE_MANUAL_RETRANS AND mnsms_retrans_cnf NEQ NULL) { src_params->curAtCmd = AT_CMD_NONE; pos=sprintf(g_sa,"%s: 2,%d", "%CMGRS", mnsms_retrans_cnf->tp_mr); if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus) { cmh_unpackBCD ((UBYTE*)&scts, &mnsms_retrans_cnf->sms_sdu.buf[2], 7); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", /* SCTS */ scts.year [0], scts.year [1], scts.month [0], scts.month [1], scts.day [0], scts.day [1], scts.hour [0], scts.hour [1], scts.minute[0], scts.minute[1], scts.second[0], scts.second[1], scts.timezone); } } else if (mode EQ CMGRS_MODE_ENABLE_AUTO_RETRANS AND mnsms_send_prog_ind NEQ NULL) { pos=sprintf(g_sa,"%s: 1,%d,%d", "%CMGRS", mnsms_send_prog_ind->resend_count, mnsms_send_prog_ind->max_retrans); } else { TRACE_ERROR("%CMGRS: wrong combination of parameters"); return; } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return; } #endif /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusILRR | +--------------------------------------------------------------------+ PURPOSE : handles CI_PlusILRR call back */ GLOBAL void rCI_PlusILRR( /*UBYTE srcId, */ T_ACI_BS_SPEED speed, T_ACI_BS_FRM format, T_ACI_BS_PAR parity) { LONG val; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusILRR()"); if ( ati_user_output_cfg[srcId].ILRR_stat ) { switch(speed) { case(BS_SPEED_300_V110): val= 300; break; case(BS_SPEED_1200_V110): val= 1200; break; case(BS_SPEED_2400_V110): val= 2400; break; case(BS_SPEED_4800_V110): val= 4800; break; case(BS_SPEED_9600_V110): val= 9600; break; case(BS_SPEED_14400_V110): val=14400; break; case(BS_SPEED_19200_V110): val=19200; break; case(BS_SPEED_38400_V110): val=38400; break; default: val= 1; break; } sprintf(g_sa,"+ILRR: %d,%d,%d",val,format,parity); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentBC | +--------------------------------------------------------------------+ PURPOSE : handles AT_OK call back */ GLOBAL void rCI_PercentBC (BYTE segm); /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentDRV | +--------------------------------------------------------------------+ PURPOSE : handles AT_OK call back */ GLOBAL void rCI_PercentDRV( T_ACI_DRV_DEV device, T_ACI_DRV_FCT function, UBYTE val1, UBYTE val2); /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMGL | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCMGL call back */ GLOBAL void rCI_PlusCMGL (T_MNSMS_READ_CNF *mnsms_read_cnf) { UBYTE msg_type; #if defined (SMS_PDU_SUPPORT) UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_Plus_Percent_CMGLPdu (mnsms_read_cnf, AT_CMD_CMGL); else #endif /* * handle Text mode */ { /* querying the type of the SM */ cmhSMS_SMSQueryType (&mnsms_read_cnf->sms_sdu, &msg_type); if (msg_type EQ TP_MTI_SMS_STATUS_REP) rCI_Plus_Percent_CMGLTextSP (mnsms_read_cnf, AT_CMD_CMGL); else rCI_Plus_Percent_CMGLText (mnsms_read_cnf, AT_CMD_CMGL); } } LOCAL void rCI_Plus_Percent_CMGLText (T_MNSMS_READ_CNF *mnsms_read_cnf, T_ACI_AT_CMD cmd) { SHORT pos = 0; CHAR* buf; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; CHAR cvtdData[2*MAX_SM_LEN]; USHORT lenCvtdData; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); T_ACI_CMGL_SM* p_sm; CHAR cvtdAddr[4*MAX_SMS_ADDR_DIG]; USHORT lenCvtdAddr; TRACE_FUNCTION("rCI_Plus_Percent_CMGLText()"); src_params->curAtCmd = AT_CMD_NONE; /* is the SM already decoded ? */ if (smsShrdPrm.pDecMsg) p_sm = smsShrdPrm.pDecMsg; else { ACI_MALLOC(smsShrdPrm.pDecMsg, sizeof(T_ACI_CMGL_SM) ); p_sm = smsShrdPrm.pDecMsg; /* Implements Measure # 110 */ cmhSMS_cpyMsgIndReadCnf (p_sm, &mnsms_read_cnf->status, &mnsms_read_cnf->sms_sdu, mnsms_read_cnf->rec_num); } buf = sms_status ( p_sm->stat ); if (cmd EQ AT_CMD_CMGL ) { pos = sprintf ( g_sa, "+CMGL: %d", p_sm->msg_ref); } else { pos=sprintf (g_sa, " %s: %d", "%CMGL", p_sm->msg_ref); } if ( buf ) { pos += sprintf ( g_sa + pos, ",\"%s\"", buf ); /* STATUS */ } else { pos += sprintf ( g_sa + pos, "," ); } if (p_sm->stat EQ SMS_STAT_Invalid) { io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); /* emit "INVALID MESSAGE" only */ return; } if(p_sm->toa.ton EQ TON_Alphanumeric) /* Alphanumeric Destination Address */ { utl_chsetFromGsm ( (UBYTE*)p_sm->adress, (USHORT)strlen(p_sm->adress), (UBYTE*)cvtdAddr, sizeof(cvtdAddr), &lenCvtdAddr, GSM_ALPHA_Def ); pos += sprintf ( g_sa + pos, ",\"%s\",", cvtdAddr); } else { pos += sprintf ( g_sa + pos, ",\"%s\",", p_sm->adress); } #ifdef FF_ATI_BAT /* * Extracting the alphanumeric data from the phonebook at this point * would defeat the object (testing the BAT message). Having this * data stored globally represents a quick and dirty solution to the * problem of conveying it here. */ if (smsShrdPrm.alpha_len) { pos+=sprints(g_sa+pos,smsShrdPrm.alpha,smsShrdPrm.alpha_len); } #else if ( p_sm->alpha.len NEQ 0 ) { utl_chsetFromGsm ( (UBYTE*)p_sm->alpha.data, p_sm->alpha.len, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def ); pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha ); } #endif /*FF_ATI_BAT*/ if ((p_sm->fo & TP_MTI_MASK) NEQ TP_MTI_SMS_DELIVER) { pos += sprintf ( g_sa + pos, "," ); } else { pos += sprintf ( g_sa + pos, ",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", p_sm->scts.year [0], p_sm->scts.year [1], p_sm->scts.month [0], p_sm->scts.month [1], p_sm->scts.day [0], p_sm->scts.day [1], p_sm->scts.hour [0], p_sm->scts.hour [1], p_sm->scts.minute[0], p_sm->scts.minute[1], p_sm->scts.second[0], p_sm->scts.second[1], p_sm->scts.timezone); } if (((UBYTE)p_sm->fo & TP_UDHI_MASK) EQ TP_UDHI_WITH_HEADER) { T_ACI_SM_DATA data; aci_frmtOutput(p_sm->fo, p_sm->dcs, &data); utl_smDtaToTe((UBYTE*)data.data, data.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, (UBYTE)p_sm->fo, (UBYTE)p_sm->dcs); if(ati_user_output_cfg[srcId].CSDH_stat) pos += sprintf ( g_sa + pos, ",%d,%d",toa_merge ( p_sm->toa ), data.len ); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); pos=sprintq(g_sa,cvtdData,lenCvtdData); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } else { if(ati_user_output_cfg[srcId].CSDH_stat) pos += sprintf ( g_sa + pos, ",%d,%d", toa_merge ( p_sm->toa ), p_sm->data.len ); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); if (p_sm->data.len > 0) { utl_smDtaToTe( (UBYTE*)p_sm->data.data, p_sm->data.len, (UBYTE*)cvtdData, sizeof(cvtdData), &lenCvtdData, (UBYTE)p_sm->fo, (UBYTE)p_sm->dcs); pos=sprintq(g_sa,cvtdData,lenCvtdData); } else { g_sa[0]='\0'; } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCSSI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCSSI call back */ GLOBAL void rCI_PlusCSSI ( T_ACI_CSSI_CODE code, SHORT index) { SHORT pos=0; char *me="+CSSI: "; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PLusCSSI()"); if ( ati_user_output_cfg[srcId].CSSI_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN ) */ ) { pos = sprintf(g_sa,"%s",me); if (code NEQ CSSI_CODE_NotPresent) pos += sprintf(g_sa+pos,"%d,",code); else pos += sprintf(g_sa+pos,","); if (index NEQ ACI_NumParmNotPresent) sprintf(g_sa+pos,"%d",index); ci_remTrailCom(g_sa,(USHORT)strlen(g_sa)); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCSSU | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCSSU call back */ GLOBAL void rCI_PlusCSSU ( /*UBYTE srcId,*/ T_ACI_CSSU_CODE code, SHORT index, CHAR *number, T_ACI_TOA *type, CHAR *subaddr, T_ACI_TOS *satype) { char *me="+CSSU: "; SHORT pos=0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PLusCSSU()"); if ( ati_user_output_cfg[srcId].CSSU_stat /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN ) */ ) { pos = sprintf(g_sa,"%s",me); if (code NEQ CSSU_CODE_NotPresent ) pos += sprintf(g_sa+pos,"%d,",code); else pos += sprintf(g_sa+pos,","); if (index NEQ ACI_NumParmNotPresent) pos += sprintf(g_sa+pos,"%d,",index); else pos += sprintf(g_sa+pos,","); if (number) { pos += sprintf(g_sa+pos,"\"%s\",",number); if (type) pos += sprintf(g_sa+pos,"%d,",toa_merge(*type)); else pos += sprintf(g_sa+pos,"128,"); } else pos += sprintf(g_sa+pos,"\"\",128,"); if (subaddr) { pos += sprintf(g_sa+pos,"\"%s\",",subaddr); if (satype) pos += sprintf(g_sa+pos,"%d",tos_merge(*satype)); } ci_remTrailCom(g_sa,(USHORT)strlen(g_sa)); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCUSD | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCUSD call back */ GLOBAL void rCI_PlusCUSD ( /*UBYTE srcId,*/ T_ACI_CUSD_MOD m, T_ACI_USSD_DATA *ussd, SHORT dcs) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCUSD()"); src_params->curAtCmd = AT_CMD_NONE; if ( ati_user_output_cfg[srcId].CUSD_stat ) { if (ussd NEQ NULL) { #ifdef FF_ATI_BAT rci_display_USSD( srcId, m, ussd->data, ussd->len, FALSE, dcs ); #else rci_display_USSD( srcId, m, ussd->data, ussd->len, CONVERT_STRING, dcs ); #endif } else { #ifdef FF_ATI_BAT rci_display_USSD( srcId, m, NULL, 0, FALSE, dcs ); #else rci_display_USSD( srcId, m, NULL, 0, CONVERT_STRING, dcs ); #endif } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCIMI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCIMI call back */ GLOBAL void rCI_PlusCIMI ( /*UBYTE srcId,*/ CHAR *imsi) { UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCIMI()"); src_params->curAtCmd = AT_CMD_NONE; if (imsi) { sprintf(g_sa,"%s",imsi); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCNUM | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCNUM call back */ GLOBAL void rCI_PlusCNUM ( /*UBYTE srcId,*/ T_ACI_CNUM_MSISDN *msisdn, UBYTE num ) { UBYTE count = 0; UBYTE i; T_ACI_RETURN ret; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PlusCNUM()"); for ( i = 0; i < MAX_MSISDN; i++ ) { count += aci_writeCnumMsisdn ( srcId, &msisdn[i] ); } if ( count EQ MAX_MSISDN ) { ret = qAT_PlusCNUM ( (T_ACI_CMD_SRC)srcId, CNUM_MOD_NextRead ) ; if ( ret EQ AT_EXCT ) { src_params->curAtCmd = AT_CMD_CNUM; } else if ( ret EQ AT_CMPL ) { src_params->curAtCmd = AT_CMD_NONE; cmdErrStr = NULL; } else { src_params->curAtCmd = AT_CMD_NONE; cmdErrStr = NULL; } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCPOL | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCPOL call back */ GLOBAL void rCI_PlusCPOL ( /*UBYTE srcId,*/ SHORT startIdx, SHORT lastIdx, T_ACI_CPOL_OPDESC *operLst, SHORT usdNtry ) { UBYTE idx; BOOL loop; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCPOL()"); loop = TRUE; /* if oper list is present, reply to read command */ if( operLst ) { do { for( idx=0; idx < MAX_OPER; idx++ ) { if( operLst[idx].index EQ ACI_NumParmNotPresent ) { loop = FALSE; break; } sprintf(g_sa,"+CPOL: %d,%d,\"%s\"", operLst[idx].index, operLst[idx].format, operLst[idx].oper ); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } if( lastIdx EQ ACI_NumParmNotPresent ) break; startIdx = lastIdx+1; #ifdef WIN32 if( qAT_PlusCPOL(srcId, startIdx, &lastIdx, operLst, cpolMode ) #else if( qAT_PlusCPOL((T_ACI_CMD_SRC)srcId, startIdx, &lastIdx, operLst, CPOL_MOD_NotPresent ) #endif EQ AT_FAIL OR !loop) break; } while( loop ); } /* else, reply to test command */ else { sprintf(g_sa,"+CPOL: (1-%d),(0-2)", lastIdx); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCLAN | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCLAN call back */ GLOBAL void rCI_PlusCLAN ( T_ACI_LAN_SUP *CLang) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCLAN()"); sprintf(g_sa,"+CLAN: %s",CLang->str ); io_sendMessage(srcId,g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCLAE | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCLAE call back */ GLOBAL void rCI_PlusCLAE (T_ACI_LAN_SUP *CLang) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCLAE()"); sprintf(g_sa,"+CLAV: %s",CLang->str ); io_sendMessage(srcId,g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCCCM | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCCCM call back */ GLOBAL void rCI_PlusCCCM ( /*UBYTE srcId,*/ LONG *ccm ) { static LONG oldCCM = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCCCM()"); if( *ccm < oldCCM ) { allowCCCM = TRUE; callTime = 0; } if (ccm AND allowCCCM AND ati_user_output_cfg[srcId].CAOC_stat) { allowCCCM = FALSE; sprintf(g_sa,"+CCCM: \"%6X\"",*ccm); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCCWV | +--------------------------------------------------------------------+ PURPOSE : handles unsolicited result code +CCWV */ GLOBAL void rCI_PlusCCWV ( /*UBYTE srcId,*/ T_ACI_CCWV_CHRG charging ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCCWV()"); if ( charging NEQ CCWV_CHRG_NotPresent ) { ati_user_output_cfg[srcId].CCWV_charging = charging; } else { charging = ati_user_output_cfg[srcId].CCWV_charging; } if ( charging EQ CCWV_CHRG_Shortage AND ati_user_output_cfg[srcId].CCWE_stat EQ 1 /* AND ( io_getIoMode ( ) EQ IO_MODE_CMD OR io_getIoMode ( ) EQ IO_MODE_RUN ) */ ) { io_sendIndication(srcId, "+CCWV", ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCPI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCPI call back */ GLOBAL void rCI_PercentCPI ( /*UBYTE srcId,*/ SHORT cId, T_ACI_CPI_MSG msgType, T_ACI_CPI_IBT ibt, T_ACI_CPI_TCH tch, USHORT cause) { SHORT pos = 0; UBYTE srcId = srcId_cb; SHORT idx; T_ACI_CLCC_CALDESC *calLst; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; UBYTE type; TRACE_FUNCTION("rCI_PercentCPI()"); TRACE_EVENT_P1("msgType: %d", msgType); #ifdef ACI if (ibt NEQ CPI_IBT_NotPresent) ibt_params.ati_currIbt = ibt; if (tch NEQ CPI_TCH_NotPresent) ibt_params.ati_currTch = tch; #endif if ( (ati_user_output_cfg[srcId].CPI_stat > 0) ) { pos = sprintf(g_sa,"%s: ","%CPI"); if (cId NEQ ACI_NumParmNotPresent) pos += sprintf(g_sa+pos,"%d,",cId); else pos += sprintf(g_sa+pos,","); if (msgType NEQ CPI_MSG_NotPresent) pos += sprintf(g_sa+pos,"%d,",msgType); else pos += sprintf(g_sa+pos,","); if (ibt NEQ CPI_IBT_NotPresent) pos += sprintf(g_sa+pos,"%d,",ibt); else pos += sprintf(g_sa+pos,","); if (tch NEQ CPI_TCH_NotPresent) pos += sprintf(g_sa+pos,"%d",tch); else pos += sprintf(g_sa+pos,","); ACI_MALLOC (calLst, MAX_CALL_NR * sizeof (T_ACI_CLCC_CALDESC)); if ((ati_user_output_cfg[srcId].CPI_stat > 1) AND (qAT_PlusCLCC((T_ACI_CMD_SRC)srcId, calLst) EQ AT_CMPL)) { for (idx = 0; idx < MAX_CALL_NR; idx++) { if( calLst[idx].idx EQ ACI_NumParmNotPresent ) { if (ati_user_output_cfg[srcId].CPI_stat > 2) { pos += sprintf(g_sa + pos,",,,,,"); } break; } else { if (calLst[idx].idx NEQ cId) { /* continue; */ } else /* if (calLst[idx].idx NEQ cId) */ { if (calLst[idx].dir NEQ CLCC_DIR_NotPresent) pos += sprintf(g_sa+pos,",%d",calLst[idx].dir); else pos += sprintf(g_sa+pos,","); if (calLst[idx].mode NEQ CLCC_MODE_NotPresent) pos += sprintf(g_sa+pos,",%d",calLst[idx].mode); else pos += sprintf(g_sa+pos,","); if (calLst[idx].number[0] NEQ 0x0) { pos += sprintf(g_sa+pos,",\"%s\"",calLst[idx].number); if (calLst[idx].type.ton NEQ TON_NotPresent) { type = toa_merge(calLst[idx].type); pos += sprintf(g_sa+pos,",%d",(int)type); } else pos += sprintf(g_sa+pos,","); #ifdef NO_ASCIIZ if (calLst[idx].alpha.len NEQ 0x0) { pos += sprintf(g_sa+pos,","); utl_chsetFromGsm ( calLst[idx].alpha.data, calLst[idx].alpha.len, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Def ); pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha ); } #else /* #ifdef NO_ASCIIZ */ if (calLst[idx].alpha[0] NEQ 0x0) { pos += sprintf(g_sa+pos,","); utl_chsetFromGsm ( (UBYTE*)calLst[idx].alpha, 0, (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Int ); pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha ); } #endif /* #ifdef NO_ASCIIZ */ else if(ati_user_output_cfg[srcId].CPI_stat > 2) { pos += sprintf(g_sa + pos,","); } } /* if (calLst[idx].number[0] NEQ 0x0) */ else { pos += sprintf(g_sa + pos,",,,"); } break; } /* else of - if (calLst[idx].idx NEQ cId) */ } /* else of - if( calLst[idx].idx EQ ACI_NumParmNotPresent ) */ } /*for (idx = 0; idx < MAX_CALL_NR; idx++) */ if (ati_user_output_cfg[srcId].CPI_stat > 2) { if (ati_user_output_cfg[srcId].CPI_stat EQ 4) { pos += sprintf(g_sa + pos,",0x%4x", cause); } else { /* * Issue : OMAPS00061262, Removed the two TI internal Causes * MNCC_CAUSE_REEST_STARTED & MNCC_CAUSE_REEST_FINISHED * from the %CPI. */ if( GET_CAUSE_ORIGIN_ENTITY(cause) EQ MNCC_CC_ORIGINATING_ENTITY AND GET_CAUSE_DEFBY(cause) EQ DEFBY_STD ) { TRACE_EVENT_P2("cause: %d pos: %d",cId, cause); pos += sprintf ( g_sa + pos,",%d", GET_CAUSE_VALUE(cause) ); } else { pos += sprintf(g_sa + pos,","); } } /* Report the the ALS bearer */ if(calLst[idx].class_type EQ CLCC_CLASS_Line2) { pos += sprintf ( g_sa + pos,",1"); } else { pos += sprintf ( g_sa + pos,",0"); } } }/*if ( (ati_user_output_cfg[srcId].CPI_stat > 0) ) */ ACI_MFREE (calLst); ci_remTrailCom(g_sa, pos); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } #ifdef ACI /* for ATI only version */ cmhMMI_handleAudioTone ( AT_CMD_NONE, RAT_CPI, msgType ); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCTYI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCTYI call back */ GLOBAL void rCI_PercentCTYI (T_ACI_CTTY_NEG neg, T_ACI_CTTY_TRX trx) { int pos = 0; TRACE_FUNCTION ("rCI_PercentCTYI()"); if (cmhPrm[srcId_cb].ccCmdPrm.CTTYmode EQ CTTY_MOD_Enable) { pos = sprintf (g_sa, "%s: %d", "%CTYI", (int)neg); if (trx NEQ CTTY_TRX_Unknown) pos += sprintf (g_sa + pos, ",%d", trx); io_sendMessage (srcId_cb, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCTV | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCTV call back */ GLOBAL void rCI_PercentCTV ( /*UBYTE srcId*/ void ) { TRACE_FUNCTION("rCI_PercentCTV()"); callTime++; if( callTime EQ 10 ) { callTime = 0; allowCCCM = TRUE; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : sAT_URC | +--------------------------------------------------------------------+ PURPOSE : this function handles unsolicited result codes generated using the extension mechanism for unknown AT commands. */ GLOBAL T_ACI_RETURN sAT_URC ( CHAR * out ) { TRACE_FUNCTION("sAT_URC ()"); if (ati_get_mode( src_id_ext ) NEQ ATI_UNKN_MODE) /* Send only to "serial" sources, no SAT etc. */ { aci_sendPString( src_id_ext, out ); } return AT_CMPL; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : sAT_FRI | +--------------------------------------------------------------------+ PURPOSE : this function handles final result codes generated using the extension mechanism for unknown AT commands. */ GLOBAL T_ACI_RETURN sAT_FRI ( USHORT cmdLen ) { T_ACI_RETURN rslt = AT_FAIL; UBYTE srcId = srcId_cb; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); if ( src_params->curAtCmd EQ AT_CMD_EXT ) { rslt = AT_CMPL; } return ( rslt ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCCBS | +--------------------------------------------------------------------+ PURPOSE : handles rCI_PercentCCBS call back */ GLOBAL void rCI_PercentCCBS ( /*UBYTE srcId,*/ T_ACI_CCBS_IND ind, T_ACI_CCBS_STAT status, T_ACI_CCBS_SET *setting, BOOL intermediate_result ) { SHORT pos = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCCBS()"); if ( at.flags.CCBS_stat OR ind EQ CCBS_IND_IrgtResult ) { pos=sprintf(g_sa,"%s: ","%CCBS"); /* 1st param */ switch(ind) { case(CCBS_IND_NotPresent): pos+=sprintf(g_sa+pos,","); break; case(CCBS_IND_IrgtResult): if(status NEQ CCBS_STAT_NotPresent) { pos+=sprintf(g_sa+pos,"%d,",ind); } break; default: pos+=sprintf(g_sa+pos,"%d,",ind); break; } if(setting EQ NULL) { /* do nothing: if later a parameter is added, extra commas may be needed...*/ } else { /* 2nd param: CCBS index */ if(setting->idx NEQ ACI_NumParmNotPresent) pos+=sprintf(g_sa+pos,"%d,",setting->idx); else pos+=sprintf(g_sa+pos,","); /* 3rd param: Number */ if (setting->number[0] NEQ 0x0 ) pos+=sprintf(g_sa+pos,"\"%s\",",setting->number); else pos+=sprintf(g_sa+pos,","); /* 4th param: Type of number */ if (setting->type.npi NEQ NPI_NotPresent ) pos+=sprintf(g_sa+pos,"%d,",toa_merge(setting->type)); else pos+=sprintf(g_sa+pos,","); /* 5th param: sub address */ if (setting->subaddr[0] NEQ 0x0 ) pos+=sprintf(g_sa+pos,"\"%s\",",setting->subaddr); else pos+=sprintf(g_sa+pos,","); /* 6th param: type of subaddress */ if (setting->satype.tos NEQ TOS_NotPresent ) pos+=sprintf(g_sa+pos,"%d,",tos_merge(setting->satype)); else pos+=sprintf(g_sa+pos,","); /* 7th param: CCBS class */ if (setting->class_type NEQ CLASS_NotPresent) pos+=sprintf(g_sa+pos,"%d,",setting->class_type); else pos+=sprintf(g_sa+pos,","); /* 8th param: ALPT */ if (setting->alrtPtn NEQ ALPT_NotPresent) pos+=sprintf(g_sa+pos,"%d",setting->alrtPtn); } ci_remTrailCom(g_sa, pos); if(intermediate_result) { io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } else io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_sms_ready | +--------------------------------------------------------------------+ PURPOSE : handles AT_sms_ready call back */ GLOBAL void rCI_sms_ready ( /*UBYTE srcId*/ void ) { TRACE_FUNCTION("rCI_sms_ready()"); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_phb_status | +--------------------------------------------------------------------+ PURPOSE : handles AT_phb_status call back */ GLOBAL void rCI_phb_status ( /*UBYTE srcId,*/ T_ACI_PB_STAT status ) { TRACE_FUNCTION("rCI_phb_status()"); } GLOBAL void rCI_PlusCMGD () { /* dummy function */ } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : aci_writeCnumMsisdn| +--------------------------------------------------------------------+ PURPOSE : This function writes the formatted string to AT command interface. */ LOCAL UBYTE aci_writeCnumMsisdn ( UBYTE srcId, T_ACI_CNUM_MSISDN* msisdn ) { USHORT pos = 0; #ifndef FF_ATI_BAT CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; #endif TRACE_FUNCTION ("aci_writeCnumMsisdn()"); if ( msisdn -> vldFlag EQ FALSE ) { return 0; } pos = sprintf ( g_sa, "+CNUM: " ); /* *----------------------------------------------------------------- * process parameter <alpha> *----------------------------------------------------------------- */ if ( msisdn -> alpha[0] NEQ '\0' ) { #ifdef FF_ATI_BAT pos += sprints ( g_sa + pos, (char *)msisdn->alpha, (USHORT)strlen(msisdn->alpha) ); #else utl_chsetFromGsm((UBYTE*)msisdn->alpha, (USHORT)strlen(msisdn->alpha), (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Int); pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha ); #endif } /* *----------------------------------------------------------------- * process parameter <number> and <type> *----------------------------------------------------------------- */ pos += sprintf ( g_sa + pos, ",\"%s\",%d", msisdn -> number, toa_merge ( msisdn -> type ) ); /* *----------------------------------------------------------------- * process parameter <speed> *----------------------------------------------------------------- */ if ( msisdn -> speed NEQ BS_SPEED_NotPresent ) { pos += sprintf ( g_sa + pos, ",%d", msisdn -> speed ); } else { pos += sprintf ( g_sa + pos, "," ); } /* *----------------------------------------------------------------- * process parameter <service> *----------------------------------------------------------------- */ if ( msisdn -> service NEQ CNUM_SERV_NotPresent ) { pos += sprintf ( g_sa + pos, ",%d", msisdn -> service ); } else { pos += sprintf ( g_sa + pos, "," ); } /* *----------------------------------------------------------------- * process parameter <itc> *----------------------------------------------------------------- */ if ( msisdn -> itc NEQ CNUM_ITC_NotPresent ) { pos += sprintf ( g_sa + pos, ",%d", msisdn -> itc ); } ci_remTrailCom ( g_sa, ( USHORT ) strlen ( g_sa ) ); io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT ); return 1; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCNAP | +--------------------------------------------------------------------+ PURPOSE : handles rCI_PercentCNAP call back */ typedef enum { CNAP_PRES_ALLOWED = 0, CNAP_PRES_RESTRICTED, CNAP_NAME_UNAVAILABLE, CNAP_NAME_PRES_RESTRICTED } T_ATI_CNAP_PRESENTATION; LOCAL void send_cnap_name_information(UBYTE srcId, T_ATI_CNAP_PRESENTATION pres_mode, T_callingName *NameId) { T_namePresentationAllowed *cnap_name_info = NULL; UBYTE number_of_chars = 0; CHAR *cnap_name = NULL; int pos = 0; TRACE_FUNCTION("send_cnap_name_information()"); switch(pres_mode) { case(CNAP_PRES_ALLOWED): TRACE_EVENT("CNAP: name presentation is allowed"); cnap_name_info = &(NameId->namePresentationAllowed); break; case(CNAP_NAME_PRES_RESTRICTED): TRACE_EVENT("CNAP: name presentation is restricted"); cnap_name_info = &(NameId->namePresentationRestricted); break; default: TRACE_ERROR("CNAP: wrong presentation mode"); return; } if(cnap_name_info EQ NULL) { TRACE_ERROR("CNAP cnap_name_info is NULL"); return; } pos += sprintf(g_sa+pos,"%s%d,", "%CNAP: ", pres_mode); if(cnap_name_info->v_dataCodingScheme) { pos += sprintf(g_sa+pos,"%d,", cnap_name_info->dataCodingScheme); } if(cnap_name_info->v_lengthInCharacters) { number_of_chars = cnap_name_info->lengthInCharacters; pos += sprintf(g_sa+pos,"%d,", number_of_chars); number_of_chars = MINIMUM(number_of_chars, sizeof(g_sa)-(size_t)pos); } if(cnap_name_info->v_nameString AND number_of_chars NEQ 0) { ACI_MALLOC(cnap_name, number_of_chars+3); /* 1 char for \0 and 2 chars for " */ memcpy(cnap_name, &(cnap_name_info->nameString.b_nameString), number_of_chars); cnap_name[number_of_chars] = 0; /* Null terminated */ pos += sprintf(g_sa+pos,"\"%s\"", cnap_name); } ci_remTrailCom(g_sa,(USHORT)strlen(g_sa)); io_sendIndication( srcId, g_sa, ATI_NORMAL_OUTPUT ); if(cnap_name NEQ NULL) { ACI_MFREE(cnap_name); } } LOCAL void unsolicited_rci_percent_cnap(UBYTE srcId, T_callingName *NameId) { TRACE_FUNCTION("unsolicited_rci_percent_cnap()"); if(ati_user_output_cfg[srcId].cnap_mode EQ CNAP_DISABLED) { TRACE_EVENT_P1("unsolicited message CNAP ignored: CNAP not enable for source: %d", srcId); return; } if(NameId->v_namePresentationAllowed) { send_cnap_name_information(srcId, CNAP_PRES_ALLOWED, NameId); return; } if(NameId->v_presentationRestricted) { sprintf(g_sa, "%s%d", "%CNAP: ", CNAP_PRES_RESTRICTED); io_sendIndication( srcId, g_sa, ATI_NORMAL_OUTPUT ); return; } if(NameId->v_nameUnavailable) { sprintf(g_sa, "%s%d", "%CNAP: ", CNAP_NAME_UNAVAILABLE); io_sendIndication( srcId, g_sa, ATI_NORMAL_OUTPUT ); return; } if(NameId->v_namePresentationRestricted) { send_cnap_name_information(srcId, CNAP_NAME_PRES_RESTRICTED, NameId); return; } } LOCAL void intermediate_result_rci_percent_cnap(UBYTE srcId, T_ACI_CNAP_STATUS status) { TRACE_FUNCTION("intermediate_result_rci_percent_cnap()"); sprintf(g_sa, "%s%d,%d", "%CNAP: ", ati_user_output_cfg[srcId].cnap_mode, status); io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT ); } GLOBAL void rCI_PercentCNAP ( T_callingName *NameId, T_ACI_CNAP_STATUS status ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCNAP()"); if(NameId NEQ NULL) { unsolicited_rci_percent_cnap(srcId, NameId); return; } if(status NEQ CNAP_SERVICE_STATUS_NOT_PRESENT) { intermediate_result_rci_percent_cnap(srcId, status); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCMS_Conc | +--------------------------------------------------------------------+ PURPOSE : handles new rCI_PlusCMS call back for concatenated SMS */ GLOBAL void rCI_PlusCMS_Conc ( T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err, T_EXT_CMS_ERROR *conc_error ) { TRACE_FUNCTION("rCI_PlusCMS_Conc()"); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_SignalSMS | +--------------------------------------------------------------------+ PURPOSE : handles rCI_SignalSMS call back for concatenated SMS */ GLOBAL void rCI_SignalSMS ( UBYTE state ) { TRACE_FUNCTION("rCI_SignalSMS()"); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCIEV | +--------------------------------------------------------------------+ PURPOSE : handles rCI_SignalCIEV call back for signal strength and SIM-full indications */ GLOBAL void rCI_PlusCIEV ( T_ACI_MM_CIND_VAL_TYPE sCindValues, T_ACI_MM_CMER_VAL_TYPE sCmerSettings ) { CHAR* me = "+CIEV: "; SHORT pos = 0; UBYTE srcId = srcId_cb; T_ATI_IO_MODE sIoMode; char *acTempString = ""; UINT uiCount; TRACE_FUNCTION("rCI_PlusCIEV()"); pos = sprintf(g_sa,"%s",me); /* check settings in 'cmhCmdPrm' and depends on, send the indication or buffer it */ sIoMode = ati_get_mode(srcId_cb); if( sIoMode EQ ATI_UNKN_MODE ) { acTempString = "internal ACI error at rCI_PlusCIEV() ->> ATI unknown mode !!"; sprintf( g_sa+pos, "%s, 0", acTempString ); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); return; } if( (sIoMode EQ ATI_CMD_MODE) AND (sCmerSettings.sCmerModeParam NEQ CMER_MODE_INVALID) AND /* 'invalid' EQ 'mode_0' */ (sCmerSettings.sCmerModeParam NEQ CMER_MODE_0) ) /* ---------------------------------------------------------------------------------- */ { /* ----------- UART is in command mode --> send the +CIEV to terminal --------------- */ /* ---------------------------------------------------------------------------------- */ if( sCindValues.sCindSignalParam NEQ CIND_SIGNAL_INDICATOR_INVALID ) { acTempString = "1"; /* the 'signal' indicator has the order number '1' in +CIND */ sprintf( g_sa+pos, "%s, %d", acTempString, sCindValues.sCindSignalParam ); } else { if( sCindValues.sCindSmsFullParam NEQ CIND_SMSFULL_INDICATOR_INVALID ) { acTempString = "2"; /* the 'smsfull' indicator has the order number '2' in +CIND */ sprintf( g_sa+pos, "%s, %d", acTempString, sCindValues.sCindSmsFullParam ); } else { /* error!! --> no signal has to be send */ acTempString = "internal ACI error at rCI_PlusCIEV() !!"; sprintf( g_sa+pos, "%s, 0", acTempString); } } io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* -------------------------------------------------------------------------------- */ else /* -- UART is in data mode or CMER-mode EQ '0' --> buffer the +CIEV if necessary -- */ { /* -------------------------------------------------------------------------------- */ if( sCmerSettings.sCmerModeParam NEQ CMER_MODE_1 ) { /* discard message in case of MODEEQ'1' */ if( sCindValues.sCindSignalParam NEQ CIND_SIGNAL_INDICATOR_INVALID ) { /* storing of SIGNAL Value */ if( asCievSignalBuf.uiLastIndex < CIEV_BUF_SIZE ) { /* free space in buffer -> store +CIEV indication for further purpose */ asCievSignalBuf.asBufferValues[asCievSignalBuf.uiLastIndex] = sCindValues.sCindSignalParam; asCievSignalBuf.uiLastIndex++; } else /* = buffer is full (uiLastIndex EQ CIEV_BUF_SIZE) = */ { /* -> drop the oldest one and try to store it again */ uiCount = 0; while( uiCount < (CIEV_BUF_SIZE-1) ) { /* drop the oldes one */ asCievSignalBuf.asBufferValues[uiCount] = asCievSignalBuf.asBufferValues[uiCount+1]; uiCount++; } asCievSignalBuf.asBufferValues[asCievSignalBuf.uiLastIndex-1] = sCindValues.sCindSignalParam; } } else { /* storing of SMS full Value */ if( asCievSmsFullBuf.uiLastIndex < CIEV_BUF_SIZE ) { /* free space in buffer -> store +CIEV indication for further purpose */ asCievSmsFullBuf.asBufferValues[asCievSmsFullBuf.uiLastIndex] = sCindValues.sCindSmsFullParam; asCievSmsFullBuf.uiLastIndex++; } else /* = buffer is full (uiLastIndex EQ CIEV_BUF_SIZE) = */ { /* -> drop the oldest one and try to store it again */ uiCount = 0; while( uiCount < (CIEV_BUF_SIZE-1) ) { /* drop the oldes one */ asCievSmsFullBuf.asBufferValues[uiCount] = asCievSmsFullBuf.asBufferValues[uiCount+1]; uiCount++; } asCievSmsFullBuf.asBufferValues[asCievSmsFullBuf.uiLastIndex-1] = sCindValues.sCindSmsFullParam; } } } } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : ACI_RET | | STATE : code ROUTINE : aci_frmtOutput | +--------------------------------------------------------------------+ PURPOSE : fills T_ACI_SM_DATA data structure for UD with UDHI */ LOCAL void aci_frmtOutput ( UBYTE fo, UBYTE dcs, T_ACI_SM_DATA *data ) { switch (fo & TP_MTI_MASK) { case TP_MTI_SMS_DELIVER: { T_TP_DELIVER *sms_deliver = (T_TP_DELIVER*)_decodedMsg; data->data[0] = sms_deliver->tp_udh_inc.tp_udh.c_data; memcpy(data->data+1, sms_deliver->tp_udh_inc.tp_udh.data, sms_deliver->tp_udh_inc.tp_udh.c_data); memcpy(data->data+sms_deliver->tp_udh_inc.tp_udh.c_data+1, sms_deliver->tp_udh_inc.data, sms_deliver->tp_udh_inc.c_data); /* data->len = sms_deliver->tp_udh_inc.tp_udh.c_data + sms_deliver->tp_udh_inc.c_data + 1; */ if (cmhSMS_getAlphabetPp (dcs) EQ 0) data->len = (sms_deliver->tp_udh_inc.length * 7 + 7)/8; else data->len = sms_deliver->tp_udh_inc.length; } break; case TP_MTI_SMS_SUBMIT: { T_TP_SUBMIT *sms_submit = (T_TP_SUBMIT*)_decodedMsg; data->data[0] = sms_submit->tp_udh_inc.tp_udh.c_data; memcpy(data->data+1, sms_submit->tp_udh_inc.tp_udh.data, sms_submit->tp_udh_inc.tp_udh.c_data); memcpy(data->data+sms_submit->tp_udh_inc.tp_udh.c_data+1, sms_submit->tp_udh_inc.data, sms_submit->tp_udh_inc.c_data); /* data->len = sms_submit->tp_udh_inc.tp_udh.c_data + sms_submit->tp_udh_inc.c_data + 1; */ if (cmhSMS_getAlphabetPp (dcs) EQ 0) data->len = (sms_submit->tp_udh_inc.length * 7 + 7)/8; else data->len = sms_submit->tp_udh_inc.length; } break; case TP_MTI_SMS_COMMAND: { T_TP_COMMAND *sms_command = (T_TP_COMMAND*)_decodedMsg; data->data[0] = sms_command->tp_cdh_inc.tp_udh.c_data; memcpy(data->data+1, sms_command->tp_cdh_inc.tp_udh.data, sms_command->tp_cdh_inc.tp_udh.c_data); memcpy(data->data+sms_command->tp_cdh_inc.tp_udh.c_data+1, sms_command->tp_cdh_inc.data, sms_command->tp_cdh_inc.c_data); /* data->len = sms_command->tp_cdh_inc.tp_udh.c_data + sms_command->tp_cdh_inc.c_data + 1; */ data->len = sms_command->tp_cdh_inc.c_data; } break; /* case TP_MTI_SMS_STATUS_REP: { T_TP_STATUS *sms_status = (T_TP_STATUS*)_decodedMsg; data->data[0] = sms_status->tp_udh_inc.tp_udh.c_data; memcpy(data->data+1, sms_status->tp_udh_inc.tp_udh.data, sms_status->tp_udh_inc.tp_udh.c_data); memcpy(data->data+sms_status->tp_udh_inc.tp_udh.c_data+1, sms_status->tp_udh_inc.data, sms_status->tp_udh_inc.c_data); data->len = sms_status->tp_udh_inc.tp_udh.c_data + sms_status->tp_udh_inc.c_data + 1; } break; */ default: data->data[0] = '\0'; data->len = 0; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCPRI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCPRI call back */ GLOBAL void rCI_PercentCPRI ( UBYTE gsm_ciph, UBYTE gprs_ciph ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PLusCPRI()"); /* %CPRI notification is sent only to the source through which the status is enabled */ if (ati_user_output_cfg[srcId].CPRI_stat EQ CI_SHOW) { sprintf(g_sa, "%s: %d,%d", "%CPRI", gsm_ciph, gprs_ciph); io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCTZR | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCTZV call back. timezone is a range from -48..0..+48 and expresses the deviation from GMT in steps of 15 minutes. */ #ifdef FF_TIMEZONE GLOBAL void rCI_PlusCTZV ( S32 timezone ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCTZV()"); sprintf (g_sa, "%s\"%+02d\"", "+CTZV: ", timezone); /* Send response to AT interface */ io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } #else GLOBAL void rCI_PlusCTZV ( UBYTE* timezone ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PlusCTZV()"); sprintf (g_sa, "%s%d", "+CTZV: ", *timezone); /* Send response to AT interface */ io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } #endif /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCTZV | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCTZV call back, the parameter mmr_info_ind includes time and time zone information. */ GLOBAL void rCI_PercentCTZV (T_MMR_INFO_IND *mmr_info_ind, S32 timezone) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCTZV()"); /*Report the network time in time zone 0*/ sprintf (g_sa, "%s\"%02d/%02d/%02d,%02d:%02d:%02d%+02d\"", "%CTZV: ", mmr_info_ind->time.year, mmr_info_ind->time.month, mmr_info_ind->time.day, mmr_info_ind->time.hour, mmr_info_ind->time.minute, mmr_info_ind->time.second, timezone); /* Send response to AT interface */ io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : aci_format_plmn_name | +--------------------------------------------------------------------+ PURPOSE : Decodes PLMN name to remote source format */ void aci_format_plmn_name(T_full_name * plmn, UBYTE *out) { USHORT size_of_plmn_name; UBYTE dest_len=0; UBYTE buf[MMR_MAX_TEXT_LEN]; if(plmn->dcs ==0) /*GSM default */ { dest_len = utl_cvt7To8(plmn->text,plmn->c_text,buf,0); utl_chsetFromGsm(buf,dest_len,out,MMR_MAX_TEXT_LEN,&size_of_plmn_name,GSM_ALPHA_Def); } else if(plmn->dcs ==1) /*UCS2 */ { utl_hexFromGsm(plmn->text,plmn->c_text,out,MMR_MAX_TEXT_LEN,&size_of_plmn_name,GSM_ALPHA_Def,CSCS_ALPHA_7_Bit); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCNIV | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCNIV call back */ GLOBAL void rCI_PercentCNIV (T_MMR_INFO_IND *mmr_info_ind) { UBYTE srcId = srcId_cb; char buf1[MMR_MAX_TEXT_LEN] ; /*we limit the size of printed symbols to avoid stack size increase*/ char buf2[MMR_MAX_TEXT_LEN] ; char plmn[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; SHORT mcc = 0; SHORT mnc = 0; TRACE_FUNCTION("rCI_PercentCNIV()"); memset(buf1,0,MMR_MAX_TEXT_LEN); memset(buf2,0,MMR_MAX_TEXT_LEN); if (mmr_info_ind->plmn.v_plmn) { cmhMM_CnvrtPLMN2INT( mmr_info_ind->plmn.mcc, mmr_info_ind->plmn.mnc, &mcc, &mnc ); } /* build numeric plmn representation */ if ((mnc & 0x000F) EQ 0x000F) { sprintf (plmn, "\"%03X%02X\"", mcc, (mnc & 0x0FF0) >> 4); } else { sprintf (plmn, "\"%03X%03X\"", mcc, mnc); } if (mmr_info_ind->short_name.v_name) /* short name */ { aci_format_plmn_name(&mmr_info_ind->short_name, (UBYTE *)buf1); } if (mmr_info_ind->full_name.v_name) /* full name */ { aci_format_plmn_name(&mmr_info_ind->full_name, (UBYTE *)buf2); } sprintf (g_sa, "%s \"%s\",\"%s\",%s", "%CNIV:", buf2, buf1, plmn); /* Send response to AT interface */ io_sendIndication(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_Z | +--------------------------------------------------------------------+ PURPOSE : RAT callback for ATZ, for abstraction of ATI and CMH. */ GLOBAL void rCI_Z ( void ) { UBYTE srcId = srcId_cb; ati_cmd_reset( srcId ); ati_zn_retrieve_params( srcId ); } #endif /* FF_ATI */ #if defined FF_EOTD /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PlusCLPS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusCLPS call back */ GLOBAL void rCI_PlusCLPS ( UBYTE srcId, T_LOC_POS_DATA * p_aci_lc_data ) { TRACE_FUNCTION("rCI_PlusCLPS()"); io_sendIndication(srcId, "%CLPS:", ATI_NORMAL_OUTPUT); } #endif /* FF_EOTD */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentALS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PlusALS call back */ GLOBAL void rCI_PercentALS ( T_ACI_ALS_MOD ALSmode ) { UBYTE srcId = srcId_cb; char *me = "%ALS"; TRACE_FUNCTION("rCI_PlusALS()"); if (ALSmode EQ ALS_MOD_SPEECH) sprintf(g_sa,"%s: (0)", me); if (ALSmode EQ ALS_MOD_AUX_SPEECH) sprintf(g_sa,"%s: (1)", me); if (ALSmode EQ (ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH)) sprintf(g_sa,"%s: (0,1)", me); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentRDL | +--------------------------------------------------------------------+ PURPOSE : handles AT%RDL call back */ GLOBAL void rCI_PercentRDL ( T_ACI_CC_REDIAL_STATE state ) { UBYTE srcId = srcId_cb; char *me = "%RDL:"; TRACE_FUNCTION("rCI_PercentRDL()"); if(rdlPrm.rdlModN EQ NOTIF_USER) { sprintf(g_sa,"%s %d",me,state); io_sendMessage(srcId, g_sa, ATI_INDICATION_OUTPUT); } } #ifdef TI_PS_FF_AT_P_CMD_RDLB /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentRDLB | +--------------------------------------------------------------------+ PURPOSE : handles AT%RDLB call back */ GLOBAL void rCI_PercentRDLB ( T_ACI_CC_RDL_BLACKL_STATE state ) { UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentRDLB()"); if(rdlPrm.rdlBlN EQ NOTIF_USER) { sprintf(g_sa,"%s: %d","%RDLB",state); io_sendMessage(srcId, g_sa, ATI_INDICATION_OUTPUT); } } #endif /* TI_PS_FF_AT_P_CMD_RDLB */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCSTAT | +--------------------------------------------------------------------+ PURPOSE : handles rCI_PercentCSTAT call back */ GLOBAL void rCI_PercentCSTAT ( T_ACI_STATE_MSG msgType ) { SHORT pos = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCSTAT()"); if (ati_user_output_cfg[srcId].CSTAT_stat EQ 1) { pos = sprintf(g_sa,"%s: ","%CSTAT"); switch(msgType.entityId) { case STATE_MSG_PBOOK: pos += sprintf(g_sa+pos,"PHB, %d",msgType.entityState); break; case STATE_MSG_SMS: pos += sprintf(g_sa+pos,"SMS, %d",msgType.entityState); break; case STATE_MSG_EONS: pos += sprintf(g_sa+pos,"EONS, %d",msgType.entityState); break; case STATE_MSG_RDY: pos += sprintf(g_sa+pos,"RDY, %d",msgType.entityState); break; default: return; } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } /* +------------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : ati_printRemainFieElem | +------------------------------------------------------------------------+ PURPOSE : this function prints all remained FIE-elemnts onto terminal */ LOCAL void ati_printRemainFieElem( T_MNCC_fac_inf *fie, UBYTE srcId ) { UBYTE uTotalCharCounter = 0; USHORT uLineCounter = 0; UBYTE const cuNbrOfMsgElem = fie->l_fac >> 3; TRACE_FUNCTION("ati_printRemainFieElem()"); /* print FIE elements */ while(uTotalCharCounter < cuNbrOfMsgElem) { uLineCounter += sprintf(g_sa+uLineCounter, "%02X", fie->fac[uTotalCharCounter++]); if ( uLineCounter > (MAX_CMD_LEN-((MAX_CMD_LEN*95)/100)) ) /* only 5% of g_sa buffer used */ { /* allows better sim test */ g_sa[++uLineCounter] = 0x00; /* terminate g_sa after last char */ #ifdef _SIMULATION_ io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); /* and send the data in chunks with CRLF */ #else /* _SIMULATION_ */ io_sendMessage(srcId, g_sa, ATI_ECHO_OUTPUT); #endif uLineCounter=0; /* go to beginning of g_sa for next chunk */ } } g_sa[++uLineCounter] = 0x00; /* terminate g_sa after last char in last chunk */ #ifdef _SIMULATION_ io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); /* and send the data in chunks with CRLF */ #else /* _SIMULATION_ */ io_sendMessage(srcId, g_sa, ATI_ECHO_OUTPUT); g_sa[0] = 0x0; /* print CR/LF after last chunk only on target */ io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCCCN | +--------------------------------------------------------------------+ PURPOSE : handles unsolicited CC-network changes callback */ GLOBAL void rCI_PercentCCCN ( T_ACI_FAC_DIR tDirection, SHORT cId, T_MNCC_fac_inf *fie ) { UBYTE srcId = srcId_cb; char *me = "%CCCN"; TRACE_FUNCTION("rCI_PercentCCCN()"); /* no output in case of empty FIE-string */ if( (fie->l_fac >> 3) EQ 0) { TRACE_FUNCTION("rCI_PercentCCCN() : Empty FIE-string"); return; } sprintf(g_sa, "%s: %d,%d,", me, tDirection, cId); /* Preamble */ #ifdef _SIMULATION_ /* 'ATI_ECHO_OUTPUT' doesn't work while Windows simulation */ io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT ); /* print preamble while SIM-test */ #else /* _SIMULATION_ */ io_sendMessage( srcId, g_sa, ATI_ECHO_OUTPUT ); /* print preamble to target */ #endif ati_printRemainFieElem( fie, srcId ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCSSN | +--------------------------------------------------------------------+ PURPOSE : handles unsolicited CC-network changes callback */ GLOBAL void rCI_PercentCSSN ( T_ACI_FAC_DIR tDirection, T_ACI_FAC_TRANS_TYPE tType, T_MNCC_fac_inf *fie ) { UBYTE srcId = srcId_cb; char *me = "%CSSN"; TRACE_FUNCTION("rCI_PercentCSSN()"); /* no output in case of empty FIE-string */ if( (fie->l_fac >> 3) EQ 0) { TRACE_FUNCTION("rCI_PercentCSSN() : Empty FIE-string"); return; } sprintf(g_sa, "%s: %d,%d,", me, tDirection, tType); /* Preamble */ #ifdef _SIMULATION_ /* 'ATI_ECHO_OUTPUT' doesn't work while Windows simulation */ io_sendMessage( srcId, g_sa, ATI_NORMAL_OUTPUT); /* print preamble while SIM-test */ #else /* _SIMULATION_ */ io_sendMessage( srcId, g_sa, ATI_ECHO_OUTPUT ); /* print preamble to target */ #endif ati_printRemainFieElem( fie, srcId ); } #ifdef TI_PS_FF_AT_P_CMD_CPRSM /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCPRSM | +--------------------------------------------------------------------+ PURPOSE : handles callback for %CPRSM? querying the SMS delivery status which can be either PAUSE or RESUME */ GLOBAL void rCI_PercentCPRSM ( T_ACI_CPRSM_MOD mode ) { UBYTE srcId = srcId_cb; char *me = "%CPRSM"; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("rCI_PercentCPRSM()"); sprintf(g_sa,"%s: %d", me, mode); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } #endif /* TI_PS_FF_AT_P_CMD_CPRSM */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentSIMEF | +--------------------------------------------------------------------+ PURPOSE : unsolicited result code %SIMEF: <NUM>, <Id1>, <Id2>… For Id, which can be EF only or concatenation of DFEF or DF1DF2EF, watch 11.11 for DF and EF */ GLOBAL void rCI_PercentSIMEF(T_SIM_FILE_UPDATE_IND *sim_file_update_ind) { UBYTE srcId=srcId_cb; SHORT pos; UBYTE n; TRACE_FUNCTION("rCI_PercentSIMEF()"); pos = sprintf(g_sa,"%s: %d,","%SIMEF", sim_file_update_ind->val_nr); for (n=0; n<sim_file_update_ind->val_nr; n++) { if (sim_file_update_ind->file_info[n].v_path_info ) { pos+=sprintf(g_sa+pos,"%04X,",sim_file_update_ind->file_info[n].path_info.df_level1); /* the DF */ if (sim_file_update_ind->file_info[n].path_info.v_df_level2) { pos+=sprintf(g_sa+pos,"%04X,",sim_file_update_ind->file_info[n].path_info.df_level2); /* the DF 2.level */ } } pos+=sprintf(g_sa+pos,"%04X",sim_file_update_ind->file_info[n].datafield); if (n NEQ sim_file_update_ind->val_nr-1) { *(g_sa+pos++)=','; } if(pos >= (MAX_CMD_LEN-20)) { #ifdef _SIMULATION_ io_sendMessage(srcId,g_sa,ATI_NORMAL_OUTPUT); /* append CR+LF only for testcase */ #else io_sendMessage(srcId,g_sa,ATI_ECHO_OUTPUT); /* Output without CR,LF for AT based MMI */ #endif /* _SIMULATION */ pos=0; } } io_sendMessage(srcId,g_sa,ATI_NORMAL_OUTPUT); /* Second line output */ } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : ACI_RET | | STATE : code ROUTINE : mfwExtOut | +--------------------------------------------------------------------+ PURPOSE : This function is used as a dummy to fullfill display driver calls. */ #ifndef MFW int mfwExtOut (char *cmd) { TRACE_FUNCTION ("mfwExtOut"); return 1; } #endif /* no MFW */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCMGR | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCMGR call back (Read Message) */ GLOBAL void rCI_PercentCMGR ( T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_CMGR_CBM * cbm) { UBYTE msg_type; #if defined (SMS_PDU_SUPPORT) UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_Plus_Percent_CMGRPdu (mnsms_read_cnf, AT_CMD_P_CMGR); else #endif /* * handle Text mode */ { /* querying the type of the SM */ cmhSMS_SMSQueryType (&mnsms_read_cnf->sms_sdu, &msg_type); if (msg_type EQ TP_MTI_SMS_STATUS_REP) rCI_Plus_Percent_CMGRTextSP (mnsms_read_cnf, AT_CMD_P_CMGR); else rCI_Plus_Percent_CMGRText (mnsms_read_cnf, cbm, AT_CMD_P_CMGR); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCMGL | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCMGL call back */ GLOBAL void rCI_PercentCMGL (T_MNSMS_READ_CNF *mnsms_read_cnf) { UBYTE msg_type; #if defined (SMS_PDU_SUPPORT) UBYTE srcId = srcId_cb; T_ACI_CMGF_MOD mode; /* * request current mode */ qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); if (mode EQ 0) /* * handle PDU mode */ rCI_Plus_Percent_CMGLPdu (mnsms_read_cnf, AT_CMD_P_CMGL); else #endif /* * handle Text mode */ { /* querying the type of the SM */ cmhSMS_SMSQueryType (&mnsms_read_cnf->sms_sdu, &msg_type); if (msg_type EQ TP_MTI_SMS_STATUS_REP) rCI_Plus_Percent_CMGLTextSP (mnsms_read_cnf, AT_CMD_P_CMGL); else rCI_Plus_Percent_CMGLText (mnsms_read_cnf, AT_CMD_P_CMGL); } } LOCAL void rCI_Plus_Percent_CMGLTextSP (T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_AT_CMD cmdId) { UBYTE srcId = srcId_cb; T_ACI_CDS_SM* p_st; SHORT pos = 0; CHAR* buf; T_MNSMS_STATUS_IND mnsms_status_ind; CHAR cvtdAddr[4*MAX_SMS_ADDR_DIG]; USHORT lenCvtdAddr; TRACE_FUNCTION("rCI_Plus_Percent_CMGLTextSP()"); /* is the SM already decoded ? */ if (smsShrdPrm.pDecMsg) p_st = (T_ACI_CDS_SM*)smsShrdPrm.pDecMsg; else { ACI_MALLOC(smsShrdPrm.pDecMsg, sizeof(T_ACI_CDS_SM) ); p_st = (T_ACI_CDS_SM*)smsShrdPrm.pDecMsg; memcpy (&mnsms_status_ind.sms_sdu, &mnsms_read_cnf->sms_sdu, sizeof (T_sms_sdu)); cmhSMS_cpyStatInd ( p_st, &mnsms_status_ind); } buf=sms_status((T_ACI_SMS_STAT)mnsms_read_cnf->status ); if (cmdId EQ AT_CMD_CMGL ) { pos = sprintf ( g_sa, "+CMGL: %d", mnsms_read_cnf->rec_num); } else { pos=sprintf (g_sa, " %s: %d", "%CMGL", mnsms_read_cnf->rec_num); } if ( buf ) { pos += sprintf ( g_sa + pos, ",\"%s\"", buf ); /* STATUS */ } else { pos += sprintf ( g_sa + pos, "," ); } pos+=sprintf(g_sa+pos,",%d,%d,",p_st->fo, p_st->msg_ref); if(strlen(p_st->addr)) { if(p_st->toa.ton EQ TON_Alphanumeric) /* Alphanumeric Destination Address */ { utl_chsetFromGsm ( (UBYTE*)p_st->addr, (USHORT)strlen(p_st->addr), (UBYTE*)cvtdAddr, sizeof(cvtdAddr), &lenCvtdAddr, GSM_ALPHA_Def ); pos+=sprintf(g_sa+pos,"\"%s\"", cvtdAddr); } else { pos+=sprintf(g_sa+pos,"\"%s\"",p_st->addr); } } else { pos+=sprintf(g_sa+pos,","); } if( (p_st->toa.ton NEQ TON_NotPresent) AND (p_st->toa.npi NEQ NPI_NotPresent) ) pos+=sprintf(g_sa+pos,",%d",toa_merge(p_st->toa)); else pos+=sprintf(g_sa+pos,","); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", p_st->vpabs_scts.year [0], p_st->vpabs_scts.year [1], p_st->vpabs_scts.month [0], p_st->vpabs_scts.month [1], p_st->vpabs_scts.day [0], p_st->vpabs_scts.day [1], p_st->vpabs_scts.hour [0], p_st->vpabs_scts.hour [1], p_st->vpabs_scts.minute[0], p_st->vpabs_scts.minute[1], p_st->vpabs_scts.second[0], p_st->vpabs_scts.second[1], p_st->vpabs_scts.timezone); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\",%d", p_st->vpabs_dt.year [0], p_st->vpabs_dt.year [1], p_st->vpabs_dt.month [0], p_st->vpabs_dt.month [1], p_st->vpabs_dt.day [0], p_st->vpabs_dt.day [1], p_st->vpabs_dt.hour [0], p_st->vpabs_dt.hour [1], p_st->vpabs_dt.minute[0], p_st->vpabs_dt.minute[1], p_st->vpabs_dt.second[0], p_st->vpabs_dt.second[1], p_st->vpabs_dt.timezone , p_st->tp_status); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } LOCAL void rCI_Plus_Percent_CMGRTextSP (T_MNSMS_READ_CNF* mnsms_read_cnf, T_ACI_AT_CMD cmdId) { UBYTE srcId = srcId_cb; T_ACI_CDS_SM* p_st; SHORT pos = 0; CHAR* buf; T_MNSMS_STATUS_IND mnsms_status_ind; CHAR cvtdAddr[4*MAX_SMS_ADDR_DIG]; USHORT lenCvtdAddr; TRACE_FUNCTION("rCI_Plus_Percent_CMGRTextSP()"); /* is the SM already decoded ? */ if (smsShrdPrm.pDecMsg) p_st = (T_ACI_CDS_SM*)smsShrdPrm.pDecMsg; else { ACI_MALLOC(smsShrdPrm.pDecMsg, sizeof(T_ACI_CDS_SM) ); p_st = (T_ACI_CDS_SM*)smsShrdPrm.pDecMsg; memcpy (&mnsms_status_ind.sms_sdu, &mnsms_read_cnf->sms_sdu, sizeof (T_sms_sdu)); cmhSMS_cpyStatInd ( p_st, &mnsms_status_ind); } buf=sms_status((T_ACI_SMS_STAT)mnsms_read_cnf->status ); if (buf) /* STATUS */ { if (cmdId EQ AT_CMD_CMGR) { pos=sprintf(g_sa,"+CMGR: \"%s\"",buf); } else { pos=sprintf (g_sa, " %s: \"%s\"", "%CMGR", buf); } } else { if (cmdId EQ AT_CMD_CMGR) { pos=sprintf(g_sa,"+CMGR: ,"); } else { pos=sprintf (g_sa, " %s", "%CMGR: ,"); } } pos+=sprintf(g_sa+pos,",%d,%d,",p_st->fo, p_st->msg_ref); if(strlen(p_st->addr)) { if(p_st->toa.ton EQ TON_Alphanumeric) /* Alphanumeric Destination Address */ { utl_chsetFromGsm ( (UBYTE*)p_st->addr, (USHORT)strlen(p_st->addr), (UBYTE*)cvtdAddr, sizeof(cvtdAddr), &lenCvtdAddr, GSM_ALPHA_Def ); pos+=sprintf(g_sa+pos,"\"%s\"", cvtdAddr); } else { pos+=sprintf(g_sa+pos,"\"%s\"",p_st->addr); } } else { pos+=sprintf(g_sa+pos,","); } if( (p_st->toa.ton NEQ TON_NotPresent) AND (p_st->toa.npi NEQ NPI_NotPresent) ) pos+=sprintf(g_sa+pos,",%d",toa_merge(p_st->toa)); else pos+=sprintf(g_sa+pos,","); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\"", p_st->vpabs_scts.year [0], p_st->vpabs_scts.year [1], p_st->vpabs_scts.month [0], p_st->vpabs_scts.month [1], p_st->vpabs_scts.day [0], p_st->vpabs_scts.day [1], p_st->vpabs_scts.hour [0], p_st->vpabs_scts.hour [1], p_st->vpabs_scts.minute[0], p_st->vpabs_scts.minute[1], p_st->vpabs_scts.second[0], p_st->vpabs_scts.second[1], p_st->vpabs_scts.timezone); pos+=sprintf(g_sa+pos,",\"%d%d/%d%d/%d%d,%d%d:%d%d:%d%d%+03d\",%d", p_st->vpabs_dt.year [0], p_st->vpabs_dt.year [1], p_st->vpabs_dt.month [0], p_st->vpabs_dt.month [1], p_st->vpabs_dt.day [0], p_st->vpabs_dt.day [1], p_st->vpabs_dt.hour [0], p_st->vpabs_dt.hour [1], p_st->vpabs_dt.minute[0], p_st->vpabs_dt.minute[1], p_st->vpabs_dt.second[0], p_st->vpabs_dt.second[1], p_st->vpabs_dt.timezone , p_st->tp_status); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } #ifdef FF_CPHS_REL4 /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentCFIS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentCFIS call back */ GLOBAL void rCI_PercentCFIS ( T_ACI_CFIS_CFU *cfis) { SHORT pos = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentCFIS()"); pos = sprintf(g_sa,"%s ","%CFIS:"); pos += sprintf ( g_sa + pos, "%d,%d", cfis->mspId,cfis->cfuStat); /* *----------------------------------------------------------------- * process parameter <number> and <type> *----------------------------------------------------------------- */ pos += sprintf ( g_sa + pos, ",\"%s\",%d", cfis->number , toa_merge ( cfis->type ) ); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentMBI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentMBI call back */ GLOBAL void rCI_PercentMBI ( T_ACI_MBI *mbi) { SHORT pos = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentMBDN()"); pos = sprintf(g_sa,"%s ","%MBI:"); /* *----------------------------------------------------------------- * process all the identifiers *----------------------------------------------------------------- */ pos += sprintf ( g_sa + pos, "%d, %d, %d, %d", mbi->mbdn_id_voice, mbi->mbdn_id_fax, mbi->mbdn_id_email, mbi->mbdn_id_other); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentMBDN | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentMBDN call back */ GLOBAL void rCI_PercentMBDN ( T_ACI_MBDN *mbdn) { SHORT pos = 0; UBYTE srcId = srcId_cb; CHAR cvtdAlpha[2*MAX_ALPHA_LEN]; USHORT lenCvtdAlpha; TRACE_FUNCTION("rCI_PercentMBDN()"); pos = sprintf(g_sa,"%s ","%MBDN:"); /* *----------------------------------------------------------------- * process parameter <number> and <type> *----------------------------------------------------------------- */ pos += sprintf ( g_sa + pos, "\"%s\",%d", mbdn->number , toa_merge ( mbdn->type ) ); /* As of now Capability Configuration Parameter is not supported we just skip the variable. It has put because in future if we support we can just add the variable here */ pos += sprintf ( g_sa + pos, ",," ); /* *----------------------------------------------------------------- * process parameter <alpha> *----------------------------------------------------------------- */ if ( mbdn -> alpha[0] NEQ '\0' ) { utl_chsetFromGsm((UBYTE*)mbdn->alpha, (USHORT)strlen(mbdn->alpha), (UBYTE*)cvtdAlpha, sizeof(cvtdAlpha), &lenCvtdAlpha, GSM_ALPHA_Int); pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha ); } else { pos += sprintf ( g_sa + pos, "," ); } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentMWIS | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentMWIS call back */ GLOBAL void rCI_PercentMWIS ( T_ACI_MWIS_MWI *mwis) { SHORT pos = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentMWIS()"); pos = sprintf(g_sa,"%s ","%MWIS:"); pos += sprintf ( g_sa + pos, "%d,%d,%d,%d,%d", mwis->mwiStat, mwis->mwis_count_voice,mwis->mwis_count_fax,mwis->mwis_count_email, mwis->mwis_count_other); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_RET | | STATE : code ROUTINE : rCI_PercentMWI | +--------------------------------------------------------------------+ PURPOSE : handles AT_PercentMWI call back */ GLOBAL void rCI_PercentMWI ( UBYTE mspId , T_ACI_MWIS_MWI *mwis) { SHORT pos = 0; UBYTE srcId = srcId_cb; TRACE_FUNCTION("rCI_PercentMWI()"); if (ati_user_output_cfg[srcId].MWI_stat EQ 1) { pos = sprintf(g_sa,"%s ","%MWI:"); pos += sprintf ( g_sa + pos, "%d,%d,%d,%d,%d,%d", mspId, mwis->mwiStat, mwis->mwis_count_voice,mwis->mwis_count_fax, mwis->mwis_count_email,mwis->mwis_count_other); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } } #endif /* FF_CPHS_REL4 */ #endif /* ATI_RET_C */