view src/ui/bmi/mmiBookUtils.c @ 123:2d8124accc74

mmiSimToolkit.h: bogotab fixes
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 10 Nov 2020 06:01:15 +0000
parents c0052fe355d3
children ec9f955fc487
line wrap: on
line source

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

					CONDAT (UK)

********************************************************************************

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.

********************************************************************************

 $Project name:	Basic MMI
 $Project code:	BMI (6349)
 $Module:		PhoneBook
 $File:		    MmiBookUtils.c
 $Revision:		1.0

 $Author:		Condat(UK)
 $Date:		    25/10/00

********************************************************************************

 Description:

    This module provides utility function for use in the
    phone book application

********************************************************************************
 $History: MmiBookUtils.c
        $History: MmiBookUtils.c

		Aug 09, 2007 DR:OMAPS00140447 x0056422(Srilekha)
		Description: PhoneBook: Unexpected confirmation message when making changes to entries in SIM storage.
		Solution: Added a new flag changename_flag to handle the Phonebook-SIM Memory entry changed event.

 	17 Aug, 2007  DR: OMAPS00141963 x0066814(Geetha)
 	Description: PhoneBook: The "Options" menu is not returned after a current entry is copied.
	 Solution: After copying, the menu control was not being returned back to the right window.
 	Added a callback, that will be called after copying an entry, where the control wil be returned to
	 correct window.

     July 11, 2007 DR:OMAPS00137908 x00666692(Asha)
     Description:PHONEBOOK: changing name or number under SIM storage, Please Wait message
    appears instead of Saved
    Solution     :Changes made to handle the condition MFW_PHB_EXCT in the function changeInFile()
       	which modifies the phone book entry.

        27 June, 2007  DR: OMAPS00136608 x0073106(sundeep)
        Description:PHONEBOOK-Unexpected behavior when copying all entries from Phone to SIM
        Solution     :Updated the execution state(MFW_PHB_EXCT) in the phonebook.

       June 27, 2007 DR:OMAPS00136627 x0062172(Syed)
    		Description:PHONEBOOK: Unexpected behavior when moving all entries from Phone to SIM
             Solution     : Return Proper Value after phb_store_entry() in bookCopy  to move all the entries
	       			properly.

       June 05, 2007 DR:OMAPS00133241 x0061560(sateeshg)
       Description:ASTEC29607,SIM:The sim card should not return 9240 still.
       Solution     :MMI should not display "Saved" after db is updated but has to wait until SIM is
       			updated with the entry and RAT_OK is received from ACI.


 	June 06, 2007 DR:OMAPS00132045 x0073106 Sundeep
 	Description : Phonebook- behaviour inconsistency in the MMI when move contact
 	Solution     : changed a if condition in function bookCopyMultiple(), in the if(move).


       JUNE 4,07 (sateeshg) OMAPS00131777, x0061560
       Phonebook - Delete all command for phonebook contacts answer "list empty" even if there are contacts in the list
	Solution:Updated the current status of the phonebook

	Apr 30,2007, OMAPS00129173, x0066814(Geetha)
	Description : Phone crashes if 'Delete All' is done on SIM contacts when SIM memory is empty
	Solution: Added a condition in bookDeleteBook to check the number of used entries in the seleted phonebook.
	If the condition is satified then the delete operation will proceed else an 'Empty List' dialog is displayed.

       Nov 17, 2006 DR:OMAPS00104376 a0393213(R.Prabakar)
       Description : When tried to delete the last entry either incase of SIM or Phone book (i.e. last deletion), the board resets.
       Solution     : The crash happens because of race condition between actual deletion by ACI and status check in BMI.
       Now the status before deletion is stored and status check is done on this previous status.

	Aug 18, 2006   ER: OMAPS00089840  x0039928
	Description: Changes to be made in MMI for the functionality "Delete all" ADN entries
	Solution: A new menu item "Delete All" is added in the phone book menu and bookDeleteBook
	is called to delete all the phone book entries.

	July  17, 2006  DR: OMAPS00082792  x0039928
	Description:Changes to be done in MMI for Move all entries from SIM to FFS (Defect 76492)
	Solution: Condition to delete search window in deleteFromFile is modified.

	June 01, 2006  DR: OMAPS00079716
	Description:Phonebook: List of entries is not refreshed after a phonebook entry move
	Solution: Added a new callback function to handle the populating of phonebook entries

	Feb 20, 2006 REF: OMAPS00061948  x0039928
	Bug:PhoneBook-My number menu -failed.
 	Fix: phb_read_entries is called with used entries as the no of entries if used entries are less than
 	MAX_SEARCH_NAME.

	Jan 27, 2006 REF: OMAPS00061925  x0039928
	Bug:Phonebook-Changing an entry and Immidiately deleting the entry failed.
 	Fix: Phonebook is populated with phone numbers after some time and not immediately after deleting an entry.

	Jan 22, 2006 REF: OMAPS00061930  x0039928
	Bug:PhoneBook -Change entry and view entry through Change option-failed
 	Fix: Phonebook is populated with phone numbers after some time and not immediately while saving the changed entries.

	25/10/00			Original Condat(UK) BMI version.

 $End

// Issue Number : SPR#15671 on 24/03/04 by Ajith K.P

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



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

                                Include Files

*******************************************************************************/
#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

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

#else

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

#endif

#include "mfw_sys.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_lng.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_tim.h"

#include "mfw_sim.h"
#include "mfw_cm.h"
#include "mfw_nm.h"
#include "mfw_phb.h"
#include "mfw_mme.h"
#include "mfw_sat.h"
#include "mfw_sms.h"

#include "dspl.h"

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

#include "MmiMain.h"
#include "MmiBookController.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiLists.h"



#include "MmiMenu.h"
#include "mmiCall.h"
#include "Mmiicons.h"
#include "MmiIdle.h"

#include "MmiSoftKeys.h"
#include "MmiSounds.h"
#include "MmiIdle.h"
#include "MmiNetwork.h"
#include "mmiSat_i.h"
#include "MmiAoc.h"

#include "gdi.h"
#include "audio.h"

#include "cus_aci.h"
#include "mfw_ffs.h"
#include "MmiTimers.h"

#include "MmiBookShared.h"

#include "mmiColours.h"
#include "mmiSmsRead.h"/*MC , SPR 1242 */

//  May 24, 2004 REF: CRR MMI-SPR-15813 Ajith K P
//  Issue description: Followup from 15623, this is the BMI part of this Issue.
//	At last, in the record "SSC09" the number is displayed with the "+"
//	character at the beginning of the number instead of "**21*+014543877989#".


extern int menuFDN;
extern T_call call_data;
// Jan 27, 2006 REF: OMAPS00061925  x0039928
// Fix : Declare a extern phonebook timer handler
extern T_MFW_HND PhbSearchTim;

// Aug 18, 2006   ER: OMAPS00089840  x0039928
// Fix : Initialize Delete All flag and a window handler of please wait dialog.
BOOL DeleteAll_flag = FALSE;
T_MFW_HND waitWindel = NULL;
	//x0061560 Date May17,07 (sateeshg) OMAPS00133241
BOOL addname_flag = FALSE;
/* Aug 09, 2007 DR:OMAPS00140447 x0056422(Srilekha)
Added a new flag changename_flag to handle the Phonebook-SIM Memory entry changed event. */

