/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         $Workfile:: mfw_sms.c       $|
| $Author:: Vo                          $Revision::  1              $|
| CREATED: 21.12.98                     $Modtime:: 24.03.00 10:25   $|
| STATE  : code                                                      |
+--------------------------------------------------------------------+

   MODULE  : MFW_SMS
   PURPOSE : This module contains SMS management functions.

	Feb 07, 2006    DR: OMAPS00059261 x0pleela
   	Description: SMS is not forwarding STATUS reports that are read from SIM storage to ACI 
   	Solution: sms_decode_status(): removed the code added for handling pending status of a status report
			rat_plusCMGR(): updating sms_str based on tp_status of a status report
			Removed macros STAT_MIN_VALUE and STAT_MAX_VALUE added earlier
			Replaced MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed			

     	Feb 01, 2006    DR: OMAPS00059261 x0pleela
   	Description: SMS is not forwarding STATUS reports that are read from SIM storage to ACI 
   	Solution: Added two macros to check the range of status of status report
			Used enums for the hardcoded values for MFW_MSG_DELIVER(MT), MFW_MSG_SUBMIT (MO) and MFW_MSG_STATUS_REPORT (STATUS REPORT) types while reading the messages
			Added a check in "sms_decodeStatus" to support pending status of the status report
			Made changes as per review comments
   	
      	Jan 30, 2006    DR: OMAPS00059261 x0pleela
   	Description: SMS is not forwarding STATUS reports that are read from SIM storage to ACI 
   	Solution: Added code to read MT Status report
   	

   	Jan 20, 2006    REF: DRT OMAPS00053377 xdeepadh
   	Description: SMS Validity Period - using MMI - Failure, MS not able to set SMS validity
   	Solution: While setting the validity period, the validity period format also has been set in the 
   	frst octet.

	Nov 15,2005 	DR : OMAPS00057280	-	x0034700
 	Description:	Compilation Errors in Neptune build while integrating  latest MMI Changes
 	Solution:		Included the compilation FLAG "NEPTUNE_BOARD" for un wanted code for Neptune build

	Feb 22, 2006	REF: MMI-FIX-OMAPS00058684 x0035544(Sudha)
	Description: Can't send a SMS with a specific SIM card
	Solution: Check the PID(Protocol ID) value for an MO SMS and Set the PID(Protocol ID) accordingly. 
	
       Dec 15, 2005   REF: MMI-FIX-OMAPS00058684 x0035544
       Description: OMAPS00045726 / MMI-FIX-30439 Follow-Up : ifdef for FF Home Zone forgotten.
       Solution: Added Feature flag FF_HOMEZONE for the function sms_homezoneCBToggle(U8 Activate_CB)
       
        Nov 8, 2005 REF: OMAPS00050772, a0876501 (Shashi)  
  	Issue description:  CMGD merge from tcs4.0 to g23m.
  	Solution: New parameter is added to sAT_PlusCMGD function. Migrating the MFW changes.


   	Oct 18, 2005    REF: SPR 34678 xdeepadh
   	Description: MMI Screen – shows garbled characters for Cell Information 
   	Solution: The CB messages with DCS 242(class-2,default alphabet)  are discarded.

        May 27, 2005    MMI-FIX-29869 x0018858
   	Description: There is a limitation on the number of messages that can be downloaded from 
   	server even though there is space on the sim.
   	Solution: The limitation has been removed and the number of messages that can be dowloaded
   	has been modified to the masimum number that can be stored.

	Jun 14, 2005 REF: MMI-FIX-30439 x0018858
   	Description: The homezone/cityzone tags were not being displayed properly.
   	Solution: Modified to save the tags properly in caches and also made the 
	appropriate modifications to update the same properly during mobility.

   	July 7, 2005 REF: CRR MMI-SPR-32179 x0018858  
  	Issue description:  PS crashed while performing call Forwarding.
  	Solution: Since this is related to memory leaks which occur, the code has been added to 
  			free certain memory based on a a checking condition and also by cleaning the buffer.

       xrashmic 9 May, 2005 MMI-SPR-30159
       Concat PUSH msg are stored and sent to wap client once all parts are received

	x0018858 24 Mar, 2005 MMI-FIX-11321
	Issue Description :- If the inbox is full and a new message is receivd, no indication is received.
	Fix: Added support for handling indication when message box is full and
	there is a pending message.

      	March 31, 2005    REF: CRR MMI-SPR-24511   x0012852
	Bug:The phone crashes when the user selects the 'Delete All' option 
	almost the same time as there's an incoming message.
       Fix:Check added for part message before deleting all messages.

       March 2, 2005    REF: CRR 11536 x0018858
       Description: Reply path not supported while sending a reply.
       Solution: Added menu option for the reply path.


	Feb 28, 2004    REF: CRR 28809   Deepa M.D
	Bug:SRAM Optimization :Dynamic allocation of sms_mo
	Fix:The static T_MFW_SMS_MO sms_mo variable, is made a local pointer variable.
	It is dynamically allocated and deallocated.
	The Optimization changes done for golite build have been incorpaorated to color build.
	The  MMI_LITE flag used for rAT_PlusCMGR has been removed.

   	Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
  	Issue description:  BMI: using the tool nowSMS the voicemail indication via sms does not work
  	Solution: Instead of identifying voice using addr[0] and pid, we use dcs. Also, messages belonging
  	              to group "1100" are deleted when voicemail icon is displayed.

   	Dec 23, 2004 REF: CRR MMI-SPR-27741 xkundadu 
  	Issue description:  BMI: crashing when using the function : sms_index_list() located in mfw
  	Solution: Changed the msg_list variable to array of T_MFW_SMS_IDX.
 	
	Aug 18, 2004    REF: CRR 24282   Deepa M.D
	Bug:Go-lite Optimization  Dynamic allocation of sms_mo
	Fix:static T_MFW_SMS_MO sms_mo has been made a local variable.
	It is allocated/deallocated dynamically.

   	Aug 16, 2004    REF: CRR 24323   Deepa M.D
	Bug:Clenup of sprintf used for tracing
	Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX

	Aug 17, 2004    REF: CRR 24281     Deepa M.D
	Bug:Go-lite  Optimization  Remove the unsed variable  temp_conv_buffer
	Fix:Removed the unused variables from mfw_sms.c

	Aug 26, 2004    REF: CRR 23287     Deepa M.D
	Bug:Inconsistent events being passed in MFW sms module
	Fix:For E_SMS_MT_RECEIVED event,sms_id_wait is passed.

	Jul 07, 2004    REF: CRR 15846     Deepa M.D
	Bug	:	Concatenated SMT : SMS present but not displayed !!!
	Fix :	Check has been made before freeing the memory.
  
	SPR 2260:  Merged in bugfixes 1833, 1669, 872,1830, 1828, 2031, and 2007 
	fom the 1.6.3 branch into this file.
	
	Apr 12, 2004    REF: CRR 13370     Deepa M.D
	Bug : The Sender name was not displayed properly in the status report.
	Fix : The sendername had garbage values when the corresponding number was not
	present in the Phonebook.So when the name was not present, only the number is displayed.
	  
			

*/

#define ENTITY_MFW

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

#if defined (NEW_FRAME)

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

#else

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

#endif

#include "cus_aci.h"
#include "message.h"
#include "prim.h"
#include "aci_cmh.h"
#include "ksd.h"
#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif

#ifndef FF_2TO1_PS
#include "p_mnsms.val"
#endif

#include "psa.h"
#include "psa_sim.h"

#include "mfw_mfw.h"
#include "mfw_nm.h"
#include "mfw_sima.h"
#include "mfw_nmi.h"
#include "mfw_phb.h"
#include "mfw_cm.h"
#include "mfw_cmi.h"
#include "mfw_sim.h"
#include "mfw_simi.h"
#include "mfw_phbi.h"
#include "mfw_sms.h"
#include "mfw_smsi.h"
#include "mfw_win.h"
#include "mfw_cphs.h"
#include "mfw_cphsi.h"
#include "aci_lst.h"
#include "conc_sms.h"


#ifdef SIM_TOOLKIT
#include "mfw_sat.h"
#endif

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

/********* current define *******************************************/
/*SPR 2260 added definitions*/
#define FIRST_READ_OF_MEMORY_USE 1
#define POST_DELETE_CHECK        2
// Feb 22, 2006 DR:OMAPS00068268 x0035544
//Added the #defines for the bits 7, 6 and 5 
#define BIT_7	0x80
#define BIT_6	0x40
#define BIT_5	0x20

//May 27, 2005    MMI-FIX-29869 x0018858 - Added the #defines
#ifdef FF_MMI_SMS_DYNAMIC
#define ALLOC_MEMORY mfwAlloc
#define FREE_MEMORY mfwFree
//May 27, 2005    MMI-FIX-29869 x0018858- Modified from staic array to dynamic memory.
T_MFW_SMS_MSG* msg_info = NULL; /* message table */

//May 27, 2005    MMI-FIX-29869 x0018858 - Added a Checking variable.
static int Counter_first = 0;
#else
static T_MFW_SMS_MSG msg_info[MAX_MESSAGES]; /* message table */
#endif


static T_MFW_SMS_MT sms_mt;
static T_MFW_SMS_CB sms_cb;
static T_MFW_SMS_ID sms_id, sms_id_wait;

static T_MFW_MEM_INFO     memory;

static SHORT              first_id;
static SHORT              flag;
static SHORT			 status_change_index;
static SHORT			 deleting_index;
static SHORT			 storage_index;
static SHORT              mt_flag;
static UBYTE              f_update;
static UBYTE              int_req;
static UBYTE              smsReady;
static UBYTE              phbReady;
static UBYTE              sentStatus;
static UBYTE              sms_update = FALSE;

static UBYTE              coll_sms_send;   /* mt sms during send process */
static UBYTE              coll_sms_read;   /* mt sms during read process */
static UBYTE              coll_sms_delete; /* mt sms during delete process */
static UBYTE              coll_sms_req;    /* mt sms during request process */

static UBYTE              data[30];

static UBYTE			initialising_flag;

UBYTE     sms_type;
UBYTE     mt_type;
UBYTE     int_init_req;
CHAR     *wr_addr;
UBYTE Delete_1_2_1_vm_icon=FALSE;
UBYTE Display_1_2_1_vm_icon =FALSE;
static UBYTE     cb_mid[10];  /* cell broadcast message identifier */
static UBYTE     fg;
EXTERN MfwHdr * current_mfw_elem;

static BOOL cmgr_awaiting_ok = FALSE; // Marcus: Issue 2260: 03/10/2002
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
static UBYTE sms_wap_sent_flag = FALSE;  /* SPR#2086 - SH - TRUE if SMS is sent */
#endif

// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
// Added this variable to identify voice mail message to be deleted
BOOL invalidVm = FALSE; 

//x0pleela 30 Jan, 2006 DR: OMAPS00059261 
//SMS buffer storage size
#define MAX_STAT_MSG_LEN 30 

extern UBYTE reply_path_bit ;
/*********************Prototypes****************************************/

//Feb 22, 2006 DR:OMAPS00068268 x0035544 
BOOL Sms_Check_PID(SHORT pid);
/*SPR2260 added prototype for new function*/
BOOL delete_sms_from_table (SHORT index);
//Dec 14, 2005 REF: MMI-FIX-OMAPS00058684 x0035544
#ifdef FF_HOMEZONE
//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
void sms_homezoneCBToggle(U8 Activate_CB);
#endif

#ifdef FF_MMI_SMS_DYNAMIC
//	May 27, 2005    MMI-FIX-29869 x0018858 - Begin
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS           |
| STATE   : code                         ROUTINE : Check_max_sms_allowed          |
+--------------------------------------------------------------------+

   PURPOSE : Check for the max number of messages that can be stored and aloocate 
   memory accordingly.

*/
void Check_max_sms_allowed(void)
{

	int i,num, my_count ;
	T_MFW_SMS_MSG* cpy_msg_info = NULL; /* message table */
	U8 *MaxTotal;

	if((memory.total > 0) &&( Counter_first == 0))
		{
			g_max_messages = memory.total;

			if( msg_info == NULL)
				{
					msg_info = (T_MFW_SMS_MSG*)ALLOC_MEMORY(g_max_messages*sizeof(T_MFW_SMS_MSG));

				}
			Counter_first ++;
		}

}
//	May 27, 2005    MMI-FIX-29869 x0018858 - End
#endif
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS           |
| STATE   : code                         ROUTINE : sms_init          |
+--------------------------------------------------------------------+

   PURPOSE : initialize for SMS management

*/


void sms_init(void)
{
  UBYTE i;

  TRACE_FUNCTION ("sms_init()");

  /* Setting the default SMS parameter */
  sms_type = MFW_NO_MESSAGE;
  mt_type = MFW_NO_MESSAGE;
  flag = 0;
  status_change_index = 0;
  deleting_index = 0;
  mt_flag = 0;
  smsReady = 0;
  phbReady = 0;
  sms_id.index = sms_id_wait.index = 0;
#if 0
  for (i=0; i<MAX_MESSAGES; i++)
  {
    msg_info[i].index = -1;
    msg_info[i].addr.number[0] = '\0';
    msg_info[i].addr.tag[0] = '\0';
    msg_info[i].addr.ton = MFW_TON_UNKNOWN;
    msg_info[i].addr.npi = MFW_NPI_UNKNOWN;
    msg_info[i].first_index = -1; /*SPR 2260*/
	msg_info[i].concat_status = MFW_SMS_NO_CONC;

  }
#endif
  /* PATCH-6363 VO 30.01.01 */
  memory.mem = SMS_STOR_Sm;
  memory.used = 0;
  memory.total = 0;
  /* PATCH-6363 end */



}

//    x0018858 24 Mar, 2005 MMI-FIX-11321
//begin- MMI-FIX-11321
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS           |
| STATE   : code                         ROUTINE : sms_set_cind_values        |
+--------------------------------------------------------------------+

   PURPOSE : Set the Indication parameters.

*/

T_MFW sms_set_cind_values( T_ACI_MM_CIND_VAL_TYPE *cind_Settings)
{
	if(0 == cind_Settings)
		return MFW_SMS_FAIL;
		
		
	if(sAT_PlusCIND(CMD_SRC_LCL,CIND_SIGNAL_INDICATOR_LVL0,CIND_SMSFULL_INDICATOR_MEMFULL)NEQ AT_CMPL)
	{
		TRACE_EVENT(" The indication couldnt not be set");
		return MFW_SMS_FAIL;
	}
	return MFW_SMS_OK;
}

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

   PURPOSE : Set the CMER parameters.

*/
T_MFW sms_set_cmer_values(T_ACI_MM_CMER_VAL_TYPE *cmer_Settings)
{
	if(0 == cmer_Settings)
		return MFW_SMS_FAIL;

	// ADDED BY RAVI - ACI CHANGES - 6-10-2005
	#if (BOARD==61)
		if(sAT_PlusCMER(CMD_SRC_LCL,CMER_MODE_2,CMER_INDICATOR_2,CMER_BFR_1, 0)NEQ AT_CMPL)	
	#else	
		if(sAT_PlusCMER(CMD_SRC_LCL,CMER_MODE_2,CMER_INDICATOR_2,CMER_BFR_1)NEQ AT_CMPL)
	#endif
	// END ADDITION RAVI - 6-10-2005
	{
		TRACE_EVENT(" The indication couldnt not be set");
		return MFW_SMS_FAIL;
	}
	return MFW_SMS_OK;
}
//end. - MMI-FIX-11321

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

   PURPOSE : initialize for SMS management

*/

void sms_exit(void)
{
  TRACE_FUNCTION ("sms_exit()");
}

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

   PURPOSE : finished initialize from the SIM card

*/

void sms_phbReady_ind(void)
{
  if (smsReady)
  {
    TRACE_FUNCTION("sms_phbReady_ind");

    f_update = MFW_SMS_NEW;
    TRACE_EVENT("all free");
    coll_sms_send = coll_sms_read = coll_sms_delete = coll_sms_req = MFW_SMS_FREE;
    sms_read_msg_info();
    smsReady = 0;
    phbReady = 0;
  }
  else
    phbReady = 1;
}

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

   PURPOSE : finished initialize from the SIM card

*/

