comparison src/ui/mfw/mfw_cm.c @ 3:67bfe9f274f6

src/ui: import of src/ui3 from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:33:10 +0000
parents
children 92abb46dc1ba
comparison
equal deleted inserted replaced
2:3a14ee9a9843 3:67bfe9f274f6
1 /*
2 +--------------------------------------------------------------------+
3 | PROJECT: MMI-Framework (8417) $Workfile:: mfw_cm.c $|
4 | $Author:: Ak $Revision:: 1 $|
5 | CREATED: 3.11.98 $Modtime:: 10.04.00 14:58 $|
6 | STATE : code |
7 +--------------------------------------------------------------------+
8
9 MODULE : MFW_CM
10
11 PURPOSE : This modul contains call management functions.
12
13 HISTORY:
14 Dec 20, 2006 DR:OMAPS00108192 a0393213(R.Prabakar)
15 Description : Continous DTMF tones for simultanous keypress
16 Solution : Bug was due to improper nesting of START-STOP sequence. Now they are avoided.
17
18 Dec 13, 2006 DR:OMAPS00107103 a0393213(R.Prabakar)
19 Description : No DTMF tones for simultanous keypress
20 Solution : Once there was some problem in sending DTMF tones, the problem persisted till the next reset.
21 This was because the queue was not getting flushed once the call was ended.
22 Now the queue is flushed once the call is ended.
23
24 Nov 30, 2006 DR:OMAPS00105758 a0393213(R.Prabakar)
25 Description :No DTMF tones after collision of DTMF tones
26
27 Nov 03, 2006 DR: OMAPS00101158 x0pleela
28 Description : Board crashes after sending atd command through HyperTerminal
29 Solution : Avoid peforming phonebook search operation if the source id is not LOCAL
30 - Defined new static variable uOthersrc to set the value to TRUE or FALSE
31 based on the source Id
32 - Defined two new function mfw_set_OtherSrc_Value() to set the value of
33 uOtherSrc to either TRUE or FALSE and mfw_get_OtherSrc_Value
34 to get the value of uOtherSrc
35
36 Oct 10, 2006 DR: OMAPS00093720 x0039928
37 Description : If dial a international number and fail, when auto redail enabled, it will delete '+'.
38 Solution : MFW_TON_INTERNATIONAL is set for out_call.ton if the dialling number contains '+'
39
40 Sep 01, 2006 REF:OMAPS00090555 x0039928
41 Description : When make a MO call,MFW can not get call number from ACI.
42 Solution : The called number is extracted from the parameter of callCmEvent()
43 for event E_CM_MO_RES and is displayed. Also stack memory optimization is done to
44 resolve MMI stack overflow problem.
45
46 June 15, 2006 OMAPS00079492 x0043642
47 Description : FT TMO (wk20/06) TC 9.1, 9.2 Multi Party, MS fails to return to idle mode
48 Solution : assign MFW_CM_DISCONNECT_ALL to variable cmd_hold, and call cm_signal()
49
50
51 May 30, 2006 DR: OMAPS00070657 x0pleela
52 Description: CPHS feature on Locosto-Lite
53 Solution: For ALS feature,
54 a) Added definition for new function "mfw_get_ALS_type"
55
56 Apr 25, 2006 OMAPS00075711 a0393213 (R.Prabakar)
57 Description : 'End Conference' option doesn't work
58 Solution : The ACI_CHLD_MOD is changed from CHLD_MOD_RelActSpec to CHLD_MOD_RelActAndAcpt while calling sAT_PlusCHLD()
59 in cm_disconnect(). This is done since CHLD_MOD_RelActSpec with callId 0 is equivalent to sending
60 AT+CHLD=10 which is invalid according to GSM specification
61
62 Apr 26, 2006 OMAPS00074886 a0393213 (Prabakar R)
63 Description : No option in MMI to release the held call.
64 Solution : No option was available. Added a menu option.
65
66 Mar 28, 2006 REF:DR OMAPS00072407 x0039928
67 Description: Phone hangs when tried to make an outgoing call
68 Solution: Reverting back the changes of issue OMAPS00048894 to stop from stack overflow.
69
70 Feb 27, 2006 REF:DR OMAPS00067884 x0039928
71 Description: Held call released at locosto phone does not release the call at other end
72 Solution: if the mode is greater than CHLD_MOD_RelDialCall then sAT_PercentCHLD() is called
73 instead of sAT_PlusCHLD()
74
75 Jan 27, 2006 REF:DR OMAPS00048894 x0039928
76 Description: Outgoing Call: The called number is not displayed while an outgoing call is made
77 Solution: The called number is extracted from the parameter of callCmEvent() for event E_CM_MO_RES and is displayed.
78
79 Apr 22, 2006 OMAPS00070762 a0393213 (Prabakar R)
80 Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=1 in ATI.
81 expected behaviour : active call should be released and the incoming call should be accepted
82 observed behaviour : happens as expected. but display shows incoming call screen only.
83 active screen is not shown eventhough the connection is established between MS1 and MS3
84 Fix : cmd.call_number was not set to 0, which is required in cm_result_cmd()
85 to call cm_ok_connect()which updates the display. It is set now.
86
87
88 Apr 21, 2006 OMAPS00070774 a0393213 (Prabakar R)
89 Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=2 in ATI.
90 expected behaviour : active call should be put to hold and the incoming call should be accepted
91 observed behaviour : happens as expected. but display shows incoming call screen only.
92 active screen is not shown eventhough the connection is established between MS1 and MS3
93 Fix : AT commands from CMD_SRC_ATI_3 was not processed. As a result, MFW was not informed of the acceptance of the call
94 through ATI. In precise cmd_hold variable was not set to MFW_CM_MT_ACCEPT, which is necessary for display update
95
96
97 Sep 12, 2005 REF: MMI-SMR-34085 x0021334
98 Description: RE: Add +CDIP command - MMI Additions
99 Solution: Dummy implementation of function "rAT_PlusCDIP()" is done to enable successful compilation.
100 Nov 02, 2005 DR OMAPS00052132 xdeepadh
101 Bug:Not able to access the SMS inbox and also not able to send SMS in Locosto Lite build
102 Fix: The ATI Enums usage has been put under the FF_ATI flag.
103
104 Aug 10, 2005 REF: MMI-SPR-30099 x0018858
105 Description: During a held communication, if the user presses 4 and send then there is no response from network.
106 Solution: Modified the return value and also added a case statement to handle the response received.
107
108 Apr 07 2005 REF: CRR 29989 xpradipg
109 Description: Optimisation 3: replace the static global data with dynamic
110 allocation / deallocation
111 Solution: The static global variables are dynamically allocated and
112 deallocated
113
114 Apr 03, 2005 REF: CRR 29988 - xpradipg
115 Description: Optimisation 2: Reduce the keyboard buffer and the dtmf buffer
116 size
117 Solution : The dtmf buffer is reduced to 20 from 50
118
119 Apr 14, 2005 REF: CRR 29991 xpradipg
120 Description: Optimisation 5: Remove the static allocation and use dynamic
121 allocation/ deallocation for pb_list and black_list
122 Solution: The static definition is removed and replaced with the dynamic
123 allocation
124
125 Feb 03, 200 REF: CRR 25960 x0012850
126 Description: Call Hold: While one call in Active and other in Held by swapping either of phone is not audible
127 Solution: swapping action results in one of the calls getting muted. We attach user connection again.
128
129 Aug 23, 2004 REF: CRR 22222 xkundadu
130 Bug: Runaway Call Waiting Tone.
131 Call Waiting tone doesnot stop after ansering waiting call.
132
133 Fix: Handle the AT-Command source id CMD_SRC_ATI_2 also for call control
134 callback functions.
135
136 Jun 05, 2004 REF: CRR 18262 NISHIKANT KULKARNI
137 Description: The sample sends a STOP DTMF message without release of the key by the user
138 Solution: Instead of sending DTMF commands in "VTS_MOD_Auto" mode, on key press DTMF tone is started
139 using VTS_MOD_ManStart and on key release DTMF tone is stopped using VTS_MOD_ManStop mode.
140
141 // Apr 26, 2004 REF: CRR 16545 Ajith K P and Side effect of CRR 16545.
142 // Issue description: When the user enters 11SEND and if the first call is
143 // HELD call,the held call disconnects. This should not happen.
144 // Problem was, though sAT_PlusCHLD(..) is expected to disconnect an ACTIVE
145 // call only, it was disconnecting HELD call rather than returning AT_FAIL.
146 // If sAT_PlusCHLD() Fails, Send the user entered string as USSD to network using sAT-Dn().
147 // So now if the user wants to release a HELD call, in cm_disconect() we are calling the
148 // sAT_PlusCHLD(..) function with C
149
150
151 Mar 28, 2006 REF:ER OMAPS00071798 x0043642
152 Added new options in BMI to accept the value for tty audio mode,
153 and the accepted value is passed as parameter in function call sAT_PercentCTTY
154
155 */
156
157 #define ENTITY_MFW
158
159 #include <string.h>
160 #include <stdio.h>
161 #include <stdlib.h>
162
163 #if defined (NEW_FRAME)
164
165 #include "typedefs.h"
166 #include "vsi.h"
167 #include "pei.h"
168 #include "custom.h"
169 #include "gsm.h"
170
171 #else
172
173 #include "STDDEFS.H"
174 #include "custom.h"
175 #include "gsm.h"
176 #include "vsi.h"
177
178 #endif
179
180
181 #include "mfw_mfw.h"
182 #include "mfw_phb.h"
183 #include "mfw_phbi.h"
184 #include "mfw_cm.h"
185 #include "mfw_cmi.h"
186 #include "mfw_nm.h"
187 #include "mfw_sim.h"
188 #include "mfw_sima.h"
189 #include "mfw_nmi.h"
190 #include "mfw_simi.h"
191 #include "mfw_win.h"
192
193 #include "mfw_tim.h"
194 #include "mfw_utils.h"
195
196 #include "ksd.h"
197 #include "psa.h"
198
199 #if defined (FAX_AND_DATA)
200 #include "aci_fd.h"
201 #endif
202
203 #include "cmh.h"
204 #include "phb.h"
205 #include "cmh_phb.h"
206
207 #include "mfw_ss.h"
208 #include "mfw_ssi.h"
209 #include "mfw_win.h"
210 #include "mfw_ffs.h"
211
212 #include "prim.h"
213 #ifndef PCM_2_FFS
214 #include "pcm.h"
215 #endif
216
217
218
219 /*
220 * Conditional compilation flag for CCBS testing.
221 * When defined, the cm_ccbs_... functions do not call ACI functions but
222 * simply set the return value variable to indicate success. Also the body
223 * of the rAT_PercentMMITEST function is defined for parsing AT%MMITEST
224 * commands and calling ACI/MFW functions as if CCBS events had occured.
225 */
226 // #define CCBS_TEST
227
228 /********* current define *******************************************/
229 // Apr 14, 2005 REF: CRR 29991 xpradipg
230 // remove the static definition
231 #ifndef FF_MMI_OPTIM
232 static T_MFW_CM_BLACKLIST_LIST black_list;
233 #endif
234
235 // Apr 06 2005 REF: CRR 29989 xpradipg
236 // The definition of global is removed since it is locally used
237 #ifndef FF_MMI_OPTIM
238 static T_ACI_CAL_ENTR call_tab[MAX_CALL_NR];
239 #endif
240 static T_MFW_PHB_LIST entries;
241 static T_MFW_CM_CC_STAT cc_stat; /* current outgoing call status */
242 static T_MFW_CM_COMMAND cmd;
243 static T_MFW_CM_NOTIFY notify;
244
245 static UBYTE call_type; /* indicate an ECC call or normal call */
246 static UBYTE call_stat; /* indicate an MO call or MT call */
247 /*a0393213 lint WR:symbol not referenced soln:the variable is put under the flag (which won't be defined) so that the flag
248 can be removed if the variable is necessary*/
249 #ifdef MMI_LINT_WARNING_REMOVAL
250 static SHORT cc_id; /* current call index */
251 #endif
252 static UBYTE redial_stat;
253 static UBYTE redial_count;
254 static UBYTE cmd_hold;
255
256 static T_MFW_CM_CW_INFO in_call;
257 static T_MFW_CM_MO_INFO out_call;
258 static T_MFW_CM_DISCONNECT dis_connect;
259 static T_MFW_CM_REDIAL rdl;
260 static T_MFW_CM_CPI cm_cpi;
261 /* Marcus: CCBS: 14/11/2002: Start */
262 static T_MFW_CM_CCBS_INFO ccbs_info; // E_CM_CCBS data
263 static T_MFW_CM_CCBS_OP ccbs_op = CM_CCBS_NONE; // Current CCBS operation
264 /* Marcus: CCBS: 14/11/2002: End */
265
266 static T_CM_CLI cli_prefix;
267 /*CONQUEST 5998-MC 30/04/02 -initialised timers to zero (prevents corruption) */
268 static MfwHnd redialTim1= NULL; /* the 1th redialing */
269 static MfwHnd redialTim24 = NULL; /* the 2th to 4st redialing */
270 static MfwHnd redialTim5 = NULL; /* the 5th or over redialing */
271
272 static int cmCommand (U32 cmd, void *h); /* handle window commands */
273 static int cm_redial_timeout(MfwEvt e, MfwTim *t);
274 static char currAccepting = 0; /* ES!! 210999 */
275 static char currConnecting = 0; /* ES!! 290999 */
276 /*a0393213 lint WR:symbol not referenced soln:the variable is put under the flag (which won't be defined) so that the flag
277 can be removed if the variable is necessary*/
278 #ifdef MMI_LINT_WARNING_REMOVAL
279 static T_ACI_AT_CMD currCmd;
280 #endif
281 static T_MFW_CM_DTMF dtmf_sent={FALSE};/*OMAPS00108192 a0393213 - variable which keeps track of the dtmf sent to ACI (via sAT_PlusVTS)*/
282 static T_MFW_CM_DTMF dtmf_queued={FALSE};/*OMAPS00108192 a0393213 - variable which keeps track of the recent dtmf added to the queue*/
283 void cm_force_disconnect(void); // RAVI
284
285 /* June 15, 2006 OMAPS00079492 x0043642 */
286 void set_cmdHold(int command);
287
288 //APR 03 2005 - REF CRR: 29988 xpradipg
289 //The DTMF buffer is reduced from 50 to 20
290 #ifdef FF_MMI_REDUCED_KBD_BUFFER
291 #define MAX_DTMF_Q_ENTRIES 20
292 #else
293 #define MAX_DTMF_Q_ENTRIES 50
294 #endif
295 #define CPI_CAUSE_MASK 0xFF /* cq11676 cause mask 17-02-04 MZ */
296 static UBYTE dtmf_q[MAX_DTMF_Q_ENTRIES];
297 static SHORT mfw_cm_dtmf_q_id;
298
299 // MMI-SPR 13873 xkundadu.
300 // Added this boolean variable to check whether a particular call is in
301 // multiparty or not
302 BOOL bIsMultpty = FALSE;
303
304 EXTERN MfwHdr * current_mfw_elem;
305
306 LOCAL T_MFW_CM_CALL_STAT cm_cvt_call_status( T_ACI_CAL_STAT stat );
307
308 //x0pleela 03 Nov, 2006 DR: OMAPS00101158
309 //Variable which says the type of source Id
310 //FALSE if LOCAL SRC, TRUE if other sources like AT1, AT2, AT3...
311 static UBYTE uOtherSrc;
312 //function to set the value of uOtherSrc to either TRUE or FALSE
313 GLOBAL void mfw_set_OtherSrc_Value(UBYTE otherSrc);
314 //function to get the value of uOtherSrc
315 GLOBAL UBYTE mfw_get_OtherSrc_Value(void);
316 /*
317 +--------------------------------------------------------------------+
318 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
319 | STATE : code ROUTINE: cm_init |
320 +--------------------------------------------------------------------+
321
322
323 PURPOSE : initialize for call management
324
325 */
326
327 void cm_init(void)
328 {
329 // Apr 14, 2005 REF: CRR 29991 xpradipg
330 // local variable definition
331 #ifdef FF_MMI_OPTIM
332 T_MFW_CM_BLACKLIST_LIST black_list;
333 /*a0393213 compiler warnings removal- removed variable 'file'*/
334 #endif
335 TRACE_FUNCTION ("cm_init()");
336 memset(&black_list, 0, sizeof(T_MFW_CM_BLACKLIST_LIST));
337 // Apr 14, 2005 REF: CRR 29991 xpradipg
338 // Since the blacklist is not persistent across powercycles we reset the file
339 // contents
340 #ifdef FF_MMI_OPTIM
341 if( flash_MMI_blackList_write((U8 *)&black_list, sizeof(T_MFW_CM_BLACKLIST_LIST),0) < 0)
342 TRACE_EVENT("Error opening the black list file");
343 #endif
344
345 currAccepting = 0; /* ES!! 210999 */
346 currConnecting = 0; /* ES!! 290999 */
347
348 call_type = MFW_CALL_FREE;
349 call_stat = MFW_CALL_FREE;
350 cc_stat.type = MFW_CALL_FREE;
351 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
352 cc_id = 0;
353 #endif
354
355 cmd_hold = 0;
356 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
357 currCmd = AT_CMD_NONE;
358 #endif
359
360 // get prefix from EEPROM
361 cli_prefix = 0;
362
363 /* create time event for redialing */
364 redialTim1 = timCreate (0, MIN_DURATION_1, (MfwCb)cm_redial_timeout);
365 redialTim24 = timCreate (0, MIN_DURATION_2_4, (MfwCb)cm_redial_timeout);
366 redialTim5 = timCreate (0, MIN_DURATION_5, (MfwCb)cm_redial_timeout);
367
368 redial_stat = (UBYTE)FFS_flashData.redial_mode;
369
370 mfwCommand[MfwTypCm] = (MfwCb) cmCommand;
371
372 /*
373 ** Create a static circular buffer to hold the dtmf tones
374 */
375 mfw_cm_dtmf_q_id = mfw_cbuf_create( MAX_DTMF_Q_ENTRIES,
376 sizeof(UBYTE),
377 0,
378 0xFF,
379 TRUE,
380 (void *)&dtmf_q[0]);
381
382 if (mfw_cm_dtmf_q_id < 0)
383 TRACE_EVENT_P1("ERROR : mfw_cbuf_create failed with error value %d", mfw_cm_dtmf_q_id);
384 }
385
386
387 /*
388 +--------------------------------------------------------------------+
389 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
390 | STATE : code ROUTINE: cm_exit |
391 +--------------------------------------------------------------------+
392
393
394 PURPOSE :
395
396 */
397
398 void cm_exit(void)
399 {
400 TRACE_FUNCTION ("cm_exit()");
401
402 /* delete time event for redialing */
403 timDelete (redialTim5);
404 timDelete (redialTim24);
405 timDelete (redialTim1);
406 }
407
408
409 /*
410 +--------------------------------------------------------------------+
411 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
412 | STATE : code ROUTINE: cm_create |
413 +--------------------------------------------------------------------+
414
415
416 PURPOSE : create event for call management
417
418 */
419
420 T_MFW_HND cm_create(T_MFW_HND hWin, T_MFW_EVENT event, T_MFW_CB cbfunc)
421 {
422 T_MFW_HDR *hdr;
423 T_MFW_CM *cm_para;
424
425 TRACE_FUNCTION ("cm_create()");
426
427 hdr = (T_MFW_HDR *) mfwAlloc(sizeof (T_MFW_HDR));
428 cm_para = (T_MFW_CM *) mfwAlloc(sizeof (T_MFW_CM));
429
430 if (!hdr OR !cm_para)
431 return FALSE;
432
433 /*
434 * initialisation of the handler
435 */
436 cm_para->emask = event;
437 cm_para->handler = cbfunc;
438
439 hdr->data = cm_para; /* store parameter in node */
440 hdr->type = MFW_TYP_CM; /* store type of event handler */
441
442 /*
443 * installation of the handler
444 */
445 return mfwInsert((T_MFW_HDR *)hWin, hdr);
446 }
447
448
449 /*
450 +--------------------------------------------------------------------+
451 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
452 | STATE : code ROUTINE: cm_delete |
453 +--------------------------------------------------------------------+
454
455
456 PURPOSE : delete a event for call management
457
458 */
459
460 T_MFW_RES cm_delete(T_MFW_HND h)
461 {
462 TRACE_FUNCTION ("cm_delete()");
463
464 if (!h OR !((T_MFW_HDR *)h)->data)
465 return MFW_RES_ILL_HND;
466
467 if (!mfwRemove((T_MFW_HDR *)h))
468 return MFW_RES_ILL_HND;
469
470 mfwFree((U8 *)(((T_MFW_HDR *) h)->data),sizeof(T_MFW_CM));
471 mfwFree((U8 *)h,sizeof(T_MFW_HDR));
472
473 return MFW_RES_OK;
474 }
475
476
477 /*
478 +--------------------------------------------------------------------+
479 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
480 | STATE : code ROUTINE: cm_signal |
481 +--------------------------------------------------------------------+
482
483 PURPOSE : send a event signal.
484
485 */
486
487 void cm_signal(T_MFW_EVENT event, void * para)
488 {
489 UBYTE temp;
490
491
492
493 temp = dspl_Enable(0);
494
495
496 if (mfwSignallingMethod EQ 0)
497 {
498 /*
499 * focus is on a window
500 */
501 if (mfwFocus)
502 /*
503 * send event to sim management
504 * handler if available
505 */
506 if (cm_sign_exec (mfwFocus, event, para))
507 {
508 dspl_Enable(temp);
509 return;
510 }
511
512 /*
513 * acutal focussed window is not available
514 * or has no network management registration
515 * handler, then search all nodes from the root.
516 */
517 if (mfwRoot)
518 cm_sign_exec (mfwRoot, event, para);
519 }
520 else
521 {
522 MfwHdr * h = 0;
523
524 /*
525 * Focus set, then start here
526 */
527 if (mfwFocus)
528 h = mfwFocus;
529 /*
530 * Focus not set, then start root
531 */
532 if (!h)
533 h = mfwRoot;
534
535 /*
536 * No elements available, return
537 */
538
539 while (h)
540
541
542 {
543 /*
544 * Signal consumed, then return
545 */
546 if (cm_sign_exec (h, event, para))
547 {
548 dspl_Enable(temp);
549 return;
550 }
551
552 /*
553 * All windows tried inclusive root
554 */
555 if (h == mfwRoot)
556 {
557 dspl_Enable(temp);
558 return;
559 }
560
561 /*
562 * get parent window
563 */
564 h = mfwParent(mfwParent(h));
565 if(h)
566 h = ((MfwWin * )(h->data))->elems;
567 }
568 cm_sign_exec (mfwRoot, event, para);
569 }
570 dspl_Enable(temp);
571 }
572
573 /*
574 +--------------------------------------------------------------------+
575 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
576 | STATE : code ROUTINE: cm_sign_exec |
577 +--------------------------------------------------------------------+
578
579
580 PURPOSE : Send a signal if CM management handler.
581
582 */
583
584 BOOL cm_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_CM_PARA * para)
585 {
586 TRACE_FUNCTION ("cm_sign_exec()");
587
588 while (cur_elem)
589 {
590 /*
591 * event handler is available
592 */
593 if (cur_elem->type EQ MFW_TYP_CM)
594 {
595 T_MFW_CM * cm_data;
596 /*
597 * handler is CM management handler
598 */
599 cm_data = (T_MFW_CM *)cur_elem->data;
600 if (cm_data->emask & event)
601 {
602 /*
603 * event is expected by the call back function
604 */
605 cm_data->event = event;
606 switch (event)
607 {
608 case E_CM_COLP:
609 memcpy (&cm_data->para.mo_data, para, sizeof (T_MFW_CM_MO_INFO));
610 break;
611
612 case E_CM_DISCONNECT:
613 memcpy (&cm_data->para.disconnect, para, sizeof (T_MFW_CM_DISCONNECT));
614 break;
615 case E_CM_DISCONNECT_ALL:
616 memcpy (&cm_data->para.disconnect_all, para, sizeof (T_MFW_CM_DISCONNECT_ALL));
617 break;
618
619 case E_CM_CW:
620 memcpy (&cm_data->para.cw_info, para, sizeof (T_MFW_CM_CW_INFO));
621 break;
622
623 case E_CM_COMMAND:
624 memcpy (&cm_data->para.command, para, sizeof (T_MFW_CM_COMMAND));
625 break;
626
627 case E_CM_AOC:
628 memcpy (&cm_data->para.aoc_info, para, sizeof (T_MFW_CM_AOC_INFO));
629 break;
630
631 case E_CM_REDIAL:
632 memcpy (&cm_data->para.rdl, para, sizeof (T_MFW_CM_REDIAL));
633 break;
634
635 case E_CM_CONNECT_ACK:
636 memcpy (&cm_data->para.call_id, para, sizeof (SHORT));
637 break;
638
639 // Sep 01, 2006 REF:OMAPS00090555 x0039928
640 // Fix: Copy MO data
641 case E_CM_MO_RES:
642 memcpy (&cm_data->para.mo_data, para, sizeof (T_MFW_CM_MO_INFO));
643 break;
644
645 case E_CM_CPI:
646 memcpy (&cm_data->para.cm_cpi, para, sizeof (T_MFW_CM_CPI));
647 break;
648
649 case E_CM_RING_OFF:
650 break;
651
652 case E_CM_AOC_CNF:
653 memcpy (&cm_data->para.aoc_cnf, para, sizeof (T_MFW_CM_AOC_CNF));
654 break;
655
656 case E_CM_DTMF:
657 memcpy (&cm_data->para.dtmf_tone, para, sizeof (UBYTE));
658 break;
659
660 case E_CM_NOTIFY:
661 memcpy (&cm_data->para.notify, para, sizeof (T_MFW_CM_NOTIFY));
662 break;
663 /*MC SPR 1392*/
664 case E_CM_CALL_DEFLECT_STATUS:
665 memcpy (&cm_data->para.call_deflect_status, para, sizeof (BOOL));
666 break;
667 /* Marcus: CCBS: 14/11/2002: Start */
668 case E_CM_CCBS:
669 TRACE_EVENT("E_CM_CCBS");
670 memcpy (&cm_data->para.ccbs, para, sizeof (T_MFW_CM_CCBS_INFO));
671 break;
672 /* Marcus: CCBS: 14/11/2002: End */
673
674 case E_CM_CTYI:
675 memcpy (&cm_data->para.ctyi, para, sizeof (T_MFW_CM_CTYI));
676 break;
677
678 }
679
680 /*
681 * if call back defined, call it
682 */
683 if (cm_data->handler)
684 {
685 // PATCH LE 06.06.00
686 // store current mfw elem
687 current_mfw_elem = cur_elem;
688 // END PATCH LE 06.06.00
689 if ((*(cm_data->handler)) (cm_data->event, (void *)&cm_data->para))
690 return TRUE;
691 }
692 }
693 }
694 cur_elem = cur_elem->next;
695 }
696 return FALSE;
697 }
698
699
700 /*
701 +--------------------------------------------------------------------+
702 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
703 | STATE : code ROUTINE : cm_callTyp_cvt |
704 +--------------------------------------------------------------------+
705
706
707 PURPOSE : This function is used to convert the type of call class
708 used by MFW to the type of call class used by ACI.
709
710 */
711
712 LOCAL T_MFW_CM_CALL_TYPE cm_callTyp_cvt(T_ACI_CLASS cls)
713 {
714 switch ( cls )
715 {
716 case ( CLASS_Vce ) : return VOICE_CALL;
717 case ( CLASS_AuxVce): return AuxVOICE_CALL;
718 case ( CLASS_Dat ) : return DATA_CALL;
719 case ( CLASS_Fax ) : return FAX_CALL;
720 case ( CLASS_VceDat ) :
721 case ( CLASS_VceFax ) :
722 case ( CLASS_DatFax ) :
723 case ( CLASS_VceDatFax ): return (T_MFW_CM_CALL_TYPE)cls;
724 case ( CLASS_None ) : return NONE_TYPE;
725 case (CLASS_NotPresent): return NONE_TYPE;
726
727 default: return NONE_TYPE;
728 }
729 }
730
731
732 /*
733 +--------------------------------------------------------------------+
734 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
735 | STATE : code ROUTINE: cm_search_callId |
736 +--------------------------------------------------------------------+
737
738
739 PURPOSE : find call index from call table
740
741 */
742
743 int cm_search_callId(T_ACI_CAL_STAT type, SHORT *id)
744 {
745 int i;
746 // Apr 06 2005 REF: CRR 29989 xpradipg
747 // Local definition and allocation
748 #ifdef FF_MMI_OPTIM
749 T_ACI_CAL_ENTR *call_tab;
750 *id = 0;
751 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
752 if(NULL == call_tab)
753 return CM_ERROR;
754 #else
755 *id = 0;
756 #endif
757 TRACE_FUNCTION("cm_search_callId()");
758
759
760 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
761 {
762 // Apr 06 2005 REF: CRR 29989 xpradipg
763 // deallocation of memory allocated
764 #ifdef FF_MMI_OPTIM
765 if(call_tab)
766 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
767 #endif
768 return CM_ERROR;
769 }
770
771 for (i=0; i<MAX_CALL_NR; i++)
772 {
773 if (call_tab[i].index == -1)
774 break;
775
776 if (call_tab[i].status == type)
777 {
778 *id = call_tab[i].index;
779 // Apr 06 2005 REF: CRR 29989 xpradipg
780 // deallocation of memory
781 #ifdef FF_MMI_OPTIM
782 if(call_tab)
783 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
784 #endif
785 return CM_OK;
786 }
787
788 }
789 // Apr 06 2005 REF: CRR 29989 xpradipg
790 // deallocation of memory
791 #ifdef FF_MMI_OPTIM
792 if(call_tab)
793 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
794 #endif
795 return CM_ERROR;
796 }
797
798 /*
799 +--------------------------------------------------------------------+
800 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
801 | STATE : code ROUTINE: cm_search_callMode |
802 +--------------------------------------------------------------------+
803
804
805 PURPOSE : find call type from call table
806
807 */
808
809 T_ACI_CAL_MODE cm_search_callMode(SHORT id)
810 {
811 int i;
812 // Apr 06 2005 REF: CRR 29989 xpradipg
813 // allocation of memory, if the memory allocation fails then we return the
814 // error value same as when the qAT_PercentCAL() fails
815 #ifdef FF_MMI_OPTIM
816 T_ACI_CAL_ENTR *call_tab;//[MAX_CALL_NR];
817 T_ACI_CAL_MODE calMode;
818 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
819 if(NULL == call_tab)
820 return CAL_MODE_Unknown;
821 #endif
822
823 TRACE_FUNCTION("cm_search_callMode()");
824
825 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
826 {
827 // Apr 06 2005 REF: CRR 29989 xpradipg
828 // deallocate memory
829 #ifdef FF_MMI_OPTIM
830 if(call_tab)
831 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
832 #endif
833 return CAL_MODE_Unknown;
834 }
835 for (i=0; i<MAX_CALL_NR; i++)
836 {
837 if (call_tab[i].index == -1)
838 break;
839
840 if (call_tab[i].index == id)
841 {
842 // Apr 06 2005 REF: CRR 29989 xpradipg
843 // deallocate memory
844 #ifdef FF_MMI_OPTIM
845 calMode = call_tab[i].calMode;
846 if(call_tab)
847 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
848 return calMode;
849 #else
850 return call_tab[i].calMode;
851 #endif
852 }
853 }
854 // Apr 06 2005 REF: CRR 29989 xpradipg
855 // deallocate memory
856 #ifdef FF_MMI_OPTIM
857 if(call_tab)
858 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
859 #endif
860 return CAL_MODE_Unknown;
861 }
862
863 /*
864 +--------------------------------------------------------------------+
865 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
866 | STATE : code ROUTINE: cm_search_mptyId |
867
868
869 PURPOSE : find multiparty call index from call table
870
871 */
872
873 int cm_search_mptyId(T_ACI_CAL_MPTY type, SHORT *id)
874 {
875 int i;
876 // Apr 06 2005 REF: CRR 29989 xpradipg
877 // allocate memory
878 #ifdef FF_MMI_OPTIM
879 T_ACI_CAL_ENTR *call_tab;//[MAX_CALL_NR];
880 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
881 if( NULL == call_tab)
882 return CM_ERROR;
883 #endif
884
885 TRACE_FUNCTION("cm_search_mptyId()");
886 *id = 0;
887
888 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
889 {
890 // Apr 06 2005 REF: CRR 29989 xpradipg
891 // deallocate memory
892 #ifdef FF_MMI_OPTIM
893 if(call_tab)
894 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
895 #endif
896 return CM_ERROR;
897 }
898 for (i=0; i<MAX_CALL_NR; i++)
899 {
900 if (call_tab[i].index == -1)
901 break;
902
903 if (call_tab[i].mpty == type)
904 {
905 *id = call_tab[i].index;
906 // Apr 06 2005 REF: CRR 29989 xpradipg
907 // deallocate memory
908 #ifdef FF_MMI_OPTIM
909 if(call_tab)
910 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
911 #endif
912 return CM_OK;
913 }
914 }
915 // Apr 06 2005 REF: CRR 29989 xpradipg
916 // deallocate memory
917 #ifdef FF_MMI_OPTIM
918 if(call_tab)
919 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
920 #endif
921 return CM_ERROR;
922 }
923
924
925 /*
926 +-------------------------------------------------------------------+
927 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
928 | STATE : code ROUTINE: cm_search_numId |
929 +-------------------------------------------------------------------+
930 PURPOSE : find call index from call table
931 */
932 /*a0393213(R.Prabakar) lint warnings removal
933 warning:symbol(cm_search_numId) not referenced
934 soln :this function was not at all called. so this function has been put under MMI_LINT_WARNING_REMOVAL,
935 which is not defined. If this function is needed this flag can be removed*/
936
937 #ifdef MMI_LINT_WARNING_REMOVAL
938 LOCAL SHORT cm_search_numId(UBYTE *number)
939 {
940 int i;
941 // Apr 06 2005 REF: CRR 29989 xpradipg
942 // allocate memory
943 #ifdef FF_MMI_OPTIM
944 SHORT index;
945 T_ACI_CAL_ENTR *call_tab;//[MAX_CALL_NR];
946 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
947 if(NULL == call_tab)
948 return 0;
949 #endif
950
951 TRACE_FUNCTION("cm_search_numId()");
952
953 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
954 {
955 // Apr 06 2005 REF: CRR 29989 xpradipg
956 // deallocate memory
957 #ifdef FF_MMI_OPTIM
958 if(call_tab)
959 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
960 #endif
961 return 0;
962 }
963
964 for (i=0; i<MAX_CALL_NR; i++)
965 {
966 if (call_tab[i].index == -1)
967 break;
968
969 if (!strcmp(call_tab[i].number, (char *)number))
970 {
971 // Apr 06 2005 REF: CRR 29989 xpradipg
972 // deallocate memory
973 #ifdef FF_MMI_OPTIM
974 index = call_tab[i].index;
975 if(call_tab)
976 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
977 return index;
978 #else
979 return call_tab[i].index;
980 #endif
981 }
982 }
983 // Apr 06 2005 REF: CRR 29989 xpradipg
984 // deallocate memory
985 #ifdef FF_MMI_OPTIM
986 if(call_tab)
987 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
988 #endif
989 return 0;
990 }
991
992 #endif
993 /*
994 +--------------------------------------------------------------------+
995 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
996 | STATE : code ROUTINE: cm_search_callStat |
997 +--------------------------------------------------------------------+
998
999
1000 PURPOSE : Search the information from call table.
1001
1002 */
1003
1004 T_MFW cm_search_callStat(SHORT call_number,
1005 T_MFW_CM_CALL_STAT *stat,
1006 UBYTE *ton,
1007 UBYTE *mode)
1008 {
1009 int i;
1010 // Apr 06 2005 REF: CRR 29989 xpradipg
1011 // allocat memory
1012 #ifdef FF_MMI_OPTIM
1013 T_ACI_CAL_ENTR *call_tab;//[MAX_CALL_NR];
1014 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
1015 if( NULL == call_tab)
1016 return CM_ERROR;
1017 #endif
1018
1019 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
1020 {
1021 for (i=0; i<MAX_CALL_NR; i++)
1022 {
1023 if (call_tab[i].index == -1)
1024 break;
1025
1026 if (call_tab[i].index == call_number)
1027 {
1028 *stat = cm_cvt_call_status(call_tab[i].status);
1029 *ton = phb_cvtTon(call_tab[i].type.ton);
1030 *mode = cm_cvt_call_mode(call_tab[i].calMode);
1031 // Apr 06 2005 REF: CRR 29989 xpradipg
1032 // deallocate memory
1033 #ifdef FF_MMI_OPTIM
1034 if(call_tab)
1035 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
1036 #endif
1037
1038 return CM_OK;
1039 }
1040 }
1041 // Apr 06 2005 REF: CRR 29989 xpradipg
1042 // this will be returned once we get out of the if statement
1043 #ifndef FF_MMI_OPTIM
1044 return CM_ERROR;
1045 #endif
1046 }
1047 // Apr 06 2005 REF: CRR 29989 xpradipg
1048 // deallocate memory
1049 #ifdef FF_MMI_OPTIM
1050 if(call_tab)
1051 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
1052 #endif
1053 return CM_ERROR;
1054 }
1055
1056
1057 /*
1058 +--------------------------------------------------------------------+
1059 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1060 | STATE : code ROUTINE: cm_check_emergency |
1061 +--------------------------------------------------------------------+
1062
1063
1064 PURPOSE : Check emergency call number
1065
1066 */
1067
1068 T_MFW cm_check_emergency(UBYTE *number)
1069 {
1070 //UBYTE index; // RAVI
1071 // T_MFW_PHB_TEXT findText; // RAVI
1072 // T_MFW_PHB_ENTRY entry; // RAVI
1073
1074 TRACE_FUNCTION ("cm_check_emergency()");
1075 TRACE_EVENT_P1("String being passed = %s", (char*)number);
1076
1077 //TISH, patch for OMAPS00125064
1078 if (strlen((char *)number) <= 0 OR strlen((char *)number) > 6)
1079 //if (strlen((char *)number) <= 0 OR strlen((char *)number) > 3)
1080 return FALSE;
1081
1082 if(psaCC_phbSrchECC((char*)number, FALSE))
1083 {
1084 TRACE_EVENT("psaCC_phbSrchECC - returned - TRUE");
1085 return TRUE;
1086 }
1087 else
1088 {
1089 TRACE_EVENT("psaCC_phbSrchECC - returned - FALSE");
1090 return FALSE;
1091 }
1092
1093 }
1094
1095 /*
1096 +--------------------------------------------------------------------+
1097 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1098 | STATE : code ROUTINE: cm_mo_prefix |
1099 +--------------------------------------------------------------------+
1100
1101
1102 PURPOSE : set/get CLIP, CLIR, COLP and COLR tempstatus
1103
1104 */
1105
1106 T_CM_CLI cm_mo_prefix(T_CM_CLI prefix)
1107 {
1108 UBYTE bits;
1109
1110 if ((bits = (prefix & 0x0c)) != 0)
1111 cli_prefix = (cli_prefix & 0xf3) | bits;
1112 if ((bits = (prefix & 0xc0)) != 0)
1113 cli_prefix = (cli_prefix & 0x3f) | bits;
1114 return cli_prefix;
1115 }
1116
1117
1118 /*
1119 +--------------------------------------------------------------------+
1120 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1121 | STATE : code ROUTINE: cm_set_cmd_status |
1122 +--------------------------------------------------------------------+
1123
1124
1125 PURPOSE :
1126
1127 */
1128
1129 void cm_set_cmd_status(T_ACI_CHLD_MOD mode, CHAR* call)
1130 {
1131 SHORT id;
1132 // Added xkundadu MMI-SPR 13873
1133 // Stores the status of a particular call.
1134 T_MFW_CM_STATUS status;
1135
1136 TRACE_FUNCTION("cm_set_cmd_status()"); // Marcus: CCBS: 14/11/2002
1137
1138 memset(&dis_connect, 0, sizeof(T_MFW_CM_DISCONNECT));
1139 memset(&cmd, 0, sizeof(T_MFW_CM_COMMAND));
1140 switch (mode)
1141 {
1142 case CHLD_MOD_RelHldOrUdub:
1143 TRACE_EVENT("CHLD_MOD_RelHldOrUdub"); // Marcus: CCBS: 14/11/2002
1144 /*SPR#1965 - DS - Changed from MFW_CM_MT_REJECT to MFW_CM_TERMINATED because
1145 * the E_CM_DISCONNECT signal is not sent in cm_ok_disconnect() if cmd_hold = MFW_CM_MT_REJECT.
1146 * Port of 1962.
1147 */
1148 cmd_hold = MFW_CM_TERMINATED;
1149
1150 if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
1151 {
1152 TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) == CM_OK"); // Marcus: CCBS: 14/11/2002
1153 dis_connect.call_number = id;
1154 }
1155 else
1156 {
1157 TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) != CM_OK"); // Marcus: CCBS: 14/11/2002
1158 dis_connect.call_number = -1; // call id?
1159 }
1160
1161 break;
1162 case CHLD_MOD_RelActAndAcpt:
1163
1164 TRACE_EVENT("CHLD_MOD_RelActAndAcpt"); // Marcus: CCBS: 14/11/2002
1165 cmd_hold = MFW_CM_1_SEND;
1166
1167 // Added xkundadu MMI-SPR 13873
1168 // Querying if there are any active calls, storing the index of the
1169 // call and setting a flag if found to be multiparty.
1170 if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
1171 {
1172 // Active call is present.
1173 dis_connect.call_number = id; // call id ?
1174 cm_status(id, &status, 1);
1175 if (status.mtpy EQ MFW_MTPY_MEMBER)
1176 {
1177 bIsMultpty = TRUE;
1178 }
1179 else
1180 {
1181 bIsMultpty = FALSE;
1182 }
1183
1184 }
1185 else
1186 {
1187 dis_connect.call_number = -1;
1188 }
1189 // Added xkundadu MMI-SPR 13873
1190 // Querying if there are any held calls, storing the index of the call
1191 // to change the status to active call.
1192 if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
1193 {
1194 cmd.command = CM_RETRIEVE;
1195 cmd.call_number = id;
1196 }
1197 // Added xkundadu MMI-SPR 13873
1198 // Checking is there any waiting call exists or not.
1199 if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
1200 {
1201 // This variable determines whether to accept/reject the call
1202 // in the cm_result_cmd().
1203 cmd.call_number=0;
1204 }
1205 else
1206 {
1207 cmd.call_number=-1;
1208 }
1209
1210 break;
1211
1212 case CHLD_MOD_RelActSpec:
1213 TRACE_EVENT("CHLD_MOD_RelActSpec"); // Marcus: CCBS: 14/11/2002
1214 dis_connect.call_number = (SHORT)atoi(call);
1215 if (dis_connect.call_number)
1216 {
1217 TRACE_EVENT("dis_connect.call_number"); // Marcus: CCBS: 14/11/2002
1218 cmd_hold = MFW_CM_TERMINATED;
1219 }
1220 else
1221 {
1222 TRACE_EVENT("!dis_connect.call_number"); // Marcus: CCBS: 14/11/2002
1223 cmd_hold = MFW_CM_MPTY_TERMINATED;
1224 }
1225 break;
1226 case CHLD_MOD_HldActAndAcpt:
1227 TRACE_EVENT("CHLD_MOD_HldActAndAcpt"); // Marcus: CCBS: 14/11/2002
1228 if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
1229 {
1230 TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) == CM_OK"); // Marcus: CCBS: 14/11/2002
1231 cmd_hold = MFW_CM_MT_ACCEPT;
1232 /*
1233 * initialize for result event
1234 */
1235 cmd.command = CM_HOLD;
1236 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
1237 cc_id = id;
1238 #endif
1239 }
1240 else
1241 {
1242 TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) != CM_OK"); // Marcus: CCBS: 14/11/2002
1243 if ((cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
1244 AND (cm_search_callId(CAL_STAT_Held, &id) == CM_OK))
1245 {
1246 TRACE_EVENT("cmd.command = CM_SWAP"); // Marcus: CCBS: 14/11/2002
1247 cmd.command = CM_SWAP;
1248 }
1249 if ((cm_search_callId(CAL_STAT_Active, &id) != CM_OK)
1250 AND (cm_search_callId(CAL_STAT_Held, &id) == CM_OK))
1251 {
1252 TRACE_EVENT("cmd.command = CM_RETRIEVE"); // Marcus: CCBS: 14/11/2002
1253 cmd.command = CM_RETRIEVE;
1254 }
1255 if ((cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
1256 AND (cm_search_callId(CAL_STAT_Held, &id) != CM_OK))
1257 {
1258 TRACE_EVENT("cmd.command = CM_HOLD"); // Marcus: CCBS: 14/11/2002
1259 cmd.command = CM_HOLD;
1260 }
1261 cmd.call_number = 0;
1262 }
1263 break;
1264 case CHLD_MOD_HldActExc:
1265 TRACE_EVENT("CHLD_MOD_HldActExc"); // Marcus: CCBS: 14/11/2002
1266 cmd.command = CM_SPLIT_MULTIPARTY;
1267 cmd.call_number = 0;
1268 break;
1269 case CHLD_MOD_AddHld:
1270 TRACE_EVENT("CHLD_MOD_AddHld"); // Marcus: CCBS: 14/11/2002
1271 cmd.command = CM_BUILD_MULTIPARTY;
1272 cmd.call_number = 0;
1273 break;
1274 case CHLD_MOD_Ect:
1275 TRACE_EVENT("CHLD_MOD_Ect"); // Marcus: CCBS: 14/11/2002
1276 cmd.command = CM_ETC;
1277 cmd.call_number = 0;
1278 break;
1279 case CHLD_MOD_Ccbs:
1280 TRACE_EVENT("CHLD_MOD_Ccbs"); // Marcus: CCBS: 14/11/2002
1281 cmd.command = CM_CCBS;
1282 cmd.call_number = 0;
1283 break;
1284 case CHLD_MOD_HldActDial:
1285 TRACE_EVENT("CHLD_MOD_HldActDial"); // Marcus: CCBS: 14/11/2002
1286 cmd_hold = MFW_CM_HOLD_AND_DIAL;
1287 /*
1288 * initialize for result event
1289 */
1290 cmd.command = CM_HOLD;
1291 /*cc_id = id;*//*a0393213 lint warnings:var not initialized soln:commented as it is not needed*/
1292 break;
1293 }
1294 }
1295
1296
1297 /*
1298 +--------------------------------------------------------------------+
1299 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1300 | STATE : code ROUTINE: cm_check_mo_number |
1301 +--------------------------------------------------------------------+
1302
1303
1304 PURPOSE : start mobile originated call
1305
1306 */
1307
1308 T_MFW cm_check_mo_number(UBYTE *number)
1309 {
1310 UBYTE i;
1311 // Apr 14, 2005 REF: CRR 29991 xpradipg
1312 // local definition
1313 #ifdef FF_MMI_OPTIM
1314 UBYTE count = 0;
1315 UBYTE blackListNum[MFW_NUM_LEN];
1316 int8 file;
1317 #endif
1318
1319 /* check whether a redialing exists */
1320 if (call_stat EQ REDIALING_CALL)
1321 {
1322 cm_stop_redialTim();
1323 rdl.redial_mode = CM_REDIAL_OUTGOING;
1324 cm_signal(E_CM_REDIAL, &rdl);
1325 }
1326
1327
1328 if (!number)
1329 return CM_OK;
1330 // Apr 14, 2005 REF: CRR 29991 xpradipg
1331 // the list is read from the file
1332 #ifdef FF_MMI_OPTIM
1333 if(( file = flash_MMI_blackList_open()) > 0)
1334 {
1335 if(flash_MMI_blackList_read(file,(U8*)&count,1,0) > 0)
1336 {
1337 for(i=0; i < (int)count; i++)
1338 {
1339 if(flash_MMI_blackList_read(file,(U8*)blackListNum,MFW_NUM_LEN,(i*MFW_NUM_LEN)+1) > 0)
1340 {
1341 if(!strcmp((char*)blackListNum, (char*)number))
1342 {
1343 flash_MMI_blackList_close(file);
1344 return CM_BLACKLIST;
1345 }
1346 }
1347 }
1348 }
1349 flash_MMI_blackList_close(file);
1350 }
1351 #else
1352 /* check whether this number is in blacklist */
1353 for (i=0; i<black_list.count; i++)
1354 {
1355 if (!strcmp((char *)black_list.number[i], (char *)number))
1356 return CM_BLACKLIST;
1357 }
1358 #endif
1359
1360 /* check the type of this number */
1361 if (cm_check_emergency(number) EQ TRUE)
1362 call_type = MFW_ECC_CALL;
1363 else
1364 call_type = MFW_NORMAL_CALL;
1365
1366 return CM_OK;
1367 }
1368
1369 /*
1370 +--------------------------------------------------------------------+
1371 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1372 | STATE : code ROUTINE: cm_set_call_mode |
1373 +--------------------------------------------------------------------+
1374
1375
1376 PURPOSE : set call mode
1377
1378 */
1379
1380 void cm_set_call_mode(T_MFW_CM_CALL_TYPE mode)
1381 {
1382 switch (mode)
1383 {
1384 case VOICE_CALL:
1385 case AuxVOICE_CALL: /*MC, SPR 1026, assume line 2 is handled like line 1*/
1386 case DATA_CALL:
1387 case FAX_CALL:
1388 sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_Single);
1389 break;
1390 case VFD_VOICE:
1391 case VFD_DATA:
1392 sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_VoiceFlwdDat);
1393 break;
1394 case VAD_VOICE:
1395 case VAD_DATA:
1396 sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_VoiceDat);
1397 break;
1398 case VAF_VOICE:
1399 case VAF_FAX:
1400 sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_VoiceFax);
1401 break;
1402 default:
1403 break;
1404 }
1405 }
1406
1407 /*
1408 +--------------------------------------------------------------------+
1409 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1410 | STATE : code ROUTINE: cm_mo_idx |
1411 +--------------------------------------------------------------------+
1412
1413
1414 PURPOSE : start mobile originated call
1415
1416 */
1417
1418 T_MFW cm_mo_idx(T_KSD_SEQPARAM *para, T_MFW_CM_CALL_TYPE mode)
1419 {
1420 T_MFW_PHB_LIST entries;
1421 T_MFW_PHB_ENTRY entry;
1422 T_ACI_RETURN aci_response; /*a0393213 compiler warnings removal - type of var changed*/
1423 T_MFW mfw_response; /*a0393213 compiler warnings removal - a var introduced*/
1424 //RM 19_09_2000
1425 #ifdef NO_ASCIIZ
1426 T_ACI_PB_TEXT mfwpbText;
1427 #endif
1428 //RM
1429
1430 entries.entry = &entry;
1431
1432 /* search this number from phonebook */
1433 if ((phb_read_entries(PHB_ADN, (UBYTE)para->dialIdx.index,
1434 MFW_PHB_INDEX, 1,
1435 &entries) EQ MFW_PHB_OK)
1436 AND ((int)entries.num_entries > 0))
1437 {
1438 mfw_response= cm_check_mo_number(entries.entry->number);
1439 if (mfw_response NEQ CM_OK)
1440 return mfw_response;
1441 }
1442 else
1443 {
1444 mfw_response = cm_check_mo_number(0);
1445 if (mfw_response NEQ CM_OK)
1446 return mfw_response;
1447 }
1448
1449 /* set the outgoing call status */
1450 call_stat = OUTGOING_CALL;
1451 redial_count = 0;
1452 cc_stat.type = OUTGOING_CALL;
1453
1454 cm_set_call_mode(mode);
1455
1456 //RM 19_09_2000 instead change in ksd structure T_KSD_SEQPARAM etc., later to change !!!!
1457 #ifdef NO_ASCIIZ
1458 if(para->dialIdx.str NEQ NULL)
1459 {
1460 mfwpbText.cs = CS_GsmDef;
1461 mfwpbText.len = strlen(para->dialIdx.str);
1462 memcpy(mfwpbText.data,para->dialIdx.str,mfwpbText.len);
1463 }
1464 else
1465 {
1466 mfwpbText.cs = CS_NotPresent;
1467 mfwpbText.len = 0;
1468 }
1469 aci_response= sAT_Dm(CMD_SRC_LCL, &mfwpbText,
1470 para->dialIdx.mem, para->dialIdx.index,
1471 para->dialIdx.clirOvrd, para->dialIdx.cugCtrl,
1472 para->dialIdx.callType);
1473 #else
1474 aci_response= sAT_Dm(CMD_SRC_LCL, para->dialIdx.str,
1475 para->dialIdx.mem, para->dialIdx.index,
1476 para->dialIdx.clirOvrd, para->dialIdx.cugCtrl,
1477 para->dialIdx.callType);
1478 #endif
1479
1480 if ((aci_response== AT_FAIL) OR (aci_response== AT_BUSY))
1481 {
1482 call_stat = MFW_CALL_FREE;
1483 return cm_error_code(AT_CMD_D);
1484 }
1485
1486 return CM_OK;
1487 }
1488
1489 /*
1490 +--------------------------------------------------------------------+
1491 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
1492 | STATE : code ROUTINE: cm_mo_call |
1493 +--------------------------------------------------------------------+
1494
1495
1496 PURPOSE : start mobile originated call
1497
1498 */
1499
1500 T_MFW cm_mo_call(UBYTE *number, T_MFW_CM_CALL_TYPE type)
1501 {
1502 CHAR * rest;
1503 T_KSD_SEQPARAM para;
1504 T_MFW_SS_RETURN typ;
1505 T_MFW_SS_RETURN new_typ;
1506 CHAR * string;
1507 UBYTE cm_grp = 0; // RAVI
1508 /*a0393213 compiler warning removal -- removed clir_status def*/
1509 UBYTE colr_status;
1510 UBYTE prefix;
1511 SHORT id;
1512 T_ACI_RETURN res,aci_result;//aci_result was added to fix the bug MMI-SPR 16545
1513 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1514 // Fix: If flag FF_MMI_PB_OPTIM is defined then allocate memory for buf, phone and num_save variables
1515 // through heap instead of stack.
1516 #ifdef FF_MMI_PB_OPTIM
1517 char * buf = (char*)mfwAlloc(80);
1518 char * phone = (char*)mfwAlloc(MFW_NUM_LEN);
1519 char * num_save = (char*)mfwAlloc(MFW_STRING_LEN);
1520 #else
1521 char buf[80];
1522 UBYTE phone[MFW_NUM_LEN];
1523 UBYTE num_save[MFW_STRING_LEN];
1524 #endif
1525
1526 TRACE_FUNCTION ("cm_mo_call()");
1527
1528 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1529 #ifdef FF_MMI_PB_OPTIM
1530 memset(buf,0,80);
1531 memset(phone,0,MFW_NUM_LEN);
1532 memset(num_save,0,MFW_STRING_LEN);
1533 strncpy(num_save, (char *)number, MFW_STRING_LEN-1);
1534 #else
1535 strncpy((char *)num_save, (char *)number, MFW_STRING_LEN-1);
1536 num_save[MFW_STRING_LEN-1] = 0;
1537 #endif
1538 // Oct 10, 2006 DR: OMAPS00093720 x0039928
1539 // Fix: Set ton to MFW_TON_INTERNATIONAL
1540 if(number[0] EQ '+')
1541 {
1542 out_call.ton = MFW_TON_INTERNATIONAL;
1543 }
1544 else
1545 {
1546 out_call.ton = MFW_TON_UNKNOWN;
1547 }
1548 /* check the type of number (key sequence), current no function */
1549 typ = ss_decode(number, &rest, &para);
1550 TRACE_EVENT_P1("Type: %d", typ);
1551 if (typ == MFW_SS_DIAL)
1552 {
1553 mfwStrncpy((char *)phone, para.dial.number, MFW_NUM_LEN);
1554
1555 }
1556
1557 if (typ == MFW_SS_HOLD)
1558 {
1559 cm_set_cmd_status(para.chld.mode, para.chld.call);
1560
1561 // Feb 27, 2006 REF:DR OMAPS00067884 x0039928
1562 // Fix : sAT_PercentCHLD() is called if the mode > CHLD_MOD_RelDialCall
1563 if(para.chld.mode > CHLD_MOD_RelDialCall)
1564 aci_result = sAT_PercentCHLD(CMD_SRC_LCL, para.chld.mode, para.chld.call);
1565 else
1566 aci_result = sAT_PlusCHLD(CMD_SRC_LCL, para.chld.mode, para.chld.call);
1567
1568 // Apr 26, 2004 REF: CRR 16545 Ajith K P
1569 // If sAT_PlusCHLD() Fails, Send the user entered string as USSD to network using sAT-Dn().
1570 // So if its not failed just return CM_CTRL_STR, otherwise call sAT_Dn().
1571 if ( (aci_result EQ AT_CMPL ) OR (aci_result EQ AT_EXCT ) OR (aci_result EQ AT_BUSY ))
1572 {
1573 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1574 // Fix: Free the memory allocated for buf, phone and num_save variables
1575 #ifdef FF_MMI_PB_OPTIM
1576 if(buf)
1577 mfwFree((U8*) buf,80);
1578 if(phone)
1579 mfwFree((U8*) phone,MFW_NUM_LEN);
1580 if(num_save)
1581 mfwFree((U8*) num_save,MFW_STRING_LEN);
1582 #endif
1583 return CM_CTRL_STR;
1584 }
1585 }
1586 //MC 11.04.02
1587 if (typ == MFW_SS_ECT)
1588 {
1589 cm_set_cmd_status(para.chld.mode, para.chld.call);
1590 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ect, 0) != AT_EXCT)
1591 {
1592 //Aug 10, 2005 REF: MMI-SPR-30099 x0018858
1593 //commented this return value.
1594 // return CM_ERROR;
1595 }
1596 else
1597 {
1598 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1599 // Fix: Free the memory allocated for buf,phone and num_save variables
1600 #ifdef FF_MMI_PB_OPTIM
1601 if(buf)
1602 mfwFree((U8*) buf,80);
1603 if(phone)
1604 mfwFree((U8*) phone,MFW_NUM_LEN);
1605 if(num_save)
1606 mfwFree((U8*) num_save,MFW_STRING_LEN);
1607 #endif
1608 return CM_CTRL_STR;
1609 }
1610 }
1611 //MC
1612
1613 if (typ == MFW_SS_DIAL_IDX)
1614 {
1615 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1616 // Fix: Free the memory allocated for buf,phone and num_save variables
1617 #ifdef FF_MMI_PB_OPTIM
1618 if(buf)
1619 mfwFree((U8*) buf,80);
1620 if(phone)
1621 mfwFree((U8*) phone,MFW_NUM_LEN);
1622 if(num_save)
1623 mfwFree((U8*) num_save,MFW_STRING_LEN);
1624 #endif
1625 return cm_mo_idx(&para, type);
1626 }
1627
1628 switch (typ)
1629 {
1630
1631 //NM
1632 case MFW_SS_CLIR: //jgg wrong not CM_OK should be CM_SS, however cm_grp not used after funtion callnumber called
1633
1634 case MFW_SS_DIAL:
1635 cm_grp = CM_OK;
1636 break;
1637
1638 case MFW_SS_DTMF:
1639 case MFW_SS_CF:
1640 case MFW_SS_CB:
1641 case MFW_SS_CLIP:
1642 case MFW_SS_COLR:
1643 case MFW_SS_COLP:
1644 case MFW_SS_WAIT:
1645 case MFW_SS_HOLD:
1646 case MFW_SS_CCBS:
1647 case MFW_SS_REG_PW:
1648 //Aug 10, 2005 REF: MMI-SPR-30099 x0018858
1649 //Added this case statement.
1650 case MFW_SS_ECT:
1651 cm_grp = CM_SS;
1652 break;
1653
1654 case MFW_SS_USSD:
1655 cm_grp = CM_USSD;
1656 break;
1657
1658 case MFW_SS_SIM_LOCK:
1659 case MFW_SS_SIM_REG_PW:
1660 case MFW_SS_SIM_UNBLCK_PIN:
1661 cm_grp = CM_SIM;
1662 break;
1663
1664 case MFW_SS_MMI:
1665 cm_grp = CM_MMI;
1666 break;
1667
1668 /* SPR#1352 - SH - TTY
1669 * If an SS string has been entered, temporarily enable or disable
1670 * TTY for this call only. */
1671
1672 case MFW_SS_TTY_NEXTCALL_ON:
1673 case MFW_SS_TTY_NEXTCALL_OFF:
1674 {
1675 if (typ==MFW_SS_TTY_NEXTCALL_ON)
1676 {
1677 cm_tty_enable(TRUE);
1678 }
1679 else
1680 {
1681 cm_tty_enable(FALSE);
1682 }
1683 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1684 #ifdef FF_MMI_PB_OPTIM
1685 strcpy(num_save, (num_save + 4)); /* Ignore SS string when dialling */
1686 #else
1687 strcpy((char *)num_save, (char *)&num_save[4]); /* Ignore SS string when dialling */
1688 #endif
1689 rest = (char *)&number[4]; /* Look at number following SS string */
1690 }
1691 break;
1692 /* SH end */
1693
1694 default:
1695 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1696 // Fix: Free the memory allocated for buf,phone and num_save variables
1697 #ifdef FF_MMI_PB_OPTIM
1698 if(buf)
1699 mfwFree((U8*) buf,80);
1700 if(phone)
1701 mfwFree((U8*) phone,MFW_NUM_LEN);
1702 if(num_save)
1703 mfwFree((U8*) num_save,MFW_STRING_LEN);
1704 #endif
1705 return CM_ERROR;
1706 }
1707
1708 string = rest;
1709
1710 colr_status = 0;
1711 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1712 #ifndef FF_MMI_PB_OPTIM
1713 buf[0] = '\0';
1714 #endif
1715 cc_stat.prefix[0] = '\0';
1716 while(strlen(string))
1717 {
1718 TRACE_EVENT("In the while");
1719 new_typ = ss_decode((UBYTE *)string, &rest, &para);
1720 // /*
1721 if (new_typ == MFW_SS_CLIR)
1722 {
1723
1724 if (para.Clir.mode == CLIR_MOD_Supp)
1725 {
1726 strcat((char *)cc_stat.prefix, "*31#");
1727 TRACE_EVENT ("CLIR_MOD_Supp");
1728 }
1729 if (para.Clir.mode == CLIR_MOD_Invoc)
1730 {
1731 strcat((char *)cc_stat.prefix, "#31#");
1732 TRACE_EVENT ("CLIR_MOD_Invoc");
1733 }
1734 }
1735 if (new_typ == MFW_SS_COLR)
1736 colr_status = 1;
1737 if (new_typ == MFW_SS_DIAL)
1738 {
1739 TRACE_EVENT("It's a dial");
1740 /* SPR#1352 - SH - only copy string to dial, not whole string */
1741 if (typ==MFW_SS_TTY_NEXTCALL_ON || typ==MFW_SS_TTY_NEXTCALL_OFF)
1742 {
1743 typ = new_typ;
1744 TRACE_EVENT_P1("phone now holds: %s", phone);
1745 }
1746 else
1747 /* end SH */
1748 {
1749 typ = new_typ;
1750 mfwStrncpy((char *)phone, para.dial.number, MFW_NUM_LEN);
1751 }
1752 }
1753 string = rest;
1754 }
1755
1756 if (!colr_status AND (typ == MFW_SS_DIAL))
1757 {
1758 prefix = cli_prefix & 0xc0;
1759 if (prefix == 0x80)
1760 {
1761 strcat(buf, "*77#");
1762 strcat((char *)cc_stat.prefix, "*77#");
1763 }
1764 if (prefix == 0xc0)
1765 {
1766 strcat(buf, "#77#");
1767 strcat((char *)cc_stat.prefix, "#77#");
1768 }
1769 }
1770
1771 if (typ == MFW_SS_DIAL)
1772 {
1773 res = (T_ACI_RETURN)cm_check_mo_number((UBYTE*)phone); /*a0393213 lint warnings removal - typecast done*/
1774 if ( res != CM_OK)
1775 {
1776 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1777 // Fix: Free the memory allocated for buf,phone and num_save variables
1778 #ifdef FF_MMI_PB_OPTIM
1779 if(buf)
1780 mfwFree((U8*) buf,80);
1781 if(phone)
1782 mfwFree((U8*) phone,MFW_NUM_LEN);
1783 if(num_save)
1784 mfwFree((U8*) num_save,MFW_STRING_LEN);
1785 #endif
1786 return res;
1787 }
1788
1789 /* set the outgoing call status */
1790 call_stat = OUTGOING_CALL;
1791 redial_count = 0;
1792 cc_stat.type = OUTGOING_CALL;
1793 cm_grp = CM_OK;
1794 currConnecting = 1;
1795 cm_set_call_mode(type);
1796 }
1797
1798 strcat(buf, (char *)num_save);
1799 if (cm_search_callId(CAL_STAT_Active, &id) EQ CM_OK)
1800 {
1801 /*
1802 * at least one active, this must be put on hold
1803 * by ACI first, then dial
1804 */
1805 cm_set_cmd_status(CHLD_MOD_HldActDial, "");
1806 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
1807 cc_id = id;
1808 #endif
1809 }
1810 if (type == DATA_CALL)
1811 para.dial.callType = D_TOC_Data;
1812
1813 // Apr 22, 2004 REF: CRR MMI-SPR-16873 Rashmi C N(Sasken)
1814 // Using the CLIR status maintained in the flash, while making a call
1815 if (!FFS_flashData.CLIR)
1816 {
1817 res = sAT_Dn(CMD_SRC_LCL, buf, D_CLIR_OVRD_Supp, D_CUG_CTRL_NotPresent, para.dial.callType); /*a0393213 compiler warning removal-- -1 changed to D_CUG_CTRL_NotPresent*/
1818 }
1819 else
1820 {
1821 res = sAT_Dn(CMD_SRC_LCL, buf, D_CLIR_OVRD_Invoc, D_CUG_CTRL_NotPresent, para.dial.callType); /*a0393213 compiler warning removal-- -1 changed to D_CUG_CTRL_NotPresent*/
1822 }
1823
1824 if ((res == AT_FAIL) OR (res == AT_BUSY))
1825 {
1826 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1827 // Fix: Free the memory allocated for buf,phone and num_save variables
1828 #ifdef FF_MMI_PB_OPTIM
1829 if(buf)
1830 mfwFree((U8*) buf,80);
1831 if(phone)
1832 mfwFree((U8*) phone,MFW_NUM_LEN);
1833 if(num_save)
1834 mfwFree((U8*) num_save,MFW_STRING_LEN);
1835 #endif
1836 if (typ == MFW_SS_CLIP)
1837 return CM_CLI;
1838
1839 call_stat = MFW_CALL_FREE;
1840 return cm_error_code(AT_CMD_D);
1841 }
1842 if (res == AT_CMPL)
1843 {
1844 switch (typ)
1845 {
1846 case MFW_SS_CLIR:
1847 case MFW_SS_CLIP:
1848 case MFW_SS_COLR:
1849 case MFW_SS_COLP:
1850 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1851 // Fix: Free the memory allocated for buf,phone and num_save variables
1852 #ifdef FF_MMI_PB_OPTIM
1853 if(buf)
1854 mfwFree((U8*) buf,80);
1855 if(phone)
1856 mfwFree((U8*) phone,MFW_NUM_LEN);
1857 if(num_save)
1858 mfwFree((U8*) num_save,MFW_STRING_LEN);
1859 #endif
1860 return CM_CLI;
1861 default:
1862 break;
1863 }
1864 }
1865 // Sep 01, 2006 REF:OMAPS00090555 x0039928
1866 // Fix: Free the memory allocated for buf,phone and num_save variables
1867 #ifdef FF_MMI_PB_OPTIM
1868 if(buf)
1869 mfwFree((U8*) buf,80);
1870 if(phone)
1871 mfwFree((U8*) phone,MFW_NUM_LEN);
1872 if(num_save)
1873 mfwFree((U8*) num_save,MFW_STRING_LEN);
1874 #endif
1875 return cm_grp;
1876 }
1877
1878
1879 /*
1880 +--------------------------------------------------------------------+
1881 | PROJECT: GSM-MFW (8417) MODULE: MFW_CB |
1882 | STATE : code ROUTINE: rAT_PlusCRING_OFF |
1883 +--------------------------------------------------------------------+
1884
1885
1886 PURPOSE : Alert Off indication from ACI
1887
1888 */
1889
1890 #ifdef FF_2TO1_PS
1891 GLOBAL void rAT_PlusCRING_OFF ( SHORT cId )
1892 {
1893 T_MFW_CM_CALL_STAT stat;
1894 UBYTE ton;
1895 T_CAUSE_ps_cause report; /* Marcus: Extended error reporting: 12/11/2002 */
1896 UBYTE mode;
1897
1898 TRACE_FUNCTION ("rAT_PlusCRING_OFF()");
1899
1900 if (cm_search_callStat(cId, &stat, &ton, &mode) == CM_OK)
1901 {
1902 call_stat = MFW_CALL_FREE;
1903 call_type = MFW_CALL_FREE;
1904
1905 //TISH: if there is inband tone, it should not disconnect the call. OMAPS00104986
1906 if (stat == CALL_DEACTIVE && !cm_cpi.inband)
1907 // if (stat == CALL_DEACTIVE)
1908 {
1909 dis_connect.call_number = cId;
1910
1911 qAT_PlusCEER( CMD_SRC_LCL, &report);
1912 /* Marcus: Extended error reporting: 12/11/2002: Start */
1913
1914 // TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
1915 if (report.ctrl_value != CAUSE_is_from_nwcc)
1916 {
1917 /* Treat Condat defined cause values as if no cause given */
1918 dis_connect.cause = NOT_PRESENT_8BIT;
1919 }
1920 else
1921 {
1922 /* Standards defined cause value is given */
1923 dis_connect.cause = report.value.nwcc_cause;
1924 }
1925 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
1926 /* Marcus: Extended error reporting: 12/11/2002: End */
1927 cm_signal(E_CM_DISCONNECT, &dis_connect);
1928 return;
1929 }
1930 cm_signal(E_CM_RING_OFF, 0);
1931 }
1932 }
1933 #else
1934 GLOBAL void rAT_PlusCRING_OFF ( SHORT cId )
1935 {
1936 T_MFW_CM_CALL_STAT stat;
1937 UBYTE ton;
1938 USHORT report; /* Marcus: Extended error reporting: 12/11/2002 */
1939 UBYTE mode;
1940
1941 TRACE_FUNCTION ("rAT_PlusCRING_OFF()");
1942
1943 if (cm_search_callStat(cId, &stat, &ton, &mode) == CM_OK)
1944 {
1945 call_stat = MFW_CALL_FREE;
1946 call_type = MFW_CALL_FREE;
1947
1948 //TISH: if there is inband tone, it should not disconnect the call. OMAPS00104986
1949 if (stat == CALL_DEACTIVE && !cm_cpi.inband)
1950 // if (stat == CALL_DEACTIVE)
1951 {
1952 dis_connect.call_number = cId;
1953
1954 qAT_PlusCEER( CMD_SRC_LCL, &report);
1955 /* Marcus: Extended error reporting: 12/11/2002: Start */
1956 TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
1957 if (GET_CAUSE_DEFBY(report) == DEFBY_CONDAT)
1958 {
1959 /* Treat Condat defined cause values as if no cause given */
1960 dis_connect.cause = NOT_PRESENT_8BIT;
1961 }
1962 else
1963 {
1964 /* Standards defined cause value is given */
1965 dis_connect.cause = GET_CAUSE_VALUE(report);
1966 }
1967 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
1968 /* Marcus: Extended error reporting: 12/11/2002: End */
1969 cm_signal(E_CM_DISCONNECT, &dis_connect);
1970 return;
1971 }
1972 cm_signal(E_CM_RING_OFF, 0);
1973 }
1974 }
1975 #endif
1976
1977 /*
1978 +--------------------------------------------------------------------+
1979 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
1980 | STATE : code ROUTINE : rAT_PlusCRING |
1981 +--------------------------------------------------------------------+
1982
1983
1984 PURPOSE : Alert indication from ACI
1985
1986 */
1987 /*a0393213 warnings removal - second and third parameter changed as a result of ACI enum change*/
1988 void rAT_PlusCRING(T_ACI_CRING_MOD mode,
1989 T_ACI_CRING_SERV_TYP type1,
1990 T_ACI_CRING_SERV_TYP type2)
1991 {
1992 SHORT call_number;
1993
1994 TRACE_FUNCTION ("rAT_PlusCRING()");
1995
1996 in_call.result = Present;
1997
1998 /* search the call identifier */
1999 if (cm_search_callId(CAL_STAT_Wait, &call_number) == CM_OK)
2000 in_call.call_number = call_number;
2001 else
2002 in_call.call_number = 0;
2003
2004 /* If redial is active, it must be stoped. */
2005 if (call_stat == REDIALING_CALL)
2006 {
2007 cm_stop_redialTim();
2008 rdl.redial_mode = CM_REDIAL_INCOMING;
2009 cm_signal(E_CM_REDIAL, &rdl);
2010 }
2011
2012 if (mode EQ CRING_MOD_Direct)
2013 {
2014 switch (type1)
2015 {
2016 /* Voice call */
2017 case CRING_SERV_TYP_Voice:
2018 if (type2 EQ CRING_SERV_TYP_NotPresent)
2019 {
2020 in_call.type = VOICE_CALL;
2021 cm_set_call_mode(VOICE_CALL);
2022 }
2023 else
2024 {
2025 switch (type2)
2026 {
2027 case CRING_SERV_TYP_Sync:
2028 case CRING_SERV_TYP_Async:
2029 case CRING_SERV_TYP_RelSync:
2030 case CRING_SERV_TYP_RelAsync:
2031 in_call.type = VFD_VOICE;
2032 cm_bc_parameter(type2);
2033 cm_set_call_mode(VFD_VOICE);
2034 break;
2035 /*MC, SPR 1026, check for line1 and line2*/
2036 case CRING_SERV_TYP_Voice:
2037 in_call.type = VOICE_CALL;
2038 cm_set_call_mode(VOICE_CALL);
2039 break;
2040 case CRING_SERV_TYP_AuxVoice:
2041 cm_set_call_mode(AuxVOICE_CALL);
2042 in_call.type = AuxVOICE_CALL;
2043 break;
2044 /*MC, end*/
2045 default:
2046 in_call.type = VOICE_CALL;
2047 cm_set_call_mode(VOICE_CALL);
2048 break;
2049 }
2050 }
2051 break;
2052 /*MC, SPR 1026, Added case of Type1=CRING_SERV_TYP_AuxVoice*/
2053 /*assuming line 2 is handled like line 1*/
2054 case CRING_SERV_TYP_AuxVoice:
2055 if (type2 EQ CRING_SERV_TYP_NotPresent)
2056 {
2057 in_call.type = AuxVOICE_CALL;
2058 cm_set_call_mode(AuxVOICE_CALL);
2059 }
2060 else
2061 {
2062 switch (type2)
2063 {
2064 case CRING_SERV_TYP_Sync:
2065 case CRING_SERV_TYP_Async:
2066 case CRING_SERV_TYP_RelSync:
2067 case CRING_SERV_TYP_RelAsync:
2068 in_call.type = VFD_VOICE;
2069 cm_bc_parameter(type2);
2070 cm_set_call_mode(VFD_VOICE);
2071 break;
2072 case CRING_SERV_TYP_Voice:
2073 in_call.type = VOICE_CALL;
2074 cm_set_call_mode(VOICE_CALL);
2075 break;
2076 case CRING_SERV_TYP_AuxVoice:
2077 cm_set_call_mode(AuxVOICE_CALL);
2078 in_call.type = AuxVOICE_CALL;
2079 break;
2080 default:
2081 in_call.type = VOICE_CALL;
2082 cm_set_call_mode(VOICE_CALL);
2083 break;
2084 }
2085 }
2086 break;
2087 /*MC, end*/
2088 /* Data call */
2089 case CRING_SERV_TYP_Sync:
2090 case CRING_SERV_TYP_Async:
2091 case CRING_SERV_TYP_RelSync:
2092 case CRING_SERV_TYP_RelAsync:
2093 in_call.type = DATA_CALL;
2094 cm_bc_parameter(type1);
2095 cm_set_call_mode(DATA_CALL);
2096 break;
2097
2098 case CRING_SERV_TYP_Fax:
2099 in_call.type = FAX_CALL;
2100 in_call.bc1.conn_elem = Transparent;
2101 cm_set_call_mode(FAX_CALL);
2102 break;
2103
2104 default:
2105 in_call.result = NotPresent;
2106 break;
2107 }
2108 call_stat = INCOMING_CALL;
2109 }
2110
2111 if (mode EQ CRING_MOD_Alternate)
2112 {
2113 cm_build_callType(type1, type2);
2114 cm_bc_parameter(type1);
2115 cm_bc_parameter(type2);
2116 cm_set_call_mode(in_call.type);
2117 }
2118 }
2119
2120
2121 /*
2122 +--------------------------------------------------------------------+
2123 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
2124 | STATE : code ROUTINE: rAT_PlusCLIP |
2125 +--------------------------------------------------------------------+
2126
2127
2128 PURPOSE : The calling line identification for an incomming call.
2129
2130 */
2131
2132 #ifdef NO_ASCIIZ
2133 void rAT_PlusCLIP(T_ACI_CLIP_STAT stat,
2134 CHAR * number,
2135 T_ACI_TOA * type,
2136 U8 validity,
2137 CHAR * subaddr,
2138 T_ACI_TOS * satype,
2139 T_ACI_PB_TEXT * alpha)
2140 {
2141 int flag;
2142
2143 TRACE_FUNCTION ("rAT_PlusCLIP()");
2144
2145 flag = 0;
2146
2147 if (number != NULL)
2148 {
2149 mfwStrncpy((char *)in_call.number, (char *)number, MFW_NUM_LEN);
2150 in_call.ton = phb_cvtTon(type->ton);
2151 flag = 1;
2152 }
2153 else
2154 memset(in_call.number, '\0', MFW_NUM_LEN);
2155
2156 if (alpha != NULL)
2157 {
2158 in_call.name.len = alpha->len;
2159 if (alpha->len)
2160 {
2161 memcpy(in_call.name.data,
2162 alpha->data,
2163 alpha->len);
2164 flag = 1;
2165 }
2166 }
2167 else
2168 in_call.name.len = 0;
2169
2170
2171 if (subaddr != NULL)
2172 {
2173 mfwStrncpy((char *)in_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
2174 flag = 1;
2175 }
2176 else
2177 memset(in_call.subaddr, '\0', MFW_SUBADR_LEN);
2178
2179 if (flag == 1)
2180 in_call.result = Present;
2181 else
2182 in_call.result = 0;
2183
2184 cm_signal(E_CM_CW, &in_call);
2185 }
2186
2187 #else
2188
2189 void rAT_PlusCLIP(T_ACI_CLIP_STAT stat,
2190 CHAR * number,
2191 T_ACI_TOA * type,
2192 U8 validity,
2193 CHAR * subaddr,
2194 T_ACI_TOS * satype,
2195 CHAR * alpha)
2196 {
2197 int flag;
2198
2199 TRACE_FUNCTION ("rAT_PlusCLIP()");
2200
2201 flag = 0;
2202 // in_call.result = 0;
2203
2204 if (number != NULL)
2205 {
2206 mfwStrncpy((char *)in_call.number, (char *)number, MFW_NUM_LEN);
2207 in_call.ton = phb_cvtTon(type->ton);
2208 flag = 1;
2209 }
2210 else
2211 memset(in_call.number, '\0', MFW_NUM_LEN);
2212
2213 if (alpha != NULL)
2214 {
2215 mfwStrncpy((char *)in_call.name, (char *)alpha, MFW_TAG_LEN);
2216 flag = 1;
2217 }
2218 else
2219 memset(in_call.name, '\0', MFW_TAG_LEN);
2220
2221 if (subaddr != NULL)
2222 {
2223 mfwStrncpy((char *)in_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
2224 flag = 1;
2225 }
2226 else
2227 memset(in_call.subaddr, '\0', MFW_SUBADR_LEN);
2228
2229 if (flag == 1)
2230 in_call.result = Present;
2231 else
2232 in_call.result = 0;
2233
2234 cm_signal(E_CM_CW, &in_call);
2235 }
2236 #endif
2237
2238 /*
2239 +--------------------------------------------------------------------+
2240 | PROJECT : GSM-MFW (8417) MODULE : MFW_CM |
2241 | STATE : code ROUTINE : rAT_PlusCOLP |
2242 +--------------------------------------------------------------------+
2243
2244
2245 PURPOSE : Connected line presentation indication from ACI
2246
2247 */
2248
2249 #ifdef NO_ASCIIZ
2250 GLOBAL void rAT_PlusCOLP ( T_ACI_COLP_STAT stat,
2251 CHAR* number,
2252 T_ACI_TOA* type,
2253 CHAR* subaddr,
2254 T_ACI_TOS* satype,
2255 T_ACI_PB_TEXT* alpha)
2256 {
2257
2258 TRACE_FUNCTION ("rAT_PlusCOLP()");
2259
2260 if (number != NULL)
2261 {
2262 mfwStrncpy((char *)out_call.number, (char *)number, MFW_NUM_LEN);
2263 out_call.ton = phb_cvtTon(type->ton);
2264 }
2265 else
2266 memset(out_call.number, '\0', MFW_NUM_LEN);
2267
2268 /*NM, p001 */
2269 if(alpha != NULL)
2270 /*NM, p001 end */
2271 {
2272 out_call.name.len = MINIMUM(alpha->len, MFW_TAG_LEN);
2273 if (alpha->len)
2274 memcpy(out_call.name.data,
2275 alpha->data,
2276 alpha->len);
2277 }
2278
2279 if (subaddr != NULL)
2280 mfwStrncpy((char *)out_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
2281 else
2282 memset(out_call.subaddr, '\0', MFW_SUBADR_LEN);
2283
2284 if (number != NULL)
2285 cm_signal(E_CM_COLP, &out_call);
2286 }
2287
2288 #else
2289
2290 GLOBAL void rAT_PlusCOLP ( T_ACI_COLP_STAT stat,
2291 CHAR* number,
2292 T_ACI_TOA* type,
2293 CHAR* subaddr,
2294 T_ACI_TOS* satype,
2295 CHAR* alpha)
2296 {
2297 TRACE_FUNCTION ("rAT_PlusCOLP()");
2298
2299 // patch PMA 15 06 99 from Andreas
2300 // if (stat == -1)
2301 // return;
2302
2303 if (number != NULL)
2304 {
2305 mfwStrncpy((char *)out_call.number, (char *)number, MFW_NUM_LEN);
2306 out_call.ton = phb_cvtTon(type->ton);
2307 }
2308 else
2309 memset(out_call.number, '\0', MFW_NUM_LEN);
2310
2311 if (alpha != NULL)
2312 mfwStrncpy((char *)out_call.name, (char *)alpha, MFW_TAG_LEN);
2313 else
2314 memset(out_call.name, '\0', MFW_TAG_LEN);
2315
2316 if (subaddr != NULL)
2317 mfwStrncpy((char *)out_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
2318 else
2319 memset(out_call.subaddr, '\0', MFW_SUBADR_LEN);
2320
2321 // patch PMA 15 06 99 from Andreas
2322 if (number != NULL)
2323 cm_signal(E_CM_COLP, &out_call);
2324 }
2325 #endif
2326
2327 /*
2328 +--------------------------------------------------------------------+
2329 | PROJECT : GSM-MFW (8417) MODULE : MFW_CM |
2330 | STATE : code ROUTINE : rAT_PlusCCWA |
2331 +--------------------------------------------------------------------+
2332
2333
2334 PURPOSE : Connected line presentation indication from ACI
2335
2336 */
2337
2338 #ifdef NO_ASCIIZ
2339
2340 GLOBAL void rAT_PlusCCWA ( T_ACI_CLSSTAT * clsStatLst,
2341 CHAR * number,
2342 T_ACI_TOA * type,
2343 U8 validity,
2344 T_ACI_CLASS call_class,
2345 T_ACI_PB_TEXT * alpha)
2346 {
2347 SHORT call_number;
2348
2349 TRACE_FUNCTION("rAT_PlusCCWA()");
2350
2351 in_call.result = NotPresent;
2352 if (clsStatLst == 0)
2353 {
2354 if (number != NULL)
2355 {
2356 mfwStrncpy((char *)in_call.number, (char *)number, MFW_NUM_LEN);
2357 in_call.ton = phb_cvtTon(type->ton);
2358 }
2359 else
2360 memset(in_call.number, '\0', MFW_NUM_LEN);
2361
2362 if (alpha != NULL)
2363 in_call.name.len = alpha->len;
2364 else
2365 in_call.name.len = 0;
2366
2367 if (in_call.name.len && alpha!=NULL) /*a0393213 lint warning removal - check for alpha done*/
2368 {
2369 memcpy(in_call.name.data,
2370 alpha->data,
2371 alpha->len);
2372 }
2373
2374 in_call.type = cm_callTyp_cvt(call_class);
2375
2376 if (number != 0 || in_call.name.len != 0 || in_call.type != NONE_TYPE)
2377 in_call.result = Present;
2378
2379 cm_search_callId(CAL_STAT_Wait, &call_number);
2380 in_call.call_number = call_number;
2381
2382 cm_signal(E_CM_CW, &in_call);
2383 }
2384 }
2385
2386 #else
2387
2388 GLOBAL void rAT_PlusCCWA ( T_ACI_CLSSTAT * clsStatLst,
2389 CHAR * number,
2390 T_ACI_TOA * type,
2391 U8 validity,
2392 T_ACI_CLASS call_class,
2393 CHAR * alpha)
2394 {
2395 SHORT call_number;
2396
2397 in_call.result = NotPresent;
2398 if (clsStatLst == 0)
2399 {
2400 if (number != NULL)
2401 {
2402 mfwStrncpy((char *)in_call.number, (char *)number, MFW_NUM_LEN);
2403 in_call.ton = phb_cvtTon(type->ton);
2404 }
2405 else
2406 memset(in_call.number, '\0', MFW_NUM_LEN);
2407
2408 if (alpha != NULL)
2409 mfwStrncpy((char *)in_call.name, (char *)alpha, MFW_TAG_LEN);
2410 else
2411 memset(in_call.name, '\0', MFW_TAG_LEN);
2412
2413 in_call.type = cm_callTyp_cvt(call_class);
2414
2415 if (number != 0 || alpha != 0 || in_call.type != NONE_TYPE)
2416 in_call.result = Present;
2417
2418 cm_search_callId(CAL_STAT_Wait, &call_number);
2419 in_call.call_number = call_number;
2420
2421 cm_signal(E_CM_CW, &in_call);
2422 }
2423 }
2424 #endif
2425
2426 /*
2427 +--------------------------------------------------------------------+
2428 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
2429 | STATE : code ROUTINE : cm_mt_reject |
2430 +--------------------------------------------------------------------+
2431
2432
2433 PURPOSE : Reject the incoming call.
2434
2435 */
2436
2437 void cm_mt_reject()
2438 {
2439 TRACE_FUNCTION ("cm_mt_reject()");
2440
2441 if (currAccepting)
2442 {
2443 currAccepting = 0; /* ES!! 210999 */
2444 sAT_Abort(CMD_SRC_LCL, AT_CMD_A);
2445 return;
2446 }
2447
2448 cmd_hold = MFW_CM_MT_REJECT;
2449 cm_search_callId(CAL_STAT_Wait, &dis_connect.call_number);
2450 sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelHldOrUdub, 0);
2451 }
2452
2453
2454 /*
2455 +--------------------------------------------------------------------+
2456 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
2457 | STATE : code ROUTINE: cm_mt_accept |
2458 +--------------------------------------------------------------------+
2459
2460
2461 PURPOSE : Accept the incoming call. If the active call exists,
2462 place this active call on hold and accepts the
2463 waiting call.
2464
2465 */
2466
2467 void cm_mt_accept()
2468 {
2469 SHORT call_number;
2470 T_MFW_CM_CALL_STAT stat; /* SPR#1983 - SH */
2471 UBYTE ton;
2472 UBYTE mode;
2473
2474 TRACE_FUNCTION ("cm_mt_accept()");
2475
2476 if (cm_search_callId(CAL_STAT_Active, &call_number) != CM_OK)
2477 {
2478 if (sAT_A(CMD_SRC_LCL) NEQ AT_EXCT)
2479 {
2480 TRACE_ERROR("sAT_A error");
2481 }
2482 else
2483 {
2484 currAccepting = 1; /* ES!! 210999 */
2485 }
2486 }
2487 else
2488 {
2489 cmd_hold = MFW_CM_MT_ACCEPT;
2490
2491 /* SPR#1983 - SH - Get status of active call */
2492
2493 cm_search_callStat(call_number, &stat, &ton, &mode);
2494 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
2495 if (cm_search_callId(CAL_STAT_Wait, &call_number) EQ CM_OK)
2496 cc_id = call_number;
2497 #else
2498 cm_search_callId(CAL_STAT_Wait, &call_number);
2499 #endif
2500 /* SPR#1983 - SH - If data call is active, end it and accept other call */
2501
2502 if (mode==DATA_CALL)
2503 {
2504 /*
2505 * Accepting a call when there is an active data call,
2506 * so drop the active call and accept the waiting call by the
2507 * equivalent of the AT+CHLD=1 command.
2508 */
2509 cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, "");
2510 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, 0) NEQ AT_EXCT)
2511 {
2512 TRACE_ERROR("sAT_PlusCHLD(CHLD_MOD_RelActAndAcpt) error");
2513 }
2514 }
2515
2516 else /* SPR#1983 - SH - Important! Acts on next 'if' */
2517
2518 /* Marcus: issue 1049: 03/09/2002: Start */
2519 if (cm_search_callId(CAL_STAT_Held, &call_number) EQ CM_OK)
2520 {
2521 /*
2522 * Accepting a call when there is already an active call and a held
2523 * call, so drop the active call and accept the waiting call by the
2524 * equivalent of the AT+CHLD=1 command.
2525 */
2526 cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, "");
2527 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, 0) NEQ AT_EXCT)
2528 {
2529 TRACE_ERROR("sAT_PlusCHLD(CHLD_MOD_RelActAndAcpt) error");
2530 }
2531 }
2532 else
2533 {
2534 /*
2535 * Accepting a call when there is already an active call but no held
2536 * call, so hold the active call and accept the waiting call by the
2537 * equivalent of the AT+CHLD=2 command.
2538 */
2539 cm_set_cmd_status(CHLD_MOD_HldActAndAcpt, "");
2540 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, 0) NEQ AT_EXCT)
2541 {
2542 TRACE_ERROR("sAT_PlusCHLD(CHLD_MOD_HldActAndAcpt) error");
2543 }
2544 }
2545 /* Marcus: issue 1049: 03/09/2002: End */
2546 }
2547 }
2548
2549
2550 /*
2551 +--------------------------------------------------------------------+
2552 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
2553 | STATE : code ROUTINE : cm_end_all |
2554 +--------------------------------------------------------------------+
2555
2556
2557 PURPOSE : End all calls (Held and Active)
2558
2559 */
2560
2561 void cm_end_all(void)
2562 {
2563 T_ACI_RETURN aci_res; // The value returned by sAT_H
2564
2565 TRACE_EVENT("cm_end_all()");
2566
2567 aci_res = sAT_H(CMD_SRC_LCL);
2568
2569 if (aci_res == AT_EXCT)
2570 {
2571 TRACE_EVENT("sAT_H returned AT_EXCT");
2572 cmd_hold = MFW_CM_DISCONNECT_ALL;
2573 }
2574 else
2575 {
2576 TRACE_EVENT_P1("sAT_H returned %d", aci_res);
2577 }
2578 return;
2579 }
2580
2581
2582
2583 // Apr 26 2006, a0393213 (Prabakar R), OMAPS00074886 : No option in MMI to release the held call.
2584 // This function is added to release all held calls
2585
2586 /*******************************************************************************
2587
2588 $Function: cm_end_held
2589
2590 $Description: End held calls
2591
2592 $Returns: void
2593
2594 $Arguments: void
2595
2596 *******************************************************************************/
2597
2598 void cm_end_held(void)
2599 {
2600 T_ACI_RETURN aci_res; // The value returned by sAT_PlusCHLD
2601
2602 TRACE_EVENT("cm_end_held()");
2603
2604 aci_res = sAT_PlusCHLD(CMD_SRC_LCL,CHLD_MOD_RelHldOrUdub,NULL);
2605
2606 if (aci_res == AT_FAIL)
2607 {
2608 TRACE_EVENT("sAT_PlusCHLD returned AT_FAIL");
2609 }
2610
2611 return;
2612 }
2613
2614
2615 /*
2616 +--------------------------------------------------------------------+
2617 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
2618 | STATE : code ROUTINE : cm_ok_connect |
2619 +--------------------------------------------------------------------+
2620
2621
2622 PURPOSE : The connect is successful.
2623
2624 */
2625
2626 void cm_ok_connect(void)
2627 {
2628 SHORT call_number;
2629
2630 TRACE_FUNCTION ("cm_ok_connect()");
2631
2632 currAccepting = 0; /* ES!! 210999 */
2633 currConnecting = 0; /* ES!! 290999 */
2634
2635 if (cc_stat.type == REDIALING_CALL)
2636 {
2637 rdl.redial_mode = CM_REDIAL_SUCCESS;
2638 cm_signal(E_CM_REDIAL, &rdl);
2639 }
2640
2641 cm_search_callId(CAL_STAT_Active, &call_number);
2642
2643 /* allow a new outgoing */
2644 call_stat = MFW_CALL_FREE;
2645 call_type = MFW_CALL_FREE;
2646 cmd_hold = MFW_CM_NO_FLAG;
2647
2648 cm_signal(E_CM_CONNECT_ACK, &call_number);
2649 }
2650
2651
2652 /*
2653 +--------------------------------------------------------------------+
2654 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
2655 | STATE : code ROUTINE : cm_rmt_ok_connect |
2656 +--------------------------------------------------------------------+
2657
2658
2659 PURPOSE : The connect is successful.
2660
2661 */
2662
2663 void cm_rmt_ok_connect()
2664 {
2665 SHORT call_number;
2666
2667 TRACE_FUNCTION ("cm_rmt_ok_connect()");
2668
2669 cm_search_callId(CAL_STAT_Active, &call_number);
2670
2671 cm_signal(E_CM_CONNECT_ACK, &call_number);
2672 }
2673
2674
2675 /*
2676 +--------------------------------------------------------------------+
2677 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
2678 | STATE : code ROUTINE : cm_error_connect |
2679 +--------------------------------------------------------------------+
2680
2681
2682 PURPOSE : The connection is not successful
2683
2684 */
2685
2686 #ifdef FF_2TO1_PS
2687 void cm_error_connect(SHORT call_number)
2688 {
2689 int i;
2690 T_CAUSE_ps_cause report; /* Marcus: Extended error reporting: 12/11/2002 */
2691 USHORT extend_report; /* API - 1564 - 16-01-03 - add this variable to store the new error code */
2692
2693 TRACE_FUNCTION ("cm_error_connect()");
2694
2695 currAccepting = 0; /* ES!! 210999 */
2696 currConnecting = 0; /* ES!! 290999 */
2697
2698 /* send event */
2699 dis_connect.call_number = call_number;
2700
2701 qAT_PlusCEER( CMD_SRC_LCL, &report);
2702 /* Marcus: Extended error reporting: 12/11/2002: Start */
2703 // TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
2704
2705 /* API - 1564 - 16-01-03 - store the error value to the new variable & throughout this function replace 'report' with 'extend_report */
2706 extend_report = report.value.nwcc_cause;
2707
2708 if (report.ctrl_value != CAUSE_is_from_nwcc)
2709 {
2710 /* Treat Condat defined cause values as if no cause given */
2711 dis_connect.cause = NOT_PRESENT_8BIT;
2712 }
2713 else
2714 {
2715 /* Standards defined cause value is given */
2716 dis_connect.cause = report.value.nwcc_cause;
2717 }
2718 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
2719 /* Marcus: Extended error reporting: 12/11/2002: End */
2720 cm_signal(E_CM_DISCONNECT, &dis_connect);
2721 TRACE_EVENT("passed the E_CM_DISCONNECT point");
2722
2723 if ((call_stat EQ OUTGOING_CALL)
2724 AND (call_type NEQ MFW_ECC_CALL)
2725 AND ((redial_stat EQ CM_REDIAL_AUTO) OR (redial_stat EQ CM_REDIAL_MANU)))
2726 {
2727 /* If this call is 2nd outgoing call, redial is not started */
2728 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
2729 {
2730 for (i=0; i<MAX_CALL_NR; i++)
2731 {
2732 if (call_tab[i].index == -1)
2733 break;
2734
2735 if ((call_tab[i].status == CAL_STAT_NotPresent)
2736 OR (call_tab[i].status == CAL_STAT_DeactiveReq))
2737 continue;
2738
2739 if (call_tab[i].calType == CAL_TYPE_MOC)
2740 {
2741 call_stat = MFW_CALL_FREE;
2742 call_type = MFW_CALL_FREE;
2743 cmd_hold = MFW_CM_NO_FLAG;
2744 return;
2745 }
2746 }
2747 }
2748
2749 /* check blacklist whether it is full */
2750 if (black_list.count == MAX_BLACKLIST_NUM)
2751 {
2752 TRACE_EVENT ("blacklist is now full");
2753
2754 /* Blacklist is now full and
2755 MT shall prohibit further automatic call attempts
2756 */
2757 redial_stat = CM_REDIAL_OFF;
2758
2759
2760 /* allow a new outgoing */
2761 call_stat = MFW_CALL_FREE;
2762 call_type = MFW_CALL_FREE;
2763 cc_stat.type = MFW_CALL_FREE;
2764
2765 rdl.redial_mode = CM_REDIAL_BLACKLIST;
2766 cm_signal(E_CM_REDIAL, &rdl);
2767 return;
2768 }
2769
2770 /* check the registration staus */
2771 if (nm_reg_status() == MFW_NO_SERVICE)
2772 {
2773 call_stat = MFW_CALL_FREE;
2774 call_type = MFW_CALL_FREE;
2775 cc_stat.type = MFW_CALL_FREE;
2776
2777 rdl.redial_mode = CM_REDIAL_NO_SERVICE;
2778 cm_signal(E_CM_REDIAL, &rdl);
2779 return;
2780 }
2781
2782 TRACE_EVENT_P1("report = %d", extend_report);
2783 switch (extend_report)
2784 {
2785 case 28:
2786 // API - 1480 - Added this code to stop redial on an incorrect number
2787 if(!redial_count)
2788 {
2789 call_stat = MFW_CALL_FREE;
2790 call_type = MFW_CALL_FREE;
2791 cc_stat.type = MFW_CALL_FREE;
2792
2793 rdl.redial_mode = CM_REDIAL_ABORTED;
2794 cm_signal(E_CM_REDIAL, &rdl);
2795 return;
2796 }
2797 case 1: /* check whether the reason is in category 3 (GSM 02.07) */
2798 case 3:
2799 case 22:
2800 case 38:
2801 TRACE_EVENT ("category 3");
2802 if (!redial_count)
2803 {
2804 /* redial_count == 0;
2805 this is for the first outgoing call and
2806 now it is going to start the Auto-redial procedure
2807 */
2808 cc_stat.type = REDIALING_CALL;
2809 cc_stat.call_number = 0;
2810
2811 call_stat = REDIALING_CALL;
2812 rdl.redial_mode = CM_REDIAL_STARTED;
2813 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
2814
2815 #ifdef NO_ASCIIZ
2816 rdl.name.len = cc_stat.name.len;
2817 memcpy(rdl.name.data,
2818 cc_stat.name.data,
2819 cc_stat.name.len);
2820 #else
2821 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
2822 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
2823 #endif
2824 rdl.ton = cc_stat.ton;
2825 rdl.type = cc_stat.mode;
2826
2827 /* reasons in the category 3 have
2828 a call repeat attempts of max. 1 !
2829 */
2830 redial_count = MAX_REDIAL_ATTEMPT-1;
2831 cm_signal(E_CM_REDIAL, &rdl);
2832 return;
2833 }
2834 else
2835 redial_count = MAX_REDIAL_ATTEMPT;
2836 break;
2837
2838 case 17: /* check whether the reason is in category 1 and 2 (GSM 02.07) */
2839 case 18:
2840 case 19:
2841 case 27:
2842 case 34:
2843 case 41:
2844 case 42:
2845 case 44:
2846 case 47:
2847 TRACE_EVENT ("category 1 & 2");
2848 if (!redial_count)
2849 {
2850 /* redial_count == 0
2851 this is for the first outgoing call and
2852 now it is going to start the Auto-redial procedure
2853 */
2854 cc_stat.type = REDIALING_CALL;
2855 cc_stat.call_number = 0;
2856
2857 call_stat = REDIALING_CALL;
2858 rdl.redial_mode = CM_REDIAL_STARTED;
2859 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
2860 #ifdef NO_ASCIIZ
2861 rdl.name.len = cc_stat.name.len;
2862 memcpy(rdl.name.data,
2863 cc_stat.name.data,
2864 cc_stat.name.len);
2865 #else
2866 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
2867 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
2868 #endif
2869 rdl.ton = cc_stat.ton;
2870 rdl.type = cc_stat.mode;
2871
2872 /* reasons in the category 1 and 2 have
2873 a call repeat attempts of max. 10 !
2874 */
2875
2876 cm_signal(E_CM_REDIAL, &rdl);
2877 return;
2878 }
2879
2880 if (redial_count >= 1 AND redial_count <= 3)
2881 {
2882 timStart(redialTim24);
2883 call_stat = REDIALING_CALL;
2884 cc_stat.call_number = 0;
2885 return;
2886 }
2887
2888 if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
2889 {
2890 timStart(redialTim5);
2891 call_stat = REDIALING_CALL;
2892 cc_stat.call_number = 0;
2893 return;
2894 }
2895 #ifdef CUSTOMER_6366
2896 // JP PATCH The MMI needs to know if the 'error disconnect' has
2897 // resulted in redial starting irrespective of whether this was a redial attempt or not
2898 rdl.redial_mode = CM_REDIAL_STARTED;
2899 cm_signal(E_CM_REDIAL, &rdl);
2900 // END JP PATCH
2901 #endif /* CUSTOMER_6366 */
2902 break;
2903
2904 default:
2905 if (redial_count)
2906 {
2907 rdl.redial_mode = CM_REDIAL_STOP;
2908 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
2909 #ifdef NO_ASCIIZ
2910 rdl.name.len = cc_stat.name.len;
2911 memcpy(rdl.name.data,
2912 cc_stat.name.data,
2913 cc_stat.name.len);
2914 #else
2915 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);//???
2916 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
2917 #endif
2918 rdl.ton = cc_stat.ton;
2919 rdl.type = cc_stat.mode;
2920 cm_signal(E_CM_REDIAL, &rdl);
2921 }
2922 /* allow a new outgoing */
2923 call_stat = MFW_CALL_FREE;
2924 call_type = MFW_CALL_FREE;
2925 cc_stat.type = MFW_CALL_FREE;
2926 return;
2927 }
2928
2929 if (redial_count >= MAX_REDIAL_ATTEMPT
2930 AND black_list.count < MAX_BLACKLIST_NUM)
2931 {
2932 mfwStrncpy((char *)black_list.number[black_list.count],
2933 (char *)cc_stat.number, MFW_NUM_LEN);
2934 black_list.count++;
2935
2936 rdl.redial_mode = CM_REDIAL_BLACKLISTED;
2937 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
2938 #ifdef NO_ASCIIZ
2939 rdl.name.len = cc_stat.name.len;
2940 memcpy(rdl.name.data,
2941 cc_stat.name.data,
2942 cc_stat.name.len);
2943 #else
2944 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
2945 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
2946 #endif
2947 rdl.ton = cc_stat.ton;
2948 rdl.type = cc_stat.mode;
2949 rdl.left_attempts = 0;
2950 cc_stat.call_number = 0;
2951 cm_signal(E_CM_REDIAL, &rdl);
2952 }
2953 }
2954
2955 /* allow a new outgoing */
2956 call_stat = MFW_CALL_FREE;
2957 call_type = MFW_CALL_FREE;
2958 cc_stat.type = MFW_CALL_FREE;
2959 }
2960 #else
2961 void cm_error_connect(SHORT call_number)
2962 {
2963
2964 int i;
2965 USHORT report; /* Marcus: Extended error reporting: 12/11/2002 */
2966 USHORT extend_report; /* API - 1564 - 16-01-03 - add this variable to store the new error code */
2967 // Apr 06 2005 REF: CRR 29989 xpradipg
2968 // local definition
2969 #ifdef FF_MMI_OPTIM
2970 T_ACI_CAL_ENTR *call_tab;//[MAX_CALL_NR];
2971 #endif
2972 // Apr 14, 2005 REF: CRR 29991 xpradipg
2973 // local definition
2974 #ifdef FF_MMI_OPTIM
2975 UBYTE count=0;
2976 UBYTE blackListNum[MFW_NUM_LEN];
2977 int32 file = 0;
2978 #endif
2979 TRACE_FUNCTION ("cm_error_connect()");
2980
2981 currAccepting = 0; /* ES!! 210999 */
2982 currConnecting = 0; /* ES!! 290999 */
2983
2984 /* send event */
2985 dis_connect.call_number = call_number;
2986
2987 qAT_PlusCEER( CMD_SRC_LCL, &report);
2988 /* Marcus: Extended error reporting: 12/11/2002: Start */
2989 TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
2990
2991 /* API - 1564 - 16-01-03 - store the error value to the new variable & throughout this function replace 'report' with 'extend_report */
2992 extend_report = GET_CAUSE_VALUE(report);
2993
2994 if (GET_CAUSE_DEFBY(extend_report) == DEFBY_CONDAT)
2995 {
2996 /* Treat Condat defined cause values as if no cause given */
2997 dis_connect.cause = NOT_PRESENT_8BIT;
2998 }
2999 else
3000 {
3001 /* Standards defined cause value is given */
3002 dis_connect.cause = GET_CAUSE_VALUE(extend_report);
3003 }
3004 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
3005 /* Marcus: Extended error reporting: 12/11/2002: End */
3006 cm_signal(E_CM_DISCONNECT, &dis_connect);
3007 TRACE_EVENT("passed the E_CM_DISCONNECT point");
3008
3009 if ((call_stat EQ OUTGOING_CALL)
3010 AND (call_type NEQ MFW_ECC_CALL)
3011 AND ((redial_stat EQ CM_REDIAL_AUTO) OR (redial_stat EQ CM_REDIAL_MANU)))
3012 {
3013 // Apr 06 2005 REF: CRR 29989 xpradipg
3014 // allocate memory
3015 #ifdef FF_MMI_OPTIM
3016 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
3017 if( NULL == call_tab)
3018 return;
3019 #endif
3020 /* If this call is 2nd outgoing call, redial is not started */
3021 if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
3022 {
3023 for (i=0; i<MAX_CALL_NR; i++)
3024 {
3025 if (call_tab[i].index == -1)
3026 break;
3027
3028 if ((call_tab[i].status == CAL_STAT_NotPresent)
3029 OR (call_tab[i].status == CAL_STAT_DeactiveReq))
3030 continue;
3031
3032 if (call_tab[i].calType == CAL_TYPE_MOC)
3033 {
3034 call_stat = MFW_CALL_FREE;
3035 call_type = MFW_CALL_FREE;
3036 cmd_hold = MFW_CM_NO_FLAG;
3037 // Apr 06 2005 REF: CRR 29989 xpradipg
3038 // deallocate memory
3039 #ifdef FF_MMI_OPTIM
3040 if(call_tab)
3041 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
3042 #endif
3043 return;
3044 }
3045 }
3046 }
3047 // Apr 06 2005 REF: CRR 29989 xpradipg
3048 // deallocate memory
3049 #ifdef FF_MMI_OPTIM
3050 if(call_tab)
3051 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
3052 #endif
3053 // Apr 14, 2005 REF: CRR 29991 xpradipg
3054 // read the list into the variable
3055 #ifdef FF_MMI_OPTIM
3056 if((file = flash_MMI_blackList_open()) >= 0 )
3057 {
3058 if(flash_MMI_blackList_read(file,(U8*)&count, 1,0) > 0)
3059 {
3060 if(count == MAX_BLACKLIST_NUM)
3061 #else
3062 /* check blacklist whether it is full */
3063 if (black_list.count == MAX_BLACKLIST_NUM)
3064 #endif
3065 {
3066 TRACE_EVENT ("blacklist is now full");
3067
3068 /* Blacklist is now full and
3069 MT shall prohibit further automatic call attempts
3070 */
3071 redial_stat = CM_REDIAL_ABORTED;
3072
3073
3074 /* allow a new outgoing */
3075 call_stat = MFW_CALL_FREE;
3076 call_type = MFW_CALL_FREE;
3077 cc_stat.type = MFW_CALL_FREE;
3078
3079 rdl.redial_mode = CM_REDIAL_BLACKLIST;
3080 cm_signal(E_CM_REDIAL, &rdl);
3081 #ifdef FF_MMI_OPTIM
3082 flash_MMI_blackList_close(file);
3083 #endif
3084 return;
3085 }
3086 #ifdef FF_MMI_OPTIM
3087 }
3088 flash_MMI_blackList_close(file);
3089 }
3090 #endif
3091
3092 /* check the registration staus */
3093 if (nm_reg_status() == MFW_NO_SERVICE)
3094 {
3095 call_stat = MFW_CALL_FREE;
3096 call_type = MFW_CALL_FREE;
3097 cc_stat.type = MFW_CALL_FREE;
3098
3099 rdl.redial_mode = CM_REDIAL_NO_SERVICE;
3100 cm_signal(E_CM_REDIAL, &rdl);
3101 return;
3102 }
3103
3104 TRACE_EVENT_P1("report = %d", extend_report);
3105 switch (extend_report)
3106 {
3107 case 28:
3108 // API - 1480 - Added this code to stop redial on an incorrect number
3109 if(!redial_count)
3110 {
3111 call_stat = MFW_CALL_FREE;
3112 call_type = MFW_CALL_FREE;
3113 cc_stat.type = MFW_CALL_FREE;
3114
3115 rdl.redial_mode = CM_REDIAL_ABORTED;
3116 cm_signal(E_CM_REDIAL, &rdl);
3117 return;
3118 }
3119 case 1: /* check whether the reason is in category 3 (GSM 02.07) */
3120 case 3:
3121 case 22:
3122 case 38:
3123 TRACE_EVENT ("category 3");
3124 if (!redial_count)
3125 {
3126 /* redial_count == 0;
3127 this is for the first outgoing call and
3128 now it is going to start the Auto-redial procedure
3129 */
3130 cc_stat.type = REDIALING_CALL;
3131 cc_stat.call_number = 0;
3132
3133 call_stat = REDIALING_CALL;
3134 rdl.redial_mode = CM_REDIAL_STARTED;
3135 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
3136
3137 #ifdef NO_ASCIIZ
3138 rdl.name.len = cc_stat.name.len;
3139 memcpy(rdl.name.data,
3140 cc_stat.name.data,
3141 cc_stat.name.len);
3142 #else
3143 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
3144 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
3145 #endif
3146 rdl.ton = cc_stat.ton;
3147 rdl.type = cc_stat.mode;
3148
3149 /* reasons in the category 3 have
3150 a call repeat attempts of max. 1 !
3151 */
3152 redial_count = MAX_REDIAL_ATTEMPT-1;
3153 cm_signal(E_CM_REDIAL, &rdl);
3154 return;
3155 }
3156 else
3157 redial_count = MAX_REDIAL_ATTEMPT;
3158 break;
3159
3160 case 17: /* check whether the reason is in category 1 and 2 (GSM 02.07) */
3161 case 18:
3162 case 19:
3163 case 27:
3164 case 34:
3165 case 41:
3166 case 42:
3167 case 44:
3168 case 47:
3169 TRACE_EVENT ("category 1 & 2");
3170 if (!redial_count)
3171 {
3172 /* redial_count == 0
3173 this is for the first outgoing call and
3174 now it is going to start the Auto-redial procedure
3175 */
3176 cc_stat.type = REDIALING_CALL;
3177 cc_stat.call_number = 0;
3178
3179 call_stat = REDIALING_CALL;
3180 rdl.redial_mode = CM_REDIAL_STARTED;
3181 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
3182 #ifdef NO_ASCIIZ
3183 rdl.name.len = cc_stat.name.len;
3184 memcpy(rdl.name.data,
3185 cc_stat.name.data,
3186 cc_stat.name.len);
3187 #else
3188 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
3189 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
3190 #endif
3191 rdl.ton = cc_stat.ton;
3192 rdl.type = cc_stat.mode;
3193
3194 /* reasons in the category 1 and 2 have
3195 a call repeat attempts of max. 10 !
3196 */
3197
3198 cm_signal(E_CM_REDIAL, &rdl);
3199 return;
3200 }
3201
3202 if (redial_count >= 1 AND redial_count <= 3)
3203 {
3204 timStart(redialTim24);
3205 call_stat = REDIALING_CALL;
3206 cc_stat.call_number = 0;
3207 return;
3208 }
3209
3210 if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
3211 {
3212 timStart(redialTim5);
3213 call_stat = REDIALING_CALL;
3214 cc_stat.call_number = 0;
3215 return;
3216 }
3217 #ifdef CUSTOMER_6366
3218 // JP PATCH The MMI needs to know if the 'error disconnect' has
3219 // resulted in redial starting irrespective of whether this was a redial attempt or not
3220 rdl.redial_mode = CM_REDIAL_STARTED;
3221 cm_signal(E_CM_REDIAL, &rdl);
3222 // END JP PATCH
3223 #endif /* CUSTOMER_6366 */
3224 break;
3225
3226 default:
3227 if (redial_count)
3228 {
3229 rdl.redial_mode = CM_REDIAL_STOP;
3230 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
3231 #ifdef NO_ASCIIZ
3232 rdl.name.len = cc_stat.name.len;
3233 memcpy(rdl.name.data,
3234 cc_stat.name.data,
3235 cc_stat.name.len);
3236 #else
3237 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);//???
3238 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
3239 #endif
3240 rdl.ton = cc_stat.ton;
3241 rdl.type = cc_stat.mode;
3242 cm_signal(E_CM_REDIAL, &rdl);
3243 }
3244 /* allow a new outgoing */
3245 call_stat = MFW_CALL_FREE;
3246 call_type = MFW_CALL_FREE;
3247 cc_stat.type = MFW_CALL_FREE;
3248 return;
3249 }
3250 #ifdef FF_MMI_OPTIM
3251 if (redial_count >= MAX_REDIAL_ATTEMPT
3252 AND count < MAX_BLACKLIST_NUM)
3253 {
3254 mfwStrncpy((char *)blackListNum,(char *)cc_stat.number, MFW_NUM_LEN);
3255 // Apr 14, 2005 REF: CRR 29991 xpradipg
3256 // once there is new addition update it onto the file
3257 if(flash_MMI_blackList_write((U8*)blackListNum, MFW_NUM_LEN, (count*MFW_NUM_LEN)+1) < 0)
3258 TRACE_FUNCTION("ERROR OPENING the blacklist file");
3259 count++;
3260 if(flash_MMI_blackList_write((U8*)&count,1,0) < 0)
3261 TRACE_FUNCTION("ERROR OPENING the blacklist file");
3262 #else
3263 if (redial_count >= MAX_REDIAL_ATTEMPT
3264 AND black_list.count < MAX_BLACKLIST_NUM)
3265 {
3266 mfwStrncpy((char *)black_list.number[black_list.count],
3267 (char *)cc_stat.number, MFW_NUM_LEN);
3268 black_list.count++;
3269 #endif
3270 rdl.redial_mode = CM_REDIAL_BLACKLISTED;
3271 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
3272 #ifdef NO_ASCIIZ
3273 rdl.name.len = cc_stat.name.len;
3274 memcpy(rdl.name.data,
3275 cc_stat.name.data,
3276 cc_stat.name.len);
3277 #else
3278 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
3279 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
3280 #endif
3281 rdl.ton = cc_stat.ton;
3282 rdl.type = cc_stat.mode;
3283 rdl.left_attempts = 0;
3284 cc_stat.call_number = 0;
3285 cm_signal(E_CM_REDIAL, &rdl);
3286 }
3287 }
3288
3289 /* allow a new outgoing */
3290 call_stat = MFW_CALL_FREE;
3291 call_type = MFW_CALL_FREE;
3292 cc_stat.type = MFW_CALL_FREE;
3293 }
3294 #endif
3295
3296
3297 /*
3298 +-----------------------------------------------------------------------+
3299 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
3300 | STATE : code ROUTINE : cm_rmt_error_connect |
3301 +-----------------------------------------------------------------------+
3302
3303
3304 PURPOSE : The connection is not successful
3305
3306 */
3307
3308 #ifdef FF_2TO1_PS
3309 void cm_rmt_error_connect(SHORT call_number)
3310 {
3311 T_CAUSE_ps_cause report; /* Marcus: Extended error reporting: 12/11/2002 */
3312
3313 TRACE_FUNCTION ("cm_error_connect()");
3314
3315 //TISH: OMAPS00104986 if there is inband tone, it should not disconnect the call, until User reject it.
3316 if (cm_cpi.inband) return;
3317 /* send event */
3318 dis_connect.call_number = call_number;
3319
3320 qAT_PlusCEER( CMD_SRC_LCL, &report);
3321 /* Marcus: Extended error reporting: 12/11/2002: Start */
3322 // TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
3323
3324 if (report.ctrl_value != CAUSE_is_from_nwcc)
3325 {
3326 /* Treat Condat defined cause values as if no cause given */
3327 dis_connect.cause = NOT_PRESENT_8BIT;
3328 }
3329 else
3330 {
3331 /* Standards defined cause value is given */
3332 dis_connect.cause = report.value.nwcc_cause;
3333 }
3334
3335 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
3336 /* Marcus: Extended error reporting: 12/11/2002: End */
3337
3338 cm_signal(E_CM_DISCONNECT, &dis_connect);
3339 }
3340 #else
3341 void cm_rmt_error_connect(SHORT call_number)
3342 {
3343 USHORT report; /* Marcus: Extended error reporting: 12/11/2002 */
3344
3345 TRACE_FUNCTION ("cm_error_connect()");
3346 //TISH: OMAPS00104986 if there is inband tone, it should not disconnect the call, until User reject it.
3347 if (cm_cpi.inband) return;
3348
3349 /* send event */
3350 dis_connect.call_number = call_number;
3351
3352 qAT_PlusCEER( CMD_SRC_LCL, &report);
3353 /* Marcus: Extended error reporting: 12/11/2002: Start */
3354 TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
3355 if (GET_CAUSE_DEFBY(report) == DEFBY_CONDAT)
3356 {
3357 /* Treat Condat defined cause values as if no cause given */
3358 dis_connect.cause = NOT_PRESENT_8BIT;
3359 }
3360 else
3361 {
3362 /* Standards defined cause value is given */
3363 dis_connect.cause = GET_CAUSE_VALUE(report);
3364 }
3365 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
3366 /* Marcus: Extended error reporting: 12/11/2002: End */
3367
3368 cm_signal(E_CM_DISCONNECT, &dis_connect);
3369 }
3370 #endif
3371
3372
3373 /*
3374 +--------------------------------------------------------------------+
3375 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
3376 | STATE : code ROUTINE: cm_disconnect |
3377 +--------------------------------------------------------------------+
3378
3379
3380 PURPOSE : Disconnection for outgoing call or active call
3381
3382 */
3383
3384 T_MFW cm_disconnect(SHORT call_number)
3385 {
3386 CHAR callId[5];
3387 T_MFW_CM_CALL_STAT stat;
3388 UBYTE ton;
3389 UBYTE mode;
3390
3391 TRACE_FUNCTION ("cm_disconnect()");
3392
3393 dis_connect.call_number = call_number;
3394
3395 /*Apr 25, 2006 OMAPS00075711 a0393213 (R.Prabakar)
3396 Description : 'End Conference' option doesn't work
3397 Solution : The ACI_CHLD_MOD is changed from CHLD_MOD_RelActSpec to CHLD_MOD_RelActAndAcpt while calling sAT_PlusCHLD().
3398 This is done since CHLD_MOD_RelActSpec with callId 0 is equivalent to sending AT+CHLD=10 which is invalid
3399 according to GSM specification. Before calling sAT_PlusCHLD command status is also set*/
3400
3401 if (!call_number)
3402 {
3403 sprintf(callId, "%d", 0);
3404 cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, callId);
3405 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, callId) != AT_EXCT)
3406 return CM_ERROR;
3407 return CM_OK;
3408 }
3409
3410 cm_search_callStat(call_number, &stat, &ton, &mode);
3411
3412 TRACE_EVENT_P3("Status %d Ton %d Mode %d",stat,ton,mode);
3413
3414 /* HANG UP DATA CALL (WAP)
3415 * SPR#1983 - SH - Use sAT_Abort() when call has not yet connected,
3416 * rather than sAT_H */
3417
3418 if (mode == DATA_CALL)
3419 {
3420 T_ACI_RETURN retval;
3421
3422 TRACE_EVENT_P1("***Disconnect data call, stat=%d", stat);
3423
3424 if ((stat == CALL_DIAL) OR (stat == CALL_ALERT))
3425 {
3426 if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
3427 return CM_ERROR;
3428 return CM_OK;
3429 }
3430
3431 if (stat == CALL_DEACTIVE && currConnecting) /* ES/AK 290999 */
3432 {
3433 currConnecting = 0;
3434 if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
3435 return CM_ERROR;
3436 return CM_OK;
3437 }
3438
3439 retval = sAT_H(CMD_SRC_LCL);
3440
3441 TRACE_EVENT_P1("Result of sAT_H = %d", retval);
3442 if (retval)
3443 return CM_ERROR;
3444 return CM_OK;
3445 }
3446
3447
3448 if ((stat == CALL_DIAL) OR (stat == CALL_ALERT))
3449 {
3450 if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
3451 return CM_ERROR;
3452 return CM_OK;
3453 }
3454
3455 if (stat == CALL_DEACTIVE && currConnecting) /* ES/AK 290999 */
3456 {
3457 currConnecting = 0;
3458 if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
3459 return CM_ERROR;
3460 return CM_OK;
3461 }
3462
3463 if ((stat == CALL_ACTIVE) OR (stat == CALL_DEACTIVE))
3464 {
3465 cmd_hold = MFW_CM_TERMINATED;
3466 sprintf(callId, "%d", call_number);
3467 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActSpec, callId) != AT_EXCT)
3468 return CM_ERROR;
3469 return CM_OK;
3470 }
3471 else if (stat == CALL_HELD)
3472 {
3473
3474
3475 // Apr 26, 2004 REF: CRR 16545 Ajith K P Side effect of CRR 16545.
3476 // CHLD_MOD_RelActSpec no longer releases held calls.
3477 // So now if the user wants to release a HELD call, now we are calling the
3478 // sAT_PlusCHLD(..) function with CHLD_MOD_RelAnySpec as the parameter.
3479
3480
3481
3482 cmd_hold = MFW_CM_TERMINATED;
3483 sprintf(callId, "%d", call_number);
3484 // Feb 27, 2006 REF:DR OMAPS00067884 x0039928
3485 // Fix : sAT_PercentCHLD() is called if the mode > CHLD_MOD_RelDialCall
3486 if (sAT_PercentCHLD(CMD_SRC_LCL, CHLD_MOD_RelAnySpec, callId) != AT_EXCT)
3487 return CM_ERROR;
3488 return CM_OK;
3489 }
3490 return CM_ERROR;
3491 }
3492
3493 /*
3494 +--------------------------------------------------------------------+
3495 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
3496 | STATE : code ROUTINE: cm_force_disconnect |
3497 +--------------------------------------------------------------------+
3498
3499
3500 PURPOSE : Disconnection of any call existent needed for Multiparty and some structured procedures
3501 call termination in state U9
3502
3503 */
3504
3505 void cm_force_disconnect(void)
3506 {
3507 T_ACI_RETURN res;
3508
3509 TRACE_FUNCTION("cm_force_disconnect()");
3510
3511 res = sAT_H(CMD_SRC_LCL);
3512 if (res != AT_EXCT && res != AT_CMPL)
3513 TRACE_ERROR("satReject() error");
3514
3515 return;
3516 }
3517
3518
3519 /*
3520 +--------------------------------------------------------------------+
3521 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
3522 | STATE : code ROUTINE: cm_ok_disconnect |
3523 +--------------------------------------------------------------------+
3524
3525
3526 PURPOSE : indicates disconnection from called party;
3527 sends E_CM_DISCONNECT to mmi
3528
3529 */
3530
3531 #ifdef FF_2TO1_PS
3532 void cm_ok_disconnect(T_ACI_CMD_SRC src, SHORT call_id)
3533 {
3534 T_CAUSE_ps_cause cause; /* Marcus: Extended error reporting: 12/11/2002 */
3535 T_MFW_CM_DISCONNECT_ALL disconnect_all;
3536
3537 TRACE_FUNCTION("cm_ok_disconnect()");
3538
3539 TRACE_EVENT_P4("dis_connect.call_number %d, cmd_hold %d, src %d, call_id %d",
3540 dis_connect.call_number, cmd_hold, src, call_id);
3541
3542
3543
3544
3545 /* Marcus: CCBS: 14/11/2002: Start */
3546 if (cmd_hold == MFW_CM_CCBS_REGISTER)
3547 {
3548 /* Rejecting the offered CCBS registration */
3549 TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
3550 cmd_hold = 0;
3551 cm_ccbs_ok();
3552 return;
3553 }
3554 /* Marcus: CCBS: 14/11/2002: End */
3555
3556 if (cmd_hold == MFW_CM_MPTY_TERMINATED)
3557 dis_connect.call_number = 0;
3558 //Nov 02, 2005 DR OMAPS00052132 xdeepadh
3559 //The usage of ATI enum is put under the flag FF_ATI
3560 #if defined (FF_ATI) || defined (NEPTUNE_BOARD)
3561 else if (src EQ CMD_SRC_ATI_1) /* NM Berlin/UK integration 21.09.01 */
3562 {
3563 dis_connect.call_number = call_id;
3564 }
3565 #endif
3566
3567
3568 /* send event */
3569 qAT_PlusCEER( CMD_SRC_LCL, &cause);
3570 /* Marcus: Extended error reporting: 12/11/2002: Start */
3571 // TRACE_EVENT_P1("qAT_PlusCEER(%04X)", cause);
3572
3573 if (cause.ctrl_value != CAUSE_is_from_nwcc)
3574 {
3575 /* Treat Condat defined cause values as if no cause given */
3576 dis_connect.cause = NOT_PRESENT_8BIT;
3577 }
3578 else
3579 {
3580 /* Standards defined cause value is given */
3581 dis_connect.cause = cause.value.nwcc_cause;
3582 }
3583
3584 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
3585 /* Marcus: Extended error reporting: 12/11/2002: End */
3586
3587 /* allow a new outgoing */
3588 call_stat = MFW_CALL_FREE;
3589 call_type = MFW_CALL_FREE;
3590
3591 if (cmd_hold EQ MFW_CM_DISCONNECT_ALL)
3592 {
3593 disconnect_all.result = CM_DISCONNECT_ALL_RESULT_OK;
3594 if (cause.ctrl_value != CAUSE_is_from_nwcc)
3595 {
3596 /* Treat Condat defined cause values as if no cause given */
3597 disconnect_all.cause = NOT_PRESENT_8BIT;
3598 }
3599 else
3600 {
3601 /* Standards defined cause value is given */
3602 disconnect_all.cause = cause.value.nwcc_cause;
3603 }
3604 cm_signal(E_CM_DISCONNECT_ALL,&disconnect_all);
3605 }
3606 else
3607 cm_signal(E_CM_DISCONNECT, &dis_connect);
3608
3609 cmd_hold = 0;
3610
3611 }
3612 #else
3613 void cm_ok_disconnect(T_ACI_CMD_SRC src, SHORT call_id)
3614 {
3615 USHORT cause; /* Marcus: Extended error reporting: 12/11/2002 */
3616 T_MFW_CM_DISCONNECT_ALL disconnect_all;
3617
3618 TRACE_FUNCTION("cm_ok_disconnect()");
3619
3620 TRACE_EVENT_P4("dis_connect.call_number %d, cmd_hold %d, src %d, call_id %d",
3621 dis_connect.call_number, cmd_hold, src, call_id);
3622
3623
3624
3625
3626 /* Marcus: CCBS: 14/11/2002: Start */
3627 if (cmd_hold == MFW_CM_CCBS_REGISTER)
3628 {
3629 /* Rejecting the offered CCBS registration */
3630 TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
3631 cmd_hold = 0;
3632 cm_ccbs_ok();
3633 return;
3634 }
3635 /* Marcus: CCBS: 14/11/2002: End */
3636
3637 if (cmd_hold == MFW_CM_MPTY_TERMINATED)
3638 dis_connect.call_number = 0;
3639 //Nov 02, 2005 DR OMAPS00052132 xdeepadh
3640 //The usage of ATI enum is put under the flag FF_ATI
3641 #ifdef FF_ATI
3642 else if (src EQ CMD_SRC_ATI_1) //NM Berlin/UK integration 21.09.01
3643 {
3644 dis_connect.call_number = call_id;
3645 }
3646 #endif //FF_ATI
3647
3648 /* send event */
3649 qAT_PlusCEER( CMD_SRC_LCL, &cause);
3650 /* Marcus: Extended error reporting: 12/11/2002: Start */
3651 TRACE_EVENT_P1("qAT_PlusCEER(%04X)", cause);
3652 if (GET_CAUSE_DEFBY(cause) == DEFBY_CONDAT)
3653 {
3654 /* Treat Condat defined cause values as if no cause given */
3655 dis_connect.cause = NOT_PRESENT_8BIT;
3656 }
3657 else
3658 {
3659 /* Standards defined cause value is given */
3660 dis_connect.cause = GET_CAUSE_VALUE(cause);
3661 }
3662 TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
3663 /* Marcus: Extended error reporting: 12/11/2002: End */
3664
3665 /* allow a new outgoing */
3666 call_stat = MFW_CALL_FREE;
3667 call_type = MFW_CALL_FREE;
3668
3669 if (cmd_hold EQ MFW_CM_DISCONNECT_ALL)
3670 {
3671 disconnect_all.result = CM_DISCONNECT_ALL_RESULT_OK;
3672 if (GET_CAUSE_DEFBY(cause) == DEFBY_CONDAT)
3673 {
3674 /* Treat Condat defined cause values as if no cause given */
3675 disconnect_all.cause = NOT_PRESENT_8BIT;
3676 }
3677 else
3678 {
3679 /* Standards defined cause value is given */
3680 disconnect_all.cause = GET_CAUSE_VALUE(cause);
3681 }
3682 cm_signal(E_CM_DISCONNECT_ALL,&disconnect_all);
3683 }
3684 else
3685 cm_signal(E_CM_DISCONNECT, &dis_connect);
3686
3687 cmd_hold = 0;
3688
3689 }
3690 #endif
3691
3692 /* Marcus: CCBS: 14/11/2002: Start */
3693 /*
3694 +--------------------------------------------------------------------+
3695 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
3696 | STATE : code ROUTINE: cm_error_disconnect |
3697 +--------------------------------------------------------------------+
3698
3699 PURPOSE : indicates failed disconnection
3700
3701 */
3702 void cm_error_disconnect(void)
3703 {
3704 TRACE_FUNCTION ("cm_error_disconnect()");
3705 if (cmd_hold == MFW_CM_DISCONNECT_ALL)
3706 {
3707 TRACE_EVENT("cmd_hold == MFW_CM_DISCONNECT_ALL");
3708 cmd_hold = 0;
3709 }
3710
3711 /* Marcus: CCBS: 14/11/2002: Start */
3712 if (cmd_hold == MFW_CM_CCBS_REGISTER)
3713 {
3714 TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
3715 /* Rejecting the offered CCBS registration */
3716 cmd_hold = 0;
3717 cm_ccbs_error();
3718 }
3719 }
3720 /* Marcus: CCBS: 14/11/2002: End */
3721
3722 /*
3723 +--------------------------------------------------------------------+
3724 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
3725 | STATE : code ROUTINE: cm_command |
3726 +--------------------------------------------------------------------+
3727
3728
3729 PURPOSE :
3730
3731 */
3732
3733 T_MFW cm_command(SHORT call_number, UBYTE command, UBYTE crss_string)
3734 {
3735 CHAR callId[5];
3736 UBYTE res;
3737 SHORT retVal, modeRetVal; // xnkulkar SPR-18262: Added "modeRetVal" to store the return value of "mfw_cbuf_put_mode ()"
3738
3739 TRACE_FUNCTION ("cm_command()");
3740
3741 // JP PATCH
3742 cmd_hold = 0;
3743 // END PATCH
3744
3745 cmd.call_number = call_number;
3746 cmd.command = command;
3747
3748 switch (command)
3749 {
3750 case CM_HOLD:
3751 case CM_SWAP:
3752 case CM_RETRIEVE:
3753 case CM_SWAP_MULTIPARTY:
3754 case CM_HOLD_MULTIPARTY:
3755 case CM_RETRIEVE_MULTIPARTY:
3756 /* place all active calls on held and accept held or waiting call */
3757 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, 0) != AT_EXCT)
3758 return FALSE;
3759 break;
3760
3761 case CM_BUILD_MULTIPARTY:
3762 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_AddHld, 0)!= AT_EXCT)
3763 return FALSE;
3764 break;
3765
3766 case CM_SPLIT_MULTIPARTY:
3767 if (call_number <= 0)
3768 return FALSE;
3769 sprintf(callId, "%d", call_number);
3770 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActExc, callId)!= AT_EXCT)
3771 return FALSE;
3772 break;
3773
3774 case CM_ETC:
3775 /* connects two calls and disconnects the subsrciber from both calls */
3776 if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ect, 0) != AT_EXCT)
3777 return FALSE;
3778 break;
3779
3780 case CM_CALL_DEFLECTION:
3781 break;
3782
3783 case CM_CCBS:
3784 TRACE_EVENT("CM_CCBS");
3785 sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ccbs, 0);
3786 break;
3787
3788 case CM_MODIFY:
3789 break;
3790
3791 case CM_DTMF_ACTIVE:
3792 // xnkulkar SPR-18262
3793 // If there is a DTMF tone command already in the queue, add the current tone also
3794 // in the queue (with start mode). Also, start adding to the queue if we are expecting an acknowledgement
3795 // (rAT_OK) for the previous DTMF tone request sent.
3796 /*OMAPS00108192 a0393213 DTMF START-DTMF STOP properly nested*/
3797 if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) != 0)
3798 {
3799 /*dtmf queue not empty*/
3800 if(dtmf_queued.mode==VTS_MOD_ManStop)
3801 {
3802 /*most recent element in the queue corresponds to 'stop'*/
3803 /*queue up*/
3804 modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStart);
3805 retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
3806 // If the return values are negative, attempt to Queue the DTMF request failed
3807 if (retVal < 0 || modeRetVal < 0)
3808 {
3809 TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
3810 TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
3811 /*
3812 ** Failed to Queue the DTMF request.
3813 */
3814 return(FALSE);
3815 }
3816 /*successfully queued update the internal variable*/
3817 dtmf_queued.mode=VTS_MOD_ManStart;
3818 dtmf_queued.digit=crss_string;
3819 return (TRUE);
3820 }
3821 else
3822 {
3823 /*ignore the key press*/
3824 return (TRUE);
3825 }
3826
3827 }
3828 else
3829 {
3830 /*dtmf queue empty*/
3831 if(dtmf_sent.valid==TRUE)
3832 {
3833 /*some dtmf has already been sent to ACI and MMI is waiting for rAT_ok*/
3834 if(dtmf_sent.mode==VTS_MOD_ManStop)
3835 {
3836 /*last sent dtmf is STOP - so queue up*/
3837 modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStart);
3838 retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
3839 // If the return values are negative, attempt to Queue the DTMF request failed
3840 if (retVal < 0 || modeRetVal < 0)
3841 {
3842 TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
3843 TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
3844 /*
3845 ** Failed to Queue the DTMF request.
3846 */
3847 return(FALSE);
3848 }
3849 /*successfully queued update the internal variable*/
3850 dtmf_queued.mode=VTS_MOD_ManStart;
3851 dtmf_queued.digit=crss_string;
3852 return (TRUE);
3853 }
3854 else
3855 {
3856 return (TRUE); /*ignore the key press*/
3857 }
3858 }
3859 else
3860 {
3861 /*we are not waiting for any rAT_ok - so call sAT_PlusVTS*/
3862 if(sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_ManStart) == AT_EXCT)
3863 {
3864 TRACE_EVENT("sAT_PlusVTS() successful");
3865 dtmf_sent.valid=TRUE;
3866 dtmf_sent.mode=VTS_MOD_ManStart;
3867 dtmf_sent.digit=crss_string;
3868 }
3869 else
3870 {
3871 TRACE_EVENT("sAT_PlusVTS() busy or failed");
3872 return (FALSE);
3873 }
3874 }
3875
3876 }
3877 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
3878 currCmd = AT_CMD_VTS;
3879 #endif
3880 break;
3881
3882 case CM_DTMF_INACTIVE:
3883 // xnkulkar SPR-18262
3884 // If there is a DTMF tone command already in the queue, add the current tone also
3885 // in the queue (with stop mode). Also, start adding to the queue if we are expecting an acknowledgement
3886 // (rAT_OK) for the previous DTMF tone request sent.
3887 /*OMAPS00108192 a0393213 DTMF START-DTMF STOP properly nested*/
3888 if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) != 0)
3889 {
3890 /*dtmf queue not empty*/
3891 if(dtmf_queued.mode==VTS_MOD_ManStart && dtmf_queued.digit==crss_string)
3892 {
3893 /*most recent element in the queue corresponds to START and are of same digit so queue up*/
3894 modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStop);
3895 retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
3896 // If the return values are negative, attempt to Queue the DTMF request failed
3897 if (retVal < 0 || modeRetVal < 0)
3898 {
3899 TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
3900 TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
3901 /*
3902 ** Failed to Queue the DTMF request.
3903 */
3904 return(FALSE);
3905 }
3906 /*successfully queued update the internal variable*/
3907 dtmf_queued.mode=VTS_MOD_ManStop;
3908 dtmf_queued.digit=crss_string;
3909 return (TRUE);
3910 }
3911 else
3912 {
3913 /*ignore the key press*/
3914 return (TRUE);
3915 }
3916
3917 }
3918 else
3919 {
3920 /*dtmf queue empty*/
3921 if(dtmf_sent.valid==TRUE)
3922 {
3923 /*some dtmf has already been sent to ACI and MMI is waiting for rAT_ok*/
3924 if(dtmf_sent.mode==VTS_MOD_ManStart && dtmf_sent.digit==crss_string)
3925 {
3926 /*last sent dtmf corresponds to START and are of same digit - so queue up*/
3927 modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStop);
3928 retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
3929 // If the return values are negative, attempt to Queue the DTMF request failed
3930 if (retVal < 0 || modeRetVal < 0)
3931 {
3932 TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
3933 TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
3934 /*
3935 ** Failed to Queue the DTMF request.
3936 */
3937 return(FALSE);
3938 }
3939 /*successfully queued update the internal variable*/
3940 dtmf_queued.mode=VTS_MOD_ManStop;
3941 dtmf_queued.digit=crss_string;
3942 return (TRUE);
3943 }
3944 else
3945 {
3946 return (TRUE); /*ignore the key press*/
3947 }
3948 }
3949 else
3950 {
3951 /*rAT_ok is not expected. so call sAT_PlusVTS*/
3952 if(sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_ManStop) == AT_EXCT)
3953 {
3954 TRACE_EVENT("sAT_PlusVTS() successful");
3955 dtmf_sent.valid=TRUE;
3956 dtmf_sent.mode=VTS_MOD_ManStop;
3957 dtmf_sent.digit=crss_string;
3958 }
3959 else
3960 {
3961 TRACE_EVENT("sAT_PlusVTS() busy or failed");
3962 return (FALSE);
3963 }
3964 }
3965
3966 }
3967 res = TRUE;
3968 cm_signal(E_CM_DTMF, &res);
3969 break;
3970
3971 case CM_DTMF_AUTO:
3972 /*OMAPS00108192 a0393213(R.Prabakar)
3973 As part of the issue CM_DTMF_ACTIVE and CM_DTMF_INACTIVE cases modified. But this case is not modified
3974 because this case is felt irrelavant. If required the same logic can be extended to this case also*/
3975 if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) != 0)
3976 {
3977 /*
3978 ** There are already DTMF tones queued to be sent, so queue this request to.
3979 */
3980 modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_Auto);
3981 retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
3982 if (retVal < 0 || modeRetVal < 0)
3983 {
3984 TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
3985 TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
3986 /*
3987 ** Failed to Queue the DTMF request.
3988 */
3989 return(FALSE);
3990 }
3991 }
3992 else
3993 {
3994 if (sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_Auto) != AT_EXCT)
3995 {
3996 /*
3997 ** The attempt to send an immediate DTMF failed.
3998 ** Add the failed attempt onto the DTMF queue and wait.
3999 */
4000 modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_Auto);
4001 retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
4002 if (retVal < 0 || modeRetVal < 0)
4003 {
4004 TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
4005 TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
4006 /*
4007 ** Failed to Queue the DTMF request.
4008 */
4009 return(FALSE);
4010 }
4011 }
4012 }
4013 break;
4014
4015 default:
4016 break;
4017 }
4018 return TRUE;
4019 }
4020
4021
4022 /*
4023 +--------------------------------------------------------------------+
4024 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4025 | STATE : code ROUTINE : send_queued_dtmf_tone |
4026 +--------------------------------------------------------------------+
4027
4028
4029 PURPOSE : Check the DTMF Queue and if required send the next DTMF Tone Request.
4030
4031 */
4032 static void send_queued_dtmf_tone(void)
4033 {
4034 SHORT retVal;
4035 UBYTE qdtmf;
4036 //xnkulkar SPR-18262: Added these variables to store the Mode
4037 T_ACI_VTS_MOD vts_mode = VTS_MOD_NotPresent;
4038
4039 TRACE_EVENT("send_queued_dtmf_tone()");
4040 /*OMAPS00108192 a0393213*/
4041 if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) > 0)
4042 {
4043 /*dtmf queue has some elements - so dequeue and send to ACI*/
4044 // Get the mode (Start / Stop) corresponding to the DTMF tone
4045 vts_mode = (T_ACI_VTS_MOD)mfw_cbuf_get_mode(mfw_cm_dtmf_q_id);
4046 // Get the DTMF key for which the tone is to be sent from the queue
4047 retVal = mfw_cbuf_get(mfw_cm_dtmf_q_id, &qdtmf);
4048 if (retVal > 0)
4049 {
4050 if (sAT_PlusVTS(CMD_SRC_LCL, (CHAR)qdtmf, vts_mode) == AT_EXCT)
4051 {
4052 dtmf_sent.valid=TRUE;
4053 dtmf_sent.mode=vts_mode;
4054 dtmf_sent.digit=qdtmf;
4055 }
4056
4057 }
4058 else
4059 {
4060 TRACE_EVENT_P1("ERROR : mfw_cbuf_get failed with error value %d", retVal);
4061 dtmf_sent.valid=FALSE;
4062 }
4063
4064 }
4065 else
4066 {
4067 dtmf_sent.valid=FALSE;
4068 }
4069 }
4070
4071 /*
4072 +--------------------------------------------------------------------+
4073 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4074 | STATE : code ROUTINE : resetDTMFQueue |
4075 +--------------------------------------------------------------------+
4076 PURPOSE : reset the dtmf queue
4077 */
4078 /*OMAPS00107103 (no dtmf tones for simultaneous key press) a0393213(R.Prabakar) - function added*/
4079 void resetDTMFQueue()
4080 {
4081 TRACE_EVENT("resetDTMFQueue");
4082 mfw_cbuf_reset(mfw_cm_dtmf_q_id);
4083 //expectRatOk=FALSE;
4084 dtmf_sent.valid=FALSE;
4085 }
4086
4087
4088 /*
4089 +--------------------------------------------------------------------+
4090 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4091 | STATE : code ROUTINE : cm_ok_dtmf |
4092 +--------------------------------------------------------------------+
4093
4094
4095 PURPOSE : DTMF activation is successful.
4096
4097 */
4098
4099 void cm_ok_dtmf(void)
4100 {
4101 UBYTE res;
4102 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
4103 currCmd = AT_CMD_NONE;
4104 #endif
4105 res = TRUE;
4106 cm_signal(E_CM_DTMF, &res);
4107
4108 send_queued_dtmf_tone();
4109
4110 return;
4111 }
4112
4113
4114 /*
4115 +--------------------------------------------------------------------+
4116 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4117 | STATE : code ROUTINE : cm_error_tdmf |
4118 +--------------------------------------------------------------------+
4119
4120
4121 PURPOSE : DTMF activation is failed.
4122
4123 */
4124
4125 void cm_error_dtmf(void)
4126 {
4127 UBYTE res;
4128 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
4129 currCmd = AT_CMD_NONE;
4130 #endif
4131 res = FALSE;
4132 cm_signal(E_CM_DTMF, &res);
4133
4134 send_queued_dtmf_tone();
4135
4136 }
4137
4138
4139 /*
4140 +--------------------------------------------------------------------+
4141 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4142 | STATE : code ROUTINE : cm_result_cmd |
4143 +--------------------------------------------------------------------+
4144
4145
4146 PURPOSE : Acknowledgement for the requested ss command.
4147
4148 */
4149
4150 void cm_result_cmd(T_ACI_CMD_SRC src, UBYTE result)
4151 {
4152 SHORT call_number;
4153
4154 TRACE_EVENT_P1("cm_result_cmd(), cmd_hold = %d", cmd_hold);
4155
4156 /* MC changed all the "if"s to a switch to allow default 11/04/02*/
4157 switch (cmd_hold)
4158 {
4159 case MFW_CM_MT_REJECT:
4160 break; /* CONQUEST 6040- MC- put a break in the case so no action taken*/
4161 case MFW_CM_MPTY_TERMINATED:
4162 case MFW_CM_TERMINATED:
4163
4164 {
4165 if (result EQ Present)
4166 cm_ok_disconnect(CMD_SRC_LCL, 0);
4167 return;
4168 }
4169 // break; // RAVI
4170
4171 case MFW_CM_MT_ACCEPT:
4172 {
4173 /*
4174 * active call on hold, accept new incoming call
4175 */
4176 cmd_hold = 0;
4177 if (result EQ Present)
4178 /*
4179 * Call on hold was successful
4180 */
4181 cm_ok_connect();
4182
4183 else
4184 {
4185 if (cm_search_callId(CAL_STAT_Active, &call_number) != CM_OK)
4186 return;
4187 cmd.call_number = call_number;
4188 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
4189 cc_id = 0; // ???
4190 #endif
4191 }
4192 }
4193 break;
4194
4195
4196 case MFW_CM_HOLD_AND_DIAL:
4197 {
4198 /*
4199 * active call on hold, accept new incoming call
4200 */
4201 cmd_hold = 0;
4202 if (result EQ Present)
4203 /*
4204 * Call on hold was successful
4205 */
4206 cm_ok_connect();
4207
4208 else
4209 {
4210 if (cm_search_callId(CAL_STAT_Active, &call_number) != CM_OK)
4211 return;
4212 cmd.call_number = call_number;
4213 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
4214 cc_id = 0; // ???
4215 #endif
4216 }
4217 }
4218 break;
4219
4220 case MFW_CM_1_SEND:
4221 {
4222
4223 cmd_hold = 0;
4224 if (result == Present)
4225 {
4226 // MMI-SPR 13873 xkundadu
4227 // Handling of 1SEND
4228 // If the user presses 1SEND, release active calls and accept
4229 // the WAITING call
4230 if (dis_connect.call_number NEQ -1)
4231 {
4232 // If there is an active call, disconnect it.
4233 cm_ok_disconnect(CMD_SRC_LCL, 0);
4234 }
4235
4236 if (!cmd.call_number)
4237 {
4238 // If there is waiting call, accept the call
4239 cm_ok_connect();
4240 }
4241 cmd.call_number = -1;
4242 }
4243
4244 }
4245 break;
4246
4247 /* Marcus: CCBS: 14/11/2002: Start */
4248 case MFW_CM_CCBS_REGISTER:
4249
4250 TRACE_EVENT("MFW_CM_CCBS_REGISTER");
4251
4252 cmd_hold = 0;
4253
4254 if (result == Present)
4255 {
4256 TRACE_EVENT("result == Present");
4257 cm_ccbs_ok();
4258 }
4259 else /* result is NotPresent */
4260 {
4261 TRACE_EVENT("result != Present");
4262 cm_ccbs_error();
4263 }
4264 return;
4265
4266 case MFW_CM_CCBS_RECALL:
4267
4268 TRACE_EVENT("MFW_CM_CCBS_RECALL");
4269
4270 cmd_hold = 0;
4271
4272 if (result == Present)
4273 {
4274 TRACE_EVENT("result == Present");
4275 cm_ccbs_ok();
4276 }
4277 else /* result is NotPresent */
4278 {
4279 TRACE_EVENT("result != Present");
4280 cm_ccbs_error();
4281 }
4282 return;
4283 /* Marcus: CCBS: 14/11/2002: Start */
4284
4285 default:/*For other command types ensure correct result is passed up to BMI*/
4286 {
4287 cmd.result = result;
4288 }
4289 break;
4290 }
4291
4292
4293 #if defined (WIN32)
4294 {
4295 char buf[40];
4296 sprintf (buf, "Event CM_COMMAND for %d", cmd.call_number);
4297 TRACE_EVENT (buf);
4298 sprintf (buf, "Result %d Command %d",cmd.result, cmd.command);
4299 TRACE_EVENT (buf);
4300 }
4301 #endif
4302 cmd.result = result;
4303 cm_signal(E_CM_COMMAND, &cmd);
4304 }
4305
4306
4307 /*
4308 +--------------------------------------------------------------------+
4309 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4310 | STATE : code ROUTINE: cm_cvt_speed_type |
4311 +--------------------------------------------------------------------+
4312
4313
4314 PURPOSE : This function is used to convert the type of data rate
4315 used by MFW to the type of data rate used by ACI.
4316
4317 */
4318
4319 LOCAL T_ACI_BS_SPEED cm_cvt_speed_type ( T_MFW_CM_DATA_SPEED speed )
4320 {
4321 switch ( speed )
4322 {
4323 case ( SPEED_300 ): return BS_SPEED_300_V110;
4324 case ( SPEED_1200 ): return BS_SPEED_1200_V110;
4325 case ( SPEED_2400 ): return BS_SPEED_2400_V110;
4326 case ( SPEED_4800 ): return BS_SPEED_4800_V110;
4327 case ( SPEED_9600 ): return BS_SPEED_9600_V110;
4328 case ( SPEED_14400 ): return BS_SPEED_14400_V110;
4329 default: return BS_SPEED_NotPresent;
4330 }
4331 }
4332
4333
4334 /*
4335 +--------------------------------------------------------------------+
4336 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4337 | STATE : code ROUTINE: cm_cvt_bs_type |
4338 +--------------------------------------------------------------------+
4339
4340
4341 PURPOSE : This function is used to convert the type of bearer service
4342 used by MFW to the type of bearer service used by ACI.
4343
4344 */
4345
4346 LOCAL T_ACI_CBST_NAM cm_cvt_bs_type ( T_MFW_CM_BS bs )
4347 {
4348 switch ( bs )
4349 {
4350 case ( Asynch ): return CBST_NAM_Asynch;
4351 case ( Synch ): return CBST_NAM_Synch;
4352 default: return CBST_NAM_NotPresent;
4353 }
4354 }
4355
4356
4357 /*
4358 +--------------------------------------------------------------------+
4359 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4360 | STATE : code ROUTINE: cm_cvt_ce_type |
4361 +--------------------------------------------------------------------+
4362
4363
4364 PURPOSE : This function is used to convert the data mode
4365 used by MFW to the data mode used by ACI.
4366
4367 */
4368
4369 LOCAL T_ACI_CBST_CE cm_cvt_ce_type ( T_MFW_CM_CE ce )
4370 {
4371 switch ( ce )
4372 {
4373 case ( Transparent ): return CBST_CE_Transparent;
4374 case ( NonTransparent ): return CBST_CE_NonTransparent;
4375 default: return CBST_CE_NotPresent;
4376 }
4377 }
4378
4379 /*
4380 +--------------------------------------------------------------------+
4381 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4382 | STATE : code ROUTINE: cm_set_bc_para |
4383 +--------------------------------------------------------------------+
4384
4385
4386 PURPOSE : Set bearer parameter for mobile originated calls.
4387
4388 */
4389
4390 void cm_set_bc_para(T_MFW_CM_BC_PARA * bc, UBYTE ti)
4391 {
4392 TRACE_FUNCTION ("cm_set_bc_para()");
4393 #ifdef FAX_AND_DATA
4394 sAT_PlusCBST(CMD_SRC_LCL,
4395 cm_cvt_speed_type ((T_MFW_CM_DATA_SPEED)bc->rate),
4396 cm_cvt_bs_type ((T_MFW_CM_BS)bc->bearer_serv),
4397 cm_cvt_ce_type ((T_MFW_CM_CE)bc->conn_elem));
4398 #endif /* FAX_AND_DATA */
4399 }
4400
4401
4402 /*
4403 +--------------------------------------------------------------------+
4404 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4405 | STATE : code ROUTINE: cm_notify |
4406 +--------------------------------------------------------------------+
4407
4408
4409 PURPOSE : Change of SS status from call party.
4410
4411 */
4412 void cm_notify(T_ACI_CSSU_CODE code,
4413 SHORT index,
4414 UBYTE *number)
4415 { char debug[50];
4416 sprintf(debug,"cm_notify(), code:%d, index:%d" , code, index);
4417 TRACE_EVENT(debug);
4418 if (number)
4419 notify.call_number = index;
4420
4421 if (code == CSSU_CODE_OnHold)
4422 notify.notification = MFW_CM_HOLD;
4423 if (code == CSSU_CODE_Retrieved)
4424 notify.notification = MFW_CM_RETRIEVED;
4425
4426 cm_signal(E_CM_NOTIFY, &notify);
4427 }
4428
4429
4430 /*
4431 +--------------------------------------------------------------------+
4432 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4433 | STATE : code ROUTINE : cm_get_aoc_value |
4434 +--------------------------------------------------------------------+
4435
4436
4437 PURPOSE : Getting AoC (advice of charge) value.
4438
4439 */
4440
4441 T_MFW cm_get_aoc_value(UBYTE request_type, T_MFW_CM_AOC_INFO *aoc_info)
4442 {
4443 T_ACI_RPCT_VAL rpuct;
4444
4445 TRACE_FUNCTION ("cm_get_aoc_value()");
4446
4447 switch (request_type)
4448 {
4449 /* Price pro unit and currency table */
4450 case CM_AOC_PUCT:
4451 if (qAT_PlusCPUC(CMD_SRC_LCL,
4452 (CHAR *)aoc_info->cur,
4453 (CHAR *)aoc_info->ppu) == AT_CMPL)
4454 {
4455 aoc_info->requested_type = CM_AOC_PUCT;
4456 return CM_OK;
4457 }
4458 else
4459 return CM_NO_AOC;
4460 // break; // RAVI
4461
4462 /* maximum value of accumulated Call Meter */
4463 case CM_AOC_ACMMAX:
4464 if (qAT_PlusCAMM(CMD_SRC_LCL, &aoc_info->acm_max) == AT_CMPL)
4465 {
4466 aoc_info->requested_type = CM_AOC_ACMMAX;
4467 return CM_OK;
4468 }
4469 else
4470 return CM_NO_AOC;
4471 // break; // RAVI
4472
4473 /* Accumulated Call Meter */
4474 case CM_AOC_ACM:
4475 if (qAT_PlusCACM(CMD_SRC_LCL, &aoc_info->acm) == AT_CMPL)
4476 {
4477 aoc_info->requested_type = CM_AOC_ACM;
4478 return CM_OK;
4479 }
4480 else
4481 return CM_NO_AOC;
4482 // break; // RAVI
4483
4484 case CM_AOC_CCM:
4485 if (qAT_PlusCAOC(CMD_SRC_LCL, &aoc_info->ccm) == AT_CMPL)
4486 {
4487 aoc_info->requested_type = CM_AOC_CCM;
4488 return CM_OK;
4489 }
4490 else
4491 return CM_NO_AOC;
4492 // break; // RAVI
4493
4494 case CM_AOC_TIMERS:
4495 if (qAT_PercentCTV(CMD_SRC_LCL, &aoc_info->actual_call_timer) == AT_CMPL)
4496 {
4497 aoc_info->requested_type = CM_AOC_TIMERS;
4498 return CM_OK;
4499 }
4500 else
4501 return CM_NO_AOC;
4502 // break; // RAVI
4503
4504 case CM_AOC_CCM_PUCT:
4505 if (qAT_PercentCAOC(CMD_SRC_LCL, (CHAR *)aoc_info->cur, (CHAR *)aoc_info->ccm_puct) == AT_CMPL)
4506 {
4507 aoc_info->requested_type = CM_AOC_CCM_PUCT;
4508 return CM_OK;
4509 }
4510 else
4511 return CM_NO_AOC;
4512 // break; // RAVI
4513
4514 case CM_AOC_ACM_PUCT:
4515 if (qAT_PercentCACM(CMD_SRC_LCL, (CHAR *)aoc_info->cur, (CHAR *)aoc_info->acm_puct) == AT_CMPL)
4516 {
4517 aoc_info->requested_type = CM_AOC_ACM_PUCT;
4518 return CM_OK;
4519 }
4520 else
4521 return CM_NO_AOC;
4522 case CM_AOC_RAW_PUCT:
4523 if (qAT_PercentRPCT(CMD_SRC_LCL, &rpuct) == AT_CMPL)
4524 {
4525 aoc_info->requested_type = CM_AOC_RAW_PUCT;
4526 strncpy((char *)aoc_info->cur, (char *)rpuct.currency, MAX_CUR_LEN);
4527 aoc_info->eppu = rpuct.eppu;
4528 aoc_info->exp = rpuct.exp;
4529 aoc_info->sexp = rpuct.sexp;
4530 return CM_OK;
4531 }
4532 else
4533 return CM_NO_AOC;
4534 // break; // RAVI
4535
4536 default:
4537 return CM_NO_AOC;
4538 }
4539 }
4540
4541
4542
4543 /*
4544 +----------------------------------------------------------------------+
4545 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4546 | STATE : code ROUTINE : cm_reset_aoc_value |
4547 +----------------------------------------------------------------------+
4548
4549
4550 PURPOSE : Setting AoC (advice of charge) value.
4551
4552 */
4553
4554 T_MFW cm_set_aoc_value(UBYTE request_type,
4555 T_MFW_CM_AOC_INFO *aoc_info,
4556 UBYTE *pwd)
4557 {
4558 TRACE_FUNCTION ("cm_reset_aoc_value()");
4559
4560 switch (request_type)
4561 {
4562 case CM_AOC_PUCT:
4563 if (sAT_PlusCPUC(CMD_SRC_LCL, (CHAR *)aoc_info->cur,
4564 (CHAR *)aoc_info->ppu, (CHAR *)pwd) != AT_EXCT)
4565 return CM_ERROR;
4566 break;
4567
4568 case CM_AOC_ACMMAX:
4569 if (sAT_PlusCAMM(CMD_SRC_LCL, aoc_info->acm_max,
4570 (CHAR *)pwd) != AT_EXCT)
4571 return CM_ERROR;
4572 break;
4573
4574 case CM_AOC_ACM:
4575 if (sAT_PlusCACM(CMD_SRC_LCL, (CHAR *)pwd) != AT_EXCT)
4576 return CM_ERROR;
4577 break;
4578
4579 default:
4580 return CM_ERROR;
4581 }
4582
4583 return CM_OK;
4584 }
4585
4586
4587 /*
4588 +----------------------------------------------------------------------+
4589 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4590 | STATE : code ROUTINE : cm_cvt_cmd |
4591 +----------------------------------------------------------------------+
4592
4593
4594 PURPOSE : Convert AoC command
4595
4596 */
4597
4598 UBYTE cm_cvt_cmd(T_ACI_AT_CMD cmdId)
4599 {
4600 switch (cmdId)
4601 {
4602 case AT_CMD_CACM: return CM_AOC_ACM;
4603 case AT_CMD_CAMM: return CM_AOC_ACMMAX;
4604 case AT_CMD_CPUC: return CM_AOC_PUCT;
4605 default: return CM_AOC_UNKNOWN;
4606 }
4607 }
4608
4609
4610 /*
4611 +----------------------------------------------------------------------+
4612 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4613 | STATE : code ROUTINE : cm_ok_aoc |
4614 +----------------------------------------------------------------------+
4615
4616
4617 PURPOSE : Setting AoC is successful.
4618
4619 */
4620
4621 void cm_ok_aoc(T_ACI_AT_CMD cmdId)
4622 {
4623 T_MFW_CM_AOC_CNF aoc_cnf;
4624
4625 aoc_cnf.requested_type = cm_cvt_cmd(cmdId);
4626 aoc_cnf.result = CM_AOC_CONF_OK;
4627 cm_signal(E_CM_AOC_CNF, &aoc_cnf);
4628 }
4629
4630
4631 /*
4632 +----------------------------------------------------------------------+
4633 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4634 | STATE : code ROUTINE : cm_error_aoc |
4635 +----------------------------------------------------------------------+
4636
4637
4638 PURPOSE : Setting AoC is failure.
4639
4640 */
4641
4642 void cm_error_aoc(T_ACI_AT_CMD cmdId, T_ACI_CME_ERR reason)
4643 {
4644 T_MFW_CM_AOC_CNF aoc_cnf;
4645
4646 aoc_cnf.requested_type = cm_cvt_cmd(cmdId);
4647 aoc_cnf.result = CM_AOC_CONF_UNKNOWN;
4648
4649 if (reason EQ CME_ERR_SimPin2Req)
4650 aoc_cnf.result = CM_AOC_CONF_SIMPIN2REQ;
4651
4652 if (reason EQ CME_ERR_WrongPasswd)
4653 aoc_cnf.result = CM_AOC_CONF_WRONGPASSWD;
4654
4655 if (reason EQ CME_ERR_OpNotAllow)
4656 aoc_cnf.result = CM_AOC_CONF_OPNOTALLOW;
4657
4658 if (reason EQ CME_ERR_AcmResetNeeded)
4659 aoc_cnf.result = CM_AOC_CONF_ACMRESETNEEDED;
4660
4661 cm_signal(E_CM_AOC_CNF, &aoc_cnf);
4662 }
4663
4664
4665 /*
4666 +-----------------------------------------------------------------+
4667 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4668 | STATE : code ROUTINE : rAT_PercentCTV |
4669 +-----------------------------------------------------------------+
4670
4671
4672 PURPOSE : manage timer in every second
4673
4674 */
4675
4676 void rAT_PercentCTV()
4677 {
4678 TRACE_FUNCTION("rAT_PercentCTV()");
4679 cm_signal(E_CM_TIMER_EVERY_SECOND, 0);
4680 }
4681
4682
4683 /*
4684 +-----------------------------------------------------------------+
4685 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4686 | STATE : code ROUTINE : rAT_PlusCCCM |
4687 +-----------------------------------------------------------------+
4688
4689
4690 PURPOSE :
4691
4692 */
4693
4694 void rAT_PlusCCCM(LONG *ccm)
4695 {
4696 T_MFW_CM_AOC_INFO aoc_info;
4697 T_ACI_RPCT_VAL rpuct;
4698
4699 TRACE_FUNCTION("rAT_PlusCCCM()");
4700
4701 memset(&aoc_info, 0, sizeof(T_MFW_CM_AOC_INFO));
4702
4703 qAT_PlusCAMM(CMD_SRC_LCL, &aoc_info.acm_max);
4704 qAT_PlusCACM(CMD_SRC_LCL, &aoc_info.acm);
4705 aoc_info.ccm = *ccm;
4706 qAT_PercentCTV(CMD_SRC_LCL, &aoc_info.actual_call_timer);
4707 qAT_PercentRPCT(CMD_SRC_LCL, &rpuct);
4708 strncpy((char *)aoc_info.cur, (char *)rpuct.currency, MAX_CUR_LEN);
4709 aoc_info.requested_type = CM_AOC_CCM;
4710 aoc_info.eppu = rpuct.eppu;
4711 aoc_info.exp = rpuct.exp;
4712 aoc_info.sexp = rpuct.sexp;
4713
4714 cm_signal(E_CM_AOC, &aoc_info);
4715 }
4716
4717
4718 /*
4719 +----------------------------------------------------------------+
4720 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4721 | STATE : code ROUTINE : cm_set_redial |
4722 +----------------------------------------------------------------+
4723
4724
4725 PURPOSE : Set redial mode (automatic/manual).
4726
4727 */
4728
4729 void cm_set_redial(UBYTE redial_mode)
4730 {
4731 // U8 version; // RAVI
4732 // Apr 14, 2005 REF: CRR 29991 xpradipg
4733 // local definition
4734 #ifdef FF_MMI_OPTIM
4735 T_MFW_CM_BLACKLIST_LIST black_list;
4736 #endif
4737
4738 TRACE_FUNCTION ("cm_set_redial()");
4739
4740 if (redial_mode == CM_REDIAL_BLACKLIST)
4741 {
4742 memset(&black_list, 0, sizeof(T_MFW_CM_BLACKLIST_LIST));
4743 // Apr 14, 2005 REF: CRR 29991 xpradipg
4744 // reset the file contents
4745 #ifdef FF_MMI_OPTIM
4746 if(flash_MMI_blackList_write((U8 *)&black_list, sizeof(T_MFW_CM_BLACKLIST_LIST),0) < 0)
4747 TRACE_FUNCTION(" Error writing into file");
4748 #endif
4749 return;
4750 }
4751
4752 if (redial_mode == CM_REDIAL_OFF
4753 || redial_mode == CM_REDIAL_AUTO
4754 || redial_mode == CM_REDIAL_MANU)
4755 {
4756 redial_stat = redial_mode;
4757
4758 /* write redialing mode to EEPROM */
4759
4760 FFS_flashData.redial_mode =redial_mode;
4761 flash_write();
4762
4763 }
4764 }
4765
4766
4767 /*
4768 +---------------------------------------------------------------------+
4769 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
4770 | STATE : code ROUTINE : cm_get_redial_mode |
4771 +---------------------------------------------------------------------+
4772
4773
4774 PURPOSE : Request the setting of redial mode (automatic/manual).
4775
4776 */
4777
4778 T_MFW cm_get_redial_mode(void)
4779 {
4780 return redial_stat;
4781 }
4782
4783
4784
4785
4786 /*
4787 +--------------------------------------------------------------------+
4788 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4789 | STATE : code ROUTINE: cm_stop_redialTim |
4790 +--------------------------------------------------------------------+
4791
4792
4793 PURPOSE : Stop redialing time.
4794
4795 */
4796
4797 void cm_stop_redialTim(void)
4798 {
4799 if (!redial_count)
4800 timStop(redialTim1);
4801
4802 if (redial_count >= 1 AND redial_count <= 3)
4803 timStop(redialTim24);
4804
4805 if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
4806 timStop(redialTim5);
4807 redial_count = 0;
4808 rdl.left_attempts = 0;
4809
4810 /*
4811 reset the counter
4812 */
4813
4814 call_stat = MFW_CALL_FREE;
4815 call_type = MFW_CALL_FREE;
4816 cc_stat.type = MFW_CALL_FREE;
4817 }
4818
4819
4820 /*
4821 +--------------------------------------------------------------------+
4822 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4823 | STATE : code ROUTINE: cm_redial_abort |
4824 +--------------------------------------------------------------------+
4825
4826
4827 PURPOSE : Stop redialing from MMI.
4828
4829 */
4830
4831 void cm_redial_abort(void)
4832 {
4833
4834 TRACE_FUNCTION ("cm_redial_abort()");
4835
4836 if (call_stat == REDIALING_CALL OR call_stat == OUTGOING_CALL)
4837 cm_stop_redialTim();
4838
4839 rdl.redial_mode = CM_REDIAL_ABORTED;
4840 cm_signal(E_CM_REDIAL, &rdl);
4841 }
4842
4843
4844 /*
4845 +---------------------------------------------------------------------+
4846 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4847 | STATE : code ROUTINE: cm_autoredial_start |
4848 +---------------------------------------------------------------------+
4849
4850
4851 PURPOSE : start autoredial.
4852
4853 */
4854
4855 void cm_autoredial_start(void)
4856 {
4857 timStart(redialTim1);
4858 }
4859
4860
4861 /*
4862 +--------------------------------------------------------------------+
4863 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4864 | STATE : code ROUTINE: cm_redial_timeout |
4865 +--------------------------------------------------------------------+
4866
4867
4868 PURPOSE : Call back from system clock for redialing time interval.
4869
4870 */
4871
4872 static int cm_redial_timeout(MfwEvt e, MfwTim *t)
4873 {
4874 CHAR number[MFW_NUM_LEN+MAX_LEN+1];
4875 int max_num_size = MFW_NUM_LEN+MAX_LEN+1;
4876
4877 TRACE_FUNCTION ("cm_redial_timeout()");
4878
4879 memset(number, 0, sizeof(number));
4880 mfwStrncpy(number, (CHAR *)cc_stat.prefix, max_num_size);
4881 max_num_size -= strlen((char *)cc_stat.prefix);
4882
4883 if ((cc_stat.ton EQ MFW_TON_INTERNATIONAL) AND (cc_stat.number[0] != '+'))
4884 {
4885 strcat(number, "+");
4886 max_num_size--;
4887 }
4888
4889 strncat(number, (CHAR *)cc_stat.number, max_num_size);
4890
4891 switch (redial_stat)
4892 {
4893 case CM_REDIAL_AUTO:
4894 if (sAT_Dn(CMD_SRC_LCL,
4895 (CHAR *)number,
4896 D_CLIR_OVRD_Default,
4897 D_CUG_CTRL_NotPresent,
4898 D_TOC_Voice) NEQ AT_EXCT)
4899 {
4900 TRACE_ERROR("sAT_Dn error");
4901 return 0;
4902 }
4903
4904 call_stat = OUTGOING_CALL;
4905
4906 cm_search_callId(CAL_STAT_Dial, &cc_stat.call_number);
4907 cc_stat.type = REDIALING_CALL;
4908
4909 rdl.redial_mode = CM_REDIAL_ATTEMPT;
4910 rdl.call_id = cc_stat.call_number;
4911 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
4912 #ifdef NO_ASCIIZ
4913 rdl.name.len = cc_stat.name.len;
4914 memcpy(rdl.name.data,
4915 cc_stat.name.data,
4916 cc_stat.name.len);
4917 #else
4918 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
4919 // strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
4920 #endif
4921 rdl.ton = cc_stat.ton;
4922 rdl.type = cc_stat.mode;
4923 redial_count++;
4924 rdl.left_attempts = MAX_REDIAL_ATTEMPT - redial_count;
4925 cm_signal(E_CM_REDIAL, &rdl);
4926 return 1;
4927
4928 case CM_REDIAL_MANU:
4929 rdl.redial_mode = CM_REDIAL_MANU;
4930 mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
4931 #ifdef NO_ASCIIZ
4932 rdl.name.len = cc_stat.name.len;
4933 memcpy(rdl.name.data,
4934 cc_stat.name.data,
4935 cc_stat.name.len);
4936 #else
4937 mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
4938 #endif
4939 rdl.ton = cc_stat.ton;
4940 rdl.type = cc_stat.mode;
4941 rdl.left_attempts = MAX_REDIAL_ATTEMPT - redial_count;
4942
4943 cm_signal(E_CM_REDIAL, &rdl);
4944 return 1;
4945
4946 default:
4947 return 0;
4948 }
4949 }
4950
4951
4952 /*
4953 +--------------------------------------------------------------------+
4954 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4955 | STATE : code ROUTINE: cm_redial |
4956 +--------------------------------------------------------------------+
4957
4958
4959 PURPOSE : Start the manual redialing.
4960
4961 */
4962
4963 void cm_redial()
4964 {
4965 char buf[80];
4966
4967 int max_buf_size = sizeof(buf);
4968
4969 TRACE_FUNCTION ("cm_redial()");
4970
4971 buf[0] = '\0';
4972
4973 mfwStrncpy(buf, (char *)cc_stat.prefix, max_buf_size);
4974 max_buf_size -= strlen((char *)cc_stat.prefix);
4975
4976 if ((cc_stat.ton EQ MFW_TON_INTERNATIONAL) AND (cc_stat.number[0] != '+'))
4977 {
4978 strcat(buf, "+");
4979 max_buf_size--;
4980 }
4981
4982 strncat(buf, (char *)cc_stat.number, max_buf_size);
4983
4984 if (sAT_Dn(CMD_SRC_LCL, buf, D_CLIR_OVRD_Default, D_CUG_CTRL_NotPresent, D_TOC_Voice) NEQ AT_EXCT) /*a0393213 compiler warning removal -- -1 changed to respective enum value*/
4985 {
4986 TRACE_ERROR("sAT_Dn error");
4987 }
4988
4989 call_stat = OUTGOING_CALL;
4990 cc_stat.type = REDIALING_CALL;
4991 redial_count++;
4992 }
4993
4994
4995 /*
4996 +--------------------------------------------------------------------+
4997 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
4998 | STATE : code ROUTINE: cm_redial_get_count |
4999 +--------------------------------------------------------------------+
5000
5001
5002 PURPOSE : returns the counter of call attempt
5003
5004 */
5005 UBYTE cm_redial_get_count(void)
5006 {
5007 return redial_count;
5008 }
5009
5010
5011
5012 /*
5013 +--------------------------------------------------------------------+
5014 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5015 | STATE : code ROUTINE: cm_cvt_call_status |
5016 +--------------------------------------------------------------------+
5017
5018
5019 PURPOSE : Convert the call status.
5020
5021 */
5022
5023 LOCAL T_MFW_CM_CALL_STAT cm_cvt_call_status( T_ACI_CAL_STAT stat )
5024 {
5025 switch ( stat )
5026 {
5027 case ( CAL_STAT_Held ): return CALL_HELD;
5028 case ( CAL_STAT_Active ): return CALL_ACTIVE;
5029 case ( CAL_STAT_Wait ): return CALL_WAIT;
5030 case ( CAL_STAT_Dial ): return CALL_DIAL;
5031 case (CAL_STAT_Alerting): return CALL_ALERT;
5032 case (CAL_STAT_DeactiveReq): return CALL_DEACTIVE;
5033 default: return NOT_PRESENT;
5034 }
5035 }
5036
5037 /*
5038 +--------------------------------------------------------------------+
5039 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5040 | STATE : code ROUTINE: cm_cvt_call_status |
5041 +--------------------------------------------------------------------+
5042
5043
5044 PURPOSE : Request the call status.
5045
5046 */
5047
5048 T_MFW_CM_CALL_TYPE cm_cvt_call_mode( T_ACI_CAL_MODE type )
5049 {
5050 TRACE_EVENT_P1("cm_cnt_call_mode %d", type);
5051 switch ( type )
5052 {
5053 case ( CAL_MODE_Voice ): return VOICE_CALL;
5054 case ( CAL_MODE_Data ): return DATA_CALL;
5055 case ( CAL_MODE_Fax ): return FAX_CALL;
5056 case (CAL_MODE_VFD_Voice): return VFD_VOICE;
5057 case (CAL_MODE_VAD_Voice): return VAD_VOICE;
5058 case (CAL_MODE_VAF_Voice): return VAF_VOICE;
5059 case (CAL_MODE_VFD_Data): return VFD_DATA;
5060 case (CAL_MODE_VAD_Data): return VAD_DATA;
5061 case (CAL_MODE_VAF_Fax): return VAF_FAX;
5062 default: return NONE_TYPE;
5063 }
5064 }
5065
5066 T_MFW_CM_CALL_DIR cm_cvt_call_direction( T_ACI_CAL_TYPE type )
5067 {
5068 TRACE_EVENT_P1("cm_cvt_call_direction %d", type);
5069 switch ( type )
5070 {
5071 case ( CAL_TYPE_NotPresent): return MFW_CM_INV_DIR;
5072 case ( CAL_TYPE_MOC): return MFW_CM_MOC;
5073 case ( CAL_TYPE_MTC): return MFW_CM_MTC;
5074 default: return MFW_CM_INV_DIR;
5075 }
5076 }
5077
5078 /*
5079 +--------------------------------------------------------------------+
5080 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5081 | STATE : code ROUTINE: cm_status |
5082 +--------------------------------------------------------------------+
5083
5084
5085 PURPOSE : Request the call status.
5086
5087 */
5088
5089 int cm_status(SHORT call_number, T_MFW_CM_STATUS *status, UBYTE num)
5090 {
5091 UBYTE cnt;
5092 int i;
5093 // Apr 06 2005 REF: CRR 29989 xpradipg
5094 // define and allocate memory
5095 #ifdef FF_MMI_OPTIM
5096 T_ACI_CAL_ENTR *call_tab;//[MAX_CALL_NR];
5097 call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
5098 if( NULL == call_tab)
5099 return 0;
5100 #endif
5101
5102
5103 cnt = 0;
5104 qAT_PercentCAL(CMD_SRC_LCL, call_tab);
5105
5106 if (call_number > 0)
5107 {
5108 for (i=0; i<MAX_CALL_NR; i++)
5109 {
5110 if (call_tab[i].index == call_number)
5111 {
5112 status[0].call_number = call_tab[i].index;
5113 status[0].stat = cm_cvt_call_status(call_tab[i].status);
5114 status[0].type = cm_cvt_call_mode(call_tab[i].calMode);
5115 status[0].mtpy = (T_MFW_MTPY_MEMBER)call_tab[i].mpty;
5116 status[0].call_direction = cm_cvt_call_direction(call_tab[i].calType);
5117
5118 if (call_tab[i].number != NULL)
5119 {
5120 mfwStrncpy((char *)status[0].number, call_tab[i].number, MFW_NUM_LEN);
5121 status[0].ton = phb_cvtTon(call_tab[i].type.ton);
5122 }
5123 else
5124 memset(status[0].number, '\0', MFW_NUM_LEN);
5125
5126 #ifdef NO_ASCIIZ
5127 status[0].name.len = call_tab[i].alpha.len;
5128 if (call_tab[i].alpha.len)
5129 memcpy(status[0].name.data,
5130 call_tab[i].alpha.data,
5131 call_tab[i].alpha.len);
5132 else //We'll also zero the string.
5133 memset(status[0].name.data, '\0', PHB_MAX_LEN);
5134 #else
5135 if (call_tab[i].alpha != NULL)
5136 mfwStrncpy((char *)status[0].name, call_tab[i].alpha, MFW_TAG_LEN);
5137 else
5138 memset(status[0].name, '\0', MFW_TAG_LEN);
5139 #endif
5140 cnt = 1;
5141 break;
5142 }
5143 }
5144 // Apr 06 2005 REF: CRR 29989 xpradipg
5145 // deallocate memory
5146 #ifdef FF_MMI_OPTIM
5147 if(call_tab)
5148 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
5149 #endif
5150 return cnt;
5151 }
5152
5153 if (!call_number)
5154 {
5155 for (i=0; i<MAX_CALL_NR; i++)
5156 {
5157 if ((call_tab[i].index EQ -1) OR cnt > num)
5158 break;
5159
5160 if (call_tab[i].status != CAL_STAT_NotPresent)
5161 {
5162 status[cnt].call_number = call_tab[i].index;
5163 status[cnt].stat = cm_cvt_call_status(call_tab[i].status);
5164 status[cnt].type = cm_cvt_call_mode(call_tab[i].calMode);
5165 status[cnt].mtpy = (T_MFW_MTPY_MEMBER)call_tab[i].mpty;
5166 if (call_tab[i].number != NULL)
5167 {
5168 mfwStrncpy((char *)status[cnt].number, call_tab[i].number, MFW_NUM_LEN);
5169 status[cnt].ton = phb_cvtTon(call_tab[i].type.ton);
5170 }
5171 else
5172 memset(status[cnt].number, '\0', MFW_NUM_LEN);
5173
5174 #ifdef NO_ASCIIZ
5175 status[cnt].name.len = call_tab[i].alpha.len;
5176 if (call_tab[i].alpha.len != 0)
5177 memcpy(status[cnt].name.data,
5178 call_tab[i].alpha.data,
5179 call_tab[i].alpha.len);
5180 else //We'll also zero the string.
5181 memset(status[cnt].name.data, '\0', PHB_MAX_LEN);
5182 #else
5183 if (call_tab[i].alpha != NULL)
5184 mfwStrncpy((char *)status[cnt].name, call_tab[i].alpha, MFW_TAG_LEN);
5185 else
5186 memset(status[cnt].name, '\0', MFW_TAG_LEN);
5187 #endif
5188 cnt++;
5189 }
5190 }
5191 // Apr 06 2005 REF: CRR 29989 xpradipg
5192 // deallocate memory
5193 #ifdef FF_MMI_OPTIM
5194 if(call_tab)
5195 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
5196 #endif
5197 return cnt;
5198 }
5199 // Apr 06 2005 REF: CRR 29989 xpradipg
5200 // deallocate memory
5201 #ifdef FF_MMI_OPTIM
5202 if(call_tab)
5203 mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
5204 #endif
5205 return 0;
5206 }
5207
5208
5209 /*
5210 +--------------------------------------------------------------------+
5211 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5212 | STATE : code ROUTINE: cm_AT_CHLD |
5213 +--------------------------------------------------------------------+
5214
5215
5216 PURPOSE : Notify the CHLD command
5217
5218 */
5219
5220 void cm_AT_CHLD(T_ACI_CLOG *clog_cmd)
5221 {
5222 SHORT id;
5223 #ifdef FF_ATI
5224 T_ACI_CAL_MODE call_mode;
5225 #endif
5226 T_MFW_CM_STATUS status;
5227 char buf[80];
5228
5229 TRACE_EVENT("cm_AT_CHLD()");
5230
5231 /*SPR#1965 - DS - Removed setting of call_number to zero. Port of 1962
5232 *dis_connect.call_number = 0;
5233 */
5234 sprintf(buf, "dis_connect.call_number %d, cmd_hold %d, cId %d, srcId %d, mode %d, act %d",
5235 dis_connect.call_number, cmd_hold, clog_cmd->cId, clog_cmd->cmdPrm.sCHLD.srcId,
5236 clog_cmd->cmdPrm.sCHLD.mode, clog_cmd->cmdPrm.sCHLD.act);
5237 TRACE_EVENT(buf);
5238
5239 if ((clog_cmd->cmdPrm.sCHLD.act != CHLD_ACT_Retrieve) &&
5240 (clog_cmd->cmdPrm.sCHLD.act != CHLD_ACT_RetrieveMpty))
5241 {
5242 /*SPR#1962 - DS - Set call_number to call Id returned from ACI */
5243 TRACE_EVENT("Set dis_connect.call_number to clog_cmd->cId");
5244 dis_connect.call_number = clog_cmd->cId;
5245 }
5246 else
5247 {
5248 dis_connect.call_number = -1;
5249 }
5250 if (clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_LCL)
5251 {
5252 switch(clog_cmd->cmdPrm.sCHLD.mode)
5253 {
5254 case CHLD_MOD_RelHldOrUdub:
5255
5256 if (cm_search_callId(CAL_STAT_DeactiveReq, &id) == CM_OK)
5257 {
5258 TRACE_FUNCTION("CAL_STAT_DeactiveReq - 0SEND");
5259 if ( cmd_hold EQ MFW_CM_1_SEND )
5260 {
5261 TRACE_FUNCTION("cmd_hold EQ MFW_CM_1_SEND");
5262 cm_status(id, &status, 1);
5263 if (status.mtpy EQ MFW_MTPY_MEMBER)
5264 dis_connect.call_number = 0;
5265 else
5266 dis_connect.call_number = id;
5267 }
5268 }
5269
5270 // Apr 26 2006, a0393213 (Prabakar R), OMAPS00074886 : No option in MMI to release the held call.
5271 // cmd_hold variable is set to MFW_CM_TERMINATED to indicate that the call has been terminated
5272 cmd_hold = MFW_CM_TERMINATED;
5273 break;
5274
5275 case CHLD_MOD_RelActAndAcpt:
5276
5277 // MMI-SPR 13873 xkundadu
5278 // Handling of 1+SEND - Releases all active calls (if any exist) and
5279 // accepts the other (held or waiting) call.
5280
5281 if( (cm_search_callId(CAL_STAT_DeactiveReq, &id) == CM_OK) OR
5282 (cm_search_callId(CAL_STAT_Active, &id) == CM_OK))
5283 {
5284 // If there is an active call/active call whose disconnection
5285 // is initiated, store the index of that call.
5286 dis_connect.call_number = id;
5287 if(bIsMultpty == TRUE)
5288 {
5289 // Call is in multiparty
5290 // 1SEND for multiparty will disconnect all the active calls
5291 // To clear all calls assign the dis_connect.call_number to
5292 // zero
5293 dis_connect.call_number = 0;
5294 bIsMultpty = FALSE;
5295 }
5296 }
5297 else
5298 {
5299 // There is no active calls/active calls whose disconnection is
5300 // iniated existing
5301 dis_connect.call_number = -1;
5302 }
5303 if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
5304 {
5305 // Waiting call is existing.
5306 // In the function cm_result_cmd(), value of cmd.call_number
5307 // is used to determine whether to call cm_connect() or not
5308 cmd.call_number=0;
5309 }
5310 cmd_hold = MFW_CM_1_SEND;
5311 break;
5312
5313 case CHLD_MOD_HldActAndAcpt:
5314
5315 // MMI -SPR 13873 xkundadu
5316 // Handling of 2+SEND - Places all active calls (if any exist) on hold
5317 // and accepts the other (held or waiting) call.
5318
5319 switch (clog_cmd->cmdPrm.sCHLD.act)
5320 {
5321
5322 case CHLD_ACT_Accept:
5323 // Accept the incoming call
5324 cmd_hold = MFW_CM_MT_ACCEPT;
5325 break;
5326
5327 case CHLD_ACT_Hold:
5328 // Getting the id of the call which has been put on hold by ACI
5329 cmd.command = CM_HOLD;
5330 if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
5331 {
5332 cmd.call_number = id;
5333 }
5334 else
5335 {
5336 cmd.call_number = -1;
5337 }
5338 break;
5339
5340 case CHLD_ACT_Swap:
5341 // Swap the call
5342 cmd.command = CM_SWAP;
5343 break;
5344
5345 case CHLD_ACT_Retrieve:
5346 // Getting the id of the call which has been made active by ACI
5347 cmd.command = CM_RETRIEVE;
5348 if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
5349 {
5350 cmd.call_number = id;
5351 }
5352 else
5353 {
5354 cmd.call_number = -1;
5355 }
5356 break;
5357 case CHLD_ACT_HoldMpty:
5358 // Put the calls on HOLD
5359 cmd.command = CM_HOLD_MULTIPARTY;
5360 break;
5361
5362 case CHLD_ACT_RetrieveMpty:
5363 // Retrieve the held calls to active
5364 cmd.command = CM_RETRIEVE_MULTIPARTY;
5365 break;
5366
5367 case CHLD_ACT_SwapMpty:
5368 // Swap muliparty calls
5369 cmd.command = CM_SWAP_MULTIPARTY;
5370 break;
5371
5372 default:
5373 cmd.command = CM_COMMAND_UNKNOWN;
5374 break;
5375
5376 }
5377 break;
5378 case CHLD_MOD_RelActSpec:
5379 dis_connect.call_number = (SHORT)atoi(clog_cmd->cmdPrm.sCHLD.call);
5380 break;
5381
5382 default:
5383 break;
5384 }
5385 }
5386
5387 // Aug 23, 2004 REF: CRR 22222 xkundadu
5388 // Bug: Runaway Call Waiting Tone.
5389 // Fix: Handle the AT-Command source id CMD_SRC_ATI_2 also for call control
5390 // callback functions.Include source Id CMD_SRC_ATI_2 also for checking.
5391
5392 //Nov 02, 2005 DR OMAPS00052132 xdeepadh
5393 //The usage of ATI enum is put under the flag FF_ATI
5394
5395 //Apr 21, 2006 OMAPS00070774 a0393213 (Prabakar R)
5396 //Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=2 in ATI.
5397 // expected behaviour : active call should be put to hold and the incoming call should be accepted
5398 // observed behaviour : happens as expected. but display shows incoming call screen only.
5399 // active screen is not shown eventhough the connection is established between MS1 and MS3
5400 //Fix : AT commands from CMD_SRC_ATI_3 was not processed. As a result, MFW was not informed of the acceptance of the call
5401 //through ATI. In precise cmd_hold variable was not set to MFW_CM_MT_ACCEPT, which is necessary for display update
5402
5403 #ifdef FF_ATI
5404 if ((clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_ATI_1) //NM Berlin UK integration
5405 OR (clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_ATI_2) // Added for MMI-SPR 22222 FIX
5406 OR (clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_ATI_3)) // Added for OMAPS00070774 FIX
5407 {
5408 switch(clog_cmd->cmdPrm.sCHLD.mode)
5409 {
5410 case CHLD_MOD_RelHldOrUdub:
5411 if (clog_cmd->cmdPrm.sCHLD.act == CHLD_ACT_Release)
5412 dis_connect.call_number = clog_cmd->cId;
5413 cmd_hold = MFW_CM_TERMINATED;
5414 break;
5415 case CHLD_MOD_RelActAndAcpt:
5416 switch (clog_cmd->cmdPrm.sCHLD.act)
5417 {
5418 case CHLD_ACT_Release:
5419 dis_connect.call_number = clog_cmd->cId;
5420 break;
5421 case CHLD_ACT_Accept:
5422 if (cm_search_callId(CAL_STAT_DeactiveReq, &id) == CM_OK)
5423 dis_connect.call_number = id;
5424 else if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
5425 {
5426 call_mode = cm_search_callMode(id);
5427 if (call_mode EQ CAL_MODE_Data
5428 OR call_mode EQ CAL_MODE_Fax)
5429 dis_connect.call_number = id;
5430 }
5431 if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
5432 {
5433 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
5434 cc_id = id;
5435 #endif
5436
5437 //Apr 22, 2006 OMAPS00070762 a0393213 (Prabakar R)
5438 //Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=1 in ATI.
5439 //expected behaviour : active call should be released and the incoming call should be accepted
5440 //observed behaviour : happens as expected. but display shows incoming call screen only.
5441 // active screen is not shown eventhough the connection is established between MS1 and MS3
5442 //Fix : cmd.call_number was not set to 0, which is required in cm_result_cmd()
5443 // to call cm_ok_connect()which updates the display. It's set.
5444 cmd.call_number=0;
5445 }
5446
5447 break;
5448 case CHLD_ACT_Retrieve:
5449 if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
5450 {
5451 cmd.command = CM_RETRIEVE;
5452 cmd.call_number = id;
5453 }
5454 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
5455 if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
5456 cc_id = id;
5457 #else
5458 cm_search_callId(CAL_STAT_Wait, &id);
5459 #endif
5460 break;
5461 }
5462 cmd_hold = MFW_CM_1_SEND;
5463 break;
5464 case CHLD_MOD_RelActSpec:
5465 dis_connect.call_number = clog_cmd->cId;
5466 if (dis_connect.call_number)
5467 cmd_hold = MFW_CM_TERMINATED;
5468 else
5469 cmd_hold = MFW_CM_MPTY_TERMINATED;
5470 break;
5471 case CHLD_MOD_HldActAndAcpt:
5472 switch (clog_cmd->cmdPrm.sCHLD.act)
5473 {
5474 case CHLD_ACT_Accept:
5475 cmd_hold = MFW_CM_MT_ACCEPT;
5476 break;
5477 case CHLD_ACT_Hold:
5478 cmd.command = CM_HOLD;
5479 if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
5480 cmd.call_number = id;
5481 else
5482 cmd.call_number = -1;
5483 break;
5484 case CHLD_ACT_Swap:
5485 cmd.command = CM_SWAP;
5486 break;
5487 case CHLD_ACT_Retrieve:
5488 cmd.command = CM_RETRIEVE;
5489 if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
5490 cmd.call_number = id;
5491 else
5492 cmd.call_number = -1;
5493 break;
5494 case CHLD_ACT_SwapMpty:
5495 cmd.command = CM_SWAP_MULTIPARTY;
5496 break;
5497 case CHLD_ACT_HoldMpty:
5498 cmd.command = CM_HOLD_MULTIPARTY;
5499 break;
5500 case CHLD_ACT_RetrieveMpty:
5501 cmd.command = CM_RETRIEVE_MULTIPARTY;
5502 break;
5503 default:
5504 cmd.command = CM_COMMAND_UNKNOWN;
5505 break;
5506 }
5507 break;
5508 case CHLD_MOD_HldActExc:
5509 if (clog_cmd->cmdPrm.sCHLD.act == CHLD_ACT_SplitMpty)
5510 cmd.command = CM_SPLIT_MULTIPARTY;
5511 else
5512 cmd.command = CM_COMMAND_UNKNOWN;
5513 break;
5514 case CHLD_MOD_AddHld:
5515 if (clog_cmd->cmdPrm.sCHLD.act == CHLD_ACT_BuildMpty)
5516 cmd.command = CM_RETRIEVE_MULTIPARTY;
5517 else
5518 cmd.command = CM_COMMAND_UNKNOWN;
5519 break;
5520 case CHLD_MOD_Ect:
5521 cmd.command = CM_ETC;
5522 break;
5523 case CHLD_MOD_Ccbs:
5524 TRACE_EVENT("CHLD_MOD_Ccbs");
5525 cmd.command = CM_CCBS;
5526 break;
5527 case CHLD_MOD_HldActDial:
5528 cmd_hold = MFW_CM_HOLD_AND_DIAL;
5529 cmd.command = CM_HOLD;
5530 break;
5531 default:
5532 break;
5533 }
5534 }
5535 #endif //FF_ATI
5536 }
5537
5538
5539 /*
5540 +--------------------------------------------------------------------+
5541 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5542 | STATE : code ROUTINE: cm_AT_D |
5543 +--------------------------------------------------------------------+
5544
5545
5546 PURPOSE : Notify the outgoing call command.
5547
5548 */
5549
5550 void cm_AT_D(T_ACI_CLOG *cmd)
5551 {
5552 SHORT index;
5553 T_MFW_CM_CALL_STAT stat;
5554 UBYTE ton;
5555 UBYTE mode;
5556 // Sep 01, 2006 REF:OMAPS00090555 x0039928
5557 // Fix : Allocate the memory for entry and findText from heap instead of stack.
5558 #ifdef FF_MMI_PB_OPTIM
5559 T_MFW_PHB_ENTRY * entry = (T_MFW_PHB_ENTRY*)mfwAlloc(sizeof(T_MFW_PHB_ENTRY));
5560 T_MFW_PHB_TEXT * findText = (T_MFW_PHB_TEXT*)mfwAlloc(sizeof(T_MFW_PHB_TEXT));
5561 #else
5562 T_MFW_PHB_ENTRY entry;
5563 T_MFW_PHB_TEXT findText;
5564 #endif
5565
5566 TRACE_FUNCTION("cm_at_d()");
5567
5568 // Sep 01, 2006 REF:OMAPS00090555 x0039928
5569 #ifdef FF_MMI_PB_OPTIM
5570 #ifdef NO_ASCIIZ
5571 entry->name.len = 0;
5572 #else
5573 memset (entry->name, '\0', MAX_LEN);
5574 #endif
5575 memset (entry->number, '\0', MAX_LEN);
5576 entry->index = 0;
5577 entry->npi = 0;
5578 entry->ton = 0;
5579 entries.entry = entry;
5580 #else
5581 #ifdef NO_ASCIIZ
5582 entry.name.len = 0;
5583 #else
5584 memset (entry.name, '\0', MAX_LEN);
5585 #endif
5586 memset (entry.number, '\0', MAX_LEN);
5587 entry.index = 0;
5588 entry.npi = 0;
5589 entry.ton = 0;
5590 entries.entry = &entry;
5591 #endif
5592
5593 if (cmd->cmdPrm.sD.srcId == CMD_SRC_LCL)
5594 {
5595 out_call.call_id = cmd->cId;
5596 mfwStrncpy((char *)out_call.number, cmd->cmdPrm.sD.number, MFW_NUM_LEN);
5597 if (cc_stat.type == OUTGOING_CALL)
5598 {
5599 mfwStrncpy((char *)cc_stat.number, cmd->cmdPrm.sD.number, MFW_NUM_LEN);
5600 #ifdef NO_ASCIIZ
5601 cc_stat.name.len = 0;
5602 out_call.name.len = 0;
5603 #else
5604 cc_stat.name[0] = '\0';
5605 out_call.name[0] = '\0';
5606 #endif
5607 if (cm_search_callStat(cmd->cId, &stat, &ton, &mode) == CM_OK)
5608 {
5609 out_call.type = mode;
5610 // Oct 10, 2006 DR: OMAPS00093720 x0039928
5611 // Fix: Set the cc_stat.ton info from out_call.ton
5612 cc_stat.ton = out_call.ton;
5613 cc_stat.mode = (T_MFW_CM_CALL_TYPE)mode;
5614 }
5615
5616 // Sep 01, 2006 REF:OMAPS00090555 x0039928
5617 #ifdef NO_ASCIIZ
5618 #ifdef FF_MMI_PB_OPTIM
5619 mfwStrncpy((char *)findText->data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
5620 findText->len = strlen(cmd->cmdPrm.sD.number);
5621 #else
5622 mfwStrncpy((char *)findText.data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
5623 findText.len = strlen(cmd->cmdPrm.sD.number);
5624 #endif
5625 if (phb_find_entries (PHB_ADN,
5626 &index,
5627 MFW_PHB_NUMBER,
5628 1,
5629 #ifdef FF_MMI_PB_OPTIM
5630 findText,
5631 #else
5632 &findText,
5633 #endif
5634 &entries) EQ MFW_PHB_OK)
5635 {
5636 if (entries.num_entries)
5637 {
5638 cc_stat.name.len = entries.entry[0].name.len;
5639 memcpy(cc_stat.name.data,
5640 entries.entry[0].name.data,
5641 entries.entry[0].name.len);
5642
5643 out_call.name.len = entries.entry[0].name.len;
5644 memcpy(out_call.name.data,
5645 entries.entry[0].name.data,
5646 entries.entry[0].name.len);
5647 }
5648 }
5649 #else
5650 if (phb_find_entries (PHB_ADN,
5651 &index,
5652 MFW_PHB_NUMBER,
5653 1,
5654 cmd->cmdPrm.sD.number,
5655 (T_MFW_PHB_LIST *)&entries) EQ MFW_PHB_OK)
5656 {
5657 if (entries.num_entries)
5658 {
5659 mfwStrncpy((char *)cc_stat.name, (char *)entries.entry[0].name, MFW_TAG_LEN);
5660 mfwStrncpy((char *)out_call.name, (char *)entries.entry[0].name, PHB_MAX_LEN);
5661 }
5662 }
5663 #endif
5664 }
5665
5666 if (cc_stat.type == REDIALING_CALL)
5667 {
5668 #ifdef NO_ASCIIZ
5669 out_call.name.len = cc_stat.name.len;
5670 memcpy(out_call.name.data,
5671 cc_stat.name.data,
5672 cc_stat.name.len);
5673 #else
5674 mfwStrncpy((char *)out_call.name, (char *)cc_stat.name, MFW_TAG_LEN);
5675 #endif
5676 out_call.type = cc_stat.mode;
5677 }
5678 // Sep 01, 2006 REF:OMAPS00090555 x0039928
5679 // Fix: Free the dynamic memory allocated if flag FF_MMI_PB_OPTIM is defined
5680 #ifdef FF_MMI_PB_OPTIM
5681 mfwFree((U8*) entry, sizeof(T_MFW_PHB_ENTRY));
5682 mfwFree((U8*) findText, sizeof(T_MFW_PHB_TEXT));
5683 #endif
5684 cm_signal(E_CM_MO_RES, &out_call);
5685 }
5686 else if (cmd->cmdPrm.sD.srcId < CMD_SRC_MAX)
5687 {
5688 //x0pleela 03 Nov, 2006 DR: OMAPS00101158
5689 //set the value of uOthersrc to TRUE as the source id is not LOCAL
5690 mfw_set_OtherSrc_Value(TRUE);
5691 out_call.call_id = cmd->cId;
5692 mfwStrncpy((char *)out_call.number, (char *)cmd->cmdPrm.sD.number, MFW_NUM_LEN);
5693 #ifdef NO_ASCIIZ
5694 out_call.name.len = 0;
5695 #else
5696 out_call.name[0] = '\0';
5697 #endif
5698 if (cm_search_callStat(cmd->cId, &stat, &ton, &mode) == CM_OK)
5699 {
5700 out_call.type = mode;
5701 }
5702 //x0pleela 03 Nov, 2006 DR: OMAPS00101158
5703 //check the value of uOthersrc
5704 //If the value is not set then do the phone book search operation
5705 //Else do not perform phone book search operation
5706 //this is to avoid stack overflow probelm when the source id is not LOCAL
5707 if(!mfw_get_OtherSrc_Value())//x0pleela 3 nov 2006
5708 {
5709 // Sep 01, 2006 REF:OMAPS00090555 x0039928
5710 #ifdef NO_ASCIIZ
5711 #ifdef FF_MMI_PB_OPTIM
5712 mfwStrncpy((char *)findText->data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
5713 findText->len = strlen(cmd->cmdPrm.sD.number);
5714 #else
5715 mfwStrncpy((char *)findText.data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
5716 findText.len = strlen(cmd->cmdPrm.sD.number);
5717 #endif
5718 if (phb_find_entries (PHB_ADN,
5719 &index,
5720 MFW_PHB_NUMBER,
5721 1,
5722 #ifdef FF_MMI_PB_OPTIM
5723 findText,
5724 #else
5725 &findText,
5726 #endif
5727 &entries) EQ MFW_PHB_OK)
5728 {
5729 if (entries.num_entries)
5730 {
5731 out_call.name.len = entries.entry[0].name.len;
5732 memcpy(out_call.name.data,
5733 entries.entry[0].name.data,
5734 entries.entry[0].name.len);
5735 }
5736 }
5737 #else
5738 if (phb_find_entries (PHB_ADN,
5739 &index,
5740 MFW_PHB_NUMBER,
5741 1,
5742 cmd->cmdPrm.sD.number,
5743 (T_MFW_PHB_LIST *)&entries) EQ MFW_PHB_OK)
5744 {
5745 if (entries.num_entries)
5746 {
5747 mfwStrncpy((char *)out_call.name, (char *)entries.entry[0].name, MFW_TAG_LEN);
5748 }
5749 }
5750 #endif
5751 } //3
5752 // Sep 01, 2006 REF:OMAPS00090555 x0039928
5753 // Fix: Free the dynamic memory allocated if flag FF_MMI_PB_OPTIM is defined
5754 #ifdef FF_MMI_PB_OPTIM
5755 mfwFree((U8*) entry, sizeof(T_MFW_PHB_ENTRY));
5756 mfwFree((U8*) findText, sizeof(T_MFW_PHB_TEXT));
5757 #endif
5758 cm_signal(E_CM_MO_RES, &out_call);
5759 }
5760 }
5761
5762
5763 /*
5764 +--------------------------------------------------------------------+
5765 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5766 | STATE : code ROUTINE: cm_cvtCPItype |
5767 +--------------------------------------------------------------------+
5768
5769
5770 PURPOSE : Convert the type of
5771
5772 */
5773
5774 T_MFW_CPI_TYPE cm_cvtCPItype(T_ACI_CPI_MSG msg)
5775 {
5776 switch (msg)
5777 {
5778 case CPI_MSG_Setup: return CPI_TYPE_SETUP;
5779 case CPI_MSG_Disc: return CPI_TYPE_DISC;
5780 case CPI_MSG_Alert: return CPI_TYPE_ALERT;
5781 case CPI_MSG_Proc: return CPI_TYPE_PROC;
5782 case CPI_MSG_Sync: return CPI_TYPE_SYNC;
5783 case CPI_MSG_Conn: return CPI_TYPE_CONN;
5784 /* CQ11676 Added new messages types in CPi indication. 17-02-04 MZ */
5785 #ifndef FF_2TO1_PS
5786 case CPI_MSG_Rls: return CPI_TYPE_RELEASE;
5787 case CPI_MSG_Rjct: return CPI_TYPE_REJECT;
5788 #endif
5789 default: return CPI_TYPE_UNKNOWN;
5790 }
5791 }
5792
5793
5794 /*
5795 +--------------------------------------------------------------------+
5796 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5797 | STATE : code ROUTINE: cm_cvtIBT |
5798 +--------------------------------------------------------------------+
5799
5800
5801 PURPOSE : Convert in-band tones indication
5802
5803 */
5804
5805 T_MFW_CPI_IBT cm_cvtIBT(T_ACI_CPI_IBT ibt)
5806 {
5807 switch (ibt)
5808 {
5809 case CPI_IBT_False: return CPI_IBT_FALSE;
5810 case CPI_IBT_True: return CPI_IBT_TRUE;
5811 default: return CPI_IBT_UNKNOWN;
5812 }
5813 }
5814
5815
5816 /*
5817 +--------------------------------------------------------------------+
5818 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5819 | STATE : code ROUTINE: cm_cvtTCH |
5820 +--------------------------------------------------------------------+
5821
5822
5823 PURPOSE : Convert traffic channel indication
5824
5825 */
5826
5827 T_MFW_CPI_TCH cm_cvtTCH(T_ACI_CPI_TCH tch)
5828 {
5829 switch (tch)
5830 {
5831 case CPI_TCH_False: return CPI_TCH_FALSE;
5832 case CPI_TCH_True: return CPI_TCH_TRUE;
5833 default: return CPI_TCH_UNKNOWN;
5834 }
5835 }
5836
5837
5838 /*
5839 +--------------------------------------------------------------------+
5840 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5841 | STATE : code ROUTINE: rAT_PercentCPI |
5842 +--------------------------------------------------------------------+
5843
5844
5845 PURPOSE : Call Progress Information
5846
5847 */
5848 // ADDED BY RAVI - FOR ACI CHANGES - 5-10-2005
5849 #if (defined(FF_2TO1_PS) && BOARD != 61)
5850 void rAT_PercentCPI(SHORT cId,
5851 T_ACI_CPI_MSG msgType,
5852 T_ACI_CPI_IBT ibt,
5853 T_ACI_CPI_TCH tch)
5854
5855 {
5856 cm_cpi.call_number = cId;
5857 cm_cpi.type = cm_cvtCPItype(msgType);
5858 cm_cpi.inband = cm_cvtIBT(ibt);
5859 cm_cpi.tch = cm_cvtTCH(tch);
5860 // cm_cpi.cause = CPI_CAUSE_MASK & cause; /* cq11676 Add cause information to the CPI indication 17-02-04 MZ */
5861 cm_signal(E_CM_CPI, &cm_cpi);
5862 }
5863 #else
5864 void rAT_PercentCPI(SHORT cId,
5865 T_ACI_CPI_MSG msgType,
5866 T_ACI_CPI_IBT ibt,
5867 T_ACI_CPI_TCH tch,
5868 USHORT cause ) /*cq11676 Add cause parameter for cpi indication 17-02-04 MZ */
5869 {
5870 cm_cpi.call_number = cId;
5871 cm_cpi.type = cm_cvtCPItype(msgType);
5872 cm_cpi.inband = cm_cvtIBT(ibt);
5873 cm_cpi.tch = cm_cvtTCH(tch);
5874 cm_cpi.cause = CPI_CAUSE_MASK & cause; /* cq11676 Add cause information to the CPI indication 17-02-04 MZ */
5875 cm_signal(E_CM_CPI, &cm_cpi);
5876 }
5877 #endif
5878 // END OF ADDITION - RAVI - 5-10-2005.
5879
5880 /*
5881 +--------------------------------------------------------------------+
5882 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
5883 | STATE : code ROUTINE: cm_error_code |
5884 +--------------------------------------------------------------------+
5885
5886
5887 PURPOSE :
5888
5889 */
5890
5891 UBYTE cm_error_code(T_ACI_AT_CMD cmd)
5892 {
5893 ULONG err;
5894
5895 err = qAT_ErrDesc();
5896 switch (ACI_ERR_DESC_CLASS( err ))
5897 {
5898 case ACI_ERR_CLASS_Cme:
5899 break;
5900 case ACI_ERR_CLASS_Cms:
5901 break;
5902 case ACI_ERR_CLASS_Ceer:
5903 switch (ACI_ERR_DESC_NR( err ))
5904 {
5905 case CEER_ACM_Max: return CM_ACM_MAX;
5906 default: return CM_ERROR;
5907 }
5908 // break; // RAVI
5909 case ACI_ERR_CLASS_Ext:
5910 switch (ACI_ERR_DESC_NR( err ))
5911 {
5912 case EXT_ERR_FdnCheck: return CM_CFDN_ERR;
5913 case EXT_ERR_BdnCheck: return CM_CBDN_ERR;
5914 case EXT_ERR_OneCallOnHold: return CM_2CALLS_ALREADY_ERR;
5915 //xvilliva 21421 - Handling err code returned by ACI.
5916 #ifndef FF_2TO1_PS
5917 case EXT_ERR_AlsLock: return CM_ALS_ERR;
5918 #endif
5919 default: return CM_ERROR;
5920 }
5921 // break; // RAVI
5922 default:
5923 break;
5924 }
5925 return CM_ERROR;
5926 }
5927
5928 /*
5929 +--------------------------------------------------------------------+
5930 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
5931 | STATE : code ROUTINE : cm_bc_parameter |
5932 +--------------------------------------------------------------------+
5933
5934
5935 PURPOSE : Notice bearer service parameter
5936
5937 */
5938 /*a0393213 warnings removal - parameter changed as a result of ACI enum change*/
5939 void cm_bc_parameter(T_ACI_CRING_SERV_TYP type)
5940 {
5941 TRACE_FUNCTION("cm_cvt_cringType()");
5942
5943 switch (type)
5944 {
5945 case CRING_SERV_TYP_Voice:
5946 break;
5947 case CRING_SERV_TYP_Fax:
5948 in_call.bc1.conn_elem = Transparent;
5949 break;
5950 case CRING_SERV_TYP_Sync:
5951 in_call.bc1.bearer_serv = Synch;
5952 in_call.bc1.conn_elem = Transparent;
5953 break;
5954 case CRING_SERV_TYP_Async:
5955 in_call.bc1.bearer_serv = Asynch;
5956 in_call.bc1.conn_elem = Transparent;
5957 break;
5958 case CRING_SERV_TYP_RelSync:
5959 in_call.bc1.bearer_serv = Synch;
5960 in_call.bc1.conn_elem = NonTransparent;
5961 break;
5962 case CRING_SERV_TYP_RelAsync:
5963 in_call.bc1.bearer_serv = Asynch;
5964 in_call.bc1.conn_elem = NonTransparent;
5965 break;
5966 default:
5967 break;
5968 }
5969 }
5970
5971 /*
5972 +--------------------------------------------------------------------+
5973 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
5974 | STATE : code ROUTINE : cm_build_callType |
5975 +--------------------------------------------------------------------+
5976
5977
5978 PURPOSE :
5979
5980 */
5981 /*a0393213 warnings removal - parameters type changed as a result of ACI enum change*/
5982 void cm_build_callType(T_ACI_CRING_SERV_TYP type1, T_ACI_CRING_SERV_TYP type2)
5983 {
5984 if (type1 EQ CRING_SERV_TYP_Voice)
5985 {
5986 switch (type2)
5987 {
5988 case CRING_SERV_TYP_Sync:
5989 case CRING_SERV_TYP_Async:
5990 case CRING_SERV_TYP_RelSync:
5991 case CRING_SERV_TYP_RelAsync:
5992 in_call.type = VAD_VOICE;
5993 return;
5994 case CRING_SERV_TYP_Fax:
5995 in_call.type = VAF_VOICE;
5996 return;
5997 default:
5998 break;
5999 }
6000 }
6001 if (type2 EQ CRING_SERV_TYP_Voice)
6002 {
6003 switch (type1)
6004 {
6005 case CRING_SERV_TYP_Sync:
6006 case CRING_SERV_TYP_Async:
6007 case CRING_SERV_TYP_RelSync:
6008 case CRING_SERV_TYP_RelAsync:
6009 in_call.type = VAD_DATA;
6010 return;
6011 case CRING_SERV_TYP_Fax:
6012 in_call.type = VAF_FAX;
6013 return;
6014 default:
6015 break;
6016 }
6017 }
6018 in_call.type = NONE_TYPE;
6019 }
6020
6021 /*
6022 +--------------------------------------------------------------------+
6023 | PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
6024 | STATE : code ROUTINE : cmCommand |
6025 +--------------------------------------------------------------------+
6026
6027 PURPOSE : handle mfw windows command
6028
6029 */
6030
6031 static int cmCommand (U32 cmd, void *h)
6032 {
6033 switch (cmd)
6034 {
6035 case MfwCmdDelete: /* delete me */
6036 if (!h)
6037 return 0;
6038 cm_delete(h);
6039 return 1;
6040 default:
6041 break;
6042 }
6043
6044 return 0;
6045 }
6046
6047 /*
6048 +--------------------------------------------------------------------+
6049 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6050 | STATE : code ROUTINE: cm_command_abort |
6051 +--------------------------------------------------------------------+
6052
6053
6054 PURPOSE :
6055
6056 */
6057
6058 T_MFW cm_command_abort(UBYTE command)
6059 {
6060 TRACE_FUNCTION ("cm_command()");
6061
6062 switch (command)
6063 {
6064 case CM_HOLD:
6065 case CM_SWAP:
6066 case CM_RETRIEVE:
6067 case CM_SWAP_MULTIPARTY:
6068 case CM_HOLD_MULTIPARTY:
6069 case CM_RETRIEVE_MULTIPARTY:
6070 case CM_BUILD_MULTIPARTY:
6071 case CM_SPLIT_MULTIPARTY:
6072 case CM_ETC:
6073 case CM_CCBS:
6074 sAT_Abort(CMD_SRC_LCL, AT_CMD_CHLD);
6075 break;
6076
6077 case CM_DTMF_ACTIVE:
6078 case CM_DTMF_INACTIVE:
6079 case CM_DTMF_AUTO:
6080 sAT_Abort(CMD_SRC_LCL, AT_CMD_VTS);
6081 break;
6082
6083 default:
6084 return FALSE;
6085 }
6086 return TRUE;
6087 }
6088
6089 /* Marcus: CCBS: 13/11/2002: Start */
6090 /*
6091 +--------------------------------------------------------------------+
6092 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6093 | STATE : code ROUTINE: cm_ccbs_delete_all |
6094 +--------------------------------------------------------------------+
6095
6096 PURPOSE : Delete all registered CCBS
6097
6098 Returns: T_MFW: CM_OK if successful, CM_ERROR if not
6099
6100 Arguments: None
6101 */
6102 T_MFW cm_ccbs_delete_all(void)
6103 {
6104 T_MFW res = CM_ERROR; // The value to be returned by this function
6105 T_ACI_RETURN aci_res; // The value returned by sAT_PercentCCBS
6106
6107 TRACE_FUNCTION("cm_ccbs_delete_all()");
6108
6109 if (ccbs_op == CM_CCBS_NONE)
6110 {
6111 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6112 /* No CCBS operation currently in progress */
6113 #ifndef CCBS_TEST
6114 aci_res = sAT_PercentCCBS(CMD_SRC_LCL, 0);
6115 #else
6116 aci_res = AT_EXCT;
6117 #endif
6118 if (aci_res == AT_EXCT)
6119 {
6120 TRACE_EVENT("sAT_PercentCCBS returned AT_EXCT");
6121 ccbs_op = CM_CCBS_DELETE_ALL;
6122 res = CM_OK;
6123 }
6124 else
6125 {
6126 TRACE_EVENT_P1("sAT_PercentCCBS returned %d", aci_res);
6127 }
6128 }
6129 else
6130 {
6131 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6132 }
6133
6134 return res;
6135 }
6136
6137 /*
6138 +--------------------------------------------------------------------+
6139 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6140 | STATE : code ROUTINE: cm_ccbs_delete |
6141 +--------------------------------------------------------------------+
6142
6143 PURPOSE : Delete a specific registered CCBS
6144
6145 Returns: T_MFW: CM_OK if successful, CM_ERROR if not
6146
6147 Arguments: SHORT idx: the index to the specific CCBS to be deleted
6148 */
6149 T_MFW cm_ccbs_delete(SHORT idx)
6150 {
6151 T_MFW res = CM_ERROR; // The value to be returned by this function
6152 T_ACI_RETURN aci_res; // The value returned by sAT_PercentCCBS
6153
6154 TRACE_FUNCTION("cm_ccbs_delete()");
6155 TRACE_EVENT_P1("deleting CCBS %d", idx);
6156
6157 if (ccbs_op == CM_CCBS_NONE)
6158 {
6159 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6160 /* No CCBS operation currently in progress */
6161 #ifndef CCBS_TEST
6162 aci_res = sAT_PercentCCBS(CMD_SRC_LCL, idx);
6163 #else
6164 aci_res = AT_EXCT;
6165 #endif
6166 if (aci_res == AT_EXCT)
6167 {
6168 TRACE_EVENT("sAT_PercentCCBS returned AT_EXCT");
6169 ccbs_op = CM_CCBS_DELETE;
6170 res = CM_OK;
6171 }
6172 else
6173 {
6174 TRACE_EVENT_P1("sAT_PercentCCBS returned %d", aci_res);
6175 }
6176 }
6177 else
6178 {
6179 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6180 }
6181
6182 return res;
6183 }
6184
6185 /*
6186 +--------------------------------------------------------------------+
6187 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6188 | STATE : code ROUTINE: cm_ccbs_list |
6189 +--------------------------------------------------------------------+
6190
6191 PURPOSE : Delete all registered CCBS
6192
6193 Returns: T_MFW: CM_OK if successful, CM_ERROR if not
6194
6195 Arguments: None
6196 */
6197 T_MFW cm_ccbs_list(void)
6198 {
6199 T_MFW res = CM_ERROR; // The value to be returned by this function
6200 T_ACI_RETURN aci_res; // The value returned by qAT_PercentCCBS
6201
6202 TRACE_FUNCTION("cm_ccbs_list()");
6203
6204 if (ccbs_op == CM_CCBS_NONE)
6205 {
6206 /* No CCBS operation currently in progress */
6207 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6208 #ifndef CCBS_TEST
6209 aci_res = qAT_PercentCCBS(CMD_SRC_LCL);
6210 #else
6211 aci_res = AT_EXCT;
6212 #endif
6213 if (aci_res == AT_EXCT)
6214 {
6215 TRACE_EVENT("qAT_PercentCCBS returned AT_EXCT");
6216 ccbs_op = CM_CCBS_LIST;
6217 res = CM_OK;
6218 }
6219 else
6220 {
6221 TRACE_EVENT_P1("qAT_PercentCCBS returned %d", aci_res);
6222 }
6223 }
6224 else
6225 {
6226 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6227 }
6228
6229 return res;
6230 }
6231
6232 /*
6233 +--------------------------------------------------------------------+
6234 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6235 | STATE : code ROUTINE: cm_ccbs_accept_registration |
6236 +--------------------------------------------------------------------+
6237
6238 PURPOSE : Accepts the CCBS registration being offered
6239
6240 Returns: T_MFW: CM_OK if successful, CM_ERROR if not
6241
6242 Arguments: None
6243 */
6244 T_MFW cm_ccbs_accept_registration(void)
6245 {
6246 T_MFW res = CM_ERROR; // The value to be returned by this function
6247 T_ACI_RETURN aci_res; // The value returned by sAT_PlusCHLD
6248
6249 TRACE_FUNCTION("cm_ccbs_accept_registration()");
6250
6251 if (ccbs_op == CM_CCBS_NONE)
6252 {
6253 /* No CCBS operation currently in progress */
6254 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6255 cm_set_cmd_status(CHLD_MOD_Ccbs, "");
6256 cmd_hold = MFW_CM_CCBS_REGISTER;
6257 #ifndef CCBS_TEST
6258 aci_res = sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ccbs, NULL);
6259 #else
6260 aci_res = AT_EXCT;
6261 #endif
6262 if (aci_res == AT_EXCT)
6263 {
6264 TRACE_EVENT("sAT_PlusCHLD returned AT_EXCT");
6265 ccbs_op = CM_CCBS_ACCEPT_REGISTRATION;
6266 res = CM_OK;
6267 }
6268 else
6269 {
6270 TRACE_EVENT_P1("sAT_PlusCHLD returned %d", aci_res);
6271 }
6272 }
6273 else
6274 {
6275 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6276 }
6277
6278 return res;
6279 }
6280
6281 /*
6282 +--------------------------------------------------------------------+
6283 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6284 | STATE : code ROUTINE: cm_ccbs_reject_registration |
6285 +--------------------------------------------------------------------+
6286
6287 PURPOSE : Rejects the CCBS registration being offered
6288
6289 Returns: T_MFW: CM_OK if successful, CM_ERROR if not
6290
6291 Arguments: None
6292 */
6293 T_MFW cm_ccbs_reject_registration(void)
6294 {
6295 T_MFW res = CM_ERROR; // The value to be returned by this function
6296 T_ACI_RETURN aci_res; // The value returned by sAT_H
6297
6298 TRACE_FUNCTION("cm_ccbs_reject_registration()");
6299
6300 if (ccbs_op == CM_CCBS_NONE)
6301 {
6302 /* No CCBS operation currently in progress */
6303 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6304 cmd_hold = MFW_CM_CCBS_REGISTER;
6305 #ifndef CCBS_TEST
6306 aci_res = sAT_H(CMD_SRC_LCL);
6307 #else
6308 aci_res = AT_EXCT;
6309 #endif
6310 if (aci_res == AT_EXCT)
6311 {
6312 TRACE_EVENT("sAT_H returned AT_EXCT");
6313 ccbs_op = CM_CCBS_REJECT_REGISTRATION;
6314 res = CM_OK;
6315 }
6316 else
6317 {
6318 TRACE_EVENT_P1("sAT_H returned %d", aci_res);
6319 }
6320 }
6321 else
6322 {
6323 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6324 }
6325
6326 return res;
6327 }
6328
6329 /*
6330 +--------------------------------------------------------------------+
6331 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6332 | STATE : code ROUTINE: cm_ccbs_accept_recall |
6333 +--------------------------------------------------------------------+
6334
6335 PURPOSE : Accepts the CCBS recall being offered
6336
6337 Returns: T_MFW: CM_OK if successful, CM_BLACKIST or CM_ERROR if not
6338
6339 Arguments: UBYTE *number - the number of the phone to call
6340 T_MFW_CM_CALL_TYPE type - the type of the call to be made
6341 */
6342 T_MFW cm_ccbs_accept_recall(UBYTE *number, T_MFW_CM_CALL_TYPE type)
6343 {
6344 T_MFW res = CM_ERROR; // The value to be returned by this function
6345 /*a0393213 compiler warnings removal -- removed def of search_res*/
6346 T_ACI_RETURN aci_res; // The value returned by sAT_PlusCHLD
6347 SHORT call_number;// The call identity of any held call
6348 UBYTE phone[MFW_NUM_LEN]; // Working copy of phone number
6349 // CHAR *rest; // Parameter for ss_decode // RAVI
6350 // T_KSD_SEQPARAM para; // Parameter for ss_decode // RAVI
6351 // T_MFW_SS_RETURN ss_res; // The value returned by ss_decode // RAVI
6352
6353 TRACE_FUNCTION("cm_ccbs_accept_recall()");
6354
6355 if (ccbs_op == CM_CCBS_NONE)
6356 {
6357 /* No CCBS operation currently in progress */
6358 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6359 /* Ensure the number given is an ASCIIZ string thet is not too long */
6360 mfwStrncpy((char *)phone, (char *)number, MFW_NUM_LEN);
6361 TRACE_EVENT_P1("ccbs nr: %s", phone);
6362
6363 /* Make sure that it is OK to call this number */
6364 if ((res = cm_check_mo_number(phone)) == CM_OK)
6365 {
6366 TRACE_EVENT("cm_check_mo_number returned CM_OK");
6367 /* Set up data as for mobile originated call */
6368 cm_set_call_mode(type);
6369 call_stat = OUTGOING_CALL;
6370 redial_count = 0;
6371 cc_stat.type = OUTGOING_CALL;
6372 currConnecting = 1;
6373
6374 if ((cm_search_callId(CAL_STAT_Held, &call_number)) == CM_OK)
6375 {
6376 TRACE_EVENT("Held call: CHLD_MOD_RelActAndAcpt");
6377 /* There is a held call: release active call and accept callback */
6378 cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, "");
6379 #ifndef CCBS_TEST
6380 aci_res = sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, NULL);
6381 #else
6382 aci_res = AT_EXCT;
6383 #endif
6384 }
6385 else
6386 {
6387 TRACE_EVENT("No held call: CHLD_MOD_HldActAndAcpt");
6388 /* There is no held call: hold any active call and accept callback */
6389 cm_set_cmd_status(CHLD_MOD_HldActAndAcpt, "");
6390 #ifndef CCBS_TEST
6391 aci_res = sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, NULL);
6392 #else
6393 aci_res = AT_EXCT;
6394 #endif
6395 }
6396
6397 cmd_hold = MFW_CM_CCBS_RECALL;
6398
6399 if (aci_res == AT_EXCT)
6400 {
6401 TRACE_EVENT("sAT_PlusCHLD returned AT_EXCT");
6402 ccbs_op = CM_CCBS_ACCEPT_RECALL;
6403 res = CM_OK;
6404 }
6405 else
6406 {
6407 /* The attempt to accept the callback failed */
6408 TRACE_EVENT_P1("sAT_PlusCHLD returned %d", aci_res);
6409 call_stat = MFW_CALL_FREE;
6410 }
6411 }
6412 else
6413 {
6414 /* It is not OK to call this number for some reason */
6415 TRACE_EVENT_P1("cm_check_mo_number returned %d", res);
6416 }
6417 }
6418 else
6419 {
6420 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6421 }
6422
6423 return res;
6424 }
6425
6426 /*
6427 +--------------------------------------------------------------------+
6428 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6429 | STATE : code ROUTINE: cm_ccbs_reject_recall |
6430 +--------------------------------------------------------------------+
6431
6432 PURPOSE : Rejects the CCBS recall being offered
6433
6434 Returns: T_MFW: CM_OK if successful, CM_ERROR if not
6435
6436 Arguments: None
6437 */
6438 T_MFW cm_ccbs_reject_recall(void)
6439 {
6440 T_MFW res = CM_ERROR; // The value to be returned by this function
6441 T_ACI_RETURN aci_res; // The value returned by sAT_PlusCHLD
6442
6443 TRACE_FUNCTION("cm_ccbs_reject_recall()");
6444
6445 if (ccbs_op == CM_CCBS_NONE)
6446 {
6447 /* No CCBS operation currently in progress */
6448 TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
6449 cm_set_cmd_status(CHLD_MOD_RelHldOrUdub, "");
6450 cmd_hold = MFW_CM_CCBS_RECALL;
6451
6452 #ifndef CCBS_TEST
6453 aci_res = sAT_H(CMD_SRC_LCL);
6454 #else
6455 aci_res = AT_CMPL;
6456 #endif
6457 if (aci_res == AT_CMPL)
6458 {
6459 TRACE_EVENT("sAT_H returned AT_CMPL");
6460 ccbs_op = CM_CCBS_REJECT_RECALL;
6461 res = CM_OK;
6462 }
6463 else
6464 {
6465 TRACE_EVENT_P1("sAT_H returned %d", aci_res);
6466 }
6467 }
6468 else
6469 {
6470 TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
6471 }
6472
6473 return res;
6474 }
6475
6476 /*
6477 +--------------------------------------------------------------------+
6478 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6479 | STATE : code ROUTINE: cm_ccbs_ok |
6480 +--------------------------------------------------------------------+
6481
6482 PURPOSE : Called by rAT_OK for "OK" result code for %CCBS command
6483
6484 Returns: Nothing
6485
6486 Arguments: None
6487 */
6488 void cm_ccbs_ok(void)
6489 {
6490 TRACE_FUNCTION("cm_ccbs_ok()");
6491
6492 memset((void *)&ccbs_info, 0, sizeof(ccbs_info));
6493
6494 ccbs_info.operation = ccbs_op;
6495 ccbs_op = CM_CCBS_NONE;
6496 ccbs_info.type = CM_CCBS_OK;
6497
6498 TRACE_EVENT_P2("E_CM_CCBS: op = %d: type = %d",
6499 ccbs_info.operation, ccbs_info.type);
6500
6501 cm_signal(E_CM_CCBS, &ccbs_info);
6502 }
6503
6504 /*
6505 +--------------------------------------------------------------------+
6506 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6507 | STATE : code ROUTINE: cm_ccbs_error |
6508 +--------------------------------------------------------------------+
6509
6510 PURPOSE : Called by rAT_PlusCME for "+CME error" result code for %CCBS command
6511
6512 Returns: Nothing
6513
6514 Arguments: None
6515 */
6516 void cm_ccbs_error(void)
6517 {
6518 TRACE_FUNCTION("cm_ccbs_error()");
6519
6520 memset((void *)&ccbs_info, 0, sizeof(ccbs_info));
6521
6522 ccbs_info.operation = ccbs_op;
6523 ccbs_op = CM_CCBS_NONE;
6524 ccbs_info.type = CM_CCBS_ERROR;
6525
6526 TRACE_EVENT_P2("E_CM_CCBS: op = %d: type = %d",
6527 ccbs_info.operation, ccbs_info.type);
6528
6529 cm_signal(E_CM_CCBS, &ccbs_info);
6530 }
6531
6532 /*
6533 +--------------------------------------------------------------------+
6534 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6535 | STATE : code ROUTINE: rAT_PercentCCBS |
6536 +--------------------------------------------------------------------+
6537
6538 PURPOSE : Called by ACI for "%CCBS:" result code
6539
6540 Returns: Nothing
6541
6542 Arguments: T_ACI_CCBS_IND indct - type of %CCBS indication
6543 T_ACI_CCBS_STAT status - status of %CCBS indication
6544 T_ACI_CCBS_SET *setting - optiona parameters of %CCBS indication
6545 */
6546 void rAT_PercentCCBS( T_ACI_CCBS_IND indct,
6547 T_ACI_CCBS_STAT status,
6548 T_ACI_CCBS_SET *setting )
6549 {
6550 TRACE_FUNCTION("rAT_PercentCCBS()");
6551 TRACE_EVENT_P3("indct = %d: status = %d: setting = %p", indct, status, setting);
6552
6553 memset((void *)&ccbs_info, 0, sizeof(ccbs_info));
6554
6555 /* Fill in the fields of the E_CM_CCBS event structure */
6556 switch (indct)
6557 {
6558 case CCBS_IND_Possible:
6559 case CCBS_IND_Recall:
6560 case CCBS_IND_PossibilityTimedOut:
6561 case CCBS_IND_RecallTimedOut:
6562
6563 /* An asynchronous %CCBS, not in response to a %CCBS command */
6564 TRACE_EVENT("Unsolicited event");
6565 ccbs_info.operation = CM_CCBS_ASYNC;
6566 break;
6567
6568 default:
6569 TRACE_EVENT("Solicited event");
6570 ccbs_info.operation = ccbs_op;
6571 break;
6572 }
6573
6574 ccbs_info.type = CM_CCBS_INFO;
6575 ccbs_info.indct = indct;
6576 ccbs_info.status = status;
6577
6578 TRACE_EVENT_P2("E_CM_CCBS: op = %d: type = %d",
6579 ccbs_info.operation, ccbs_info.type);
6580 TRACE_EVENT_P2(" indct = %d: status = %d",
6581 ccbs_info.indct, ccbs_info.status);
6582
6583 if (setting == (T_ACI_CCBS_SET *) NULL)
6584 {
6585 /* No T_ACI_CCBS_SET structure given. Indicate in the idx field of ccbs_info */
6586 TRACE_EVENT("setting == NULL");
6587 ccbs_info.idx = 0;
6588 }
6589 else
6590 {
6591 /* T_ACI_CCBS_SET structure given. Fill in the remaining field of ccbs_info */
6592 TRACE_EVENT("setting != NULL");
6593 ccbs_info.idx = setting->idx;
6594 strncpy((char *) ccbs_info.number, (char *) setting->number, sizeof(ccbs_info.number)-1);
6595 ccbs_info.number[sizeof(ccbs_info.number)-1] = '\0';
6596 ccbs_info.ton = phb_cvtTon(setting->type.ton);
6597 ccbs_info.call_type = cm_callTyp_cvt(setting->class_type);
6598 strncpy((char *) ccbs_info.subaddr, (char *) setting->subaddr, sizeof(ccbs_info.subaddr)-1);
6599 ccbs_info.subaddr[sizeof(ccbs_info.subaddr)-1] = '\0';
6600 ccbs_info.alrtPtn = setting->alrtPtn;
6601 TRACE_EVENT_P3(" idx = %d: number = %s: ton = %d",
6602 ccbs_info.idx, ccbs_info.number, ccbs_info.ton);
6603 TRACE_EVENT_P3(" call_type = %d: subaddr = %s: alrtPtn = %d",
6604 ccbs_info.call_type, ccbs_info.subaddr, ccbs_info.alrtPtn);
6605 }
6606
6607 cm_signal(E_CM_CCBS, &ccbs_info);
6608 }
6609
6610 /* Marcus: CCBS: 13/11/2002: End */
6611
6612 /*
6613 +--------------------------------------------------------------------+
6614 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6615 | STATE : code ROUTINE: cm_error_dial |
6616 +--------------------------------------------------------------------+
6617
6618
6619 PURPOSE : The call setup is not successful
6620
6621 */
6622
6623 void cm_error_dial(T_ACI_CME_ERR err)
6624 {
6625 TRACE_FUNCTION("cm_error_dial()");
6626
6627 switch (err)
6628 {
6629 case CME_ERR_OpNotAllow: /* the active call can not be hold */
6630 /* allow a new outgoing */
6631 call_stat = MFW_CALL_FREE;
6632 call_type = MFW_CALL_FREE;
6633 cmd.command = CM_HOLD;
6634 if (cm_search_callId(CAL_STAT_Active, &cmd.call_number) NEQ CM_OK)
6635 cmd.call_number = -1;
6636 cmd.result = NotPresent;
6637 cm_signal(E_CM_COMMAND, &cmd);
6638 break;
6639
6640 /*SPR#2235 - DS - If handset is powered-up without a SIM and an emergency
6641 *call is attempted, the UK networks will reject the call attempt. Send a signal to
6642 *the BMI to enable it to destroy the call and show an appropriate error message.
6643 *
6644 *The ACI calls rAT_PlusCME() - then rAT_PlusCME() calls this funct - for this SIM
6645 *failure but the ACI doesn't supply the callId. Without the callId, the MFW/BMI
6646 *cannot close down the call properly. The ACI interface will need to be changed
6647 *so that it supplies the callId (if there is an active call) when this failure occurs.
6648 */
6649 case CME_ERR_SimFail:
6650 /* allow a new outgoing */
6651 call_stat = MFW_CALL_FREE;
6652 call_type = MFW_CALL_FREE;
6653
6654 /*SPR#2235 - DS - Fake the callId. Workaround needed until the ACI interface is changed */
6655 cm_error_connect(1);
6656 break;
6657
6658 default:
6659 TRACE_EVENT_P1("Error code: %d. No signal sent.", err);
6660 break;
6661 }
6662 }
6663
6664 /*
6665 +--------------------------------------------------------------------+
6666 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6667 | STATE : code ROUTINE: cm_data_connect |
6668 +--------------------------------------------------------------------+
6669
6670
6671 PURPOSE : Fax/Data connect
6672
6673 */
6674
6675 void cm_data_connect(SHORT callId)
6676 {
6677 SHORT call_number;
6678
6679 TRACE_FUNCTION("cm_data_connect()");
6680
6681 call_number = callId;
6682 cm_signal(E_CM_CONNECT, &call_number);
6683 }
6684
6685 /*
6686 +--------------------------------------------------------------------+
6687 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6688 | STATE : code ROUTINE: cm_data_connect |
6689 +--------------------------------------------------------------------+
6690
6691
6692 PURPOSE : Fax/Data connect
6693
6694 */
6695
6696 void cm_wap_data_connected(void)
6697 {
6698 // SHORT call_number; // RAVI
6699
6700 TRACE_FUNCTION("cm_wap_data_connected()");
6701
6702 cm_signal(E_CM_WAP_CALL_CONNECTED, NULL);
6703 }
6704 /*
6705 +--------------------------------------------------------------------+
6706 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6707 | STATE : code ROUTINE: cm_deflect_incoming_call |
6708 +--------------------------------------------------------------------+
6709
6710
6711 PURPOSE : try to deflect a call using AT command CTFR
6712
6713 */
6714 T_MFW cm_deflect_incoming_call(char* number)
6715 { T_ACI_RETURN result;
6716 T_ACI_TOA type;
6717 T_ACI_TOS subaddr_type;
6718
6719 type.ton = TON_Unknown;
6720 type.npi = NPI_Unknown;
6721
6722 subaddr_type.tos = TOS_NotPresent;
6723 subaddr_type.oe = OE_NotPresent;
6724
6725 result = sAT_PlusCTFR(CMD_SRC_LCL, number, &type, NULL, &subaddr_type);
6726
6727 if ((result == AT_BUSY) || (result == AT_FAIL))
6728 return FALSE;
6729 return TRUE;
6730
6731 }
6732 /*
6733 +--------------------------------------------------------------------+
6734 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6735 | STATE : code ROUTINE: cm_ok_CTFR |
6736 +--------------------------------------------------------------------+
6737
6738
6739 PURPOSE : sends call deflect OK event to MMI
6740
6741 */
6742 void cm_ok_CTFR(void)
6743 { BOOL status = TRUE;
6744
6745 cm_signal(E_CM_CALL_DEFLECT_STATUS, &status);
6746
6747 }
6748 /*
6749 +--------------------------------------------------------------------+
6750 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6751 | STATE : code ROUTINE: cm_error_CTFR |
6752 +--------------------------------------------------------------------+
6753
6754
6755 PURPOSE : Sends call deflect failed event to MMI
6756
6757 */
6758 void cm_error_CTFR(void)
6759 {
6760 BOOL status = FALSE;
6761
6762 cm_signal(E_CM_CALL_DEFLECT_STATUS, &status);
6763 }
6764 #ifdef CCBS_TEST
6765 /* Marcus: CCBS testing: 20/11/2002: Start */
6766 static void strlower(char *string)
6767 {
6768 while(*string)
6769 {
6770 *string = (char)tolower((int) *string);
6771 string++;
6772 }
6773 }
6774
6775 static BOOL getCmdId(char *token, T_ACI_AT_CMD *cmdId)
6776 {
6777 BOOL cmdIdOk = FALSE;
6778 TRACE_FUNCTION("getCmdId()");
6779 if (token)
6780 {
6781 strlower(token);
6782 TRACE_EVENT_P1("token: %s", token);
6783 if (strstr(token, "ccbs"))
6784 {
6785 *cmdId = AT_CMD_CCBS;
6786 cmdIdOk = TRUE;
6787 }
6788 else if (strstr(token, "chld"))
6789 {
6790 *cmdId = AT_CMD_CHLD;
6791 cmdIdOk = TRUE;
6792 }
6793 else if (strcmp("h", token) == 0)
6794 {
6795 *cmdId = AT_CMD_H;
6796 cmdIdOk = TRUE;
6797 }
6798 else if ((*cmdId = atoi(token)))
6799 {
6800 cmdIdOk = TRUE;
6801 }
6802 }
6803 else
6804 {
6805 TRACE_EVENT("No token");
6806 }
6807
6808 return cmdIdOk;
6809 }
6810 #endif
6811
6812 #if defined MFW & defined TI_PS_FF_AT_P_CMD_MMITEST
6813 void rAT_PercentMMITEST(char *param)
6814 {
6815 char work[80];
6816 #ifdef CCBS_TEST /*a0393213 compiler warning removal. 'token' removed conditionally*/
6817 char *token; // Current token obtained from strtok
6818 #endif
6819 TRACE_FUNCTION("rAT_PercentMMITEST()");
6820
6821 strncpy(work, param, sizeof(work)-1);
6822 work[sizeof(work)-1] = '\0';
6823
6824 #ifdef CCBS_TEST
6825 if ((token = strtok(work, ",()")) != NULL)
6826 #else
6827 if (strtok(work, ",()") != NULL)
6828 #endif
6829 {
6830 #ifdef CCBS_TEST
6831 T_ACI_AT_CMD cmdId;
6832 strlower(token);
6833 TRACE_EVENT_P1("token: %s", token);
6834
6835 if (strcmp("ok", token) == 0)
6836 {
6837 TRACE_EVENT("OK");
6838 if ((token = strtok(NULL, ",()")) != NULL)
6839 {
6840 if (getCmdId(token, &cmdId) == TRUE)
6841 {
6842 TRACE_EVENT_P1("rAT_OK(cmdId = %d", cmdId);
6843 rAT_OK(cmdId);
6844 }
6845 else
6846 {
6847 TRACE_EVENT("Unknown cmdId");
6848 }
6849 }
6850 else
6851 {
6852 TRACE_EVENT("No cmdId token");
6853 }
6854 }
6855 else if (strcmp("error", token) == 0)
6856 {
6857 TRACE_EVENT("ERROR");
6858 if ((token = strtok(NULL, ",()")) != NULL)
6859 {
6860 if (getCmdId(token, &cmdId) == TRUE)
6861 {
6862 T_ACI_CME_ERR err;
6863 if ((token = strtok(NULL, ",()")) != NULL)
6864 {
6865 err = atoi(token);
6866 rAT_PlusCME(cmdId, err);
6867 }
6868 else
6869 {
6870 TRACE_EVENT("No err token");
6871 }
6872 }
6873 }
6874 else
6875 {
6876 TRACE_EVENT("No cmdId token");
6877 }
6878 }
6879 else if (strcmp("info", token) == 0)
6880 {
6881 T_ACI_CCBS_IND indct = CCBS_IND_NotPresent;
6882 T_ACI_CCBS_STAT status = CCBS_STAT_NotPresent;
6883 T_ACI_CCBS_SET setting, *pSetting = NULL;
6884 TRACE_EVENT("INFO");
6885 if ((token = strtok(NULL, ",()")) != NULL)
6886 {
6887 strlower(token);
6888 TRACE_EVENT_P1("token: %s", token);
6889 if (strstr(token, "notpresent"))
6890 indct = CCBS_IND_NotPresent;
6891 else if (strstr(token, "possibility"))
6892 indct = CCBS_IND_PossibilityTimedOut;
6893 else if (strstr(token, "possible"))
6894 indct = CCBS_IND_Possible;
6895 else if (strstr(token, "registered"))
6896 indct = CCBS_IND_Registered;
6897 else if (strstr(token, "recallt"))
6898 indct = CCBS_IND_RecallTimedOut;
6899 else if (strstr(token, "recall"))
6900 indct = CCBS_IND_Recall;
6901 else if (strstr(token, "irgt"))
6902 indct = CCBS_IND_IrgtResult;
6903 }
6904
6905 if ((token = strtok(NULL, ",()")) != NULL)
6906 {
6907 strlower(token);
6908 TRACE_EVENT_P1("token: %s", token);
6909 if (strstr(token, "notpresent"))
6910 status = CCBS_STAT_NotPresent;
6911 else if (strstr(token, "notprov"))
6912 status = CCBS_STAT_NotProvisioned;
6913 else if (strstr(token, "prov"))
6914 status = CCBS_STAT_Provisioned;
6915 else if (strstr(token, "active"))
6916 status = CCBS_STAT_Active;
6917 }
6918
6919 setting.idx = 0;
6920 if ((token = strtok(NULL, ",()")) != NULL)
6921 {
6922 TRACE_EVENT_P1("token: %s", token);
6923 setting.idx = atoi(token);
6924 }
6925
6926 if (setting.idx != 0)
6927 {
6928 pSetting = &setting;
6929 strcpy(setting.number, "01317180538");
6930 setting.type.ton = TON_National;
6931 setting.type.npi = NPI_IsdnTelephony;
6932 setting.subaddr[0] = '\0';
6933 setting.satype.tos = TOS_NotPresent;
6934 setting.satype.oe = OE_NotPresent;
6935 setting.class_type = CLASS_Vce;
6936 setting.alrtPtn = ALPT_Level_0;
6937
6938 if ((token = strtok(NULL, ",()")) != NULL)
6939 {
6940 TRACE_EVENT_P1("token: %s", token);
6941 strncpy(setting.number, token, sizeof(setting.number)-1);
6942 setting.number[sizeof(setting.number)-1] = '\0';
6943 }
6944
6945 if ((token = strtok(NULL, ",()")) != NULL)
6946 {
6947 TRACE_EVENT_P1("token: %s", token);
6948 setting.type.ton = TON_International;
6949 }
6950 }
6951
6952 TRACE_EVENT_P3("rAT_PercentCCBS(%d, %d, %p)", indct, status, pSetting);
6953 if (pSetting != NULL)
6954 {
6955 TRACE_EVENT_P3("idx = %d: number = %s: ton = %d",
6956 setting.idx, setting.number, setting.type.ton);
6957 }
6958 rAT_PercentCCBS(indct, status, pSetting);
6959 }
6960 else
6961 {
6962 TRACE_EVENT("Unrecognised token");
6963 }
6964 #endif
6965 }
6966 else
6967 {
6968 TRACE_EVENT("No token");
6969 }
6970 }
6971 /* Marcus: CCBS testing: 20/11/2002: End */
6972 #endif /* defined MFW & defined TI_PS_FF_AT_P_CMD_MMITEST */
6973
6974 /* SPR#1985 - SH - Added this function */
6975
6976 /*
6977 +--------------------------------------------------------------------+
6978 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
6979 | STATE : code ROUTINE: cm_tty_enable |
6980 +--------------------------------------------------------------------+
6981
6982
6983 PURPOSE : Receipt of unsolicited TTY information
6984
6985 */
6986
6987 void rAT_PercentCTYI(T_ACI_CTTY_NEG neg, T_ACI_CTTY_TRX trx)
6988 {
6989 T_MFW_CM_CTYI res;
6990
6991 TRACE_FUNCTION("rAT_PercentCTYI()");
6992 #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
6993 currCmd = AT_CMD_NONE;
6994 #endif
6995 switch(neg)
6996 {
6997 case CTTY_NEG_None:
6998 res.neg = CTYI_NONE;
6999 break;
7000 case CTTY_NEG_Request:
7001 res.neg = CTYI_REQUEST;
7002 break;
7003 case CTTY_NEG_Reject:
7004 res.neg = CTYI_REJECT;
7005 break;
7006 case CTTY_NEG_Grant:
7007 res.neg = CTYI_GRANT;
7008 break;
7009 }
7010
7011 cm_signal(E_CM_CTYI, &res);
7012
7013 return;
7014 }
7015
7016
7017 /*
7018 +--------------------------------------------------------------------+
7019 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
7020 | STATE : code ROUTINE: cm_tty_enable |
7021 +--------------------------------------------------------------------+
7022
7023
7024 PURPOSE : Request ACI to switch TTY on or off
7025
7026 */
7027
7028 void cm_tty_enable(UBYTE enable)
7029 {
7030 /*a0393213 compiler warnings removal -- removed ret*/
7031
7032 /* Mar 27, 2006 REF:ER OMAPS00071798 */
7033 #ifdef NEPTUNE_BOARD
7034 U8 audioMode = AUDIO_MODE_TEXT;
7035 #endif
7036
7037 TRACE_FUNCTION("cm_tty_enable()");
7038
7039 /* SPR#1985 - SH - Now use proper ACI functions. */
7040
7041 /* sAT_PercentCTTY() is changed bec the audio mode info is needed in lower layer,
7042 for now just use default value when calling the function, if we want to have
7043 the same functionality in BMI/MFW as in ATI, BMI/MFW needs to be updated */
7044 #ifdef NEPTUNE_BOARD
7045 if (flash_read() >= EFFS_OK)
7046 {
7047 audioMode = FFS_flashData.tty_audio_mode;
7048 }
7049
7050 #endif
7051
7052 /* Mar 27, 2006 REF:ER OMAPS00071798 */
7053 #ifdef NEPTUNE_BOARD
7054 #ifdef CTTY_AUDIO_MODE
7055 if (enable)
7056 sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_On, audioMode);
7057 else
7058 sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_Off, audioMode);
7059 #else
7060 if (enable)
7061 sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_On );
7062 else
7063 sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_Off );
7064 #endif
7065
7066 #else
7067 if (enable)
7068 sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_On );
7069 else
7070 sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_Off );
7071 #endif
7072
7073
7074 /* SPR#1985 - SH - Check that TTY status has changed and inform MMI */
7075
7076 cm_tty_query();
7077
7078 return;
7079 }
7080
7081
7082 /*
7083 +--------------------------------------------------------------------+
7084 | PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
7085 | STATE : code ROUTINE: cm_tty_query |
7086 +--------------------------------------------------------------------+
7087
7088
7089 PURPOSE : Query status of TTY, inform MMI. */
7090 /*SPR#1985 - SH - Added this function */
7091
7092 void cm_tty_query(void)
7093 {
7094 T_MFW_CM_CTYI res;
7095 // T_ACI_RETURN ret; // RAVI
7096 T_ACI_CTTY_MOD mode;
7097 T_ACI_CTTY_REQ req;
7098 T_ACI_CTTY_STAT stat;
7099 T_ACI_CTTY_TRX trx;
7100
7101 /* Mar 27, 2006 REF:ER OMAPS00071798 */
7102 #ifdef NEPTUNE_BOARD
7103 U8 audio_mode;
7104 #endif
7105
7106 TRACE_FUNCTION("cm_tty_query()");
7107
7108 /* Mar 27, 2006 REF:ER OMAPS00071798 */
7109 #ifdef NEPTUNE_BOARD
7110 #ifdef CTTY_AUDIO_MODE
7111 qAT_PercentCTTY(CMD_SRC_LCL, &mode, &req, &stat, &trx, &audio_mode);
7112 #else
7113 qAT_PercentCTTY(CMD_SRC_LCL, &mode, &req, &stat, &trx);
7114 #endif
7115 #else
7116 qAT_PercentCTTY(CMD_SRC_LCL, &mode, &req, &stat, &trx);
7117 #endif
7118
7119 res.neg = CTYI_REJECT;
7120
7121 if (req==CTTY_REQ_On)
7122 {
7123 if (req)
7124 res.neg = CTYI_GRANT;
7125 }
7126
7127 cm_signal(E_CM_CTYI, &res);
7128
7129 return;
7130 }
7131
7132 // Feb 03, 2005 REF: CRR 25960 x0012850
7133 // Description: Call Hold: While one call in Active and other in Held by swapping either of phone is not audible
7134
7135 /*
7136 +--------------------------------------------------------------------+
7137 | PROJECT: MMI-Framework MODULE: MFW_CM |
7138 | STATE : code ROUTINE: cm_setSpeechMode |
7139 +--------------------------------------------------------------------+
7140
7141
7142 PURPOSE : MFW function to call psaCC_setSpeechMode() to attach user connection.
7143
7144 */
7145 void cm_setSpeechMode(void)
7146 {
7147 TRACE_FUNCTION("cm_setSpeechMode()");
7148 psaCC_setSpeechMode();
7149 return;
7150 }
7151
7152
7153 // Sep 12, 2005 REF: MMI-SMR-34085 x0021334
7154 // Description: RE: Add +CDIP command - MMI Additions
7155 // Solution: Dummy implementation of function "rAT_PlusCDIP()" is done to enable successful compilation.
7156
7157 /*
7158 +--------------------------------------------------------------------+
7159 | PROJECT: MMI-Framework MODULE: MFW_CM |
7160 | STATE : code ROUTINE : rAT_PlusCDIP |
7161 +--------------------------------------------------------------------+
7162
7163 PURPOSE : Stub implementation
7164 */
7165
7166 GLOBAL void rAT_PlusCDIP( CHAR * number,
7167 T_ACI_TOA * type,
7168 CHAR * subaddr,
7169 T_ACI_TOS * satype)
7170 {
7171 TRACE_FUNCTION ("rAT_PlusCDIP()");
7172 }
7173
7174
7175 /*June 15, 2006 DR:OMAPS00079492 x0043642 */
7176 /*******************************************************************************
7177
7178 $Function: set_cmdHold
7179
7180 $Description: Sets the value of the static variable cmd_hold.
7181
7182 $Returns: void
7183
7184 $Arguments: command
7185 *******************************************************************************/
7186 void set_cmdHold(int command)
7187 {
7188 TRACE_FUNCTION("set_cmdHold()");
7189 TRACE_EVENT_P1("Old cmd_hold= %d", cmd_hold);
7190 cmd_hold = command;
7191 TRACE_EVENT_P1("New cmd_hold= %d", cmd_hold);
7192 }
7193
7194
7195
7196
7197
7198 /*
7199 +--------------------------------------------------------------------+
7200 | PROJECT: MMI-Framework MODULE: MFW_CM |
7201 | STATE : code ROUTINE : mfw_get_ALS_type |
7202 +--------------------------------------------------------------------+
7203
7204 PURPOSE : this function returns the type of call (voice call or data call etc...)
7205 */
7206 //x0pleela 25 May, 2006 DR: OMAPS00070657
7207 #ifdef FF_CPHS
7208 T_MFW mfw_get_ALS_type()
7209 {
7210 return in_call.type;
7211 }
7212 #endif
7213
7214
7215 /*
7216 +--------------------------------------------------------------------+
7217 | PROJECT: MMI-Framework MODULE: MFW_CM |
7218 | STATE : code ROUTINE : mfw_set_OtherSrc_Value |
7219 +--------------------------------------------------------------------+
7220
7221 PURPOSE : this function sets the value of uOtherSrc to either TRUE or FALSE
7222 */
7223 //x0pleela 03 Nov, 2006 DR: OMAPS00101158
7224 GLOBAL void mfw_set_OtherSrc_Value(UBYTE otherSrc)
7225 {
7226 TRACE_FUNCTION("mfw_set_OtherSrc_Value");
7227 uOtherSrc = otherSrc;
7228 }
7229 /*
7230 +--------------------------------------------------------------------+
7231 | PROJECT: MMI-Framework MODULE: MFW_CM |
7232 | STATE : code ROUTINE : mfw_get_OtherSrc_Value |
7233 +--------------------------------------------------------------------+
7234
7235 PURPOSE : this function is to get the value of uOtherSrc
7236 */
7237 //x0pleela 03 Nov, 2006 DR: OMAPS00101158
7238 GLOBAL UBYTE mfw_get_OtherSrc_Value(void)
7239 {
7240 TRACE_FUNCTION("mfw_get_OtherSrc_Value");
7241 return uOtherSrc;
7242 }
7243