BOOL changename_flag = FALSE;
/*******************************************************************************

                                Private data elements

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

/* x0039928 - Lint warnings fix
static T_MFW_UPN_LIST   *upnList = NULL;   */

/* SPR#1112 - SH - This is redundant */
//static T_phbk           *GlobalPhoneBookHandle = NULL;

/* SPR#1112 - SH - Internal phonebook flag */
#ifdef INT_PHONEBOOK
static UBYTE ipbCopyIndex = 0;
static UBYTE ipbMove = FALSE;
static T_MFW_HND ipbWin = NULL;
#endif

// ADDED BY RAVI - 28-11-2005
EXTERN T_MFW     mfw_Ucs2SIMStr(T_MFW_DCS outMode, U16 *inUcsStr, UBYTE maxOutSize,
                         UBYTE *outMfwStr, UBYTE *outLen);

EXTERN T_MFW     mfw_Gsm2SIMStr(T_MFW_DCS outMode, UBYTE *inGsmStr, UBYTE maxOutSize,
                         UBYTE *outMfwStr,UBYTE *outLen);
// END RAVI - 28-11-2005
/*******************************************************************************

                                Private Methods

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

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

 $Function:    	changeName

 $Description:	Change a phone book entry if we have a valid book selected

 $Returns:		status of change, or MWB_PHB_FAIL if an error occurs

 $Arguments:	book, to be updated
                entry, to update
                currentStatus, pointer to status word

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

static UBYTE changeName( UBYTE book, T_MFW_PHB_ENTRY *entry, T_MFW_PHB_STATUS *currentStatus )
{

	TRACE_FUNCTION( "changeName()" );

	/* Aug 09, 2007 DR:OMAPS00140447 x0056422(Srilekha) */
	changename_flag = TRUE;

	if ( book == PHB_SDN )
		return MFW_PHB_FAIL;

	return phb_store_entry( book, entry, currentStatus );
}







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

 $Function:    	deleteName

 $Description:	Delete a phone book entry

 $Returns:		status of delete, or MWB_PHB_FAIL if an error occurs

 $Arguments:	book, to be updated
                index, index of entry to delete
                currentStatus, pointer to status word

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

static UBYTE deleteName( UBYTE book, UBYTE index, T_MFW_PHB_STATUS *currentStatus )
{
	TRACE_FUNCTION( "deleteName()" );

	if (  book == PHB_SDN )
		return MFW_PHB_FAIL;

	return phb_delete_entry( book, index, currentStatus );
}










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

 $Function:    	addName

 $Description:	Add a new name to the phone book

 $Returns:		status of change, or MWB_PHB_FAIL if an error occurs

 $Arguments:	book, to be updated
                entry, to update
                currentStatus, pointer to status word

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

static UBYTE addName( UBYTE book, T_MFW_PHB_ENTRY *entry, T_MFW_PHB_STATUS *currentStatus )
{
	TRACE_FUNCTION( "addName()" );

  //MC-- Commented out UPN-specific code as it causes the name string in a UPN
  //entry to be stored incorrectly and doesn't seem to be neccessary.
  //Generic code here seems to work fine for UPN
    {
        /* normal store operation
        */
	{
		char temp[120];
		memset(temp,'\0',100);
			//x0061560 Date May17,07 (sateeshg) OMAPS00133241
		addname_flag = TRUE;
#ifdef NO_ASCIIZ
{
	T_MFW_PHB_TEXT buf;

		/*SPR 1752 check for unicode*/
	   	if (entry->name.data[0] ==0x80)
		{
			/*MC, don't do any conversions!!*/
			TRACE_EVENT("Converting Unicode 2 SIM");

			sprintf(temp,"Book: %d Name %s Number %s",
				book,
				(char*)buf.data,(char*)entry->number);

		}
		else

		{
			// convert from GSM to Alpha characters
			bookGsm2Alpha( (UBYTE *) entry->name.data );

			sprintf(temp,"Book: %d Name %s Number %s",
				book,
				(char*)entry->name.data,(char*)entry->number);
		}
}
#else
		sprintf(temp,"Book: %d Name %s Number %s",
				book,
			(char*)entry->name,(char*)entry->number);
#endif
		TRACE_EVENT(temp);
	}
	    entry->index = 0;

        return phb_store_entry( book, entry, currentStatus );
    }
}








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

                          File Handling Utilities

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

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

 $Function:    	storeInFile

 $Description:	Converts the name to a storeable format and stores it
                in the phone book

 $Returns:		None

 $Arguments:	phbk, pointer to phonebook structure

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

void storeInFile( T_phbk *phbk )
{	int i;
	UBYTE actual_length = 0;
	char debug[20];
	TRACE_FUNCTION( "storeInFile()" );

    /* Convert the name
    */
#ifdef NO_ASCIIZ

    /* if the pattern is GSM default format, use the function mfw_Gsm2SIMStr() here
    */


    if (phbk->edt_buf_name[0] == 0x80)//if unicode
    {
    		/*a0393213 lint warning:Possible creation of out-of-bounds pointer soln:PHB_MAX_LEN changed to MAX_ALPHA_LEN-1*/
   		 for (i =0; i < (MAX_ALPHA_LEN-1); i+=2) //work out string length
   	 	{	if (phbk->edt_buf_name[i] == 0 && phbk->edt_buf_name[i+1] == 0)
   			{	if (i== 0)
   					actual_length =0;
   				else
   					actual_length = i -2;
    			break;
    		}
    	}
    	phbk->edt_buf_name[0] = (UBYTE)(actual_length/2);//add string length to beginning of string
    	phbk->edt_buf_name[1] = 0x00;
    /*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN*/
    memset(phbk->newEntry.name.data, 0,MAX_ALPHA_LEN);
    //convert to SIM string
	mfw_Ucs2SIMStr( MFW_DCS_UCS2 , (U16*)phbk->edt_buf_name, MAX_ALPHA_LEN,

        phbk->newEntry.name.data, &phbk->newEntry.name.len );
	TRACE_EVENT(	(char*)phbk->newEntry.name.data);
	sprintf(debug, "length:%d", phbk->newEntry.name.len);
	TRACE_EVENT(debug);
    }
    else
    {
    	mfw_Gsm2SIMStr( MFW_DCS_7bits, (U8*)phbk->edt_buf_name, MAX_ALPHA_LEN,
        phbk->newEntry.name.data, &phbk->newEntry.name.len );
    }

#else
/*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN*/
    strncpy( (char *)phbk->newEntry.name, (char *)phbk->edt_buf_name, MAX_ALPHA_LEN );

#endif

    /* update the number
    */
    strncpy( (char *) phbk->newEntry.number, (char *) phbk->edt_buf_number, PHB_MAX_LEN );
	/*SPR 1327, copy current phonebook type to new entry*/
	phbk->newEntry.book = phbk->current.status.book;
	/*If current phonebook UPN, don't overwrite phonebook type*/
	// Feb 20, 2006 REF: OMAPS00061948  x0039928
	// Fix : A check is made with enum PHB_UPN of MFW instead of UPN of ACI
	if( phbk->newEntry.book != PHB_UPN)
		phbk->newEntry.book = bookActiveBook(WRITE);
    phbk->newEntry.index = 0;

    /* Add the name/number combination to the phone book and setup
       the current text status string
    */
    switch ( addName( phbk->newEntry.book, &phbk->newEntry, &phbk->current.status ) )
    {
        case MFW_PHB_OK :
        {
            /* Entry saved okay
            */
            MmiBookSetCurrentText( TxtSaved  );
        }
        break;
	//x0061560 Date May16,07 (sateeshg) OMAPS00133241
	case  MFW_PHB_EXCT :
        {
            /* Entry saved okay
            */
            MmiBookSetCurrentText( TxtPleaseWait  );
		//	MmiBookSetCurrentText( TxtSaved  );

        }
	//end
        break;

        case MFW_PHB_FULL :
        {
            /* Phone book full
            */
            MmiBookSetCurrentText( TxtPhbkFull  );
        }
        break;

        case MFW_PHB_FAIL :
        {
            /* Write failure
            */
            MmiBookSetCurrentText( TxtWriteError  );
        }
        break;

		default:
        {
            /* No other returns possible
            */
        }
        break;
    }
}







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

 $Function:    	changeInFile

 $Description:	change the phone book entry

 $Returns:		none

 $Arguments:	phbk, pointer to phonebook structure

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