void rAT_sms_ready(void)
{
    TRACE_FUNCTION("rAT_sms_ready()");

    if (phbReady)
    {
      f_update = MFW_SMS_NEW;
      sms_read_msg_info();
      smsReady = 0;
      phbReady = 0;
    }
    else
      smsReady = 1;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : MFW_CB             |
| STATE   : code                        ROUTINE : rAT_SignalSMS      |
+--------------------------------------------------------------------+

  PURPOSE : handles rAT_SignalSMS call back

*/

GLOBAL void rAT_SignalSMS ( UBYTE state )
{
  TRACE_FUNCTION("rAT_SignalSMS()");
  switch (state)
  {
#ifdef FF_2TO1_PS
    case MNSMS_STATE_INITIALISING: initialising_flag = TRUE; break;
    case MNSMS_STATE_READY: initialising_flag = FALSE; break;
#else
	case SMS_STATE_INITIALISING: initialising_flag = TRUE; break;
  	case SMS_STATE_READY: initialising_flag = FALSE; break;
#endif
  }
}


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

   PURPOSE : create SMS control

*/

T_MFW_HND sms_create(T_MFW_HND hWin, T_MFW_EVENT event, T_MFW_CB cbfunc)
{
  T_MFW_HDR *hdr;
  T_MFW_SMS *sms_para;
  MfwHdr *insert_status =0;
  
  TRACE_FUNCTION ("sms_create()");

  hdr      = (T_MFW_HDR *) mfwAlloc(sizeof(T_MFW_HDR));
  sms_para = (T_MFW_SMS *) mfwAlloc(sizeof(T_MFW_SMS));

  if (!hdr OR !sms_para)
  	{
    	TRACE_ERROR("ERROR: sms_create() Mem Alloc Failed.");
			
	   	if(hdr)
   			mfwFree((U8*)hdr,sizeof(MfwHdr));

   		if(sms_para)
   			mfwFree((U8*)sms_para,sizeof(T_MFW_SMS));
   		
	   	return FALSE;
    }
  /* initialisation of the handler */
  sms_para->emask   = event;
  sms_para->handler = cbfunc;

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

  /* installation of the handler */

  insert_status =  mfwInsert((T_MFW_HDR *)hWin, hdr);/*SPR 1968, inserted inadvertently deleted function call*/
  
  if(!insert_status)
  	{
  		TRACE_ERROR("ERROR: sms_create() Failed to Install Handler. ");
   		mfwFree((U8*)hdr,sizeof(MfwHdr));
   		mfwFree((U8*)sms_para,sizeof(T_MFW_SIM)); 	
		return 0;
  	}
    return insert_status;
}


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

   PURPOSE : delete SMS control

*/

T_MFW_RES sms_delete(T_MFW_HND h)
{
  TRACE_FUNCTION ("sms_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_SMS));
  mfwFree((U8 *)h,sizeof(T_MFW_HDR));

 return MFW_RES_OK;
}


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

   PURPOSE : send a event.

*/

void sms_signal(T_MFW_EVENT event, void * para)
{
	UBYTE temp = dspl_Enable(0);
  TRACE_FUNCTION ("sms_signal()");
 if (mfwSignallingMethod EQ 0)
  {
  /* focus is on a window */
  if (mfwFocus)
    /* send event to sim management handler if available */
    if (sms_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)
     sms_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 (sms_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;
      }
      sms_sign_exec (mfwRoot, event, para);
    }
	  dspl_Enable(temp);
      return;
 }


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

   PURPOSE : Send a signal if there is an SMS management handler.

*/

BOOL sms_sign_exec (T_MFW_HDR * cur_elem,
                    T_MFW_EVENT event,
                    T_MFW_SMS_PARA * para)
{
	/***************************Go-lite Optimization changes Start***********************/
	//Aug 16, 2004    REF: CRR 24323   Deepa M.D
	TRACE_EVENT_P1("sms_sign_exec(): %d", event);
	/***************************Go-lite Optimization changes end***********************/
  while (cur_elem)
  {
    /* event handler is available */
    if (cur_elem->type EQ MFW_TYP_SMS)
    {
      T_MFW_SMS * sms_data;
      /* handler is SMS management handler */
      sms_data = (T_MFW_SMS *)cur_elem->data;
      if (sms_data->emask & event)
      {
        /* event is expected by the call back function */
        sms_data->event = event;
        switch (event)
        {
          case E_SMS_MO_AVAIL:
            memcpy (&sms_data->para.index, para, sizeof (UBYTE));
            break;
          case E_SMS_CMD_AVAIL:
            memcpy (&sms_data->para.index, para, sizeof (UBYTE));
            break;
          case E_SMS_SAVE_AVAIL:
            memcpy (&sms_data->para.index, para, sizeof (UBYTE));
            break;
          case E_SMS_MT:
            memcpy (&sms_data->para.sms_mt, para, sizeof (T_MFW_SMS_MT));
            break;
          case E_SMS_MO:
            memcpy (&sms_data->para.sms_mo, para, sizeof (T_MFW_SMS_MO));
            break;
          case E_SMS_CB:
            memcpy (&sms_data->para.sms_cb, para, sizeof (T_MFW_SMS_CB));
            break;
          case E_SMS_CB_RECEIVED:
            memcpy (&sms_data->para.sms_id, para, sizeof (T_MFW_SMS_ID));
            break;
          case E_SMS_MT_RECEIVED:
            memcpy (&sms_data->para.sms_id, para, sizeof (T_MFW_SMS_ID));
            break;
          case E_SMS_STATUS:
            memcpy (&sms_data->para.sms_status, para, sizeof (T_MFW_SMS_STATUS));
            break;
          case E_SMS_MEM:
            memcpy (&sms_data->para.sms_mem, para, sizeof (T_MFW_SMS_MEM_INFO));
            break;
          case E_SMS_OK:
/*SPR 2653, no need for conditional compilation round if, removing it*/
			  // EF we only copy if non null
		  if (para != NULL)
			  memcpy (&sms_data->para.cmd_ind, para, sizeof (UBYTE));
            break;
          case E_SMS_ERR:
            memcpy (&sms_data->para.cmd_ind, para, sizeof (UBYTE));
            break;
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
            /* SPR#2086 */
            case E_SMS_WAP_MT_RECEIVED:
              memcpy (&sms_data->para.sms_mt, para, sizeof (T_MFW_SMS_MT));
              break;
            case E_SMS_WAP_MO_SENT:
              memcpy (&sms_data->para.index, para, sizeof (UBYTE));
              break;
            case E_SMS_WAP_ERR:
              memcpy (&sms_data->para.index, para, sizeof (UBYTE));
              break;
#endif
        }

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

  return FALSE;
}


/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : MFW_PHB                 |
| STATE   : code                  ROUTINE : sms_read_msg_info       |
+-------------------------------------------------------------------+

  PURPOSE : This function is used to read total information about SMS.
*/

void sms_read_msg_info()
{
    int i;

    TRACE_FUNCTION("sms_read_msg_info()");

    first_id = 1;
#ifdef FF_MMI_SMS_DYNAMIC
    for (i=0; i<g_max_messages; i++)
#else
    for (i=0; i<MAX_MESSAGES; i++)
#endif
    {
        msg_info[i].index = -1;
        msg_info[i].addr.number[0] = '\0';
        msg_info[i].addr.tag[0] = '\0';
        msg_info[i].addr.ton = MFW_TON_UNKNOWN;
        msg_info[i].addr.npi = MFW_NPI_UNKNOWN;
    }

    f_update = MFW_SMS_NEW;
    if (sAT_PlusCMGL (CMD_SRC_LCL, SMS_STAT_All,
#ifdef FF_2TO1_PS
                      0, MNSMS_READ_PREVIEW) NEQ AT_EXCT)
#else
                      0, READ_PREVIEW) NEQ AT_EXCT)
#endif
    {
        TRACE_EVENT("sAT_PlusCMGL error");
        f_update = MFW_SMS_FREE;
    }
}


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

  PURPOSE : Response of read SMS list from ACI
*/

void rAT_PlusCMGL ( T_ACI_CMGL_SM * smLst )
{
  T_SMS_TYPE received_sms_type;
  T_CONC_ASSEMBLY_RETURN concatenated_status;
  T_SM_DATA_EXT conc_data_ext;
  TRACE_FUNCTION ("rAT_PlusCMGL()");
  
  received_sms_type = SMS_getSMSType( &smLst->udh);
  TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
 TRACE_EVENT_P1("SMS message status:%d", smLst->stat);

  if (received_sms_type == CONCATE)
	  {
	  if(initialising_flag == TRUE)
	  	concatenated_status =concSMS_Collect(&conc_data_ext, smLst, FALSE);
	  else
		concatenated_status =concSMS_Collect(&conc_data_ext, smLst, TRUE);
		TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);


	  
	  }
/*SPR 2260, removed condition, update_mem parameter should be true so that each message is counted*/
	sms_store_new_msg_info(smLst->msg_ref, smLst, TRUE/*MC SPR 2260*/, concatenated_status);
	

			f_update = MFW_SMS_NEW;
{
	TRACE_EVENT_P4("CMGL Msg table: %d,%d,%d, %d", msg_info[0].index, msg_info[1].index,msg_info[2].index,msg_info[3].index);
	TRACE_EVENT_P4("CMGL Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
}
}


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

  PURPOSE : message list update is ready
*/

void sms_update_ready(void)
{
  TRACE_FUNCTION("sms_update_ready()");

    sms_signal(E_SMS_MT_RECEIVED, &sms_id);
  sms_id.index = 0;

  if (memory.used == memory.total)
    sms_signal(E_SMS_MEM_FULL, 0);
}


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

  PURPOSE : update the SMS information list
*/

void sms_update_msg_info(T_MFW_SMS_STAT stat)
{
    int i;

    TRACE_FUNCTION("sms_update_msg_info()");
#ifdef FF_MMI_SMS_DYNAMIC
    for (i=0; i<g_max_messages; i++)
#else
    for (i=0; i<MAX_MESSAGES; i++)
#endif
    {
        if (msg_info[i].index EQ status_change_index)
        	{
            	msg_info[i].stat = stat;
        	}
    }

    status_change_index = 0;
}


/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : MFW_PHB                 |
| STATE   : code                  ROUTINE : sms_mem_cvt             |
+-------------------------------------------------------------------+

  PURPOSE : This function is used to convert the type of memory
            used by MFW to the type of memory used by ACI.
*/
LOCAL T_ACI_SMS_STOR sms_mem_cvt(UBYTE mem)
{
  switch ( mem )
  {
    case ( MFW_MEM_ME ):  return SMS_STOR_Me;
    case ( MFW_MEM_SIM ): return SMS_STOR_Sm;
    default:          return SMS_STOR_NotPresent;
  }
}


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

   PURPOSE :  MMI selects, how the receiving of new messages
              from the network is indicated.

*/

void sms_set_mt_ind(T_MFW_SMS_MT_IND mt_ind)
{
  T_ACI_RETURN ret = AT_CMPL;
  TRACE_FUNCTION("sms_set_mt_ind()");

  switch (mt_ind)
  {
    case MT_IND_IDX:
      TRACE_EVENT("MT_IND_IDX");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_MT_SmsDeliverInd,
                     CNMI_BM_NotPresent,
                     CNMI_DS_SmsStatRpt );
      break;

    case MT_IND_MSG:
      TRACE_EVENT("MT_IND_MSG");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_MT_SmsDeliver,
                     CNMI_BM_NotPresent,
                     CNMI_DS_SmsStatRpt );
      break;

    case MT_IND_NO_IDX:
      TRACE_EVENT("MT_IND_NO_IDX");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_MT_NoSmsDeliverInd,
                     CNMI_BM_NotPresent,
                     CNMI_DS_SmsStatRpt );
      break;

    case MT_CB_IDX:
      TRACE_EVENT("MT_CB_IDX");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_MT_NotPresent,
                     CNMI_BM_CbmInd,
                     CNMI_DS_NotPresent );
      break;

    case MT_CB_MSG:
      TRACE_EVENT("MT_CB_MSG");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_MT_NotPresent,
                     CNMI_BM_Cbm,
                     CNMI_DS_NotPresent );
      break;

    case MT_CB_NO_IDX:
      TRACE_EVENT("MT_CB_NO_IDX");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_MT_NotPresent,
                     CNMI_BM_NoCbmInd,
                     CNMI_DS_NotPresent );
      break;

    /* Marcus: Issue 1170: 07/10/2002: Start */
    case MT_IND_SRR_ON:
      TRACE_EVENT("MT_IND_SRR_ON");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_BM_NotPresent,
                     CNMI_BM_NotPresent,
                     CNMI_DS_SmsStatRpt );
      break;

    case MT_IND_SRR_OFF:
      TRACE_EVENT("MT_IND_SRR_OFF");
      ret = sAT_PlusCNMI ( CMD_SRC_LCL,
                     CNMI_BM_NotPresent,
                     CNMI_BM_NotPresent,
                     CNMI_DS_NoSmsStatRpt );
      break;
    /* Marcus: Issue 1170: 07/10/2002: End */

    default:
      TRACE_EVENT_P1("default: mt_ind = %d", mt_ind);
      break;
  }

  if (ret != AT_CMPL)
    TRACE_EVENT_P1("sAT_PlusCNMI: %d", ret);
}




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

   PURPOSE :  Change SMS status from MFW_SMS_UNREAD to MFW_SMS_READ

GW-SPR#779-Modified code to abort if status has already been updated or if no match is found

*/

T_MFW sms_change_read_status(SHORT index)
{
    SHORT i;
    //UBYTE fg;
    T_ACI_RETURN ret;
    TRACE_FUNCTION("sms_change_read_status()");

    fg = 0;
#ifdef FF_MMI_SMS_DYNAMIC
    for (i=0; i<g_max_messages; i++)
#else
    for (i=0; i<MAX_MESSAGES; i++)
#endif
    {
        if (msg_info[i].index == index)
        {
            if ((msg_info[i].stat == MFW_SMS_UNREAD) ||
               (msg_info[i].stat == MFW_SMS_STOR_UNSENT))
            {
            	fg = 1;
            }
            else
            {
            	/* status is not unread/unsent - no need to change it*/
            	return (1);
            }
            /* Stop search as soon as the index matches */
            break;
        }
    }

/* This change is no completely right, because the SIM will be always updated,
but it makes possible that the read message doesn't come up as new every time
that the mobile is switched on.
GW - Replaced code that returns if no match is found
*/

    if (!fg)
    {
        TRACE_EVENT("sms_change_read_status No index match-ERROR");
        return 0;
    }

    sms_type = MFW_NO_MESSAGE;/* SPR 2260 Don't do anything scary in rAT_PlusCMGR callback func*/
/*CONQUEST 5991- MC- Changed third parameter in function call*/
    ret = sAT_PlusCMGR(CMD_SRC_LCL, (UBYTE)index, SMS_READ_StatusChange);

    if (ret NEQ AT_CMPL AND ret NEQ AT_EXCT)
    {
        TRACE_EVENT("sms_change_read_status ERROR");
        fg = 0;
        return 0;
    }
    /*CONQUEST 5991- MC- Added line to set current message to "read" status*/
    if ( msg_info[i].stat == MFW_SMS_STOR_UNSENT)
    	msg_info[i].stat = MFW_SMS_STOR_SENT;
    else
    	msg_info[i].stat = MFW_SMS_READ;//MC
    status_change_index = index;
    return 1;
}


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

   PURPOSE :  Send a mobile originated short massage.

   GW 09/10/01 - Modified code to always copy entire (possible) message length
*/

#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
/* NM, 27.5.04

the sms_submit function with the parameters : addr_type and sca 
has been taken out as it does not send SMS ?!

*/
#endif

#ifdef NO_ASCIIZ
T_MFW sms_submit(T_MFW_SMS_MO_TYPE type,
                 CHAR *dest_addr,
                 UBYTE *msg,
                 USHORT msg_len,
                 CHAR *sca)
#else
    #if defined (FF_WAP) && defined (FF_GPF_TCPIP)
T_MFW sms_submit(T_MFW_SMS_MO_TYPE type,
                 CHAR *dest_addr,
                 T_MFW_PHB_TON addr_type,
                 UBYTE *msg,
                 USHORT msg_len,
                 CHAR *sca,
                 T_MFW_PHB_TON sc_type)
    #else
T_MFW sms_submit(T_MFW_SMS_MO_TYPE type,
                 CHAR *dest_addr,

                 UBYTE *msg,
                 USHORT msg_len,
                 CHAR *sca)
// sbh - added length to the above definition, since '@' characters stored as NULL & will stop
// strlen from working properly.

    #endif
#endif
{

  T_SM_DATA_EXT		conc_data_ext;

  SHORT            rp;
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
  T_ACI_TOA			toa;
  T_ACI_TOA			tosca;
#endif

  TRACE_FUNCTION ("sms_submit()");
//March 2, 2005    REF: CRR 11536 x0018858
//Modified the condition for setting the reply path.
  if (reply_path_bit ==1)
  	{
    rp = 1;   /* reply path = 0 */
  	}
  else
  	{
    rp = 0;  /* reply path = default */
  	}


conc_data_ext.len = msg_len;
conc_data_ext.data = msg;

#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
//NM  toa.ton = phb_ncvtTon(addr_type);
//NM  toa.npi = NPI_IsdnTelephony;
//NM  tosca.ton = phb_ncvtTon(sc_type);
//NM  tosca.npi = NPI_IsdnTelephony;
#endif

  if (sAT_PlusCMGS(CMD_SRC_LCL, dest_addr, NULL, &conc_data_ext, sca, NULL, rp) NEQ AT_EXCT)
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
//NM  if (sAT_PlusCMGS(CMD_SRC_LCL, dest_addr, &toa, &conc_data_ext, sca, &tosca, rp) NEQ AT_EXCT)
#endif
    return MFW_SMS_FAIL;


  flag = 0;
  return MFW_SMS_OK;
}

#if defined (FF_WAP) && defined (FF_GPF_TCPIP)


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

   PURPOSE :  Send a mobile originated short message for WAP.
     - Sets a flag so that success or failure of send can be reported
       to MMI.
*/
T_MFW sms_submit_wap_sms(T_MFW_SMS_MO_TYPE type,
                 CHAR *dest_addr,
                 T_MFW_PHB_TON addr_type,
                 UBYTE *msg,
                 USHORT msg_len,
                 CHAR *sca,
                 T_MFW_PHB_TON sc_type)
{
	TRACE_FUNCTION ("sms_submit_wap_sms()");
	
	sms_wap_sent_flag = TRUE;

/* NM, 27.5.04

the sms_submit function with the parameters : addr_type and sca 
has been taken out as it does not send SMS ?!

*/
	
//NM	return sms_submit(type, dest_addr, addr_type, msg, msg_len, sca, sc_type);
}

#endif /* #if defined (FF_WAP) && defined (FF_GPF_TCPIP) */

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

   PURPOSE :  Send a stored mobile originated short massage.

*/

T_MFW sms_stored_submit(CHAR *dest_addr, UBYTE index)
{
  TRACE_FUNCTION ("sms_stored_submit()");

  if (sAT_PlusCMSS(CMD_SRC_LCL, index, dest_addr, NULL) NEQ AT_EXCT)
  {
    return MFW_SMS_FAIL;
  }
  storage_index = index;

  return MFW_SMS_OK;
}


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

   PURPOSE :  Response of Send a stored mobile originated
              short massage.

*/

void rAT_PlusCMSS (UBYTE mr, UBYTE numSeg)
{
    TRACE_FUNCTION ("rAT_PlusCMSS()");

    sms_update_msg_info(MFW_SMS_STOR_SENT);
    sms_signal(E_SMS_MO_AVAIL, &mr);

}


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

   PURPOSE :  Receive a new short message.

*/

void rAT_PlusCMT(T_ACI_CMGL_SM*  sm)
{	T_SMS_TYPE received_sms_type;
	T_CONC_ASSEMBLY_RETURN concatenated_status;
	T_SM_DATA_EXT conc_data_ext;
	int i;
  TRACE_FUNCTION ("rAT_PlusCMT()");

  TRACE_EVENT_P1("CMT, sm->data.len: %d", sm->data.len);


  received_sms_type = SMS_getSMSType( &sm->udh);

  if (received_sms_type == CONCATE)
  {
		concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
	TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);
	for(i=0;i<conc_data_ext.len;i++)
		{
			TRACE_EVENT_P2("%02x, %c", conc_data_ext.data[i],conc_data_ext.data[i]);
		}
		switch (concatenated_status)
		{
			case CONC_ERR_UNKN:
				TRACE_EVENT("Concatenated SMS error");break;
			case CONC_ERR_BUF_FULL:
				TRACE_EVENT("Concatented SMS buffer Full Error");break;
			case CONC_CONTINUED: //not last SMS
				TRACE_EVENT("Concatenated Continued!");
				break;
			case CONC_COMPLETED:
			{
				  TRACE_EVENT("COncatenation Completed!");
				  memset(&sms_mt, 0, sizeof(sms_mt));

#ifdef NO_ASCIIZ
				  memcpy(sms_mt.orig_addr.tag,
				         sm->alpha.data,
				         sm->alpha.len);
				  sms_mt.orig_addr.len = sm->alpha.len;
#else
				  phb_Alpha2Gsm(sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif
				  strcpy(sms_mt.orig_addr.number, sm->adress);
				  sms_mt.orig_addr.ton =
				      phb_cvtTon(sm->toa.ton);
				  sms_mt.orig_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);
				  if (sm->tosca.ton == TON_International)
				    sprintf(sms_mt.sc_addr, "+%s", sm->sca);
				  else
				    strcpy(sms_mt.sc_addr, sm->sca);
				  sms_mt.prot_id = (UBYTE)sm->pid;
				  sms_mt.dcs     = (UBYTE)sm->dcs & 0xFC;	/* Ignore message class */

				  sms_mt.rp      = sm->fo >> 7 & 1;

				/* SBH */
				if (sm->dcs & 0x10)		/* Bit 5 indicates that we should get message class from bits 0 & 1 */
				{
					sms_mt.ti = sm->dcs & 3;
				}
				else					/* Otherwise, set to default value */
				{
					sms_mt.ti = 1;
				}
				TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);
				/* SBH end */

				  memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
				  sms_mt.sctp.timezone = sm->scts.timezone;

				/* copy length of whole concat SMS*/
				  sms_mt.msg_len = conc_data_ext.len;
				  memset(sms_mt.sms_msg, 0, sm->data.len);
				/*copy all data from concat SMS*/
				  memcpy(sms_mt.sms_msg, (char*)conc_data_ext.data, conc_data_ext.len);
				  sms_mt.udh_len = sm->udh.len;
				  memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
		
				  /*SPR#1408 - DS - Now done at end of function
				   *sms_signal(E_SMS_MT, &sms_mt);
				   */

  			}

  		}
  	}
  else
  {

		
	  memset(&sms_mt, 0, sizeof(sms_mt));

#ifdef NO_ASCIIZ
	  memcpy(sms_mt.orig_addr.tag,
	         sm->alpha.data,
	         sm->alpha.len);
	  sms_mt.orig_addr.len = sm->alpha.len;
#else
	  phb_Alpha2Gsm(sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif
	  strcpy(sms_mt.orig_addr.number, sm->adress);
	  sms_mt.orig_addr.ton =
	      phb_cvtTon(sm->toa.ton);
	  sms_mt.orig_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);
	  if (sm->tosca.ton == TON_International)
	    sprintf(sms_mt.sc_addr, "+%s", sm->sca);
	  else
	    strcpy(sms_mt.sc_addr, sm->sca);
	  sms_mt.prot_id = (UBYTE)sm->pid;
	  sms_mt.dcs     = (UBYTE)sm->dcs & 0xFC;	/* Ignore message class */
	  sms_mt.rp      = sm->fo >> 7 & 1;
	/* PATCH JPS 04.10 END */

	/* SBH */
	if (sm->dcs & 0x10)		/* Bit 5 indicates that we should get message class from bits 0 & 1 */
	{
		sms_mt.ti = sm->dcs & 3;
	}
	else					/* Otherwise, set to default value */
	{
		sms_mt.ti = 1;
	}
	TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);
	/* SBH end */

	  memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
	  memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
	  memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
	  memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
	  memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
	  memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
	  sms_mt.sctp.timezone = sm->scts.timezone;

	  sms_mt.msg_len = sm->data.len;
	  memcpy(sms_mt.sms_msg, (char *)sm->data.data, sm->data.len);
	  sms_mt.udh_len = sm->udh.len;
	  memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
	  
	  /*SPR#1408 - DS - Now done at end of function
	    *sms_signal(E_SMS_MT, &sms_mt);
	    */
  	}
  
  /*MC SPR 1364, need to call this function to update CPHS voicemail data*/ 
 /*SPR#1408 - DS - Modified to store voicemail status in SMS structure. Port of 1669 */
  if (sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
           &sm->toa, &sm->udh) == MFW_SMS_VOICE)
  {
	sms_mt.voicemail = TRUE;
	TRACE_EVENT("MT SMS is a voicemail message");
  }
  else
  {
	sms_mt.voicemail = FALSE;
  }
  sms_signal(E_SMS_MT, &sms_mt);
  
}

