view src/ui/mfw/mfw_cm.c @ 257:3edd1a600218

mfw_mme.c: hack to get initial battery state on boot
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 May 2021 04:32:53 +0000
parents 92abb46dc1ba
children
line wrap: on
line source

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	$Workfile:: mfw_cm.c	    $|
| $Author:: Ak				$Revision::  1		    $|
| CREATED: 3.11.98		       $Modtime:: 10.04.00 14:58    $|
| STATE  : code 						     |
+--------------------------------------------------------------------+

   MODULE  : MFW_CM

   PURPOSE : This modul contains call management functions.

   HISTORY:
     Dec 20, 2006 DR:OMAPS00108192 a0393213(R.Prabakar)
     Description : Continous DTMF tones for simultanous keypress
     Solution     : Bug was due to improper nesting of START-STOP sequence. Now they are avoided.

     Dec 13, 2006 DR:OMAPS00107103 a0393213(R.Prabakar)
     Description : No DTMF tones for simultanous keypress
     Solution     : Once there was some problem in sending DTMF tones, the problem persisted till the next reset.
                       This was because the queue was not getting flushed once the call was ended.
                       Now the queue is flushed once the call is ended.

    Nov 30, 2006 DR:OMAPS00105758 a0393213(R.Prabakar)
    Description :No DTMF tones after collision of DTMF tones

    Nov 03, 2006  DR: OMAPS00101158 x0pleela
    Description : Board crashes after sending atd command through HyperTerminal
    Solution    : Avoid peforming phonebook search operation if the source id is not LOCAL
    			- Defined new static variable uOthersrc to set the value to TRUE or FALSE
    				based on the source Id
    			- Defined two new function mfw_set_OtherSrc_Value() to set the value of
    				uOtherSrc to either TRUE or FALSE and mfw_get_OtherSrc_Value
    				to get the value of uOtherSrc

    Oct 10, 2006  DR: OMAPS00093720   x0039928
    Description : If dial a international number and fail, when auto redail enabled, it will delete '+'.
    Solution    : MFW_TON_INTERNATIONAL is set for out_call.ton if the dialling number contains '+'

    Sep 01, 2006 REF:OMAPS00090555  x0039928
    Description : When make a MO call,MFW can not get call number from ACI.
    Solution     : The called number is extracted from the parameter of callCmEvent()
    for event E_CM_MO_RES and is displayed. Also stack memory optimization is done to
    resolve MMI stack overflow problem.

    June 15, 2006 OMAPS00079492 x0043642
    Description : FT TMO (wk20/06) TC 9.1, 9.2 Multi Party, MS fails to return to idle mode
    Solution    : assign MFW_CM_DISCONNECT_ALL to variable cmd_hold, and call cm_signal()


   May 30, 2006  DR: OMAPS00070657 x0pleela
   Description: CPHS feature on Locosto-Lite
   Solution: For ALS feature,
   			a) Added definition for new function "mfw_get_ALS_type"

    Apr 25, 2006 OMAPS00075711 a0393213 (R.Prabakar)
    Description : 'End Conference' option doesn't work
    Solution    : The ACI_CHLD_MOD is changed from CHLD_MOD_RelActSpec to CHLD_MOD_RelActAndAcpt while calling sAT_PlusCHLD()
                  in cm_disconnect(). This is done since CHLD_MOD_RelActSpec with callId 0 is equivalent to sending
                  AT+CHLD=10 which is invalid according to GSM specification

    Apr 26, 2006 OMAPS00074886 a0393213 (Prabakar R)
    Description : No option in MMI to release the held call.
    Solution    : No option was available. Added a menu option.

    Mar 28, 2006    REF:DR OMAPS00072407  x0039928
    Description:   Phone hangs when tried to make an outgoing call
    Solution: Reverting back the changes of issue OMAPS00048894 to stop from stack overflow.

    Feb 27, 2006    REF:DR OMAPS00067884  x0039928
    Description:   Held call released at locosto phone does not release the call at other end
    Solution: if the mode is greater than CHLD_MOD_RelDialCall then sAT_PercentCHLD() is called
    instead of sAT_PlusCHLD()

    Jan 27, 2006    REF:DR OMAPS00048894  x0039928
    Description:   Outgoing Call: The called number is not displayed while an outgoing call is made
    Solution: The called number is extracted from the parameter of callCmEvent() for event E_CM_MO_RES and is displayed.

   Apr 22, 2006 OMAPS00070762 a0393213 (Prabakar R)
   Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=1 in ATI.
      expected behaviour : active call should be released and the incoming call should be accepted
      observed behaviour : happens as expected. but display shows incoming call screen only.
                           active screen is not shown eventhough the connection is established between MS1 and MS3
   Fix : cmd.call_number was not set to 0, which is required in cm_result_cmd()
         to call cm_ok_connect()which updates the display. It is set now.


   Apr 21, 2006 OMAPS00070774 a0393213 (Prabakar R)
   Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=2 in ATI.
      expected behaviour : active call should be put to hold and the incoming call should be accepted
      observed behaviour : happens as expected. but display shows incoming call screen only.
                           active screen is not shown eventhough the connection is established between MS1 and MS3
   Fix : AT commands from CMD_SRC_ATI_3 was not processed. As a result, MFW was not informed of the acceptance of the call
         through ATI. In precise cmd_hold variable was not set to MFW_CM_MT_ACCEPT, which is necessary for display update


   Sep 12, 2005   REF: MMI-SMR-34085 x0021334
   Description: RE: Add +CDIP command - MMI Additions
   Solution: Dummy implementation of function "rAT_PlusCDIP()" is done to enable successful compilation.
	Nov 02, 2005    DR OMAPS00052132   xdeepadh
	Bug:Not able to access the SMS inbox and also not able to send SMS in Locosto Lite build
	Fix: The ATI Enums usage has been put under the FF_ATI flag.

   Aug 10, 2005   REF: MMI-SPR-30099 x0018858
   Description: During a held communication, if the user presses 4 and send then there is no response from network.
   Solution: Modified the return value and also added a case statement to handle the response received.

   	Apr 07 2005		REF: CRR 29989	xpradipg
	Description:	Optimisation 3: replace the static global data with dynamic
					allocation / deallocation
	Solution:		The static global variables are dynamically allocated and
					deallocated

   Apr 03, 2005 REF: CRR 29988 - xpradipg
   Description: Optimisation 2: Reduce the keyboard buffer and the dtmf buffer
   size
   Solution : The dtmf buffer is reduced to 20 from 50

	Apr 14, 2005	REF: CRR 29991   xpradipg
	Description:	Optimisation 5: Remove the static allocation and use dynamic
					allocation/ deallocation for pb_list and black_list
	Solution:	The static definition is removed and replaced with the dynamic
					allocation

   Feb 03, 200   REF: CRR 25960   x0012850
   Description: Call Hold: While one call in Active and other in Held by swapping either of phone is not audible
   Solution: swapping action results in one of the calls getting muted. We attach user connection again.

   Aug 23, 2004 REF: CRR 22222  xkundadu
   Bug:  Runaway Call Waiting Tone.
		 Call Waiting tone doesnot stop after ansering waiting call.

   Fix: Handle the AT-Command source id CMD_SRC_ATI_2 also for call control
    	callback functions.

   Jun 05, 2004	REF: CRR 18262  NISHIKANT KULKARNI
   Description: The sample sends a STOP DTMF message without release of the key by the user
   Solution: Instead of sending DTMF commands in "VTS_MOD_Auto" mode, on key press DTMF tone is started
  		   using VTS_MOD_ManStart and on key release DTMF tone is stopped using VTS_MOD_ManStop mode.

	//  Apr 26, 2004 REF: CRR 16545 Ajith K P and Side effect of CRR 16545.
	//  Issue description: When the user enters 11SEND and if the first call is
	//  HELD call,the held call disconnects. This should not happen.
	//  Problem was, though sAT_PlusCHLD(..) is expected to disconnect an ACTIVE
	//  call only, it was disconnecting HELD call rather than returning AT_FAIL.
	//  If sAT_PlusCHLD() Fails, Send the user entered string as USSD to network using sAT-Dn().
	//  So now if the user wants to release a HELD call, in cm_disconect() we are calling the
	//  sAT_PlusCHLD(..) function with C


    Mar 28, 2006 REF:ER OMAPS00071798  x0043642
    Added new options in BMI to accept the value for tty audio mode,
    and the accepted value is passed as parameter in function call sAT_PercentCTTY

*/

#define ENTITY_MFW

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif


#include "mfw_mfw.h"
#include "mfw_phb.h"
#include "mfw_phbi.h"
#include "mfw_cm.h"
#include "mfw_cmi.h"
#include "mfw_nm.h"
#include "mfw_sim.h"
#include "mfw_sima.h"
#include "mfw_nmi.h"
#include "mfw_simi.h"
#include "mfw_win.h"

#include "mfw_tim.h"
#include "mfw_utils.h"

#include "ksd.h"
#include "psa.h"

#if defined (FAX_AND_DATA)
#include "aci_fd.h"
#endif

#include "cmh.h"
#include "phb.h"
#include "cmh_phb.h"

#include "mfw_ss.h"
#include "mfw_ssi.h"
#include "mfw_win.h"
#include "mfw_ffs.h"

#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif



/*
 * Conditional compilation flag for CCBS testing.
 * When defined, the cm_ccbs_... functions do not call ACI functions but
 * simply set the return value variable to indicate success. Also the body
 * of the rAT_PercentMMITEST function is defined for parsing AT%MMITEST
 * commands and calling ACI/MFW functions as if CCBS events had occured.
 */
// #define CCBS_TEST

/********* current define *******************************************/
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	remove the static definition
#ifndef FF_MMI_OPTIM
static	 T_MFW_CM_BLACKLIST_LIST    black_list;
#endif

//  Apr 06 2005		REF: CRR 29989	xpradipg
//	The definition of global is removed since it is locally used
#ifndef FF_MMI_OPTIM
static	 T_ACI_CAL_ENTR 	    call_tab[MAX_CALL_NR];
#endif
static	 T_MFW_PHB_LIST 	    entries;
static	 T_MFW_CM_CC_STAT	    cc_stat;	   /* current outgoing call status	    */
static	 T_MFW_CM_COMMAND	    cmd;
static	 T_MFW_CM_NOTIFY	    notify;

static	 UBYTE			    call_type;	   /* indicate an ECC call or normal call   */
static	 UBYTE			    call_stat;	   /* indicate an MO call or MT call	    */
/*a0393213 lint WR:symbol not referenced soln:the variable is put under the flag (which won't be defined) so that the flag
   can be removed if the variable is necessary*/
#ifdef MMI_LINT_WARNING_REMOVAL
static	 SHORT			    cc_id;	   /* current call index		    */
#endif
static	 UBYTE			    redial_stat;
static	 UBYTE			    redial_count;
static	 UBYTE			    cmd_hold;

static	 T_MFW_CM_CW_INFO	    in_call;
static	 T_MFW_CM_MO_INFO	    out_call;
static	 T_MFW_CM_DISCONNECT	    dis_connect;
static	 T_MFW_CM_REDIAL	    rdl;
static	 T_MFW_CM_CPI		    cm_cpi;
/* Marcus: CCBS: 14/11/2002: Start */
static	 T_MFW_CM_CCBS_INFO	    ccbs_info;              // E_CM_CCBS data
static   T_MFW_CM_CCBS_OP       ccbs_op = CM_CCBS_NONE; // Current CCBS operation
/* Marcus: CCBS: 14/11/2002: End */

static	 T_CM_CLI		    cli_prefix;
/*CONQUEST 5998-MC 30/04/02 -initialised timers to zero (prevents corruption) */
static	 MfwHnd 		    redialTim1= NULL;	/* the 1th redialing			 */
static	 MfwHnd 		    redialTim24 = NULL;  /* the 2th to 4st redialing		  */
static	 MfwHnd 		    redialTim5 = NULL;	 /* the 5th or over redialing		  */

static int cmCommand (U32 cmd, void *h); /* handle window commands  */
static int cm_redial_timeout(MfwEvt e, MfwTim *t);
static char currAccepting = 0; /* ES!! 210999 */
static char currConnecting = 0; /* ES!! 290999 */
/*a0393213 lint WR:symbol not referenced soln:the variable is put under the flag (which won't be defined) so that the flag
   can be removed if the variable is necessary*/
#ifdef MMI_LINT_WARNING_REMOVAL
static T_ACI_AT_CMD currCmd;
#endif
static T_MFW_CM_DTMF dtmf_sent={FALSE};/*OMAPS00108192 a0393213 - variable which keeps track of the dtmf sent to ACI (via sAT_PlusVTS)*/
static T_MFW_CM_DTMF dtmf_queued={FALSE};/*OMAPS00108192 a0393213 - variable which keeps track of the recent dtmf added to the queue*/
void cm_force_disconnect(void); // RAVI

/* June 15, 2006 OMAPS00079492 x0043642 */
void set_cmdHold(int command);

//APR 03 2005 - REF CRR: 29988  xpradipg
//The DTMF buffer is reduced from 50 to 20
#ifdef FF_MMI_REDUCED_KBD_BUFFER
#define MAX_DTMF_Q_ENTRIES 20
#else
#define MAX_DTMF_Q_ENTRIES 50
#endif
#define CPI_CAUSE_MASK 0xFF    /* cq11676 cause mask 17-02-04 MZ */
static UBYTE dtmf_q[MAX_DTMF_Q_ENTRIES];
static SHORT mfw_cm_dtmf_q_id;

// MMI-SPR 13873 xkundadu.
// Added this boolean variable to check whether a particular call is in
// multiparty or not
BOOL bIsMultpty = FALSE;

EXTERN MfwHdr * current_mfw_elem;

LOCAL T_MFW_CM_CALL_STAT cm_cvt_call_status( T_ACI_CAL_STAT stat );

//x0pleela 03 Nov, 2006  DR: OMAPS00101158
//Variable which says the type of source Id
//FALSE if LOCAL SRC, TRUE if other sources like AT1, AT2, AT3...
static UBYTE uOtherSrc;
//function to set the value of uOtherSrc to either TRUE or FALSE
GLOBAL void mfw_set_OtherSrc_Value(UBYTE otherSrc);
//function to get the value of uOtherSrc
GLOBAL UBYTE mfw_get_OtherSrc_Value(void);
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_init	     |
+--------------------------------------------------------------------+


   PURPOSE :   initialize for call management

*/