void changeInFile( T_phbk *phbk )
{	int i;
	int actual_length=0;
	TRACE_FUNCTION( "changeInFile()" );

	if(phbk->current.status.book == PHB_ADN_FDN)
		phbk->current.status.book = PHB_ADN;	//JVJE We can only store in ADN/FDN
	else
		phbk->current.status.book = phbk->current.status.book;

	TRACE_EVENT_P1("Current Book = %d", phbk->current.status.book);
	TRACE_EVENT_P1("Current Name = %d",  phbk->current.selectedName);
	TRACE_EVENT_P1("Current Buf Name = %s", phbk->edt_buf_name);


    /* Convert the name
    */
#ifdef NO_ASCIIZ
	/*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN for name strings*/
    if (phbk->edt_buf_name[0] == 0x80)//if unicode
    {
    /*a0393213 lint warning:Possible access of out-of-bounds pointer soln:MAX_ALPHA_LEN-1*/
   		 for (i =0; i < MAX_ALPHA_LEN-1; i+=2) //work out string length
   	 	{	if (phbk->edt_buf_name[i] == 0 && phbk->edt_buf_name[i+1] == 0)
   			{	if (i== 0)
   					actual_length =0;
   				else
   					actual_length = i -2;
    			break;
    		}
    	}
    	phbk->edt_buf_name[0] = (UBYTE)(actual_length/2);//add string length to beginning of string
    	phbk->edt_buf_name[1] = 0x00;

      memset(phbk->current.entry[phbk->current.selectedName].name.data, 0, MAX_ALPHA_LEN);
    //convert to SIM string
	mfw_Ucs2SIMStr( MFW_DCS_UCS2, (U16*)phbk->edt_buf_name, MAX_ALPHA_LEN,
        phbk->current.entry[phbk->current.selectedName].name.data,
        &phbk->current.entry[phbk->current.selectedName].name.len );
    }
else
    {	mfw_Gsm2SIMStr( MFW_DCS_7bits, (U8*)phbk->edt_buf_name, MAX_ALPHA_LEN,
        phbk->current.entry[phbk->current.selectedName].name.data, &phbk->current.entry[phbk->current.selectedName].name.len );
	}
#else

    strncpy( (char *) phbk->current.entry[ phbk->current.selectedName ].name,
        (char *) phbk->edt_buf_name, MAX_ALPHA_LEN );

#endif


/* update the number
    */
    strncpy( (char *) phbk->current.entry[ phbk->current.selectedName ].number,
        (char *) phbk->edt_buf_number, PHB_MAX_LEN );

    /* Add the name/number combination to the phone book and setup
       the current text status string
    */
    switch ( changeName( phbk->current.status.book,
        &phbk->current.entry[ phbk->current.selectedName ], &phbk->current.status ) )
    {
        case MFW_PHB_OK :
        {
            /* Entry saved okay
            */
            MmiBookSetCurrentText( TxtSaved  );
        }
        break;

        case MFW_PHB_FAIL :
        {
            /* Write failure
            */
            MmiBookSetCurrentText(  TxtWriteError );
        }
        break;
		/* x0056422 on Aug 02,2007 for
		   OMAPS00140447 - PhoneBook: Unexpected confirmation message
		   when making changes to entries in SIM storage. */

//  July 11, 2007 DR:OMAPS00137908 x00666692(Asha)
//PHONEBOOK: changing name or number under SIM storage, Please Wait
//message appears instead of Saved
	case  MFW_PHB_EXCT :
        {
            /* Operation in progress
            */
            MmiBookSetCurrentText( TxtPleaseWait  );
		//	MmiBookSetCurrentText( TxtSaved  );

        }
	//end
        break;

		default:
        {
            /* No other returns possible
            */
        }
        break;
    }
}









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

 $Function:    	deleteFromFile

 $Description:	delete an entry from a phone book

 $Returns:		None

 $Arguments:	phbk, phone book handle,
                book, book to update,

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

void deleteFromFile( T_phbk *phbk, UBYTE book )
{
	int index;
	T_MFW_PHB_STATUS phb_status_before_delete; /*OMAPS00104376 a0393213(R.Prabakar)*/

	TRACE_FUNCTION( "deleteFromFile()" );

	index = phbk->current.selectedName - phbk->current.missedCallsOffset;
	/*OMAPS00104376 a0393213(R.Prabakar)- getting the status of the phonebook before deletion*/
	phb_status_before_delete.book=book;
	bookGetCurrentStatus( &phb_status_before_delete );
    switch ( deleteName( book,
        phbk->current.entry[index].index, &phbk->current.status ) )
    {
        case MFW_PHB_OK :
        {
            /* Entry saved okay
            */
            MmiBookSetCurrentText(  TxtEntryDeleted  );

#ifdef NO_ASCIIZ
				phbk->current.entry[index].name.len = 0;
				memset((char*)phbk->current.entry[index].number, '\0', PHB_MAX_LEN);

#else
/*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN for name strings*/
				memset((char*)phbk->current.entry[index].name, '\0', MAX_ALPHA_LEN);
				memset((char*)phbk->current.entry[index].number, '\0', PHB_MAX_LEN);
#endif
            /* Move the current index to the next valid entry
            */
				if(phbk->current.selectedName > 0)
					phbk->current.selectedName --;
				else
					phbk->current.selectedName = 0;

            	if(phbk->current.index > 1)
            		phbk->current.index--;
            	else
                	phbk->current.index = 1;

            /* And if we have a search window, perform the search to
               update the current valid entry
            */
			if ( phbk->search_win )
            {

		// July  17, 2006  DR: OMAPS00082792  x0039928
		// Check used entry is 1 as delete is not complete yet as it is asynchronous.
		/*Nov 17,2006 OMAPS00104376 a0393213(R.Prabakar)
		    Now the check is done with the status got before deletion instead of the status got after deletion*/
				if (phb_status_before_delete.used_entries == 1)
                {
                    /* empty phone book
                    */
					bookSearchDestroy( phbk->search_win );
					phbk->search_win = 0;
				}
				else
                {
                    /* perform the search
                    */
			//Jan 27, 2006 REF: OMAPS00061925  x0039928
			// Fix : Start the phonebook timer for populating the list
			timStart(PhbSearchTim);
                }
			}
        }
        break;

        case MFW_PHB_FAIL :
        {
            /* Write failure
            */
            MmiBookSetCurrentText(  TxtWriteError );
        }
        break;

		default:
        {
            /* No other action required
            */
        }
        break;
    }
}