#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
#define SMS_PUSH_PDU_OFFSET	1
#define PUSH_METHOD_PDU	0x06

static UBYTE *MMS_pdu=NULL;
static UBYTE id_no,seq_no;
static int pdu_len;

void redirectMMSNotification(T_ACI_CMGL_SM * sm)
{
	int header_len;
	char buf[80];
	int idx;

	TRACE_FUNCTION ("redirectMMSNotification()");

	if(MMS_pdu)
	{
		if(id_no!=sm->udh.data[8] || sm->udh.data[10]!=2)	/*had lost packet*/
		{
            TRACE_EVENT("-----MMS_pdu something------");
			mfwFree(MMS_pdu,MAX_SM_LEN<<1);
			MMS_pdu=NULL;
		}
		else
		{
			memcpy(MMS_pdu+pdu_len, sm->data.data, sm->data.len);

			TRACE_EVENT("Second SMS been recorded");
			TRACE_EVENT_P3("bgein=%x,end=%x,len=%d",MMS_pdu[pdu_len],MMS_pdu[pdu_len+sm->data.len-1],sm->data.len);

			pdu_len+=(sm->data.len);

			/*deliver PDU to WAP*/
			TRACE_EVENT("Deliver PDU to WAP");

/*			MWSmsNotification.data=MMS_pdu;
			MWSmsNotification.data_length=pdu_len;
			M_MMS_WAP_SMS_NOTIFICATION_IND(&MWSmsNotification);
*/
			//WMPush.data=MMS_pdu;
			//WMPush.data_length=pdu_len;
			//WMPush.is_sms_bearer=TRUE;
			//M_WAP_MMS_PUSH_IND(&WMPush);

//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////

			mfwFree(MMS_pdu,MAX_SM_LEN<<1);
			MMS_pdu=NULL;
			return;
		}
	}

	id_no=sm->udh.data[8];
	seq_no=sm->udh.data[10];

	if(seq_no!=1){
		return;
	    }

	/*identify pdu*/
	if(sm->data.data[SMS_PUSH_PDU_OFFSET]!=PUSH_METHOD_PDU){
		return;
	        }

	if(!(MMS_pdu=mfwAlloc(MAX_SM_LEN<<1)))
		return;

	header_len=sm->data.data[SMS_PUSH_PDU_OFFSET+1];

	pdu_len=sm->data.len-(header_len+1)-(SMS_PUSH_PDU_OFFSET+1);	
	memcpy(MMS_pdu,sm->data.data+SMS_PUSH_PDU_OFFSET+2+header_len,pdu_len);

	TRACE_EVENT("First SMS been recorded");
	TRACE_EVENT_P3("bgein=%x,end=%x,len=%d",MMS_pdu[0],MMS_pdu[pdu_len-1],pdu_len);
}


#endif /* #if defined (FF_WAP) && defined (FF_GPF_TCPIP) */
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS           |
| STATE   : code                         ROUTINE : rAT_PlusCMTI      |
+--------------------------------------------------------------------+

   PURPOSE :  Receive a new short message identifier.

*/
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
#else
void rAT_PlusCMTI(T_ACI_SMS_STOR mem, UBYTE index, T_ACI_CMGL_SM* sm)
{
/* MZ 2260 Handset displays Message Full on receiving an SMS. */
  //T_MFW_MEM_INFO memory;
#ifndef MMI_LITE
 // T_ACI_RETURN ret;   // RAVI
//  int i, j; // RAVI
#endif
  T_SMS_TYPE received_sms_type;
  T_CONC_ASSEMBLY_RETURN concatenated_status;
  T_SM_DATA_EXT conc_data_ext;

 if (initialising_flag == FALSE)
  	{
  		/* Ignore CMTI if initialising */
  		 	

	  TRACE_FUNCTION ("rAT_PlusCMTI()");
	  TRACE_EVENT_P1("f_update is = % in CMTI", f_update);

	  received_sms_type = SMS_getSMSType( &sm->udh);
	  TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
	  TRACE_EVENT_P2("msg_ref: %d, index: %d", sm->msg_ref, index);
 

	  if (received_sms_type == CONCATE)
		  {
		  if(initialising_flag == TRUE)
		  	concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
		  else
			concatenated_status =concSMS_Collect(&conc_data_ext, sm, TRUE);
			TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);

		 
		  
		  }
// July 7, 2005 REF: CRR MMI-SPR-32179 x0018858 
// Added a check to free the variable only when CONC_COMPLETED status is encountered.
       if (concatenated_status EQ CONC_COMPLETED)
       {
    	    if(conc_data_ext.data != NULL)
		{
			MFREE(conc_data_ext.data);
		}       
       } 


	    sms_store_new_msg_info(index,sm,TRUE, concatenated_status);

	  if (f_update EQ MFW_SMS_UPDATE OR
	    coll_sms_send EQ MFW_SMS_WAIT OR
	    coll_sms_read EQ MFW_SMS_WAIT OR
	    coll_sms_delete EQ MFW_SMS_WAIT OR
	    coll_sms_req EQ MFW_SMS_WAIT)
		{
			if (sms_id_wait.index <= 0)
			{
				sms_id_wait.index = index;
				sms_id_wait.mem = (mem EQ SMS_STOR_Me)? MFW_MEM_ME: MFW_MEM_SIM;
				sms_id_wait.concat_status = concatenated_status;
				sms_id_wait.received_sms_type = received_sms_type;
			}
			else
			{
				TRACE_EVENT("Indication Overrun");
			}
		  f_update = MFW_SMS_UPDATE;
		}
	  else
	  {
	  	sms_send_new_msg_ind(sm,index, mem, received_sms_type, concatenated_status);
	  }
     f_update = MFW_SMS_FREE;
     if(memory.total == memory.used)
  	{
  		TRACE_EVENT_P2("memory used is = %d, of %d", memory.used, memory.total);
  		sms_signal(E_SMS_MEM_FULL, NULL);
  	} 
  	}
 if(msg_info != NULL)	
  {
	TRACE_EVENT_P4("CMTI Msg table: %d,%d,%d, %d", msg_info[0].index, msg_info[1].index,msg_info[2].index,msg_info[3].index);
	TRACE_EVENT_P4("CMTI Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
}
/*MC SPR 1364, need to call this function to update CPHS voicemail data*/ 
  	 sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
                                       &sm->toa, &sm->udh);
 /*SPR 2260, this is already called in sms_store_new_msg_info, BUT we need it in for initialisation*/
}
#endif


#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
//TISHMMS Project
/*
use UDH data to caculate destinator port and originator port id if any
If not port id, the out put id will be 0
*/
void sms_getPortId(UBYTE* data, UBYTE length, USHORT * destinatorPort, USHORT *originatorPort)
{
    UBYTE ucOffset = 0;
    USHORT usTempOffset; 
    UBYTE i;

    *destinatorPort = 0;
    *originatorPort = 0;

    if (length == 0)
    {
        return;
    }
    
    for (i = 0 ; i < 47; i++)//140/3=47
    {
        /*3GPP protocal 23040 clause 9.2.3.24*/
        //0x05 the IE is port id, length should be 4
        if ((data[ucOffset] == 0x05) && (data[ucOffset + 1] == 4))
        {
	    *destinatorPort = data[ucOffset + 3] + data[ucOffset + 2]*0x100;
	    *originatorPort = data[ucOffset + 5] + data[ucOffset + 4]*0x100;
            //do not return here because the last is the valid one
        }
        else
        {
            usTempOffset    = ucOffset + data[ucOffset + 1] + 2;

            //port information 6 bytes
            if (((usTempOffset + 6) > MAX_SM_LEN) ||((usTempOffset + 6) > length))
            {
                break;
            }
            
            ucOffset = usTempOffset;
        }
    }
    
    return;
}


/*
Search in UDH data to see if it is a EMS SMS
*/
BOOL sms_is_ems_type(UBYTE* UdhData, UBYTE UdhLength)
{
    BOOL Ret = FALSE;
    UBYTE ucOffset = 0;
    USHORT usTempOffset; 
    
    UBYTE i;

    if (UdhLength == 0)
    {
        return Ret;
    }
    
    for (i = 0 ; i < 47; i++)
    {
        /*3GPP protocal 23040 clause 9.2.3.24*/
        if ( (UdhData[ucOffset] >= 0X0A) && (UdhData[ucOffset] <= 0X1F) )
        {
            if ( (UdhData[ucOffset] >= 0X1B) && (UdhData[ucOffset] <= 0X1F) )
            {
                //xmzhou_trace_string_value("sms_is_ems_type Reserved for future EMS features: ", UdhData[ucOffset]);
            }

            Ret = TRUE;
            break;
        }
        else
        {
            usTempOffset    = ucOffset + UdhData[ucOffset + 1] + 2;
            
            if ((usTempOffset >= MAX_SM_LEN) ||(usTempOffset >= UdhLength))
            {
                break;
            }
            
            ucOffset = usTempOffset;
        }
    }

    return Ret;
}

//TISHMMS Project
T_MNSMS_MESSAGE_IND gTpduData;
void rAT_PlusCMTPdu (T_MNSMS_MESSAGE_IND* pTpdu)
{
    //xmzhou_trace_string("rAT_PlusCMTPdu called");
    memcpy(&gTpduData, pTpdu, sizeof(T_MNSMS_MESSAGE_IND));
    return;
}



#if defined (FF_MMI_MMS) || defined (FF_MMI_EMS)
EXTERN void sms_save_to_m4(U8* pSmsPud);
#endif

BOOL sms_save_to_m4_in_Mfw( T_MNSMS_MESSAGE_IND *mnsms_message_ind ) 
{
    T_sms_sdu * sms_sdu = &mnsms_message_ind->sms_sdu;
    U8 align_pdu[SIM_PDU_LEN];
    U8* pSmsPud;
    U8 *pAligned = align_pdu;
    U8 *pData = sms_sdu->buf;
    U8 offset;
    U16 i;
    U16 ByteLength;
#if 0
 /* First align data on byte boundry */
 pData += sms_sdu->o_buf / EIGHT_BITS;
 offset = sms_sdu->o_buf % EIGHT_BITS;

 

 if (offset)
 {
  for ( i=0; i < sms_sdu->l_buf; i += EIGHT_BITS)
  {
   *pAligned = *pData++ << offset;
   *pAligned++ |= *pData >> (EIGHT_BITS - offset);
  }
  /* Point back to the start of the data */
  pAligned = align_pdu;
 }
 else
  pAligned = pData;
#endif
    pSmsPud = sms_sdu->buf;
    if ((sms_sdu->l_buf & 0x07) == 0)
    {
        ByteLength = sms_sdu->l_buf/8;
    }
    else
    {
        ByteLength = (sms_sdu->l_buf/8) + 1;
    }
    
//NM    sms_save_tpdu_ffs(pSmsPud, ByteLength);

#if defined (FF_MMI_MMS) || defined (FF_MMI_EMS)
    sms_save_to_m4(pSmsPud);
#endif
    
 return TRUE;
}



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

   PURPOSE :  Receive a new short message identifier.

*/

void rAT_PlusCMTI(T_ACI_SMS_STOR mem, UBYTE index, T_ACI_CMGL_SM* sm)
{
/* MZ 2007 Handset displays Message Full on receiving an SMS. */
  //T_MFW_MEM_INFO memory;
  T_ACI_RETURN ret;
  T_SMS_TYPE received_sms_type;
  T_CONC_ASSEMBLY_RETURN concatenated_status;
  T_SM_DATA_EXT conc_data_ext;
  int i, j;
  static int fileid=0;
 
 if (initialising_flag == FALSE)
  	{
  		/* Ignore CMTI if initialising */
  		 	

	  TRACE_FUNCTION ("rAT_PlusCMTI()");
  		
#if 0
	  /////////////////////////////////////////////////////////added by ellen
	{
		char temp[120];
		char* temp2;
		int i,i_sum=0;

		TRACE_EVENT("=== SMS Received ===");
		TRACE_EVENT_P2("fo %02X, msg_ref %02X",sm->fo, sm->msg_ref);
		sprintf(temp," %d bytes of UDH", sm->udh.len);
		TRACE_EVENT(temp);


		temp2 = (char*)temp;
		sprintf(temp2,"udh ");
		temp2+=4;

               for(i=0; i<sm->udh.len; i++)
		    {
		    	sprintf(temp2,"%02X ",sm->udh.data[i]);
		    	temp2+=3;
		    	i_sum ++;
		    	if(i_sum > 30) 	break;
		    	
		    }
		TRACE_EVENT(temp);

		sprintf(temp," %d bytes of DATA", sm->data.len);
		TRACE_EVENT(temp);


		temp2 = (char*)temp;
		sprintf(temp2,"data ");
		temp2+=5;

               for(i=0; i<sm->data.len; i++)
		    {
		    	sprintf(temp2,"%02X ",sm->data.data[i]);
		    	temp2+=3;
		    	i_sum ++;
		    	if(i_sum > 30) 	break;
		    	
		    }
		TRACE_EVENT(temp);

	}
/////////////////////////////////////////////////////////
#endif

		/* SPR#2086 - SH - Intercept a WAP SMS *///TISHMMS Project
		{
            
			USHORT destinatorPort;
			USHORT originatorPort;
            
                     sms_getPortId(sm->udh.data, sm->udh.len, &destinatorPort, &originatorPort);

			//xmzhou_trace_string_value("New Msg arrived,desti port=",destinatorPort);
			//xmzhou_trace_string_value("New Msg arrived,orig port=",originatorPort);

  			//xmzhou_trace_string_value("CMTI new msg udh length=",sm->udh.len);
  			//xmzhou_trace_n_bytes(sm->udh.data,sm->udh.len);
  		
			TRACE_EVENT_P2("+++++ In rAT_PlusCMTI ready to judge PUSH or not DestP=%d,OrgP=%d +++++",destinatorPort,originatorPort);
			if (destinatorPort==2948
				|| destinatorPort==2949
				|| destinatorPort==49999	/*OTA Provisioning*/
				|| destinatorPort==49996	/*OTA SyncML*/
				|| originatorPort==9200
				|| originatorPort==9201
				|| originatorPort==9202
				|| originatorPort==9203)

			{	
				USHORT index_i;
				
  		//xmzhou_trace_string_value("CMTI new msg data length=",sm->data.len);
              //xmzhou_trace_string("WAP SMS be identified!!!!!!!");
  		//xmzhou_trace_n_bytes(sm->data.data,sm->data.len);
#if 0				
  		fileid++;
  		
  		if(fileid==1){
  		xmzhou_trace_string_value("CMTI new msg data1 length=",sm->data.len);
  		if((sm->data.len)<2048)	ffs_fwrite("/mms/data1", sm->data.data, sm->data.len);

		rvf_delay(500);
		
  		xmzhou_trace_string_value("CMTI new msg udh1 length=",sm->udh.len);
  		if((sm->udh.len)<2048)  ffs_fwrite("/mms/udh1", sm->udh.data, sm->udh.len);

  		}

  		if(fileid==2){
  		xmzhou_trace_string_value("CMTI new msg data2 length=",sm->data.len);
  		if((sm->data.len)<2048)	ffs_fwrite("/mms/data2", sm->data.data, sm->data.len);

		rvf_delay(500);

  		xmzhou_trace_string_value("CMTI new msg udh2 length=",sm->udh.len);
  		if((sm->udh.len)<2048)  ffs_fwrite("/mms/udh2", sm->udh.data, sm->udh.len);
  		}

  		rvf_delay(1000);
#endif  		
				sms_msg_delete(index);
#if 0
//////////////////////////////////////////////////////////////////////////////////
				TRACE_EVENT("MMS Notification");
				if(sm->udh.len > 8){
					redirectMMSNotification(sm);
				}
				else {
/////////////////////////////////////////////////////////////////////////////////			
#endif
				memset(&sms_mt, 0, sizeof(sms_mt));

				for (index_i=0; index_i<12; index_i++)
				{
					TRACE_EVENT_P2("Adress: %X (%c)", sm->adress[index_i], sm->adress[index_i]);
				}
				
				memcpy(sms_mt.orig_addr.tag, sm->alpha.data, sm->alpha.len);
				sms_mt.orig_addr.len = sm->alpha.len;
				strcpy(sms_mt.orig_addr.number, sm->adress);
				sms_mt.orig_addr.ton = phb_cvtTon(sm->toa.ton);
				sms_mt.orig_addr.npi = phb_cvtNpi(sm->toa.npi);
				if (sm->tosca.ton == TON_International)
				    sprintf(sms_mt.sc_addr, "+%s", sm->sca);
				else
				    strcpy(sms_mt.sc_addr, sm->sca);
				sms_mt.prot_id = (UBYTE)sm->pid;
				sms_mt.dcs     = (UBYTE)sm->dcs & 0xFC;	/* Ignore message class */
			       sms_mt.msg_len = sm->data.len;
				memset(sms_mt.sms_msg, 0, sm->data.len);
				memcpy(sms_mt.sms_msg, (char*)sm->data.data, sm->data.len);
				sms_mt.udh_len = sm->udh.len;

                            memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);

                            //xrashmic 9 May, 2005 MMI-SPR-30159
                            memcpy(&sms_mt.sctp,&sm->scts,sizeof(T_ACI_VP_ABS));

				sms_signal(E_SMS_WAP_MT_RECEIVED, &sms_mt);

				/* Delete the message */
				
				return;
#if 0				
			}/*end of else*/
#endif			
		}
	}

       {
        //BOOL sms_is_ems_type(UBYTE* UdhData, UBYTE UdhLength)
            BOOL bIsEms = FALSE;
        
            bIsEms = sms_is_ems_type(sm->udh.data, sm->udh.len);

            if (bIsEms == TRUE)
            {
                //xmzhou_trace_string("EMS SMS received!!!!!!!!!!!!");//proc EMS message
                sms_msg_delete(index);
                sms_save_to_m4_in_Mfw( &gTpduData );
            }


       }
	
	  TRACE_EVENT_P1("f_update is = % in CMTI", f_update);
	  
	  received_sms_type = SMS_getSMSType( &sm->udh);
	  TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
	  TRACE_EVENT_P2("msg_ref: %d, index: %d", sm->msg_ref, index);
 

	  if (received_sms_type == CONCATE)
		  {
		  if(initialising_flag == TRUE)
		  	concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
		  else
			concatenated_status =concSMS_Collect(&conc_data_ext, sm, TRUE);
			TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);

		 
		  
		  }

	    sms_store_new_msg_info(index,sm,TRUE, concatenated_status);
	  
	  if (f_update EQ MFW_SMS_UPDATE OR
	    coll_sms_send EQ MFW_SMS_WAIT OR
	    coll_sms_read EQ MFW_SMS_WAIT OR
	    coll_sms_delete EQ MFW_SMS_WAIT OR
	    coll_sms_req EQ MFW_SMS_WAIT)
		{
			if (sms_id_wait.index <= 0)
			{
				sms_id_wait.index = index;
				sms_id_wait.mem = (mem EQ SMS_STOR_Me)? MFW_MEM_ME: MFW_MEM_SIM;
				sms_id_wait.concat_status = concatenated_status;
				sms_id_wait.received_sms_type = received_sms_type;
			}
			else
			{
				TRACE_EVENT("Indication Overrun");
			}
		  f_update = MFW_SMS_UPDATE;
		}
	  else
	  {
	  	sms_send_new_msg_ind(sm,index, mem, received_sms_type, concatenated_status);
	  }
     f_update = MFW_SMS_FREE;
     if(memory.total == memory.used)
  	{
  		TRACE_EVENT_P2("memory used is = %d, of %d", memory.used, memory.total);
  		sms_signal(E_SMS_MEM_FULL, NULL);
  	} 
  	}
  if(msg_info != NULL)	
  {	
	TRACE_EVENT_P4("CMTI Msg table: %d,%d,%d, %d", msg_info[0].index, msg_info[1].index,msg_info[2].index,msg_info[3].index);
	TRACE_EVENT_P4("CMTI Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
}
/*MC SPR 1366, need to call this function to update CPHS voicemail data*/ 
  	 sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
                                      &sm->toa, &sm->udh);
 /*SPR 1833, this is already called in sms_store_new_msg_info, BUT we need it in for initialisation*/
}