void cm_init(void)
{
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	local variable definition
#ifdef FF_MMI_OPTIM
	T_MFW_CM_BLACKLIST_LIST black_list;
	/*a0393213 compiler warnings removal- removed variable 'file'*/
#endif
  TRACE_FUNCTION ("cm_init()");
  memset(&black_list, 0, sizeof(T_MFW_CM_BLACKLIST_LIST));
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	Since the blacklist is not persistent across powercycles we reset the file
//	contents
#ifdef FF_MMI_OPTIM
	if(	flash_MMI_blackList_write((U8 *)&black_list, sizeof(T_MFW_CM_BLACKLIST_LIST),0) < 0)
		TRACE_EVENT("Error opening the black list file");
#endif

    currAccepting = 0; /* ES!! 210999 */
    currConnecting = 0; /* ES!! 290999 */

  call_type    = MFW_CALL_FREE;
  call_stat    = MFW_CALL_FREE;
  cc_stat.type = MFW_CALL_FREE;
  #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
  cc_id        = 0;
  #endif

  cmd_hold = 0;
  #ifdef MMI_LINT_WARNING_REMOVAL  /*a0393213 lint warnings removal*/
  currCmd = AT_CMD_NONE;
  #endif

// get prefix from EEPROM
  cli_prefix = 0;

  /* create time event for redialing */
  redialTim1  = timCreate (0, MIN_DURATION_1, (MfwCb)cm_redial_timeout);
  redialTim24 = timCreate (0, MIN_DURATION_2_4, (MfwCb)cm_redial_timeout);
  redialTim5  = timCreate (0, MIN_DURATION_5, (MfwCb)cm_redial_timeout);

	redial_stat = (UBYTE)FFS_flashData.redial_mode;

  mfwCommand[MfwTypCm] = (MfwCb) cmCommand;

/*
** Create a static circular buffer to hold the dtmf tones
*/
  mfw_cm_dtmf_q_id = mfw_cbuf_create(	MAX_DTMF_Q_ENTRIES,
  										sizeof(UBYTE),
  				   						0,
  				   						0xFF,
  										TRUE,
  										(void *)&dtmf_q[0]);

  if (mfw_cm_dtmf_q_id < 0)
  	TRACE_EVENT_P1("ERROR : mfw_cbuf_create failed with error value %d", mfw_cm_dtmf_q_id);
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_exit	     |
+--------------------------------------------------------------------+


   PURPOSE :

*/

void cm_exit(void)
{
  TRACE_FUNCTION ("cm_exit()");

  /* delete time event for redialing */
  timDelete (redialTim5);
  timDelete (redialTim24);
  timDelete (redialTim1);
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_create	     |
+--------------------------------------------------------------------+


   PURPOSE :  create event for call management

*/

T_MFW_HND cm_create(T_MFW_HND hWin, T_MFW_EVENT event, T_MFW_CB cbfunc)
{
  T_MFW_HDR *hdr;
  T_MFW_CM  *cm_para;

  TRACE_FUNCTION ("cm_create()");

  hdr	   = (T_MFW_HDR *) mfwAlloc(sizeof (T_MFW_HDR));
  cm_para  = (T_MFW_CM *) mfwAlloc(sizeof (T_MFW_CM));

  if (!hdr OR !cm_para)
    return FALSE;

  /*
   * initialisation of the handler
   */
  cm_para->emask   = event;
  cm_para->handler = cbfunc;

  hdr->data = cm_para;				 /* store parameter in node	*/
  hdr->type = MFW_TYP_CM;		    /* store type of event handler */

  /*
   * installation of the handler
   */
  return mfwInsert((T_MFW_HDR *)hWin, hdr);
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_delete	     |
+--------------------------------------------------------------------+


   PURPOSE :   delete a event for call management

*/

T_MFW_RES cm_delete(T_MFW_HND h)
{
  TRACE_FUNCTION ("cm_delete()");

  if (!h OR !((T_MFW_HDR *)h)->data)
    return MFW_RES_ILL_HND;

  if (!mfwRemove((T_MFW_HDR *)h))
    return MFW_RES_ILL_HND;

  mfwFree((U8 *)(((T_MFW_HDR *) h)->data),sizeof(T_MFW_CM));
  mfwFree((U8 *)h,sizeof(T_MFW_HDR));

  return MFW_RES_OK;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_signal	     |
+--------------------------------------------------------------------+

   PURPOSE : send a event signal.

*/

void cm_signal(T_MFW_EVENT event, void * para)
{
	UBYTE temp;



  temp = dspl_Enable(0);


if (mfwSignallingMethod EQ 0)
  {
  /*
   * focus is on a window
   */
  if (mfwFocus)
    /*
     * send event to sim management
     * handler if available
     */
    if (cm_sign_exec (mfwFocus, event, para))
		{
			dspl_Enable(temp);
			return;
		}

  /*
   * acutal focussed window is not available
   * or has no network management registration
   * handler, then search all nodes from the root.
   */
   if (mfwRoot)
     cm_sign_exec (mfwRoot, event, para);
	}
   else
	 {
	   MfwHdr * h = 0;

	   /*
		* Focus set, then start here
		*/
	   if (mfwFocus)
		 h = mfwFocus;
	   /*
		* Focus not set, then start root
		*/
	   if (!h)
		 h = mfwRoot;

	   /*
		* No elements available, return
		*/

	   while (h)


	   {
		 /*
		  * Signal consumed, then return
		  */
		 if (cm_sign_exec (h, event, para))
		{
			dspl_Enable(temp);
			return;
		}

		 /*
		  * All windows tried inclusive root
		  */
		 if (h == mfwRoot)
		{
			dspl_Enable(temp);
			return;
		}

		 /*
		  * get parent window
		  */
		 h = mfwParent(mfwParent(h));
		if(h)
			h = ((MfwWin * )(h->data))->elems;
	   }
	   cm_sign_exec (mfwRoot, event, para);
	}
	dspl_Enable(temp);
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_sign_exec	     |
+--------------------------------------------------------------------+


   PURPOSE : Send a signal if CM management handler.

*/

BOOL cm_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_CM_PARA * para)
{
  TRACE_FUNCTION ("cm_sign_exec()");

  while (cur_elem)
  {
    /*
     * event handler is available
     */
    if (cur_elem->type EQ MFW_TYP_CM)
    {
      T_MFW_CM * cm_data;
      /*
       * handler is CM management handler
       */
      cm_data = (T_MFW_CM *)cur_elem->data;
      if (cm_data->emask & event)
      {
	/*
	 * event is expected by the call back function
	 */
	cm_data->event = event;
	switch (event)
	{
	  case E_CM_COLP:
	    memcpy (&cm_data->para.mo_data, para, sizeof (T_MFW_CM_MO_INFO));
	    break;

	  case E_CM_DISCONNECT:
	    memcpy (&cm_data->para.disconnect, para, sizeof (T_MFW_CM_DISCONNECT));
	    break;
	  case E_CM_DISCONNECT_ALL:
	    memcpy (&cm_data->para.disconnect_all, para, sizeof (T_MFW_CM_DISCONNECT_ALL));
	    break;

	  case E_CM_CW:
	    memcpy (&cm_data->para.cw_info, para, sizeof (T_MFW_CM_CW_INFO));
	    break;

	  case E_CM_COMMAND:
	    memcpy (&cm_data->para.command, para, sizeof (T_MFW_CM_COMMAND));
	    break;

	  case E_CM_AOC:
	    memcpy (&cm_data->para.aoc_info, para, sizeof (T_MFW_CM_AOC_INFO));
	    break;

	  case E_CM_REDIAL:
	    memcpy (&cm_data->para.rdl, para, sizeof (T_MFW_CM_REDIAL));
	    break;

	  case E_CM_CONNECT_ACK:
	    memcpy (&cm_data->para.call_id, para, sizeof (SHORT));
	    break;

// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Copy MO data
	  case E_CM_MO_RES:
	    memcpy (&cm_data->para.mo_data, para, sizeof (T_MFW_CM_MO_INFO));
	    break;

	  case E_CM_CPI:
	    memcpy (&cm_data->para.cm_cpi, para, sizeof (T_MFW_CM_CPI));
	    break;

	  case E_CM_RING_OFF:
	    break;

	  case E_CM_AOC_CNF:
	    memcpy (&cm_data->para.aoc_cnf, para, sizeof (T_MFW_CM_AOC_CNF));
	    break;

	  case E_CM_DTMF:
	    memcpy (&cm_data->para.dtmf_tone, para, sizeof (UBYTE));
	    break;

	  case E_CM_NOTIFY:
	    memcpy (&cm_data->para.notify, para, sizeof (T_MFW_CM_NOTIFY));
	    break;
	  /*MC SPR 1392*/
	  case E_CM_CALL_DEFLECT_STATUS:
	  	 memcpy (&cm_data->para.call_deflect_status, para, sizeof (BOOL));
	  break;
      /* Marcus: CCBS: 14/11/2002: Start */
	  case E_CM_CCBS:
	    TRACE_EVENT("E_CM_CCBS");
	    memcpy (&cm_data->para.ccbs, para, sizeof (T_MFW_CM_CCBS_INFO));
	    break;
      /* Marcus: CCBS: 14/11/2002: End */

	   case E_CM_CTYI:
	  	memcpy (&cm_data->para.ctyi, para, sizeof (T_MFW_CM_CTYI));
	  	break;

	}

	/*
	 * if call back defined, call it
	 */
	if (cm_data->handler)
	{
	  // PATCH LE 06.06.00
	  // store current mfw elem
	  current_mfw_elem = cur_elem;
	  // END PATCH LE 06.06.00
	  if ((*(cm_data->handler)) (cm_data->event, (void *)&cm_data->para))
	    return TRUE;
	}
      }
    }
    cur_elem = cur_elem->next;
  }
  return FALSE;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_callTyp_cvt    |
+--------------------------------------------------------------------+


   PURPOSE : This function is used to convert the type of call class
	     used by MFW to the type of call class used by ACI.

*/

LOCAL T_MFW_CM_CALL_TYPE cm_callTyp_cvt(T_ACI_CLASS cls)
{
    switch ( cls )
    {
	case ( CLASS_Vce ) :	  return VOICE_CALL;
	case ( CLASS_AuxVce):	  return AuxVOICE_CALL;
	case ( CLASS_Dat ) :	  return DATA_CALL;
	case ( CLASS_Fax ) :	  return FAX_CALL;
	case ( CLASS_VceDat ) :
	case ( CLASS_VceFax ) :
	case ( CLASS_DatFax ) :
	case ( CLASS_VceDatFax ): return (T_MFW_CM_CALL_TYPE)cls;
	case ( CLASS_None )	: return NONE_TYPE;
	case (CLASS_NotPresent):	return NONE_TYPE;

	default:		  return NONE_TYPE;
    }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_search_callId    |
+--------------------------------------------------------------------+


   PURPOSE : find call index from call table

*/

int cm_search_callId(T_ACI_CAL_STAT type, SHORT *id)
{
    int i;
//  Apr 06 2005		REF: CRR 29989	xpradipg
//	Local definition and allocation
#ifdef FF_MMI_OPTIM
	T_ACI_CAL_ENTR 	    *call_tab;
	*id = 0;
	call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
	if(NULL == call_tab)
		return CM_ERROR;
#else
	*id = 0;
#endif
    TRACE_FUNCTION("cm_search_callId()");


    if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
	{
//   	Apr 06 2005		REF: CRR 29989	xpradipg
//		deallocation of memory allocated
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
		return CM_ERROR;
	}

    for (i=0; i<MAX_CALL_NR; i++)
    {
	if (call_tab[i].index == -1)
	    break;

	if (call_tab[i].status == type)
	{
	    *id = call_tab[i].index;
//   	Apr 06 2005		REF: CRR 29989	xpradipg
//		deallocation of memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
	     return CM_OK;
	}

    }
//   	Apr 06 2005		REF: CRR 29989	xpradipg
//		deallocation of memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
    return CM_ERROR;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_search_callMode  |
+--------------------------------------------------------------------+


   PURPOSE : find call type from call table

*/

T_ACI_CAL_MODE cm_search_callMode(SHORT id)
{
    int i;
//  Apr 06 2005		REF: CRR 29989	xpradipg
//	allocation of memory, if the memory allocation fails then we return the
//	error value same as when the qAT_PercentCAL() fails
#ifdef FF_MMI_OPTIM
	T_ACI_CAL_ENTR 	    *call_tab;//[MAX_CALL_NR];
	T_ACI_CAL_MODE		calMode;
	call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
	if(NULL == call_tab)
		return CAL_MODE_Unknown;
#endif

    TRACE_FUNCTION("cm_search_callMode()");

    if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
	{
//   	Apr 06 2005		REF: CRR 29989	xpradipg
//		deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
		return CAL_MODE_Unknown;
	}
    for (i=0; i<MAX_CALL_NR; i++)
    {
	if (call_tab[i].index == -1)
	    break;

		if (call_tab[i].index == id)
		{
//   	Apr 06 2005		REF: CRR 29989	xpradipg
//		deallocate memory
#ifdef FF_MMI_OPTIM
			calMode = call_tab[i].calMode;
		    if(call_tab)
		        mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
		    return calMode;
#else
		    return call_tab[i].calMode;
#endif
		}
    }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
    return CAL_MODE_Unknown;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_search_mptyId    |


   PURPOSE : find multiparty call index from call table

*/

int cm_search_mptyId(T_ACI_CAL_MPTY type, SHORT *id)
{
    int i;
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	allocate memory
#ifdef FF_MMI_OPTIM
	T_ACI_CAL_ENTR 	    *call_tab;//[MAX_CALL_NR];
	call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
	if( NULL == call_tab)
		return CM_ERROR;
#endif

    TRACE_FUNCTION("cm_search_mptyId()");
    *id = 0;

    if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
	{
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
		return CM_ERROR;
	}
    for (i=0; i<MAX_CALL_NR; i++)
    {
	if (call_tab[i].index == -1)
	    break;

	if (call_tab[i].mpty == type)
	{
	    *id = call_tab[i].index;
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
	    return CM_OK;
	}
    }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
    return CM_ERROR;
}


/*
+-------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		    |
| STATE  : code 			ROUTINE: cm_search_numId    |
+-------------------------------------------------------------------+
   PURPOSE : find call index from call table
*/
/*a0393213(R.Prabakar) lint warnings removal
   warning:symbol(cm_search_numId) not referenced
   soln     :this function was not at all called. so this function has been put under MMI_LINT_WARNING_REMOVAL,
               which is not defined. If this function is needed this flag can be removed*/

#ifdef MMI_LINT_WARNING_REMOVAL
LOCAL SHORT cm_search_numId(UBYTE *number)
{
	int i;
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	allocate memory
#ifdef FF_MMI_OPTIM
	SHORT	index;
	T_ACI_CAL_ENTR 	    *call_tab;//[MAX_CALL_NR];
	call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
	if(NULL == call_tab)
		return 0;
#endif

    TRACE_FUNCTION("cm_search_numId()");

    if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) != AT_CMPL)
	{
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
		return 0;
	}

    for (i=0; i<MAX_CALL_NR; i++)
    {
		if (call_tab[i].index == -1)
		    break;

		if (!strcmp(call_tab[i].number, (char *)number))
		{
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
			index = call_tab[i].index;
		    if(call_tab)
		    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
		    return index;
#else
		    return call_tab[i].index;
#endif
		}
    }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
    return 0;
}

#endif
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_search_callStat  |
+--------------------------------------------------------------------+


   PURPOSE :  Search the information from call table.

*/

T_MFW cm_search_callStat(SHORT call_number,
			 T_MFW_CM_CALL_STAT *stat,
			 UBYTE *ton,
			 UBYTE *mode)
{
    int i;
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	allocat memory
#ifdef FF_MMI_OPTIM
	T_ACI_CAL_ENTR 	    *call_tab;//[MAX_CALL_NR];
	call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
	if( NULL == call_tab)
		return CM_ERROR;
#endif

    if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
    {
	for (i=0; i<MAX_CALL_NR; i++)
	{
	    if (call_tab[i].index == -1)
	    break;

	    if (call_tab[i].index == call_number)
	    {
		*stat = cm_cvt_call_status(call_tab[i].status);
		*ton = phb_cvtTon(call_tab[i].type.ton);
		*mode = cm_cvt_call_mode(call_tab[i].calMode);
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
			    if(call_tab)
			    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif

		return CM_OK;
	    }
	}
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	this will be returned once we get out of the if statement
#ifndef FF_MMI_OPTIM
	return CM_ERROR;
#endif
    }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//  deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
    return CM_ERROR;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_check_emergency  |
+--------------------------------------------------------------------+


   PURPOSE : Check emergency call number

*/

T_MFW cm_check_emergency(UBYTE *number)
{
  //UBYTE 	    index; // RAVI
 // T_MFW_PHB_TEXT    findText;  // RAVI
 // T_MFW_PHB_ENTRY   entry;  // RAVI

  TRACE_FUNCTION ("cm_check_emergency()");
  TRACE_EVENT_P1("String being passed = %s", (char*)number);

//TISH, patch for OMAPS00125064
  if (strlen((char *)number) <= 0 OR strlen((char *)number) > 6)
  //if (strlen((char *)number) <= 0 OR strlen((char *)number) > 3)
    return FALSE;

  if(psaCC_phbSrchECC((char*)number, FALSE))
  	{
  		TRACE_EVENT("psaCC_phbSrchECC - returned - TRUE");
  		return TRUE;
	}
  else
  	{
  	  	TRACE_EVENT("psaCC_phbSrchECC - returned - FALSE");
	 	return FALSE;
  	}

}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_mo_prefix	     |
+--------------------------------------------------------------------+


   PURPOSE : set/get CLIP, CLIR, COLP and COLR tempstatus

*/

T_CM_CLI cm_mo_prefix(T_CM_CLI prefix)
{
	UBYTE bits;

  if ((bits = (prefix & 0x0c)) != 0)
    cli_prefix = (cli_prefix & 0xf3) | bits;
  if ((bits = (prefix & 0xc0)) != 0)
    cli_prefix = (cli_prefix & 0x3f) | bits;
	return cli_prefix;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_set_cmd_status   |
+--------------------------------------------------------------------+


   PURPOSE :

*/

void cm_set_cmd_status(T_ACI_CHLD_MOD mode, CHAR* call)
{
    SHORT id;
    // Added xkundadu MMI-SPR 13873
    // Stores the status of a particular call.
    T_MFW_CM_STATUS status;

    TRACE_FUNCTION("cm_set_cmd_status()");  // Marcus: CCBS: 14/11/2002

    memset(&dis_connect, 0, sizeof(T_MFW_CM_DISCONNECT));
    memset(&cmd, 0, sizeof(T_MFW_CM_COMMAND));
    switch (mode)
    {
	case CHLD_MOD_RelHldOrUdub:
        TRACE_EVENT("CHLD_MOD_RelHldOrUdub");       // Marcus: CCBS: 14/11/2002
	     /*SPR#1965 - DS - Changed from MFW_CM_MT_REJECT to MFW_CM_TERMINATED because
             * the E_CM_DISCONNECT signal is not sent in cm_ok_disconnect() if cmd_hold = MFW_CM_MT_REJECT.
             * Port of 1962.
             */
            cmd_hold = MFW_CM_TERMINATED;

	    if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
	    {
            TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) == CM_OK");       // Marcus: CCBS: 14/11/2002
		    dis_connect.call_number = id;
	    }
	    else
	    {
            	   TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) != CM_OK");       // Marcus: CCBS: 14/11/2002
		    dis_connect.call_number = -1;	// call id?
	    }

	    break;
	case CHLD_MOD_RelActAndAcpt:

		TRACE_EVENT("CHLD_MOD_RelActAndAcpt");       // Marcus: CCBS: 14/11/2002
	        cmd_hold = MFW_CM_1_SEND;

		// Added xkundadu MMI-SPR 13873
		// Querying if there are any active calls, storing the index of the
		// call and setting a flag if found to be multiparty.
		if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
		{
			// Active call is present.
			dis_connect.call_number = id;	// call id ?
			cm_status(id, &status, 1);
			if (status.mtpy EQ MFW_MTPY_MEMBER)
			{
				bIsMultpty = TRUE;
			}
			else
			{
				bIsMultpty = FALSE;
			}

		}
		else
		{
			dis_connect.call_number = -1;
		}
		// Added xkundadu MMI-SPR 13873
		// Querying if there are any held calls, storing the index of the call
		// to change the status to active call.
		if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
		{
			cmd.command     = CM_RETRIEVE;
			cmd.call_number = id;
		}
		// Added xkundadu MMI-SPR 13873
		// Checking is there any waiting call exists or not.
		if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
		{
			// This variable determines whether to accept/reject the call
			// in the cm_result_cmd().
			cmd.call_number=0;
		}
		else
		{
			cmd.call_number=-1;
		}

	    break;

	case CHLD_MOD_RelActSpec:
        TRACE_EVENT("CHLD_MOD_RelActSpec");       // Marcus: CCBS: 14/11/2002
	    dis_connect.call_number = (SHORT)atoi(call);
	    if (dis_connect.call_number)
	    {
            TRACE_EVENT("dis_connect.call_number");       // Marcus: CCBS: 14/11/2002
            cmd_hold = MFW_CM_TERMINATED;
	    }
		else
		{
            TRACE_EVENT("!dis_connect.call_number");       // Marcus: CCBS: 14/11/2002
		    cmd_hold = MFW_CM_MPTY_TERMINATED;
		}
	    break;
	case CHLD_MOD_HldActAndAcpt:
        TRACE_EVENT("CHLD_MOD_HldActAndAcpt");       // Marcus: CCBS: 14/11/2002
	    if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
	    {
            TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) == CM_OK");       // Marcus: CCBS: 14/11/2002
    		cmd_hold    = MFW_CM_MT_ACCEPT;
    		/*
    		 * initialize for result event
    		 */
    		cmd.command = CM_HOLD;
		#ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
    		cc_id	    = id;
		#endif
	    }
	    else
	    {
            TRACE_EVENT("cm_search_callId(CAL_STAT_Wait, &id) != CM_OK");       // Marcus: CCBS: 14/11/2002
    		if ((cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
    		    AND (cm_search_callId(CAL_STAT_Held, &id) == CM_OK))
    		{
                TRACE_EVENT("cmd.command = CM_SWAP");       // Marcus: CCBS: 14/11/2002
    		    cmd.command = CM_SWAP;
    		}
    		if ((cm_search_callId(CAL_STAT_Active, &id) != CM_OK)
    		    AND (cm_search_callId(CAL_STAT_Held, &id) == CM_OK))
    		{
                TRACE_EVENT("cmd.command = CM_RETRIEVE");       // Marcus: CCBS: 14/11/2002
    		    cmd.command = CM_RETRIEVE;
    		}
    		if ((cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
    		    AND (cm_search_callId(CAL_STAT_Held, &id) != CM_OK))
    		{
                TRACE_EVENT("cmd.command = CM_HOLD");       // Marcus: CCBS: 14/11/2002
    		    cmd.command = CM_HOLD;
    		}
    		cmd.call_number = 0;
	    }
	    break;
	case CHLD_MOD_HldActExc:
        TRACE_EVENT("CHLD_MOD_HldActExc");       // Marcus: CCBS: 14/11/2002
	    cmd.command = CM_SPLIT_MULTIPARTY;
	    cmd.call_number = 0;
	    break;
	case CHLD_MOD_AddHld:
        TRACE_EVENT("CHLD_MOD_AddHld");       // Marcus: CCBS: 14/11/2002
	    cmd.command = CM_BUILD_MULTIPARTY;
	    cmd.call_number = 0;
	    break;
	case CHLD_MOD_Ect:
        TRACE_EVENT("CHLD_MOD_Ect");       // Marcus: CCBS: 14/11/2002
	    cmd.command = CM_ETC;
	    cmd.call_number = 0;
	    break;
	case CHLD_MOD_Ccbs:
        TRACE_EVENT("CHLD_MOD_Ccbs");       // Marcus: CCBS: 14/11/2002
	    cmd.command = CM_CCBS;
	    cmd.call_number = 0;
	    break;
	case CHLD_MOD_HldActDial:
        TRACE_EVENT("CHLD_MOD_HldActDial");       // Marcus: CCBS: 14/11/2002
	    cmd_hold = MFW_CM_HOLD_AND_DIAL;
	    /*
	     * initialize for result event
	     */
	    cmd.command = CM_HOLD;
	    /*cc_id	= id;*//*a0393213 lint warnings:var not initialized soln:commented as it is not needed*/
	    break;
    }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_check_mo_number  |
+--------------------------------------------------------------------+


   PURPOSE : start mobile originated call

*/

T_MFW cm_check_mo_number(UBYTE *number)
{
  UBYTE i;
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	local definition
  #ifdef FF_MMI_OPTIM
  UBYTE count = 0;
  UBYTE blackListNum[MFW_NUM_LEN];
  int8 file;
  #endif

  /* check whether a redialing exists */
  if (call_stat EQ REDIALING_CALL)
  {
    cm_stop_redialTim();
    rdl.redial_mode = CM_REDIAL_OUTGOING;
    cm_signal(E_CM_REDIAL, &rdl);
  }


  if (!number)
    return CM_OK;
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	the list is read from the file
#ifdef FF_MMI_OPTIM
	if((	file = flash_MMI_blackList_open()) > 0)
	{
		if(flash_MMI_blackList_read(file,(U8*)&count,1,0) > 0)
		{
			for(i=0; i < (int)count; i++)
			{
				if(flash_MMI_blackList_read(file,(U8*)blackListNum,MFW_NUM_LEN,(i*MFW_NUM_LEN)+1) > 0)
				{
					if(!strcmp((char*)blackListNum, (char*)number))
					{
						flash_MMI_blackList_close(file);
						return CM_BLACKLIST;
					}
				}
			}
		}
		flash_MMI_blackList_close(file);
	}
#else
	  /* check whether this number is in blacklist */
	  for (i=0; i<black_list.count; i++)
	  {
	    if (!strcmp((char *)black_list.number[i], (char *)number))
	      return CM_BLACKLIST;
	  }
#endif

  /* check the type of this number */
  if (cm_check_emergency(number) EQ TRUE)
    call_type = MFW_ECC_CALL;
  else
    call_type = MFW_NORMAL_CALL;

  return CM_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_set_call_mode    |
+--------------------------------------------------------------------+


   PURPOSE : set call mode

*/

void cm_set_call_mode(T_MFW_CM_CALL_TYPE mode)
{
  switch (mode)
  {
    case VOICE_CALL:
    case AuxVOICE_CALL: /*MC, SPR 1026, assume line 2 is handled like line 1*/
    case DATA_CALL:
    case FAX_CALL:
      sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_Single);
      break;
    case VFD_VOICE:
    case VFD_DATA:
      sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_VoiceFlwdDat);
      break;
    case VAD_VOICE:
    case VAD_DATA:
      sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_VoiceDat);
      break;
    case VAF_VOICE:
    case VAF_FAX:
      sAT_PlusCMOD(CMD_SRC_LCL, CMOD_MOD_VoiceFax);
      break;
    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_mo_idx	     |
+--------------------------------------------------------------------+


   PURPOSE : start mobile originated call

*/

T_MFW cm_mo_idx(T_KSD_SEQPARAM *para, T_MFW_CM_CALL_TYPE mode)
{
  T_MFW_PHB_LIST entries;
  T_MFW_PHB_ENTRY   entry;
  T_ACI_RETURN	    aci_response; /*a0393213 compiler warnings removal - type of var changed*/
  T_MFW mfw_response;	/*a0393213 compiler warnings removal - a var introduced*/
//RM 19_09_2000
#ifdef NO_ASCIIZ
  T_ACI_PB_TEXT mfwpbText;
#endif
//RM

  entries.entry = &entry;

  /* search this number from phonebook */
  if ((phb_read_entries(PHB_ADN, (UBYTE)para->dialIdx.index,
			MFW_PHB_INDEX, 1,
			&entries) EQ MFW_PHB_OK)
      AND ((int)entries.num_entries > 0))
  {
    mfw_response= cm_check_mo_number(entries.entry->number);
    if (mfw_response NEQ CM_OK)
      return mfw_response;
  }
  else
  {
    mfw_response = cm_check_mo_number(0);
    if (mfw_response NEQ CM_OK)
      return mfw_response;
  }

  /* set the outgoing call status */
  call_stat	 = OUTGOING_CALL;
  redial_count	 = 0;
  cc_stat.type	 = OUTGOING_CALL;

  cm_set_call_mode(mode);

//RM 19_09_2000 instead change in ksd structure T_KSD_SEQPARAM etc., later to change !!!!
#ifdef NO_ASCIIZ
	if(para->dialIdx.str NEQ NULL)
	{
		mfwpbText.cs = CS_GsmDef;
		mfwpbText.len = strlen(para->dialIdx.str);
		memcpy(mfwpbText.data,para->dialIdx.str,mfwpbText.len);
	}
	else
	{
		mfwpbText.cs = CS_NotPresent;
		mfwpbText.len = 0;
	}
	aci_response= sAT_Dm(CMD_SRC_LCL, &mfwpbText,
			   para->dialIdx.mem, para->dialIdx.index,
			   para->dialIdx.clirOvrd, para->dialIdx.cugCtrl,
			   para->dialIdx.callType);
#else
	aci_response= sAT_Dm(CMD_SRC_LCL, para->dialIdx.str,
			   para->dialIdx.mem, para->dialIdx.index,
			   para->dialIdx.clirOvrd, para->dialIdx.cugCtrl,
			   para->dialIdx.callType);
#endif

  if ((aci_response== AT_FAIL) OR (aci_response== AT_BUSY))
  {
    call_stat	 = MFW_CALL_FREE;
	  return cm_error_code(AT_CMD_D);
  }

  return CM_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_mo_call	     |
+--------------------------------------------------------------------+


   PURPOSE : start mobile originated call

*/

T_MFW cm_mo_call(UBYTE *number, T_MFW_CM_CALL_TYPE type)
{
  CHAR			   * rest;
  T_KSD_SEQPARAM	     para;
  T_MFW_SS_RETURN	     typ;
  T_MFW_SS_RETURN	     new_typ;
  CHAR			   * string;
  UBYTE 		     cm_grp = 0;  // RAVI
  /*a0393213 compiler warning removal -- removed clir_status def*/
  UBYTE 		     colr_status;
  UBYTE 		     prefix;
  SHORT 		     id;
  T_ACI_RETURN		     res,aci_result;//aci_result was added to fix the bug MMI-SPR 16545
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: If flag FF_MMI_PB_OPTIM is defined then allocate memory for buf, phone and num_save variables
// through heap instead of stack.
#ifdef FF_MMI_PB_OPTIM
  char		     * buf = (char*)mfwAlloc(80);
  char 		     * phone = (char*)mfwAlloc(MFW_NUM_LEN);
  char 		     * num_save = (char*)mfwAlloc(MFW_STRING_LEN);
#else
  char		     buf[80];
  UBYTE 		     phone[MFW_NUM_LEN];
  UBYTE 		     num_save[MFW_STRING_LEN];
#endif

  TRACE_FUNCTION ("cm_mo_call()");

// Sep 01, 2006 REF:OMAPS00090555  x0039928
#ifdef FF_MMI_PB_OPTIM
  memset(buf,0,80);
  memset(phone,0,MFW_NUM_LEN);
  memset(num_save,0,MFW_STRING_LEN);
  strncpy(num_save, (char *)number, MFW_STRING_LEN-1);
#else
  strncpy((char *)num_save, (char *)number, MFW_STRING_LEN-1);
  num_save[MFW_STRING_LEN-1] = 0;
#endif
// Oct 10, 2006  DR: OMAPS00093720   x0039928
// Fix: Set ton to MFW_TON_INTERNATIONAL
  if(number[0] EQ '+')
  {
    out_call.ton = MFW_TON_INTERNATIONAL;
  }
else
 {
    out_call.ton = MFW_TON_UNKNOWN;
 }
  /* check the type of number (key sequence), current no function */
  typ = ss_decode(number, &rest, &para);
  TRACE_EVENT_P1("Type: %d", typ);
  if (typ == MFW_SS_DIAL)
	{
	mfwStrncpy((char *)phone, para.dial.number, MFW_NUM_LEN);

	}

  if (typ == MFW_SS_HOLD)
  {
    cm_set_cmd_status(para.chld.mode, para.chld.call);

    // Feb 27, 2006    REF:DR OMAPS00067884  x0039928
    // Fix :  sAT_PercentCHLD() is called if the mode > CHLD_MOD_RelDialCall
    if(para.chld.mode > CHLD_MOD_RelDialCall)
	aci_result = sAT_PercentCHLD(CMD_SRC_LCL, para.chld.mode, para.chld.call);
    else
	aci_result = sAT_PlusCHLD(CMD_SRC_LCL, para.chld.mode, para.chld.call);

	//  Apr 26, 2004 REF: CRR 16545 Ajith K P
	//  If sAT_PlusCHLD() Fails, Send the user entered string as USSD to network using sAT-Dn().
	//  So if its not failed just return CM_CTRL_STR, otherwise call sAT_Dn().
    if ( (aci_result  EQ AT_CMPL ) OR (aci_result  EQ AT_EXCT ) OR (aci_result  EQ AT_BUSY ))
    {
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf, phone and num_save variables
#ifdef FF_MMI_PB_OPTIM
    if(buf)
	mfwFree((U8*) buf,80);
    if(phone)
	mfwFree((U8*) phone,MFW_NUM_LEN);
    if(num_save)
      	mfwFree((U8*) num_save,MFW_STRING_LEN);
#endif
		return CM_CTRL_STR;
	}
  }
  //MC 11.04.02
  if (typ == MFW_SS_ECT)
  {
	cm_set_cmd_status(para.chld.mode, para.chld.call);
	if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ect, 0) != AT_EXCT)
	{
		//Aug 10, 2005   REF: MMI-SPR-30099 x0018858
		//commented this return value.
		//	return CM_ERROR;
	}
	else
	{
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
	#ifdef FF_MMI_PB_OPTIM
 	 	if(buf)
		    mfwFree((U8*) buf,80);
  		if(phone)
		    mfwFree((U8*) phone,MFW_NUM_LEN);
 		if(num_save)
  		   mfwFree((U8*) num_save,MFW_STRING_LEN);
	#endif
		return CM_CTRL_STR;
	}
  }
  //MC

  if (typ == MFW_SS_DIAL_IDX)
  {
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
  	#ifdef FF_MMI_PB_OPTIM
 	 	if(buf)
		    mfwFree((U8*) buf,80);
  		if(phone)
		    mfwFree((U8*) phone,MFW_NUM_LEN);
 		if(num_save)
  		   mfwFree((U8*) num_save,MFW_STRING_LEN);
	#endif
      return cm_mo_idx(&para, type);
  }

  switch (typ)
  {

//NM
    case MFW_SS_CLIR: //jgg wrong not CM_OK should be CM_SS, however cm_grp not used after funtion callnumber called

    case MFW_SS_DIAL:
      cm_grp = CM_OK;
      break;

    case MFW_SS_DTMF:
    case MFW_SS_CF:
    case MFW_SS_CB:
    case MFW_SS_CLIP:
    case MFW_SS_COLR:
    case MFW_SS_COLP:
    case MFW_SS_WAIT:
    case MFW_SS_HOLD:
    case MFW_SS_CCBS:
    case MFW_SS_REG_PW:
//Aug 10, 2005   REF: MMI-SPR-30099 x0018858
//Added this case statement.
    case MFW_SS_ECT:
      cm_grp = CM_SS;
      break;

    case MFW_SS_USSD:
      cm_grp = CM_USSD;
      break;

    case MFW_SS_SIM_LOCK:
    case MFW_SS_SIM_REG_PW:
    case MFW_SS_SIM_UNBLCK_PIN:
      cm_grp = CM_SIM;
      break;

    case MFW_SS_MMI:
      cm_grp = CM_MMI;
      break;

/* SPR#1352 - SH - TTY
 * If an SS string has been entered, temporarily enable or disable
 * TTY for this call only. */

	case MFW_SS_TTY_NEXTCALL_ON:
	case MFW_SS_TTY_NEXTCALL_OFF:
		{
			if (typ==MFW_SS_TTY_NEXTCALL_ON)
			{
				cm_tty_enable(TRUE);
			}
			else
			{
				cm_tty_enable(FALSE);
			}
// Sep 01, 2006 REF:OMAPS00090555  x0039928
	#ifdef FF_MMI_PB_OPTIM
		strcpy(num_save, (num_save + 4)); /* Ignore SS string when dialling */
	#else
	      	strcpy((char *)num_save, (char *)&num_save[4]); /* Ignore SS string when dialling */
	#endif
			rest = (char *)&number[4];	/* Look at number following SS string */
		}
		break;
/* SH end */

    default:
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
      	#ifdef FF_MMI_PB_OPTIM
 	 	if(buf)
		    mfwFree((U8*) buf,80);
  		if(phone)
		    mfwFree((U8*) phone,MFW_NUM_LEN);
 		if(num_save)
  		   mfwFree((U8*) num_save,MFW_STRING_LEN);
	#endif
      return CM_ERROR;
  }

  string = rest;

  colr_status = 0;
// Sep 01, 2006 REF:OMAPS00090555  x0039928
#ifndef FF_MMI_PB_OPTIM
  buf[0] = '\0';
#endif
  cc_stat.prefix[0] = '\0';
  while(strlen(string))
  {
  	TRACE_EVENT("In the while");
    new_typ = ss_decode((UBYTE *)string, &rest, &para);
// /*
    if (new_typ == MFW_SS_CLIR)
    {

      if (para.Clir.mode == CLIR_MOD_Supp)
	  {
	    strcat((char *)cc_stat.prefix, "*31#");
	    TRACE_EVENT ("CLIR_MOD_Supp");
	  }
      if (para.Clir.mode == CLIR_MOD_Invoc)
	  {
	    strcat((char *)cc_stat.prefix, "#31#");
		TRACE_EVENT ("CLIR_MOD_Invoc");
      }
    }
    if (new_typ == MFW_SS_COLR)
      colr_status = 1;
    if (new_typ == MFW_SS_DIAL)
    {
    	TRACE_EVENT("It's a dial");
	  /* SPR#1352 - SH - only copy string to dial, not whole string */
      if (typ==MFW_SS_TTY_NEXTCALL_ON || typ==MFW_SS_TTY_NEXTCALL_OFF)
      {
      	typ = new_typ;
      	TRACE_EVENT_P1("phone now holds: %s", phone);
      }
      else
      /* end SH */
      {
      	typ = new_typ;
      	mfwStrncpy((char *)phone, para.dial.number, MFW_NUM_LEN);
      }
    }
    string = rest;
  }

  if (!colr_status AND (typ == MFW_SS_DIAL))
  {
    prefix = cli_prefix & 0xc0;
    if (prefix == 0x80)
    {
      strcat(buf, "*77#");
      strcat((char *)cc_stat.prefix, "*77#");
    }
    if (prefix == 0xc0)
    {
      strcat(buf, "#77#");
      strcat((char *)cc_stat.prefix, "#77#");
    }
  }

  if (typ == MFW_SS_DIAL)
  {
    res = (T_ACI_RETURN)cm_check_mo_number((UBYTE*)phone); /*a0393213 lint warnings removal - typecast done*/
    if ( res != CM_OK)
    {
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
	#ifdef FF_MMI_PB_OPTIM
 	 	if(buf)
		    mfwFree((U8*) buf,80);
  		if(phone)
		    mfwFree((U8*) phone,MFW_NUM_LEN);
 		if(num_save)
  		   mfwFree((U8*) num_save,MFW_STRING_LEN);
	#endif
	return res;
    }

    /* set the outgoing call status */
    call_stat	   = OUTGOING_CALL;
    redial_count   = 0;
    cc_stat.type   = OUTGOING_CALL;
    cm_grp = CM_OK;
    currConnecting = 1;
    cm_set_call_mode(type);
  }

  strcat(buf, (char *)num_save);
  if (cm_search_callId(CAL_STAT_Active, &id) EQ CM_OK)
  {
    /*
     * at least one active, this must be put on hold
     * by ACI first, then dial
     */
    cm_set_cmd_status(CHLD_MOD_HldActDial, "");
#ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
    cc_id = id;
#endif
  }
  if (type == DATA_CALL)
	para.dial.callType = D_TOC_Data;

//  Apr 22, 2004        REF: CRR MMI-SPR-16873  Rashmi C N(Sasken)
//		Using the CLIR status maintained in the flash, while making a call
	if (!FFS_flashData.CLIR)
	{
		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*/
	}
	else
	{
		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*/
	}

  if ((res == AT_FAIL) OR (res == AT_BUSY))
  {
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
  	#ifdef FF_MMI_PB_OPTIM
 	 	if(buf)
		    mfwFree((U8*) buf,80);
  		if(phone)
		    mfwFree((U8*) phone,MFW_NUM_LEN);
 		if(num_save)
  		   mfwFree((U8*) num_save,MFW_STRING_LEN);
	#endif
    if (typ == MFW_SS_CLIP)
      return CM_CLI;

    call_stat	 = MFW_CALL_FREE;
	  return cm_error_code(AT_CMD_D);
  }
  if (res == AT_CMPL)
  {
	switch (typ)
	{
	  case MFW_SS_CLIR:
      case MFW_SS_CLIP:
      case MFW_SS_COLR:
      case MFW_SS_COLP:
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
	  #ifdef FF_MMI_PB_OPTIM
 	 	if(buf)
		    mfwFree((U8*) buf,80);
  		if(phone)
		    mfwFree((U8*) phone,MFW_NUM_LEN);
 		if(num_save)
  		   mfwFree((U8*) num_save,MFW_STRING_LEN);
	#endif
	return CM_CLI;
      default:
	break;
    }
  }
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the memory allocated for buf,phone and num_save variables
  #ifdef FF_MMI_PB_OPTIM
  	if(buf)
	    mfwFree((U8*) buf,80);
  	if(phone)
	    mfwFree((U8*) phone,MFW_NUM_LEN);
 	if(num_save)
  	   mfwFree((U8*) num_save,MFW_STRING_LEN);
  #endif
  return cm_grp;
}


/*
+--------------------------------------------------------------------+
| PROJECT: GSM-MFW (8417)		MODULE:  MFW_CB 	     |
| STATE  : code 			ROUTINE: rAT_PlusCRING_OFF   |
+--------------------------------------------------------------------+


   PURPOSE :   Alert Off indication from ACI

*/

#ifdef FF_2TO1_PS
GLOBAL void rAT_PlusCRING_OFF ( SHORT cId )
{
    T_MFW_CM_CALL_STAT stat;
    UBYTE	       ton;
    T_CAUSE_ps_cause report;  /* Marcus: Extended error reporting: 12/11/2002 */
    UBYTE	       mode;

    TRACE_FUNCTION ("rAT_PlusCRING_OFF()");

    if (cm_search_callStat(cId, &stat, &ton, &mode) == CM_OK)
    {
	call_stat = MFW_CALL_FREE;
	call_type = MFW_CALL_FREE;

	//TISH: if there is inband tone, it should not disconnect the call. OMAPS00104986
 	if (stat == CALL_DEACTIVE && !cm_cpi.inband)
	// if (stat == CALL_DEACTIVE)
	{
	    dis_connect.call_number = cId;

	    qAT_PlusCEER( CMD_SRC_LCL, &report);
        /* Marcus: Extended error reporting: 12/11/2002: Start */

//        TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
        if (report.ctrl_value != CAUSE_is_from_nwcc)
        {
            /* Treat Condat defined cause values as if no cause given */
            dis_connect.cause = NOT_PRESENT_8BIT;
        }
        else
        {
            /* Standards defined cause value is given */
            dis_connect.cause = report.value.nwcc_cause;
        }
        TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
        /* Marcus: Extended error reporting: 12/11/2002: End */
	    cm_signal(E_CM_DISCONNECT, &dis_connect);
	    return;
	}
	cm_signal(E_CM_RING_OFF, 0);
    }
}
#else
GLOBAL void rAT_PlusCRING_OFF ( SHORT cId )
{
    T_MFW_CM_CALL_STAT stat;
    UBYTE	       ton;
    USHORT	       report;  /* Marcus: Extended error reporting: 12/11/2002 */
    UBYTE	       mode;

    TRACE_FUNCTION ("rAT_PlusCRING_OFF()");

    if (cm_search_callStat(cId, &stat, &ton, &mode) == CM_OK)
    {
	call_stat = MFW_CALL_FREE;
	call_type = MFW_CALL_FREE;

	//TISH: if there is inband tone, it should not disconnect the call. OMAPS00104986
 	if (stat == CALL_DEACTIVE && !cm_cpi.inband)
	// if (stat == CALL_DEACTIVE)
	{
	    dis_connect.call_number = cId;

	    qAT_PlusCEER( CMD_SRC_LCL, &report);
        /* Marcus: Extended error reporting: 12/11/2002: Start */
        TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
        if (GET_CAUSE_DEFBY(report) == DEFBY_CONDAT)
        {
            /* Treat Condat defined cause values as if no cause given */
            dis_connect.cause = NOT_PRESENT_8BIT;
        }
        else
        {
            /* Standards defined cause value is given */
            dis_connect.cause = GET_CAUSE_VALUE(report);
        }
        TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
        /* Marcus: Extended error reporting: 12/11/2002: End */
	    cm_signal(E_CM_DISCONNECT, &dis_connect);
	    return;
	}
	cm_signal(E_CM_RING_OFF, 0);
    }
}
#endif

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : rAT_PlusCRING     |
+--------------------------------------------------------------------+


   PURPOSE : Alert indication from ACI

*/
/*a0393213 warnings removal - second and third parameter changed as a result of ACI enum change*/
void rAT_PlusCRING(T_ACI_CRING_MOD mode,
		   T_ACI_CRING_SERV_TYP type1,
		   T_ACI_CRING_SERV_TYP type2)
{
  SHORT call_number;

  TRACE_FUNCTION ("rAT_PlusCRING()");

  in_call.result = Present;

  /* search the call identifier */
  if (cm_search_callId(CAL_STAT_Wait, &call_number) == CM_OK)
    in_call.call_number = call_number;
  else
    in_call.call_number = 0;

  /* If redial is active, it must be stoped. */
  if (call_stat == REDIALING_CALL)
  {
    cm_stop_redialTim();
    rdl.redial_mode = CM_REDIAL_INCOMING;
    cm_signal(E_CM_REDIAL, &rdl);
  }

  if (mode EQ CRING_MOD_Direct)
  {
    switch (type1)
    {
	    /* Voice call */
      case CRING_SERV_TYP_Voice:
	if (type2 EQ CRING_SERV_TYP_NotPresent)
	{
	  in_call.type = VOICE_CALL;
	  cm_set_call_mode(VOICE_CALL);
	}
	else
	{
	  switch (type2)
	  {
	    case CRING_SERV_TYP_Sync:
	    case CRING_SERV_TYP_Async:
	    case CRING_SERV_TYP_RelSync:
	    case CRING_SERV_TYP_RelAsync:
	      in_call.type = VFD_VOICE;
	      cm_bc_parameter(type2);
	      cm_set_call_mode(VFD_VOICE);
	      break;
	      /*MC, SPR 1026, check for line1 and line2*/
	    case CRING_SERV_TYP_Voice:
	      in_call.type = VOICE_CALL;
	      cm_set_call_mode(VOICE_CALL);
	      break;
	    case CRING_SERV_TYP_AuxVoice:
	      cm_set_call_mode(AuxVOICE_CALL);
	      in_call.type = AuxVOICE_CALL;
	      break;
	      /*MC, end*/
	    default:
	      in_call.type = VOICE_CALL;
	      cm_set_call_mode(VOICE_CALL);
	      break;
	  }
	}
	break;
	/*MC, SPR 1026, Added case of Type1=CRING_SERV_TYP_AuxVoice*/
	/*assuming  line 2 is handled like line 1*/
      case CRING_SERV_TYP_AuxVoice:
	if (type2 EQ CRING_SERV_TYP_NotPresent)
	{
	  in_call.type = AuxVOICE_CALL;
	  cm_set_call_mode(AuxVOICE_CALL);
	}
	else
	{
	  switch (type2)
	  {
	    case CRING_SERV_TYP_Sync:
	    case CRING_SERV_TYP_Async:
	    case CRING_SERV_TYP_RelSync:
	    case CRING_SERV_TYP_RelAsync:
	      in_call.type = VFD_VOICE;
	      cm_bc_parameter(type2);
	      cm_set_call_mode(VFD_VOICE);
	      break;
	    case CRING_SERV_TYP_Voice:
	      in_call.type = VOICE_CALL;
	      cm_set_call_mode(VOICE_CALL);
	      break;
	    case CRING_SERV_TYP_AuxVoice:
	      cm_set_call_mode(AuxVOICE_CALL);
	      in_call.type = AuxVOICE_CALL;
	      break;
	    default:
	      in_call.type = VOICE_CALL;
	      cm_set_call_mode(VOICE_CALL);
	      break;
	  }
	}
	break;
	/*MC, end*/
	    /* Data call */
	    case CRING_SERV_TYP_Sync:
      case CRING_SERV_TYP_Async:
      case CRING_SERV_TYP_RelSync:
      case CRING_SERV_TYP_RelAsync:
		    in_call.type = DATA_CALL;
	cm_bc_parameter(type1);
	cm_set_call_mode(DATA_CALL);
		    break;

      case CRING_SERV_TYP_Fax:
		    in_call.type = FAX_CALL;
	in_call.bc1.conn_elem	= Transparent;
	cm_set_call_mode(FAX_CALL);
		  break;

      default:
		    in_call.result = NotPresent;
	break;
    }
    call_stat = INCOMING_CALL;
  }

  if (mode EQ CRING_MOD_Alternate)
  {
	  cm_build_callType(type1, type2);
    cm_bc_parameter(type1);
    cm_bc_parameter(type2);
    cm_set_call_mode(in_call.type);
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: rAT_PlusCLIP	     |
+--------------------------------------------------------------------+


   PURPOSE : The calling line identification for an incomming call.

*/

#ifdef NO_ASCIIZ
void rAT_PlusCLIP(T_ACI_CLIP_STAT   stat,
		  CHAR		  * number,
		  T_ACI_TOA	  * type,
		  U8		    validity,
		  CHAR		  * subaddr,
		  T_ACI_TOS	  * satype,
		  T_ACI_PB_TEXT   * alpha)
{
  int flag;

  TRACE_FUNCTION ("rAT_PlusCLIP()");

  flag = 0;

  if (number != NULL)
  {
    mfwStrncpy((char *)in_call.number,  (char *)number, MFW_NUM_LEN);
    in_call.ton = phb_cvtTon(type->ton);
    flag = 1;
  }
  else
    memset(in_call.number, '\0', MFW_NUM_LEN);

  if (alpha != NULL)
  {
    in_call.name.len = alpha->len;
	if (alpha->len)
    {
     memcpy(in_call.name.data,
	    alpha->data,
	    alpha->len);
     flag = 1;
    }
  }
  else
    in_call.name.len = 0;


  if (subaddr != NULL)
  {
    mfwStrncpy((char *)in_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
    flag = 1;
  }
  else
    memset(in_call.subaddr, '\0', MFW_SUBADR_LEN);

  if (flag == 1)
    in_call.result = Present;
  else
    in_call.result = 0;

  cm_signal(E_CM_CW, &in_call);
}

#else

void rAT_PlusCLIP(T_ACI_CLIP_STAT   stat,
		  CHAR		  * number,
		  T_ACI_TOA	  * type,
		  U8		    validity,
		  CHAR		  * subaddr,
		  T_ACI_TOS	  * satype,
		  CHAR		  * alpha)
{
  int flag;

  TRACE_FUNCTION ("rAT_PlusCLIP()");

  flag = 0;
//  in_call.result = 0;

  if (number != NULL)
  {
    mfwStrncpy((char *)in_call.number,  (char *)number, MFW_NUM_LEN);
    in_call.ton = phb_cvtTon(type->ton);
    flag = 1;
  }
  else
    memset(in_call.number, '\0', MFW_NUM_LEN);

  if (alpha != NULL)
  {
    mfwStrncpy((char *)in_call.name,    (char *)alpha, MFW_TAG_LEN);
    flag = 1;
  }
  else
    memset(in_call.name, '\0', MFW_TAG_LEN);

  if (subaddr != NULL)
  {
    mfwStrncpy((char *)in_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
    flag = 1;
  }
  else
    memset(in_call.subaddr, '\0', MFW_SUBADR_LEN);

  if (flag == 1)
    in_call.result = Present;
  else
    in_call.result = 0;

  cm_signal(E_CM_CW, &in_call);
}
#endif

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-MFW (8417)		 MODULE  :  MFW_CM	     |
| STATE   : code			 ROUTINE : rAT_PlusCOLP      |
+--------------------------------------------------------------------+


   PURPOSE :   Connected line presentation indication from ACI

*/

#ifdef NO_ASCIIZ
GLOBAL void rAT_PlusCOLP  ( T_ACI_COLP_STAT stat,
			    CHAR* number,
			    T_ACI_TOA* type,
			    CHAR* subaddr,
			    T_ACI_TOS* satype,
			    T_ACI_PB_TEXT* alpha)
{

  TRACE_FUNCTION ("rAT_PlusCOLP()");

  if (number != NULL)
  {
    mfwStrncpy((char *)out_call.number, (char *)number, MFW_NUM_LEN);
    out_call.ton = phb_cvtTon(type->ton);
  }
  else
    memset(out_call.number, '\0', MFW_NUM_LEN);

  /*NM, p001  */
  if(alpha != NULL)
  /*NM, p001 end */
  {
  out_call.name.len = MINIMUM(alpha->len, MFW_TAG_LEN);
  if (alpha->len)
    memcpy(out_call.name.data,
	   alpha->data,
	   alpha->len);
  }

  if (subaddr != NULL)
    mfwStrncpy((char *)out_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
  else
    memset(out_call.subaddr, '\0', MFW_SUBADR_LEN);

  if (number != NULL)
    cm_signal(E_CM_COLP, &out_call);
}

#else

GLOBAL void rAT_PlusCOLP  ( T_ACI_COLP_STAT stat,
			    CHAR* number,
			    T_ACI_TOA* type,
			    CHAR* subaddr,
			    T_ACI_TOS* satype,
			    CHAR* alpha)
{
  TRACE_FUNCTION ("rAT_PlusCOLP()");

// patch PMA 15 06 99 from Andreas
//  if (stat == -1)
//    return;

  if (number != NULL)
  {
    mfwStrncpy((char *)out_call.number, (char *)number, MFW_NUM_LEN);
    out_call.ton = phb_cvtTon(type->ton);
  }
  else
    memset(out_call.number, '\0', MFW_NUM_LEN);

  if (alpha != NULL)
    mfwStrncpy((char *)out_call.name, (char *)alpha, MFW_TAG_LEN);
  else
    memset(out_call.name, '\0', MFW_TAG_LEN);

  if (subaddr != NULL)
    mfwStrncpy((char *)out_call.subaddr, (char *)subaddr, MFW_SUBADR_LEN);
  else
    memset(out_call.subaddr, '\0', MFW_SUBADR_LEN);

// patch PMA 15 06 99 from Andreas
  if (number != NULL)
	  cm_signal(E_CM_COLP, &out_call);
}
#endif

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-MFW (8417)		 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : rAT_PlusCCWA      |
+--------------------------------------------------------------------+


   PURPOSE :   Connected line presentation indication from ACI

*/

#ifdef NO_ASCIIZ

GLOBAL void rAT_PlusCCWA ( T_ACI_CLSSTAT * clsStatLst,
			   CHAR 	 * number,
			   T_ACI_TOA	 * type,
			   U8		   validity,
			   T_ACI_CLASS	   call_class,
			   T_ACI_PB_TEXT * alpha)
{
    SHORT call_number;

    TRACE_FUNCTION("rAT_PlusCCWA()");

    in_call.result = NotPresent;
    if (clsStatLst == 0)
    {
	if (number != NULL)
	{
	    mfwStrncpy((char *)in_call.number, (char *)number, MFW_NUM_LEN);
	    in_call.ton = phb_cvtTon(type->ton);
	}
	else
	    memset(in_call.number, '\0', MFW_NUM_LEN);

	if (alpha != NULL)
	  in_call.name.len = alpha->len;
	else
	  in_call.name.len = 0;

	if (in_call.name.len && alpha!=NULL) /*a0393213 lint warning removal - check for alpha done*/
	{
	    memcpy(in_call.name.data,
		   alpha->data,
		   alpha->len);
	}

	in_call.type = cm_callTyp_cvt(call_class);

	if (number != 0 || in_call.name.len != 0 || in_call.type != NONE_TYPE)
	    in_call.result = Present;

	cm_search_callId(CAL_STAT_Wait, &call_number);
	in_call.call_number = call_number;

	cm_signal(E_CM_CW, &in_call);
    }
}

#else

GLOBAL void rAT_PlusCCWA ( T_ACI_CLSSTAT * clsStatLst,
			   CHAR 	 * number,
			   T_ACI_TOA	 * type,
			   U8		   validity,
			   T_ACI_CLASS	   call_class,
			   CHAR 	 * alpha)
{
    SHORT call_number;

    in_call.result = NotPresent;
    if (clsStatLst == 0)
    {
	if (number != NULL)
	{
	    mfwStrncpy((char *)in_call.number, (char *)number, MFW_NUM_LEN);
	    in_call.ton = phb_cvtTon(type->ton);
	}
	else
	    memset(in_call.number, '\0', MFW_NUM_LEN);

	if (alpha != NULL)
	    mfwStrncpy((char *)in_call.name, (char *)alpha, MFW_TAG_LEN);
	else
	    memset(in_call.name, '\0', MFW_TAG_LEN);

	in_call.type = cm_callTyp_cvt(call_class);

	if (number != 0 || alpha != 0 || in_call.type != NONE_TYPE)
	    in_call.result = Present;

	cm_search_callId(CAL_STAT_Wait, &call_number);
	in_call.call_number = call_number;

	cm_signal(E_CM_CW, &in_call);
    }
}
#endif

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_mt_reject      |
+--------------------------------------------------------------------+


   PURPOSE : Reject the incoming call.

*/

void cm_mt_reject()
{
    TRACE_FUNCTION ("cm_mt_reject()");

    if (currAccepting)
    {
	currAccepting = 0; /* ES!! 210999 */
	sAT_Abort(CMD_SRC_LCL, AT_CMD_A);
	return;
    }

    cmd_hold = MFW_CM_MT_REJECT;
    cm_search_callId(CAL_STAT_Wait, &dis_connect.call_number);
    sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelHldOrUdub, 0);
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_mt_accept	     |
+--------------------------------------------------------------------+


   PURPOSE : Accept the incoming call. If the active call exists,
	     place this active call on hold and accepts the
	     waiting call.

*/

void cm_mt_accept()
{
    SHORT call_number;
    T_MFW_CM_CALL_STAT	stat;	/* SPR#1983 - SH */
    UBYTE		ton;
    UBYTE		mode;

    TRACE_FUNCTION ("cm_mt_accept()");

    if (cm_search_callId(CAL_STAT_Active, &call_number) != CM_OK)
    {
		if (sAT_A(CMD_SRC_LCL) NEQ AT_EXCT)
		{
			TRACE_ERROR("sAT_A error");
		}
		else
		{
		    currAccepting = 1; /* ES!! 210999 */
		}
    }
    else
    {
		cmd_hold = MFW_CM_MT_ACCEPT;

		/* SPR#1983 - SH - Get status of active call */

        cm_search_callStat(call_number, &stat, &ton, &mode);
#ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
		if (cm_search_callId(CAL_STAT_Wait, &call_number) EQ CM_OK)
		  cc_id = call_number;
#else
		cm_search_callId(CAL_STAT_Wait, &call_number);
#endif
		/* SPR#1983 - SH - If data call is active, end it and accept other call */

		if (mode==DATA_CALL)
		{
			/*
             * Accepting a call when there is an active data call,
             * so drop the active call and accept the waiting call by the
             * equivalent of the AT+CHLD=1 command.
             */
            cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, "");
            if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, 0) NEQ AT_EXCT)
            {
                TRACE_ERROR("sAT_PlusCHLD(CHLD_MOD_RelActAndAcpt) error");
            }
		}

		else	/* SPR#1983 - SH - Important! Acts on next 'if' */

        /* Marcus: issue 1049: 03/09/2002: Start */
        if (cm_search_callId(CAL_STAT_Held, &call_number) EQ CM_OK)
        {
            /*
             * Accepting a call when there is already an active call and a held
             * call, so drop the active call and accept the waiting call by the
             * equivalent of the AT+CHLD=1 command.
             */
            cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, "");
            if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, 0) NEQ AT_EXCT)
            {
                TRACE_ERROR("sAT_PlusCHLD(CHLD_MOD_RelActAndAcpt) error");
            }
        }
        else
        {
            /*
             * Accepting a call when there is already an active call but no held
             * call, so hold the active call and accept the waiting call by the
             * equivalent of the AT+CHLD=2 command.
             */
            cm_set_cmd_status(CHLD_MOD_HldActAndAcpt, "");
            if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, 0) NEQ AT_EXCT)
            {
                TRACE_ERROR("sAT_PlusCHLD(CHLD_MOD_HldActAndAcpt) error");
            }
        }
        /* Marcus: issue 1049: 03/09/2002: End */
	}
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)		MODULE  : MFW_CM			 |
| STATE   : code						ROUTINE : cm_end_all		 |
+--------------------------------------------------------------------+


	PURPOSE :  End all calls (Held and Active)

*/

void cm_end_all(void)
{
    T_ACI_RETURN    aci_res;        // The value returned by sAT_H

    TRACE_EVENT("cm_end_all()");

        aci_res = sAT_H(CMD_SRC_LCL);

        if (aci_res == AT_EXCT)
        {
            TRACE_EVENT("sAT_H returned AT_EXCT");
            cmd_hold = MFW_CM_DISCONNECT_ALL;
        }
        else
        {
            TRACE_EVENT_P1("sAT_H returned %d", aci_res);
        }
	return;
}



// Apr 26 2006, a0393213 (Prabakar R), OMAPS00074886 : No option in MMI to release the held call.
// This function is added to release all held calls

/*******************************************************************************

 $Function:     cm_end_held

 $Description: End held calls

 $Returns: void

 $Arguments: void

*******************************************************************************/

void cm_end_held(void)
{
    T_ACI_RETURN    aci_res;        // The value returned by sAT_PlusCHLD

    TRACE_EVENT("cm_end_held()");

        aci_res = sAT_PlusCHLD(CMD_SRC_LCL,CHLD_MOD_RelHldOrUdub,NULL);

        if (aci_res == AT_FAIL)
        {
            TRACE_EVENT("sAT_PlusCHLD returned AT_FAIL");
        }

	return;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)		MODULE  : MFW_CM			 |
| STATE   : code						ROUTINE : cm_ok_connect		 |
+--------------------------------------------------------------------+


	PURPOSE :  The connect is successful.

*/

void cm_ok_connect(void)
{
    SHORT call_number;

    TRACE_FUNCTION ("cm_ok_connect()");

    currAccepting = 0; /* ES!! 210999 */
    currConnecting = 0; /* ES!! 290999 */

    if (cc_stat.type == REDIALING_CALL)
    {
	rdl.redial_mode = CM_REDIAL_SUCCESS;
	cm_signal(E_CM_REDIAL, &rdl);
    }

    cm_search_callId(CAL_STAT_Active, &call_number);

    /* allow a new outgoing */
    call_stat = MFW_CALL_FREE;
    call_type = MFW_CALL_FREE;
    cmd_hold = MFW_CM_NO_FLAG;

    cm_signal(E_CM_CONNECT_ACK, &call_number);
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_rmt_ok_connect |
+--------------------------------------------------------------------+


   PURPOSE :  The connect is successful.

*/

void cm_rmt_ok_connect()
{
    SHORT call_number;

    TRACE_FUNCTION ("cm_rmt_ok_connect()");

    cm_search_callId(CAL_STAT_Active, &call_number);

    cm_signal(E_CM_CONNECT_ACK, &call_number);
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_error_connect  |
+--------------------------------------------------------------------+


   PURPOSE : The connection is not successful

*/

#ifdef FF_2TO1_PS
void cm_error_connect(SHORT call_number)
{
    int i;
    T_CAUSE_ps_cause report; /* Marcus: Extended error reporting: 12/11/2002 */
    USHORT extend_report; /* API - 1564 - 16-01-03 - add this variable to store the new error code */

    TRACE_FUNCTION ("cm_error_connect()");

    currAccepting = 0; /* ES!! 210999 */
    currConnecting = 0; /* ES!! 290999 */

    /* send event */
    dis_connect.call_number = call_number;

    qAT_PlusCEER( CMD_SRC_LCL, &report);
    /* Marcus: Extended error reporting: 12/11/2002: Start */
//    TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);

	/* API - 1564 - 16-01-03 - store the error value to the new variable & throughout this function replace 'report' with 'extend_report */
    extend_report = report.value.nwcc_cause;

    if (report.ctrl_value != CAUSE_is_from_nwcc)
    {
        /* Treat Condat defined cause values as if no cause given */
        dis_connect.cause = NOT_PRESENT_8BIT;
    }
    else
    {
        /* Standards defined cause value is given */
        dis_connect.cause = report.value.nwcc_cause;
    }
    TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
    /* Marcus: Extended error reporting: 12/11/2002: End */
    cm_signal(E_CM_DISCONNECT, &dis_connect);
    TRACE_EVENT("passed the E_CM_DISCONNECT point");

    if ((call_stat EQ OUTGOING_CALL)
	AND (call_type NEQ MFW_ECC_CALL)
	AND ((redial_stat EQ CM_REDIAL_AUTO) OR (redial_stat EQ CM_REDIAL_MANU)))
    {
	/* If this call is 2nd outgoing call, redial is not started */
	if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
	{
	    for (i=0; i<MAX_CALL_NR; i++)
	    {
		if (call_tab[i].index == -1)
		    break;

		if ((call_tab[i].status == CAL_STAT_NotPresent)
		    OR (call_tab[i].status == CAL_STAT_DeactiveReq))
		    continue;

		if (call_tab[i].calType == CAL_TYPE_MOC)
		{
		    call_stat = MFW_CALL_FREE;
		    call_type = MFW_CALL_FREE;
		    cmd_hold = MFW_CM_NO_FLAG;
		    return;
		}
	    }
	}

	/* check blacklist whether it is full */
	if (black_list.count == MAX_BLACKLIST_NUM)
	{
			TRACE_EVENT ("blacklist is now full");

			/* Blacklist is now full and
			   MT shall prohibit further automatic call attempts
			*/
		redial_stat = CM_REDIAL_OFF;


	    /* allow a new outgoing */
	    call_stat	 = MFW_CALL_FREE;
	    call_type	 = MFW_CALL_FREE;
	    cc_stat.type = MFW_CALL_FREE;

	    rdl.redial_mode = CM_REDIAL_BLACKLIST;
	    cm_signal(E_CM_REDIAL, &rdl);
	    return;
	}

	/* check the registration staus */
	if (nm_reg_status() == MFW_NO_SERVICE)
	{
	    call_stat	 = MFW_CALL_FREE;
	    call_type	 = MFW_CALL_FREE;
	    cc_stat.type = MFW_CALL_FREE;

	    rdl.redial_mode = CM_REDIAL_NO_SERVICE;
	    cm_signal(E_CM_REDIAL, &rdl);
	    return;
	}

	TRACE_EVENT_P1("report = %d", extend_report);
	switch (extend_report)
	{
		case 28:
        // API - 1480 - Added this code to stop redial on an incorrect number
        if(!redial_count)
        {
			call_stat    = MFW_CALL_FREE;
			call_type    = MFW_CALL_FREE;
			cc_stat.type = MFW_CALL_FREE;

			rdl.redial_mode = CM_REDIAL_ABORTED;
			cm_signal(E_CM_REDIAL, &rdl);
			return;
		}
	    case 1: /* check whether the reason is in category 3 (GSM 02.07) */
	    case 3:
	    case 22:
	    case 38:
		TRACE_EVENT ("category 3");
		if (!redial_count)
		{
			/* redial_count == 0;
			   this is for the first outgoing call and
			   now it is going to start the Auto-redial procedure
			 */
		    cc_stat.type = REDIALING_CALL;
		    cc_stat.call_number = 0;

		    call_stat = REDIALING_CALL;
		    rdl.redial_mode = CM_REDIAL_STARTED;
		    mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);

#ifdef NO_ASCIIZ
		    rdl.name.len = cc_stat.name.len;
		    memcpy(rdl.name.data,
			   cc_stat.name.data,
			   cc_stat.name.len);
#else
		    mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//		      strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
		    rdl.ton = cc_stat.ton;
		    rdl.type = cc_stat.mode;

		    /* reasons in the category 3 have
		       a call repeat attempts of max. 1 !
		     */
		    redial_count = MAX_REDIAL_ATTEMPT-1;
		    cm_signal(E_CM_REDIAL, &rdl);
		    return;
		}
		else
		    redial_count = MAX_REDIAL_ATTEMPT;
		break;

	    case 17: /* check whether the reason is in category 1 and 2 (GSM 02.07) */
	    case 18:
	    case 19:
	    case 27:
	    case 34:
	    case 41:
	    case 42:
	    case 44:
	    case 47:
		TRACE_EVENT ("category 1 & 2");
		if (!redial_count)
		{
			/* redial_count == 0
			   this is for the first outgoing call and
			   now it is going to start the Auto-redial procedure
			 */
		    cc_stat.type = REDIALING_CALL;
		    cc_stat.call_number = 0;

		    call_stat = REDIALING_CALL;
		    rdl.redial_mode = CM_REDIAL_STARTED;
		    mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
		    rdl.name.len = cc_stat.name.len;
		    memcpy(rdl.name.data,
			   cc_stat.name.data,
			   cc_stat.name.len);
#else
		    mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//		      strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
		    rdl.ton = cc_stat.ton;
		    rdl.type = cc_stat.mode;

		    /* reasons in the category 1 and 2 have
		       a call repeat attempts of max. 10 !
		     */

		    cm_signal(E_CM_REDIAL, &rdl);
		    return;
		}

		if (redial_count >= 1 AND redial_count <= 3)
		{
		    timStart(redialTim24);
		    call_stat = REDIALING_CALL;
		    cc_stat.call_number = 0;
		    return;
		}

		if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
		{
		    timStart(redialTim5);
		    call_stat = REDIALING_CALL;
		    cc_stat.call_number = 0;
		    return;
		}
#ifdef CUSTOMER_6366
				// JP PATCH The MMI needs to know if the 'error disconnect' has
				// resulted in redial starting irrespective of whether this was a redial attempt or not
				rdl.redial_mode = CM_REDIAL_STARTED;
				cm_signal(E_CM_REDIAL, &rdl);
				// END JP PATCH
#endif /* CUSTOMER_6366 */
		break;

	    default:
		if (redial_count)
		{
		  rdl.redial_mode = CM_REDIAL_STOP;
		  mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
		  rdl.name.len = cc_stat.name.len;
		  memcpy(rdl.name.data,
			 cc_stat.name.data,
			 cc_stat.name.len);
#else
		  mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);//???
//		    strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
		  rdl.ton = cc_stat.ton;
		  rdl.type = cc_stat.mode;
		  cm_signal(E_CM_REDIAL, &rdl);
		}
		/* allow a new outgoing */
		call_stat    = MFW_CALL_FREE;
		call_type    = MFW_CALL_FREE;
		cc_stat.type = MFW_CALL_FREE;
		return;
	}

	if (redial_count >= MAX_REDIAL_ATTEMPT
	    AND black_list.count < MAX_BLACKLIST_NUM)
	{
		  mfwStrncpy((char *)black_list.number[black_list.count],
		   (char *)cc_stat.number, MFW_NUM_LEN);
	    black_list.count++;

	    rdl.redial_mode   = CM_REDIAL_BLACKLISTED;
	    mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
	    rdl.name.len = cc_stat.name.len;
	    memcpy(rdl.name.data,
		   cc_stat.name.data,
		   cc_stat.name.len);
#else
	    mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//		strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
	    rdl.ton = cc_stat.ton;
	    rdl.type = cc_stat.mode;
	    rdl.left_attempts	= 0;
	    cc_stat.call_number = 0;
	    cm_signal(E_CM_REDIAL, &rdl);
	}
    }

    /* allow a new outgoing */
    call_stat	 = MFW_CALL_FREE;
    call_type	 = MFW_CALL_FREE;
    cc_stat.type = MFW_CALL_FREE;
}
#else
void cm_error_connect(SHORT call_number)
{

    int i;
    USHORT report;  /* Marcus: Extended error reporting: 12/11/2002 */
    USHORT extend_report; /* API - 1564 - 16-01-03 - add this variable to store the new error code */
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	local definition
#ifdef FF_MMI_OPTIM
	T_ACI_CAL_ENTR 	    *call_tab;//[MAX_CALL_NR];
#endif
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	local definition
#ifdef FF_MMI_OPTIM
	UBYTE count=0;
	UBYTE blackListNum[MFW_NUM_LEN];
	int32 file = 0;
#endif
    TRACE_FUNCTION ("cm_error_connect()");

    currAccepting = 0; /* ES!! 210999 */
    currConnecting = 0; /* ES!! 290999 */

    /* send event */
    dis_connect.call_number = call_number;

    qAT_PlusCEER( CMD_SRC_LCL, &report);
    /* Marcus: Extended error reporting: 12/11/2002: Start */
    TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);

	/* API - 1564 - 16-01-03 - store the error value to the new variable & throughout this function replace 'report' with 'extend_report */
    extend_report = GET_CAUSE_VALUE(report);

    if (GET_CAUSE_DEFBY(extend_report) == DEFBY_CONDAT)
    {
        /* Treat Condat defined cause values as if no cause given */
        dis_connect.cause = NOT_PRESENT_8BIT;
    }
    else
    {
        /* Standards defined cause value is given */
        dis_connect.cause = GET_CAUSE_VALUE(extend_report);
    }
    TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
    /* Marcus: Extended error reporting: 12/11/2002: End */
    cm_signal(E_CM_DISCONNECT, &dis_connect);
    TRACE_EVENT("passed the E_CM_DISCONNECT point");

    if ((call_stat EQ OUTGOING_CALL)
	AND (call_type NEQ MFW_ECC_CALL)
	AND ((redial_stat EQ CM_REDIAL_AUTO) OR (redial_stat EQ CM_REDIAL_MANU)))
    {
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	allocate memory
#ifdef FF_MMI_OPTIM
		call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
		if( NULL == call_tab)
			return;
#endif
	/* If this call is 2nd outgoing call, redial is not started */
	if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
	{
	    for (i=0; i<MAX_CALL_NR; i++)
	    {
		if (call_tab[i].index == -1)
		    break;

		if ((call_tab[i].status == CAL_STAT_NotPresent)
		    OR (call_tab[i].status == CAL_STAT_DeactiveReq))
		    continue;

		if (call_tab[i].calType == CAL_TYPE_MOC)
		{
		    call_stat = MFW_CALL_FREE;
		    call_type = MFW_CALL_FREE;
		    cmd_hold = MFW_CM_NO_FLAG;
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
			    if(call_tab)
			    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
			    return;
		}
	    }
	}
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	read the list into the variable
#ifdef FF_MMI_OPTIM
	if((file = flash_MMI_blackList_open()) >= 0 )
	{
		if(flash_MMI_blackList_read(file,(U8*)&count, 1,0) > 0)
		{
			if(count == MAX_BLACKLIST_NUM)
#else
	/* check blacklist whether it is full */
	if (black_list.count == MAX_BLACKLIST_NUM)
#endif
	{
			TRACE_EVENT ("blacklist is now full");

			/* Blacklist is now full and
			   MT shall prohibit further automatic call attempts
			*/
		redial_stat = CM_REDIAL_ABORTED;


	    /* allow a new outgoing */
	    call_stat	 = MFW_CALL_FREE;
	    call_type	 = MFW_CALL_FREE;
	    cc_stat.type = MFW_CALL_FREE;

	    rdl.redial_mode = CM_REDIAL_BLACKLIST;
	    cm_signal(E_CM_REDIAL, &rdl);
#ifdef FF_MMI_OPTIM
		flash_MMI_blackList_close(file);
#endif
    	return;
	}
#ifdef FF_MMI_OPTIM
		}
		flash_MMI_blackList_close(file);
	}
#endif

	/* check the registration staus */
	if (nm_reg_status() == MFW_NO_SERVICE)
	{
	    call_stat	 = MFW_CALL_FREE;
	    call_type	 = MFW_CALL_FREE;
	    cc_stat.type = MFW_CALL_FREE;

	    rdl.redial_mode = CM_REDIAL_NO_SERVICE;
	    cm_signal(E_CM_REDIAL, &rdl);
	    return;
	}

	TRACE_EVENT_P1("report = %d", extend_report);
	switch (extend_report)
	{
		case 28:
        // API - 1480 - Added this code to stop redial on an incorrect number
        if(!redial_count)
        {
			call_stat    = MFW_CALL_FREE;
			call_type    = MFW_CALL_FREE;
			cc_stat.type = MFW_CALL_FREE;

			rdl.redial_mode = CM_REDIAL_ABORTED;
			cm_signal(E_CM_REDIAL, &rdl);
			return;
		}
	    case 1: /* check whether the reason is in category 3 (GSM 02.07) */
	    case 3:
	    case 22:
	    case 38:
		TRACE_EVENT ("category 3");
		if (!redial_count)
		{
			/* redial_count == 0;
			   this is for the first outgoing call and
			   now it is going to start the Auto-redial procedure
			 */
		    cc_stat.type = REDIALING_CALL;
		    cc_stat.call_number = 0;

		    call_stat = REDIALING_CALL;
		    rdl.redial_mode = CM_REDIAL_STARTED;
		    mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);

#ifdef NO_ASCIIZ
		    rdl.name.len = cc_stat.name.len;
		    memcpy(rdl.name.data,
			   cc_stat.name.data,
			   cc_stat.name.len);
#else
		    mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//		      strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
		    rdl.ton = cc_stat.ton;
		    rdl.type = cc_stat.mode;

		    /* reasons in the category 3 have
		       a call repeat attempts of max. 1 !
		     */
		    redial_count = MAX_REDIAL_ATTEMPT-1;
		    cm_signal(E_CM_REDIAL, &rdl);
		    return;
		}
		else
		    redial_count = MAX_REDIAL_ATTEMPT;
		break;

	    case 17: /* check whether the reason is in category 1 and 2 (GSM 02.07) */
	    case 18:
	    case 19:
	    case 27:
	    case 34:
	    case 41:
	    case 42:
	    case 44:
	    case 47:
		TRACE_EVENT ("category 1 & 2");
		if (!redial_count)
		{
			/* redial_count == 0
			   this is for the first outgoing call and
			   now it is going to start the Auto-redial procedure
			 */
		    cc_stat.type = REDIALING_CALL;
		    cc_stat.call_number = 0;

		    call_stat = REDIALING_CALL;
		    rdl.redial_mode = CM_REDIAL_STARTED;
		    mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
		    rdl.name.len = cc_stat.name.len;
		    memcpy(rdl.name.data,
			   cc_stat.name.data,
			   cc_stat.name.len);
#else
		    mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//		      strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
		    rdl.ton = cc_stat.ton;
		    rdl.type = cc_stat.mode;

		    /* reasons in the category 1 and 2 have
		       a call repeat attempts of max. 10 !
		     */

		    cm_signal(E_CM_REDIAL, &rdl);
		    return;
		}

		if (redial_count >= 1 AND redial_count <= 3)
		{
		    timStart(redialTim24);
		    call_stat = REDIALING_CALL;
		    cc_stat.call_number = 0;
		    return;
		}

		if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
		{
		    timStart(redialTim5);
		    call_stat = REDIALING_CALL;
		    cc_stat.call_number = 0;
		    return;
		}
#ifdef CUSTOMER_6366
				// JP PATCH The MMI needs to know if the 'error disconnect' has
				// resulted in redial starting irrespective of whether this was a redial attempt or not
				rdl.redial_mode = CM_REDIAL_STARTED;
				cm_signal(E_CM_REDIAL, &rdl);
				// END JP PATCH
#endif /* CUSTOMER_6366 */
		break;

	    default:
		if (redial_count)
		{
		  rdl.redial_mode = CM_REDIAL_STOP;
		  mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
		  rdl.name.len = cc_stat.name.len;
		  memcpy(rdl.name.data,
			 cc_stat.name.data,
			 cc_stat.name.len);
#else
		  mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);//???
//		    strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
		  rdl.ton = cc_stat.ton;
		  rdl.type = cc_stat.mode;
		  cm_signal(E_CM_REDIAL, &rdl);
		}
		/* allow a new outgoing */
		call_stat    = MFW_CALL_FREE;
		call_type    = MFW_CALL_FREE;
		cc_stat.type = MFW_CALL_FREE;
		return;
	}
#ifdef FF_MMI_OPTIM
	if (redial_count >= MAX_REDIAL_ATTEMPT
	    AND count < MAX_BLACKLIST_NUM)
	{
		  mfwStrncpy((char *)blackListNum,(char *)cc_stat.number, MFW_NUM_LEN);
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	once there is new addition update it onto the file
		if(flash_MMI_blackList_write((U8*)blackListNum, MFW_NUM_LEN, (count*MFW_NUM_LEN)+1) < 0)
			TRACE_FUNCTION("ERROR OPENING the blacklist file");
		count++;
		if(flash_MMI_blackList_write((U8*)&count,1,0) < 0)
			TRACE_FUNCTION("ERROR OPENING the blacklist file");
#else
	if (redial_count >= MAX_REDIAL_ATTEMPT
	    AND black_list.count < MAX_BLACKLIST_NUM)
	{
		  mfwStrncpy((char *)black_list.number[black_list.count],
		   (char *)cc_stat.number, MFW_NUM_LEN);
	    black_list.count++;
#endif
		rdl.redial_mode   = CM_REDIAL_BLACKLISTED;
	    mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
	    rdl.name.len = cc_stat.name.len;
	    memcpy(rdl.name.data,
		   cc_stat.name.data,
		   cc_stat.name.len);
#else
	    mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//		strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
	    rdl.ton = cc_stat.ton;
	    rdl.type = cc_stat.mode;
	    rdl.left_attempts	= 0;
	    cc_stat.call_number = 0;
	    cm_signal(E_CM_REDIAL, &rdl);
	}
    }

    /* allow a new outgoing */
    call_stat	 = MFW_CALL_FREE;
    call_type	 = MFW_CALL_FREE;
    cc_stat.type = MFW_CALL_FREE;
}
#endif


/*
+-----------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM		|
| STATE   : code			 ROUTINE : cm_rmt_error_connect |
+-----------------------------------------------------------------------+


   PURPOSE : The connection is not successful

*/

#ifdef FF_2TO1_PS
void cm_rmt_error_connect(SHORT call_number)
{
    T_CAUSE_ps_cause report;  /* Marcus: Extended error reporting: 12/11/2002 */

    TRACE_FUNCTION ("cm_error_connect()");

//TISH: OMAPS00104986 if there is inband tone, it should not disconnect the call, until User reject it.
 if (cm_cpi.inband) return;
    /* send event */
    dis_connect.call_number = call_number;

    qAT_PlusCEER( CMD_SRC_LCL, &report);
    /* Marcus: Extended error reporting: 12/11/2002: Start */
//    TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);

    if (report.ctrl_value != CAUSE_is_from_nwcc)
    {
        /* Treat Condat defined cause values as if no cause given */
        dis_connect.cause = NOT_PRESENT_8BIT;
    }
    else
    {
       /* Standards defined cause value is given */
       dis_connect.cause = report.value.nwcc_cause;
    }

    TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
    /* Marcus: Extended error reporting: 12/11/2002: End */

    cm_signal(E_CM_DISCONNECT, &dis_connect);
}
#else
void cm_rmt_error_connect(SHORT call_number)
{
    USHORT report;  /* Marcus: Extended error reporting: 12/11/2002 */

    TRACE_FUNCTION ("cm_error_connect()");
    //TISH: OMAPS00104986 if there is inband tone, it should not disconnect the call, until User reject it.
    if (cm_cpi.inband) return;

    /* send event */
    dis_connect.call_number = call_number;

    qAT_PlusCEER( CMD_SRC_LCL, &report);
    /* Marcus: Extended error reporting: 12/11/2002: Start */
    TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
    if (GET_CAUSE_DEFBY(report) == DEFBY_CONDAT)
    {
        /* Treat Condat defined cause values as if no cause given */
        dis_connect.cause = NOT_PRESENT_8BIT;
    }
    else
    {
        /* Standards defined cause value is given */
        dis_connect.cause = GET_CAUSE_VALUE(report);
    }
    TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
    /* Marcus: Extended error reporting: 12/11/2002: End */

    cm_signal(E_CM_DISCONNECT, &dis_connect);
}
#endif


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_disconnect	     |
+--------------------------------------------------------------------+


   PURPOSE : Disconnection for outgoing call or active call

*/

T_MFW cm_disconnect(SHORT call_number)
{
    CHAR		callId[5];
    T_MFW_CM_CALL_STAT	stat;
    UBYTE		ton;
    UBYTE		mode;

    TRACE_FUNCTION ("cm_disconnect()");

    dis_connect.call_number = call_number;

	/*Apr 25, 2006 OMAPS00075711 a0393213 (R.Prabakar)
      Description : 'End Conference' option doesn't work
      Solution    : The ACI_CHLD_MOD is changed from CHLD_MOD_RelActSpec to CHLD_MOD_RelActAndAcpt while calling sAT_PlusCHLD().
                    This is done since CHLD_MOD_RelActSpec with callId 0 is equivalent to sending AT+CHLD=10 which is invalid
                    according to GSM specification. Before calling sAT_PlusCHLD command status is also set*/

    if (!call_number)
    {
    sprintf(callId, "%d", 0);
	cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, callId);
	if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, callId) != AT_EXCT)
	    return CM_ERROR;
	return CM_OK;
    }

    cm_search_callStat(call_number, &stat, &ton, &mode);

	TRACE_EVENT_P3("Status %d Ton %d Mode %d",stat,ton,mode);

	/* HANG UP DATA CALL (WAP)
	 * SPR#1983 - SH - Use sAT_Abort() when call has not yet connected,
	 * rather than sAT_H */

    if (mode == DATA_CALL)
	{
		T_ACI_RETURN retval;

		TRACE_EVENT_P1("***Disconnect data call, stat=%d", stat);

		if ((stat == CALL_DIAL) OR (stat == CALL_ALERT))
	    {
			if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
				return CM_ERROR;
			return CM_OK;
	    }

	    if (stat == CALL_DEACTIVE && currConnecting)  /* ES/AK 290999 */
	    {
			currConnecting = 0;
			if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
				return CM_ERROR;
			return CM_OK;
	    }

		retval = sAT_H(CMD_SRC_LCL);

		TRACE_EVENT_P1("Result of sAT_H = %d", retval);
		if (retval)
		    return CM_ERROR;
		return CM_OK;
	}


    if ((stat == CALL_DIAL) OR (stat == CALL_ALERT))
    {
	if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
		return CM_ERROR;
	return CM_OK;
    }

    if (stat == CALL_DEACTIVE && currConnecting)  /* ES/AK 290999 */
    {
	currConnecting = 0;
	if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
		return CM_ERROR;
	return CM_OK;
    }

    if ((stat == CALL_ACTIVE) OR (stat == CALL_DEACTIVE))
    {
		cmd_hold = MFW_CM_TERMINATED;
		sprintf(callId, "%d", call_number);
		if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActSpec, callId) != AT_EXCT)
			return CM_ERROR;
		return CM_OK;
    }
    else if (stat == CALL_HELD)
   {


                //  Apr 26, 2004 REF: CRR 16545 Ajith K P Side effect of CRR 16545.
                //  CHLD_MOD_RelActSpec no longer releases held calls.
                //  So now if the user wants to release a HELD call, now we are calling the
                //  sAT_PlusCHLD(..) function with CHLD_MOD_RelAnySpec as the parameter.



		cmd_hold = MFW_CM_TERMINATED;
		sprintf(callId, "%d", call_number);
               // Feb 27, 2006    REF:DR OMAPS00067884  x0039928
               // Fix :  sAT_PercentCHLD() is called if the mode > CHLD_MOD_RelDialCall
		if (sAT_PercentCHLD(CMD_SRC_LCL, CHLD_MOD_RelAnySpec, callId) != AT_EXCT)
		    return CM_ERROR;
		return CM_OK;
   	}
	return CM_ERROR;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_force_disconnect |