/* SPR#1112 - SH - Internal phonebook use */
#ifdef INT_PHONEBOOK

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

 $Function:    	bookChangePB

 $Description:	Change the phonebook

 $Returns:		None

 $Arguments:	None.

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

void bookChangePB(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
	T_MFW_WIN			*win_data   = ( (T_MFW_HDR *) win )->data;
    T_phbk				*Phbk		=	(T_phbk *) win_data->user;

	GI_pb_SetPhonebook(identifier);
	bookShowInfoScreen( Phbk->win, TxtPhonebook, TxtChanged, NULL, NULL, 3000);
	return;
}


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

 $Function:    	bookCopy

 $Description:	Copy or move a phonebook entry from one book to another

 $Returns:		status of change, or MWB_PHB_FAIL if an error occurs

 $Arguments:	entry 		- the entry to be moved or copied
 				srcStatus	- Status information about the source phonebook
                destStatus 	- Status information about the destination phonebook
                move		- TRUE if the original record is to be deleted

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

UBYTE bookCopy( T_MFW_PHB_ENTRY *entry, T_MFW_PHB_STATUS	*destStatus, T_MFW_PHB_STATUS	*srcStatus, UBYTE move )
{
    T_MFW				ret;
    UBYTE				srcIndex;
    UBYTE				srcBook;

	TRACE_FUNCTION("bookCopy");

	if (!destStatus->avail_entries)
	{
		/* There's no room in the destination phonebook to add the entry */
		TRACE_EVENT("bookCopy: dest phonebook full");
		return MFW_PHB_FULL;
	}

	srcIndex = entry->index;
	entry->index = 0;

	if (entry->name.len>destStatus->tag_len)
	{
		TRACE_EVENT("bookCopy: Alpha tag cropped");
		entry->name.len = destStatus->tag_len;
		entry->name.data[entry->name.len] = NULL;
	}

    ret = phb_store_entry( destStatus->book, entry, destStatus );
    TRACE_EVENT_P2("bookCopy: phb_store_entry book %d result %d", destStatus->book, ret);

// 27 June, 2007 DR:OMAPS00136627 x0062172 Syed
    if ( (ret!=MFW_PHB_OK) && (ret!=MFW_PHB_EXCT) )
    	return ret;

	/* Only try to delete the entry if we are moving an entry from one book
	 * to another.  Don't try if it is an FDN entry */

	TRACE_EVENT_P2("move %d, entry->book %d", move, entry->book);

	if (move && entry->book!=PHB_FDN)
	{
    	if  (( srcStatus->book == PHB_UPN) || (srcStatus->book == PHB_FDN ))
            srcBook = srcStatus->book;
      	else
       		srcBook = bookActiveBook(WRITE);

		ret = phb_delete_entry(srcBook, srcIndex, srcStatus);
		TRACE_EVENT_P3("bookCopy: phb_delete_entry book %d index %d result %d", srcStatus->book, srcIndex, ret);
	}

   /* 30 Aug ,2007 DR:OMAPS00143539 ,x0081909 ( Deepak ) */

   /* If we copy an entry and then try to delete it from either SIM or Phone storage,before delete opertaion Index of an entry is restored  */

	entry->index = srcIndex;

	TRACE_EVENT("bookCopy: leaving function");

	return ret;
}


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

 $Function:    	bookDelMoveCB

 $Description:	callback after moving a phonebook entry

 $Returns:

 $Arguments:

*******************************************************************************/
//x0pleela 01 june, 2006  DR: OMAPS00079716

static void bookDelMoveCB( T_MFW_HND win, USHORT Identifier,UBYTE reason)
{
    T_MFW_WIN		*win_data	= ((T_MFW_HDR *) win)->data;
    T_phbk				*Phbk		=	(T_phbk *) win_data->user;

	bookGetCurrentStatus(&Phbk->current.status);
	bookMenuDestroy(Phbk->menu_options_win);
	if( Phbk->current.status.used_entries > 0 )
	{
		  SEND_EVENT( Phbk->search_win, SEARCH_STRING, 1, 0);
		    winShow(Phbk->search_win );
	}
	else
	{
		if( Phbk->search_win)
		{
			 //destroy current window
		 	bookSearchDestroy(Phbk->search_win );
		}
	}

}
/*******************************************************************************

 $Function:    	bookCopyCB

 $Description:	callback after Copying a phonebook entry

 $Returns:

 $Arguments:

*******************************************************************************/
//x0066814(Geetha) 17 Aug, 2007  DR: OMAPS00141963

static void bookCopyCB( T_MFW_HND win, USHORT Identifier,UBYTE reason)
{
    T_MFW_WIN		*win_data	= ((T_MFW_HDR *) win)->data;
    T_phbk				*Phbk		=	(T_phbk *) win_data->user;

    bookMenuDestroy(Phbk->menu_options_win);

}
/*******************************************************************************
 $Function:    	bookCopySingle

 $Description:	Copy or move a single phonebook entry

 $Returns:		None

 $Arguments:	None.

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

void bookCopySingle(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
	T_MFW_WIN			*win_data   = ( (T_MFW_HDR *) win )->data;
    T_phbk				*Phbk		=	(T_phbk *) win_data->user;
    BOOL				oldBook;
	int					txtId;
    T_MFW_PHB_STATUS	destStatus;
    tMmiPhbData			*current = &Phbk->phbk->current;

	TRACE_FUNCTION("bookCopySingle");

	oldBook = bookGetBookSelected();
// May 3, 2004        REF: CRR MMI-SPR-18555  Rashmi C N(Sasken)
//	While doing a copy from the FDN menu the destination should always be internal phonebook
	if(menuFDN && (call_data.calls.numCalls==0))
	{
		destStatus.book = PHB_IPB;
	}
	else
	{
		bookSetBookSelected(!oldBook);
	destStatus.book = bookActiveBook(WRITE);
	}

	bookGetCurrentStatus( &destStatus );

	bookSetBookSelected(oldBook);
  	txtId = TxtStored;

  	if (destStatus.avail_entries)
  	{
		switch (bookCopy(&current->entry[current->selectedName], &destStatus, &current->status, identifier))
		{
			case MFW_PHB_OK:
			//27 June, 2007  DR: OMAPS00136608 x0073106(sundeep)
			case MFW_PHB_EXCT:
				txtId = TxtStored;
				break;
			case MFW_PHB_FULL:
				txtId = TxtPhbkFull;
				break;
			default:
				txtId = TxtFailed;
				break;
	    }
  	}
	else
	{
		txtId = TxtPhbkFull;
	}

	//x0pleela 01 June, 2006  DR: OMAPS00079716
	//Calling a callback for move operation
	if(identifier)
		bookShowInformation( win, txtId, NULL, (T_VOID_FUNC)bookDelMoveCB );
	else
	//x0066814(Geetha) 17 Aug, 2007  DR: OMAPS00141963
		bookShowInformation( win, txtId, NULL, (T_VOID_FUNC)bookCopyCB );
	/*if (identifier)
	{
		// Destroy options menu and regenerate address list

		if(Phbk->current.status.used_entries > 0)
			SEND_EVENT(Phbk->search_win, SEARCH_SCROLL_UP, 0, 0 );
		SEND_EVENT(Phbk->search_win, SEARCH_UPDATE, 0, (void*)Phbk->current.status.book );
	}*/

    return;
}


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

 $Function:    	bookCopyMultiple

 $Description:	Copy or move multiple phonebook entries

 $Returns:		None

 $Arguments:	None.

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

