FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/g23m-aci/aci/cmh_satr.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children | 5d2a33180923 |
comparison
equal
deleted
inserted
replaced
774:40a721fd9854 | 775:eedbf248bac0 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GSM-PS (6147) | |
4 | Modul : CMH_SATR | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : This module defines the functions which are responsible | |
18 | for the responses of the protocol stack adapter for | |
19 | the SIM application toolkit. | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifdef SIM_TOOLKIT | |
24 | |
25 #ifndef CMH_SATR_C | |
26 #define CMH_SATR_C | |
27 #endif | |
28 | |
29 #include "aci_all.h" | |
30 /*==== INCLUDES ===================================================*/ | |
31 #include "aci_cmh.h" | |
32 #include "aci_mem.h" | |
33 | |
34 #ifdef FAX_AND_DATA | |
35 #include "aci_fd.h" | |
36 #endif /* of #ifdef FAX_AND_DATA */ | |
37 | |
38 #include "aci.h" | |
39 #include "psa.h" | |
40 #include "psa_cc.h" | |
41 #include "psa_ss.h" | |
42 #include "psa_sat.h" | |
43 #include "psa_sim.h" /* for simShrdPrm declaration */ | |
44 #include "psa_sms.h" | |
45 #include "psa_util.h" | |
46 #include "cmh.h" | |
47 #include "cmh_cc.h" | |
48 #include "cmh_sat.h" | |
49 #include "cmh_sms.h" | |
50 #include "aoc.h" | |
51 | |
52 #include "phb.h" | |
53 #include "cmh_phb.h" | |
54 #include "l4_tim.h" | |
55 /*==== CONSTANTS ==================================================*/ | |
56 | |
57 | |
58 /*==== TYPES ======================================================*/ | |
59 | |
60 | |
61 /*==== EXPORT =====================================================*/ | |
62 | |
63 /*==== PROTOTYPES==================================================*/ | |
64 /* Implements Measure # 57, 77 */ | |
65 LOCAL void cmhSAT_ResCntrlBySIM (T_ACI_AT_CMD cmdBuf, | |
66 UBYTE simRslt, | |
67 T_ACI_SAT_TERM_RESP *resp_data); | |
68 | |
69 /* Implements Measure # 174 */ | |
70 LOCAL void cmhSAT_SIMCntrlAlertUser (BOOL ownNotSAT, | |
71 SHORT cId | |
72 #ifdef FF_SAT_E | |
73 ,T_ACI_SATA_ADD *addPrm | |
74 #endif | |
75 ); | |
76 | |
77 /*==== VARIABLES ==================================================*/ | |
78 | |
79 /*==== FUNCTIONS ==================================================*/ | |
80 | |
81 /* | |
82 +--------------------------------------------------------------------+ | |
83 | PROJECT : MODULE : CMH_SATR | | |
84 | STATE : code ROUTINE : cmhSAT_ModifyScaPdu | | |
85 +--------------------------------------------------------------------+ | |
86 | |
87 PURPOSE : modifies the SCA in a SUBMIT PDU | |
88 | |
89 */ | |
90 LOCAL void cmhSAT_ModifyScaPdu( T_sms_sdu *sms_sdu, | |
91 UBYTE *sca_buf, | |
92 UBYTE sca_len ) | |
93 { | |
94 UBYTE old_sca_len; | |
95 UBYTE *rest; | |
96 USHORT rest_len; | |
97 UBYTE *old_sdu; | |
98 UBYTE old_sdu_len; | |
99 | |
100 ACI_MALLOC(old_sdu, SIM_PDU_LEN); | |
101 old_sdu_len = sms_sdu->l_buf/8; | |
102 memcpy ( old_sdu, sms_sdu->buf, old_sdu_len ); | |
103 | |
104 old_sca_len = *old_sdu+1; | |
105 rest = old_sdu + old_sca_len; | |
106 rest_len = old_sdu_len - old_sca_len; | |
107 | |
108 /* copy new SCA */ | |
109 memcpy(sms_sdu->buf, sca_buf, sca_len); | |
110 | |
111 /* copy the rest of the PDU */ | |
112 memcpy(sms_sdu->buf+sca_len, rest, rest_len); | |
113 | |
114 /* set the length */ | |
115 sms_sdu->l_buf = (sca_len+rest_len) * 8; | |
116 | |
117 ACI_MFREE(old_sdu); | |
118 } | |
119 | |
120 | |
121 /* | |
122 +--------------------------------------------------------------------+ | |
123 | PROJECT : MODULE : CMH_SATR | | |
124 | STATE : code ROUTINE : cmhSAT_ModifyDaPdu | | |
125 +--------------------------------------------------------------------+ | |
126 | |
127 PURPOSE : modifies the destination address in a SUBMIT PDU | |
128 | |
129 */ | |
130 LOCAL void cmhSAT_ModifyDaPdu( T_sms_sdu *sms_sdu, | |
131 UBYTE *da_buf, | |
132 UBYTE da_len ) | |
133 { | |
134 UBYTE old_sca_len; | |
135 UBYTE old_da_len; | |
136 UBYTE *rest; | |
137 USHORT rest_len; | |
138 UBYTE *old_sdu; | |
139 UBYTE *new_sdu; | |
140 UBYTE old_sdu_len; | |
141 | |
142 ACI_MALLOC(old_sdu, SIM_PDU_LEN); | |
143 old_sdu_len = sms_sdu->l_buf/8; | |
144 memcpy ( old_sdu, sms_sdu->buf, old_sdu_len ); | |
145 | |
146 new_sdu = sms_sdu->buf; | |
147 | |
148 old_sca_len = *old_sdu+1; | |
149 old_da_len = (*(old_sdu + old_sca_len + 2)+1)/2 + 2; | |
150 rest = old_sdu + old_sca_len + 2 + old_da_len; | |
151 rest_len = old_sdu_len - old_sca_len - 2 - old_da_len; | |
152 | |
153 /* copy old sca, fo, mr */ | |
154 memcpy(new_sdu, old_sdu, old_sca_len+2); | |
155 new_sdu += old_sca_len+2; | |
156 | |
157 /* copy the new DA */ | |
158 memcpy(new_sdu, da_buf, da_len); | |
159 new_sdu += da_len; | |
160 | |
161 /* copy the rest of the PDU */ | |
162 memcpy(new_sdu, rest, rest_len); | |
163 | |
164 /* set the length */ | |
165 sms_sdu->l_buf = (old_sca_len+2+da_len+rest_len) * 8; | |
166 | |
167 ACI_MFREE(old_sdu); | |
168 } | |
169 | |
170 | |
171 /* | |
172 +-------------------------------------------------------------------+ | |
173 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
174 | ROUTINE : cmhSAT_STKCmdCnf | | |
175 +-------------------------------------------------------------------+ | |
176 | |
177 PURPOSE : STK command confirmation | |
178 | |
179 */ | |
180 | |
181 GLOBAL SHORT cmhSAT_STKCmdCnf ( void ) | |
182 { | |
183 | |
184 TRACE_FUNCTION ("cmhSAT_STKCmdCnf()"); | |
185 | |
186 /* | |
187 *------------------------------------------------------------------- | |
188 * check for command context | |
189 *------------------------------------------------------------------- | |
190 */ | |
191 switch( satEntStat.curCmd ) | |
192 { | |
193 case( AT_CMD_SATE ): | |
194 /* | |
195 *---------------------------------------------------------------- | |
196 * process event for %SATE command | |
197 *---------------------------------------------------------------- | |
198 */ | |
199 satEntStat.curCmd = AT_CMD_NONE; | |
200 | |
201 TRACE_EVENT_P1("SAT reponse with SIM cause: %d", satShrdPrm.stkError); | |
202 | |
203 switch (satShrdPrm.stkError) | |
204 { | |
205 case SIM_NO_ERROR: | |
206 R_AT( RAT_SATE, satEntStat.entOwn ) | |
207 ( satShrdPrm.stkCmdLen>>3, satShrdPrm.stkCmd ); | |
208 | |
209 R_AT( RAT_OK, satEntStat.entOwn ) | |
210 ( AT_CMD_SATE ); | |
211 break; | |
212 | |
213 case SIM_CAUSE_SAT_BUSY: | |
214 R_AT( RAT_CME, satEntStat.entOwn ) | |
215 ( AT_CMD_SATE, CME_ERR_SimSatBusy ); | |
216 break; | |
217 | |
218 case SIM_CAUSE_PUK1_BLOCKED: | |
219 R_AT( RAT_CME, satEntStat.entOwn ) | |
220 ( AT_CMD_SATE, CME_ERR_SimFail ); | |
221 break; | |
222 | |
223 default: | |
224 R_AT( RAT_CME, satEntStat.entOwn ) | |
225 ( AT_CMD_SATE, CME_ERR_Unknown ); | |
226 break; | |
227 } | |
228 break; | |
229 } | |
230 | |
231 return 0; | |
232 } | |
233 | |
234 /* | |
235 +-------------------------------------------------------------------+ | |
236 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
237 | ROUTINE : cmhSAT_STKCmdInd | | |
238 +-------------------------------------------------------------------+ | |
239 | |
240 PURPOSE : STK command indication | |
241 | |
242 */ | |
243 | |
244 GLOBAL SHORT cmhSAT_STKCmdInd ( void ) | |
245 { | |
246 SHORT idx; /* holds list index */ | |
247 | |
248 TRACE_FUNCTION ("cmhSAT_STKCmdInd()"); | |
249 | |
250 /* | |
251 *---------------------------------------------------------------- | |
252 * send unsolicited result | |
253 *---------------------------------------------------------------- | |
254 */ | |
255 | |
256 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
257 { | |
258 R_AT( RAT_SATI, (T_ACI_CMD_SRC)idx ) | |
259 ( satShrdPrm.stkCmdLen>>3, satShrdPrm.stkCmd ); | |
260 } | |
261 return 0; | |
262 } | |
263 | |
264 #ifdef TI_PS_FF_AT_P_CMD_CUST | |
265 /* | |
266 +-------------------------------------------------------------------+ | |
267 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
268 | ROUTINE : cmhSAT_Cust1StkCmdInd | | |
269 +-------------------------------------------------------------------+ | |
270 | |
271 PURPOSE : Used for Sending the Origianl STK command indication to a Cust1 MMI, | |
272 when performing Setup Call, Send SS, Send USSD or Send SMS | |
273 */ | |
274 | |
275 GLOBAL SHORT cmhSAT_Cust1StkCmdInd ( void ) | |
276 { | |
277 SHORT idx; /* holds list index */ | |
278 | |
279 TRACE_FUNCTION ("cmhSAT_Cust1StkCmdInd()"); | |
280 | |
281 if (satShrdPrm.cust1StkCmd != (void *)0) | |
282 { | |
283 /* | |
284 *---------------------------------------------------------------- | |
285 * send %SATI the MMI with the Stk Cmd | |
286 *---------------------------------------------------------------- | |
287 */ | |
288 | |
289 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
290 { | |
291 R_AT( RAT_SATI,(T_ACI_CMD_SRC)idx ) | |
292 ( satShrdPrm.cust1StkCmdLen >>3, satShrdPrm.cust1StkCmd); | |
293 } | |
294 | |
295 ACI_MFREE(satShrdPrm.cust1StkCmd); | |
296 | |
297 satShrdPrm.cust1StkCmd = (void *)0; | |
298 satShrdPrm.cust1StkCmdLen = 0; | |
299 } | |
300 | |
301 return 0; | |
302 } | |
303 #endif /* TI_PS_FF_AT_P_CMD_CUST */ | |
304 /* | |
305 +-------------------------------------------------------------------+ | |
306 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
307 | ROUTINE : cmhSAT_STKUsrNtfy | | |
308 +-------------------------------------------------------------------+ | |
309 | |
310 PURPOSE : STK user notification | |
311 | |
312 */ | |
313 | |
314 GLOBAL SHORT cmhSAT_STKUsrNtfy ( void ) | |
315 { | |
316 SHORT idx; /* holds list index */ | |
317 | |
318 T_ACI_SATN_CNTRL_TYPE cntrl_type = SATN_CNTRL_BY_SIM_Not_Present; | |
319 | |
320 TRACE_FUNCTION ("cmhSAT_STKUsrNtfy()"); | |
321 | |
322 /* | |
323 *---------------------------------------------------------------- | |
324 * determine user notification | |
325 *---------------------------------------------------------------- | |
326 */ | |
327 switch( satShrdPrm.ntfy ) | |
328 { | |
329 case( USR_NTF_CC_SIM ): | |
330 | |
331 #ifdef TI_PS_FF_AT_P_CMD_CUST | |
332 if (simShrdPrm.overall_cust_mode EQ CUST_MODE_BEHAVIOUR_1) | |
333 { | |
334 switch (satShrdPrm.SIMCCParm.ccAct) | |
335 { | |
336 case CC_ACT_CAL: | |
337 cntrl_type = SATN_CNTRL_BY_SIM_CALL; | |
338 break ; | |
339 | |
340 case CC_ACT_SS: | |
341 cntrl_type = SATN_CNTRL_BY_SIM_SS; | |
342 break ; | |
343 | |
344 case CC_ACT_USSD: | |
345 cntrl_type = SATN_CNTRL_BY_SIM_USSD; | |
346 break ; | |
347 | |
348 case SMC_ACT_MO: | |
349 cntrl_type = SATN_CNTRL_BY_SIM_SMS; | |
350 break ; | |
351 | |
352 default: | |
353 cntrl_type = SATN_CNTRL_BY_SIM_Not_Present; | |
354 } | |
355 } | |
356 #endif /* TI_PS_FF_AT_P_CMD_CUST */ | |
357 | |
358 if(psa_IsVldOwnId((T_OWN)satShrdPrm.owner) AND | |
359 satShrdPrm.owner NEQ OWN_SRC_INV ) | |
360 { | |
361 R_AT( RAT_SATN, (T_ACI_CMD_SRC)satShrdPrm.owner ) | |
362 ( satShrdPrm.stkCmdLen>>3, satShrdPrm.stkCmd, cntrl_type ); | |
363 break; | |
364 } | |
365 /* otherwise continue, no break */ | |
366 /*lint -fallthrough*/ | |
367 default: | |
368 | |
369 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
370 { | |
371 R_AT( RAT_SATN, (T_ACI_CMD_SRC)idx ) | |
372 ( satShrdPrm.stkCmdLen>>3, satShrdPrm.stkCmd, cntrl_type ); | |
373 } | |
374 } | |
375 | |
376 return 0; | |
377 } | |
378 | |
379 LOCAL void send_error_to_user( BOOL ownNotSAT, | |
380 UBYTE command, | |
381 UBYTE result, | |
382 UBYTE additional_result, | |
383 UBYTE *resId, | |
384 BOOL satopc ) | |
385 { | |
386 T_ACI_SAT_TERM_RESP resp_data; | |
387 | |
388 psaSAT_InitTrmResp( &resp_data ); | |
389 | |
390 if( ownNotSAT ) | |
391 { | |
392 /* setup initiated by user */ | |
393 R_AT( RAT_CME,(T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner ) | |
394 ( command, CME_ERR_NotPresent ); | |
395 /* log result */ | |
396 cmh_logRslt ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, RAT_CME, | |
397 (T_ACI_AT_CMD)command, -1, BS_SPEED_NotPresent, CME_ERR_NotPresent ); | |
398 return; | |
399 } | |
400 | |
401 /* setup initiated by SAT */ | |
402 /* send SAT response */ | |
403 resp_data.add_content = additional_result; | |
404 | |
405 /* if source was open channel command */ | |
406 #ifdef FF_SAT_E | |
407 if(satopc) | |
408 { | |
409 if( satShrdPrm.opchStat EQ OPCH_CCSIM_REQ ) | |
410 { | |
411 cmhSAT_OpChnFailed( result, &resp_data ); | |
412 return; | |
413 } | |
414 } | |
415 #endif /* FF_SAT_E */ | |
416 | |
417 if( resId NEQ NULL ) | |
418 { | |
419 resp_data.resCC = resId; | |
420 } | |
421 psaSAT_SendTrmResp( result, &resp_data ); | |
422 } | |
423 | |
424 /* return TRUE if key sequence accepted, FALSE otherwise */ | |
425 LOCAL BOOL sim_control_send_ss( T_CLPTY_PRM *ss_clpty, | |
426 UBYTE command, | |
427 BOOL ownNotSAT, | |
428 UBYTE *resCC ) | |
429 { | |
430 T_ACI_RETURN retVal; /* holds return value */ | |
431 T_ACI_D_CLIR_OVRD dummy2; /* dummy value */ | |
432 T_ACI_D_TOC dummy1; /* dummy value */ | |
433 | |
434 /* check for busy SS condition */ | |
435 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY ) | |
436 { | |
437 /* NOTE: shouldn't that be: | |
438 send_error_to_user( ownNotSAT, RSLT_CC_SIM_PRM, ADD_ME_SS_BUSY, resCC, FALSE); | |
439 or send_error_to_user( ownNotSAT, RSLT_CC_SIM_PRM, RSLT_ME_CAP, resCC, FALSE); | |
440 ??*/ | |
441 send_error_to_user( ownNotSAT, command, RSLT_ME_UNAB_PROC, ADD_ME_SS_BUSY, resCC, FALSE); | |
442 return FALSE; | |
443 } | |
444 | |
445 /* send SS control string */ | |
446 retVal = cmhCC_chkKeySeq ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, | |
447 ss_clpty, | |
448 &dummy1, | |
449 &dummy2, | |
450 CC_SIM_NO ); | |
451 if( retVal NEQ AT_EXCT ) | |
452 { | |
453 /* string is not SS: terminate with error */ | |
454 //TISH, patch for OMAPS00126322 | |
455 //start | |
456 if (retVal EQ AT_CMPL) | |
457 { | |
458 TRACE_ERROR("send RSLT_PERF_SUCCESS"); | |
459 send_error_to_user( ownNotSAT, command, RSLT_PERF_SUCCESS, RSLT_PERF_MDFY_SIM, resCC, FALSE); | |
460 return(TRUE); | |
461 } | |
462 //end | |
463 send_error_to_user( ownNotSAT, command, RSLT_CC_SIM_PRM, RSLT_ME_CAP, resCC, FALSE); | |
464 return(FALSE); | |
465 } | |
466 else | |
467 { | |
468 #ifdef FF_SAT_E | |
469 if(!ownNotSAT AND satShrdPrm.opchStat EQ OPCH_CCSIM_REQ ) | |
470 { | |
471 return( FALSE ); | |
472 } | |
473 #endif /* FF_SAT_E */ | |
474 return(TRUE); | |
475 } | |
476 } | |
477 | |
478 /* | |
479 +-------------------------------------------------------------------+ | |
480 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
481 | ROUTINE : cmhSAT_ResCalCntrlBySIM | | |
482 +-------------------------------------------------------------------+ | |
483 | |
484 PURPOSE : Handle SIM call control result. Return TRUE if primitive | |
485 is needed for building a terminal response. | |
486 | |
487 */ | |
488 LOCAL BOOL cmhSAT_result_sim_cc_ss( SHORT cId, | |
489 UBYTE *resId, | |
490 T_ccr_allw *ccr ) | |
491 { | |
492 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
493 T_ACI_SAT_TERM_RESP resp_data; | |
494 BOOL ownNotSAT = (satShrdPrm.SIMCCParm.owner NEQ OWN_SRC_SAT); /* flags that the owner is not SAT */ | |
495 UBYTE cmdBuf; /* buffer command */ | |
496 | |
497 TRACE_FUNCTION("cmhSAT_result_sim_cc_ss()"); | |
498 | |
499 psaSAT_InitTrmResp( &resp_data ); | |
500 | |
501 #ifdef FF_SAT_E | |
502 /* check for a pending OPEN CHANNEL command */ | |
503 if (ctb->calStat EQ CS_SAT_CSD_REQ) | |
504 { | |
505 /* free ctb entry */ | |
506 psaCC_FreeCtbNtry (cId); | |
507 | |
508 /* respond with "error, Interaction with CC by SIM, perm problem" */ | |
509 resp_data.add_content = ADD_CC_REQ_CHNG; | |
510 resp_data.chnStat = TRUE; | |
511 | |
512 cmhSAT_OpChnFailed( RSLT_CC_SIM_PRM, &resp_data ); | |
513 | |
514 return( FALSE ); | |
515 } | |
516 #endif /* FF_SAT_E */ | |
517 | |
518 cmdBuf = ctb->curCmd; | |
519 psaCC_FreeCtbNtry (cId); | |
520 | |
521 cmhCC_init_cldPty( &satPndSetup.clpty ); | |
522 | |
523 utl_BCD2DialStr( ccr->ss_string.ss_ctrl_string, | |
524 satPndSetup.clpty.num, | |
525 (UBYTE)MINIMUM(ccr->ss_string.c_ss_ctrl_string, | |
526 MAX_DIAL_LEN-1)); | |
527 | |
528 satPndSetup.clpty.ton = ccr->ss_string.noa; | |
529 satPndSetup.clpty.npi = ccr->ss_string.npi; | |
530 | |
531 if( sim_control_send_ss( &satPndSetup.clpty, cmdBuf, ownNotSAT, resId ) ) | |
532 return( !ownNotSAT ); | |
533 return( FALSE ); /* primitive not needed anymore */ | |
534 } | |
535 | |
536 LOCAL BOOL cmhSAT_result_sim_cc_address( SHORT cId, T_ccr_allw *ccr ) | |
537 { | |
538 SHORT retVal = 0; | |
539 T_ACI_SAT_TERM_RESP resp_data; | |
540 | |
541 TRACE_FUNCTION("cmhSAT_result_sim_cc_address()"); | |
542 | |
543 psaSAT_InitTrmResp( &resp_data ); | |
544 | |
545 /* adjust called address */ | |
546 cmhSAT_fillSetupPrm ( cId, | |
547 &ccr->addr, | |
548 ((ccr->v_subaddr)?&ccr->subaddr:NULL)); | |
549 #ifdef FF_SAT_E | |
550 if( psaCC_ctb(cId)->calStat NEQ CS_SAT_CSD_REQ ) | |
551 #endif /* FF_SAT_E */ | |
552 { | |
553 /* new call table entry set default bearer capabilities */ | |
554 cmhSAT_fillSetupBC ( cId, MNCC_BEARER_SERV_SPEECH, MNCC_BEARER_SERV_NOT_PRES ); | |
555 } | |
556 | |
557 /* Store the BC repeat indicator */ | |
558 if ( ccr->v_bc_rpi ) | |
559 | |
560 | |
561 { | |
562 ccShrdPrm.ctb[cId]->rptInd = ccr->bc_rpi; | |
563 } | |
564 | |
565 /* adjust bearer capabilities */ | |
566 if( ccr->v_cap_cnf_parms OR ccr->v_cap_cnf_parms_2 ) | |
567 { | |
568 satShrdPrm.capParm.cId = cId; | |
569 satShrdPrm.capParm.CCres = CCR_ALLW_WITH_MDFY; | |
570 satShrdPrm.capParm.cntxt = CTX_CC_RESULT; | |
571 | |
572 if ( ccr->v_cap_cnf_parms AND ccr->v_cap_cnf_parms_2 ) | |
573 { | |
574 retVal= psaCC_BCapDecode( BCRI_SAT, | |
575 (UINT16)(ccr->cap_cnf_parms.l_cap_cnf_parms>>3), | |
576 ccr->cap_cnf_parms.b_cap_cnf_parms, | |
577 (UINT16)(ccr->cap_cnf_parms_2.l_cap_cnf_parms_2>>3), | |
578 ccr->cap_cnf_parms_2.b_cap_cnf_parms_2); | |
579 } | |
580 else if ( ccr->v_cap_cnf_parms ) | |
581 { | |
582 retVal= psaCC_BCapDecode( BCRI_SAT, | |
583 (UINT16)(ccr->cap_cnf_parms.l_cap_cnf_parms>>3), | |
584 ccr->cap_cnf_parms.b_cap_cnf_parms, | |
585 0, | |
586 NULL); | |
587 } | |
588 if( retVal < 0 ) | |
589 { | |
590 resp_data.resCC = &satShrdPrm.capParm.CCres; | |
591 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); | |
592 psaCC_FreeCtbNtry (cId); | |
593 } | |
594 return( FALSE ); | |
595 } | |
596 return( TRUE ); | |
597 } | |
598 | |
599 | |
600 LOCAL BOOL cmhSAT_result_sim_cc_ussd( SHORT cId, | |
601 UBYTE *resId, | |
602 T_ccr_allw *ccr ) | |
603 { | |
604 T_ACI_SAT_TERM_RESP resp_data; | |
605 BOOL ownNotSAT = (satShrdPrm.SIMCCParm.owner NEQ OWN_SRC_SAT); /* flags that the owner is not SAT */ | |
606 UBYTE cmdBuf; /* buffer command */ | |
607 UBYTE len = 0; | |
608 T_ACI_RETURN retVal; | |
609 T_ACI_D_TOC dummy1; | |
610 T_ACI_D_CLIR_OVRD dummy2; | |
611 | |
612 TRACE_FUNCTION("cmhSAT_result_sim_cc_ussd()"); | |
613 | |
614 psaSAT_InitTrmResp( &resp_data ); | |
615 | |
616 /* check for busy SS condition */ | |
617 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY ) | |
618 { | |
619 /* respond with "error, ME currently unable to process command" */ | |
620 resp_data.add_content = ADD_ME_SS_BUSY; | |
621 resp_data.resCC = resId; | |
622 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); | |
623 return( FALSE ); | |
624 } | |
625 | |
626 /* call adr to be modified with USSD string*/ | |
627 cmdBuf = psaCC_ctb(cId)->curCmd; | |
628 psaCC_FreeCtbNtry (cId); | |
629 /* Implements Measure 25 */ | |
630 /* This function is more correct than utl_getAlphabetCb as it takes care | |
631 of reserved codings */ | |
632 if( cmh_getAlphabetCb( (UBYTE) ccr->ussd_string.dcs) EQ 0 ) /* 7bit alphabet */ | |
633 { | |
634 len=utl_cvt7To8( ccr->ussd_string.ussd_str, | |
635 ccr->ussd_string.c_ussd_str, | |
636 (UBYTE*)&satPndSetup.clpty.num, 0); | |
637 satPndSetup.clpty.num[len]=0x00; | |
638 } | |
639 else | |
640 { | |
641 memcpy( satPndSetup.clpty.num, ccr->ussd_string.ussd_str, | |
642 ccr->ussd_string.c_ussd_str ); | |
643 satPndSetup.clpty.num[ccr->ussd_string.c_ussd_str]=0x00; | |
644 } | |
645 | |
646 retVal = cmhCC_chkKeySeq ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, | |
647 &satPndSetup.clpty, | |
648 &dummy1, &dummy2, | |
649 CC_SIM_NO ); | |
650 | |
651 if( retVal EQ AT_EXCT ) | |
652 { | |
653 return( !ownNotSAT ); | |
654 } | |
655 /* Implements Measure # 57 */ | |
656 /* Implements Measure # 57, 77 */ | |
657 | |
658 /* Fill resp_data content in case it is needed for psaSAT_SendTrmResp | |
659 in cmhSAT_ResCntrlBySIM */ | |
660 resp_data.resCC = resId; | |
661 | |
662 cmhSAT_ResCntrlBySIM ((T_ACI_AT_CMD)cmdBuf, RSLT_ME_CAP, &resp_data); | |
663 | |
664 return( FALSE ); /* primitive not needed anymore */ | |
665 } | |
666 | |
667 | |
668 GLOBAL BOOL cmhSAT_ResCalCntrlBySIM( UBYTE* resId, void *ccRes ) | |
669 { | |
670 UBYTE cmdBuf; /* buffer command */ | |
671 SHORT cId = satShrdPrm.SIMCCParm.cId; /* holds setup call id */ | |
672 SHORT actId; /* holds active call id */ | |
673 T_ccr_allw * ccr; /* points to CC result */ | |
674 UBYTE idx; /* holds index */ | |
675 T_ACI_SAT_TERM_RESP resp_data; | |
676 | |
677 #if defined SMI OR defined MFW | |
678 T_ACI_CLOG cmdLog; /* holds logging info */ | |
679 CHAR cmdlog_num_buf[MNCC_MAX_CC_CALLED_NUMBER]; /* buffer where number is written for cmdLog */ | |
680 USHORT length; /* length of number */ | |
681 #endif | |
682 | |
683 TRACE_FUNCTION("cmhSAT_ResCalCntrlBySIM()"); | |
684 | |
685 psaSAT_InitTrmResp( &resp_data ); | |
686 | |
687 ccr = (T_ccr_allw*)ccRes; | |
688 | |
689 /* check if queued event download */ | |
690 if (satShrdPrm.event.c_queued) | |
691 { | |
692 cmhSAT_EventDwn((UBYTE)-1, -1, END_UNDEFINED); | |
693 } | |
694 | |
695 satShrdPrm.SIMCCParm.busy = FALSE; | |
696 | |
697 if (!psaCC_ctbIsValid (cId)) | |
698 { | |
699 TRACE_ERROR ("Call table entry disappeared"); | |
700 return FALSE; | |
701 } | |
702 | |
703 #ifdef TI_PS_FF_AT_P_CMD_CUST | |
704 /* | |
705 ** If this is a Cust1 MMI and The originator was a STK Cmd | |
706 */ | |
707 if ((simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1) AND | |
708 (satShrdPrm.ownSAT EQ TRUE)) | |
709 { | |
710 /* | |
711 ** Customised behaviour for the Cust1 MMI | |
712 */ | |
713 if (*resId EQ CCR_NOT_ALLW) | |
714 { | |
715 /* Call Setup not allowed */ | |
716 send_error_to_user( !satShrdPrm.ownSAT, psaCC_ctb(cId)->curCmd, | |
717 RSLT_CC_SIM_PRM, ADD_CC_NOT_ALLWD, | |
718 NULL, TRUE); | |
719 } | |
720 else | |
721 { | |
722 /* | |
723 ** This was a SAT initiated call. For the Cust1 the ACI does not yet have any | |
724 ** actions to perform, other than the CC By SIM which has been done. So : | |
725 ** Send the Original STK Cmd to the MMI in a %SATI for the MMI to process. | |
726 ** | |
727 ** The second action will cause the MMI to request the approriate Call Setup, SS | |
728 ** or USSD Request and the required Call Table entry will then be re-created. | |
729 */ | |
730 cmhSAT_Cust1StkCmdInd(); | |
731 } | |
732 | |
733 /* Free the Call Table Entry | |
734 ** The SATI indication (if sent) will cause the MMI to request the approriate Call Setup, SS | |
735 ** or USSD Request and the required Call Table entry will then be re-created. | |
736 */ | |
737 psaCC_FreeCtbNtry (cId); | |
738 | |
739 return( FALSE ); /* primitive not needed anymore */ | |
740 } | |
741 #endif /* TI_PS_FF_AT_P_CMD_CUST */ | |
742 | |
743 /* determine result id */ | |
744 switch( *resId ) | |
745 { | |
746 case( CCR_NOT_ALLW ): | |
747 /* call setup not allowed */ | |
748 send_error_to_user( !satShrdPrm.ownSAT, psaCC_ctb(cId)->curCmd, | |
749 RSLT_CC_SIM_PRM, ADD_CC_NOT_ALLWD, | |
750 NULL, TRUE); | |
751 | |
752 /* memory for number has also been allocated in case of SAT setup call !! */ | |
753 psaCC_FreeCtbNtry (cId); | |
754 return( FALSE ); /* primitive not needed anymore */ | |
755 | |
756 case( CCR_ALLW_WITH_MDFY ): | |
757 /* call setup allowed with modification */ | |
758 if( ccr->v_ss_string ) | |
759 { | |
760 /* if setup was converted into a SS control string */ | |
761 return(cmhSAT_result_sim_cc_ss( cId, resId, ccr )); | |
762 } | |
763 else if( ccr->v_addr ) | |
764 { | |
765 /* Replace call parameters for this cId with the ones provided by SIM */ | |
766 if ( !(cmhSAT_result_sim_cc_address( cId, ccr )) ) | |
767 { | |
768 return TRUE; | |
769 } | |
770 } | |
771 else if (ccr->v_ussd_string) | |
772 { | |
773 /* if setup was converted into a USSD control string */ | |
774 return(cmhSAT_result_sim_cc_ussd( cId, resId, ccr )); | |
775 } | |
776 else | |
777 {} /* do not change cId parameters */ | |
778 break; | |
779 | |
780 case( CCR_ALLW_NO_MDFY ): | |
781 /* call setup allowed no modification */ | |
782 /* use parameters already linked to cId */ | |
783 break; | |
784 } | |
785 | |
786 /* perform call setup initiated by user */ | |
787 if( !satShrdPrm.ownSAT ) | |
788 { | |
789 /* check for an active call */ | |
790 actId = psaCC_ctbFindCall( OWN_SRC_INV, CS_ACT, NO_VLD_CT ); | |
791 | |
792 if( actId NEQ NO_ENTRY ) | |
793 { | |
794 /* put active on hold if possible */ | |
795 if( psaCC_ctb(actId)->prio EQ MNCC_PRIO_NORM_CALL AND | |
796 cmhCC_getcalltype(actId) EQ VOICE_CALL ) | |
797 { | |
798 //TISH, patch for OMAPS00129157 | |
799 //start | |
800 #if 0 | |
801 cmhCC_HoldCall(actId, psaCC_ctb(cId)->curSrc, AT_CMD_D); | |
802 #else | |
803 CHLDaddInfo=CHLD_ADD_INFO_DIAL_CAL; | |
804 cmhPrm[actId].ccCmdPrm.CHLDmode = CHLD_MOD_HldActDial; | |
805 cmhCC_HoldCall(actId, psaCC_ctb(cId)->curSrc, AT_CMD_D); | |
806 #endif | |
807 //end | |
808 } | |
809 /* reject call setup: already data or emergency call on going */ | |
810 else | |
811 { | |
812 cmdBuf = psaCC_ctb(cId)->curCmd; | |
813 psaCC_FreeCtbNtry (cId); | |
814 | |
815 R_AT( RAT_CME, (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner ) | |
816 ( cmdBuf, CME_ERR_NotPresent ); | |
817 | |
818 /* log result */ | |
819 cmh_logRslt ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, RAT_CME, | |
820 (T_ACI_AT_CMD)cmdBuf,-1, BS_SPEED_NotPresent, CME_ERR_NotPresent ); | |
821 | |
822 return( FALSE ); /* primitive not needed anymore */ | |
823 } | |
824 } | |
825 | |
826 /* finally set up call */ | |
827 cmhCC_flagCall( cId, | |
828 &(cmhPrm[psaCC_ctb(cId)->calOwn].ccCmdPrm.mltyCncFlg)); | |
829 | |
830 //TISH, patch for OMAPS00129157 | |
831 //start | |
832 if (CHLDaddInfo!=CHLD_ADD_INFO_DIAL_CAL || cmhPrm[actId].ccCmdPrm.CHLDmode != CHLD_MOD_HldActDial) | |
833 //end | |
834 psaCC_NewCall (cId); | |
835 | |
836 | |
837 #if defined SMI OR defined MFW | |
838 /* log command */ | |
839 cmdLog.atCmd = AT_CMD_D; | |
840 cmdLog.cmdType = CLOG_TYPE_Set; | |
841 cmdLog.retCode = AT_EXCT; | |
842 cmdLog.cId = cId+1; | |
843 cmdLog.sId = ACI_NumParmNotPresent; | |
844 cmdLog.cmdPrm.sD.srcId = (T_ACI_CMD_SRC)psaCC_ctb(cId)->curSrc; | |
845 | |
846 cmdLog.cmdPrm.sD.number = cmdlog_num_buf; | |
847 | |
848 /* | |
849 * For this block wrong code is generated by target compiler 1.22e | |
850 * Use psaCC_ctb() to simplify pointer expression. | |
851 */ | |
852 #if 0 | |
853 if(ccShrdPrm.ctb[cId]->cldPty.c_called_num < MNCC_MAX_CC_CALLED_NUMBER) | |
854 { | |
855 length = ccShrdPrm.ctb[cId]->cldPty.c_called_num; | |
856 } | |
857 else | |
858 length = MNCC_MAX_CC_CALLED_NUMBER; | |
859 | |
860 utl_BCD2String( cmdLog.cmdPrm.sD.number, | |
861 (UBYTE *) ccShrdPrm.ctb[cId]->cldPty.called_num, | |
862 length); | |
863 #else | |
864 if(psaCC_ctb(cId)->cldPty.c_called_num < MNCC_MAX_CC_CALLED_NUMBER) | |
865 { | |
866 length = psaCC_ctb(cId)->cldPty.c_called_num; | |
867 } | |
868 else | |
869 length = MNCC_MAX_CC_CALLED_NUMBER; | |
870 | |
871 utl_BCD2String (cmdLog.cmdPrm.sD.number, | |
872 psaCC_ctb(cId)->cldPty.called_num, | |
873 length); | |
874 #endif /* else, #if 0 */ | |
875 | |
876 cmdLog.cmdPrm.sD.clirOvrd = D_CLIR_OVRD_Default; /* ??? */ | |
877 cmdLog.cmdPrm.sD.cugCtrl = D_CUG_CTRL_NotPresent; /* ??? */ | |
878 cmdLog.cmdPrm.sD.callType = (T_ACI_D_TOC)psaCC_ctb(cId)->calType; | |
879 #ifdef SIM_TOOLKIT | |
880 cmdLog.cmdPrm.sD.simCallCtrl= D_SIMCC_ACTIVE; | |
881 #endif /* SIM tOOLKIT */ | |
882 rAT_PercentCLOG( &cmdLog ); | |
883 #endif /* SMI or MFW */ | |
884 return( FALSE ); | |
885 } | |
886 /* perform call setup initiated by SAT */ | |
887 else /* Must be normal behaviour, otherwise it would have been trapped earlier in the function */ | |
888 { | |
889 | |
890 #ifdef FF_SAT_E | |
891 /* if source was open channel command */ | |
892 if( satShrdPrm.opchStat EQ OPCH_CCSIM_REQ ) | |
893 { | |
894 if(*resId EQ CCR_ALLW_WITH_MDFY) | |
895 satShrdPrm.opchCCMdfy = TRUE; | |
896 | |
897 cmhSAT_OpChnAlert( cId ); | |
898 return( FALSE ); | |
899 } | |
900 #endif /* FF_SAT_E */ | |
901 | |
902 #ifdef SIM_TOOLKIT | |
903 /* When Envelope Call Control is Enabled SATA should not go again */ | |
904 if (ccShrdPrm.ctb[cId]->SATinv & SAT_REDIAL_ECCBE) | |
905 { | |
906 return( *resId EQ CCR_ALLW_WITH_MDFY ); | |
907 } | |
908 #endif | |
909 | |
910 /* alert user if command details are supported */ | |
911 if( cmhSAT_ChckCmdDet() ) | |
912 { | |
913 /* check aoc condition */ | |
914 if ((psaCC_ctb(cId)->prio EQ MNCC_PRIO_NORM_CALL) AND | |
915 (aoc_check_moc() EQ FALSE)) | |
916 /* | |
917 * check ACM exceeds ACMmax | |
918 * for non-emergency calls | |
919 */ | |
920 { | |
921 resp_data.add_content = ADD_NO_CAUSE; | |
922 resp_data.resCC = (*resId EQ CCR_ALLW_WITH_MDFY)? resId: NULL; | |
923 | |
924 | |
925 psaSAT_SendTrmResp(RSLT_ME_UNAB_PROC, &resp_data); | |
926 psaCC_FreeCtbNtry (cId); | |
927 return( FALSE ); | |
928 } | |
929 | |
930 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
931 { | |
932 | |
933 #ifdef FF_SAT_E | |
934 T_ACI_SATA_ADD addPrm; | |
935 | |
936 addPrm.chnType = SATA_CT_VOICE; | |
937 addPrm.chnEst = SATA_EST_IM; | |
938 | |
939 R_AT( RAT_SATA, (T_ACI_CMD_SRC)idx )( cId+1, satShrdPrm.dur, &addPrm ); | |
940 #else | |
941 R_AT( RAT_SATA, (T_ACI_CMD_SRC)idx )( cId+1, satShrdPrm.dur ); | |
942 #endif /* FF_SAT_E */ | |
943 } | |
944 | |
945 satShrdPrm.ntfy = USR_NTF_SETUP_CAL; | |
946 } | |
947 return( FALSE ); | |
948 } | |
949 } | |
950 | |
951 LOCAL BOOL sim_control_setup_call( T_ccr_allw *ccr, BOOL ownNotSAT ) | |
952 { | |
953 SHORT cId = satShrdPrm.SIMCCParm.cId; /* holds setup call id */ | |
954 | |
955 #ifdef FF_SAT_E | |
956 T_ACI_SATA_ADD addPrm; | |
957 #endif /* FF_SAT_E */ | |
958 cId = psaCC_ctbNewEntry(); | |
959 | |
960 if( cId EQ NO_ENTRY ) | |
961 { | |
962 send_error_to_user( ownNotSAT, AT_CMD_D, RSLT_ME_UNAB_PROC, ADD_NO_CAUSE, NULL, FALSE); | |
963 return( FALSE ); /* primitive not needed anymore */ | |
964 } | |
965 | |
966 /* fill in setup parameter for called address */ | |
967 cmhSAT_fillSetupPrm ( cId, | |
968 ((ccr->v_addr)?&ccr->addr:NULL), | |
969 ((ccr->v_subaddr)?&ccr->subaddr:NULL)); | |
970 /* new call table entry set default bearer capabilities */ | |
971 cmhSAT_fillSetupBC ( cId, MNCC_BEARER_SERV_SPEECH, MNCC_BEARER_SERV_NOT_PRES ); | |
972 | |
973 /* check aoc condition */ | |
974 if ((psaCC_ctb(cId)->prio EQ MNCC_PRIO_NORM_CALL) AND | |
975 (aoc_check_moc() EQ FALSE)) | |
976 /* check ACM exceeds ACMmax for non-emergency calls */ | |
977 { | |
978 send_error_to_user( ownNotSAT, AT_CMD_D, RSLT_ME_UNAB_PROC, ADD_NO_CAUSE, NULL, FALSE); | |
979 psaCC_FreeCtbNtry (cId); | |
980 return( FALSE ); | |
981 } | |
982 | |
983 if( ccr->v_cap_cnf_parms ) | |
984 { | |
985 /* check bearer caps, ctb not allocated */ | |
986 } | |
987 | |
988 /* declare call table entry as used and the owner and status | |
989 of the call */ | |
990 psaCC_ctb(cId)->calOwn = (T_OWN)satShrdPrm.SIMCCParm.owner; | |
991 psaCC_ctb(cId)->calStat = CS_SAT_REQ; | |
992 psaCC_ctb(cId)->curCmd = AT_CMD_D; | |
993 psaCC_ctb(cId)->curSrc = satShrdPrm.SIMCCParm.owner; | |
994 | |
995 if( !ownNotSAT ) psaCC_ctb(cId)->SATinv = TRUE; | |
996 | |
997 /* Implements Measure # 174 */ | |
998 cmhSAT_SIMCntrlAlertUser (ownNotSAT, cId | |
999 #ifdef FF_SAT_E | |
1000 , &addPrm | |
1001 #endif | |
1002 ); | |
1003 return( !ownNotSAT ); | |
1004 } | |
1005 | |
1006 | |
1007 /* | |
1008 +-------------------------------------------------------------------+ | |
1009 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
1010 | ROUTINE : cmhSAT_ResSSCntrlBySIM | | |
1011 +-------------------------------------------------------------------+ | |
1012 | |
1013 PURPOSE : Handle SIM SS control result. Return TRUE if primitive | |
1014 is needed for building a terminal response. | |
1015 | |
1016 */ | |
1017 | |
1018 GLOBAL BOOL cmhSAT_ResSSCntrlBySIM( UBYTE* resId, void *ccRes ) | |
1019 { | |
1020 SHORT cId = satShrdPrm.SIMCCParm.cId; /* holds setup call id */ | |
1021 T_ccr_allw * ccr; /* points to CC result */ | |
1022 BOOL ownNotSAT; /* flags that the owner is not SAT */ | |
1023 | |
1024 TRACE_FUNCTION("cmhSAT_ResSSCntrlBySIM()"); | |
1025 | |
1026 ccr = (T_ccr_allw*)ccRes; | |
1027 | |
1028 /* check if queued event download */ | |
1029 if (satShrdPrm.event.c_queued) | |
1030 { | |
1031 cmhSAT_EventDwn( (UBYTE)-1, -1, END_UNDEFINED); | |
1032 } | |
1033 | |
1034 satShrdPrm.SIMCCParm.busy = FALSE; | |
1035 | |
1036 ownNotSAT = satShrdPrm.SIMCCParm.owner NEQ OWN_SRC_SAT; | |
1037 | |
1038 #ifdef TI_PS_FF_AT_P_CMD_CUST | |
1039 /* | |
1040 ** If this is a Cust1 MMI and The originator was a STK Cmd | |
1041 */ | |
1042 if ((simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1) AND | |
1043 (ownNotSAT == FALSE)) | |
1044 { | |
1045 /* | |
1046 ** Customised behaviour for the Cust1 MMI | |
1047 */ | |
1048 if (*resId EQ CCR_NOT_ALLW) | |
1049 { | |
1050 send_error_to_user( ownNotSAT, | |
1051 AT_CMD_D, | |
1052 RSLT_CC_SIM_PRM, | |
1053 ADD_CC_NOT_ALLWD, | |
1054 NULL, FALSE); | |
1055 } | |
1056 else | |
1057 { | |
1058 /* | |
1059 ** This was a SAT initiated Request. For the Cust1 the ACI does not yet have any | |
1060 ** actions to perform, other than the CC By SIM which has been done. So : | |
1061 ** Send the Original STK Cmd to the MMI in a %SATI for the MMI to process. | |
1062 ** | |
1063 ** The second action will cause the MMI to request the approriate Call Setup, SS | |
1064 ** or USSD Request and the required Call Table entry will then be re-created. | |
1065 */ | |
1066 cmhSAT_Cust1StkCmdInd(); | |
1067 } | |
1068 | |
1069 /* Free the Call Table Entry | |
1070 ** The SATI indication (if sent) will cause the MMI to request the approriate Call Setup, SS | |
1071 ** or USSD Request and the required Call Table entry will then be re-created. | |
1072 */ | |
1073 if (psaCC_ctbIsValid (cId)) | |
1074 { | |
1075 psaCC_retMOCTi(psaCC_ctb(cId)->ti); | |
1076 psaCC_chngCalTypCnt(cId, -1); | |
1077 psaCC_FreeCtbNtry (cId); | |
1078 } | |
1079 return( FALSE ); /* primitive not needed anymore */ | |
1080 } | |
1081 #endif /* TI_PS_FF_AT_P_CMD_CUST */ | |
1082 | |
1083 /* determine result id */ | |
1084 switch( *resId ) | |
1085 { | |
1086 case( CCR_NOT_ALLW ): /* SS not allowed */ | |
1087 { | |
1088 send_error_to_user( ownNotSAT, AT_CMD_D, RSLT_CC_SIM_PRM, ADD_CC_NOT_ALLWD, NULL, FALSE); | |
1089 if (ownNotSAT EQ FALSE) | |
1090 { | |
1091 /* clear call ID */ | |
1092 if (psaCC_ctbIsValid (cId)) | |
1093 { | |
1094 psaCC_retMOCTi(psaCC_ctb(cId)->ti); | |
1095 psaCC_chngCalTypCnt(cId, -1); | |
1096 psaCC_FreeCtbNtry (cId); | |
1097 } | |
1098 } | |
1099 return( FALSE ); /* primitive not needed anymore */ | |
1100 } | |
1101 case( CCR_ALLW_WITH_MDFY ): /* SS allowed with modification */ | |
1102 { | |
1103 if( ccr->v_addr ) | |
1104 { | |
1105 /* if SS control string was converted into a call setup */ | |
1106 return(sim_control_setup_call( ccr, ownNotSAT )); | |
1107 } | |
1108 else if( ccr->v_ss_string ) | |
1109 { | |
1110 /* if SS control string was changed by sim control */ | |
1111 | |
1112 /* adjust SS control string */ | |
1113 cmhCC_init_cldPty( &satPndSetup.clpty ); /* erase previous ss string */ | |
1114 | |
1115 utl_BCD2DialStr( ccr->ss_string.ss_ctrl_string, | |
1116 satPndSetup.clpty.num, | |
1117 (UBYTE)MINIMUM(ccr->ss_string.c_ss_ctrl_string, | |
1118 MAX_DIAL_LEN-1)); | |
1119 satPndSetup.clpty.ton = ccr->ss_string.noa; | |
1120 satPndSetup.clpty.npi = ccr->ss_string.npi; | |
1121 | |
1122 sim_control_send_ss( &satPndSetup.clpty, AT_CMD_D, ownNotSAT, NULL ); | |
1123 return(FALSE); | |
1124 } | |
1125 else /* if no optionnal field, then assume no modification see 11.14 ?9.1.6 */ | |
1126 sim_control_send_ss( &satPndSetup.clpty, AT_CMD_D, ownNotSAT, NULL ); | |
1127 return(FALSE); | |
1128 } | |
1129 /* SS allowed no modification */ | |
1130 default: | |
1131 TRACE_ERROR ("Unknown resID in cmhSAT_ResSSCntrlBySIM!"); | |
1132 /*lint -fallthrough*/ | |
1133 case( CCR_ALLW_NO_MDFY ): | |
1134 sim_control_send_ss( &satPndSetup.clpty, AT_CMD_D, ownNotSAT, NULL ); | |
1135 return( FALSE ); /* primitive not needed anymore */ | |
1136 } | |
1137 } | |
1138 | |
1139 /* | |
1140 +-------------------------------------------------------------------+ | |
1141 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
1142 | ROUTINE : cmhSAT_ResUSSDCntrlBySIM | | |
1143 +-------------------------------------------------------------------+ | |
1144 | |
1145 PURPOSE : Handle SIM USSD control result. Return TRUE if primitive | |
1146 is needed for building a terminal response. | |
1147 | |
1148 */ | |
1149 | |
1150 GLOBAL BOOL cmhSAT_ResUSSDCntrlBySIM( UBYTE* resId, void *ccRes ) | |
1151 { | |
1152 T_ACI_RETURN retVal; /* holds return value */ | |
1153 T_ccr_allw * ccr; /* points to CC result */ | |
1154 BOOL ownNotSAT; /* flags that the owner is not SAT */ | |
1155 SHORT sId; | |
1156 T_ACI_SAT_TERM_RESP resp_data; | |
1157 #ifdef FF_SAT_E | |
1158 T_ACI_SATA_ADD addPrm; | |
1159 #endif | |
1160 UBYTE *ussdString; | |
1161 UBYTE ussdLen; | |
1162 UBYTE src_len; | |
1163 | |
1164 | |
1165 | |
1166 TRACE_FUNCTION ("cmhSAT_ResUSSDCntrlBySIM()"); | |
1167 | |
1168 psaSAT_InitTrmResp( &resp_data ); | |
1169 | |
1170 ccr = (T_ccr_allw*)ccRes; | |
1171 | |
1172 /* check if queued event download */ | |
1173 if (satShrdPrm.event.c_queued) | |
1174 { | |
1175 cmhSAT_EventDwn((UBYTE)-1, -1, END_UNDEFINED); | |
1176 } | |
1177 | |
1178 satShrdPrm.SIMCCParm.busy = FALSE; | |
1179 | |
1180 ownNotSAT = satShrdPrm.SIMCCParm.owner NEQ OWN_SRC_SAT; | |
1181 | |
1182 #ifdef TI_PS_FF_AT_P_CMD_CUST | |
1183 /* | |
1184 ** If this is a Cust1 MMI and The originator was a STK Cmd | |
1185 */ | |
1186 if ((simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1) AND | |
1187 (ownNotSAT EQ FALSE)) | |
1188 { | |
1189 /* | |
1190 ** Customised behaviour for the Cust1 MMI | |
1191 */ | |
1192 if (*resId EQ CCR_NOT_ALLW) | |
1193 { | |
1194 /* send SAT response */ | |
1195 resp_data.add_content = ADD_CC_NOT_ALLWD; | |
1196 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data ); | |
1197 } | |
1198 else | |
1199 { | |
1200 /* | |
1201 ** This was a SAT initiated Request. For the Cust1 the ACI does not yet have any | |
1202 ** actions to perform, other than the CC By SIM which has been done. So : | |
1203 ** Send the Original STK Cmd to the MMI in a %SATI for the MMI to process. | |
1204 */ | |
1205 cmhSAT_Cust1StkCmdInd(); | |
1206 } | |
1207 | |
1208 return( FALSE ); /* primitive not needed anymore */ | |
1209 } | |
1210 #endif /* TI_PS_FF_AT_P_CMD_CUST */ | |
1211 /* | |
1212 *---------------------------------------------------------------- | |
1213 * determine result id | |
1214 *---------------------------------------------------------------- | |
1215 */ | |
1216 switch( *resId ) | |
1217 { | |
1218 /* | |
1219 *------------------------------------------------------------ | |
1220 * SS not allowed | |
1221 *------------------------------------------------------------ | |
1222 */ | |
1223 case( CCR_NOT_ALLW ): | |
1224 | |
1225 /* Fill resp_data content in case it is needed for psaSAT_SendTrmResp | |
1226 in cmhSAT_ResCntrlBySIM */ | |
1227 resp_data.add_content = ADD_CC_NOT_ALLWD; | |
1228 | |
1229 /* Implements Measure # 57, 77 */ | |
1230 cmhSAT_ResCntrlBySIM (AT_CMD_D, RSLT_CC_SIM_PRM, &resp_data); | |
1231 return( FALSE ); /* primitive not needed anymore */ | |
1232 | |
1233 /* | |
1234 *------------------------------------------------------------ | |
1235 * USSD allowed with modification | |
1236 *------------------------------------------------------------ | |
1237 */ | |
1238 case( CCR_ALLW_WITH_MDFY ): | |
1239 | |
1240 /* if USSD control string was converted into a call setup */ | |
1241 if( ccr->v_addr ) | |
1242 { | |
1243 SHORT cId = psaCC_ctbNewEntry(); | |
1244 | |
1245 if( cId EQ NO_ENTRY ) | |
1246 { | |
1247 /* | |
1248 * We got no free slot in the call table | |
1249 */ | |
1250 /* Implements Measure # 77 */ | |
1251 /* Fill resp_data content in case it is needed for psaSAT_SendTrmResp | |
1252 in cmhSAT_ResCntrlBySIM */ | |
1253 resp_data.add_content = ADD_NO_CAUSE; | |
1254 cmhSAT_ResCntrlBySIM (AT_CMD_D, RSLT_ME_UNAB_PROC, &resp_data); | |
1255 return( FALSE ); /* primitive not needed anymore */ | |
1256 } | |
1257 | |
1258 /* | |
1259 * We have successfully allocated a slot in the call table | |
1260 */ | |
1261 | |
1262 /* fill in setup parameter for called address */ | |
1263 cmhSAT_fillSetupPrm ( cId, | |
1264 ((ccr->v_addr)?&ccr->addr:NULL), | |
1265 ((ccr->v_subaddr)?&ccr->subaddr:NULL)); | |
1266 /* new call table entry set default bearer capabilities */ | |
1267 cmhSAT_fillSetupBC ( cId, MNCC_BEARER_SERV_SPEECH, MNCC_BEARER_SERV_NOT_PRES ); | |
1268 | |
1269 /* check aoc condition */ | |
1270 if ((psaCC_ctb(cId)->prio EQ MNCC_PRIO_NORM_CALL) AND | |
1271 (aoc_check_moc() EQ FALSE)) | |
1272 /* | |
1273 * check ACM exceeds ACMmax | |
1274 * for non-emergency calls | |
1275 */ | |
1276 { | |
1277 /* Implements Measure # 77 */ | |
1278 /* Fill resp_data content in case it is needed for psaSAT_SendTrmResp | |
1279 in cmhSAT_ResCntrlBySIM */ | |
1280 resp_data.add_content = ADD_NO_CAUSE; | |
1281 cmhSAT_ResCntrlBySIM (AT_CMD_D, RSLT_ME_UNAB_PROC, &resp_data); | |
1282 psaCC_FreeCtbNtry (cId); | |
1283 return( FALSE ); | |
1284 } | |
1285 | |
1286 if( ccr->v_cap_cnf_parms ) | |
1287 { | |
1288 /* check bearer caps, ctb not allocated */ | |
1289 } | |
1290 | |
1291 | |
1292 /* declare call table entry as used and the owner and status | |
1293 of the call */ | |
1294 psaCC_ctb(cId)->calOwn = (T_OWN)satShrdPrm.SIMCCParm.owner; | |
1295 psaCC_ctb(cId)->calStat = CS_SAT_REQ; | |
1296 psaCC_ctb(cId)->curCmd = AT_CMD_D; | |
1297 psaCC_ctb(cId)->curSrc = satShrdPrm.SIMCCParm.owner; | |
1298 | |
1299 if( !ownNotSAT ) | |
1300 psaCC_ctb(cId)->SATinv = TRUE; | |
1301 | |
1302 /* Implements Measure # 174 */ | |
1303 cmhSAT_SIMCntrlAlertUser (ownNotSAT, cId | |
1304 #ifdef FF_SAT_E | |
1305 , &addPrm | |
1306 #endif | |
1307 ); | |
1308 | |
1309 return( !ownNotSAT ); | |
1310 } | |
1311 | |
1312 /* --- no break, continue with next case --- */ | |
1313 /*lint -fallthrough*/ | |
1314 | |
1315 /* | |
1316 *------------------------------------------------------------ | |
1317 * USSD allowed no modification | |
1318 *------------------------------------------------------------ | |
1319 */ | |
1320 default: | |
1321 TRACE_ERROR ("unknown resID in cmhSAT_ResUSSDCntrlBySIM"); | |
1322 /*lint -fallthrough*/ | |
1323 case( CCR_ALLW_NO_MDFY ): | |
1324 | |
1325 /* check for busy SS condition */ | |
1326 if( psaSS_stbFindActSrv( NO_ENTRY ) NEQ NO_ENTRY ) | |
1327 { | |
1328 /* respond with "error, ME currently unable to process command" */ | |
1329 resp_data.add_content = ADD_ME_USSD_BUSY; | |
1330 psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); | |
1331 return( FALSE ); | |
1332 } | |
1333 | |
1334 /* adjust SS control string */ | |
1335 if( ccr->v_ussd_string ) | |
1336 { | |
1337 memcpy( &(satPndSetup.ussd_str), | |
1338 &ccr->ussd_string, | |
1339 sizeof(T_ussd_string)); | |
1340 } | |
1341 | |
1342 /********************************************************************************/ | |
1343 /* | |
1344 *------------------------------------------------------------------- | |
1345 * check if there is a USSD request pending | |
1346 *------------------------------------------------------------------- | |
1347 */ | |
1348 sId = psaSS_stbFindUssdReq(); | |
1349 | |
1350 if( sId EQ NO_ENTRY ) | |
1351 { | |
1352 /* check if there is another service in progress */ | |
1353 if( psaSS_stbFindActSrv( sId ) NEQ NO_ENTRY ) | |
1354 { | |
1355 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_ParallelUSSD ); | |
1356 return(FALSE); | |
1357 } | |
1358 | |
1359 /* get new service table entry */ | |
1360 sId = psaSS_stbNewEntry(); | |
1361 if( sId EQ NO_ENTRY ) | |
1362 { | |
1363 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_SrvTabFull ); | |
1364 return(FALSE); | |
1365 } | |
1366 | |
1367 CCD_START; | |
1368 | |
1369 MALLOC(ussdString, MAX_USSD_STRING); | |
1370 | |
1371 /* set data coding scheme */ | |
1372 /* patch !!!!! CLB 11/12/01 */ | |
1373 if( (UBYTE)satPndSetup.ussd_str.dcs EQ 0x40 ) | |
1374 { | |
1375 /* 0x40 means basically default alphabet... | |
1376 yet some asian networks dont seem to accept it (although using it | |
1377 in their own STK !!!) */ | |
1378 satPndSetup.ussd_str.dcs = 0x0F; | |
1379 } | |
1380 /*********************************/ | |
1381 /* Implements Measure 25 */ | |
1382 /* This function is more correct than utl_getAlphabetCb as it takes care | |
1383 of reserved codings */ | |
1384 if( cmh_getAlphabetCb( (UBYTE)satPndSetup.ussd_str.dcs ) EQ 0 ) /* 7bit alphabet */ | |
1385 { | |
1386 src_len = (UBYTE)MINIMUM( MAX_USSD_STRING, satPndSetup.ussd_str.c_ussd_str); | |
1387 ussdLen = utl_cvt8To7( satPndSetup.ussd_str.ussd_str, | |
1388 src_len, | |
1389 ussdString, 0 ); | |
1390 /* According to spec 23.038 section 6.1.2.3 for USSD packing, for bytes end with | |
1391 * (8*n)-1 i.e where n is 1,2,3....i.e byte 7, 15, 23 ... to be padded | |
1392 * with carriage return <CR>(0xD) | |
1393 */ | |
1394 if ((src_len+1)%8 EQ 0) | |
1395 { | |
1396 ussdString[ussdLen-1] |= (0xD << 1); | |
1397 } | |
1398 } | |
1399 else | |
1400 { | |
1401 ussdLen = satPndSetup.ussd_str.c_ussd_str; | |
1402 memcpy(ussdString, satPndSetup.ussd_str.ussd_str, MAX_USSD_STRING); | |
1403 } | |
1404 psaSS_asmProcUSSDReq( (UBYTE)satPndSetup.ussd_str.dcs /*dcs*/, | |
1405 ussdString, | |
1406 ussdLen); | |
1407 //TISH, patch for OMAPS00122397 | |
1408 //patch for get network reject information: "A406020100810101" | |
1409 //start | |
1410 ssShrdPrm.ussdLen= ussdLen; | |
1411 TRACE_EVENT_P1("ssShrdPrm.ussdLen = %d", ssShrdPrm.ussdLen); | |
1412 memcpy(ssShrdPrm.ussdBuf,ussdString,ussdLen); | |
1413 ssShrdPrm.ussdDcs=0x0f; | |
1414 satShrdPrm.SentUSSDid=sId; | |
1415 //end | |
1416 | |
1417 | |
1418 MFREE(ussdString); | |
1419 | |
1420 /* start new transaction */ | |
1421 ssShrdPrm.stb[sId].ntryUsdFlg = TRUE; | |
1422 | |
1423 if (ownNotSAT) | |
1424 { | |
1425 ssShrdPrm.stb[sId].curCmd = AT_CMD_CUSD; | |
1426 ssShrdPrm.stb[sId].srvOwn = (T_OWN)satShrdPrm.SIMCCParm.owner; | |
1427 } | |
1428 else | |
1429 { | |
1430 ssShrdPrm.stb[sId].curCmd = AT_CMD_NONE; | |
1431 ssShrdPrm.stb[sId].srvOwn = OWN_SRC_SAT; | |
1432 satShrdPrm.SentUSSDid = sId; | |
1433 } | |
1434 psaSS_NewTrns(sId); | |
1435 | |
1436 if (ownNotSAT) | |
1437 { | |
1438 R_AT( RAT_OK, (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner ) | |
1439 ( AT_CMD_CUSD); | |
1440 | |
1441 cmh_logRslt ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, | |
1442 RAT_OK, AT_CMD_CUSD, -1, BS_SPEED_NotPresent, CME_ERR_NotPresent); | |
1443 } | |
1444 | |
1445 CCD_END; | |
1446 | |
1447 retVal = AT_EXCT; | |
1448 } | |
1449 else | |
1450 { | |
1451 CCD_START; | |
1452 | |
1453 psaSS_asmCnfUSSDReq( (UBYTE)satPndSetup.ussd_str.dcs, | |
1454 satPndSetup.ussd_str.ussd_str, | |
1455 satPndSetup.ussd_str.c_ussd_str ); | |
1456 | |
1457 ssShrdPrm.stb[sId].ussdReqFlg = FALSE; | |
1458 | |
1459 /* continue existing transaction */ | |
1460 psaSS_CntTrns(sId); | |
1461 | |
1462 CCD_END; | |
1463 | |
1464 retVal = AT_CMPL; | |
1465 } | |
1466 /**********************************************************************************/ | |
1467 | |
1468 if( retVal EQ AT_EXCT ) | |
1469 return( FALSE ); /* primitive not needed anymore */ | |
1470 /* Implements Measure # 57 */ | |
1471 /* Fill resp_data content in case it is needed for psaSAT_SendTrmResp | |
1472 in cmhSAT_ResCntrlBySIM */ | |
1473 resp_data.resCC = resId; | |
1474 cmhSAT_ResCntrlBySIM (AT_CMD_D, RSLT_ME_CAP, &resp_data); | |
1475 | |
1476 return( FALSE ); /* primitive not needed anymore */ | |
1477 } | |
1478 } | |
1479 | |
1480 /* | |
1481 +-------------------------------------------------------------------+ | |
1482 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
1483 | ROUTINE : cmhSAT_ResSMCntrlBySIM | | |
1484 +-------------------------------------------------------------------+ | |
1485 | |
1486 PURPOSE : Handle SIM SM control result. Return TRUE if primitive | |
1487 is needed for building a terminal response. | |
1488 | |
1489 */ | |
1490 | |
1491 GLOBAL BOOL cmhSAT_ResSMCntrlBySIM( UBYTE* resId, void *smcRes ) | |
1492 { | |
1493 BOOL ownNotSAT; /* flags that the owner is not SAT */ | |
1494 T_smcr_allw *smcr; /* points to SM result */ | |
1495 T_ACI_CMGF_MOD mode; | |
1496 UBYTE sca_buf[MAX_SMS_ADDR_DIG/2 + 2]; | |
1497 UBYTE da_buf[MAX_SMS_ADDR_DIG/2 + 2]; | |
1498 UBYTE sca_len = 0; | |
1499 UBYTE da_len = 0; | |
1500 T_ACI_SAT_TERM_RESP resp_data; | |
1501 UBYTE srcId = smsShrdPrm.smsEntStat.entOwn; | |
1502 | |
1503 TRACE_FUNCTION ("cmhSAT_ResSMCntrlBySIM()"); | |
1504 | |
1505 | |
1506 psaSAT_InitTrmResp( &resp_data ); | |
1507 | |
1508 smcr = (T_smcr_allw*)smcRes; | |
1509 | |
1510 /* check if queued event download */ | |
1511 if (satShrdPrm.event.c_queued) | |
1512 { | |
1513 cmhSAT_EventDwn((UBYTE)-1, -1, END_UNDEFINED); | |
1514 } | |
1515 | |
1516 satShrdPrm.SIMCCParm.busy = FALSE; | |
1517 | |
1518 ownNotSAT = satShrdPrm.SIMCCParm.owner NEQ OWN_SRC_SAT; | |
1519 | |
1520 #ifdef TI_PS_FF_AT_P_CMD_CUST | |
1521 /* | |
1522 ** If this is a Cust1 MMI and The originator was a STK Cmd | |
1523 */ | |
1524 if ((simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1) AND | |
1525 (ownNotSAT EQ FALSE)) | |
1526 { | |
1527 /* | |
1528 ** Customised behaviour for the Cust1 MMI | |
1529 */ | |
1530 if (*resId EQ CCR_NOT_ALLW) | |
1531 { | |
1532 /* send SAT response */ | |
1533 resp_data.add_content = ADD_CC_NOT_ALLWD; | |
1534 psaSAT_SendTrmResp( RSLT_CC_SIM_PRM, &resp_data ); | |
1535 } | |
1536 else | |
1537 { | |
1538 /* | |
1539 ** This was a SAT initiated Request. For the Cust1 the ACI does not yet have any | |
1540 ** actions to perform, other than the CC By SIM which has been done. So : | |
1541 ** Send the Original STK Cmd to the MMI in a %SATI for the MMI to process. | |
1542 ** | |
1543 ** The second action will cause the MMI to request the approriate Call Setup, SS | |
1544 ** or USSD Request and the required Call Table entry will then be re-created. | |
1545 */ | |
1546 cmhSAT_Cust1StkCmdInd(); | |
1547 } | |
1548 | |
1549 if ( (sat_mnsms_submit_req->rec_num EQ SMS_RECORD_NOT_EXIST) OR | |
1550 (sat_mnsms_submit_req->modify NEQ SMS_MODIFY_NON) ) | |
1551 { | |
1552 if (smsShrdPrm.tpdu.tp_submit NEQ NULL) | |
1553 { | |
1554 ACI_MFREE(smsShrdPrm.tpdu.tp_submit); | |
1555 smsShrdPrm.tpdu.tp_submit = NULL; | |
1556 } | |
1557 } | |
1558 PFREE( sat_mnsms_submit_req ); | |
1559 | |
1560 /* | |
1561 ** Ensure that the SMS parameters are reset, so that the SMS Entity is freed to | |
1562 ** process the command later. | |
1563 */ | |
1564 smsShrdPrm.smsEntStat.curCmd = AT_CMD_NONE; | |
1565 smsShrdPrm.owner = (T_OWN)CMD_SRC_NONE; | |
1566 smsShrdPrm.smsEntStat.entOwn = CMD_SRC_NONE; | |
1567 | |
1568 return( FALSE ); /* primitive not needed anymore */ | |
1569 } | |
1570 #endif /* TI_PS_FF_AT_P_CMD_CUST */ | |
1571 | |
1572 if (smsShrdPrm.smsEntStat.curCmd EQ AT_CMD_CMSS) | |
1573 { | |
1574 mode = CMGF_MOD_Txt; | |
1575 } | |
1576 #if defined MFW OR defined FF_MMI_RIV OR defined _CONC_TESTING_ | |
1577 else if (smsShrdPrm.smsEntStat.entOwn EQ CMD_SRC_LCL) | |
1578 { | |
1579 mode = CMGF_MOD_Txt; /* since text mode (AT+CMGF=1) is never set in MMI */ | |
1580 } | |
1581 #endif | |
1582 else if (ownNotSAT EQ FALSE) | |
1583 { | |
1584 mode = CMGF_MOD_Pdu; | |
1585 } | |
1586 else | |
1587 { | |
1588 /* | |
1589 * request current mode | |
1590 */ | |
1591 qAT_PlusCMGF((T_ACI_CMD_SRC)srcId, &mode); | |
1592 } | |
1593 | |
1594 /* | |
1595 *---------------------------------------------------------------- | |
1596 * determine result id | |
1597 *---------------------------------------------------------------- | |
1598 */ | |
1599 switch( *resId ) | |
1600 { | |
1601 /* | |
1602 *------------------------------------------------------------ | |
1603 * send message not allowed | |
1604 *------------------------------------------------------------ | |
1605 */ | |
1606 case( CCR_NOT_ALLW ): | |
1607 /* setup initiated by user */ | |
1608 /* Implements Measure # 57 */ | |
1609 /* Fill resp_data content in case it is needed for psaSAT_SendTrmResp | |
1610 in cmhSAT_ResCntrlBySIM */ | |
1611 resp_data.add_content = ADD_CC_NOT_ALLWD; | |
1612 cmhSAT_ResCntrlBySIM (smsShrdPrm.smsEntStat.curCmd, RSLT_CC_SIM_PRM, &resp_data); | |
1613 /* The following has not been taken into as a parameter will have to be | |
1614 * added in all places where it is called for this setting alone */ | |
1615 if( ownNotSAT ) | |
1616 { | |
1617 smsShrdPrm.smsEntStat.curCmd = AT_CMD_NONE; | |
1618 smsShrdPrm.smsEntStat.entOwn = CMD_SRC_NONE; | |
1619 } | |
1620 if ( (sat_mnsms_submit_req->rec_num EQ SMS_RECORD_NOT_EXIST) OR | |
1621 (sat_mnsms_submit_req->modify NEQ SMS_MODIFY_NON) ) | |
1622 { | |
1623 if (smsShrdPrm.tpdu.tp_submit NEQ NULL) | |
1624 { | |
1625 ACI_MFREE(smsShrdPrm.tpdu.tp_submit); | |
1626 smsShrdPrm.tpdu.tp_submit = NULL; | |
1627 } | |
1628 } | |
1629 PFREE( sat_mnsms_submit_req ); | |
1630 return( FALSE ); /* primitive not needed anymore */ | |
1631 | |
1632 | |
1633 case( CCR_ALLW_WITH_MDFY ): | |
1634 if ( smcr->v_sm_addr ) | |
1635 { | |
1636 /* | |
1637 * RP Service Center Address | |
1638 */ | |
1639 | |
1640 sat_mnsms_submit_req->modify |= SMS_MODIFY_SCA; | |
1641 | |
1642 if (mode EQ CMGF_MOD_Pdu) | |
1643 { | |
1644 /* PDU mode */ | |
1645 sca_len = CodeRPAddress( sca_buf, | |
1646 smcr->sm_addr.c_bcdDigit, | |
1647 smcr->sm_addr.noa, | |
1648 smcr->sm_addr.npi, | |
1649 smcr->sm_addr.bcdDigit ); | |
1650 | |
1651 cmhSAT_ModifyScaPdu( &sat_mnsms_submit_req->sms_sdu, | |
1652 sca_buf, | |
1653 sca_len ); | |
1654 } | |
1655 else | |
1656 { | |
1657 /* Text mode */ | |
1658 smsShrdPrm.tpdu.sc_addr.v_ton = 1; | |
1659 smsShrdPrm.tpdu.sc_addr.ton = smcr->sm_addr.noa; | |
1660 smsShrdPrm.tpdu.sc_addr.v_npi = 1; | |
1661 smsShrdPrm.tpdu.sc_addr.npi = smcr->sm_addr.npi; | |
1662 smsShrdPrm.tpdu.sc_addr.c_num = smcr->sm_addr.c_bcdDigit; | |
1663 memcpy(smsShrdPrm.tpdu.sc_addr.num, smcr->sm_addr.bcdDigit, | |
1664 smcr->sm_addr.c_bcdDigit); | |
1665 } | |
1666 } | |
1667 | |
1668 if ( smcr->v_sm_addr_2) | |
1669 { | |
1670 /* | |
1671 * TP Destination Address | |
1672 */ | |
1673 | |
1674 sat_mnsms_submit_req->modify |= SMS_MODIFY_TPOA; | |
1675 | |
1676 if (mode EQ CMGF_MOD_Pdu) | |
1677 { | |
1678 /* PDU mode */ | |
1679 da_len = CodeTPAddress( da_buf, | |
1680 smcr->sm_addr_2.c_bcdDigit, | |
1681 smcr->sm_addr_2.noa, | |
1682 smcr->sm_addr_2.npi, | |
1683 smcr->sm_addr_2.bcdDigit ); | |
1684 | |
1685 cmhSAT_ModifyDaPdu( &sat_mnsms_submit_req->sms_sdu, | |
1686 da_buf, | |
1687 da_len ); | |
1688 } | |
1689 else | |
1690 { | |
1691 /* Text mode */ | |
1692 smsShrdPrm.tpdu.tp_submit->tp_da.ton = smcr->sm_addr_2.noa; | |
1693 smsShrdPrm.tpdu.tp_submit->tp_da.npi = smcr->sm_addr_2.npi; | |
1694 smsShrdPrm.tpdu.tp_submit->tp_da.c_num = smcr->sm_addr_2.c_bcdDigit; | |
1695 smsShrdPrm.tpdu.tp_submit->tp_da.digits = smcr->sm_addr_2.c_bcdDigit; | |
1696 memcpy(smsShrdPrm.tpdu.tp_submit->tp_da.num, smcr->sm_addr_2.bcdDigit, | |
1697 smcr->sm_addr_2.c_bcdDigit); | |
1698 } | |
1699 } | |
1700 /* no break needed !!!! */ | |
1701 /*lint -fallthrough*/ | |
1702 case( CCR_ALLW_NO_MDFY ): | |
1703 if( sat_mnsms_submit_req ) | |
1704 { | |
1705 if (mode EQ CMGF_MOD_Txt) /* Text mode */ | |
1706 { | |
1707 /* code sm here */ | |
1708 cmhSMS_codeMsg (&sat_mnsms_submit_req->sms_sdu, | |
1709 SMS_VT_SUBMIT, | |
1710 &smsShrdPrm.tpdu.sc_addr, | |
1711 SMS_SUBMIT, | |
1712 (UBYTE*)smsShrdPrm.tpdu.tp_submit); | |
1713 | |
1714 if (smsShrdPrm.tpdu.tp_submit NEQ NULL) | |
1715 { | |
1716 ACI_MFREE(smsShrdPrm.tpdu.tp_submit); | |
1717 smsShrdPrm.tpdu.tp_submit = NULL; | |
1718 } | |
1719 } | |
1720 | |
1721 PSENDX (SMS, sat_mnsms_submit_req); | |
1722 } | |
1723 else | |
1724 TRACE_EVENT("error provoked by SAT"); | |
1725 break; | |
1726 | |
1727 default: | |
1728 if ( (sat_mnsms_submit_req->rec_num EQ SMS_RECORD_NOT_EXIST) OR | |
1729 (sat_mnsms_submit_req->modify NEQ SMS_MODIFY_NON) ) | |
1730 { | |
1731 if (smsShrdPrm.tpdu.tp_submit NEQ NULL) | |
1732 { | |
1733 ACI_MFREE(smsShrdPrm.tpdu.tp_submit); | |
1734 smsShrdPrm.tpdu.tp_submit = NULL; | |
1735 } | |
1736 } | |
1737 TRACE_EVENT("wrong type of result received from SIM"); | |
1738 PFREE( sat_mnsms_submit_req ); | |
1739 return( FALSE ); /* primitive not needed anymore */ | |
1740 } | |
1741 | |
1742 return FALSE; | |
1743 } | |
1744 | |
1745 /* | |
1746 +-------------------------------------------------------------------+ | |
1747 | PROJECT : GSM-PS (6147) MODULE : CMH | | |
1748 | ROUTINE : cmhCC_SatDTMFsent | | |
1749 +-------------------------------------------------------------------+ | |
1750 | |
1751 PURPOSE : confirmation for sent SAT DTMF | |
1752 */ | |
1753 GLOBAL void cmhCC_SatDTMFsent ( SHORT cId ) | |
1754 { | |
1755 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1756 T_ACI_SAT_TERM_RESP resp_data; | |
1757 static UBYTE dtmf_separator_count = 0; | |
1758 | |
1759 TRACE_FUNCTION ("cmhCC_SatDTMFsent()"); | |
1760 | |
1761 psaSAT_InitTrmResp( &resp_data ); | |
1762 | |
1763 /* | |
1764 * Use ctb here because TI compiler 1.22e may have a problem otherwise here. | |
1765 * See cmhCC_SndDiscRsn() for the details. | |
1766 */ | |
1767 if (GET_CAUSE_VALUE(ctb->nrmCs) NEQ NOT_PRESENT_8BIT AND | |
1768 ctb->nrmCs NEQ MNCC_CAUSE_DTMF_START_SUCCESS) | |
1769 { | |
1770 TRACE_EVENT_P1("network reported error when sending DTMF: %d", ctb->nrmCs); | |
1771 | |
1772 psaSAT_SendTrmResp( RSLT_NTW_UNAB_PROC, &resp_data ); | |
1773 dtmf_separator_count = 0; | |
1774 return; | |
1775 } | |
1776 | |
1777 if(is_digit_dtmf_separator(ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur])) | |
1778 { | |
1779 if (dtmf_separator_count EQ 0) | |
1780 { | |
1781 dtmf_separator_count = 1; | |
1782 if(ctb->dtmfCmd NEQ AT_CMD_VTS) /* this is only valid within a number to dial */ | |
1783 { | |
1784 /* p within a number string: this is a 3 seconds pause */ | |
1785 TRACE_EVENT("DTMF pause requested: 3 seconds"); | |
1786 #if defined (NEW_FRAME) | |
1787 TIMERSTART( TDTMF_VALUE, ACI_TDTMF ); | |
1788 #else | |
1789 TIMERSTART( TDTMF_VALUE, t_dtmf_handle ); | |
1790 #endif | |
1791 ccShrdPrm.dtmf.cur++; /* skip the DTMF seperator */ | |
1792 | |
1793 return; | |
1794 } | |
1795 ccShrdPrm.dtmf.cur++; /* skip the DTMF seperator */ | |
1796 } | |
1797 } | |
1798 else | |
1799 { | |
1800 dtmf_separator_count = 0; | |
1801 } | |
1802 | |
1803 if (ccShrdPrm.dtmf.cur < ccShrdPrm.dtmf.cnt) | |
1804 { | |
1805 cmhSAT_sendDTMF ( NULL ); | |
1806 } | |
1807 else /* whole DTMF string has been sent */ | |
1808 { | |
1809 ccShrdPrm.dtmf.cId = NO_ENTRY; /* Reset cId after sending the whole DTMF string */ | |
1810 ctb->dtmfCmd = AT_CMD_NONE; | |
1811 ctb->dtmfSrc = (T_OWN)CMD_SRC_NONE; | |
1812 psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data ); | |
1813 dtmf_separator_count = 0; | |
1814 } | |
1815 } | |
1816 | |
1817 /* Implements Measure # 57,77 */ | |
1818 | |
1819 /* | |
1820 +-------------------------------------------------------------------+ | |
1821 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
1822 | ROUTINE : cmhSAT_ResCntrlBySIM | | |
1823 +-------------------------------------------------------------------+ | |
1824 PARAMETERS : cmdBuf - AT Command identifier | |
1825 simRslt - Result of SIM operation | |
1826 resp_data - Data for terminal response | |
1827 RETURN : None | |
1828 | |
1829 | |
1830 PURPOSE : Handle common portion of sending reponse to SIM call or | |
1831 USSD control result depending on the owner of call setup. | |
1832 | |
1833 */ | |
1834 LOCAL void cmhSAT_ResCntrlBySIM (T_ACI_AT_CMD cmdBuf, | |
1835 UBYTE simRslt, | |
1836 T_ACI_SAT_TERM_RESP *resp_data) | |
1837 { | |
1838 BOOL ownNotSAT = (satShrdPrm.SIMCCParm.owner NEQ OWN_SRC_SAT); | |
1839 | |
1840 TRACE_FUNCTION ("cmhSAT_ResCntrlBySIM ()"); | |
1841 if( ownNotSAT ) | |
1842 { | |
1843 R_AT( RAT_CME, (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner ) | |
1844 ( cmdBuf, CME_ERR_NotPresent ); | |
1845 /* log result */ | |
1846 cmh_logRslt ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, RAT_CME, | |
1847 (T_ACI_AT_CMD)cmdBuf,-1, BS_SPEED_NotPresent, CME_ERR_NotPresent ); | |
1848 } | |
1849 /* setup initiated by SAT */ | |
1850 else | |
1851 { | |
1852 /* resp_data will be filled in caller */ | |
1853 psaSAT_SendTrmResp( simRslt, resp_data ); | |
1854 } | |
1855 } | |
1856 | |
1857 /* Implements Measure # 174 */ | |
1858 | |
1859 /* | |
1860 +-------------------------------------------------------------------+ | |
1861 | PROJECT : GSM-PS (6147) MODULE : CMH_SATR | | |
1862 | ROUTINE : cmhSAT_SIMCntrlAlertUser | | |
1863 +-------------------------------------------------------------------+ | |
1864 PARAMETERS : ownNotSAT - Boolean flag indicating that the owner is not SAT | |
1865 cId - Holds setup call id | |
1866 addPrm - additional information for SAT E | |
1867 RETURN : None | |
1868 | |
1869 PURPOSE : Handle common portion of Alerting User. | |
1870 | |
1871 */ | |
1872 LOCAL void cmhSAT_SIMCntrlAlertUser (BOOL ownNotSAT, | |
1873 SHORT cId | |
1874 #ifdef FF_SAT_E | |
1875 ,T_ACI_SATA_ADD *addPrm | |
1876 #endif | |
1877 ) | |
1878 { | |
1879 UBYTE idx; | |
1880 | |
1881 TRACE_FUNCTION ("cmhSAT_SIMCntrlAlertUser ()"); | |
1882 | |
1883 if( ownNotSAT ) | |
1884 { | |
1885 #ifdef FF_SAT_E | |
1886 addPrm->chnType = SATA_CT_VOICE; | |
1887 addPrm->chnEst = SATA_EST_IM; | |
1888 | |
1889 R_AT( RAT_SATA,(T_ACI_CMD_SRC) satShrdPrm.SIMCCParm.owner ) | |
1890 ( cId+1, satShrdPrm.dur, &addPrm ); | |
1891 #else | |
1892 R_AT( RAT_SATA, (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner ) | |
1893 ( cId+1, satShrdPrm.dur); | |
1894 #endif /* FF_SAT_E */ | |
1895 | |
1896 R_AT( RAT_OK, (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner ) | |
1897 ( AT_CMD_D ); | |
1898 /* log result */ | |
1899 cmh_logRslt ( (T_ACI_CMD_SRC)satShrdPrm.SIMCCParm.owner, | |
1900 RAT_OK, AT_CMD_D, -1, BS_SPEED_NotPresent, CME_ERR_NotPresent ); | |
1901 } | |
1902 /* setup initiated by SAT */ | |
1903 else | |
1904 { | |
1905 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1906 { | |
1907 #ifdef FF_SAT_E | |
1908 addPrm->chnType = SATA_CT_VOICE; | |
1909 addPrm->chnEst = SATA_EST_IM; | |
1910 R_AT( RAT_SATA, (T_ACI_CMD_SRC)idx ) | |
1911 ( cId+1, satShrdPrm.dur, &addPrm ); | |
1912 #else | |
1913 R_AT( RAT_SATA, (T_ACI_CMD_SRC)idx ) | |
1914 ( cId+1, satShrdPrm.dur); | |
1915 #endif /* FF_SAT_E */ | |
1916 } | |
1917 } | |
1918 } | |
1919 | |
1920 #endif /* #ifdef SIM_TOOLKIT */ | |
1921 /*==== EOF ========================================================*/ |