#endif /* #if defined (FF_WAP) && defined (FF_GPF_TCPIP) */
/*
+------------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS               |
| STATE   : code                         ROUTINE : find_slot_in_msg_info |
+------------------------------------------------------------------------+

   PURPOSE :  Find a slot in msg_info for the index of the SMS supplied

*/

static int find_slot_in_msg_info(UBYTE index, UBYTE update_mem)
{
    int ret = -1;
    int i;

    TRACE_FUNCTION("find_slot_in_msg_info");
    
    if (index >= 1)
    {
        /* A valid index, so look for it already being in msg_info */
#ifdef FF_MMI_SMS_DYNAMIC
        for (i = 0; (i < g_max_messages) && (ret == -1); i++)
#else
        for (i = 0; (i < MAX_MESSAGES) && (ret == -1); i++)
#endif
        {
            if (msg_info[i].index == index)
            {
                /* Index already in msg_info, so replace */
                ret = i;
            }
        }

        if (ret == -1)
        {
            /* Index was not already in msg_info, so look for unused slot */
#ifdef FF_MMI_SMS_DYNAMIC
            for (i = 0; (i < g_max_messages) && (ret == -1); i++)
#else
            for (i = 0; (i < MAX_MESSAGES) && (ret == -1); i++)
#endif
            {
                if (msg_info[i].index == -1)
                {
                    /* First unused slot in msg_info found */
                    ret = i;
               		if (update_mem)
            			memory.used++;
               }
            }
        }
    }

    TRACE_EVENT_P1("find_slot_in_msg_info returning %d", ret);

    return ret;
}

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

   PURPOSE :  Store message information

*/

T_MFW sms_store_new_msg_info(UBYTE index, T_ACI_CMGL_SM* sm, UBYTE update_mem, T_CONC_ASSEMBLY_RETURN conc_stat)
{
  int j;
  T_SMS_TYPE received_sms_type;
  // Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
  // Added this variable to store the voice mail status
  T_MFW status; 

#ifndef MMI_LITE
  //T_CONC_ASSEMBLY_RETURN concatenated_status;  // RAVI
//  T_SM_DATA_EXT conc_data_ext;  // RAVI
#endif
 int i;


  TRACE_EVENT("sms_store_new_msg_info");
  
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
  sms_type = MFW_SMS_MESSAGE;
#else
	/*SPR 2530 removed setting of sms_type flag*/
#endif
    if ((j = find_slot_in_msg_info(index, update_mem)) != -1)
	{
		//x0pleela 07 Feb, 2006  DR: OMAPS00059261
		//Initial value of msg_type is set to not voice
		 msg_info[j].msg_type = MFW_SMS_NotVOICE;

	    received_sms_type = SMS_getSMSType(&sm->udh);
	    TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
	 	

	
			/*SPR 2260*/
		  if (received_sms_type == CONCATE)
		  {	 
		   	 	
	   	  	if (conc_stat == CONC_COMPLETED)
		   	{	/*replace index withat of first message*/
		   		index = concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress);
				msg_info[j].concat_status = MFW_SMS_CONC_WHOLE;
				TRACE_EVENT("Setting to WHOLE");
						
		   	 }
		   	 else /*otherwise leave index as it is*/
		   	 {	 /*check if message already complete*/
#ifdef FF_MMI_SMS_DYNAMIC
  				for (i=0; i<g_max_messages; i++)
#else
  				for (i=0; i<MAX_MESSAGES; i++)
#endif
				{	if (msg_info[i].index != -1)
					{	if (msg_info[i].first_index == concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress)
						&& msg_info[i].concat_status == MFW_SMS_CONC_WHOLE)
							return 1;/*don't bother copying this message into the table*/ // RAVI - Changed return to return 1
					}
				}
						
		   	  msg_info[j].concat_status = MFW_SMS_CONC_PART;
		   	  TRACE_EVENT("Setting to PART");
		   	  }
		   	 
		   	  TRACE_EVENT_P1("index = %d",index);

		   	  msg_info[j].first_index =concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress);
		   	  	
	   	  		
		  		/*if complete SMS, delete old fragments*/
		  		if (conc_stat == CONC_COMPLETED)
#ifdef FF_MMI_SMS_DYNAMIC
  				for (i=0; i<g_max_messages; i++)
#else
		  		for (i=0; i<MAX_MESSAGES; i++)
#endif
		   	  	{	
					if (msg_info[i].index != -1)
					{
                                           //    March 31, 2005    REF: CRR MMI-SPR-24511   x0012852
                                           //    One more Check added for first_index to delete old fragments completely

						 if ((msg_info[i].first_index == concSMS_GetFirstIndex(concSMS_GetMsgRef ( sm ), sm->adress)||(msg_info[i].first_index == 0))
                                               &&(msg_info[i].concat_status == MFW_SMS_CONC_PART ))
						 {	TRACE_EVENT_P1("Deleting index number:%d", msg_info[i].index);
			  				delete_sms_from_table(msg_info[i].index);;
			  			}
					}
		  			
		  	  	}
		  }
		  else
		  {	msg_info[j].first_index = 0xFF;/*invalid index*/
		  	msg_info[j].concat_status = MFW_SMS_NO_CONC;
		  	TRACE_EVENT("Setting to NO CONC");
		  }
	
	   	
   	    sm->index = index;
   		msg_info[j].index = index;

   		//x0pleela 08 Feb, 2006 DR: OMAPS00059261
		//Replacing MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed
		
		//x0pleela 07 Feb, 2006 DR: OMAPS00059261
		//Update msg_info's message type for STATUS REPORT
		if(( 0x03 & sm->fo ) EQ MFW_MSG_STATUS_REPORT )
		{
			msg_info[j].msg_type = MFW_SMS_STATRPT;
		}
		msg_info[j].stat = sms_decodeStatus(sm->stat);
		
		strcpy((char *)msg_info[j].addr.number, sm->adress);
		msg_info[j].addr.ton = phb_cvtTon(sm->toa.ton);
		msg_info[j].addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);


#ifdef NO_ASCIIZ
			memcpy(msg_info[j].addr.tag, 
			sm->alpha.data, 
			sm->alpha.len);
			msg_info[j].addr.len = sm->alpha.len;
#else
			phb_Alpha2Gsm(&sm->alpha, 
			(UBYTE *)msg_info[j].addr.tag);
#endif

		memcpy(&msg_info[j].rctp, &sm->scts, sizeof(T_MFW_SMS_SCTP));

		// check voice mail status
		// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
		// Commented the 'if' condition below.
/*		if (sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
		    &sm->toa, &sm->udh) EQ MFW_SMS_VOICE)
		    		msg_info[j].msg_type = MFW_SMS_VOICE;*/
		status = 	sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
		    &sm->toa, &sm->udh);
		// Check if it is a voice mail message
		if(status == MFW_SMS_VOICE || status == MFW_SMS_VOICEMSG_DELETE)
		{
			// If voicemail message is from group "1100"
			if(status == MFW_SMS_VOICEMSG_DELETE)
			{	
				// Mark this message for deletion
				msg_info[j].stat= MFW_SMS_VOICEMSG_DELETE;
			}
		    msg_info[j].msg_type = MFW_SMS_VOICE;
		} 
		
		coll_sms_read = MFW_SMS_FREE;
        f_update = MFW_SMS_FREE;
        TRACE_EVENT_P1("UDH Length is = %d", sm->udh.len);
    }
    /*SPR 2260, check if memory full*/
    TRACE_EVENT_P2("memory used is = %d, of %d", memory.used, memory.total);
    if(memory.total == memory.used)
  	{
  		
  		sms_signal(E_SMS_MEM_FULL, NULL);
  	}  
	return 1; // RAVI
}



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

   PURPOSE :  Send a new message indication to the MMI

*/

T_MFW sms_send_new_msg_ind(T_ACI_CMGL_SM* sm,UBYTE index, UBYTE mem, UBYTE received_sms_type, UBYTE concatenated_status)
{
	TRACE_FUNCTION("sms_send_new_msg_ind");

	if (received_sms_type == CONCATE)
	{
		switch (concatenated_status)
		{
			case CONC_ERR_UNKN:
			TRACE_EVENT("Concatenated SMS error");break;
			case CONC_ERR_BUF_FULL:
			TRACE_EVENT("Concatented SMS buffer Full Error");break;
			case CONC_CONTINUED: //not last SMS
			TRACE_EVENT("Concatenation Continued");
			break;
			case CONC_COMPLETED:
			{
				TRACE_EVENT("Concatenation Completed");
				memset(&sms_mt, 0, sizeof(sms_mt));
				/*SPR 2260*/
 	 			if (sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
                &sm->toa, &sm->udh) == MFW_SMS_VOICE)
                  	sms_mt.voicemail = TRUE;
  	 			else
  	 				sms_mt.voicemail = FALSE;
				if(initialising_flag == TRUE)
					sms_signal(E_SMS_MT, &sms_mt);
				else
				{
					//Aug 26, 2004    REF: CRR 23287     Deepa M.D
					//The second parameter is not used in case of 
					//E_SMS_MT_RECEIVED event.sms_id_wait is the variable
					//used for MT SMS, which is ignored anyway.
					sms_signal(E_SMS_MT_RECEIVED, &sms_id_wait);
				}
			}
		}
	}
	else
	{
		memset(&sms_mt, 0, sizeof(sms_mt));

		if(initialising_flag == TRUE)
		sms_signal(E_SMS_MT, &sms_mt);
		else
		{
			//Aug 26, 2004    REF: CRR 23287     Deepa M.D
			//The second parameter is not used in case of 
			//E_SMS_MT_RECEIVED event.sms_id_wait is the variable
			//used for MT SMS, which is ignored anyway.
			sms_signal(E_SMS_MT_RECEIVED, &sms_id_wait);
		}
	}
}

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

   PURPOSE :  Receive a new cell broadcast message.

*/

void rAT_PlusCBM(SHORT           sn,
                 SHORT           mid,
                 SHORT           dcs,
                 UBYTE           page,
                 UBYTE           pages,
                 T_ACI_CBM_DATA* data)
{
  TRACE_FUNCTION ("rAT_PlusCBM()");

  /* copy parameter */
  sms_cb.sn     = sn;
  sms_cb.msg_id = mid;
  sms_cb.dcs    = (UBYTE)dcs;
  sms_cb.page   = page;
  sms_cb.pages  = pages;
  sms_cb.msg_len = data->len;
  memcpy((char *)sms_cb.cb_msg, (char *)data->data, data->len);
/* send cell broadcast message event */
//  	Oct 18, 2005    REF: SPR 34678 xdeepadh
//The CB messages with DCS 242(class-2,default alphabet)  are discarded
	if(dcs!=0xF2)
	{
		sms_signal(E_SMS_CB, &sms_cb);
	}
}


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

   PURPOSE :  Receive a new cell broadcast message identifier.

*/

void rAT_PlusCBMI(T_ACI_SMS_STOR mem, UBYTE index)
{
  TRACE_EVENT ("rAT_PlusCBMI()");

  switch ( mem )
  {
    case ( SMS_STOR_Me ):
        sms_id.mem = MFW_MEM_ME;
        break;
    case ( SMS_STOR_Sm ):
        sms_id.mem = MFW_MEM_SIM;
        break;
    default:
        break;
  }

  sms_id.index = index;

  /* send a short message identifier event */
  sms_signal(E_SMS_CB_RECEIVED, &sms_id);
}


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

   PURPOSE :  Receive a status report message.

*/

void rAT_PlusCDS(T_ACI_CDS_SM *st)
{
  T_MFW_SMS_STATUS sms_status;
  T_MFW_PHB_ENTRY  phb_entry;
  T_MFW_PHB_LIST   phb_list;
  SHORT            phb_index;
#ifdef NO_ASCIIZ
  T_MFW_PHB_TEXT  findText;
#endif

  TRACE_FUNCTION ("rAT_PlusCDS()");

  memset(&phb_entry, 0, sizeof(phb_entry));
  memset(&phb_list, 0, sizeof(phb_list));
  phb_list.entry = &phb_entry;

  sms_status.msg_id  = 0x03 & (UBYTE)st->fo;
  sms_status.msg_ref = st->msg_ref;
  strcpy(sms_status.addr.number, st->addr);
  sms_status.addr.ton = phb_cvtTon(st->toa.ton);
  sms_status.addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(st->toa.npi);

#ifdef NO_ASCIIZ
  strcpy((char *)findText.data, st->addr);
  findText.len = (UBYTE)strlen(st->addr);
  if (phb_find_entries  (PHB_ADN,   &phb_index,
                         MFW_PHB_NUMBER,
                         1, &findText,
                         &phb_list) EQ MFW_PHB_OK)
  {
    if (phb_list.num_entries)
    {
      memcpy(sms_status.addr.tag,
             phb_list.entry->name.data,
             phb_list.entry->name.len);
      sms_status.addr.len = phb_list.entry->name.len;
		  
	  }
//  Apr 12, 2004    REF: CRR 13370     Deepa M.D
	  else
	  {
		  sms_status.addr.tag[0]='\0';
		  sms_status.addr.len = 0;
		  
    }
  }
#else
  if (phb_find_entries  (PHB_ADN,	&phb_index,
                         MFW_PHB_NUMBER,
                         1,
                         st->ra,
                         &phb_list) EQ MFW_PHB_OK)
  {
	  
    if (phb_list.num_entries)
    {
      strcpy((char *)sms_status.addr.tag, (char *)phb_list.entry->name);
		  
    }
  }
#endif

  sms_status.status  = st->tp_status;

  memcpy((char *)sms_status.rctp.year, (char *)st->vpabs_scts.year, MAX_SCTP_DIGITS);
  memcpy((char *)sms_status.rctp.month, (char *)st->vpabs_scts.month, MAX_SCTP_DIGITS);
  memcpy((char *)sms_status.rctp.day, (char *)st->vpabs_scts.day, MAX_SCTP_DIGITS);
  memcpy((char *)sms_status.rctp.hour, (char *)st->vpabs_scts.hour, MAX_SCTP_DIGITS);
  memcpy((char *)sms_status.rctp.minute, (char *)st->vpabs_scts.minute, MAX_SCTP_DIGITS);
  memcpy((char *)sms_status.rctp.second, (char *)st->vpabs_scts.second, MAX_SCTP_DIGITS);
  sms_status.rctp.timezone = st->vpabs_scts.timezone;

  /* send status report message event */
  sms_signal(E_SMS_STATUS, &sms_status);
}


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

   PURPOSE :  Set preferred message storage.

*/

T_MFW sms_set_pref_memory(UBYTE mem)
{
  TRACE_FUNCTION ("sms_set_pref_memory()");

int_init_req = FALSE;

  if (sAT_PlusCPMS(CMD_SRC_LCL,
                   sms_mem_cvt(mem),
                   sms_mem_cvt(mem),
                   sms_mem_cvt(mem)) NEQ AT_EXCT)
    return MFW_SMS_FAIL;
  return MFW_SMS_OK;
}


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

   PURPOSE :  Read a SMS message.

*/

T_MFW sms_read(UBYTE type, UBYTE index)
{
  TRACE_EVENT_P1("sms_read():%d",index);

  coll_sms_read = MFW_SMS_WAIT;

  if (sAT_PlusCMGR(CMD_SRC_LCL, index, SMS_READ_Preview) NEQ AT_EXCT)
    return MFW_SMS_FAIL;
  /*SPR 2260, set sms type so we get event from rAT_plusCMGR*/
  sms_type = MFW_SMS_MESSAGE;

  flag = index;
  memset(&sms_mt, 0, sizeof(sms_mt));
  sms_mt.index = index;
  cmgr_awaiting_ok = FALSE; // Marcus: Issue 2260: 03/10/2002

  return MFW_SMS_OK;
}


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


   PURPOSE :  Call back for read message.

*/

//Feb 28, 2004    REF: CRR 28809   Deepa M.D
/*The Optimization changes done for golite build have been incorpaorated to color build.
    The  MMI_LITE flag used for rAT_PlusCMGR has been removed.*/