void bookCopyMultiple(T_MFW_HND win, UBYTE move, UBYTE reason)
{
	T_MFW_WIN			*win_data   = ( (T_MFW_HDR *) win )->data;
    T_phbk				*Phbk		=	(T_phbk *) win_data->user;
    UBYTE				oldBook;
    T_MFW_PHB_STATUS	destStatus;
    T_MFW_PHB_STATUS	srcStatus;
    T_MFW_PHB_LIST		entries;
    T_MFW_PHB_ENTRY		entry;
	UBYTE				readIndex;
	int 				txtId;
//	T_MFW_HND			info_win;    // RAVI
	static T_MFW_HND	waitWin = NULL;
    /* Set up some data */

    TRACE_FUNCTION("bookCopyMultiple");

	entries.entry = &entry;

	srcStatus.book = bookActiveBook(WRITE);
	bookGetCurrentStatus( &srcStatus );

		oldBook = bookGetBookSelected();
	bookSetBookSelected(!oldBook);

	destStatus.book = bookActiveBook(WRITE);
	bookGetCurrentStatus( &destStatus );

	bookSetBookSelected(oldBook);

	/* First time entering function, set up values.
	 * Store information so this function can be called again
	 * when the phonebook is ready */

	if (ipbCopyIndex==0)
	{
		ipbCopyIndex = srcStatus.used_entries;
		ipbWin = win;
		ipbMove = move;

		if (!bookGetBookSelected() && !move)
		{
			/* We need to drop out of this function briefly in order to get the dialog to display
			 * for this particular case!  Show info screen very briefly, which calls this function as
			 * a callback.  The info screen remains until we drop out of this function a second
			 * time */
			waitWin = NULL;
			bookShowInfoScreen( Phbk->win, TxtPleaseWait, NULL, (T_VOID_FUNC)bookCopyMultiple, NULL, 100);
			return;
		}
		waitWin = bookShowInfoScreen( Phbk->win, TxtPleaseWait, NULL, NULL, NULL, FOREVER);
	}

	TRACE_EVENT_P1("Entries in list: %d", srcStatus.used_entries);

	/* For special case where SIM will give no E_PHB_READY response, the
	 * do...while operates as a loop below.  Otherwise, it will only go through
	 * once, and this function will be called repeatedly every E_PHB_READY */

	do
	{
		txtId = TxtStored;

		if (!destStatus.avail_entries)
		{
			txtId = TxtPhbkFull;
		}
		else if (ipbCopyIndex==0)
		{
			txtId = TxtEmpty;
		}
		else
		{
			/* For moving, always delete first entry alphabetically, list moves down.
			 * For copying, move through the list */

			if (move)
				readIndex = 1;
			else
				readIndex = ipbCopyIndex;

			TRACE_EVENT_P1("Moving entry %d", readIndex);

			/* Read in entry and copy/move it */

			phb_read_entries(srcStatus.book, readIndex, MFW_PHB_ALPHA, 1, &entries);

			switch (bookCopy(entries.entry, &destStatus, &srcStatus, move))
			{
				case MFW_PHB_OK:
				//27 June, 2007  DR: OMAPS00136608 x0073106(sundeep)
				case MFW_PHB_EXCT:
				  	txtId = TxtStored;
					break;
				case MFW_PHB_FULL:
					txtId = TxtPhbkFull;
					break;
				default:
					txtId = TxtFailed;
					break;
		    }

			ipbCopyIndex--;
		}
	}/* Is a loop in special case - see above */
	while (!bookGetBookSelected() && !move && txtId==TxtStored && ipbCopyIndex>0);

	/* If we've finished, or an error has occurred, show info dialog */

	if (ipbCopyIndex==0 || txtId!=TxtStored)
	{
		ipbCopyIndex = 0;

		/* Destroy the Please Wait window and show the result message */

    	bookShowInformation( win, txtId, NULL, NULL );
		if (waitWin)
		{
			SEND_EVENT(waitWin, DIALOG_DESTROY,0,0);
		}

		if (move)
		{
			/* Destroy options menu and regenerate address list */

			bookMenuDestroy(Phbk->menu_options_win);
			bookGetCurrentStatus( &Phbk->current.status );
			//06 June, 2007  DR: OMAPS00132045
			//changed the condition from used_entries to ipbCopyIndex
			if((ipbCopyIndex > 0))
			{
				SEND_EVENT(Phbk->search_win, SEARCH_SCROLL_UP, 0, 0 );
				SEND_EVENT(Phbk->search_win, SEARCH_UPDATE, 0, (void*)Phbk->current.status.book );
			}
			else
				bookSearchDestroy(Phbk->search_win);
		}
	}

	return;
}
#endif



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

                                Public Methods

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




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

 $Function:    	bookCurrentWindow

 $Description:

   This returns the window handle associated with the current
   MFW element

 $Returns:		window handle of current MFW item

 $Arguments:	none.

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

tBookMfwHnd bookCurrentWindow( void )
{
	return mfwParent( mfwHeader() );
}







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

 $Function:    	bookDefaultCallBack

 $Description:

   This is a simple call back function which is invoked when
   a not implemented dialog is displayed. We don't want anyone
   outside of this module using it so define it as static,
   this will still be callable from the info dialogs as it
   will use the reference we set up.

 $Returns:		zero, always

 $Arguments:	win, parent window
                identifier, of the window
				reason, for the window

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

static tBookStatus bookDefaultCallBack( tBookMfwHnd win, UBYTE identifier, UBYTE reason )
{
	if ( win )
	    winShow( win );

	return 0;
}








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

 $Function:    	bookWindowData

 $Description:

   This routine is designed to be invoked from within a menu
   handler or call back function and will return a pointer to
   the window data associated with the current MFW element.

 $Returns:		pointer to the data area

 $Arguments:	none.

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

void *bookWindowData( void )
{
	tBookMfwHnd WinPtr;

	if ( ( WinPtr = bookCurrentWindow() ) == NULL )
		return (void *) NULL;

	return (void *)((tBookMfwHdr *) WinPtr)->data;
}









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

 $Function:    	bookMenuSelectedNumber

 $Description:

   This will return the currently selected entry in the phone
   book, when the routine is being called from a menu handler

 $Returns:		pointer to the selected number buffer

 $Arguments:	none.

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

char *bookMenuSelectedNumber( void )
{


	/* Have we got a valid window ?
	*/
	if ( ( (tBookMfwHnd) bookWindowData() ) == NULL )
		return NULL;

	return NULL;
}









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

 $Function:    	bookPhoneBookLoading

 $Description:	access routine for the local static menu area

    Utility functions to determine if the phone book is
    still in the loading state

 $Returns:		BOOK_FAILURE if loading, otherwise BOOK_SUCCESS

 $Arguments:	none.

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