+--------------------------------------------------------------------+


   PURPOSE : Disconnection of any call existent needed for Multiparty and some structured procedures
	     call termination in state U9

*/

void cm_force_disconnect(void)
{
  T_ACI_RETURN res;

  TRACE_FUNCTION("cm_force_disconnect()");

  res = sAT_H(CMD_SRC_LCL);
  if (res != AT_EXCT && res != AT_CMPL)
      TRACE_ERROR("satReject() error");

  return;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_ok_disconnect    |
+--------------------------------------------------------------------+


   PURPOSE : indicates disconnection from called party;
		sends E_CM_DISCONNECT to mmi

*/

#ifdef FF_2TO1_PS
void cm_ok_disconnect(T_ACI_CMD_SRC src, SHORT call_id)
{
    T_CAUSE_ps_cause cause;  /* Marcus: Extended error reporting: 12/11/2002 */
    T_MFW_CM_DISCONNECT_ALL disconnect_all;

    TRACE_FUNCTION("cm_ok_disconnect()");

    TRACE_EVENT_P4("dis_connect.call_number %d, cmd_hold %d, src %d, call_id %d",
                              dis_connect.call_number, cmd_hold, src, call_id);




    /* Marcus: CCBS: 14/11/2002: Start */
    if (cmd_hold == MFW_CM_CCBS_REGISTER)
    {
        /* Rejecting the offered CCBS registration */
        TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
        cmd_hold = 0;
        cm_ccbs_ok();
        return;
    }
    /* Marcus: CCBS: 14/11/2002: End */

    if (cmd_hold == MFW_CM_MPTY_TERMINATED)
	       dis_connect.call_number = 0;
	//Nov 02, 2005    DR OMAPS00052132   xdeepadh
	//The usage of ATI enum is put under the flag FF_ATI
#if  defined (FF_ATI) || defined (NEPTUNE_BOARD)
        else if (src EQ CMD_SRC_ATI_1) /* NM Berlin/UK integration 21.09.01 */
        {
               dis_connect.call_number = call_id;
        }
#endif


    /* send event */
    qAT_PlusCEER( CMD_SRC_LCL, &cause);
    /* Marcus: Extended error reporting: 12/11/2002: Start */
//    TRACE_EVENT_P1("qAT_PlusCEER(%04X)", cause);

    if (cause.ctrl_value != CAUSE_is_from_nwcc)
    {
        /* Treat Condat defined cause values as if no cause given */
        dis_connect.cause = NOT_PRESENT_8BIT;
    }
    else
    {
        /* Standards defined cause value is given */
        dis_connect.cause = cause.value.nwcc_cause;
    }

    TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
    /* Marcus: Extended error reporting: 12/11/2002: End */

    /* allow a new outgoing */
    call_stat = MFW_CALL_FREE;
    call_type = MFW_CALL_FREE;

    if (cmd_hold EQ MFW_CM_DISCONNECT_ALL)
    {
        disconnect_all.result = CM_DISCONNECT_ALL_RESULT_OK;
        if (cause.ctrl_value != CAUSE_is_from_nwcc)
        {
            /* Treat Condat defined cause values as if no cause given */
            disconnect_all.cause = NOT_PRESENT_8BIT;
        }
        else
        {
            /* Standards defined cause value is given */
            disconnect_all.cause = cause.value.nwcc_cause;
        }
        cm_signal(E_CM_DISCONNECT_ALL,&disconnect_all);
    }
    else
        cm_signal(E_CM_DISCONNECT, &dis_connect);

    cmd_hold = 0;

}
#else
void cm_ok_disconnect(T_ACI_CMD_SRC src, SHORT call_id)
{
    USHORT cause;  /* Marcus: Extended error reporting: 12/11/2002 */
    T_MFW_CM_DISCONNECT_ALL disconnect_all;

    TRACE_FUNCTION("cm_ok_disconnect()");

    TRACE_EVENT_P4("dis_connect.call_number %d, cmd_hold %d, src %d, call_id %d",
                              dis_connect.call_number, cmd_hold, src, call_id);




    /* Marcus: CCBS: 14/11/2002: Start */
    if (cmd_hold == MFW_CM_CCBS_REGISTER)
    {
        /* Rejecting the offered CCBS registration */
        TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
        cmd_hold = 0;
        cm_ccbs_ok();
        return;
    }
    /* Marcus: CCBS: 14/11/2002: End */

    if (cmd_hold == MFW_CM_MPTY_TERMINATED)
	       dis_connect.call_number = 0;
	//Nov 02, 2005    DR OMAPS00052132   xdeepadh
	//The usage of ATI enum is put under the flag FF_ATI
#ifdef FF_ATI
	else if (src EQ CMD_SRC_ATI_1) //NM Berlin/UK integration 21.09.01
	{
		dis_connect.call_number = call_id;
	}
#endif	//FF_ATI

    /* send event */
    qAT_PlusCEER( CMD_SRC_LCL, &cause);
    /* Marcus: Extended error reporting: 12/11/2002: Start */
    TRACE_EVENT_P1("qAT_PlusCEER(%04X)", cause);
    if (GET_CAUSE_DEFBY(cause) == DEFBY_CONDAT)
    {
        /* Treat Condat defined cause values as if no cause given */
        dis_connect.cause = NOT_PRESENT_8BIT;
    }
    else
    {
        /* Standards defined cause value is given */
        dis_connect.cause = GET_CAUSE_VALUE(cause);
    }
    TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
    /* Marcus: Extended error reporting: 12/11/2002: End */

    /* allow a new outgoing */
    call_stat = MFW_CALL_FREE;
    call_type = MFW_CALL_FREE;

    if (cmd_hold EQ MFW_CM_DISCONNECT_ALL)
    {
        disconnect_all.result = CM_DISCONNECT_ALL_RESULT_OK;
        if (GET_CAUSE_DEFBY(cause) == DEFBY_CONDAT)
        {
            /* Treat Condat defined cause values as if no cause given */
            disconnect_all.cause = NOT_PRESENT_8BIT;
        }
        else
        {
            /* Standards defined cause value is given */
            disconnect_all.cause = GET_CAUSE_VALUE(cause);
        }
        cm_signal(E_CM_DISCONNECT_ALL,&disconnect_all);
    }
    else
        cm_signal(E_CM_DISCONNECT, &dis_connect);

    cmd_hold = 0;

}
#endif

/* Marcus: CCBS: 14/11/2002: Start */
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM	        	     |
| STATE  : code 			ROUTINE: cm_error_disconnect             |
+--------------------------------------------------------------------+

   PURPOSE : indicates failed disconnection

*/
void cm_error_disconnect(void)
{
    TRACE_FUNCTION ("cm_error_disconnect()");
    if (cmd_hold == MFW_CM_DISCONNECT_ALL)
    {
        TRACE_EVENT("cmd_hold == MFW_CM_DISCONNECT_ALL");
        cmd_hold = 0;
    }

    /* Marcus: CCBS: 14/11/2002: Start */
    if (cmd_hold == MFW_CM_CCBS_REGISTER)
    {
        TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
        /* Rejecting the offered CCBS registration */
        cmd_hold = 0;
        cm_ccbs_error();
    }
}
/* Marcus: CCBS: 14/11/2002: End */

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_command	     |
+--------------------------------------------------------------------+


   PURPOSE :

*/

T_MFW cm_command(SHORT call_number, UBYTE command, UBYTE crss_string)
{
  CHAR		      callId[5];
  UBYTE 	      res;
  SHORT retVal, modeRetVal; // xnkulkar SPR-18262: Added "modeRetVal"  to store the return value of "mfw_cbuf_put_mode ()"

  TRACE_FUNCTION ("cm_command()");

// JP PATCH
	cmd_hold = 0;
// END PATCH

  cmd.call_number = call_number;
  cmd.command	  = command;

  switch (command)
  {
    case CM_HOLD:
    case CM_SWAP:
    case CM_RETRIEVE:
    case CM_SWAP_MULTIPARTY:
    case CM_HOLD_MULTIPARTY:
    case CM_RETRIEVE_MULTIPARTY:
      /* place all active calls on held and accept held or waiting call */
      if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, 0) != AT_EXCT)
	return FALSE;
      break;

    case CM_BUILD_MULTIPARTY:
      if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_AddHld, 0)!= AT_EXCT)
	return FALSE;
      break;

    case CM_SPLIT_MULTIPARTY:
      if (call_number <= 0)
	return FALSE;
      sprintf(callId, "%d", call_number);
      if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActExc, callId)!= AT_EXCT)
	return FALSE;
      break;

    case CM_ETC:
      /* connects two calls and disconnects the subsrciber from both calls */
      if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ect, 0) != AT_EXCT)
	return FALSE;
      break;

    case CM_CALL_DEFLECTION:
      break;

    case CM_CCBS:
        TRACE_EVENT("CM_CCBS");
      sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ccbs, 0);
      break;

    case CM_MODIFY:
      break;

    case CM_DTMF_ACTIVE:
	// xnkulkar SPR-18262
	// If there is a DTMF tone command already in the queue, add the current tone also
	// in the queue (with start mode). Also, start adding to the queue if we are expecting an acknowledgement
	// (rAT_OK) for the previous DTMF tone request sent.
	/*OMAPS00108192 a0393213 DTMF START-DTMF STOP properly nested*/
	if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) != 0)
    	{
		/*dtmf queue not empty*/
		if(dtmf_queued.mode==VTS_MOD_ManStop)
		{
			/*most recent element in the queue corresponds to 'stop'*/
			/*queue up*/
			modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStart);
	    		retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
			// If the return values are negative, attempt to Queue the DTMF request failed
	    		if (retVal < 0 || modeRetVal < 0)
	    		{
	    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
	    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
	    			/*
	    			** Failed to Queue the DTMF request.
	    			*/
	    			return(FALSE);
	    		}
			/*successfully queued update the internal variable*/
			dtmf_queued.mode=VTS_MOD_ManStart;
			dtmf_queued.digit=crss_string;
			return (TRUE);
		}
		else
		{
			/*ignore the key press*/
			return (TRUE);
		}

    	}
    	else
	{
		/*dtmf queue empty*/
	    	if(dtmf_sent.valid==TRUE)
    		{
    			/*some dtmf has already been sent to ACI and MMI is waiting for rAT_ok*/
    			if(dtmf_sent.mode==VTS_MOD_ManStop)
    			{
    				/*last sent dtmf is STOP - so queue up*/
				modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStart);
		    		retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
				// If the return values are negative, attempt to Queue the DTMF request failed
		    		if (retVal < 0 || modeRetVal < 0)
		    		{
		    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
		    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
		    			/*
		    			** Failed to Queue the DTMF request.
		    			*/
		    			return(FALSE);
		    		}
				/*successfully queued update the internal variable*/
				dtmf_queued.mode=VTS_MOD_ManStart;
				dtmf_queued.digit=crss_string;
				return (TRUE);
    			}
			else
			{
				return (TRUE); /*ignore the key press*/
			}
    		}
		else
		{
			/*we are not waiting for any rAT_ok - so call sAT_PlusVTS*/
			if(sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_ManStart) == AT_EXCT)
				{
				TRACE_EVENT("sAT_PlusVTS() successful");
				dtmf_sent.valid=TRUE;
				dtmf_sent.mode=VTS_MOD_ManStart;
				dtmf_sent.digit=crss_string;
			}
			else
			{
				TRACE_EVENT("sAT_PlusVTS() busy or failed");
				return (FALSE);
			}
		}

	}
	#ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
      currCmd = AT_CMD_VTS;
	#endif
      break;

    case CM_DTMF_INACTIVE:
	// xnkulkar SPR-18262
	// If there is a DTMF tone command already in the queue, add the current tone also
	// in the queue (with stop mode). Also, start adding to the queue if we are expecting an acknowledgement
	// (rAT_OK) for the previous DTMF tone request sent.
	/*OMAPS00108192 a0393213 DTMF START-DTMF STOP properly nested*/
    	if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) != 0)
    	{
		/*dtmf queue not empty*/
		if(dtmf_queued.mode==VTS_MOD_ManStart && dtmf_queued.digit==crss_string)
		{
			/*most recent element in the queue corresponds to START and are of same digit so queue up*/
			modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStop);
	    		retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
			// If the return values are negative, attempt to Queue the DTMF request failed
	    		if (retVal < 0 || modeRetVal < 0)
	    		{
	    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
	    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
	    			/*
	    			** Failed to Queue the DTMF request.
	    			*/
	    			return(FALSE);
	    		}
			/*successfully queued update the internal variable*/
			dtmf_queued.mode=VTS_MOD_ManStop;
			dtmf_queued.digit=crss_string;
			return (TRUE);
		}
		else
		{
			/*ignore the key press*/
			return (TRUE);
		}

    	}
    	else
	{
		/*dtmf queue empty*/
	    	if(dtmf_sent.valid==TRUE)
    		{
    			/*some dtmf has already been sent to ACI and MMI is waiting for rAT_ok*/
    			if(dtmf_sent.mode==VTS_MOD_ManStart && dtmf_sent.digit==crss_string)
    			{
    				/*last sent dtmf corresponds to START and are of same digit - so queue up*/
				modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_ManStop);
		    		retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
				// If the return values are negative, attempt to Queue the DTMF request failed
		    		if (retVal < 0 || modeRetVal < 0)
		    		{
		    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
		    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
		    			/*
		    			** Failed to Queue the DTMF request.
		    			*/
		    			return(FALSE);
		    		}
				/*successfully queued update the internal variable*/
				dtmf_queued.mode=VTS_MOD_ManStop;
				dtmf_queued.digit=crss_string;
				return (TRUE);
    			}
			else
			{
				return (TRUE); /*ignore the key press*/
			}
    		}
		else
		{
			/*rAT_ok is not expected. so call sAT_PlusVTS*/
		if(sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_ManStop) == AT_EXCT)
			{
				TRACE_EVENT("sAT_PlusVTS() successful");
				dtmf_sent.valid=TRUE;
				dtmf_sent.mode=VTS_MOD_ManStop;
				dtmf_sent.digit=crss_string;
			}
			else
			{
				TRACE_EVENT("sAT_PlusVTS() busy or failed");
				return (FALSE);
			}
		}

      }
      res = TRUE;
      cm_signal(E_CM_DTMF, &res);
      break;

    case CM_DTMF_AUTO:
	/*OMAPS00108192 a0393213(R.Prabakar)
	    As part of the issue CM_DTMF_ACTIVE and CM_DTMF_INACTIVE cases modified. But this case is not modified
	    because this case is felt irrelavant. If required the same logic can be extended to this case also*/
    	if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) != 0)
    	{
    		/*
    		** There are already DTMF tones queued to be sent, so queue this request to.
    		*/
		modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_Auto);
    		retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
    		if (retVal < 0  || modeRetVal < 0)
    		{
    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
	    		TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
    			/*
    			** Failed to Queue the DTMF request.
    			*/
    			return(FALSE);
    		}
    	}
    	else
		{
	    	if (sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_Auto) != AT_EXCT)
	      	{
	      		/*
	      		** The attempt to send an immediate DTMF failed.
	      		** Add the failed attempt onto the DTMF queue and wait.
	      		*/
			modeRetVal = mfw_cbuf_put_mode(mfw_cm_dtmf_q_id, VTS_MOD_Auto);
	      		retVal = mfw_cbuf_put(mfw_cm_dtmf_q_id, &crss_string);
	    		if (retVal < 0 || modeRetVal < 0)
	    		{
	    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put failed with error %d", retVal);
	    			TRACE_EVENT_P1("ERROR : mfw_cbuf_put_mode failed with error %d", modeRetVal);
	    			/*
	    			** Failed to Queue the DTMF request.
	    			*/
	    			return(FALSE);
	    		}
	      	}
		}
      break;

    default:
      break;
  }
  return TRUE;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : send_queued_dtmf_tone	     |
