FreeCalypso > hg > tcs211-fcmodem
diff g23m/condat/ms/src/aci/psa_sss.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/aci/psa_sss.c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,392 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : PSA_SSS ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This module defines the signalling functions of the +| protocol stack adapter for supplementary services. ++----------------------------------------------------------------------------- +*/ + +#ifndef PSA_SSS_C +#define PSA_SSS_C +#endif + +#include "aci_all.h" + +/*==== INCLUDES ===================================================*/ +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_cmd.h" +#include "aci.h" +#include "psa.h" +#include "psa_ss.h" +#include "cmh_ss.h" + +#ifdef SIM_TOOLKIT +#include "psa_cc.h" +#include "psa_sat.h" +#endif /* of SIM_TOOLKIT */ + + +/*==== CONSTANTS ==================================================*/ + + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ + + +/*==== VARIABLES ==================================================*/ + +EXTERN T_PCEER causeMod; +EXTERN SHORT causeCeer; + +/*==== FUNCTIONS ==================================================*/ +static UBYTE inv_opcode; + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSS | +| ROUTINE : psaSS_NewTrns | ++-------------------------------------------------------------------+ + + PURPOSE : start a new SS transaction + +*/ + +GLOBAL SHORT psaSS_NewTrns ( SHORT sId ) +{ + T_SS_SRV_TBL * pStbNtry; /* holds pointer to service table entry */ + BYTE ccdRet; /* holds CCD return value */ + + TRACE_FUNCTION ("psaSS_NewTrns()"); + +/* + *------------------------------------------------------------------- + * get a valid ti for a MOS, otherwise return + *------------------------------------------------------------------- + */ + if( psaSS_getMOSTi( sId ) < 0 ) return ( -1 ); + + causeMod = P_CEER_mod; /* Clear module which was set for ceer */ + causeCeer = CEER_NotPresent; /* Clear extended error cause */ + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC (mnss_begin_req, MNSS_BEGIN_REQ); + + /* + * fill in primitive parameter: begin request + */ + pStbNtry = &ssShrdPrm.stb[sId]; + + mnss_begin_req -> ti = pStbNtry -> ti; + + if( pStbNtry -> SSver NEQ NOT_PRESENT_8BIT ) + { + mnss_begin_req -> ss_ver.len = 1; + mnss_begin_req -> ss_ver.ver[0] = pStbNtry -> SSver; + } + else + + mnss_begin_req -> ss_ver.len = 0; + + { + MCAST( com, COMPONENT ); + + memset( com, 0, sizeof( T_COMPONENT )); + switch( ssShrdPrm.cmpType ) + { + case( CT_INV ): + com -> v_inv_comp = TRUE; + com -> inv_comp.v_inv_id = TRUE; + com -> inv_comp.inv_id = pStbNtry -> iId + = ssShrdPrm.iIdNxt++; + com -> inv_comp.v_op_code = TRUE; + com -> inv_comp.op_code = pStbNtry -> opCode + = ssFIECodeBuf.buf[0]; + + inv_opcode = com->inv_comp.op_code; + + com -> inv_comp.v_params = TRUE; + com -> inv_comp.params.l_params = ssFIECodeBuf.l_buf-8; + com -> inv_comp.params.o_params = 8; + memcpy( com -> inv_comp.params.b_params, + ssFIECodeBuf.buf, ssFIECodeBuf.l_buf>>3 ); + break; + case( CT_RET_RSLT ): + break; + case( CT_RET_ERR ): + break; + case( CT_RET_REJ ): + break; + } + mnss_begin_req -> fac_inf.l_fac = FACILITY_LEN<<3; + mnss_begin_req -> fac_inf.o_fac = 0; + ccdRet = ccd_codeMsg (CCDENT_FAC, + UPLINK, + (T_MSGBUF *) &mnss_begin_req -> fac_inf, + (UBYTE *) _decodedMsg, + COMPONENT); + + if( ccdRet NEQ ccdOK ) + { + CHAR buf[25]; + sprintf( buf, "CCD Coding Error: %d",ccdRet ); + TRACE_EVENT( buf ); + PFREE( mnss_begin_req ); + return( -1 ); + } + } + + pStbNtry -> srvType = ST_MOS; + + psaSS_DumpFIE ( &mnss_begin_req -> fac_inf ); + cmhSS_sendFie ( CSCN_FACILITY_DIRECTION_OUT, + CSCN_FACILITY_TRANS_TYPE_BEGIN, + &mnss_begin_req -> fac_inf ); + + if ( ssShrdPrm.mltyTrnFlg EQ 0 ) + { + PSENDX (SS, mnss_begin_req); /* send primitive */ + } + else + pStbNtry -> save_prim = mnss_begin_req; /* already one transaction in process */ + + + /* + * update service status + */ + pStbNtry -> srvStat = SSS_ACT; + } + + return 0; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSS | +| ROUTINE : psaSS_EndTrns | ++-------------------------------------------------------------------+ + + PURPOSE : stop an existing SS transaction + +*/ + +GLOBAL SHORT psaSS_EndTrns ( SHORT sId ) +{ + T_SS_SRV_TBL * pStbNtry; /* holds pointer to service table entry */ + + TRACE_FUNCTION ("psaSS_EndTrns()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC (mnss_end_req, MNSS_END_REQ); + + /* + * fill in primitive parameter: end request + */ + pStbNtry = &ssShrdPrm.stb[sId]; + + mnss_end_req -> ti = pStbNtry -> ti; + + { + UBYTE ccdRet; + + MCAST( com, COMPONENT ); + + memset( com, 0, sizeof( T_COMPONENT )); + switch( ssShrdPrm.cmpType ) + { + case( CT_RET_RSLT ): + com -> v_res_comp = TRUE; + com -> res_comp.v_inv_id = TRUE; + com -> res_comp.inv_id = pStbNtry -> iId; + com -> res_comp.v_sequence = TRUE; + com -> res_comp.sequence.v_op_code = TRUE; + com -> res_comp.sequence.op_code = pStbNtry -> opCode; + com -> res_comp.sequence.v_params = TRUE; + com -> res_comp.sequence.params.l_params = ssFIECodeBuf.l_buf-8; + com -> res_comp.sequence.params.o_params = 8; + memcpy( com -> res_comp.sequence.params.b_params, + ssFIECodeBuf.buf, ssFIECodeBuf.l_buf>>3 ); + break; + case( CT_RET_ERR ): + com -> v_err_comp = TRUE; + com -> err_comp.v_inv_id = TRUE; + com -> err_comp.inv_id = pStbNtry -> iId; + com -> err_comp.v_err_code = TRUE; + com -> err_comp.err_code = pStbNtry -> errCd; + break; + case( CT_RET_REJ ): + break; + } + mnss_end_req -> fac_inf.l_fac = FACILITY_LEN<<3; + mnss_end_req -> fac_inf.o_fac = 0; + ccdRet = ccd_codeMsg (CCDENT_FAC, + UPLINK, + (T_MSGBUF *) &mnss_end_req -> fac_inf, + (UBYTE *) _decodedMsg, + COMPONENT); + + if( ccdRet NEQ ccdOK ) + { + CHAR buf[25]; + sprintf( buf, "CCD Coding Error: %d",ccdRet ); + TRACE_EVENT( buf ); + PFREE( mnss_end_req ); + return( -1 ); + } + } + + psaSS_DumpFIE ( &mnss_end_req -> fac_inf ); + cmhSS_sendFie ( CSCN_FACILITY_DIRECTION_OUT, + CSCN_FACILITY_TRANS_TYPE_END, + &mnss_end_req -> fac_inf ); + + PSENDX (SS, mnss_end_req); + +#ifdef SIM_TOOLKIT + if ( sId EQ satShrdPrm.SentUSSDid AND + satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_USSD ) + { + satShrdPrm.USSDterm = TRUE; + } +#endif + + /* + * update call status + */ + pStbNtry -> srvStat = SSS_IDL; + + } + + psaSS_retMOSTi (sId); + + return 0; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSS | +| ROUTINE : psaSS_CntTrns | ++-------------------------------------------------------------------+ + + PURPOSE : continue with an existing SS transaction + +*/ + +GLOBAL SHORT psaSS_CntTrns ( SHORT sId ) +{ + T_SS_SRV_TBL * pStbNtry; /* holds pointer to service table entry */ + + TRACE_FUNCTION ("psaSS_CntTrns()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC (mnss_facility_req, MNSS_FACILITY_REQ); + + /* + * fill in primitive parameter: facility request + */ + pStbNtry = &ssShrdPrm.stb[sId]; + + mnss_facility_req -> ti = pStbNtry -> ti; + + { + UBYTE ccdRet; + + MCAST( com, COMPONENT ); + + memset( com, 0, sizeof( T_COMPONENT )); + switch( ssShrdPrm.cmpType ) + { + case( CT_RET_RSLT ): + com -> v_res_comp = TRUE; + com -> res_comp.v_inv_id = TRUE; + com -> res_comp.inv_id = pStbNtry -> iId; + /* patch for FTA 31.9.2.1: + When empty facility should be returned, then message should + contain ONLY the invoke id. CLB 061201 */ + if( ssFIECodeBuf.l_buf NEQ 8 ) /* means there actually are parameters */ + { + com -> res_comp.v_sequence = TRUE; + com -> res_comp.sequence.v_op_code = TRUE; + com -> res_comp.sequence.op_code = pStbNtry -> opCode; + + pStbNtry -> opCode = inv_opcode; + + com -> res_comp.sequence.v_params = TRUE; + com -> res_comp.sequence.params.l_params = ssFIECodeBuf.l_buf-8; + com -> res_comp.sequence.params.o_params = 8; + memcpy( com -> res_comp.sequence.params.b_params, + ssFIECodeBuf.buf, ssFIECodeBuf.l_buf>>3 ); + } + break; + case( CT_RET_ERR ): + com -> v_err_comp = TRUE; + com -> err_comp.v_inv_id = TRUE; + com -> err_comp.inv_id = pStbNtry -> iId; + com -> err_comp.v_err_code = TRUE; + com -> err_comp.err_code = pStbNtry -> errCd; + break; + break; + case( CT_RET_REJ ): + break; + } + mnss_facility_req -> fac_inf.l_fac = FACILITY_LEN<<3; + mnss_facility_req -> fac_inf.o_fac = 0; + ccdRet = ccd_codeMsg (CCDENT_FAC, + UPLINK, + (T_MSGBUF *) &mnss_facility_req -> fac_inf, + (UBYTE *) _decodedMsg, + COMPONENT); + + if( ccdRet NEQ ccdOK ) + { + CHAR buf[25]; + sprintf( buf, "CCD Coding Error: %d",ccdRet ); + TRACE_EVENT( buf ); + PFREE( mnss_facility_req ); + return( -1 ); + } + } + + psaSS_DumpFIE ( &mnss_facility_req -> fac_inf ); + cmhSS_sendFie ( CSCN_FACILITY_DIRECTION_OUT, + CSCN_FACILITY_TRANS_TYPE, + &mnss_facility_req -> fac_inf ); + + PSENDX (SS, mnss_facility_req); + } + + return 0; +} + +/*==== EOF ========================================================*/ +