tBookStatus bookPhoneBookLoading( void )
{
	int temp;
	char tempst[20];
	TRACE_FUNCTION("bookPhoneBookLoading");
	temp = phb_get_mode();
	sprintf(tempst,"phb_get_mode %d",temp);
	TRACE_EVENT(tempst);
	return ( (phb_get_mode() == PHB_LOADING)||(phb_get_mode() == MFW_PHB_FAIL) ) ? BOOK_FAILURE : BOOK_SUCCESS;
}









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

 $Function:    	bookInfoDialog

 $Description:

    Utility functions just to throw a string onto the screen
    primarily for debug purposes, the modal version will wait
    for a user input before removing the message, the non-modal
    will clear after three seconds

 $Returns:		One.

 $Arguments:	String1, String2, character strings to be displayed.

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

tBookStatus bookInfoDialog( char *String1, char *String2 )
{
	tBookMfwHnd Win = bookCurrentWindow();
	tBookDialogData Dialog;

	/* Initialise the dialog control block with default information
	*/
	dlg_initDisplayData_TextStr( &Dialog, TxtNull, TxtNull, String1, String2, COLOUR_STATUS);
	dlg_initDisplayData_events( &Dialog, (T_VOID_FUNC)bookDefaultCallBack, THREE_SECS, KEY_CLEAR);

	/* Show the dialog
	*/
	info_dialog( Win, &Dialog );

	return 1;
}









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

 $Function:    	bookNotImplemented

 $Description:

    This will present an information dialog indicating the current
    feature is still under development. This routine will use the
    current MFW element to detect the handle of the parent window
    if the incoming window handle is NULL.

 $Returns:		One

 $Arguments:	Parent, window, can be NULL

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

tBookStatus bookNotImplemented( tBookMfwHnd Parent )
{
	tBookMfwHnd Win = ( Parent ) ? Parent : bookCurrentWindow();
	tBookDialogData Dialog;

	/* Initialise the dialog control block with default information
	*/
	dlg_initDisplayData_TextStr( &Dialog, TxtNull, TxtNull, MmiRsrcGetText( TxtNotImplemented ), NULL, COLOUR_STATUS);
	dlg_initDisplayData_events( &Dialog, (T_VOID_FUNC)bookDefaultCallBack, THREE_SECS, KEY_CLEAR);

	/* Show the dialog
	*/
	info_dialog( Win, &Dialog );

	return 1;

}

/* Menu handler to invoke the routine above
*/
tBookStatus bookMenuNotImplemented( tBookMfwMenu *Menu, tBookMfwMenuItem *Item )
{
    return bookNotImplemented( NULL );
}






/* SPR#1428 - SH - New Editor changes: No longer required */
#ifndef NEW_EDITOR

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

 $Function:    	set_edt_attr

 $Description:

    Sets up the edit attribute structure with the provided parameters

 $Returns:		None

 $Arguments:	winPx, winPy, winSx, winSy, positioning information
                fgColor, colour for foreground
				font, mode, controls, pretty much what they say
				*text, initial text to be edited
				size, of the text (in bytes)
				attr, the block to be set up with the other parameters

 GW - Changed colour from 8 bits (foreground) to 2x32bits fgd and bgd
For the colour display we pass a 32 bit word that defines the size and position of the editor.
This can be either a specific size or a more generic ('middle of the screen'/full width of display)
*******************************************************************************/
void bookSetEditAttributes(
    int  zone_id,
	U32  colIndex,
	U8  font,  U8  mode,  U8  *controls,
	char *text,   U16 size,
	MfwEdtAttr*   attr)
{
	/* Populate the structure with the parameters
	*/
	calculateWindow(attr, zone_id );
	attr->edtCol = colIndex;
	attr->font = font;
	attr->mode = mode;
	attr->controls = controls;
	attr->text = text;
	attr->size = size;
}
#endif /* NEW_EDITOR */










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

                             Name Handling Functions

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

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

 $Function:    	bookGetCurrentStatus

 $Description:	Determines the current status of the phone book

 $Returns:		status byte

 $Arguments:	currentStatus, pointer to structure to be populated with
                status information

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

UBYTE bookGetCurrentStatus( T_MFW_PHB_STATUS *currentStatus )
{
	UBYTE temp;
	TRACE_FUNCTION( "bookGetCurrentStatus()" );


    temp = phb_get_status( currentStatus );
    {
		char temp[255];
		sprintf(temp,"book %d max_entries %d used_entries %d aval_entries %d",
				currentStatus->book,currentStatus->max_entries,
				currentStatus->used_entries,
				currentStatus->avail_entries);
		TRACE_EVENT(temp);
    }
    return temp;
}








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

 $Function:    	bookFindNames

 $Description:	Fine name in phone book

 $Returns:		status of search

 $Arguments:	number, number of entries to search, current,
                pointer to structure containing search context

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