+--------------------------------------------------------------------+


   PURPOSE : Check the DTMF Queue and if required send the next DTMF Tone Request.

*/
static void send_queued_dtmf_tone(void)
{
	SHORT retVal;
    UBYTE qdtmf;
	//xnkulkar SPR-18262: Added these variables to store the Mode
	T_ACI_VTS_MOD  vts_mode = VTS_MOD_NotPresent;

    	TRACE_EVENT("send_queued_dtmf_tone()");
	/*OMAPS00108192 a0393213*/
    if (mfw_cbuf_num_elements(mfw_cm_dtmf_q_id) > 0)
    {
    		/*dtmf queue has some elements - so dequeue and send to ACI*/
    		// Get the mode (Start / Stop) corresponding to the DTMF tone
    		vts_mode = (T_ACI_VTS_MOD)mfw_cbuf_get_mode(mfw_cm_dtmf_q_id);
		// Get the DTMF key for which the tone is to be sent from the queue
	    	retVal = mfw_cbuf_get(mfw_cm_dtmf_q_id, &qdtmf);
	    	if (retVal > 0)
		{
	    		if (sAT_PlusVTS(CMD_SRC_LCL, (CHAR)qdtmf, vts_mode) == AT_EXCT)
		      	{
		      		dtmf_sent.valid=TRUE;
				dtmf_sent.mode=vts_mode;
				dtmf_sent.digit=qdtmf;
		      	}

		}
    		else
		{
			TRACE_EVENT_P1("ERROR : mfw_cbuf_get failed with error value %d", retVal);
			dtmf_sent.valid=FALSE;
		}

    	}
	else
	{
		dtmf_sent.valid=FALSE;
    	 }
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : resetDTMFQueue	     |
+--------------------------------------------------------------------+
   PURPOSE : reset the dtmf queue
*/
/*OMAPS00107103 (no dtmf tones for simultaneous key press) a0393213(R.Prabakar) - function added*/
void resetDTMFQueue()
{
	TRACE_EVENT("resetDTMFQueue");
	mfw_cbuf_reset(mfw_cm_dtmf_q_id);
	//expectRatOk=FALSE;
	dtmf_sent.valid=FALSE;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_ok_dtmf	     |
+--------------------------------------------------------------------+


   PURPOSE : DTMF activation is successful.

*/

void cm_ok_dtmf(void)
{
    UBYTE res;
    #ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
    currCmd = AT_CMD_NONE;
    #endif
    res = TRUE;
    cm_signal(E_CM_DTMF, &res);

	send_queued_dtmf_tone();

	return;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_error_tdmf     |
+--------------------------------------------------------------------+


   PURPOSE : DTMF activation is failed.

*/

void cm_error_dtmf(void)
{
    UBYTE res;
#ifdef MMI_LINT_WARNING_REMOVAL /*a0393213 lint warnings removal*/
    currCmd = AT_CMD_NONE;
#endif
    res = FALSE;
    cm_signal(E_CM_DTMF, &res);

	send_queued_dtmf_tone();

}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_result_cmd     |
+--------------------------------------------------------------------+


   PURPOSE : Acknowledgement for the requested ss command.

*/

void cm_result_cmd(T_ACI_CMD_SRC src, UBYTE result)
{
    SHORT call_number;

	TRACE_EVENT_P1("cm_result_cmd(), cmd_hold = %d", cmd_hold);

	/* MC changed all the "if"s to a switch to allow default 11/04/02*/
    switch (cmd_hold)
    {
	case MFW_CM_MT_REJECT:
		break; /* CONQUEST 6040- MC-  put a break in the case so no action taken*/
	case MFW_CM_MPTY_TERMINATED:
	case MFW_CM_TERMINATED:

    {
      if (result EQ Present)
	cm_ok_disconnect(CMD_SRC_LCL, 0);
      return;
    }
//	break;  // RAVI

    case MFW_CM_MT_ACCEPT:
    {
      /*
       * active call on hold, accept new incoming call
       */
      cmd_hold = 0;
      if (result EQ Present)
	/*
	 * Call on hold was successful
	 */
	cm_ok_connect();

      else
      {
	if (cm_search_callId(CAL_STAT_Active, &call_number) != CM_OK)
	  return;
	cmd.call_number = call_number;
#ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
	cc_id = 0; // ???
#endif
      }
    }
	break;


	case MFW_CM_HOLD_AND_DIAL:
    {
      /*
       * active call on hold, accept new incoming call
       */
      cmd_hold = 0;
      if (result EQ Present)
	/*
	 * Call on hold was successful
	 */
	 cm_ok_connect();

      else
      {
	if (cm_search_callId(CAL_STAT_Active, &call_number) != CM_OK)
	  return;
	cmd.call_number = call_number;
#ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
	cc_id = 0; // ???
#endif
      }
    }
	break;

	case MFW_CM_1_SEND:
	{

		cmd_hold = 0;
		if (result == Present)
		{
			// MMI-SPR 13873 xkundadu
			// Handling of 1SEND
			// If the user presses 1SEND, release active calls and accept
			// the WAITING call
		       if (dis_connect.call_number NEQ -1)
		    	{
		    		// If there is an active call, disconnect it.
				cm_ok_disconnect(CMD_SRC_LCL, 0);
		    	}

	    		if (!cmd.call_number)
		       {
				// If there is waiting call, accept the call
			 	cm_ok_connect();
		       }
		    	cmd.call_number = -1;
		}

  	}
	   break;

        /* Marcus: CCBS: 14/11/2002: Start */
        case MFW_CM_CCBS_REGISTER:

            TRACE_EVENT("MFW_CM_CCBS_REGISTER");

            cmd_hold = 0;

            if (result == Present)
            {
                TRACE_EVENT("result == Present");
                cm_ccbs_ok();
            }
            else    /* result is NotPresent */
            {
                TRACE_EVENT("result != Present");
                cm_ccbs_error();
            }
            return;

        case MFW_CM_CCBS_RECALL:

            TRACE_EVENT("MFW_CM_CCBS_RECALL");

            cmd_hold = 0;

            if (result == Present)
            {
                TRACE_EVENT("result == Present");
                cm_ccbs_ok();
            }
            else    /* result is NotPresent */
            {
                TRACE_EVENT("result != Present");
                cm_ccbs_error();
            }
            return;
        /* Marcus: CCBS: 14/11/2002: Start */

	default:/*For other command types ensure correct result is passed up to BMI*/
	{
	    cmd.result = result;
	}
	break;
  }


#if defined (WIN32)
    {
      char buf[40];
      sprintf (buf, "Event CM_COMMAND for %d", cmd.call_number);
      TRACE_EVENT (buf);
      sprintf (buf, "Result %d Command %d",cmd.result, cmd.command);
      TRACE_EVENT (buf);
    }
#endif
    cmd.result = result;
    cm_signal(E_CM_COMMAND, &cmd);
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvt_speed_type   |
+--------------------------------------------------------------------+


   PURPOSE :  This function is used to convert the type of data rate
	      used by MFW to the type of data rate used by ACI.

*/

LOCAL T_ACI_BS_SPEED cm_cvt_speed_type ( T_MFW_CM_DATA_SPEED speed )
{
  switch ( speed )
  {
    case ( SPEED_300 ):   return BS_SPEED_300_V110;
    case ( SPEED_1200 ):  return BS_SPEED_1200_V110;
    case ( SPEED_2400 ):  return BS_SPEED_2400_V110;
    case ( SPEED_4800 ):  return BS_SPEED_4800_V110;
    case ( SPEED_9600 ):  return BS_SPEED_9600_V110;
    case ( SPEED_14400 ): return BS_SPEED_14400_V110;
    default:	      return BS_SPEED_NotPresent;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvt_bs_type      |
+--------------------------------------------------------------------+


   PURPOSE :  This function is used to convert the type of bearer service
	      used by MFW to the type of bearer service used by ACI.

*/

LOCAL T_ACI_CBST_NAM cm_cvt_bs_type ( T_MFW_CM_BS bs )
{
  switch ( bs )
  {
    case ( Asynch ): return CBST_NAM_Asynch;
    case ( Synch ):  return CBST_NAM_Synch;
    default:	     return CBST_NAM_NotPresent;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvt_ce_type      |
+--------------------------------------------------------------------+


   PURPOSE :  This function is used to convert the  data mode
	      used by MFW to the data mode used by ACI.

*/

LOCAL T_ACI_CBST_CE cm_cvt_ce_type ( T_MFW_CM_CE ce )
{
  switch ( ce )
  {
    case ( Transparent ):     return CBST_CE_Transparent;
    case ( NonTransparent ):  return CBST_CE_NonTransparent;
    default:	      return CBST_CE_NotPresent;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_set_bc_para      |
+--------------------------------------------------------------------+


   PURPOSE :  Set bearer parameter for mobile originated calls.

*/

void cm_set_bc_para(T_MFW_CM_BC_PARA * bc, UBYTE ti)
{
  TRACE_FUNCTION ("cm_set_bc_para()");
#ifdef FAX_AND_DATA
  sAT_PlusCBST(CMD_SRC_LCL,
	       cm_cvt_speed_type ((T_MFW_CM_DATA_SPEED)bc->rate),
	       cm_cvt_bs_type ((T_MFW_CM_BS)bc->bearer_serv),
	       cm_cvt_ce_type ((T_MFW_CM_CE)bc->conn_elem));
#endif /* FAX_AND_DATA */
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_notify	     |
+--------------------------------------------------------------------+


   PURPOSE :  Change of SS status from call party.

*/
void cm_notify(T_ACI_CSSU_CODE code,
			   SHORT	   index,
			   UBYTE	  *number)
{	char debug[50];
	sprintf(debug,"cm_notify(), code:%d, index:%d" , code, index);
	TRACE_EVENT(debug);
	if (number)
		notify.call_number = index;

	if (code == CSSU_CODE_OnHold)
		notify.notification = MFW_CM_HOLD;
	if (code == CSSU_CODE_Retrieved)
		notify.notification = MFW_CM_RETRIEVED;

	cm_signal(E_CM_NOTIFY, &notify);
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_get_aoc_value  |
+--------------------------------------------------------------------+


   PURPOSE :  Getting AoC (advice of charge) value.

*/

T_MFW cm_get_aoc_value(UBYTE request_type, T_MFW_CM_AOC_INFO *aoc_info)
{
    T_ACI_RPCT_VAL  rpuct;

    TRACE_FUNCTION ("cm_get_aoc_value()");

    switch (request_type)
    {
	/* Price pro unit and currency table */
	case CM_AOC_PUCT:
	    if (qAT_PlusCPUC(CMD_SRC_LCL,
		(CHAR *)aoc_info->cur,
		(CHAR *)aoc_info->ppu) == AT_CMPL)
	    {
		aoc_info->requested_type = CM_AOC_PUCT;
		return CM_OK;
	    }
	    else
		return CM_NO_AOC;
//	    break;  // RAVI

	/* maximum value of accumulated Call Meter */
	case CM_AOC_ACMMAX:
	    if (qAT_PlusCAMM(CMD_SRC_LCL, &aoc_info->acm_max) == AT_CMPL)
	    {
		aoc_info->requested_type = CM_AOC_ACMMAX;
		return CM_OK;
	    }
	    else
		return CM_NO_AOC;
//	    break;  // RAVI

	/* Accumulated Call Meter */
	case CM_AOC_ACM:
	    if (qAT_PlusCACM(CMD_SRC_LCL, &aoc_info->acm) == AT_CMPL)
	    {
		aoc_info->requested_type = CM_AOC_ACM;
		return CM_OK;
	    }
	    else
		return CM_NO_AOC;
	//     break;  // RAVI

	case CM_AOC_CCM:
	    if (qAT_PlusCAOC(CMD_SRC_LCL, &aoc_info->ccm) == AT_CMPL)
	    {
		aoc_info->requested_type = CM_AOC_CCM;
		return CM_OK;
	    }
	    else
		return CM_NO_AOC;
//	    break;   // RAVI

    case CM_AOC_TIMERS:
	if (qAT_PercentCTV(CMD_SRC_LCL, &aoc_info->actual_call_timer) == AT_CMPL)
	{
	    aoc_info->requested_type = CM_AOC_TIMERS;
	    return CM_OK;
	}
	else
	    return CM_NO_AOC;
//	break;  // RAVI

    case CM_AOC_CCM_PUCT:
	if (qAT_PercentCAOC(CMD_SRC_LCL, (CHAR *)aoc_info->cur, (CHAR *)aoc_info->ccm_puct) == AT_CMPL)
	{
	    aoc_info->requested_type = CM_AOC_CCM_PUCT;
	    return CM_OK;
	}
	else
	    return CM_NO_AOC;
//	break;  // RAVI

    case CM_AOC_ACM_PUCT:
	if (qAT_PercentCACM(CMD_SRC_LCL, (CHAR *)aoc_info->cur, (CHAR *)aoc_info->acm_puct) == AT_CMPL)
	{
	    aoc_info->requested_type = CM_AOC_ACM_PUCT;
	    return CM_OK;
	}
	else
	    return CM_NO_AOC;
    case CM_AOC_RAW_PUCT:
	if (qAT_PercentRPCT(CMD_SRC_LCL, &rpuct) == AT_CMPL)
	{
	    aoc_info->requested_type = CM_AOC_RAW_PUCT;
	    strncpy((char *)aoc_info->cur, (char *)rpuct.currency, MAX_CUR_LEN);
	    aoc_info->eppu = rpuct.eppu;
	    aoc_info->exp  = rpuct.exp;
	    aoc_info->sexp = rpuct.sexp;
	    return CM_OK;
	}
	else
	    return CM_NO_AOC;
//	break;  // RAVI

    default:
	return CM_NO_AOC;
  }
}



/*
+----------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	       |
| STATE   : code			 ROUTINE : cm_reset_aoc_value  |
+----------------------------------------------------------------------+


   PURPOSE :  Setting AoC (advice of charge) value.

*/

T_MFW cm_set_aoc_value(UBYTE request_type,
		       T_MFW_CM_AOC_INFO *aoc_info,
		       UBYTE *pwd)
{
    TRACE_FUNCTION ("cm_reset_aoc_value()");

    switch (request_type)
    {
	case CM_AOC_PUCT:
	    if (sAT_PlusCPUC(CMD_SRC_LCL, (CHAR *)aoc_info->cur,
			     (CHAR *)aoc_info->ppu, (CHAR *)pwd) != AT_EXCT)
		return CM_ERROR;
	    break;

	case CM_AOC_ACMMAX:
	    if (sAT_PlusCAMM(CMD_SRC_LCL, aoc_info->acm_max,
			     (CHAR *)pwd) != AT_EXCT)
		return CM_ERROR;
	    break;

	case CM_AOC_ACM:
	    if (sAT_PlusCACM(CMD_SRC_LCL, (CHAR *)pwd) != AT_EXCT)
		return CM_ERROR;
	    break;

	default:
	    return CM_ERROR;
    }

    return CM_OK;
}


/*
+----------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	       |
| STATE   : code			 ROUTINE : cm_cvt_cmd	       |
+----------------------------------------------------------------------+


   PURPOSE :  Convert AoC command

*/

UBYTE cm_cvt_cmd(T_ACI_AT_CMD cmdId)
{
    switch (cmdId)
    {
	case AT_CMD_CACM:   return CM_AOC_ACM;
	case AT_CMD_CAMM:   return CM_AOC_ACMMAX;
	case AT_CMD_CPUC:   return CM_AOC_PUCT;
	default:	    return CM_AOC_UNKNOWN;
    }
}


/*
+----------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	       |
| STATE   : code			 ROUTINE : cm_ok_aoc	       |
+----------------------------------------------------------------------+


   PURPOSE :  Setting AoC is successful.

*/

void cm_ok_aoc(T_ACI_AT_CMD cmdId)
{
    T_MFW_CM_AOC_CNF aoc_cnf;

    aoc_cnf.requested_type = cm_cvt_cmd(cmdId);
    aoc_cnf.result = CM_AOC_CONF_OK;
    cm_signal(E_CM_AOC_CNF, &aoc_cnf);
}


/*
+----------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	       |
| STATE   : code			 ROUTINE : cm_error_aoc        |
+----------------------------------------------------------------------+


   PURPOSE :  Setting AoC is failure.

*/

void cm_error_aoc(T_ACI_AT_CMD cmdId, T_ACI_CME_ERR reason)
{
    T_MFW_CM_AOC_CNF aoc_cnf;

    aoc_cnf.requested_type = cm_cvt_cmd(cmdId);
    aoc_cnf.result = CM_AOC_CONF_UNKNOWN;

    if (reason EQ CME_ERR_SimPin2Req)
	aoc_cnf.result = CM_AOC_CONF_SIMPIN2REQ;

    if (reason EQ CME_ERR_WrongPasswd)
	aoc_cnf.result = CM_AOC_CONF_WRONGPASSWD;

    if (reason EQ CME_ERR_OpNotAllow)
	aoc_cnf.result = CM_AOC_CONF_OPNOTALLOW;

    if (reason EQ CME_ERR_AcmResetNeeded)
	aoc_cnf.result = CM_AOC_CONF_ACMRESETNEEDED;

    cm_signal(E_CM_AOC_CNF, &aoc_cnf);
}


/*
+-----------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	  |
| STATE   : code			 ROUTINE : rAT_PercentCTV |
+-----------------------------------------------------------------+


   PURPOSE : manage timer in every second

*/

void rAT_PercentCTV()
{
    TRACE_FUNCTION("rAT_PercentCTV()");
    cm_signal(E_CM_TIMER_EVERY_SECOND, 0);
}


/*
+-----------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	  |
| STATE   : code			 ROUTINE : rAT_PlusCCCM   |
+-----------------------------------------------------------------+


   PURPOSE :

*/

void rAT_PlusCCCM(LONG *ccm)
{
    T_MFW_CM_AOC_INFO aoc_info;
    T_ACI_RPCT_VAL    rpuct;

    TRACE_FUNCTION("rAT_PlusCCCM()");

    memset(&aoc_info, 0, sizeof(T_MFW_CM_AOC_INFO));

    qAT_PlusCAMM(CMD_SRC_LCL, &aoc_info.acm_max);
    qAT_PlusCACM(CMD_SRC_LCL, &aoc_info.acm);
    aoc_info.ccm = *ccm;
    qAT_PercentCTV(CMD_SRC_LCL, &aoc_info.actual_call_timer);
    qAT_PercentRPCT(CMD_SRC_LCL, &rpuct);
    strncpy((char *)aoc_info.cur, (char *)rpuct.currency, MAX_CUR_LEN);
    aoc_info.requested_type = CM_AOC_CCM;
    aoc_info.eppu = rpuct.eppu;
    aoc_info.exp  = rpuct.exp;
    aoc_info.sexp = rpuct.sexp;

    cm_signal(E_CM_AOC, &aoc_info);
}


/*
+----------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	 |
| STATE   : code			 ROUTINE : cm_set_redial |
+----------------------------------------------------------------+


   PURPOSE :  Set redial mode (automatic/manual).

*/

void cm_set_redial(UBYTE redial_mode)
{
 // U8 version;  // RAVI
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	local definition
#ifdef FF_MMI_OPTIM
	T_MFW_CM_BLACKLIST_LIST black_list;
#endif

  TRACE_FUNCTION ("cm_set_redial()");

  if (redial_mode == CM_REDIAL_BLACKLIST)
  {
	memset(&black_list, 0, sizeof(T_MFW_CM_BLACKLIST_LIST));
//	Apr 14, 2005	REF: CRR 29991   xpradipg
//	reset the file contents
#ifdef FF_MMI_OPTIM
  	if(flash_MMI_blackList_write((U8 *)&black_list, sizeof(T_MFW_CM_BLACKLIST_LIST),0) < 0)
		TRACE_FUNCTION(" Error writing into file");
#endif
	return;
  }

  if (redial_mode == CM_REDIAL_OFF
	  || redial_mode == CM_REDIAL_AUTO
	  || redial_mode == CM_REDIAL_MANU)
  {
    redial_stat = redial_mode;

    /* write redialing mode to EEPROM */

	FFS_flashData.redial_mode =redial_mode;
	flash_write();

  }
}


/*
+---------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	      |
| STATE   : code			 ROUTINE : cm_get_redial_mode |
+---------------------------------------------------------------------+


   PURPOSE :  Request the setting of redial mode (automatic/manual).

*/

T_MFW cm_get_redial_mode(void)
{
    return redial_stat;
}




/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_stop_redialTim   |
+--------------------------------------------------------------------+


   PURPOSE :  Stop redialing time.

*/

void cm_stop_redialTim(void)
{
    if (!redial_count)
	timStop(redialTim1);

    if (redial_count >= 1 AND redial_count <= 3)
	timStop(redialTim24);

    if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
	timStop(redialTim5);
	redial_count = 0;
	rdl.left_attempts = 0;

	/*
		reset the counter
	*/

    call_stat	 = MFW_CALL_FREE;
    call_type	 = MFW_CALL_FREE;
    cc_stat.type = MFW_CALL_FREE;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_redial_abort     |
+--------------------------------------------------------------------+


   PURPOSE :  Stop redialing from MMI.

*/

void cm_redial_abort(void)
{

	TRACE_FUNCTION ("cm_redial_abort()");

    if (call_stat == REDIALING_CALL OR	call_stat  == OUTGOING_CALL)
	cm_stop_redialTim();

    rdl.redial_mode = CM_REDIAL_ABORTED;
    cm_signal(E_CM_REDIAL, &rdl);
}


/*
+---------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		      |
| STATE  : code 			ROUTINE: cm_autoredial_start  |
+---------------------------------------------------------------------+


   PURPOSE :  start autoredial.

*/

void cm_autoredial_start(void)
{
	timStart(redialTim1);
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_redial_timeout   |
+--------------------------------------------------------------------+


   PURPOSE :  Call back from system clock for redialing time interval.

*/

static int cm_redial_timeout(MfwEvt e, MfwTim *t)
{
  CHAR number[MFW_NUM_LEN+MAX_LEN+1];
  int max_num_size = MFW_NUM_LEN+MAX_LEN+1;

  TRACE_FUNCTION ("cm_redial_timeout()");

  memset(number, 0, sizeof(number));
  mfwStrncpy(number, (CHAR *)cc_stat.prefix, max_num_size);
  max_num_size -= strlen((char *)cc_stat.prefix);

  if ((cc_stat.ton EQ MFW_TON_INTERNATIONAL) AND (cc_stat.number[0] != '+'))
  {
    strcat(number, "+");
    max_num_size--;
  }

  strncat(number, (CHAR *)cc_stat.number, max_num_size);

  switch (redial_stat)
  {
    case CM_REDIAL_AUTO:
      if (sAT_Dn(CMD_SRC_LCL,
			     (CHAR *)number,
			      D_CLIR_OVRD_Default,
			      D_CUG_CTRL_NotPresent,
			      D_TOC_Voice) NEQ AT_EXCT)
      {
	    TRACE_ERROR("sAT_Dn error");
	return 0;
      }

      call_stat    = OUTGOING_CALL;

      cm_search_callId(CAL_STAT_Dial, &cc_stat.call_number);
      cc_stat.type = REDIALING_CALL;

      rdl.redial_mode	= CM_REDIAL_ATTEMPT;
      rdl.call_id	= cc_stat.call_number;
      mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
      rdl.name.len = cc_stat.name.len;
      memcpy(rdl.name.data,
	     cc_stat.name.data,
	     cc_stat.name.len);
#else
      mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
//	strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
      rdl.ton = cc_stat.ton;
      rdl.type = cc_stat.mode;
      redial_count++;
      rdl.left_attempts = MAX_REDIAL_ATTEMPT - redial_count;
      cm_signal(E_CM_REDIAL, &rdl);
      return 1;

    case CM_REDIAL_MANU:
      rdl.redial_mode	= CM_REDIAL_MANU;
      mfwStrncpy((char *)rdl.number, (char *)cc_stat.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
      rdl.name.len = cc_stat.name.len;
      memcpy(rdl.name.data,
	     cc_stat.name.data,
	     cc_stat.name.len);
#else
      mfwStrncpy((char *)rdl.name, (char *)cc_stat.name, MFW_TAG_LEN);
#endif
      rdl.ton = cc_stat.ton;
      rdl.type = cc_stat.mode;
      rdl.left_attempts = MAX_REDIAL_ATTEMPT - redial_count;

      cm_signal(E_CM_REDIAL, &rdl);
      return 1;

    default:
      return 0;
  }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_redial	     |
+--------------------------------------------------------------------+


   PURPOSE :  Start the manual redialing.

*/

void cm_redial()
{
  char buf[80];

  int max_buf_size = sizeof(buf);

  TRACE_FUNCTION ("cm_redial()");

  buf[0] = '\0';

  mfwStrncpy(buf, (char *)cc_stat.prefix, max_buf_size);
  max_buf_size -= strlen((char *)cc_stat.prefix);

  if ((cc_stat.ton EQ MFW_TON_INTERNATIONAL) AND (cc_stat.number[0] != '+'))
  {
      strcat(buf, "+");
      max_buf_size--;
  }

  strncat(buf, (char *)cc_stat.number, max_buf_size);

  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*/
  {
	TRACE_ERROR("sAT_Dn error");
  }

  call_stat = OUTGOING_CALL;
  cc_stat.type = REDIALING_CALL;
  redial_count++;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_redial_get_count	 |
+--------------------------------------------------------------------+


   PURPOSE :  returns the counter of call attempt

*/
UBYTE	cm_redial_get_count(void)
{
	return redial_count;
}



/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvt_call_status  |
+--------------------------------------------------------------------+


   PURPOSE :  Convert the call status.

*/

LOCAL T_MFW_CM_CALL_STAT cm_cvt_call_status( T_ACI_CAL_STAT stat )
{
  switch ( stat )
  {
    case ( CAL_STAT_Held ):    return CALL_HELD;
    case ( CAL_STAT_Active ):  return CALL_ACTIVE;
    case ( CAL_STAT_Wait ):    return CALL_WAIT;
    case ( CAL_STAT_Dial ):    return CALL_DIAL;
    case (CAL_STAT_Alerting):  return CALL_ALERT;
    case (CAL_STAT_DeactiveReq): return CALL_DEACTIVE;
    default:		       return NOT_PRESENT;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvt_call_status  |
+--------------------------------------------------------------------+


   PURPOSE :  Request the call status.

*/

T_MFW_CM_CALL_TYPE cm_cvt_call_mode( T_ACI_CAL_MODE type )
{
TRACE_EVENT_P1("cm_cnt_call_mode %d", type);
  switch ( type )
  {
    case ( CAL_MODE_Voice ):	return VOICE_CALL;
    case ( CAL_MODE_Data ):	return DATA_CALL;
    case ( CAL_MODE_Fax ):	return FAX_CALL;
    case (CAL_MODE_VFD_Voice):	return VFD_VOICE;
    case (CAL_MODE_VAD_Voice):	return VAD_VOICE;
    case (CAL_MODE_VAF_Voice):	return VAF_VOICE;
    case (CAL_MODE_VFD_Data):	return VFD_DATA;
    case (CAL_MODE_VAD_Data):	return VAD_DATA;
    case (CAL_MODE_VAF_Fax):	return VAF_FAX;
    default:			return NONE_TYPE;
  }
}

T_MFW_CM_CALL_DIR cm_cvt_call_direction( T_ACI_CAL_TYPE type )
{
TRACE_EVENT_P1("cm_cvt_call_direction %d", type);
  switch ( type )
  {
    case ( CAL_TYPE_NotPresent):	return MFW_CM_INV_DIR;
    case ( CAL_TYPE_MOC):			return MFW_CM_MOC;
    case ( CAL_TYPE_MTC):			return MFW_CM_MTC;
    default:			return MFW_CM_INV_DIR;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_status	     |
+--------------------------------------------------------------------+


   PURPOSE :  Request the call status.

*/

int cm_status(SHORT call_number, T_MFW_CM_STATUS *status, UBYTE num)
{
    UBYTE cnt;
    int   i;
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	define and allocate memory
#ifdef FF_MMI_OPTIM
	T_ACI_CAL_ENTR 	    *call_tab;//[MAX_CALL_NR];
	call_tab = (T_ACI_CAL_ENTR*)mfwAlloc(sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
	if( NULL == call_tab)
		return 0;
#endif


    cnt = 0;
    qAT_PercentCAL(CMD_SRC_LCL, call_tab);

    if (call_number > 0)
    {
      for (i=0; i<MAX_CALL_NR; i++)
      {
	if (call_tab[i].index == call_number)
	{
	  status[0].call_number = call_tab[i].index;
	  status[0].stat =  cm_cvt_call_status(call_tab[i].status);
	  status[0].type = cm_cvt_call_mode(call_tab[i].calMode);
	  status[0].mtpy = (T_MFW_MTPY_MEMBER)call_tab[i].mpty;
	  status[0].call_direction = cm_cvt_call_direction(call_tab[i].calType);

	  if (call_tab[i].number != NULL)
	  {
	    mfwStrncpy((char *)status[0].number, call_tab[i].number, MFW_NUM_LEN);
	    status[0].ton = phb_cvtTon(call_tab[i].type.ton);
	  }
	  else
	    memset(status[0].number, '\0', MFW_NUM_LEN);

#ifdef NO_ASCIIZ
	  status[0].name.len = call_tab[i].alpha.len;
	  if (call_tab[i].alpha.len)
	    memcpy(status[0].name.data,
		   call_tab[i].alpha.data,
		   call_tab[i].alpha.len);
	  else //We'll also zero the string.
	    memset(status[0].name.data, '\0', PHB_MAX_LEN);
#else
	  if (call_tab[i].alpha != NULL)
	    mfwStrncpy((char *)status[0].name, call_tab[i].alpha, MFW_TAG_LEN);
	  else
	    memset(status[0].name, '\0', MFW_TAG_LEN);
#endif
	  cnt = 1;
	  break;
	}
      }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
      return cnt;
    }

    if (!call_number)
    {
      for (i=0; i<MAX_CALL_NR; i++)
      {
	if ((call_tab[i].index EQ -1) OR cnt > num)
	    break;

	if (call_tab[i].status != CAL_STAT_NotPresent)
	{
	  status[cnt].call_number = call_tab[i].index;
	  status[cnt].stat = cm_cvt_call_status(call_tab[i].status);
	  status[cnt].type = cm_cvt_call_mode(call_tab[i].calMode);
	  status[cnt].mtpy = (T_MFW_MTPY_MEMBER)call_tab[i].mpty;
	  if (call_tab[i].number != NULL)
	  {
	    mfwStrncpy((char *)status[cnt].number, call_tab[i].number, MFW_NUM_LEN);
	    status[cnt].ton = phb_cvtTon(call_tab[i].type.ton);
	  }
	  else
	    memset(status[cnt].number, '\0', MFW_NUM_LEN);

#ifdef NO_ASCIIZ
	  status[cnt].name.len = call_tab[i].alpha.len;
	  if (call_tab[i].alpha.len != 0)
	    memcpy(status[cnt].name.data,
		   call_tab[i].alpha.data,
		   call_tab[i].alpha.len);
	  else //We'll also zero the string.
	    memset(status[cnt].name.data, '\0', PHB_MAX_LEN);
#else
	  if (call_tab[i].alpha != NULL)
	    mfwStrncpy((char *)status[cnt].name, call_tab[i].alpha, MFW_TAG_LEN);
	  else
	    memset(status[cnt].name, '\0', MFW_TAG_LEN);
#endif
	  cnt++;
	}
      }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
//	deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
      return cnt;
    }
// 	Apr 06 2005		REF: CRR 29989	xpradipg
// deallocate memory
#ifdef FF_MMI_OPTIM
	    if(call_tab)
	    mfwFree((U8*)call_tab, sizeof(T_ACI_CAL_ENTR)*MAX_CALL_NR);
#endif
    return 0;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_AT_CHLD	     |
+--------------------------------------------------------------------+


   PURPOSE :  Notify the CHLD command

*/

void cm_AT_CHLD(T_ACI_CLOG *clog_cmd)
{
    SHORT id;
    #ifdef FF_ATI
    T_ACI_CAL_MODE call_mode;
    #endif
    T_MFW_CM_STATUS status;
    char buf[80];

    TRACE_EVENT("cm_AT_CHLD()");

    /*SPR#1965 - DS - Removed setting of call_number to zero. Port of 1962
     *dis_connect.call_number = 0;
     */
    sprintf(buf, "dis_connect.call_number %d, cmd_hold %d, cId %d, srcId %d, mode %d, act %d",
            dis_connect.call_number, cmd_hold, clog_cmd->cId, clog_cmd->cmdPrm.sCHLD.srcId,
            clog_cmd->cmdPrm.sCHLD.mode, clog_cmd->cmdPrm.sCHLD.act);
    TRACE_EVENT(buf);

    if ((clog_cmd->cmdPrm.sCHLD.act != CHLD_ACT_Retrieve) &&
         (clog_cmd->cmdPrm.sCHLD.act != CHLD_ACT_RetrieveMpty))
    {
         /*SPR#1962 - DS - Set call_number to call Id returned from ACI */
        TRACE_EVENT("Set dis_connect.call_number to clog_cmd->cId");
        dis_connect.call_number = clog_cmd->cId;
    }
    else
    {
        dis_connect.call_number = -1;
    }
    if (clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_LCL)
    {
	switch(clog_cmd->cmdPrm.sCHLD.mode)
	{
	    case CHLD_MOD_RelHldOrUdub:

		if (cm_search_callId(CAL_STAT_DeactiveReq, &id) == CM_OK)
		{
		   TRACE_FUNCTION("CAL_STAT_DeactiveReq - 0SEND");
		    if ( cmd_hold EQ MFW_CM_1_SEND )
		    {
		    	TRACE_FUNCTION("cmd_hold EQ MFW_CM_1_SEND");
			cm_status(id, &status, 1);
			if (status.mtpy EQ MFW_MTPY_MEMBER)
			  dis_connect.call_number = 0;
			else
			  dis_connect.call_number = id;
		    }
		}

        // Apr 26 2006, a0393213 (Prabakar R), OMAPS00074886 : No option in MMI to release the held call.
        // cmd_hold variable is set to MFW_CM_TERMINATED to indicate that the call has been terminated
		cmd_hold = MFW_CM_TERMINATED;
		break;

	case CHLD_MOD_RelActAndAcpt:

		// MMI-SPR 13873 xkundadu
		// Handling of 1+SEND - Releases all active calls (if any exist) and
		// accepts the other (held or waiting) call.

		if( (cm_search_callId(CAL_STAT_DeactiveReq, &id) == CM_OK) OR
		(cm_search_callId(CAL_STAT_Active, &id) == CM_OK))
		{
			// If there is an active call/active call whose disconnection
			// is initiated, store the index of that call.
			dis_connect.call_number = id;
			if(bIsMultpty == TRUE)
			{
				//  Call is in multiparty
				//  1SEND for multiparty will disconnect all the active calls
				//  To clear all calls assign the dis_connect.call_number to
				//  zero
				dis_connect.call_number = 0;
				bIsMultpty = FALSE;
			}
		}
		else
		{
			// There is no active calls/active calls whose disconnection is
			// iniated existing
			dis_connect.call_number = -1;
		}
		if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
		{
			// Waiting call is existing.
			// In the function cm_result_cmd(), value of cmd.call_number
			// is used to determine whether to call cm_connect() or not
			cmd.call_number=0;
		}
		cmd_hold = MFW_CM_1_SEND;
		break;

	case CHLD_MOD_HldActAndAcpt:

		// MMI -SPR 13873 xkundadu
		// Handling of 2+SEND - Places all active calls (if any exist) on hold
		// and accepts the other (held or waiting) call.

		switch (clog_cmd->cmdPrm.sCHLD.act)
		{

		  case CHLD_ACT_Accept:
		  	   // Accept the incoming call
			    cmd_hold = MFW_CM_MT_ACCEPT;
			    break;

		  case CHLD_ACT_Hold:
		  	    // Getting the id of the call which has been put on hold by ACI
			    cmd.command = CM_HOLD;
			    if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
			    {
			     	   cmd.call_number = id;
			    }
			    else
			    {
			      	   cmd.call_number = -1;
			    }
			    break;

		  case CHLD_ACT_Swap:
		  	   // Swap the call
			    cmd.command = CM_SWAP;
			    break;

		  case CHLD_ACT_Retrieve:
		  	    // Getting the id of the call which has been made active by ACI
			    cmd.command = CM_RETRIEVE;
			    if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
			    {
			      	   cmd.call_number = id;
			    }
			    else
			    {
			          cmd.call_number = -1;
			    }
			    break;
		  case CHLD_ACT_HoldMpty:
		  	    // Put the calls on HOLD
			    cmd.command = CM_HOLD_MULTIPARTY;
			    break;

		  case CHLD_ACT_RetrieveMpty:
		  	    // Retrieve the held calls to active
			    cmd.command = CM_RETRIEVE_MULTIPARTY;
			    break;

		   case CHLD_ACT_SwapMpty:
		  	    // Swap muliparty calls
			    cmd.command = CM_SWAP_MULTIPARTY;
			    break;

		  default:
			    cmd.command = CM_COMMAND_UNKNOWN;
			    break;

		}
		break;
	   case CHLD_MOD_RelActSpec:
		dis_connect.call_number = (SHORT)atoi(clog_cmd->cmdPrm.sCHLD.call);
		break;

	    default:
		break;
	}
    }

//	Aug 23, 2004 REF: CRR 22222  xkundadu
//  Bug:  Runaway Call Waiting Tone.
//  Fix: Handle the AT-Command source id CMD_SRC_ATI_2 also for call control
//  callback functions.Include source Id CMD_SRC_ATI_2 also for checking.

//Nov 02, 2005    DR OMAPS00052132   xdeepadh
//The usage of ATI enum is put under the flag FF_ATI

//Apr 21, 2006 OMAPS00070774 a0393213 (Prabakar R)
//Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=2 in ATI.
//      expected behaviour : active call should be put to hold and the incoming call should be accepted
//      observed behaviour : happens as expected. but display shows incoming call screen only.
//                           active screen is not shown eventhough the connection is established between MS1 and MS3
//Fix : AT commands from CMD_SRC_ATI_3 was not processed. As a result, MFW was not informed of the acceptance of the call
//through ATI. In precise cmd_hold variable was not set to MFW_CM_MT_ACCEPT, which is necessary for display update

#ifdef FF_ATI
    if ((clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_ATI_1) //NM Berlin UK integration
		OR (clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_ATI_2) // Added for MMI-SPR 22222 FIX
		OR (clog_cmd->cmdPrm.sCHLD.srcId == CMD_SRC_ATI_3)) // Added for OMAPS00070774 FIX
    {
	switch(clog_cmd->cmdPrm.sCHLD.mode)
	{
	    case CHLD_MOD_RelHldOrUdub:
		if (clog_cmd->cmdPrm.sCHLD.act == CHLD_ACT_Release)
		    dis_connect.call_number = clog_cmd->cId;
		cmd_hold = MFW_CM_TERMINATED;
		break;
	    case CHLD_MOD_RelActAndAcpt:
		switch (clog_cmd->cmdPrm.sCHLD.act)
		{
		    case CHLD_ACT_Release:
			dis_connect.call_number = clog_cmd->cId;
			break;
		    case CHLD_ACT_Accept:
			if (cm_search_callId(CAL_STAT_DeactiveReq, &id) == CM_OK)
			    dis_connect.call_number = id;
			else if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
			{
			    call_mode = cm_search_callMode(id);
			    if (call_mode EQ CAL_MODE_Data
				OR call_mode EQ CAL_MODE_Fax)
				dis_connect.call_number = id;
			}
			if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
			{
			   #ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
			    cc_id = id;
			   #endif

		//Apr 22, 2006 OMAPS00070762 a0393213 (Prabakar R)
        //Bug : Make MO call from MS1 to MS2. Make MT call from MS3 to MS1. Type at+chld=1 in ATI.
        //expected behaviour : active call should be released and the incoming call should be accepted
        //observed behaviour : happens as expected. but display shows incoming call screen only.
        //           active screen is not shown eventhough the connection is established between MS1 and MS3
        //Fix : cmd.call_number was not set to 0, which is required in cm_result_cmd()
        //      to call cm_ok_connect()which updates the display. It's set.
				cmd.call_number=0;
			}

			break;
		    case CHLD_ACT_Retrieve:
			if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
			{
			    cmd.command     = CM_RETRIEVE;
			    cmd.call_number = id;
			}
			#ifdef MMI_LINT_WARNING_REMOVAL 	/*a0393213 lint warnings removal*/
			if (cm_search_callId(CAL_STAT_Wait, &id) == CM_OK)
			    cc_id = id;
			#else
			cm_search_callId(CAL_STAT_Wait, &id);
			#endif
			break;
		}
		cmd_hold = MFW_CM_1_SEND;
		break;
	    case CHLD_MOD_RelActSpec:
		dis_connect.call_number = clog_cmd->cId;
		if (dis_connect.call_number)
	       cmd_hold = MFW_CM_TERMINATED;
	    else
	       cmd_hold = MFW_CM_MPTY_TERMINATED;
		break;
	    case   CHLD_MOD_HldActAndAcpt:
		switch (clog_cmd->cmdPrm.sCHLD.act)
		{
		  case CHLD_ACT_Accept:
		    cmd_hold = MFW_CM_MT_ACCEPT;
		    break;
		  case CHLD_ACT_Hold:
		    cmd.command = CM_HOLD;
		    if (cm_search_callId(CAL_STAT_Held, &id) == CM_OK)
		      cmd.call_number = id;
		    else
		      cmd.call_number = -1;
		    break;
		  case CHLD_ACT_Swap:
		    cmd.command = CM_SWAP;
		    break;
		  case CHLD_ACT_Retrieve:
		    cmd.command = CM_RETRIEVE;
		    if (cm_search_callId(CAL_STAT_Active, &id) == CM_OK)
		      cmd.call_number = id;
		    else
		      cmd.call_number = -1;
		    break;
		  case CHLD_ACT_SwapMpty:
		    cmd.command = CM_SWAP_MULTIPARTY;
		    break;
		  case CHLD_ACT_HoldMpty:
		    cmd.command = CM_HOLD_MULTIPARTY;
		    break;
		  case CHLD_ACT_RetrieveMpty:
		    cmd.command = CM_RETRIEVE_MULTIPARTY;
		    break;
		  default:
		    cmd.command = CM_COMMAND_UNKNOWN;
		    break;
		}
		break;
	    case CHLD_MOD_HldActExc:
		 if (clog_cmd->cmdPrm.sCHLD.act == CHLD_ACT_SplitMpty)
		  cmd.command = CM_SPLIT_MULTIPARTY;
		else
		  cmd.command = CM_COMMAND_UNKNOWN;
		break;
	    case CHLD_MOD_AddHld:
		if (clog_cmd->cmdPrm.sCHLD.act == CHLD_ACT_BuildMpty)
		  cmd.command = CM_RETRIEVE_MULTIPARTY;
		else
		  cmd.command = CM_COMMAND_UNKNOWN;
		break;
	    case CHLD_MOD_Ect:
		cmd.command = CM_ETC;
		break;
	    case CHLD_MOD_Ccbs:
	        TRACE_EVENT("CHLD_MOD_Ccbs");
		cmd.command = CM_CCBS;
		break;
	    case CHLD_MOD_HldActDial:
		cmd_hold = MFW_CM_HOLD_AND_DIAL;
		cmd.command = CM_HOLD;
		break;
	    default:
		break;
	}
   }
#endif		//FF_ATI
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_AT_D	     |
+--------------------------------------------------------------------+


   PURPOSE :  Notify the outgoing call command.

*/

void cm_AT_D(T_ACI_CLOG *cmd)
{
    SHORT	       index;
    T_MFW_CM_CALL_STAT stat;
    UBYTE	       ton;
    UBYTE	       mode;
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix : Allocate the memory for entry and findText from heap instead of stack.
#ifdef FF_MMI_PB_OPTIM
    T_MFW_PHB_ENTRY    * entry =  (T_MFW_PHB_ENTRY*)mfwAlloc(sizeof(T_MFW_PHB_ENTRY));
    T_MFW_PHB_TEXT     * findText =  (T_MFW_PHB_TEXT*)mfwAlloc(sizeof(T_MFW_PHB_TEXT));
#else
    T_MFW_PHB_ENTRY    entry;
    T_MFW_PHB_TEXT     findText;
#endif

    TRACE_FUNCTION("cm_at_d()");

// Sep 01, 2006 REF:OMAPS00090555  x0039928
#ifdef FF_MMI_PB_OPTIM
	#ifdef NO_ASCIIZ
  	  entry->name.len = 0;
	#else
	    memset (entry->name, '\0', MAX_LEN);
	#endif
	    memset (entry->number, '\0', MAX_LEN);
	    entry->index = 0;
	    entry->npi = 0;
	    entry->ton = 0;
	    entries.entry = entry;
#else
	#ifdef NO_ASCIIZ
 	   entry.name.len = 0;
	#else
	    memset (entry.name, '\0', MAX_LEN);
	#endif
	    memset (entry.number, '\0', MAX_LEN);
 	    entry.index = 0;
	    entry.npi = 0;
	    entry.ton = 0;
	    entries.entry = &entry;
#endif

    if (cmd->cmdPrm.sD.srcId == CMD_SRC_LCL)
    {
	out_call.call_id = cmd->cId;
	mfwStrncpy((char *)out_call.number, cmd->cmdPrm.sD.number, MFW_NUM_LEN);
	if (cc_stat.type == OUTGOING_CALL)
	{
	    mfwStrncpy((char *)cc_stat.number, cmd->cmdPrm.sD.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
	    cc_stat.name.len = 0;
	    out_call.name.len = 0;
#else
	    cc_stat.name[0] = '\0';
	    out_call.name[0] = '\0';
#endif
	    if (cm_search_callStat(cmd->cId, &stat, &ton, &mode) == CM_OK)
	    {
		out_call.type = mode;
// Oct 10, 2006  DR: OMAPS00093720   x0039928
// Fix: Set the cc_stat.ton info from out_call.ton
		cc_stat.ton  = out_call.ton;
		cc_stat.mode = (T_MFW_CM_CALL_TYPE)mode;
	    }

// Sep 01, 2006 REF:OMAPS00090555  x0039928
#ifdef NO_ASCIIZ
	#ifdef FF_MMI_PB_OPTIM
	    mfwStrncpy((char *)findText->data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
	    findText->len = strlen(cmd->cmdPrm.sD.number);
	#else
	    mfwStrncpy((char *)findText.data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
	    findText.len = strlen(cmd->cmdPrm.sD.number);
	#endif
	    if (phb_find_entries (PHB_ADN,
				  &index,
				  MFW_PHB_NUMBER,
				  1,
			  #ifdef FF_MMI_PB_OPTIM
				  findText,
			  #else
			         &findText,
			  #endif
				  &entries) EQ MFW_PHB_OK)
	    {
		if (entries.num_entries)
		{
		    cc_stat.name.len = entries.entry[0].name.len;
		    memcpy(cc_stat.name.data,
			   entries.entry[0].name.data,
			   entries.entry[0].name.len);

		    out_call.name.len = entries.entry[0].name.len;
		    memcpy(out_call.name.data,
			   entries.entry[0].name.data,
			   entries.entry[0].name.len);
		}
	    }
#else
	    if (phb_find_entries (PHB_ADN,
				  &index,
				  MFW_PHB_NUMBER,
				  1,
				  cmd->cmdPrm.sD.number,
				  (T_MFW_PHB_LIST *)&entries) EQ MFW_PHB_OK)
	    {
		if (entries.num_entries)
		{
		    mfwStrncpy((char *)cc_stat.name, (char *)entries.entry[0].name, MFW_TAG_LEN);
		    mfwStrncpy((char *)out_call.name, (char *)entries.entry[0].name, PHB_MAX_LEN);
		}
	    }
#endif
	}

	if (cc_stat.type == REDIALING_CALL)
	{
#ifdef NO_ASCIIZ
	    out_call.name.len = cc_stat.name.len;
	    memcpy(out_call.name.data,
		   cc_stat.name.data,
		   cc_stat.name.len);
#else
	    mfwStrncpy((char *)out_call.name, (char *)cc_stat.name, MFW_TAG_LEN);
#endif
	    out_call.type = cc_stat.mode;
	}
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the dynamic memory allocated if flag FF_MMI_PB_OPTIM is defined
	#ifdef FF_MMI_PB_OPTIM
      		mfwFree((U8*) entry, sizeof(T_MFW_PHB_ENTRY));
     		mfwFree((U8*) findText, sizeof(T_MFW_PHB_TEXT));
	#endif
	cm_signal(E_CM_MO_RES, &out_call);
    }
    else if (cmd->cmdPrm.sD.srcId < CMD_SRC_MAX)
    {
    	//x0pleela 03 Nov, 2006 DR: OMAPS00101158
    	//set the value of uOthersrc to TRUE as the source id is not LOCAL
    	mfw_set_OtherSrc_Value(TRUE);
	out_call.call_id = cmd->cId;
	mfwStrncpy((char *)out_call.number, (char *)cmd->cmdPrm.sD.number, MFW_NUM_LEN);
#ifdef NO_ASCIIZ
	out_call.name.len = 0;
#else
	out_call.name[0] = '\0';
#endif
	if (cm_search_callStat(cmd->cId, &stat, &ton, &mode) == CM_OK)
	{
	    out_call.type = mode;
	}
    	//x0pleela 03 Nov, 2006 DR: OMAPS00101158
    	//check the value of uOthersrc
    	//If the value is not set then do the phone book search operation
    	//Else do not perform  phone book search operation
    	//this is to avoid stack overflow probelm when the source id is not LOCAL
	if(!mfw_get_OtherSrc_Value())//x0pleela 3 nov 2006
	{
// Sep 01, 2006 REF:OMAPS00090555  x0039928
#ifdef NO_ASCIIZ
	#ifdef FF_MMI_PB_OPTIM
	mfwStrncpy((char *)findText->data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
	findText->len = strlen(cmd->cmdPrm.sD.number);
	#else
	mfwStrncpy((char *)findText.data, cmd->cmdPrm.sD.number, PHB_MAX_LEN);
	findText.len = strlen(cmd->cmdPrm.sD.number);
	#endif
	if (phb_find_entries (PHB_ADN,
			      &index,
			      MFW_PHB_NUMBER,
			      1,
			#ifdef FF_MMI_PB_OPTIM
			      findText,
			#else
			      &findText,
			#endif
			      &entries) EQ MFW_PHB_OK)
	{
	    if (entries.num_entries)
	    {
		out_call.name.len = entries.entry[0].name.len;
		memcpy(out_call.name.data,
		       entries.entry[0].name.data,
		       entries.entry[0].name.len);
	    }
	}
#else
	if (phb_find_entries (PHB_ADN,
			      &index,
			      MFW_PHB_NUMBER,
			      1,
			      cmd->cmdPrm.sD.number,
			      (T_MFW_PHB_LIST *)&entries) EQ MFW_PHB_OK)
	{
	    if (entries.num_entries)
	    {
		mfwStrncpy((char *)out_call.name, (char *)entries.entry[0].name, MFW_TAG_LEN);
	    }
	}
#endif
	} //3
// Sep 01, 2006 REF:OMAPS00090555  x0039928
// Fix: Free the dynamic memory allocated if flag FF_MMI_PB_OPTIM is defined
	#ifdef FF_MMI_PB_OPTIM
      		mfwFree((U8*) entry, sizeof(T_MFW_PHB_ENTRY));
     		mfwFree((U8*) findText, sizeof(T_MFW_PHB_TEXT));
	#endif
	cm_signal(E_CM_MO_RES, &out_call);
    }
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvtCPItype	     |
+--------------------------------------------------------------------+


   PURPOSE :  Convert the type of

*/

T_MFW_CPI_TYPE cm_cvtCPItype(T_ACI_CPI_MSG msg)
{
    switch (msg)
	{
		case CPI_MSG_Setup: return CPI_TYPE_SETUP;
		case CPI_MSG_Disc:  return CPI_TYPE_DISC;
	case CPI_MSG_Alert: return CPI_TYPE_ALERT;
		case CPI_MSG_Proc:  return CPI_TYPE_PROC;
	case CPI_MSG_Sync:  return CPI_TYPE_SYNC;
	 case CPI_MSG_Conn: return CPI_TYPE_CONN;
	 /* CQ11676 Added new messages types in CPi indication. 17-02-04 MZ */
    #ifndef FF_2TO1_PS
		case CPI_MSG_Rls:  return CPI_TYPE_RELEASE;
	case CPI_MSG_Rjct:  return CPI_TYPE_REJECT;
    #endif
		default:		    return CPI_TYPE_UNKNOWN;
	}
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvtIBT	     |
+--------------------------------------------------------------------+


   PURPOSE :  Convert in-band tones indication

*/

T_MFW_CPI_IBT cm_cvtIBT(T_ACI_CPI_IBT ibt)
{
    switch (ibt)
	{
		case CPI_IBT_False: return CPI_IBT_FALSE;
		case CPI_IBT_True:  return CPI_IBT_TRUE;
		default:		    return CPI_IBT_UNKNOWN;
	}
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_cvtTCH	     |
+--------------------------------------------------------------------+


   PURPOSE :  Convert traffic channel indication

*/

T_MFW_CPI_TCH cm_cvtTCH(T_ACI_CPI_TCH tch)
{
    switch (tch)
	{
		case CPI_TCH_False: return CPI_TCH_FALSE;
		case CPI_TCH_True:  return CPI_TCH_TRUE;
		default:		    return CPI_TCH_UNKNOWN;
	}
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: rAT_PercentCPI      |
+--------------------------------------------------------------------+


   PURPOSE :  Call Progress Information

*/
// ADDED BY RAVI - FOR ACI CHANGES - 5-10-2005
#if (defined(FF_2TO1_PS)  &&  BOARD != 61)
void rAT_PercentCPI(SHORT cId,
		    T_ACI_CPI_MSG msgType,
		    T_ACI_CPI_IBT ibt,
		    T_ACI_CPI_TCH tch)

{
    cm_cpi.call_number = cId;
    cm_cpi.type        = cm_cvtCPItype(msgType);
    cm_cpi.inband      = cm_cvtIBT(ibt);
    cm_cpi.tch	       = cm_cvtTCH(tch);
//    cm_cpi.cause = CPI_CAUSE_MASK & cause; /* cq11676 Add cause information to the CPI indication 17-02-04 MZ */
    cm_signal(E_CM_CPI, &cm_cpi);
}
#else
void rAT_PercentCPI(SHORT cId,
		    T_ACI_CPI_MSG msgType,
		    T_ACI_CPI_IBT ibt,
		    T_ACI_CPI_TCH tch,
        	    USHORT        cause )        /*cq11676 Add cause parameter for cpi indication 17-02-04 MZ */
{
    cm_cpi.call_number = cId;
    cm_cpi.type        = cm_cvtCPItype(msgType);
    cm_cpi.inband      = cm_cvtIBT(ibt);
    cm_cpi.tch	       = cm_cvtTCH(tch);
    cm_cpi.cause = CPI_CAUSE_MASK & cause; /* cq11676 Add cause information to the CPI indication 17-02-04 MZ */
    cm_signal(E_CM_CPI, &cm_cpi);
}
#endif
// END OF ADDITION - RAVI - 5-10-2005.

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_error_code	     |
+--------------------------------------------------------------------+


   PURPOSE :

*/

UBYTE cm_error_code(T_ACI_AT_CMD cmd)
{
    ULONG err;

    err = qAT_ErrDesc();
    switch (ACI_ERR_DESC_CLASS( err ))
    {
	case ACI_ERR_CLASS_Cme:
	    break;
	case ACI_ERR_CLASS_Cms:
	    break;
	case ACI_ERR_CLASS_Ceer:
	    switch (ACI_ERR_DESC_NR( err ))
	    {
		case CEER_ACM_Max:	return CM_ACM_MAX;
		default:		return CM_ERROR;
	    }
//	    break;  // RAVI
	case ACI_ERR_CLASS_Ext:
	    switch (ACI_ERR_DESC_NR( err ))
	    {
		case EXT_ERR_FdnCheck:	return CM_CFDN_ERR;
		case EXT_ERR_BdnCheck:	return CM_CBDN_ERR;
		case EXT_ERR_OneCallOnHold:	return CM_2CALLS_ALREADY_ERR;
		//xvilliva 21421 - Handling err code returned by ACI.
#ifndef FF_2TO1_PS
	    case EXT_ERR_AlsLock:	return CM_ALS_ERR;
#endif
		default:		return CM_ERROR;
	    }
	  //  break;  // RAVI
	default:
	    break;
    }
    return CM_ERROR;
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_bc_parameter   |
+--------------------------------------------------------------------+


   PURPOSE : Notice bearer service parameter

*/
/*a0393213 warnings removal - parameter changed as a result of ACI enum change*/
void cm_bc_parameter(T_ACI_CRING_SERV_TYP type)
{
  TRACE_FUNCTION("cm_cvt_cringType()");

  switch (type)
  {
    case CRING_SERV_TYP_Voice:
      break;
    case CRING_SERV_TYP_Fax:
      in_call.bc1.conn_elem   = Transparent;
      break;
    case CRING_SERV_TYP_Sync:
      in_call.bc1.bearer_serv = Synch;
      in_call.bc1.conn_elem   = Transparent;
      break;
    case CRING_SERV_TYP_Async:
      in_call.bc1.bearer_serv = Asynch;
      in_call.bc1.conn_elem   = Transparent;
      break;
    case CRING_SERV_TYP_RelSync:
      in_call.bc1.bearer_serv = Synch;
      in_call.bc1.conn_elem   = NonTransparent;
      break;
    case CRING_SERV_TYP_RelAsync:
      in_call.bc1.bearer_serv = Asynch;
      in_call.bc1.conn_elem   = NonTransparent;
      break;
    default:
      break;
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	 MODULE  : MFW_CM	     |
| STATE   : code			 ROUTINE : cm_build_callType |
+--------------------------------------------------------------------+


   PURPOSE :

*/
/*a0393213 warnings removal - parameters type changed as a result of ACI enum change*/
void cm_build_callType(T_ACI_CRING_SERV_TYP type1, T_ACI_CRING_SERV_TYP type2)
{
  if (type1 EQ CRING_SERV_TYP_Voice)
  {
    switch (type2)
    {
      case CRING_SERV_TYP_Sync:
      case CRING_SERV_TYP_Async:
      case CRING_SERV_TYP_RelSync:
      case CRING_SERV_TYP_RelAsync:
	in_call.type = VAD_VOICE;
	return;
      case CRING_SERV_TYP_Fax:
	in_call.type = VAF_VOICE;
	return;
      default:
	break;
    }
  }
  if (type2 EQ CRING_SERV_TYP_Voice)
  {
    switch (type1)
    {
      case CRING_SERV_TYP_Sync:
      case CRING_SERV_TYP_Async:
      case CRING_SERV_TYP_RelSync:
      case CRING_SERV_TYP_RelAsync:
	in_call.type = VAD_DATA;
	return;
      case CRING_SERV_TYP_Fax:
	in_call.type = VAF_FAX;
	return;
      default:
	break;
    }
  }
  in_call.type = NONE_TYPE;
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)	MODULE	: MFW_CM	     |
| STATE   : code			ROUTINE : cmCommand	     |
+--------------------------------------------------------------------+

  PURPOSE : handle mfw windows command

*/

static int cmCommand (U32 cmd, void *h)
{
    switch (cmd)
    {
	case MfwCmdDelete:		/* delete me		    */
	    if (!h)
		return 0;
	    cm_delete(h);
	    return 1;
	default:
	    break;
    }

    return 0;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_command_abort    |
+--------------------------------------------------------------------+


   PURPOSE :

*/

T_MFW cm_command_abort(UBYTE command)
{
  TRACE_FUNCTION ("cm_command()");

  switch (command)
  {
    case CM_HOLD:
    case CM_SWAP:
    case CM_RETRIEVE:
    case CM_SWAP_MULTIPARTY:
    case CM_HOLD_MULTIPARTY:
    case CM_RETRIEVE_MULTIPARTY:
    case CM_BUILD_MULTIPARTY:
    case CM_SPLIT_MULTIPARTY:
    case CM_ETC:
    case CM_CCBS:
      sAT_Abort(CMD_SRC_LCL, AT_CMD_CHLD);
      break;

    case CM_DTMF_ACTIVE:
    case CM_DTMF_INACTIVE:
    case CM_DTMF_AUTO:
      sAT_Abort(CMD_SRC_LCL, AT_CMD_VTS);
      break;

    default:
      return FALSE;
  }
  return TRUE;
}

/* Marcus: CCBS: 13/11/2002: Start */
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_delete_all                      |
+--------------------------------------------------------------------+

   PURPOSE :    Delete all registered CCBS

   Returns:		T_MFW: CM_OK if successful, CM_ERROR if not

   Arguments:   None
*/
T_MFW    cm_ccbs_delete_all(void)
{
    T_MFW           res = CM_ERROR;     // The value to be returned by this function
    T_ACI_RETURN    aci_res;            // The value returned by sAT_PercentCCBS

    TRACE_FUNCTION("cm_ccbs_delete_all()");

    if (ccbs_op == CM_CCBS_NONE)
    {
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
        /* No CCBS operation currently in progress */
#ifndef CCBS_TEST
        aci_res = sAT_PercentCCBS(CMD_SRC_LCL, 0);
#else
        aci_res = AT_EXCT;
#endif
        if (aci_res == AT_EXCT)
        {
            TRACE_EVENT("sAT_PercentCCBS returned AT_EXCT");
            ccbs_op = CM_CCBS_DELETE_ALL;
            res = CM_OK;
        }
        else
        {
            TRACE_EVENT_P1("sAT_PercentCCBS returned %d", aci_res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_delete                          |
+--------------------------------------------------------------------+

   PURPOSE :    Delete a specific registered CCBS

   Returns:		T_MFW: CM_OK if successful, CM_ERROR if not

   Arguments:   SHORT idx: the index to the specific CCBS to be deleted
*/
T_MFW    cm_ccbs_delete(SHORT idx)
{
    T_MFW           res = CM_ERROR; // The value to be returned by this function
    T_ACI_RETURN    aci_res;        // The value returned by sAT_PercentCCBS

    TRACE_FUNCTION("cm_ccbs_delete()");
    TRACE_EVENT_P1("deleting CCBS %d", idx);

    if (ccbs_op == CM_CCBS_NONE)
    {
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
        /* No CCBS operation currently in progress */
#ifndef CCBS_TEST
        aci_res = sAT_PercentCCBS(CMD_SRC_LCL, idx);
#else
        aci_res = AT_EXCT;
#endif
        if (aci_res == AT_EXCT)
        {
            TRACE_EVENT("sAT_PercentCCBS returned AT_EXCT");
            ccbs_op = CM_CCBS_DELETE;
            res = CM_OK;
        }
        else
        {
            TRACE_EVENT_P1("sAT_PercentCCBS returned %d", aci_res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_list                            |
+--------------------------------------------------------------------+

   PURPOSE :    Delete all registered CCBS

   Returns:		T_MFW: CM_OK if successful, CM_ERROR if not

   Arguments:   None
*/
T_MFW    cm_ccbs_list(void)
{
    T_MFW           res = CM_ERROR; // The value to be returned by this function
    T_ACI_RETURN    aci_res;        // The value returned by qAT_PercentCCBS

    TRACE_FUNCTION("cm_ccbs_list()");

    if (ccbs_op == CM_CCBS_NONE)
    {
        /* No CCBS operation currently in progress */
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
#ifndef CCBS_TEST
        aci_res = qAT_PercentCCBS(CMD_SRC_LCL);
#else
        aci_res = AT_EXCT;
#endif
        if (aci_res == AT_EXCT)
        {
            TRACE_EVENT("qAT_PercentCCBS returned AT_EXCT");
            ccbs_op = CM_CCBS_LIST;
            res = CM_OK;
        }
        else
        {
            TRACE_EVENT_P1("qAT_PercentCCBS returned %d", aci_res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_accept_registration             |
+--------------------------------------------------------------------+

   PURPOSE :    Accepts the CCBS registration being offered

   Returns:		T_MFW: CM_OK if successful, CM_ERROR if not

   Arguments:   None
*/
T_MFW    cm_ccbs_accept_registration(void)
{
    T_MFW           res = CM_ERROR; // The value to be returned by this function
    T_ACI_RETURN    aci_res;        // The value returned by sAT_PlusCHLD

    TRACE_FUNCTION("cm_ccbs_accept_registration()");

    if (ccbs_op == CM_CCBS_NONE)
    {
        /* No CCBS operation currently in progress */
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
        cm_set_cmd_status(CHLD_MOD_Ccbs, "");
	    cmd_hold = MFW_CM_CCBS_REGISTER;
#ifndef CCBS_TEST
	    aci_res = sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ccbs, NULL);
#else
	    aci_res = AT_EXCT;
#endif
        if (aci_res == AT_EXCT)
        {
            TRACE_EVENT("sAT_PlusCHLD returned AT_EXCT");
            ccbs_op = CM_CCBS_ACCEPT_REGISTRATION;
            res = CM_OK;
        }
        else
        {
            TRACE_EVENT_P1("sAT_PlusCHLD returned %d", aci_res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_reject_registration             |
+--------------------------------------------------------------------+

   PURPOSE :    Rejects the CCBS registration being offered

   Returns:		T_MFW: CM_OK if successful, CM_ERROR if not

   Arguments:   None
*/
T_MFW    cm_ccbs_reject_registration(void)
{
    T_MFW           res = CM_ERROR; // The value to be returned by this function
    T_ACI_RETURN    aci_res;        // The value returned by sAT_H

    TRACE_FUNCTION("cm_ccbs_reject_registration()");

    if (ccbs_op == CM_CCBS_NONE)
    {
        /* No CCBS operation currently in progress */
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
        cmd_hold = MFW_CM_CCBS_REGISTER;
#ifndef CCBS_TEST
        aci_res = sAT_H(CMD_SRC_LCL);
#else
        aci_res = AT_EXCT;
#endif
        if (aci_res == AT_EXCT)
        {
            TRACE_EVENT("sAT_H returned AT_EXCT");
            ccbs_op = CM_CCBS_REJECT_REGISTRATION;
            res = CM_OK;
        }
        else
        {
            TRACE_EVENT_P1("sAT_H returned %d", aci_res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_accept_recall                   |
+--------------------------------------------------------------------+

   PURPOSE :    Accepts the CCBS recall being offered

   Returns:		T_MFW: CM_OK if successful, CM_BLACKIST or CM_ERROR if not

   Arguments:   UBYTE *number           - the number of the phone to call
                T_MFW_CM_CALL_TYPE type - the type of the call to be made
*/
T_MFW    cm_ccbs_accept_recall(UBYTE *number, T_MFW_CM_CALL_TYPE type)
{
    T_MFW           res = CM_ERROR; // The value to be returned by this function
    /*a0393213 compiler warnings removal -- removed def of search_res*/
    T_ACI_RETURN    aci_res;    // The value returned by sAT_PlusCHLD
    SHORT           call_number;// The call identity of any held call
    UBYTE           phone[MFW_NUM_LEN];   // Working copy of phone number
  //  CHAR			*rest;      // Parameter for ss_decode  // RAVI
//    T_KSD_SEQPARAM	para;       // Parameter for ss_decode  // RAVI
//    T_MFW_SS_RETURN	ss_res;     // The value returned by ss_decode  // RAVI

    TRACE_FUNCTION("cm_ccbs_accept_recall()");

    if (ccbs_op == CM_CCBS_NONE)
    {
        /* No CCBS operation currently in progress */
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
        /* Ensure the number given is an ASCIIZ string thet is not too long */
        mfwStrncpy((char *)phone, (char *)number, MFW_NUM_LEN);
        TRACE_EVENT_P1("ccbs nr: %s", phone);

        /* Make sure that it is OK to call this number */
        if ((res = cm_check_mo_number(phone)) == CM_OK)
        {
            TRACE_EVENT("cm_check_mo_number returned CM_OK");
            /* Set up data as for mobile originated call */
            cm_set_call_mode(type);
            call_stat	   = OUTGOING_CALL;
            redial_count   = 0;
            cc_stat.type   = OUTGOING_CALL;
            currConnecting = 1;

            if ((cm_search_callId(CAL_STAT_Held, &call_number)) == CM_OK)
            {
                TRACE_EVENT("Held call: CHLD_MOD_RelActAndAcpt");
                /* There is a held call: release active call and accept callback */
                cm_set_cmd_status(CHLD_MOD_RelActAndAcpt, "");
#ifndef CCBS_TEST
                aci_res = sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActAndAcpt, NULL);
#else
                aci_res = AT_EXCT;
#endif
            }
            else
            {
                TRACE_EVENT("No held call: CHLD_MOD_HldActAndAcpt");
                /* There is no held call: hold any active call and accept callback */
                cm_set_cmd_status(CHLD_MOD_HldActAndAcpt, "");
#ifndef CCBS_TEST
                aci_res = sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, NULL);
#else
                aci_res = AT_EXCT;
#endif
            }

            cmd_hold = MFW_CM_CCBS_RECALL;

            if (aci_res == AT_EXCT)
            {
                TRACE_EVENT("sAT_PlusCHLD returned AT_EXCT");
                ccbs_op = CM_CCBS_ACCEPT_RECALL;
                res = CM_OK;
            }
            else
            {
                /* The attempt to accept the callback failed */
                TRACE_EVENT_P1("sAT_PlusCHLD returned %d", aci_res);
                call_stat = MFW_CALL_FREE;
            }
        }
        else
        {
            /* It is not OK to call this number for some reason */
            TRACE_EVENT_P1("cm_check_mo_number returned %d", res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_reject_recall                   |
+--------------------------------------------------------------------+

   PURPOSE :    Rejects the CCBS recall being offered

   Returns:		T_MFW: CM_OK if successful, CM_ERROR if not

   Arguments:   None
*/
T_MFW    cm_ccbs_reject_recall(void)
{
    T_MFW           res = CM_ERROR; // The value to be returned by this function
    T_ACI_RETURN    aci_res;        // The value returned by sAT_PlusCHLD

    TRACE_FUNCTION("cm_ccbs_reject_recall()");

    if (ccbs_op == CM_CCBS_NONE)
    {
        /* No CCBS operation currently in progress */
        TRACE_EVENT("ccbs_op == CM_CCBS_NONE");
        cm_set_cmd_status(CHLD_MOD_RelHldOrUdub, "");
        cmd_hold = MFW_CM_CCBS_RECALL;

#ifndef CCBS_TEST
        aci_res = sAT_H(CMD_SRC_LCL);
#else
        aci_res = AT_CMPL;
#endif
        if (aci_res == AT_CMPL)
        {
            TRACE_EVENT("sAT_H returned AT_CMPL");
            ccbs_op = CM_CCBS_REJECT_RECALL;
            res = CM_OK;
        }
        else
        {
            TRACE_EVENT_P1("sAT_H returned %d", aci_res);
        }
    }
    else
    {
        TRACE_EVENT_P1("ccbs_op is %d", ccbs_op);
    }

    return res;
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_ok                              |
+--------------------------------------------------------------------+

   PURPOSE :    Called by rAT_OK for "OK" result code for %CCBS command

   Returns:		Nothing

   Arguments:   None
*/
void cm_ccbs_ok(void)
{
    TRACE_FUNCTION("cm_ccbs_ok()");

    memset((void *)&ccbs_info, 0, sizeof(ccbs_info));

    ccbs_info.operation = ccbs_op;
    ccbs_op             = CM_CCBS_NONE;
    ccbs_info.type      = CM_CCBS_OK;

    TRACE_EVENT_P2("E_CM_CCBS: op = %d: type = %d",
        ccbs_info.operation, ccbs_info.type);

    cm_signal(E_CM_CCBS, &ccbs_info);
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: cm_ccbs_error                           |
+--------------------------------------------------------------------+

   PURPOSE :    Called by rAT_PlusCME for "+CME error" result code for %CCBS command

   Returns:		Nothing

   Arguments:   None
*/
void cm_ccbs_error(void)
{
    TRACE_FUNCTION("cm_ccbs_error()");

    memset((void *)&ccbs_info, 0, sizeof(ccbs_info));

    ccbs_info.operation = ccbs_op;
    ccbs_op             = CM_CCBS_NONE;
    ccbs_info.type      = CM_CCBS_ERROR;

    TRACE_EVENT_P2("E_CM_CCBS: op = %d: type = %d",
        ccbs_info.operation, ccbs_info.type);

    cm_signal(E_CM_CCBS, &ccbs_info);
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)     MODULE: MFW_CM                   |
| STATE  : code     ROUTINE: rAT_PercentCCBS                         |
+--------------------------------------------------------------------+

   PURPOSE :    Called by ACI for "%CCBS:" result code

   Returns:		Nothing

   Arguments:   T_ACI_CCBS_IND  indct   - type of %CCBS indication
                T_ACI_CCBS_STAT status  - status of %CCBS indication
                T_ACI_CCBS_SET *setting - optiona parameters of %CCBS indication
*/
void rAT_PercentCCBS( T_ACI_CCBS_IND  indct,
                        T_ACI_CCBS_STAT status,
                        T_ACI_CCBS_SET *setting )
{
    TRACE_FUNCTION("rAT_PercentCCBS()");
    TRACE_EVENT_P3("indct = %d: status = %d: setting = %p", indct, status, setting);

    memset((void *)&ccbs_info, 0, sizeof(ccbs_info));

    /* Fill in the fields of the E_CM_CCBS event structure */
    switch (indct)
    {
        case CCBS_IND_Possible:
        case CCBS_IND_Recall:
        case CCBS_IND_PossibilityTimedOut:
        case CCBS_IND_RecallTimedOut:

            /* An asynchronous %CCBS, not in response to a %CCBS command */
            TRACE_EVENT("Unsolicited event");
            ccbs_info.operation = CM_CCBS_ASYNC;
            break;

        default:
            TRACE_EVENT("Solicited event");
            ccbs_info.operation = ccbs_op;
            break;
    }

    ccbs_info.type      = CM_CCBS_INFO;
    ccbs_info.indct     = indct;
    ccbs_info.status    = status;

    TRACE_EVENT_P2("E_CM_CCBS: op = %d: type = %d",
        ccbs_info.operation, ccbs_info.type);
    TRACE_EVENT_P2(" indct = %d: status = %d",
        ccbs_info.indct, ccbs_info.status);

    if (setting == (T_ACI_CCBS_SET *) NULL)
    {
        /* No T_ACI_CCBS_SET structure given. Indicate in the idx field of ccbs_info */
        TRACE_EVENT("setting == NULL");
        ccbs_info.idx = 0;
    }
    else
    {
        /* T_ACI_CCBS_SET structure given. Fill in the remaining field of ccbs_info */
        TRACE_EVENT("setting != NULL");
        ccbs_info.idx = setting->idx;
        strncpy((char *) ccbs_info.number, (char *) setting->number, sizeof(ccbs_info.number)-1);
        ccbs_info.number[sizeof(ccbs_info.number)-1] = '\0';
        ccbs_info.ton = phb_cvtTon(setting->type.ton);
        ccbs_info.call_type = cm_callTyp_cvt(setting->class_type);
        strncpy((char *) ccbs_info.subaddr, (char *) setting->subaddr, sizeof(ccbs_info.subaddr)-1);
        ccbs_info.subaddr[sizeof(ccbs_info.subaddr)-1] = '\0';
        ccbs_info.alrtPtn = setting->alrtPtn;
        TRACE_EVENT_P3(" idx = %d: number = %s: ton = %d",
            ccbs_info.idx, ccbs_info.number, ccbs_info.ton);
        TRACE_EVENT_P3(" call_type = %d: subaddr = %s: alrtPtn = %d",
            ccbs_info.call_type, ccbs_info.subaddr, ccbs_info.alrtPtn);
    }

    cm_signal(E_CM_CCBS, &ccbs_info);
}

/* Marcus: CCBS: 13/11/2002: End */

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_error_dial	     |
+--------------------------------------------------------------------+


   PURPOSE : The call setup is not successful

*/

void cm_error_dial(T_ACI_CME_ERR err)
{
    TRACE_FUNCTION("cm_error_dial()");

    switch (err)
    {
        case CME_ERR_OpNotAllow: /* the active call can not be hold */
            /* allow a new outgoing */
            call_stat = MFW_CALL_FREE;
            call_type = MFW_CALL_FREE;
            cmd.command = CM_HOLD;
            if (cm_search_callId(CAL_STAT_Active, &cmd.call_number) NEQ CM_OK)
              cmd.call_number = -1;
            cmd.result = NotPresent;
            cm_signal(E_CM_COMMAND, &cmd);
            break;

        /*SPR#2235 - DS - If handset is powered-up without a SIM and an emergency
         *call is attempted, the UK networks will reject the call attempt. Send a signal to
         *the BMI to enable it to destroy the call and show an appropriate error message.
         *
         *The ACI calls rAT_PlusCME() - then rAT_PlusCME() calls this funct - for this SIM
         *failure but the ACI doesn't supply the callId. Without the callId, the MFW/BMI
         *cannot close down the call properly. The ACI interface will need to be changed
         *so that it supplies the callId (if there is an active call) when this failure occurs.
         */
        case CME_ERR_SimFail:
            /* allow a new outgoing */
            call_stat = MFW_CALL_FREE;
            call_type = MFW_CALL_FREE;

            /*SPR#2235 - DS - Fake the callId. Workaround needed until the ACI interface is changed */
            cm_error_connect(1);
            break;

        default:
            TRACE_EVENT_P1("Error code: %d. No signal sent.", err);
            break;
    }
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_data_connect     |
+--------------------------------------------------------------------+


   PURPOSE : Fax/Data connect

*/

void cm_data_connect(SHORT callId)
{
  SHORT call_number;

  TRACE_FUNCTION("cm_data_connect()");

  call_number = callId;
  cm_signal(E_CM_CONNECT, &call_number);
}

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_data_connect     |
+--------------------------------------------------------------------+


   PURPOSE : Fax/Data connect

*/

void cm_wap_data_connected(void)
{
 // SHORT call_number;  // RAVI

  TRACE_FUNCTION("cm_wap_data_connected()");

  cm_signal(E_CM_WAP_CALL_CONNECTED, NULL);
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_deflect_incoming_call     |
+--------------------------------------------------------------------+


   PURPOSE : try to deflect a call using AT command CTFR

*/
T_MFW cm_deflect_incoming_call(char* number)
{	T_ACI_RETURN result;
	T_ACI_TOA type;
	T_ACI_TOS subaddr_type;

	type.ton = TON_Unknown;
	type.npi = NPI_Unknown;

	subaddr_type.tos = TOS_NotPresent;
	subaddr_type.oe = OE_NotPresent;

	result = sAT_PlusCTFR(CMD_SRC_LCL, number, &type, NULL, &subaddr_type);

	if ((result == AT_BUSY) || (result == AT_FAIL))
		return FALSE;
	return TRUE;

}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_ok_CTFR     |
+--------------------------------------------------------------------+


   PURPOSE : sends call deflect OK event to MMI

*/
void cm_ok_CTFR(void)
{	BOOL status = TRUE;

	cm_signal(E_CM_CALL_DEFLECT_STATUS, &status);

}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_error_CTFR     |
+--------------------------------------------------------------------+


   PURPOSE : Sends call deflect failed event to MMI

*/
void cm_error_CTFR(void)
{
	BOOL status = FALSE;

	cm_signal(E_CM_CALL_DEFLECT_STATUS, &status);
}
#ifdef CCBS_TEST
/* Marcus: CCBS testing: 20/11/2002: Start */
static void strlower(char *string)
{
    while(*string)
    {
        *string = (char)tolower((int) *string);
        string++;
    }
}

static BOOL getCmdId(char *token, T_ACI_AT_CMD *cmdId)
{
    BOOL cmdIdOk = FALSE;
    TRACE_FUNCTION("getCmdId()");
    if (token)
    {
        strlower(token);
        TRACE_EVENT_P1("token: %s", token);
        if (strstr(token, "ccbs"))
        {
            *cmdId = AT_CMD_CCBS;
            cmdIdOk = TRUE;
        }
        else if (strstr(token, "chld"))
        {
            *cmdId = AT_CMD_CHLD;
            cmdIdOk = TRUE;
        }
        else if (strcmp("h", token) == 0)
        {
            *cmdId = AT_CMD_H;
            cmdIdOk = TRUE;
        }
        else if ((*cmdId = atoi(token)))
        {
            cmdIdOk = TRUE;
        }
    }
    else
    {
        TRACE_EVENT("No token");
    }

    return cmdIdOk;
}
#endif

#if defined MFW & defined TI_PS_FF_AT_P_CMD_MMITEST
void rAT_PercentMMITEST(char *param)
{
    char work[80];
#ifdef CCBS_TEST         /*a0393213 compiler warning removal. 'token' removed conditionally*/
    char *token;    // Current token obtained from strtok
#endif
    TRACE_FUNCTION("rAT_PercentMMITEST()");

    strncpy(work, param, sizeof(work)-1);
    work[sizeof(work)-1] = '\0';

#ifdef CCBS_TEST
    if ((token = strtok(work, ",()")) != NULL)
#else
    if (strtok(work, ",()") != NULL)
#endif
    {
#ifdef CCBS_TEST
        T_ACI_AT_CMD cmdId;
        strlower(token);
        TRACE_EVENT_P1("token: %s", token);

        if (strcmp("ok", token) == 0)
        {
            TRACE_EVENT("OK");
            if ((token = strtok(NULL, ",()")) != NULL)
            {
                if (getCmdId(token, &cmdId) == TRUE)
                {
                    TRACE_EVENT_P1("rAT_OK(cmdId = %d", cmdId);
                    rAT_OK(cmdId);
                }
                else
                {
                    TRACE_EVENT("Unknown cmdId");
                }
            }
            else
            {
                TRACE_EVENT("No cmdId token");
            }
        }
        else if (strcmp("error", token) == 0)
        {
            TRACE_EVENT("ERROR");
            if ((token = strtok(NULL, ",()")) != NULL)
            {
                if (getCmdId(token, &cmdId) == TRUE)
                {
                    T_ACI_CME_ERR err;
                    if ((token = strtok(NULL, ",()")) != NULL)
                    {
                        err = atoi(token);
                        rAT_PlusCME(cmdId, err);
                    }
                    else
                    {
                        TRACE_EVENT("No err token");
                    }
                }
            }
            else
            {
                TRACE_EVENT("No cmdId token");
            }
        }
        else if (strcmp("info", token) == 0)
        {
            T_ACI_CCBS_IND  indct = CCBS_IND_NotPresent;
            T_ACI_CCBS_STAT status = CCBS_STAT_NotPresent;
            T_ACI_CCBS_SET  setting, *pSetting = NULL;
            TRACE_EVENT("INFO");
            if ((token = strtok(NULL, ",()")) != NULL)
            {
                strlower(token);
                TRACE_EVENT_P1("token: %s", token);
                if (strstr(token, "notpresent"))
                    indct = CCBS_IND_NotPresent;
                else if (strstr(token, "possibility"))
                    indct = CCBS_IND_PossibilityTimedOut;
                else if (strstr(token, "possible"))
                    indct = CCBS_IND_Possible;
                else if (strstr(token, "registered"))
                    indct = CCBS_IND_Registered;
                else if (strstr(token, "recallt"))
                    indct = CCBS_IND_RecallTimedOut;
                else if (strstr(token, "recall"))
                    indct = CCBS_IND_Recall;
                else if (strstr(token, "irgt"))
                    indct = CCBS_IND_IrgtResult;
            }

            if ((token = strtok(NULL, ",()")) != NULL)
            {
                strlower(token);
                TRACE_EVENT_P1("token: %s", token);
                if (strstr(token, "notpresent"))
                    status = CCBS_STAT_NotPresent;
                else if (strstr(token, "notprov"))
                    status = CCBS_STAT_NotProvisioned;
                else if (strstr(token, "prov"))
                    status = CCBS_STAT_Provisioned;
                else if (strstr(token, "active"))
                    status = CCBS_STAT_Active;
            }

            setting.idx = 0;
            if ((token = strtok(NULL, ",()")) != NULL)
            {
                TRACE_EVENT_P1("token: %s", token);
                setting.idx = atoi(token);
            }

            if (setting.idx != 0)
            {
                pSetting = &setting;
                strcpy(setting.number, "01317180538");
                setting.type.ton = TON_National;
                setting.type.npi = NPI_IsdnTelephony;
                setting.subaddr[0] = '\0';
                setting.satype.tos = TOS_NotPresent;
                setting.satype.oe = OE_NotPresent;
                setting.class_type = CLASS_Vce;
                setting.alrtPtn = ALPT_Level_0;

                if ((token = strtok(NULL, ",()")) != NULL)
                {
                    TRACE_EVENT_P1("token: %s", token);
                    strncpy(setting.number, token, sizeof(setting.number)-1);
                    setting.number[sizeof(setting.number)-1] = '\0';
                }

                if ((token = strtok(NULL, ",()")) != NULL)
                {
                    TRACE_EVENT_P1("token: %s", token);
                    setting.type.ton = TON_International;
                }
            }

            TRACE_EVENT_P3("rAT_PercentCCBS(%d, %d, %p)", indct, status, pSetting);
            if (pSetting != NULL)
            {
                TRACE_EVENT_P3("idx = %d: number = %s: ton = %d",
                    setting.idx, setting.number, setting.type.ton);
            }
            rAT_PercentCCBS(indct, status, pSetting);
        }
        else
        {
            TRACE_EVENT("Unrecognised token");
        }
#endif
    }
    else
    {
        TRACE_EVENT("No token");
    }
}
/* Marcus: CCBS testing: 20/11/2002: End */
#endif /* defined MFW & defined TI_PS_FF_AT_P_CMD_MMITEST */

/* SPR#1985 - SH - Added this function */

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_tty_enable    |
+--------------------------------------------------------------------+


   PURPOSE : Receipt of unsolicited TTY information

*/

void rAT_PercentCTYI(T_ACI_CTTY_NEG neg, T_ACI_CTTY_TRX trx)
{
	T_MFW_CM_CTYI res;

	TRACE_FUNCTION("rAT_PercentCTYI()");
#ifdef MMI_LINT_WARNING_REMOVAL  /*a0393213 lint warnings removal*/
	currCmd = AT_CMD_NONE;
#endif
	switch(neg)
	{
		case CTTY_NEG_None:
			res.neg =  CTYI_NONE;
			break;
		case CTTY_NEG_Request:
			res.neg = CTYI_REQUEST;
			break;
		case CTTY_NEG_Reject:
			res.neg = CTYI_REJECT;
			break;
		case CTTY_NEG_Grant:
			res.neg = CTYI_GRANT;
			break;
	}

	cm_signal(E_CM_CTYI, &res);

	return;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_tty_enable    |
+--------------------------------------------------------------------+


   PURPOSE : Request ACI to switch TTY on or off

*/

void cm_tty_enable(UBYTE enable)
{
	/*a0393213 compiler warnings removal -- removed ret*/

/* Mar 27, 2006    REF:ER OMAPS00071798 */
    #ifdef NEPTUNE_BOARD
        U8 audioMode = AUDIO_MODE_TEXT;
    #endif

	TRACE_FUNCTION("cm_tty_enable()");

	/* SPR#1985 - SH - Now use proper ACI functions.  */

  /* sAT_PercentCTTY() is changed bec the audio mode info is needed in lower layer,
     for now just use default value when calling the function, if we want to have
     the same functionality in BMI/MFW as in ATI, BMI/MFW needs to be updated */
#ifdef NEPTUNE_BOARD
    if (flash_read() >= EFFS_OK)
    {
        audioMode = FFS_flashData.tty_audio_mode;
    }

#endif

/* Mar 27, 2006    REF:ER OMAPS00071798 */
#ifdef NEPTUNE_BOARD
#ifdef CTTY_AUDIO_MODE
	if (enable)
		sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_On, audioMode);
	else
		sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_Off, audioMode);
#else
	if (enable)
		sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_On );
	else
		sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_Off );
#endif

#else
	if (enable)
		sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_On );
	else
		sAT_PercentCTTY(CMD_SRC_LCL, CTTY_MOD_Enable, CTTY_REQ_Off );
#endif


	/* SPR#1985 - SH - Check that TTY status has changed and inform MMI  */

	cm_tty_query();

	return;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) 	MODULE: MFW_CM		     |
| STATE  : code 			ROUTINE: cm_tty_query    |
+--------------------------------------------------------------------+


   PURPOSE : Query status of TTY, inform MMI. */
   /*SPR#1985 - SH - Added this function  */

void cm_tty_query(void)
{
	T_MFW_CM_CTYI res;
//	T_ACI_RETURN ret;  // RAVI
	T_ACI_CTTY_MOD mode;
	T_ACI_CTTY_REQ req;
	T_ACI_CTTY_STAT stat;
	T_ACI_CTTY_TRX trx;

/* Mar 27, 2006    REF:ER OMAPS00071798 */
#ifdef NEPTUNE_BOARD
      U8 audio_mode;
#endif

	TRACE_FUNCTION("cm_tty_query()");

/* Mar 27, 2006    REF:ER OMAPS00071798 */
#ifdef NEPTUNE_BOARD
#ifdef CTTY_AUDIO_MODE
        qAT_PercentCTTY(CMD_SRC_LCL, &mode, &req, &stat, &trx, &audio_mode);
#else
		qAT_PercentCTTY(CMD_SRC_LCL, &mode, &req, &stat, &trx);
#endif
#else
        qAT_PercentCTTY(CMD_SRC_LCL, &mode, &req, &stat, &trx);
#endif

	res.neg = CTYI_REJECT;

	if (req==CTTY_REQ_On)
	{
		if (req)
			res.neg = CTYI_GRANT;
	}

	cm_signal(E_CM_CTYI, &res);

	return;
}

// Feb 03, 2005	REF: CRR 25960   x0012850
// Description: Call Hold: While one call in Active and other in Held by swapping either of phone is not audible

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework        	MODULE: MFW_CM		                               |
| STATE  : code 			              ROUTINE: cm_setSpeechMode                       |
+--------------------------------------------------------------------+


   PURPOSE : MFW function to call psaCC_setSpeechMode() to attach user connection.

*/
void cm_setSpeechMode(void)
{
	TRACE_FUNCTION("cm_setSpeechMode()");
	psaCC_setSpeechMode();
	return;
}


//   Sep 12, 2005   REF: MMI-SMR-34085 x0021334
//   Description: RE: Add +CDIP command - MMI Additions
//   Solution: Dummy implementation of function "rAT_PlusCDIP()" is done to enable successful compilation.

/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework        	MODULE: MFW_CM		                               |
| STATE   : code                                ROUTINE : rAT_PlusCDIP                              |
+--------------------------------------------------------------------+

  PURPOSE : Stub implementation
*/

GLOBAL void rAT_PlusCDIP( CHAR   * number,
                             T_ACI_TOA       * type,
                             CHAR            * subaddr,
                             T_ACI_TOS       * satype)
{
	TRACE_FUNCTION ("rAT_PlusCDIP()");
}


/*June 15, 2006    DR:OMAPS00079492    x0043642 */
/*******************************************************************************

 $Function:     set_cmdHold

 $Description: Sets the value of the static variable cmd_hold.

 $Returns:      void

 $Arguments: command
*******************************************************************************/
void set_cmdHold(int command)
{
    TRACE_FUNCTION("set_cmdHold()");
    TRACE_EVENT_P1("Old cmd_hold= %d", cmd_hold);
    cmd_hold = command;
    TRACE_EVENT_P1("New cmd_hold= %d", cmd_hold);
}





/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework        	MODULE: MFW_CM		                               |
| STATE   : code                                ROUTINE : mfw_get_ALS_type                      |
+--------------------------------------------------------------------+

  PURPOSE : this function returns the type of call (voice call or data call etc...)
*/
//x0pleela 25 May, 2006  DR: OMAPS00070657
#ifdef FF_CPHS
T_MFW mfw_get_ALS_type()
{
	return in_call.type;
}
#endif


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework        	MODULE: MFW_CM		                               |
| STATE   : code                                ROUTINE : mfw_set_OtherSrc_Value                      |
+--------------------------------------------------------------------+

  PURPOSE : this function sets the value of uOtherSrc to either TRUE or FALSE
*/
//x0pleela 03 Nov, 2006  DR: OMAPS00101158
GLOBAL void mfw_set_OtherSrc_Value(UBYTE otherSrc)
{
	TRACE_FUNCTION("mfw_set_OtherSrc_Value");
	uOtherSrc = otherSrc;
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework        	MODULE: MFW_CM		                               |
| STATE   : code                                ROUTINE : mfw_get_OtherSrc_Value                      |
+--------------------------------------------------------------------+

  PURPOSE : this function is to get the value of uOtherSrc
*/
//x0pleela 03 Nov, 2006  DR: OMAPS00101158
GLOBAL UBYTE mfw_get_OtherSrc_Value(void)
{
	TRACE_FUNCTION("mfw_get_OtherSrc_Value");
	return uOtherSrc;
}