void rAT_PlusCMGR(T_ACI_CMGL_SM  * sm, T_ACI_CMGR_CBM * cbm)
{
	T_SMS_TYPE received_sms_type;
	T_CONC_ASSEMBLY_RETURN concatenated_status;
	T_SM_DATA_EXT conc_data_ext;
	//Feb 28, 2004    REF: CRR 28809   Deepa M.D
	//sms_mo is  made a local variable.It will be allocated /deallocated dynamically.
	T_MFW_SMS_MO *sms_mo=NULL;   
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
UBYTE wap_sms = FALSE;
#endif
  TRACE_FUNCTION ("rAT_PlusCMGR()");
  TRACE_EVENT_P2("messagepointer:%d, Cellbroadcast pointer:%d", sm, cbm);
  cmgr_awaiting_ok = TRUE; // Marcus: Issue 2260: 03/10/2002
  conc_data_ext.data = NULL; //  Jul 07, 2004    REF: CRR 15846     Deepa M.D
  #if defined (FF_WAP) && defined (FF_GPF_TCPIP)
/* SPR#2086 - SH - Intercept a WAP SMS */
      {
          USHORT destinatorPort = sm->udh.data[3]+sm->udh.data[2]*0x100;
          USHORT originatorPort = sm->udh.data[5]+sm->udh.data[4]*0x100;
          
          if (destinatorPort==2948
              || destinatorPort==2949
              || originatorPort==9200
              || originatorPort==9201
              || originatorPort==9202
              || originatorPort==9203)
          {   
              wap_sms = TRUE;
          }
      }
  #endif
  switch (sms_type)
  {
    case MFW_SMS_MESSAGE:
    {	if (sm != NULL)  /*SPR2260 make sure we have a valid pointer*/
      	{   switch (0x03 & sm->fo)
	      {
	         case MFW_MSG_DELIVER:  //x0pleela 01 Feb, 2006 DR: OMAPS00059261 /* SMS type: MT */
	        { USHORT conc_msg_ref;
	          UBYTE conc_index;
	          int i;/*SPR2260*/
			  BOOL continue_flag=FALSE;/*SPR2260*/
	          TRACE_EVENT_P1("UDH Length is = %d", sm->udh.len);
	    	received_sms_type = SMS_getSMSType( &sm->udh);
			TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
  		
	  		if (received_sms_type == CONCATE)
	  		{
			  concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
			  TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);
	  		}
	  		
	      
		  	  if (received_sms_type == CONCATE)
		      {
				switch (concatenated_status)
				{
				  
				  case CONC_ERR_BUF_FULL:
				    TRACE_EVENT("Concatented SMS buffer Full Error");
				     sms_signal(E_SMS_ERR, NULL);
					break;
				case CONC_ERR_UNKN:
				    TRACE_EVENT("Concatenated SMS error");
				  case CONC_CONTINUED: //not last SMS
				  	TRACE_EVENT("Concatenation Continued");
					/*SPR 2260*/
	                cmgr_awaiting_ok = FALSE; // Marcus: Issue 2260: 03/10/2002
					
					/*if the index exists in the message table, process the message*/
#ifdef FF_MMI_SMS_DYNAMIC
					for (i=0; i <g_max_messages;i++)
#else
					for (i=0; i <MAX_MESSAGES;i++)
#endif
						if (msg_info[i].index == sm->msg_ref && msg_info[i].concat_status == MFW_SMS_CONC_PART)
							continue_flag = TRUE;
					if (!continue_flag)
						break;
				  
				  case CONC_COMPLETED:
				  {
				    TRACE_EVENT("Concatenation Completed");
					memset(&sms_mt, 0, sizeof(sms_mt));
					conc_msg_ref =concSMS_GetMsgRef ( sm );
					conc_index = concSMS_GetFirstIndex(conc_msg_ref, sm->adress);

#ifdef NO_ASCIIZ
					memcpy(sms_mt.orig_addr.tag,
						         sm->alpha.data,
						         sm->alpha.len);
					sms_mt.orig_addr.len = sm->alpha.len;
#else
					phb_Alpha2Gsm(sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif
					strcpy(sms_mt.orig_addr.number, sm->adress);
					sms_mt.orig_addr.ton =
						      phb_cvtTon(sm->toa.ton);
				    sms_mt.orig_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);
					if (sm->tosca.ton == TON_International)
					  sprintf(sms_mt.sc_addr, "+%s", sm->sca);
					else
					  strcpy(sms_mt.sc_addr, sm->sca);
					sms_mt.prot_id = (UBYTE)sm->pid;
					sms_mt.dcs     = (UBYTE)sm->dcs & 0xFC;	/* Ignore message class */

					/*MC SPR 2260, message index should be set to that of first index in
					concatenated message if this is a complete message*/
					if (concatenated_status == CONC_COMPLETED)
						sms_mt.index = conc_index;
					else
						sms_mt.index = sm->msg_ref;

					sms_mt.rp      = sm->fo >> 7 & 1;

					/* SBH */
					if (sm->dcs & 0x10)		/* Bit 5 indicates that we should get message class from bits 0 & 1 */
					{
						sms_mt.ti = sm->dcs & 3;
					}
					else					/* Otherwise, set to default value */
					{
						sms_mt.ti = 1;
					}
					/* SBH end */
					
					memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
					sms_mt.sctp.timezone = sm->scts.timezone;
						  
					/* copy length of whole concat SMS*/
					if (conc_data_ext.len > MAX_MSG_LEN)
					  sms_mt.msg_len = MAX_MSG_LEN;
					else
					  sms_mt.msg_len = conc_data_ext.len;
					/*copy all data from concat SMS*/
									/*SPR 2260*/
		         	if (sm->stat == SMS_STAT_Invalid)
						memset(sms_mt.sms_msg, NULL, MAX_MSG_LEN_ARRAY);
		         	else /*SPR2260 */
					{	if (concatenated_status == CONC_COMPLETED)
				    	{	memcpy(sms_mt.sms_msg, (char*)conc_data_ext.data, sms_mt.msg_len);}
				    	else/*copy data from sm pointer if message not complete*/
				    	{	memcpy(sms_mt.sms_msg, (char*)sm->data.data, sm->data.len);
							sms_mt.msg_len = sm->data.len;
						}
		         	}
					/* Free memory allocated by the ACI */
					//  Jul 07, 2004    REF: CRR 15846     Deepa M.D
					//Free the memory only if conc_data_ext.data  is not NULL.
					if(conc_data_ext.data != NULL)
					{
						MFREE(conc_data_ext.data);
					}
					sms_mt.udh_len = sm->udh.len;
					memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
					
				  /*MC SPR 2260, need to call this function to update CPHS voicemail data*/ 
  	 				if (sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
                                       &sm->toa, &sm->udh) == MFW_SMS_VOICE)
                  		sms_mt.voicemail = TRUE;
  	 				else
  	 					sms_mt.voicemail = FALSE;
  	 				
	          			  sms_type = MFW_NO_MESSAGE;

	          			  coll_sms_read = MFW_SMS_FREE;
	         			  sms_signal(E_SMS_MT, &sms_mt);
						}
					}
		  		}
				else
				{
#ifdef NO_ASCIIZ
					memcpy(sms_mt.orig_addr.tag,
		            	     sm->alpha.data,
		                	 sm->alpha.len);

					sms_mt.orig_addr.len = sm->alpha.len;
#else
					phb_Alpha2Gsm(&sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif

					if (sm->toa.ton == TON_International)
						sprintf(sms_mt.orig_addr.number, "+%s", sm->adress);
					else	
						strcpy(sms_mt.orig_addr.number, sm->adress);

					sms_mt.orig_addr.ton = phb_cvtTon(sm->toa.ton);
					sms_mt.orig_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);
		          
					if (sm->tosca.ton == TON_International)
						sprintf(sms_mt.sc_addr, "+%s", sm->sca);
					else
						strcpy(sms_mt.sc_addr, sm->sca);
		          
					sms_mt.prot_id = (UBYTE)sm->pid;
					sms_mt.dcs     = (UBYTE)sm->dcs & 0xFC;	/* Ignore message class */
					sms_mt.rp		 = sm->fo >> 7 & 1;

					// PATCH JPS 04.10 END
					/* SBH */
					if (sm->dcs & 0x10)		/* Bit 5 indicates that we should get message class from bits 0 & 1 */
					{
						sms_mt.ti = sm->dcs & 3;
					}
					else					/* Otherwise, set to default value */
					{
						sms_mt.ti = 1;
					}
					/* SBH end */

					TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);
					
					memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
					sms_mt.sctp.timezone = sm->scts.timezone;
					sms_mt.msg_len = sm->data.len;
					TRACE_EVENT_P2("msg_len %d, data.len %d", sms_mt.msg_len, sm->data.len);
				#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
				        /* SPR#2086 - SH - If we've got a WAP SMS, replace the message
					 * with a string */
				
					if (wap_sms)
					{
						char *message = "WAP SMS";

						strcpy(sms_mt.sms_msg, message);
						sms_mt.msg_len = strlen(message);
					}
                                    else
                                    {
                                        
                                        /*SPR 2260, if invalid message just set text to NULL*/
				#endif
		         if (sm->stat == SMS_STAT_Invalid)
					memset(sms_mt.sms_msg, NULL, MAX_MSG_LEN_ARRAY);
		         else
				 {
				  	memcpy(sms_mt.sms_msg, (char*)sm->data.data, sm->data.len);
					sms_mt.msg_len = sm->data.len;
				  
				 }
		         /*SPR 2260 end*/
					sms_mt.udh_len = sm->udh.len;
					memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
					sms_type = MFW_NO_MESSAGE;
					TRACE_EVENT("read=free1");
					coll_sms_read = MFW_SMS_FREE;
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
                                    }
#endif

			  /*MC SPR 2260, need to call this function to update CPHS voicemail data*/ 
  	 				if (sms_check_voice_mail(sm->pid, sm->dcs, sm->adress,
                                       &sm->toa, &sm->udh) == MFW_SMS_VOICE)
                  		sms_mt.voicemail = TRUE;
  	 				else
  	 					sms_mt.voicemail = FALSE;
					sms_signal(E_SMS_MT, &sms_mt);
				}
	        }
	          break;

	        case MFW_MSG_SUBMIT://x0pleela 01 Feb, 2006 DR: OMAPS00059261 /* SMS type: MO */
	        	{	 int i;/*SPR2260*/
			  		BOOL continue_flag=FALSE;
					USHORT conc_msg_ref;/*SPR 2260*/
	          		UBYTE conc_index;

				//Feb 28, 2004    REF: CRR 28809   Deepa M.D
				//Allocate sms_mo dynamically
				sms_mo = (T_MFW_SMS_MO*)mfwAlloc(sizeof(T_MFW_SMS_MO));  
				if (sms_mo == NULL)
				{
					TRACE_EVENT("sms_mo alloc failed");
					return ;
				}
				
				received_sms_type = SMS_getSMSType( &sm->udh);
				TRACE_EVENT_P1("SMS Type is = %d", received_sms_type);
				if (received_sms_type == CONCATE)
				{
					concatenated_status =concSMS_Collect(&conc_data_ext, sm, FALSE);
					TRACE_EVENT_P2("conc status: %d, conc length: %d", concatenated_status, conc_data_ext.len);
				}
				
				TRACE_EVENT_P1("UDH Length is = %d", sm->udh.len);
				
				if (received_sms_type == CONCATE)
				{
					switch (concatenated_status)
					{
						
					case CONC_ERR_BUF_FULL:
						TRACE_EVENT("Concatented SMS buffer Full Error");
						sms_signal(E_SMS_ERR, NULL);
						break;
					case CONC_ERR_UNKN:
						TRACE_EVENT("Concatenated SMS error");
					case CONC_CONTINUED: //not last SMS
						TRACE_EVENT("Concatenation Continued");
						cmgr_awaiting_ok = FALSE; // Marcus: Issue 2260: 03/10/2002
						/*SPR 2260,if the index exists in the message table, continue processing message*/
#ifdef FF_MMI_SMS_DYNAMIC
						for (i=0; i <g_max_messages;i++)
#else
						for (i=0; i <MAX_MESSAGES;i++)
#endif
							if (msg_info[i].index == sm->msg_ref && msg_info[i].concat_status == MFW_SMS_CONC_PART)
								continue_flag = TRUE;
							if (!continue_flag)
								break;
					case CONC_COMPLETED:
						{ 	
							
							TRACE_EVENT("Concatenation Completed");
							
							memset(sms_mo, 0, sizeof(T_MFW_SMS_MO));
							/*SPR 2260*/
							conc_msg_ref =concSMS_GetMsgRef ( sm );
							conc_index = concSMS_GetFirstIndex(conc_msg_ref, sm->adress);
							TRACE_EVENT_P2("msg_len: %d conc len: %d", sms_mo->msg_len, conc_data_ext.len);
							
#ifdef NO_ASCIIZ
							memcpy(sms_mo->dest_addr.tag,
								sm->alpha.data,
								sm->alpha.len);
							sms_mo->dest_addr.len = sm->alpha.len;
#else
							phb_Alpha2Gsm(&sm->alpha, (UBYTE *)sms_mo->dest_addr.tag);
#endif
							strcpy(sms_mo->dest_addr.number, sm->adress);
							sms_mo->dest_addr.ton = phb_cvtTon(sm->toa.ton);
							sms_mo->dest_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);
							if (sm->tosca.ton == TON_International)
								sprintf(sms_mo->sc_addr, "+%s", sm->sca);
							else
								strcpy((char *)sms_mo->sc_addr, sm->sca);
							
							sms_mo->prot_id = (UBYTE)sm->pid;
							sms_mo->dcs     = sm->dcs;
							
							/*MC SPR 2260, message index should be set to that of first index in
							concatenated message if this is a complete message*/
							if (concatenated_status == CONC_COMPLETED)
								sms_mo->msg_ref = conc_index;
							else
								sms_mo->msg_ref = sm->msg_ref;
							
							
							sms_mo->vp_mode = 0x03 & sm->fo << 2;
							sms_mo->vp_rel  = (UBYTE)sm->vp_rel;
							
							memcpy((char *)sms_mo->vp_abs.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
							memcpy((char *)sms_mo->vp_abs.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
							memcpy((char *)sms_mo->vp_abs.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
							memcpy((char *)sms_mo->vp_abs.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
							memcpy((char *)sms_mo->vp_abs.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
							memcpy((char *)sms_mo->vp_abs.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
							sms_mo->vp_abs.timezone = sm->scts.timezone;
							
							/* copy length of whole concat SMS*/
							if (conc_data_ext.len > MAX_MSG_LEN)
								sms_mo->msg_len = MAX_MSG_LEN;
							else
								sms_mo->msg_len = conc_data_ext.len;
							/*SPR 2260  if invalid message just set text to NULL*/
							if (sm->stat == SMS_STAT_Invalid)
								memset(sms_mo->sms_msg, NULL, MAX_MSG_LEN_ARRAY);
							else
							{	if (concatenated_status == CONC_COMPLETED)
							{	memcpy(sms_mo->sms_msg, (char*)conc_data_ext.data, sms_mo->msg_len);}
							else
							{	memcpy(sms_mo->sms_msg, (char*)sm->data.data, sm->data.len);
							sms_mo->msg_len = sm->data.len;
							}
							}
							
							/* Free memory allocated by the ACI */
							//  Jul 07, 2004    REF: CRR 15846     Deepa M.D
							//Free the memory only if conc_data_ext.data  is not NULL.
							if(conc_data_ext.data != NULL)
							{
								MFREE(conc_data_ext.data);
							}
							sms_type = MFW_NO_MESSAGE;
							sms_signal(E_SMS_MO, sms_mo);
						}
					}
				}
				else
				{
#ifdef NO_ASCIIZ
					memcpy(sms_mo->dest_addr.tag,
						sm->alpha.data,
						sm->alpha.len);
					sms_mo->dest_addr.len = sm->alpha.len;
#else
					phb_Alpha2Gsm(&sm->alpha, (UBYTE *)sms_mo->dest_addr.tag);
#endif
					strcpy(sms_mo->dest_addr.number, sm->adress);
					sms_mo->dest_addr.ton = phb_cvtTon(sm->toa.ton);
					sms_mo->dest_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);
					if (sm->tosca.ton == TON_International)
						sprintf(sms_mo->sc_addr, "+%s", sm->sca);
					else
						strcpy((char *)sms_mo->sc_addr, sm->sca);
					
					sms_mo->prot_id = (UBYTE)sm->pid;
					sms_mo->dcs     = sm->dcs;
					sms_mo->msg_ref = sm->msg_ref;
					sms_mo->vp_mode = 0x03 & sm->fo << 2;
					sms_mo->vp_rel  = (UBYTE)sm->vp_rel;
					
					memcpy((char *)sms_mo->vp_abs.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mo->vp_abs.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mo->vp_abs.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mo->vp_abs.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mo->vp_abs.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
					memcpy((char *)sms_mo->vp_abs.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
					sms_mo->vp_abs.timezone = sm->scts.timezone;
					
					TRACE_EVENT("Normal MO Message");
					sms_mo->msg_len = sm->data.len;
					#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
				/* SPR#2086 - SH - If we've got a WAP SMS, replace the message
				 * with a string */
				if (wap_sms)
				{
					char *message = "WAP SMS";
					strcpy(sms_mt.sms_msg, message);
					sms_mt.msg_len = strlen(message);
				}
                            else
                            {
	#endif   
					/* CQ:16780 clear the buffer before reading in the retrieved SMS, prevents residual characters
					from previous message being displayed. 15-01-04 MZ*/
					
					memset(sms_mo->sms_msg, NULL, MAX_MSG_LEN_ARRAY);  
					
					/*SPR 2260 if invalid message just set text to NULL*/
					if (sm->stat != SMS_STAT_Invalid)
						memcpy(sms_mo->sms_msg, (char *)sm->data.data, sm->data.len);
					#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
                            }
#endif
					sms_type = MFW_NO_MESSAGE;
					sms_signal(E_SMS_MO, sms_mo);
				}
				}
				//Feb 28, 2004    REF: CRR 28809   Deepa M.D
				//Deallocate the variable
				if(sms_mo!=NULL)
				{
					mfwFree((U8*)sms_mo, sizeof(T_MFW_SMS_MO)); 
					sms_mo=NULL;
				}
				
				break;
 
				//x0pleela 30 Jan, 2006 DR: OMAPS00059261
				//Store the status report message into sms_mt
#ifndef NEPTUNE_BOARD
				case MFW_MSG_STATUS_REPORT://x0pleela 01 Feb, 2006 DR: OMAPS00059261 /* SMS type: STATUS REPORT */
				{
				  char sms_str[MAX_STAT_MSG_LEN];
				  TRACE_EVENT("Status report");
#ifdef NO_ASCIIZ
      				  memcpy(sms_mt.orig_addr.tag,
      				  sm->alpha.data,
      				  sm->alpha.len);
        			  sms_mt.orig_addr.len = sm->alpha.len;
#else
				  phb_Alpha2Gsm(&sm->alpha, (UBYTE *)sms_mt.orig_addr.tag);
#endif
				  if (sm->toa.ton == TON_International)
				    sprintf(sms_mt.orig_addr.number, "+%s", sm->adress);
				  else	
				    strcpy(sms_mt.orig_addr.number, sm->adress);

  				  sms_mt.orig_addr.ton = phb_cvtTon(sm->toa.ton);
  				  sms_mt.orig_addr.npi = (T_MFW_PHB_NPI)phb_cvtNpi(sm->toa.npi);

				  if (sm->tosca.ton == TON_International)
				    sprintf(sms_mt.sc_addr, "+%s", sm->sca);
				  else
				    strcpy(sms_mt.sc_addr, sm->sca);

				  sms_mt.prot_id = (UBYTE)sm->pid;
				  sms_mt.dcs     = (UBYTE)sm->dcs & 0xFC;	/* Ignore message class */
				  sms_mt.rp		 = sm->fo >> 7 & 1;

				  // PATCH JPS 04.10 END
				  /* SBH */
				  if (sm->dcs & 0x10)		/* Bit 5 indicates that we should get message class from bits 0 & 1 */
				  {
				    sms_mt.ti = sm->dcs & 3;
				  }
				  else					/* Otherwise, set to default value */
				  {
				    sms_mt.ti = 1;
				  }
				  /* SBH end */

				  TRACE_EVENT_P2("dcs: %d, ti: %d", sms_mt.dcs, sms_mt.ti);

				  memcpy((char *)sms_mt.sctp.year, (char *)sm->scts.year, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.month, (char *)sm->scts.month, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.day, (char *)sm->scts.day, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.hour, (char *)sm->scts.hour, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.minute, (char *)sm->scts.minute, MAX_SCTP_DIGITS);
				  memcpy((char *)sms_mt.sctp.second, (char *)sm->scts.second, MAX_SCTP_DIGITS);
				  sms_mt.sctp.timezone = sm->scts.timezone;
				  sms_mt.msg_len = sm->data.len;
				  TRACE_EVENT_P2("msg_len %d, data.len %d", sms_mt.msg_len, sm->data.len);

				  memset(sms_str, 0, MAX_STAT_MSG_LEN);
				  memset(sms_mt.sms_msg, NULL, MAX_MSG_LEN_ARRAY);
				  
				  //x0pleela 01 Feb, 2006 DR: OMAPS00059261
				  //To display the message as "Delivered" or "Pending" as per the status
				  TRACE_EVENT_P1("sm->stat: %d", sm->tp_status);
  				  //x0pleela 06 Feb, 2006 DR: OMAPS00059261
				  //To display the message as "Delivered" or "Pending" as per the tp_status
				  if( !sm->tp_status ) 
				  {
				    strcpy(sms_str, "Delivered:");
				  }
				  else
				  {
  				    strcpy(sms_str, "Pending:");
				  }
				  strcat(sms_str, sm->adress);
				  memcpy(sms_mt.sms_msg, sms_str, strlen(sms_str));
				  sms_mt.msg_len = strlen(sms_str);
				  TRACE_EVENT_P2("sm->adress:%s, sms_str:%s ",sm->adress,sms_str);
 				  							
				  /*SPR 2260 end*/
				  sms_mt.udh_len = sm->udh.len;
				  memcpy((char *)sms_mt.udh, (char *)sm->udh.data, sm->udh.len);
				  sms_type = MFW_NO_MESSAGE;
				  TRACE_EVENT("read=free1");
				  coll_sms_read = MFW_SMS_FREE;

				//x0pleela 08 Feb, 2006 DR: OMAPS00059261
				//Replacing MT_STATUS_RPT with MFW_SMS_STATRPT as MT_STATUS_RPT is removed
		
				  //x0pleela 30 Jan, 2006 DR: OMAPS00059261
				  //Store sms message type
				  sms_mt.sms_msg_type = MFW_SMS_STATRPT;
				  sms_mt.voicemail = FALSE;
 				  sms_signal(E_SMS_MT, &sms_mt);
				}
				break;
#endif
			default:
				sms_signal(E_SMS_ERR, NULL);
			}
		}
		
		else
		{	TRACE_EVENT("rAT_plusCMGR: SMS pointer error");
		
		}
  }
  break;

      case MFW_CB_MESSAGE:
		  if (cbm != NULL) /*SPR2260 make sure we have a valid pointer*/
		  {
			  sms_cb.sn     = cbm->sn;
			  sms_cb.msg_id = cbm->mid;
			  sms_cb.dcs    = cbm->dcs;
			  sms_cb.page   = cbm->page;
			  sms_cb.pages  = cbm->pages;
			  sms_cb.msg_len = cbm->data.len;
			  memcpy((char *)sms_cb.cb_msg, (char *)cbm->data.data, cbm->data.len);
			  
			  /* send cell broadcast message event */
			  sms_type = MFW_NO_MESSAGE;
			  sms_signal(E_SMS_CB, &sms_cb);
		  }
		  else
			  TRACE_EVENT("rAT_plusCMGR: SMS CB pointer error");
		  break;
		  
      case MFW_NO_MESSAGE:
		  TRACE_EVENT("read=free no msg");
		  coll_sms_read = MFW_SMS_FREE;
		  if(coll_sms_read EQ MFW_SMS_WAIT)
			  coll_sms_read = MFW_SMS_FREE;
		  break;
  }
  
  sms_check_mt_update();
  
  {	
	  TRACE_EVENT_P4("CMGR Msg table: %d,%d,%d, %d", msg_info[0].index, msg_info[1].index,msg_info[2].index,msg_info[3].index);
	  TRACE_EVENT_P4("CMGR Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
  }
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : MFW_SMS                  |
| STATE   : code                  ROUTINE : rAT_PlusCMGD             |
+--------------------------------------------------------------------+

  PURPOSE :
*/
GLOBAL void rAT_PlusCMGD ()
{
  TRACE_FUNCTION ("rAT_PlusCMGD");
//July 7, 2005 REF: CRR MMI-SPR-32179 x0018858
//Clears the incompleted message buffers.
#ifndef NEPTUNE_BOARD //a0876501 - Shashi - Guarded the below function call for Neptune.
  concSMS_clearIncompleteMsg();
#endif
}


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

   PURPOSE :  Save a short message.

  GW 09/10/01 - Modified code to always save the maximum message length
*/
#ifdef NO_ASCIIZ
T_MFW sms_store(T_MFW_SMS_MO_TYPE type,
				CHAR *addr,
                UBYTE *msg,
                USHORT msg_len,
				CHAR *sca)
#else
T_MFW sms_store(T_MFW_SMS_MO_TYPE type,
				CHAR *addr,
				UBYTE *msg,
				USHORT msg_len,
				CHAR *sca)
// sbh - added length to the above definition, since '@' characters stored as NULL & will stop
// strlen from working properly.
#endif
{

  T_SM_DATA_EXT		conc_data_ext;

  SHORT            rp;


  TRACE_FUNCTION ("sms_store()");


  /* check whether memory is full */
  if (memory.used == memory.total)
  {
    sms_signal(E_SMS_MEM_FULL, 0);
    return MFW_SMS_FAIL;
  }

  if (type == MFW_SMS_REPLY     OR
      type == MFW_SMS_REPLY_SENT  )
    rp = 0;   /* reply path = 0 */
  else
    rp = -1;  /* reply path = default */


	conc_data_ext.len = msg_len;
  conc_data_ext.data = msg;


  if (type == MFW_SMS_REPLY_SENT  OR
      type == MFW_SMS_SUBMIT_SENT   )
    sentStatus =  SMS_STAT_StoSent;
  else
    sentStatus =  SMS_STAT_StoUnsent;


  if (sAT_PlusCMGW(CMD_SRC_LCL, 0, addr, NULL, /* => addr analysed by ACI */
                       sentStatus, 0xFF,   /* unknown message reference */
                       &conc_data_ext, sca,
                       NULL, rp) NEQ AT_EXCT)

  {
    TRACE_EVENT("sAT_PlusCMGW error");
    return MFW_SMS_FAIL;
  }

  wr_addr = addr;
  sms_type = MFW_WR_NEW_MESSAGE;
  return MFW_SMS_OK;
}




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

   PURPOSE :  Save a MT message.

*/

T_MFW sms_mt_store(T_MFW_SMS_MT *mt_msg, T_MFW_SMS_STAT stat)
{

  T_SM_DATA_EXT		conc_data_ext;
  T_ACI_TOA        toa;

  TRACE_FUNCTION ("sms_mt_store()");

  /* check whether memory is full */
  if (memory.used == memory.total)
  {
    sms_signal(E_SMS_MEM_FULL, 0);
    return MFW_SMS_FAIL;
  }


  conc_data_ext.len = mt_msg->msg_len;
  conc_data_ext.data = (UBYTE *)mt_msg->sms_msg;


  toa.ton = phb_ncvtTon(mt_msg->orig_addr.ton);
  toa.npi = phb_ncvtNpi((T_ACI_TOA_NPI)mt_msg->orig_addr.npi);


  if (sAT_PlusCMGW(CMD_SRC_LCL, 0, mt_msg->orig_addr.number,
                   &toa, sms_codeStatus(stat), 0,  /* no message reference */
                   &conc_data_ext,
                   mt_msg->sc_addr, NULL, -1) NEQ AT_EXCT)

  {
    TRACE_EVENT("sAT_PlusCMGW error");
    return MFW_SMS_FAIL;
  }

  sms_type = MFW_WR_NEW_MESSAGE;
  return MFW_SMS_OK;
}


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


   PURPOSE :  Save a changed short message.

  GW 09/10/01 - Copy entire message length.

*/

#ifdef NO_ASCIIZ
T_MFW sms_change(CHAR *addr, UBYTE *msg,
                 USHORT msg_len, UBYTE index)
#else
T_MFW sms_change(CHAR *addr, USHORT *msg, USHORT msg_len, UBYTE index)
// sbh - added length to the above function call, since '@' characters stored as NULL & will stop
// strlen from working properly.
#endif
{

  T_SM_DATA_EXT		conc_data_ext;


  TRACE_FUNCTION ("sms_change()");


  conc_data_ext.len = msg_len;
  conc_data_ext.data = (UBYTE *)msg;
    if (sAT_PlusCMGW(CMD_SRC_LCL, index, addr, NULL,
                       SMS_STAT_StoUnsent, 0xFF,    /* message reference */
                       &conc_data_ext,
                       NULL, NULL, -1) NEQ AT_EXCT)
    return MFW_SMS_FAIL;



  sms_type = MFW_WR_CHG_MESSAGE;
  return MFW_SMS_OK;
}


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


   PURPOSE :  Call back for saving a short message.

*/

void rAT_PlusCMGW(UBYTE index, UBYTE numSeg)
{
  int i;
  T_MFW_PHB_ENTRY phb_entry;
  T_MFW_PHB_LIST  phb_list;
  SHORT           phb_index;
#ifdef NO_ASCIIZ
  T_MFW_PHB_TEXT  findText;
#endif

  TRACE_FUNCTION ("rAT_PlusCMGW()");
  TRACE_EVENT_P2("Index: %d, numseg: %d", index, numSeg);

  memset(&phb_entry, 0, sizeof(phb_entry));
	memset(&phb_list, 0, sizeof(phb_list));
	phb_list.entry = &phb_entry;

  if (sms_type == MFW_WR_NEW_MESSAGE)
  {
#ifdef FF_MMI_SMS_DYNAMIC
    for (i=0; i<g_max_messages; i++)
#else
    for (i=0; i<MAX_MESSAGES; i++)
#endif
    {
      if (msg_info[i].index == -1)
        break;
    }
#ifdef FF_MMI_SMS_DYNAMIC
    if (i < g_max_messages)
#else
    if (i < MAX_MESSAGES)
#endif
    {
      msg_info[i].index = index;
      strncpy (msg_info[i].addr.number, wr_addr, MFW_NUM_LEN-1);
      msg_info[i].addr.number[MFW_NUM_LEN-1] = 0;
      /* search the name in phonebook */
#ifdef NO_ASCIIZ
      strcpy((char *)findText.data, wr_addr);
      findText.len = strlen(wr_addr);
      if (phb_find_entries  (PHB_ADN,	&phb_index,
                             MFW_PHB_NUMBER,
                             1, &findText,
                             &phb_list) EQ MFW_PHB_OK)
      {
        if (phb_list.num_entries == 1)
        {
          memcpy((char *)msg_info[i].addr.tag,
                 (char *)phb_list.entry->name.data,
                 phb_list.entry->name.len);
          msg_info[i].addr.len = phb_list.entry->name.len;
        }
      }
#else
      if (phb_find_entries  (PHB_ADN,	&phb_index,
                             MFW_PHB_NUMBER,
                             1, (CHAR *)wr_addr,
                             &phb_list) EQ MFW_PHB_OK)
      {
        if (phb_list.num_entries == 1)
        {
          strcpy((char *)msg_info[i].addr.tag, (char *)phb_list.entry->name);
        }
      }
#endif

      if (sentStatus EQ SMS_STAT_StoUnsent)
        msg_info[i].stat = MFW_SMS_STOR_UNSENT;
      else
        msg_info[i].stat = MFW_SMS_STOR_SENT;
	/*SPR 2260, we're making the assumption that only complete concat SMSs or single SMSs
	can be saved successfully*/
      if (numSeg == 1)
      	msg_info[i].concat_status = MFW_SMS_NO_CONC;
      else
      	msg_info[i].concat_status = MFW_SMS_CONC_WHOLE;

      msg_info[i].first_index = index;/*SPR 2260*/
      msg_info[i].msg_type = MFW_SMS_NotVOICE; // ???
      memory.used +=numSeg;/*SPR2260*/
    }
  }
  /*SPR 2260*/
  TRACE_EVENT_P2("memory used is = %d, of %d", memory.used, memory.total);
 if(memory.total == memory.used)
  {
  	
  	sms_signal(E_SMS_MEM_FULL, NULL);
  }  
  sms_type = MFW_NO_MESSAGE;

  sms_check_mt_update();

  sms_signal(E_SMS_SAVE_AVAIL, &index);
}


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


   PURPOSE :  Delete a short message.

*/

T_MFW sms_msg_delete(UBYTE index)
{
  TRACE_FUNCTION ("sms_msg_delete()");

  coll_sms_delete = MFW_SMS_WAIT;

#ifdef FF_2TO1_PS
  if (sAT_PlusCMGD(CMD_SRC_LCL, index, MNSMS_CMGD_DEL_INDEX) NEQ AT_EXCT)
#else
/* a0876501 (Shashi), 08-Nov-2005, OMAPS00050772.
Added new parameter to be passed (3rd Parameter is set to 0). */
  if (sAT_PlusCMGD(CMD_SRC_LCL, index,0) NEQ AT_EXCT)
#endif
    return MFW_SMS_FAIL;
/*MC*/
  deleting_index = index;
  return MFW_SMS_OK;
}

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

   PURPOSE :  Call back for the status change of a short message.form
              UNREAD to READ

*/

void sms_ok_change()
{



//  Dec 23, 2004 REF: CRR MMI-SPR-27741 xkundadu 
//  Issue description:  BMI: crashing when using the function : sms_index_list() located in mfw
//  Solution: Changed the msg_list variable to array of T_MFW_SMS_IDX.

//	May 27, 2005    MMI-FIX-29869 x0018858 - Modified from static to dynamic variable
#ifdef FF_MMI_SMS_DYNAMIC
	T_MFW_SMS_IDX* msg_list;
#else
    T_MFW_SMS_IDX msg_list[MAX_MESSAGES];
#endif
    int noOfVMSMS = 0; // stores number of VM sms
    int i;
//	May 27, 2005    MMI-FIX-29869 x0018858 - Modified from static to dynamic variable
#ifdef FF_MMI_SMS_DYNAMIC
	msg_list = (T_MFW_SMS_IDX*)ALLOC_MEMORY(g_max_messages*sizeof(T_MFW_SMS_IDX));
#endif   

    TRACE_FUNCTION ("sms_ok_change()");

    /* Marcus: Issue 2260: 03/10/2002: Start */
    if (cmgr_awaiting_ok == TRUE)
    {
        cmgr_awaiting_ok = FALSE;
    /* Marcus: Issue 2260: 03/10/2002: End */

        if (fg)
        {
            fg = 0;
            sms_update_msg_info(MFW_SMS_READ);
            sms_signal(E_SMS_OK, 0);
        }

        sms_check_mt_update();

        
//  Dec 23, 2004 REF: CRR MMI-SPR-27741 xkundadu 
//  Issue description:  BMI: crashing when using the function : sms_index_list() located in mfw
//  Solution: Changed the msg_list variable to array of T_MFW_SMS_IDX.
#ifdef FF_MMI_SMS_DYNAMIC
        noOfVMSMS = sms_index_list(MFW_SMS_VOICE, msg_list, g_max_messages) ;
#else
        noOfVMSMS = sms_index_list(MFW_SMS_VOICE, msg_list, MAX_MESSAGES) ;
#endif
	 TRACE_EVENT_P1("No of VM sms:%d", noOfVMSMS);
	// Checking the number of VM sms.
        if( noOfVMSMS > 0)
        {
		//Delete the vm sms which is read.
		for(i=0;i<noOfVMSMS;i++)
		{
			//Find out the VM sms which is already read and delete it.
			if(msg_list[i].stat == MFW_SMS_READ)
			{
				sms_msg_delete(msg_list[i].index);
				break;
			}
		}
        }
	
    /* Marcus: Issue 2260: 03/10/2002: Start */
    }
    else
    {
         TRACE_EVENT("Ignoring unexpected OK");
    }
#ifdef FF_MMI_SMS_DYNAMIC
	//	May 27, 2005    MMI-FIX-29869 x0018858 - Freeing the memory.
	FREE_MEMORY((U8*)msg_list, g_max_messages*sizeof(T_MFW_SMS_IDX));
#endif
    /* Marcus: Issue 2260: 03/10/2002: End */
}

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


   PURPOSE :  Call back for deleting a short message.

*/

void sms_ok_delete()
{
 
  	TRACE_FUNCTION ("sms_ok_delete()");
	/*SPR2530, moved flag claering code here from delete_sms_from_table*/
	
  	 if(coll_sms_delete EQ MFW_SMS_WAIT)
    coll_sms_delete = MFW_SMS_FREE;
  	/*SPR 1833, replaces section of code with function call*/
  	if (delete_sms_from_table (deleting_index))
  	{
	   	deleting_index = -1; /*Hope this fixes multiple deletions*/
		/*SPR 2260, we have to request the SMS storage status to update memory.used*/
		/*as we have no idea how many segments the deleted SMS had*/
	        int_req = POST_DELETE_CHECK;/*update memory variable, don't send an event to MMI*/

		/* cq16875 If the SIM Entity is busy then don't send an E_SmS_OK event to the MMI
		    12-02-04 MZ.*/
		if(AT_BUSY != qAT_PlusCPMS(CMD_SRC_LCL))
	  		sms_signal(E_SMS_OK, 0);

		sms_signal(E_SMS_MEM_FREE, 0);

	  	sms_check_mt_update();
  	}
  	{	
		TRACE_EVENT_P4("CMGD Msg table: %d,%d,%d, %d", msg_info[0].index, msg_info[1].index,msg_info[2].index,msg_info[3].index);
		TRACE_EVENT_P4("CMGD Msg table: %d,%d,%d, %d", msg_info[4].index, msg_info[5].index,msg_info[6].index,msg_info[7].index);
	}
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE: MFW_SMS              |
| STATE  : code                         ROUTINE: delete_sms_from_table       |
+--------------------------------------------------------------------+


   PURPOSE :  deletes a message from the MFW message table
   created for SPR2260

*/

BOOL delete_sms_from_table (SHORT index)
{
  int i;
 
  TRACE_FUNCTION ("delete_sms_from_table()");

 /*SPR2530, removed flag clearing code*/
#ifdef FF_MMI_SMS_DYNAMIC
  for (i=0; i<g_max_messages; i++)
#else
  for (i=0; i<MAX_MESSAGES; i++)
#endif
  {
    if (msg_info[i].index == index)
    {
      msg_info[i].index = -1;
      msg_info[i].stat = MFW_SMS_UNKNOWN;
      msg_info[i].msg_type = MFW_SMS_UNKNOWN;
      msg_info[i].addr.number[0] = '\0';
      msg_info[i].addr.tag[0] = '\0';
      msg_info[i].addr.ton = MFW_TON_UNKNOWN;
      msg_info[i].addr.npi = MFW_NPI_UNKNOWN;
      /*SPR 2260, reset new elements*/
      msg_info[i].first_index = -1;
      msg_info[i].concat_status = MFW_SMS_NO_CONC;
      return TRUE;
    }
  }
  
return FALSE;
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE: MFW_SMS              |
| STATE  : code                         ROUTINE: sms_command         |
+--------------------------------------------------------------------+


   PURPOSE :  Send a mobile originated short massage command.

*/

T_MFW sms_command(CHAR *dest_addr, UBYTE command, UBYTE msg_ref)
{
  TRACE_FUNCTION ("sms_command()");

  switch (command)
  {
    case SMS_ENQ_PREV_SMS:
      if (sAT_PlusCMGC(CMD_SRC_LCL,
                       0x22,       // SMS command with Status Report Request
                       0x00,       // Command Type
                       0x00,       // Protocol Identifier
                       msg_ref,    // message reference of previous SMS
                       dest_addr,  // destination address
                       NULL,       // type of destination address
                       NULL)       // command data
                       NEQ AT_EXCT)
        return MFW_SMS_FAIL;
      break;

    case SMS_CAN_STAT_REQ:
      if (sAT_PlusCMGC(CMD_SRC_LCL,
                       0x02,       // SMS command without Status Report Request
                       0x01,       // Command Type
                       0x00,       // Protocol Identifier
                       msg_ref,    // message reference of previous SMS
                       dest_addr,  // destination address
                       NULL,       // type of destination address
                       NULL)       // command data
                       NEQ AT_EXCT)
        return MFW_SMS_FAIL;
      break;

    case SMS_DEL_PREV_SMS:
      if (sAT_PlusCMGC(CMD_SRC_LCL,
                       0x02,       // SMS command without Status Report Request
                       0x02,       // Command Type
                       0x00,       // Protocol Identifier
                       msg_ref,    // message reference of previous SMS
                       dest_addr,  // destination address
                       NULL,       // type of destination address
                       NULL)       // command data
                       NEQ AT_EXCT)
        return MFW_SMS_FAIL;
      break;

    case SMS_REQ_STAT_REP:
      if (sAT_PlusCMGC(CMD_SRC_LCL,
                       0x02,       // SMS command without Status Report Request
                       0x03,       // Command Type
                       0x00,       // Protocol Identifier
                       msg_ref,    // message reference of previous SMS
                       dest_addr,  // destination address
                       NULL,       // type of destination address
                       NULL)       // command data
                       NEQ AT_EXCT)
        return MFW_SMS_FAIL;
      break;
    default:
      /*
       * non-supported command type
       */
      return MFW_SMS_FAIL;
  }
  return MFW_SMS_OK;
}

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

   PURPOSE :  MMI sets the Service Center Number on the SIM

*/

T_MFW sms_set_SrvCntr_number(T_MFW_SMS_INFO *sms_info)
{
  T_ACI_RETURN     res;

  TRACE_FUNCTION ("sms_set_SrvCntr_Nmbr_parameter()");


  if(sms_info == 0)
      return MFW_SMS_FAIL;

  if (sAT_PlusCSCA(CMD_SRC_LCL, (char *)sms_info->sc_addr, 0) NEQ AT_CMPL)
          	return MFW_SMS_FAIL;
      /* Send text mode parameters to ACI */


   if (sAT_PlusCSMP(CMD_SRC_LCL, ACI_NumParmNotPresent, ACI_NumParmNotPresent,
                       NULL, NULL, ACI_NumParmNotPresent,
                       ACI_NumParmNotPresent) NEQ AT_CMPL)
      	    return MFW_SMS_FAIL;

      res = sAT_PlusCSAS(CMD_SRC_LCL, (SHORT) 1);
      switch (res)
      {
        case AT_FAIL:
          return MFW_SMS_FAIL;
        case AT_CMPL:
          sms_signal(E_SMS_OK, 0);
          return MFW_SMS_OK;
        case AT_EXCT:
          return MFW_SMS_OK;
        default:
          return MFW_SMS_FAIL;
      }

  return MFW_SMS_OK;
}

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

   PURPOSE :  MMI sends the dcs data to the sim (control 7bit ascii (compressed),
			  8bit or 16bit (unicode) uncompressed data


*/
T_MFW sms_set_dcs_number(T_MFW_SMS_INFO *sms_info)
{

  TRACE_FUNCTION ("sms_set_dcs_parameter()");


  if(sms_info == 0)
      return MFW_SMS_FAIL;


   if (sAT_PlusCSMP(CMD_SRC_LCL, ACI_NumParmNotPresent, ACI_NumParmNotPresent,
                       NULL, NULL, ACI_NumParmNotPresent,
                       sms_info->dcs ) NEQ AT_CMPL)
      	    return MFW_SMS_FAIL;

  return MFW_SMS_OK;
}


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

   PURPOSE :  MMI sends the Validity Period to the ACI


*/
T_MFW sms_set_val_period(T_MFW_SMS_INFO *sms_info)
{

  TRACE_FUNCTION ("sms_set_val_period()");

  if(sms_info == 0)
      return MFW_SMS_FAIL;

	/*Jan 20, 2006    REF: DRT OMAPS00053377 xdeepadh
	MMI  supports only the relative validity period format.
	Hence, set the validity period format to relative for all the cases*/
	 if ((sms_info->vp_mode EQ SMS_VPF_NUMERICAL) ||(sms_info->vp_mode EQ SMS_VPF_STRING) ||(sms_info->vp_mode EQ SMS_VPF_NOTPRESENT))
      	{
      		
      		 TRACE_EVENT_P1("sms_info->vp_mode  %d",sms_info->vp_mode);
		TRACE_EVENT("MMI  supports only the relative validity period format ");	

		/*Set the TP-Validity-Period-Format (TP-VPF)  bits  to relative format	*/
		sms_info->first_oct  = sms_info->first_oct  | 0x10 ;

      	}

   	 TRACE_EVENT_P1("first_oct is %d",sms_info->first_oct);
	 
   //Send text mode parameters to ACI 
   if (sAT_PlusCSMP(CMD_SRC_LCL, sms_info->first_oct, sms_info->vp_rel,
                       NULL, NULL, ACI_NumParmNotPresent,
                       ACI_NumParmNotPresent) NEQ AT_CMPL)
      	    return MFW_SMS_FAIL;

   return MFW_SMS_OK;
}

//Feb 22, 2006 DR:OMAPS00068268 x0035544 
BOOL Sms_Check_PID(SHORT pid)
{
TRACE_FUNCTION("Sms_Check_PID()");

if(pid & BIT_7)    
{
	if(!(pid & BIT_6)) // Bit 7 = 1 and Bit 6 = 0 
  		return TRUE;
} 
else  
 {
	 if(pid & BIT_6) // Bit 7 = 0 and Bit 6 = 1, Bits 5...0 some values are reserved
	 {
	     if(((pid >= 0x48) AND (pid <= 0x5E)) OR 
		 ((pid >= 0x60) AND (pid <= 0x7B)))
			 return TRUE;
	 }
	 else  
	 {
	  if(pid & BIT_5) // Bit 7 = 0, Bit 6 = 0 and Bit 5 = 1, Bits 4...0 some values are reserved
	   {
	 	  if((pid EQ 0x2E) OR (pid EQ 0x2F) OR 
		    ((pid >= 0x33) AND (pid <= 0x37)))
			  return TRUE;
	   }
    	 }
}
			
return FALSE;
}


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


   PURPOSE :  MMI sets SMS parameters.

*/


T_MFW sms_parameter(T_MFW_SMS_INFO *sms_info, BOOL fGet)
{
  T_ACI_TOA        sc_typ;

  CHAR				sca[MAX_LEN];
  SHORT            first_oct;

  SHORT            vprel;
  T_ACI_VP_ABS     vpabs;
  SHORT            pid;
  SHORT            dcs;
  T_ACI_RETURN     res;
  //x0035544 Feb 22, 2006 DR:OMAPS00068268
  BOOL PIDReserved;

  TRACE_FUNCTION ("sms_parameter()");

  if(sms_info == 0)
      return MFW_SMS_FAIL;

  if(fGet) {

      memset(sms_info, 0, sizeof(T_MFW_SMS_INFO));

      if (qAT_PlusCSCA(CMD_SRC_LCL,
                       sca,
                       &sc_typ) EQ AT_FAIL
          OR qAT_PlusCSMP(CMD_SRC_LCL,
                          &first_oct,
                          &vprel,
                          &vpabs,
                          NULL,
                          &pid,
                          &dcs ) EQ AT_FAIL)
      {

        return MFW_SMS_FAIL;
      }

      if (sc_typ.ton == TON_International)
        sprintf(sms_info->sc_addr, "+%s", sca);
      else
      strcpy((char *)sms_info->sc_addr, (char *)sca);
	//x0035544 Feb 22, 2006 DR:OMAPS00068268	
	PIDReserved = Sms_Check_PID(pid);
	/* If pid value falls in to any of Reserved category then set it to 0 */
	if(PIDReserved) 
		pid = 0;
      sms_info->prot_id = pid;
      sms_info->dcs = dcs;
      sms_info->vp_rel = (UBYTE)vprel;
      memcpy(&sms_info->vp_abs, &vpabs, sizeof(T_MFW_SMS_SCTP));

      if ((first_oct & 0x18) EQ 0x10)
        sms_info->vp_mode = SMS_VPF_NUMERICAL;
      if ((first_oct & 0x18) EQ 0x18)
        sms_info->vp_mode = SMS_VPF_STRING;
      if ((first_oct & 0x18) EQ 0x00)
        sms_info->vp_mode = SMS_VPF_NOTPRESENT;

	sms_info->rd = first_oct >> 2 & 1;
	sms_info->rp = first_oct >> 7 & 1;
	sms_info->srr = first_oct >> 5 & 1;
	/*Jan 20, 2006    REF: DRT OMAPS00053377 xdeepadh
	Store the first octet details in the structure.*/
	sms_info->first_oct = first_oct;

  } else {

      if (sAT_PlusCSCA(CMD_SRC_LCL, (char *)sms_info->sc_addr, 0) NEQ AT_CMPL)
      	{
        	return MFW_SMS_FAIL;
      	}
      /* Send text mode parameters to ACI */
      if (sms_info->vp_mode EQ SMS_VPF_NUMERICAL)
        first_oct = 0x11;
      if (sms_info->vp_mode EQ SMS_VPF_STRING)
        first_oct = 0x19;
      if (sms_info->vp_mode EQ SMS_VPF_NOTPRESENT)
        first_oct = 0x01;

      first_oct |= sms_info->rd << 2;
      first_oct |= sms_info->rp << 7;
      first_oct |= sms_info->srr << 5;

      if (sAT_PlusCSMP(CMD_SRC_LCL, first_oct, sms_info->vp_rel,
                       (T_ACI_VP_ABS *)&sms_info->vp_abs, NULL, sms_info->prot_id,
                       sms_info->dcs) NEQ AT_CMPL)
      	{
    	    return MFW_SMS_FAIL;
      	}
      res = sAT_PlusCSAS(CMD_SRC_LCL, (SHORT) 1);
      switch (res)
      {
        case AT_FAIL:
          return MFW_SMS_FAIL;
        case AT_CMPL:
          sms_signal(E_SMS_OK, 0);
          return MFW_SMS_OK;
        case AT_EXCT:
          return MFW_SMS_OK;
        default:
          return MFW_SMS_FAIL;
      }
  }

  return MFW_SMS_OK;
}


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


   PURPOSE :  SMS busy indication to MMI.

*/

void sms_busy_ind(void) // bugfix for SIM refresh
{
  int_req = 0;
  sms_signal(E_SMS_BUSY, 0);
}


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


   PURPOSE :  MMI sets SMS cell broadcast parameters.

*/

T_MFW sms_set_cell_broadcast_info(UBYTE mode, T_MFW_SMS_CB_INFO *sms_cb_info)
{
  T_ACI_RETURN     res;

  TRACE_FUNCTION ("sms_set_cell_broadcast_info()");
	/*SPR 2470, if the Channel ID list is empty, the mode logic is inverted due to the warped logic of 
	AT commands*/
	
	/*if we are disabling cell broadcast*/
	if (mode == 1)
	{	/* and the channel ID list is empty*/
		if (sms_cb_info->msg_id[0] == 0xFFFF)
			mode =0;
	}
	/*if we are enabling cell broadcast*/
	else
	{	/* and the channel ID list is empty*/
		if (sms_cb_info->msg_id[0] == 0xFFFF)
			mode =1;
	}

  if (sAT_PlusCSCB(CMD_SRC_LCL, mode, sms_cb_info->msg_id, sms_cb_info->dcs) NEQ AT_CMPL)
    return MFW_SMS_FAIL;

  res = sAT_PlusCSAS(CMD_SRC_LCL, (SHORT) 1);
  switch (res)
  {
    case AT_FAIL:
      return MFW_SMS_FAIL;
    case AT_CMPL:
      sms_signal(E_SMS_OK, 0);
      return MFW_SMS_OK;
    case AT_EXCT:
      return MFW_SMS_OK;
    default:
      return MFW_SMS_FAIL;
  }

    return MFW_SMS_OK;
}

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


   PURPOSE :  MMI gets SMS cell broadcast parameters.

*/
#ifdef FF_2TO1_PS
T_MFW sms_get_cell_broadcast_info(T_MFW_SMS_CB_INFO *sms_cb_info)
{
  T_ACI_CSCB_MOD   mode;
  USHORT            mids[CBM_MAX_RANGE_NUMBER];
  UBYTE            dcss[CBM_MAX_RANGE_NUMBER];
  UBYTE            c_mids, c_dcss;
  TRACE_FUNCTION ("sms_get_cell_broadcast_info()");

  memset(dcss,0xFF,CBM_MAX_RANGE_NUMBER);
  memset(mids,0xFFFF,CBM_MAX_RANGE_NUMBER);

  if (qAT_PlusCSCB(CMD_SRC_LCL, &mode, &c_mids, mids, &c_dcss, dcss) EQ AT_CMPL)
  {

    sms_cb_info->mode   = mode;
    memcpy((char *)sms_cb_info->dcs, (char *)dcss, CBM_MAX_RANGE_NUMBER);

     memcpy((char *)sms_cb_info->msg_id, (char *)mids, sizeof(mids));

    return MFW_SMS_OK;
  }
  else
    return MFW_SMS_FAIL;
}
#else
T_MFW sms_get_cell_broadcast_info(T_MFW_SMS_CB_INFO *sms_cb_info)
{
  T_ACI_CSCB_MOD   mode;
  USHORT            mids[MAX_IDENTS];
  UBYTE            dcss[MAX_IDENTS];

  TRACE_FUNCTION ("sms_get_cell_broadcast_info()");

  memset(dcss,0xFF,MAX_IDENTS);
  memset(mids,0xFFFF,MAX_IDENTS);

  if (qAT_PlusCSCB(CMD_SRC_LCL, &mode, mids, dcss) EQ AT_CMPL)
  {

    sms_cb_info->mode   = mode;
    memcpy((char *)sms_cb_info->dcs, (char *)dcss, MAX_IDENTS);

     memcpy((char *)sms_cb_info->msg_id, (char *)mids, sizeof(mids));

    return MFW_SMS_OK;
  }
  else
    return MFW_SMS_FAIL;
}


#endif

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


   PURPOSE :  Call back to inform about the successful sending of
              a mobile originated short massage.

*/

void rAT_PlusCMGS(UBYTE mr, UBYTE numSeg)
{
  TRACE_FUNCTION ("rAT_PlusCMGS()");

   if(coll_sms_send EQ MFW_SMS_WAIT)
		coll_sms_send = MFW_SMS_FREE;

  sms_check_mt_update();
#if defined (FF_WAP) && defined (FF_GPF_TCPIP)

  /* SPR#2086 - SH - Check if it's a WAP SMS */
  if (sms_wap_sent_flag)
  {
  	sms_wap_sent_flag = FALSE;
    sms_signal(E_SMS_WAP_MO_SENT, &mr);
  }
  else
  {
    sms_signal(E_SMS_MO_AVAIL, &mr);
  }
#else
  sms_signal(E_SMS_MO_AVAIL, &mr);
#endif
}


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


   PURPOSE :  Call back to inform about the successful sending of a
              mobile originated short massage command.

*/

void rAT_PlusCMGC(UBYTE mr)
{
  TRACE_FUNCTION ("rAT_PlusCMGC()");

  sms_check_mt_update();

  sms_signal(E_SMS_CMD_AVAIL, &mr);
}


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


   PURPOSE :  Report the error result on failures of the last
              executed functions

*/

void rAT_PlusCMS (T_ACI_AT_CMD cmdId, T_ACI_CMS_ERR err, T_EXT_CMS_ERROR *ce)
{
  T_MFW_SMS_CMD_IND cmd_ind;

  TRACE_FUNCTION ("rAT_PlusCMS()");
  TRACE_EVENT_P1("Error: %d",cmdId);

  switch (cmdId)
  {
    case AT_CMD_CMGS:
    case AT_CMD_CMSS:
      cmd_ind = CMD_SMS_SUBMIT;
      coll_sms_send = MFW_SMS_FREE;

#if defined (FF_WAP) && defined (FF_GPF_TCPIP)
        
        /* SPR#2086 - SH - Check if it's a WAP SMS */
 	  if (sms_wap_sent_flag)
  	  {
    	    sms_wap_sent_flag = FALSE;
            sms_signal(E_SMS_WAP_ERR, &cmd_ind);
        }
        else
        {
            sms_signal(E_SMS_ERR, &cmd_ind);
        }
#else
      sms_signal(E_SMS_ERR, &cmd_ind);
#endif
      break;

    case AT_CMD_CMGC:
      cmd_ind = CMD_SMS_COMMAND;
      coll_sms_req = MFW_SMS_FREE;
      sms_signal(E_SMS_ERR, &cmd_ind);
      break;

    case AT_CMD_CPMS:
      cmd_ind = CMD_SMS_MEMORY;
      sms_signal(E_SMS_ERR, &cmd_ind);
      break;

    case AT_CMD_CMGR:
      cmd_ind = CMD_SMS_READ;
      coll_sms_read = MFW_SMS_FREE;
      sms_signal(E_SMS_ERR, &cmd_ind);
      break;

    case AT_CMD_CMGL:
      cmd_ind = CMD_SMS_READ;
      coll_sms_read = MFW_SMS_FREE;
      sms_signal(E_SMS_ERR, &cmd_ind);
      sms_ok_CMGL(); /*JVJ SPR1118 This case has been added to handle the Error of CMGL
                       when the SIM Card has no messages. Even without SMS in the SIM card,
                       the call to qAT_PlusCPMS to query the memory status is still needed */
      break;

    case AT_CMD_CMGW:
      sms_type = MFW_NO_MESSAGE;
      cmd_ind = CMD_SMS_STORE;
      coll_sms_send = MFW_SMS_FREE;
      sms_signal(E_SMS_ERR, &cmd_ind);
      break;

    case AT_CMD_CMGD:
      cmd_ind = CMD_SMS_SET_PARA;
      coll_sms_delete = MFW_SMS_FREE;
      sms_signal(E_SMS_ERR, &cmd_ind);
      break;

    case AT_CMD_CSAS:
      cmd_ind = CMD_SMS_DELETE;
      sms_signal(E_SMS_ERR, &cmd_ind);
      break;
  }

  sms_check_mt_update();
}


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

  PURPOSE : This function is used to request the preferred SMS memory
*/
T_MFW sms_get_memset(void)
{
    TRACE_FUNCTION ("sms_get_memset()");

    coll_sms_req = MFW_SMS_WAIT;

    if (qAT_PlusCPMS(CMD_SRC_LCL) EQ AT_EXCT)
        return MFW_SMS_OK;
    return MFW_SMS_FAIL;
}


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

  PURPOSE : Call back for request of preferred SMS memory.
*/

GLOBAL void rAT_PlusCPMS (T_ACI_SMS_STOR_OCC * mem1,
                          T_ACI_SMS_STOR_OCC * mem2,
                          T_ACI_SMS_STOR_OCC * mem3)
{
    T_MFW_SMS_MEM_INFO sms_mem;

    TRACE_FUNCTION ("rAT_PlusCPMS");

    sms_mem.mem = mem1->mem;
    sms_mem.used = (UBYTE)mem1->used;
    sms_mem.total = (UBYTE)mem1->total;

    memory.total = (UBYTE)mem1->total;
    memory.used = (UBYTE)mem1->used;
    /* HLE temp for testing iface and for WIN32 simulation */

#if defined (WIN32)
	mem1->total = 10;
#endif

	if(coll_sms_req EQ MFW_SMS_WAIT)
        coll_sms_req = MFW_SMS_FREE;

    if (int_req || int_init_req)
    {	TRACE_EVENT_P2("memory.used:%d,memory.total:%d",mem1->used, mem1->total);
        memory.mem = mem1->mem;
        memory.used = (UBYTE)mem1->used;
        memory.total = (UBYTE)mem1->total;
		if (int_req ==FIRST_READ_OF_MEMORY_USE)
        	sms_signal(E_SMS_READY, 0);
        int_req = 0;
        int_init_req = 0;

        if (mem1->used == mem1->total)
            sms_signal(E_SMS_MEM_FULL, 0);

#ifdef SIM_TOOLKIT
        if (sms_update)
        {
            sms_update = FALSE;
            sms_sat_update_cnf();
        }
#endif
        return;
    }
    else
        sms_signal(E_SMS_MEM, &sms_mem);

  sms_check_mt_update();
}


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

  PURPOSE : Request number of SMS message

*/

SHORT sms_message_count (T_MFW_SMS_STAT stat)
{
    SHORT count;
    int i;
    TRACE_FUNCTION("sms_message_count");

    count = 0;
    if ((stat == MFW_SMS_UNREAD)
        OR (stat == MFW_SMS_READ)
        OR (stat == MFW_SMS_STOR_UNSENT)
        OR (stat == MFW_SMS_STOR_SENT))
    {
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
        for (i=0; i<MAX_MESSAGES; i++)
#endif
        {
// PATCH JPS 20.09 - Don't look at SMS with index -1 because it means it is deleted
			if (msg_info[i].index != -1)
			{

				if (msg_info[i].stat == stat)
					count++;
			}
// PATCH JPS 20.09 END - Don't look at SMS with index -1 because it means it is deleted
        }
        return count;
    }

    if (stat == MFW_SMS_ALL)
    {
#ifdef FF_MMI_SMS_DYNAMIC
       for (i=0; i<g_max_messages; i++)
#else
        for (i=0; i<MAX_MESSAGES; i++)
#endif
        {
            if (msg_info[i].index != -1)
                count++;
        }
        return count;
    }

    if (stat == MFW_SMS_MO)
    {
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
        for (i=0; i<MAX_MESSAGES; i++)
#endif
        {
// PATCH JPS 20.09 - Don't look at SMS with index -1 because it means it is deleted
			if (msg_info[i].index != -1)
			{
				if ((msg_info[i].stat == MFW_SMS_STOR_UNSENT)
				   OR (msg_info[i].stat == MFW_SMS_STOR_SENT))
					count++;
			}
// PATCH JPS 20.09 END - Don't look at SMS with index -1 because it means it is deleted
		}
        return count;
    }
    if (stat == MFW_SMS_MT)
    {
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
        for (i=0; i<MAX_MESSAGES; i++)
#endif
        {
// PATCH JPS 20.09 - Don't look at SMS with index -1 because it means it is deleted
			if (msg_info[i].index != -1)
			{
				if ((msg_info[i].stat == MFW_SMS_UNREAD)
					OR (msg_info[i].stat == MFW_SMS_READ))
					count++;
			}
// PATCH JPS 20.09 END - Don't look at SMS with index -1 because it means it is deleted
		}
        return count;
    }
    if (stat == MFW_SMS_VOICE)
    {
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
        for (i=0; i<MAX_MESSAGES; i++)
#endif
        {
// PATCH JPS 20.09 - Don't look at SMS with index -1 because it means it is deleted
			if (msg_info[i].index != -1)
			{
				if (msg_info[i].msg_type == stat)
					count++;
			}
// PATCH JPS 20.09 END - Don't look at SMS with index -1 because it means it is deleted
        }
        return count;
    }
    return 0;
}


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

  PURPOSE : Request a stored message list

  Note: msg_type is not used in this implementation
*/

SHORT sms_message_list(T_MFW_SMS_STAT stat,
                       T_MFW_SMS_MSG * msg_list,
                       int max_entries)
{
    SHORT count;
    int i;

    TRACE_FUNCTION("sms_message_list()");

    count = 0;
    switch (stat)
    {
        case MFW_SMS_ALL:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if (msg_info[i].index != -1)
                {
					sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_MO:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)

#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND ((msg_info[i].stat == MFW_SMS_STOR_UNSENT)
                         OR (msg_info[i].stat == MFW_SMS_STOR_SENT)))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_STOR_UNSENT:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_STOR_UNSENT))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_STOR_SENT:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_STOR_SENT))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_MT:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND ((msg_info[i].stat == MFW_SMS_UNREAD)
                         OR (msg_info[i].stat == MFW_SMS_READ)))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_UNREAD:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_UNREAD))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_READ:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_READ))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_VOICE:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].msg_type == MFW_SMS_VOICE))
                {
                    sms_copy_msg_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        default:
            return count;
    }
}


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

  PURPOSE : copy a stored message list