UBYTE bookFindName( UBYTE number, tMmiPhbData *current )
{
    UBYTE   ret;
	int     index;   // , Count = 0;  // RAVI

    UBYTE   book_type, index_type;



//  May 24, 2004 REF: CRR MMI-SPR-15813 Ajith K P
//  Added these variables to Fix the Issue MMI-SPR-15813
//  nondigitindex => index after which '+' sign to be added
//  numlength = lenght of the number array.
//  nondigitFound = Checks whether nondigit is present in the number array or not.

   int nondigitindex = -1,j,numlength = 0, nondigitFound = -1;


	TRACE_FUNCTION( "bookFindName()" );

    /* Firstly, check for an empty book
    */
	bookGetCurrentStatus( &current->status );
    if ( current->status.used_entries < 1 )
    {
        current->index = 0;
        return MFW_PHB_OK;
    }

	//x0066692 Date:23 April 2007 DR:OMAPS00121834
	// this condition ensures that stop index doesn't exceed max no. of entries can be added to a phonebook
	number = current->status.used_entries - current->index +1;

	if ( number > MAX_SEARCH_NAME )
		number = MAX_SEARCH_NAME;
	// Feb 20, 2006 REF: OMAPS00061948  x0039928
	// Fix : If used entries are less than MAX_SARCH_NAME then no. of entries
	// passed to the phb_read_entries is used entries.

    /* Okay, we have some entries to search, so initialise the current
       entry buffer to empty
    */
	memset( current->entry, 0, MAX_SEARCH_CALL_LIST * sizeof( T_MFW_PHB_ENTRY ) );



    current->list.entry         = current->entry;
    current->list.num_entries   = number;

    /* Sort out how we index the information
    */
    book_type  = current->status.book;
    index_type = MFW_PHB_INDEX;
    if ( ( book_type == bookActiveBook(WRITE) ) || ( book_type == PHB_SDN ) )
        index_type = MFW_PHB_ALPHA;

    /* Sort out the type of search we are performing
    */
	if ((book_type == PHB_LDN) || (book_type == PHB_LRN)|| (book_type == PHB_LMN))
        index_type = MFW_PHB_INDEX;
    else
    {
	    if ( current->KindOfSearch == SEARCH_BY_NAME )
    	    index_type = MFW_PHB_ALPHA;
	    else if ( current->KindOfSearch == SEARCH_BY_NUMBER )
    	    index_type = MFW_PHB_NUMBER;
	    else if ( current->KindOfSearch == SEARCH_BY_LOCATION )
    	    index_type = MFW_PHB_INDEX;
    }


    /* read the appropriate entries from the phone book
    */
	{
		char temp[255];
		sprintf(temp,"book %d index %d indextype %d number %d",
					book_type,current->index,index_type,number);
		TRACE_EVENT(temp);
	}
// May 3, 2004        REF: CRR MMI-SPR-18555  Rashmi C N(Sasken)
//When book is ADN, we need to read only ADN entries. no need to display ADN and FDN together

	if (book_type == PHB_ADN)	/*Quick test */
		{
		TRACE_EVENT("book_type == PHB_ADN");
		ret = phb_read_entries( PHB_ADN, current->index, index_type, number, &current->list );
		}
	else
		{
		TRACE_EVENT("book_type == OTHER");
		ret = phb_read_entries( book_type, current->index, index_type, number, &current->list );
		}

    /* Populate the output structures
    */
    if (current->list.result == MFW_NO_ENTRY)
        current->index = 0;


#ifdef NO_ASCIIZ

#ifdef EASY_TEXT_ENABLED
for ( index = 0; index < number; index++ )
{/*MC , SPR 1242 merged in this section from b-sample build*/

        /* GSM character sets
        */
        UBYTE   l_name[MAX_ALPHA_LEN];/*MC SPR 1257, name strings should use MAX_ALPHA_LEN*/
	  char debug[22];
	  int i;
        TRACE_EVENT( (char*)current->entry[index].name.data);
        TRACE_EVENT("Convert from SIM to UCS2");

    	TRACE_EVENT_P1("length of name string: %d", current->entry[index].name.len);
    	/*MC SPR 1257, replacing PHB_MAX_LEN with MAX_ALPHA_LEN for name strings*/
		if (current->entry[index].name.data[0] == 0x80 )
		{	for (i=1; i<MAX_ALPHA_LEN; i+=1)
			{
				l_name[i+1] = current->entry[index].name.data[i];
			}
       	 	l_name[0] =	current->entry[index].name.data[0];
       		l_name[1] = MAX_ALPHA_LEN;

			memcpy( current->entry[index].name.data, (char*)l_name, MAX_ALPHA_LEN );
			/*MC, we'll just use the length provided by the MFW*/
			if (current->entry[index].name.len%2 == 1)/*if length of string odd*/
   		 		current->entry[index].name.len++;/* INCREASE LENGTH BY 1*/

			/*make sure all chars after length are 0*/
			for (i=current->entry[index].name.len; i<MAX_ALPHA_LEN; i++)
			{	current->entry[index].name.data[i] = 0; }

			for (i=0; i < MAX_ALPHA_LEN;i++)
			{
				if ( current->entry[index].name.data[i]== 0 && current->entry[index].name.data[i+1] != 0)
					debug[i] = '0';
				else
					debug[i] = (char)current->entry[index].name.data[i];
	        }


   		 TRACE_EVENT("Decoded entry");
    	TRACE_EVENT(debug);

		}

		else

		{	/*SPR2175, use new function to convert from GSM to ASCII*/
				{	ATB_convert_String((char*)current->entry[index].name.data, MFW_DCS_8bits, current->entry[index].name.len,
								(char*)l_name, MFW_ASCII, PHB_MAX_LEN, FALSE);
					current->entry[index].name.dcs = MFW_ASCII;
					memcpy( current->entry[index].name.data, (char*)l_name, MAX_ALPHA_LEN );
				}


		}
	}

#endif
/*MC end*/
#else
for ( index = 0; index < number; index++ )
	{
			UBYTE   l_name[MAX_ALPHA_LEN];/*MC SPR 1257, name strings should use MAX_ALPHA_LEN*/
			TRACE_EVENT_P1("length of name string: %d", current->entry[index].name.len);
			/*SPR2175, use new function to convert from GSM to ASCII*/
			{	ATB_convert_String((char*)current->entry[index].name.data, MFW_DCS_8bits, current->entry[index].name.data.len,
								l_name, MFW_ASCII, PHB_MAX_LEN);
				current->entry[index].name.dcs = MFW_ASCII;
				memcpy( current->entry[index].name.data, (char*)l_name, MAX_ALPHA_LEN );
			}
	}
#endif

    /* Needed to make international calls from the phonebook
    */
	for ( index = 0; index < number; index++ )
	{
		if ( current->entry[index].ton )
		{

//  May 24, 2004 REF: CRR MMI-SPR-15813 Ajith K P

//  Issue description: Followup from 15623, this is the BMI part of this Issue.
//	At last, in the record "SSC09" the number is displayed with the "+"
//	character at the beginning of the number instead of "**21*+014543877989#"

//  Solution: Find the location of nondigit(e.g:*, #) in the number array
//	and put '+' to next position if the index is less than numlength-8. This is done
//	as there can be ss strings(like *11*20#) attached to the number in the end.
//	For eg: **61#+9844093515*11*20#
//  If the total length is less than 8 assign this index to nondigitindex.
//  This solution is based on special sequences we have encountered till now.

		// Finds the length of the number array.
		numlength = strlen((char*)current->entry[ index ].number);
		//checks whether the length is within the limit.
		if(numlength <=PHB_MAX_LEN)
//TISH, patch for OMAPS00144985, modified by Jinshu Wang, 2007-09-07
//start
if (current->entry[ index ].number[0]=='*' || current->entry[ index ].number[0]=='#')
{
			for( j=0; j< numlength ; j++)
 			{
				if( !isdigit((char*)current->entry[ index ].number[j]) )
                {
					// Found a nondigit can be */#
					nondigitFound = j;
					// Checking , whether the nondigit index is not at the end
					// part of the number array.
					if(j < (numlength-8))
						{
							// Current index is less than numlength-8
						   	nondigitindex = j;
						}
					else
						{
							if(numlength <8)
							{
								// If lenght of the number array is less than 8
								// assign the index to nondigitindex
								// This condition might occur when the user
								// presses invalid short sequence
								nondigitindex = j;
							}
						}
				}
			 }
}
//end
			if((nondigitindex == -1) && (nondigitFound> -1) && (nondigitFound < 4))
			{
				// Nondigit is existing and it's position is less than 4 and not met
				// any of the above conditions.
				nondigitindex = nondigitFound;
			}

			// Move the contents accordingly.
			memmove((char *) &(current->entry[ index ].number[ nondigitindex+2]),
			(char *) &(current->entry[ index ].number[nondigitindex+1]), numlength - nondigitindex+1);

			// Add the '+' sign after the appropriate nondigit character, if any.
			current->entry[index].number[nondigitindex+1] = '+';
		  }

 	   }
	//}

    return current->result = ret;
}








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

 $Function:    	bookEvent

 $Description:	Event handler for a phone book event

 $Returns:		MFW_EVENT_CONSUMED if recognised message, otherwise
                MFW_EVENT_PASSED

 $Arguments:	e, event, para, general parameter giving context of call

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

int bookEvent( MfwEvt e, void *para )
{
	T_MFW_PHB_STATUS *status;

    TRACE_FUNCTION( "bookEvent" );

    /* deal with the incoming event
    */
	switch( e )
    {
        case E_PHB_UPN_LIST :
        {
		/* x0039928 - Lint warnings fix
		upnList = (T_MFW_UPN_LIST *)para; */
            /* tbd */
        }
        break;

		case E_PHB_STATUS:
        {
			status = (T_MFW_PHB_STATUS *)para;
			if ( ( status->book == PHB_FDN ) || ( status->book == PHB_ADN ) )
			{
				if ( pinsSetIsFocussed() == FOCUSSED_PINS )
					backpinFDNactdeact();
			}
        }
        break;

		case E_PHB_ERROR:
        {
		//x0061560 Date May16,07 (sateeshg) OMAPS00133241
     			 T_MFW_HND    win = mfwParent( mfw_header() );

      			 TRACE_ERROR("E_PHB_ERROR store entry");
 		   	bookShowInformation(win, TxtError, NULL, NULL );
  		      }


        break;

        /* SPR#1112 - SH - New events to indicate status of phonebook */

        case E_PHB_READY:
        {
// Aug 18, 2006   ER: OMAPS00089840  x0039928
// Fix : If the E_PHB_READY is for delete all then destroy the please wait window and display the string "Deleted"
		if( DeleteAll_flag == TRUE)
		{
     			 T_MFW_HND    win = mfwParent( mfw_header() );
			int txtid;

      			 TRACE_EVENT("E_PHB_READY Delete all");
			if (waitWindel)
  			{
				SEND_EVENT(waitWindel, DIALOG_DESTROY,0,0);
				waitWindel = NULL;
				txtid = TxtDeleted;
	 		   	bookShowInformation(win, txtid, NULL, NULL );
  			}
			DeleteAll_flag = FALSE;
			break;
		}
		//x0061560 Date May17,07 (sateeshg) OMAPS00133241
		if(addname_flag == TRUE)
              {

			T_MFW_HND    win = mfwParent( mfw_header() );
			int txtid;

      			 TRACE_EVENT("E_PHB_READY Saved");

				txtid = TxtSaved;
	 		   	bookShowInformation(win, txtid, NULL, NULL );
				addname_flag = FALSE;
				break;
			}
		/* Aug 09, 2007 DR:OMAPS00140447 x0056422(Srilekha) */
		if(TRUE == changename_flag)
		{
				T_MFW_HND    win = mfwParent( mfw_header() );
				int txtid;

				TRACE_EVENT("Saved prompt for change entry");
      			TRACE_EVENT("E_PHB_READY Saved");

				txtid = TxtSaved;
	 		   	bookShowInformation(win, txtid, NULL, NULL );
				changename_flag = FALSE;
				break;
		}


            TRACE_EVENT("E_PHB_READY");
#ifdef INT_PHONEBOOK
			/* SPR#1112 - SH - If we're copying or moving a list,
			 * the current operation has been successful - keep copying. */
            if (ipbCopyIndex)
            {
            	TRACE_EVENT("Copying/moving in progress.");
            	bookCopyMultiple(ipbWin, ipbMove, 0);
            }
#endif
        }
        break;

        case E_PHB_BUSY:
        {
            TRACE_EVENT("E_PHB_BUSY");
        }
        break;

        /* end SPR#1112 */

        default:
        {
            /* indicate we haven't dealt with event
            */
			return MFW_EVENT_PASSED;
        }
       // break;   // RAVI
    }

    /* got to here, we have dealt with the event
    */
    return MFW_EVENT_CONSUMED;
}



// Aug 18, 2006   ER: OMAPS00089840  x0039928
// Fix : Added a new function to delete all the phone book entries.
/*******************************************************************************

 $Function:     bookDeleteBook

 $Description:  Delete the complete phone book entries

 $Returns:    None

 $Arguments:	win - Window Handler

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

void bookDeleteBook(T_MFW_HND win)
{
    T_MFW_WIN			*win_data   = ( (T_MFW_HDR *) win )->data;
    T_phbk				*Phbk		=	(T_phbk *) win_data->user;

    Phbk ->current.status.book = bookActiveBook(READ);
	//x0061560 Date JUNE 4,07 (sateeshg) OMAPS00131777
	//Updating the current status of the phonebook
 bookGetCurrentStatus(&Phbk ->current.status);
if(Phbk ->current.status.used_entries !=0)//Apr 30,2007, OMAPS00129173, x0066814(Geetha)
{
    if (bookGetBookSelected() )
		bookShowInfoScreen( Phbk->win, TxtPleaseWait, NULL, NULL, NULL, 100);
    else
	DeleteAll_flag = TRUE;

    if (phb_delete_book(Phbk->current.status.book) == MFW_PHB_OK)
    {
        if (!bookGetBookSelected() )
    	 	waitWindel = bookShowInfoScreen( Phbk->win, TxtPleaseWait, NULL, NULL, NULL, FOREVER);
	else
	{
		MmiBookSetCurrentText(TxtDeleted);
		bookShowInformation( Phbk->win, MmiBookCurrentText(),NULL, NULL );
	}
    }
    else
    {
         DeleteAll_flag = FALSE;
	  MmiBookSetCurrentText(TxtFailed);
         bookShowInformation( Phbk->win, MmiBookCurrentText(),NULL, NULL );
    }
    Phbk ->current.status.used_entries=0;//Apr 30,2007, OMAPS00129173, x0066814(Geetha)
}
else//Apr 30,2007, OMAPS00129173, x0066814(Geetha)
{
bookShowInformation( idle_get_window(), TxtEmptyList, NULL, NULL );
    }

    return;
}


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

 $Function:     bookCopyPhbName

 $Description:  Copiers a phonebook name structure (for NO_ASCII set or cleared)

 $Returns:    None

 $Arguments:	destEntry - destination phonebook entry structure
 				srcEntry - source phonebook entry structure
				maxLen - max number oc chars to be copied

*******************************************************************************/
//GW Created function to copy name (and length when required).
void bookCopyPhbName( T_MFW_PHB_ENTRY* destEntry, T_MFW_PHB_ENTRY* srcEntry, int maxLen )
{
	int len; //length of string to be copied
	if ((destEntry==NULL) || (srcEntry==NULL))
		return;
#ifdef NO_ASCIIZ
	//Ensure we do not copy more than the PHB array can hold.
	if ((maxLen <  PHB_MAX_LEN) && (maxLen >0))
		len = maxLen;
	else
		len = PHB_MAX_LEN;

#else
/*MC SPR1319, name string is only up to MAX_ALPHA_LEN in length*/
	//Ensure we do not copy more than the PHB array can hold.
	if ((maxLen < MAX_ALPHA_LEN) && (maxLen >0))
		len = maxLen;
	else
		len = MAX_ALPHA_LEN;
#endif
#ifdef NO_ASCIIZ
	memset (destEntry->name.data, 0, PHB_MAX_LEN);
	memcpy( destEntry->name.data, srcEntry->name.data, len);
	if (srcEntry->name.len < len)
		destEntry->name.len = srcEntry->name.len;
	else
	{	//we have truncated the name - add termination (if possible)
		destEntry->name.len = len;
		if (len < PHB_MAX_LEN)
		{	// there is space in array for termination - add it.
			destEntry->name.data[len] = 0x00;

		}
	}
#else

	memcpy( destEntry->name, srcEntry->name, maxLen);
#endif
}



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

                                End of File

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