*/

void sms_copy_msg_list(int num, T_MFW_SMS_MSG *msg_list)
{
    TRACE_FUNCTION("sms_copy_msg_list()");

	  msg_list->index = msg_info[num].index;
    /*
     * forward message reference to MMI
     */
    msg_list->msg_ref = msg_info[num].msg_ref;
    msg_list->stat = msg_info[num].stat;
    msg_list->msg_type = msg_info[num].msg_type;
    strcpy(msg_list->addr.number, msg_info[num].addr.number);
    msg_list->addr.ton = msg_info[num].addr.ton;
    msg_list->addr.npi = msg_info[num].addr.npi;
//	 March 31, 2005    REF: CRR MMI-SPR-24511   x0012852
//     first_index, concat_status are also added to use it  later on.
    msg_list->concat_status =  msg_info[num].concat_status;
    msg_list->first_index =  msg_info[num].first_index; 

#ifdef NO_ASCIIZ
    memcpy(msg_list->addr.tag,
           msg_info[num].addr.tag,
           msg_info[num].addr.len);
    msg_list->addr.len = msg_info[num].addr.len;
#else
    strcpy(msg_list->addr.tag, msg_info[num].addr.tag);
#endif
	memcpy(&msg_list->rctp, &msg_info[num].rctp, sizeof(T_MFW_SMS_SCTP));
}

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

  PURPOSE : Setting of SMS parameter/cell broadcast parameter
            is successful.

*/

void sms_ok_csas(void)
{
  TRACE_FUNCTION("sms_ok_csas() ");
  sms_signal(E_SMS_OK, 0);

  sms_check_mt_update();
}

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

  PURPOSE : Setting of SMS parameter/cell broadcast parameter
            is failed.

*/

void sms_error_csas(void)
{
  sms_signal(E_SMS_ERR, 0);
}

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

  PURPOSE : This function is used to convert the status
            used by MFW to the status used by ACI.
*/

T_ACI_SMS_STAT sms_codeStatus(T_MFW_SMS_STAT stat)
{
    switch (stat)
    {
        case MFW_SMS_UNREAD:        return SMS_STAT_RecUnread;
        case MFW_SMS_READ:          return SMS_STAT_RecRead;
        case MFW_SMS_STOR_UNSENT:   return SMS_STAT_StoUnsent;
        case MFW_SMS_STOR_SENT:     return SMS_STAT_StoSent;
        case MFW_SMS_ALL:           return SMS_STAT_All;
        default:                    return SMS_STAT_NotPresent;
    }
}


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

  PURPOSE : This function is used to convert the status
            used by ACI to the status used by MFW.
*/

T_MFW_SMS_STAT sms_decodeStatus(T_ACI_SMS_STAT stat)
{
    switch (stat)
    {	case SMS_STAT_Invalid:		return MFW_SMS_INVALID;/*SPR 2260*/
        case SMS_STAT_RecUnread:        return MFW_SMS_UNREAD;
        case SMS_STAT_RecRead:          return MFW_SMS_READ;
        case SMS_STAT_StoUnsent:        return MFW_SMS_STOR_UNSENT;
        case SMS_STAT_StoSent:          return MFW_SMS_STOR_SENT;
        case SMS_STAT_All:              return MFW_SMS_ALL;
        default:               
      	    return MFW_SMS_UNKNOWN;
    }
}


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

  PURPOSE : get cell broadcast message identifier
            cbmid: array for cell broadcast message identifier
            len:    size of array

*/

void sms_get_cbm_id (USHORT *cbmid, UBYTE len)
{
    UBYTE max;
    int   i;
    int   p;

    if (len > 6) /* maximal 5 cell broadcast message identifiers + '\0' */
        max = 6;
    else
        max = len;

    p = 0;
    // from 0-4
    for (i=0; i<(max-1); i++)
    {
        if (cb_mid[p] == 0xFF AND cb_mid[p+1] == 0xFF)
            break;
        cbmid[i] = ( ( SHORT )cb_mid[p] << 8 ) + cb_mid[p+1];
        p += 2;
    }
    cbmid[i] = '\0';
}


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

  PURPOSE : save cell broadcast message identifier

*/

void sms_save_cbm_id (USHORT *cbmid, UBYTE len)
{
    int   i;
    UBYTE p;
    UBYTE max;

    memset(cb_mid, 0xFF, sizeof(cb_mid));

    if (len > 5)
        max = 5;
    else
        max = len;

    p = 0;
    for (i=0; i<max; i++)
    {
        if (!cbmid[i])
            break;

        cb_mid[p++] = (UBYTE)(cbmid[i] >> 8);
        cb_mid[p++] = (UBYTE)cbmid[i];
    }

    memset(data, 0xFF, sizeof(data));

    memcpy(data, cb_mid, 10);

    sim_write_sim(SIM_CBMI, data, 10);
}


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

  PURPOSE : save cell broadcast message identifier

*/

void sms_check_mt_update()
{
  TRACE_EVENT("sms_check_mt_update() ");

if (sms_id.index > 0)
  {
	sms_send_new_msg_ind(NULL,sms_id.index, sms_id.mem, sms_id.received_sms_type, sms_id.concat_status);

    sms_id.index = 0;
  }
  if (sms_id_wait.index > 0)
  {
  sms_send_new_msg_ind(NULL,sms_id_wait.index, sms_id_wait.mem, sms_id_wait.received_sms_type, sms_id_wait.concat_status);

    sms_id_wait.index = 0;

  }


}

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

  PURPOSE : Check voice mail.

*/

T_MFW sms_check_voice_mail(UBYTE pid, UBYTE dcs, char *addr,
                           T_ACI_TOA *toa, T_ACI_UDH_DATA *udh)
{	T_MFW status =MFW_SMS_UNKNOWN;//MC
    TRACE_FUNCTION("sms_check_voice_mail()");

  if (dcs == 0xC0      /* check data coding scheme */
      OR dcs == 0xC8
      OR dcs == 0xD0
      OR dcs == 0xD8
      OR dcs == 0xE0
      OR dcs == 0xE8)
  	{
    	
    	status = MFW_SMS_VOICE;
  	}
  else if (udh->len > 0
           AND udh->data[0] == 0x01
           AND (udh->data[2] == 0x80 OR udh->data[2] == 0x00)) /* check user data header */
  	{
  		status = MFW_SMS_VOICE;
    	
  	}

// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
// Voice mail identification is already done using dcs. Identification should not be done using pid. Check commented
//  else if (pid == 0x5F OR pid ==0x42 /*On power-up check pid to determine SMS VM */)                              /* check message identifier */
/*  	{	status = MFW_SMS_VOICE;
    	
  	} */
  else if (toa->ton == TON_Alphanumeric
  		 // 0x30 special case for one-2-one when voice mail has been deleted.
           AND (addr[0] == 0x10 OR addr[0] == 0x11 OR addr[0]==0x31 OR addr[0]==0x30)) /* check CPHS */
  	{
  		// Fix for one-2-one VM icon control. 26/6/01 MZ
  		if(addr[0]==0x30)
  		{
  			Delete_1_2_1_vm_icon = TRUE;
	  		Display_1_2_1_vm_icon = FALSE;
  		}
  		else if(addr[0]==0x31 && Delete_1_2_1_vm_icon == FALSE)
  			Display_1_2_1_vm_icon = TRUE;

  		status = MFW_SMS_VOICE;
    	
  	}
	TRACE_EVENT_P2("Addr[0]:%x, Addr[1]:%x", addr[0], addr[1]);
	TRACE_EVENT_P2("Addr[2]:%x, Addr[3]:%x", addr[2], addr[3]);
  /*MC1364, improved this to check if voicemail indicator to be set or cleared*/

// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
// Instead of identifying voice mail ON (indication)/OFF(deletion) using addr[0], we use dcs.
// (addr[0]&0x01) condition replaced with (dcs & 0x08) 
       if ((status == MFW_SMS_VOICE) && (dcs & 0x08)) //if a voicemail indication
  	{	
  		Delete_1_2_1_vm_icon = FALSE;/*SPR2260*/
	  	Display_1_2_1_vm_icon = TRUE;
  		/*MC, if MSB set, bit 0 of second char in 7-bit encoding)*/
 	 	if (addr[1] & 0x08) /*SPR 2260 experimentally, bit set by orange*/
  			cphs_set_mailbox_status(0,MFW_CFLAG_SET , 0, 0);/*set line2*/
  		else
  			cphs_set_mailbox_status(MFW_CFLAG_SET, 0, 0, 0);/*set line1*/
  	}
	if ((status == MFW_SMS_VOICE) && !(dcs & 0x08)) //if a voicemail deletion
  	{	
		Delete_1_2_1_vm_icon = TRUE;/*SPR2260*/
	  	Display_1_2_1_vm_icon = FALSE;
  		/*MC, if MSB set, bit 0 of second char in 7-bit encoding)*/
 	 	if (addr[1] & 0x08) /*SPR 2260 experimentally, bit set by orange*/
  			cphs_set_mailbox_status(0,MFW_CFLAG_NOTSet , 0, 0);/*clear line2*/
  		else
  			cphs_set_mailbox_status(MFW_CFLAG_NOTSet, 0, 0, 0);/*clear line1*/
  	}
// Feb 16, 2005 REF: CRR MMI-SPR-27900 xnkulkar 
// If voicemail message is from group "1100", update status as MFW_SMS_VOICEMSG_DELETE
	if ((status == MFW_SMS_VOICE) && ((dcs & 0xF0) == 0xC0)) 
	{
		status = MFW_SMS_VOICEMSG_DELETE;
		invalidVm = TRUE; // set this flag to TRUE to indicate that this voice mail sms is to be deleted
	}
  	
    return status;
}

#ifdef SIM_TOOLKIT
/*
+---------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)   MODULE  : MFW_SMS                  |
| STATE   : code                   ROUTINE : sms_sat_file_update      |
+---------------------------------------------------------------------+

  PURPOSE : SIM file change indication

*/

void sms_sat_file_update(USHORT dataId)
{
  TRACE_FUNCTION("sms_sat_file_update()");

  sms_update = TRUE;
  switch (dataId)
  {
    case SIM_SMS:
      sms_read_msg_info();
      break;
    default:
      break;
  }
}
#endif

#ifdef SIM_TOOLKIT
/*
+---------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)   MODULE  : MFW_SMS                  |
| STATE   : code                   ROUTINE : sms_sat_update_cnf       |
+---------------------------------------------------------------------+

  PURPOSE : SIM file change indication

*/

void sms_sat_update_cnf (void)
{
    TRACE_FUNCTION("sms_sat_update_cnf()");
    satUpdateFiles ( TRUE, SIM_SMS );
}
#endif

/* PATCH JPS 29.09: like sms_message_list but returns only index and status */

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

  PURPOSE : Request a stored message index and status
*/

SHORT sms_index_list(T_MFW_SMS_STAT stat,
                       T_MFW_SMS_IDX * msg_list,
                       int max_entries)
{
    SHORT count;
    int i;

    TRACE_FUNCTION("sms_index_list()");

    count = 0;
    switch (stat)
    {
        case MFW_SMS_ALL:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if (msg_info[i].index != -1)
                {
					sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_MO:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND ((msg_info[i].stat == MFW_SMS_STOR_UNSENT)
                         OR (msg_info[i].stat == MFW_SMS_STOR_SENT)))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_STOR_UNSENT:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_STOR_UNSENT))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_STOR_SENT:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_STOR_SENT))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_MT:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND ((msg_info[i].stat == MFW_SMS_UNREAD)
                         OR (msg_info[i].stat == MFW_SMS_READ)))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_UNREAD:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_UNREAD))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_READ:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].stat == MFW_SMS_READ))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        case MFW_SMS_VOICE:
#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
            for (i=0; i<MAX_MESSAGES; i++)
#endif
            {
                if (count >= max_entries)
                    return count;

                if ((msg_info[i].index != -1)
                    AND (msg_info[i].msg_type == MFW_SMS_VOICE))
                {
                    sms_copy_idx_list(i, &msg_list[count]);
                    count++;
                }
            }
            return count;

        default:
            return count;
    }
}


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

  PURPOSE : copy the index and status of a short message

*/

void sms_copy_idx_list(int num, T_MFW_SMS_IDX *msg_list)
{
    TRACE_FUNCTION("sms_copy_idx_list()");

	  msg_list->index = msg_info[num].index;
    /*
     * forward message reference to MMI
     */
    msg_list->stat = msg_info[num].stat;
    msg_list->msg_type = msg_info[num].msg_type;

}
void sms_copy_idx(UBYTE index, T_MFW_SMS_IDX *msg_list)
{int i;
    TRACE_FUNCTION("sms_copy_idx()");

#ifdef FF_MMI_SMS_DYNAMIC
        for (i=0; i<g_max_messages; i++)
#else
	for (i=0;i<MAX_MESSAGES; i++)
#endif
	{
	    if (index==msg_info[i].index)
    	/*
     	* forward message reference to MMI
     	*/
    	{	
		msg_list->concat_status = msg_info[i].concat_status;/*SPR 2260*/
	       msg_list->stat = msg_info[i].stat;
    		msg_list->msg_type = msg_info[i].msg_type;
    		break;
    	}
	}
}

//GW-SPR#780 - Removed procedure - status is already updated by 'sms_change_read_status'
/* PATCH JPS 29.09 END */
/*
+---------------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS                |
| STATE   : code                         ROUTINE : sms_ok_CMGL             |
+---------------------------------------------------------------------------+

  PURPOSE : End of the rAT_PlusCMGL()

*/
void sms_ok_CMGL (void)
{
        TRACE_FUNCTION("sms_ok_CMGL: rAT_PlusCMGL cmpl");
			  /* request default memory */
          f_update = MFW_SMS_FREE;
          int_req = FIRST_READ_OF_MEMORY_USE;/*SPR2260*/

          qAT_PlusCPMS(CMD_SRC_LCL);
}



//Jun 14, 2005 REF: MMI-FIX-30439 x0018858
//begin 30439
/*
+---------------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)         MODULE  : MFW_SMS                |
| STATE   : code                         ROUTINE : sms_homezoneCBToggle    |
+---------------------------------------------------------------------------+

  PURPOSE : 

*/
#ifndef NEPTUNE_BOARD

//Dec 14, 2005 REF: MMI-FIX-OMAPS00058684 x0035544
#ifdef FF_HOMEZONE
void sms_homezoneCBToggle(U8 Activate_CB)
{
	  T_ACI_RETURN    ret;
	  T_ACI_CBHZ_MOD  mode;
	  T_ACI_CS        dcs;
	  UBYTE           timeout;
	  int def_dcs = 0;
	  int def_timeout = 60;

       TRACE_FUNCTION("sms_homezoneCBToggle()");

	ret = qAT_PercentCBHZ(CMD_SRC_LCL , &mode, &dcs, &timeout);

	if (ret EQ AT_FAIL)
	{
	//Aug 16, 2005 REF: MMI-FIX-30439 x0018858
	//Incase the querying fails, we still wil have to activate/ de-activate with default 
	//values for dcs and timeout
		if(1 == Activate_CB )
		{
			TRACE_FUNCTION("ACTIVATING HOMEZONE");
			ret = sAT_PercentCBHZ(CMD_SRC_LCL , CBHZ_MOD_Active,def_dcs,def_timeout);
		}
		else
		{
			TRACE_FUNCTION("DE-ACTIVATING HOMEZONE");
			ret = sAT_PercentCBHZ(CMD_SRC_LCL , CBHZ_MOD_NotActive,def_dcs,def_timeout);	
		}

		return;
	}


	if(1 == Activate_CB )
	{
		TRACE_FUNCTION("ACTIVATING HOMEZONE");
		ret = sAT_PercentCBHZ(CMD_SRC_LCL , CBHZ_MOD_Active,dcs,timeout);
	}
	else
	{
		TRACE_FUNCTION("DE-ACTIVATING HOMEZONE");
		ret = sAT_PercentCBHZ(CMD_SRC_LCL , CBHZ_MOD_NotActive,dcs,timeout);	
	}
	return;

}
//end 30439
#endif
#endif

