diff g23m/condat/ms/src/bmi/MmiAoc.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/bmi/MmiAoc.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,1767 @@
+/*******************************************************************************
+
+					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:		Advice of Charge
+ $File:		    MmiVoiceMemo.c
+ $Revision:		1.0
+
+ $Author:		Condat(UK)
+ $Date:		    09/04/01
+
+********************************************************************************
+
+ Description:
+
+    This provides the start code for the MMI
+
+********************************************************************************
+ $History: MmiAoc.c
+
+	June 16, 2005  REF: CRR 31267  x0021334
+	Description: Handset ignore the initializtion of the PIN1/PIN2
+	Fix:	Cheking is done to ascertain if PIN1/PIN2 are initialised. If not, appropriate
+	       message is displayed to the user.
+	
+	09/04/01			Original Condat(UK) BMI version.
+	May 25, 2004 REF: CRR MMI-SPR-17588		NISHIKANT KULKARNI	
+	Issue description: On the SIM EF(ACMMax) is defined as 0xFFFFFF, so it should be possible to 
+	enter 16777215, but only 999999 is accepted.
+	Solution:  MAX_ENTER_LIMIT changed from 7 to 9. A check is done to verify that the entered 
+	ACMmax value is less that 0xFFFFFF. Otherwise "Not Allowed" message is displayed.
+
+ $End
+
+*******************************************************************************/
+
+
+
+
+/*******************************************************************************
+
+                                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 "cus_aci.h"
+
+#include "mfw_mfw.h"
+#include "mfw_win.h"
+#include "mfw_kbd.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifndef NEW_EDITOR
+#include "mfw_edt.h"
+#endif
+#include "mfw_lng.h"
+#include "mfw_tim.h"
+#include "mfw_icn.h"
+#include "mfw_mnu.h"
+#include "mfw_phb.h"
+#include "mfw_cm.h"
+#include "mfw_sim.h"
+#include "mfw_nm.h"
+#include "mfw_sat.h"
+#include "mfw_ss.h" /*for convert*/
+#include "mfw_phb.h"
+#include "ksd.h"
+#include "psa.h"
+#include "mfw_sms.h"
+#include "mfw_cphs.h"
+#include "mfw_sat.h"
+
+#include "dspl.h"
+
+
+#include "MmiMmi.h"
+#include "MmiDummy.h"
+#include "MmiDialogs.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+#include "ATBCommon.h"
+#include "ATBDisplay.h"
+#include "ATBEditor.h"
+#include "AUIEditor.h"
+#else /* NEW_EDITOR */
+#include "MmiEditor.h"
+#endif /* NEW_EDITOR */
+#include "MmiLists.h"
+#include "MmiIdle.h"
+#include "MmiSoftKeys.h"
+#include "Mmiicons.h"
+#include "MmiMenu.h"
+#include "MmiMain.h"
+#include "MmiStart.h"
+#include "MmiPins.h"
+
+#include "mmiColours.h"
+
+// June 16, 2005  REF: CRR 31267  x0021334
+// Added this BOOL variable to keep track of PIN2 requests.
+BOOL pin2Flag = FALSE;
+
+
+/*******************************************************************************
+	Local Data
+
+*******************************************************************************/
+#define	PIN_REQUEST_FOR_RATE			700
+#define	SERVICES_ENTER_CURRENCY			701
+#define	SERVICES_ONE_UNIT				702
+#define	SERVICES_RATE_CHANGED			703
+#define	SERVICES_CREDIT_REMAINING		704
+#define	PIN_REQUEST_FOR_LIMIT_CHANGE	705
+#define	PIN_REQUEST_FOR_LIMIT_CANCEL	706
+#define	SERVICES_LIMIT_VIEW				707
+#define	SERVICES_LIMIT_CHANGE			708
+#define	SERVICES_LIMIT_CANCEL			709
+#define	SERVICES_LIMIT_CHANGED			710
+#define	SERVICES_LAST_CHARGE			711
+#define	SERVICES_TOTAL_CHARGE			712
+#define	SERVICES_RESET_CHARGE			713
+#define	SERVICES_CHARGE_CHANGED			714
+#define	SERVICES_OUT_OF_RANGE			715
+#define	SERVICES_AOC_NOT_SUPPORTED		716
+#define PIN_REQUEST_FOR_RESET_CHARGE  717
+
+/*  May 25, 2004 REF: CRR MMI-SPR-17588		NISHIKANT KULKARNI
+	MAX_ENTER_LIMIT changed from 7 to 9 to accept "Limit" values till 16777215 (0xFFFFFF) 
+	Previously, with MAX_ENTER_LIMIT set to 7, maximum 999999 could be entered as limit.
+	Effectively, the limit is MAX_ENTER_LIMIT - 1. The last character used for string termination.
+	Also, the maximum value that can be entered (0xFFFFFF) is # defined to MAX_ENTER_VALUE
+*/
+/* Max. Enter of Character   */
+#define MAX_ENTER_LIMIT      9	// xnkulkar SPR-17588
+#define MAX_ENTER_CURRENCY   4
+#define MAX_ENTER_UNIT       6
+#define MAX_ENTER_VALUE		 0xFFFFFF	// xnkulkar SPR-17588
+/*    */
+
+
+
+typedef struct
+{
+	T_MMI_CONTROL			mmi_control;
+	T_MFW_HND				service_win;        /* MFW win handler      */
+	T_MFW_CM_AOC_INFO		aocInfo;
+	USHORT					Identifier;
+	char					edt_Buf[30]; 	  /* Editor buffer       */
+} T_SERVICES;
+
+
+
+
+LONG acm_last_call = 0; //accumulated call meter  from the last call
+//later the value should save and read again from PCM
+
+
+/*******************************************************************************
+	Local prototypes
+
+*******************************************************************************/
+T_MFW_HND	service_Init		(T_MFW_HND parent_window);
+void		service_Exit		(T_MFW_HND own_window);
+T_MFW_HND	service_create		(T_MFW_HND parent_window);
+void		service_destroy		(T_MFW_HND own_window);
+static int	service_win_cb		(T_MFW_EVENT event, T_MFW_WIN * win);
+void		service_dialog_cb	(T_MFW_HND win, USHORT identifier, UBYTE reason);
+void		service				(T_MFW_HND win, USHORT event, SHORT value, void * parameter);
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+void		service_loadEditDefault (T_AUI_EDITOR_DATA *editor_data);
+#else /* NEW_EDITOR */
+void		service_loadEditDefault (T_EDITOR_DATA *editor_data);
+#endif /* NEW_EDITOR */
+void		service_calc_balance   (T_MFW_HND win,char* line);
+void		service_calculate	(T_MFW_HND win, char* line, long value);
+USHORT		service_check_pin_for_aoc (void);
+//ADDED BY RAVI-29-11-2005
+extern T_MFW_HND	AUI_calc_Start(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data);
+// END RAVI
+
+/*******************************************************************************
+	Functions
+
+*******************************************************************************/
+
+/*******************************************************************************
+
+ $Function:    	aoc_credit_remaining
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+int aoc_credit_remaining (MfwMnu* m, MfwMnuItem* i)
+{
+     T_MFW_HND win = mfw_parent(mfw_header());
+
+	TRACE_FUNCTION("aoc_credit_remaining");
+
+	// create new dynamic dialog for the AOC
+    SEND_EVENT (service_Init (win), SERVICES_CREDIT_REMAINING, 0, 0);
+
+
+	return 0;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	aoc_charge_rate
+
+ $Description:	A security code editing screen is opened and Pin 2 requested.
+				Once entered successfully, an alpha. editor is opened with the
+				title "Enter currency".Once entered, an numeric editor is opened
+				with the title "Enter price p. unit". When the user has finished
+				entry the information screen " Rate changed" is displayed for
+				3 second and the phone returns to the previous sub-menu
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_charge_rate (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+	TRACE_FUNCTION("aoc_charge_rate");
+
+	switch (service_check_pin_for_aoc ())
+	{
+		case MFW_SIM_PIN2_REQ:
+			// June 16, 2005  REF: CRR 31267  x0021334
+			pin2Flag = TRUE;
+			// create new dynamic dialog for the AOC
+		       SEND_EVENT (service_Init (win), PIN_REQUEST_FOR_RATE, 0, 0);
+			break;
+
+		case MFW_SIM_PIN_REQ:
+		case MFW_SIM_NO_PIN:
+			//pin 1 or no pin required, open now the editor for entering the currency
+			SEND_EVENT (service_Init (win),  SERVICES_ENTER_CURRENCY, 0, 0);
+			break;
+
+	}
+
+	return 0;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	aoc_view_limit
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_view_limit (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+	TRACE_FUNCTION("aoc_view_limit");/*SPR2500*/
+
+
+	// create new dynamic dialog for the AOC
+    SEND_EVENT (service_Init (win), SERVICES_LIMIT_VIEW, 0, 0);
+
+	return 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	aoc_change_limit
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_change_limit (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+	TRACE_FUNCTION("aoc_change_limit");
+
+      /*SPR#1904 - DS - Added call to service_check_pin_for_aoc() to check if
+       *PIN2 entry is required.
+       */
+	switch (service_check_pin_for_aoc ())
+	{
+		case MFW_SIM_PIN2_REQ:
+			// June 16, 2005  REF: CRR 31267  x0021334
+			pin2Flag = TRUE;
+			// create new dynamic dialog for the AOC
+		       SEND_EVENT (service_Init (win), PIN_REQUEST_FOR_LIMIT_CHANGE, 0, 0);
+			break;
+
+		case MFW_SIM_PIN_REQ:
+		case MFW_SIM_NO_PIN:
+			//pin 1 or no pin required, open now the editor for entering the currency
+			SEND_EVENT (service_Init (win),  SERVICES_LIMIT_CHANGE, 0, 0);
+			break;
+
+	}
+
+	return 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	aoc_cancel_limit
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_cancel_limit (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+	TRACE_FUNCTION("aoc_charge_rate");
+
+      /*SPR#1904 - DS - Added call to service_check_pin_for_aoc() to check if
+       *PIN2 entry is required.
+       */
+	switch (service_check_pin_for_aoc ())
+	{
+		case MFW_SIM_PIN2_REQ:
+			// June 16, 2005  REF: CRR 31267  x0021334
+			pin2Flag = TRUE;
+			// create new dynamic dialog for the AOC
+		       SEND_EVENT (service_Init (win), PIN_REQUEST_FOR_LIMIT_CANCEL, 0, 0);
+			break;
+
+		case MFW_SIM_PIN_REQ:
+		case MFW_SIM_NO_PIN:
+			//pin 1 or no pin required, open now the editor for entering the currency
+			SEND_EVENT (service_Init (win),  SERVICES_LIMIT_CANCEL, 0, 0);
+			break;
+
+	}
+
+	return 0;
+}
+
+/*******************************************************************************
+
+ $Function:    	aoc_last_charge
+
+ $Description:	Dispays the charge for the last call in the currency or in units
+                if no currency information has been entered
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_last_charge (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+		TRACE_FUNCTION("aoc_last_charge"); /*SPR2500*/
+
+	// create new dynamic dialog for the AOC
+    SEND_EVENT (service_Init (win), SERVICES_LAST_CHARGE, 0, 0);
+
+
+	return 0;
+}
+
+/*******************************************************************************
+
+ $Function:    	aoc_total_charge
+
+ $Description:	Displays the charge for all calls since the chage counter was last reset
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_total_charge (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+		TRACE_FUNCTION("aoc_total_charge");/*SPR2500*/
+
+
+	// create new dynamic dialog for the AOC
+    SEND_EVENT (service_Init (win), SERVICES_TOTAL_CHARGE, 0, 0);
+
+
+	return 0;
+}
+/*******************************************************************************
+
+ $Function:    	aoc_reset_charge
+
+ $Description:	Resets the charge counter for all calls
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+int aoc_reset_charge (MfwMnu* m, MfwMnuItem* i)
+{
+    T_MFW_HND win = mfw_parent(mfw_header());
+
+		TRACE_FUNCTION("aoc_reset_charge");/*SPR2500*/
+
+
+  switch (service_check_pin_for_aoc ())
+  {
+    case MFW_SIM_PIN2_REQ:
+	// June 16, 2005  REF: CRR 31267  x0021334
+	pin2Flag = TRUE;
+      // create new dynamic dialog for the AOC
+      SEND_EVENT (service_Init (win), PIN_REQUEST_FOR_RESET_CHARGE, 0, 0);
+      break;
+
+    case MFW_SIM_PIN_REQ:
+    case MFW_SIM_NO_PIN:
+      //pin 1 or no pin required, open now the editor for entering the currency
+    SEND_EVENT (service_Init (win), SERVICES_RESET_CHARGE, 0, 0);
+
+      break;
+  }
+
+	return 0;
+}
+
+
+
+
+
+
+/*******************************************************************************
+
+ $Function:    	service_Init
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+T_MFW_HND service_Init (T_MFW_HND parent_window)
+{
+  return (service_create (parent_window));
+}
+
+
+/*******************************************************************************
+
+ $Function:    	service_Exit
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+void service_Exit (T_MFW_HND own_window)
+{
+
+    T_MFW_WIN   * win_data     = ((T_MFW_HDR *)own_window)->data;
+    T_SERVICES     * data         = (T_SERVICES *)win_data->user;
+
+  	TRACE_FUNCTION("service_Exit");
+	/*SPR 2500, check valid window pointer before destruction*/
+	if ((own_window) &&
+	     (win_data) &&
+	     (data) &&
+	     (data->service_win))
+	{
+		service_destroy (data->service_win);
+	}
+	else
+	{
+		TRACE_ERROR("service_Exit : Invalid Pointer passed");
+	}
+
+	return;
+
+}
+
+/*******************************************************************************
+
+ $Function:    	service_create
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+T_MFW_HND service_create (T_MFW_HND parent_window)
+{
+  T_SERVICES *  data = (T_SERVICES *)ALLOC_MEMORY (sizeof (T_SERVICES));
+  T_MFW_WIN   * win;
+
+
+  TRACE_FUNCTION ("service_create()");
+
+  data->service_win = win_create (parent_window, 0, 0, (T_MFW_CB)service_win_cb);
+
+  if (data->service_win EQ 0)
+    return 0;
+
+  /*
+   * Create window handler
+   */
+  data->mmi_control.dialog =  (T_DIALOG_FUNC)service;
+  data->mmi_control.data   = data;
+  win                      = ((T_MFW_HDR *)data->service_win)->data;
+  win->user                = (void *) data;
+
+
+  winShow(data->service_win);
+  /*
+   * return window handle
+   */
+  return data->service_win;
+}
+
+/*******************************************************************************
+
+ $Function:    	service_destroy
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+void service_destroy (T_MFW_HND own_window)
+{
+  T_MFW_WIN   * win;
+  T_SERVICES * data;
+
+  TRACE_FUNCTION ("service_destroy()");
+
+  if (own_window)
+  {
+    win  = ((T_MFW_HDR *)own_window)->data;
+    data = (T_SERVICES *)win->user;
+
+    if (data)
+    {
+
+      /*
+       * Delete WIN handler
+       */
+      win_delete (data->service_win);
+      data->service_win = 0;
+
+	  FREE_MEMORY ((void *)data, sizeof (T_SERVICES));
+
+    }
+  }
+}
+/*******************************************************************************
+
+ $Function:    	service_win_cb
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+static int service_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
+{
+  /*
+   * Top Window has no output
+   */
+  return 1;
+}
+
+/*******************************************************************************
+
+ $Function:    	service_dialog_cb
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+void service_dialog_cb(T_MFW_HND win, USHORT identifier, UBYTE reason)
+{
+	TRACE_FUNCTION ("service_dialog_cb()");
+
+      switch (reason)
+      {
+        case INFO_KCD_LEFT:
+          /* no break; */
+        case INFO_TIMEOUT:
+          /* no break; */
+        case INFO_KCD_HUP:
+          /* no break; */
+        case INFO_KCD_RIGHT:
+          /* no break; */
+        case INFO_KCD_CLEAR:
+
+			TRACE_EVENT_P1("identifier: %d", identifier);
+
+			if (identifier EQ SERVICES_OUT_OF_RANGE)
+			{
+				TRACE_EVENT ("SERVICES_OUT_OF_RANGE");
+				SEND_EVENT (win, SERVICES_ONE_UNIT, 0, 0);
+			}
+			else
+			{
+				TRACE_EVENT (" destroy ");
+	            service_Exit(win);
+			}
+          break;
+      }
+}
+
+/*******************************************************************************
+
+ $Function:    	service_editor_cb
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+static void service_editor_cb (T_MFW_HND win, USHORT Identifier, SHORT reason)
+{
+	T_MFW_WIN   * win_data = ((T_MFW_HDR *) win)->data;
+	T_SERVICES    * data     = (T_SERVICES *)win_data->user;
+
+
+	UBYTE		PWD[16], i;
+    int result;
+
+	TRACE_FUNCTION ("service_editor_cb()");
+	/*SPR 2500, check pointers valid*/
+	if ((!win) ||
+	     (!win_data) ||
+	     (!data))
+	{
+		TRACE_ERROR("service_editor_cb : Invalid Pointer passed");
+		return;
+	}
+
+	if ((!win) ||
+	     (!win_data) ||
+	     (!data))
+	{
+		TRACE_ERROR("service_editor_cb : Invalid Pointer passed");
+		return;
+	}
+
+      memset(PWD, 0x00, 16);
+
+	switch (reason)
+	{
+		case INFO_KCD_LEFT:
+			switch (Identifier)
+			{
+				case SERVICES_ENTER_CURRENCY:
+					TRACE_EVENT ("SERVICES_ENTER_CURRENCY");
+					TRACE_EVENT ("pressed left");
+
+
+                	// clear old current currency before overwrite it
+                    memset(data->aocInfo.cur, 0x80, sizeof(data->aocInfo.cur));
+
+                    if(strlen(data->edt_Buf) NEQ 0)
+                    {
+                        memcpy(data->aocInfo.cur, data->edt_Buf, MAX_ENTER_CURRENCY);
+                    }
+
+ 					//termination from ASCII to GSM default
+					for (i=0; i< MAX_ENTER_CURRENCY-1; i++)
+					{
+						if (data->aocInfo.cur[i] EQ '\0')
+						data->aocInfo.cur[i] = 0x80;
+					}
+
+
+					// open the next editor for entering the price per unit
+				    SEND_EVENT (win, SERVICES_ONE_UNIT, 0, 0);
+					break;
+
+				case SERVICES_ONE_UNIT:
+					TRACE_EVENT ("SERVICES_ONE_UNIT");
+					TRACE_EVENT ("pressed left");
+
+                    // clear old current ppu before overwrite it
+                    memset(data->aocInfo.ppu, '\0', sizeof(data->aocInfo.ppu));
+
+	                if(strlen(data->edt_Buf) NEQ 0)
+                    {
+                        memcpy(data->aocInfo.ppu, data->edt_Buf, strlen(data->edt_Buf));
+	                }
+
+
+                    // Password not necessary, Pin2 scenario done
+                                   memset(PWD, 0x00, 16);
+
+     				// write cur and ppu in AOC
+					result = cm_set_aoc_value(CM_AOC_PUCT, &data->aocInfo, PWD);
+
+
+					TRACE_EVENT_P1("PPU : %s", data->aocInfo.ppu);
+					TRACE_EVENT_P1("CUR : %s", data->aocInfo.cur);
+					TRACE_EVENT_P1("result : %d", result);
+
+					if(result EQ CM_OK)
+					{
+						SEND_EVENT (win, SERVICES_RATE_CHANGED, 0, 0);
+					}
+					else
+					{
+						SEND_EVENT (win, SERVICES_OUT_OF_RANGE, 0, 0);
+					}
+
+					break;
+
+				case SERVICES_LIMIT_CHANGE:
+
+					// string => long
+                    data->aocInfo.acm_max = atol(data->edt_Buf);
+
+					// Password not necessary, Pin2 scenario done
+                    memset(PWD, 0x00, 16);
+
+					//  May 25, 2004 REF: CRR MMI-SPR-17588		NISHIKANT KULKARNI
+
+					//  If the ACMmax value entered by the user is more than 16777215 (0xFFFFFF), 
+					//	display a "Not Allowed" message. 			
+					if(data->aocInfo.acm_max > MAX_ENTER_VALUE)
+					{
+						// Send event to display a "Not Allowed" message.
+						SEND_EVENT (win, SERVICES_AOC_NOT_SUPPORTED, 0, 0);
+					}
+
+					// Else set the ACMmax value in AoC.	
+					else
+					{
+						result = cm_set_aoc_value(CM_AOC_ACMMAX, &data->aocInfo, PWD); /* save ACMmax in AOC */
+
+						TRACE_EVENT_P1("%ld", data->aocInfo.acm_max);
+						TRACE_EVENT_P1("result of set aoc %d", result);
+
+						// Send event to display a "Limit Changed" message.
+						SEND_EVENT (win, SERVICES_LIMIT_CHANGED, 0, 0);
+					}
+
+					break;
+        case SERVICES_RESET_CHARGE:
+			/* MC 12/04/02: Changed ACMMAX to ACM (should fix "broken" SIM problem)*/
+
+					result = cm_set_aoc_value(CM_AOC_ACM, &data->aocInfo, PWD);	/* save ACMmax in AOC */
+
+			}
+			break;
+
+	    case INFO_KCD_RIGHT:
+	    case INFO_KCD_CLEAR:
+
+			TRACE_EVENT ("INFO_KCD_RIGHT pressed");
+
+			switch (Identifier)
+			{
+
+				case SERVICES_LIMIT_CHANGE:
+				case SERVICES_ENTER_CURRENCY:
+
+					//go back to the previous screen
+					service_Exit (win);
+					break;
+				case SERVICES_ONE_UNIT:
+
+					//go back to the previous screen
+					SEND_EVENT (win, SERVICES_ENTER_CURRENCY, 0, 0);
+					break;
+
+
+				default:
+					break;
+			}
+    default:
+			break;
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	createAOCDialog
+
+ $Description:	Creates a dialog from 4 input parameters
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+static void createAOCDialog( T_MFW_HND win, USHORT txtId1, USHORT txtId2, char *str2, USHORT event )
+{
+  	T_DISPLAY_DATA display_info;
+
+	dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, txtId1, txtId2, COLOUR_AOC);
+	dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)service_dialog_cb, THREE_SECS, KEY_CLEAR | KEY_RIGHT | KEY_LEFT );
+	display_info.Identifier			= event;
+    display_info.TextString2    	= str2;
+	info_dialog (win, &display_info);
+}
+/*******************************************************************************
+
+ $Function:    	service
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+void service (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+	T_MFW_WIN    * win_data = ((T_MFW_HDR *) win)->data;
+	T_SERVICES    * data     = (T_SERVICES *)win_data->user;
+
+        /* CQ13428 - NDH - Use dynamically allocated memory to prevent MMI Stack Overflow */
+#ifdef NEW_EDITOR
+        /* SPR#1428 - SH - New Editor data */
+	T_AUI_EDITOR_DATA *editor_data = (T_AUI_EDITOR_DATA *)ALLOC_MEMORY (sizeof (T_AUI_EDITOR_DATA));
+#else
+	T_EDITOR_DATA	*editor_data = (T_EDITOR_DATA *)ALLOC_MEMORY (sizeof (T_EDITOR_DATA));
+#endif
+  //	T_MFW_SIM_PIN_STATUS status;  // RAVI
+
+	UBYTE					i, result;
+       UBYTE                                PWD[16];
+    static char line[MAX_LINE];
+
+	TRACE_FUNCTION("service()");
+
+       if (!editor_data)
+        {
+            TRACE_ERROR("service : Failed to allocate memory for the Editor Data");
+            return;
+        }
+	if ((!win) ||
+	     (!win_data) ||
+	     (!data))
+	{
+		TRACE_ERROR("service : Invalid Pointer passed");
+              /* CQ13428 - NDH - Use dynamically allocated memory to prevent MMI Stack Overflow */
+#ifdef NEW_EDITOR
+              FREE_MEMORY((void *)editor_data, sizeof (T_AUI_EDITOR_DATA));
+#else
+              FREE_MEMORY((void *)editor_data, sizeof (T_EDITOR_DATA));
+#endif
+		return;
+	}
+
+      memset(PWD, 0x00, 16);
+	switch (event)
+	{
+
+		case SERVICES_CREDIT_REMAINING:
+
+            memset(line,'\0',sizeof(line));
+
+			//Get the ACM MAX
+            cm_get_aoc_value(CM_AOC_ACMMAX,&data->aocInfo);
+
+			//Get ACM
+            cm_get_aoc_value(CM_AOC_ACM,&data->aocInfo);
+
+			//Get currency and price per unit
+            cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);
+
+
+			TRACE_EVENT_P1("ACMMAX: %ld", data->aocInfo.acm_max);
+			TRACE_EVENT_P1("ACM: %ld", data->aocInfo.acm);
+			TRACE_EVENT_P1("PPU:%s", data->aocInfo.ppu);
+			TRACE_EVENT_P1("CUR:%s", data->aocInfo.cur);
+
+
+            if ((data->aocInfo.acm_max NEQ '\0') && (data->aocInfo.acm NEQ '\0'))
+            {
+                /* special case: It is not possible to have ACM > ACMMAX   */
+                /* this case the mobile has to disconnect */
+                if(data->aocInfo.acm > data->aocInfo.acm_max)
+                {
+                    strcpy(line, "????");
+                }
+                else
+                {
+                    /* calculate the credit with ACMAX and PPU  */
+                    TRACE_EVENT ("CREDIT :ACMMAX !=0 and PPU !=0");
+                    service_calc_balance (win,(char*)line);
+
+                }
+            }
+            if ((data->aocInfo.acm_max EQ '\0') && (data->aocInfo.acm NEQ '\0'))
+            {
+                /* calculate the cost with ACM and PPU  */
+                TRACE_EVENT ("CREDIT :ACMMAX ==0 and PPU !=0");
+                service_calculate (win, (char*)line, data->aocInfo.acm);
+
+            }
+            if ((data->aocInfo.acm_max EQ '\0') && (data->aocInfo.acm NEQ '\0') )
+            {
+                /* show only ACM */
+                TRACE_EVENT ("CREDIT :ACMMAX ==0 and PPU ==0");
+                sprintf(line, "%ld", data->aocInfo.acm); /*   */
+            }
+             if ((data->aocInfo.acm_max NEQ '\0') && (data->aocInfo.acm NEQ '\0'))
+            {
+                /*  show only ACMAX  */
+                TRACE_EVENT ("CREDIT :ACMMAX !=0 and PPU ==0");
+                sprintf(line, "%ld", data->aocInfo.acm_max - data->aocInfo.acm); /*   */
+            }
+
+			if (data->aocInfo.acm EQ '\0')
+           		strcpy ((char *)line, "0");
+
+			//from ASCII to GSM default
+			for (i=0; i< MAX_LINE; i++)
+			{
+				if (line[i] EQ 0x80 OR line[i] EQ 0xFF )
+					line[i] = '\0';
+			}
+
+
+            if (data->aocInfo.acm_max EQ 0)
+            {
+				createAOCDialog( win,  TxtCost, TxtNull, line, event);
+            }
+            else
+            {
+				createAOCDialog( win,  TxtBalance, TxtNull, line, event);
+            }
+			break;
+
+
+
+
+		case PIN_REQUEST_FOR_RATE:
+			//save the status
+		    data->Identifier = SERVICES_ENTER_CURRENCY;
+
+			//PIN2 is requested to change the Rate
+            pin2_check (data->service_win);
+
+			break;
+
+		case PIN_REQUEST_FOR_LIMIT_CHANGE:
+
+			//PIN2 is requested to change the Rate
+            pin2_check (data->service_win);
+
+			//save the status
+		    data->Identifier = SERVICES_LIMIT_CHANGE;
+			break;
+
+		case PIN_REQUEST_FOR_LIMIT_CANCEL:
+
+			//PIN2 is requested to change the Rate
+            pin2_check (data->service_win);
+
+			//save the status
+		    data->Identifier = SERVICES_LIMIT_CANCEL;
+			break;
+
+    case PIN_REQUEST_FOR_RESET_CHARGE:
+      //save the status
+        data->Identifier = SERVICES_RESET_CHARGE;
+
+      //PIN2 is requested to change the Rate
+            pin2_check (data->service_win);
+
+      break;
+
+
+		//it calls from MMI PINS
+        case PIN2_OK:
+			TRACE_EVENT("PIN2_OK");
+
+			switch (data->Identifier)
+			{
+				case SERVICES_ENTER_CURRENCY:
+
+						//pin was ok, open now the editor for entering the currency
+						SEND_EVENT (win, data->Identifier, 0, 0);
+					break;
+				case SERVICES_LIMIT_CHANGE:
+
+						//pin was ok, open now the editor for entering the currency
+						SEND_EVENT (win, data->Identifier, 0, 0);
+					break;
+				case SERVICES_LIMIT_CANCEL:
+
+						//pin was ok, open now the editor for entering the currency
+						SEND_EVENT (win, data->Identifier, 0, 0);
+					break;
+        case SERVICES_RESET_CHARGE:
+
+            //pin was ok, open now the editor for entering the currency
+            SEND_EVENT (win, data->Identifier, 0, 0);
+          break;
+
+
+
+			}
+			break;
+
+        case  PIN2_ABORT:
+			createAOCDialog( win, TxtFailed, TxtNull, line, event );
+		    break;
+
+        case SERVICES_ENTER_CURRENCY:
+
+
+        	//save the status
+		    data->Identifier = SERVICES_ENTER_CURRENCY;
+
+
+			//PUCT (currency and price per unit) is requested
+	        result = cm_get_aoc_value(CM_AOC_PUCT, &data->aocInfo);
+
+			TRACE_EVENT_P1("result %d", result);
+
+			//fill up editor-sttribut with default
+			service_loadEditDefault (editor_data);
+
+			//clear the editor-buffer
+			memset(data->edt_Buf,'\0',sizeof(data->edt_Buf));
+
+			// let to show the current currency, before the user change it */
+		    memcpy(data->edt_Buf, data->aocInfo.cur, MAX_ENTER_CURRENCY);
+
+
+			for (i=0; i< MAX_ENTER_CURRENCY-1; i++)
+			{
+				if (data->edt_Buf[i] EQ 0x80 OR data->edt_Buf[i] EQ 0xFF )
+					data->edt_Buf[i] = '\0';
+			}
+
+/* SPR#1428 - SH - New Editor changes */
+
+#ifdef NEW_EDITOR
+			AUI_edit_SetBuffer(editor_data, ATB_DCS_ASCII, (UBYTE *)data->edt_Buf, MAX_ENTER_CURRENCY);
+			AUI_edit_SetTextStr(editor_data, TxtSoftOK, TxtDelete, TxtEnterCurrency, NULL);
+			AUI_edit_SetEvents(editor_data, data->Identifier, TRUE, FOREVER, (T_AUI_EDIT_CB)service_editor_cb);
+			AUI_edit_SetMode(editor_data, ED_MODE_ALPHA, ED_CURSOR_BAR);
+
+			AUI_edit_Start(data->service_win, editor_data);
+#else /* NEW_EDITOR */
+			editor_data->editor_attr.text	= data->edt_Buf;  /* buffer to be edited */
+			editor_data->editor_attr.size	= MAX_ENTER_CURRENCY;/* limit to 3 letters */
+			editor_data->LeftSoftKey			= TxtSoftOK;
+			editor_data->RightSoftKey		= TxtDelete;
+			editor_data->TextId				= TxtEnterCurrency;
+			editor_data->Identifier			= data->Identifier;
+			editor_data->mode				= ALPHA_MODE;
+			editor_data->AlternateLeftSoftKey     = TxtNull;
+			editor_data->min_enter		    = 1;
+
+			/* create the dialog handler */
+			editor_start(data->service_win, editor_data);  /* start the editor */
+#endif /* NEW_EDITOR */
+			break;
+
+
+
+        case SERVICES_ONE_UNIT:
+
+			//save the status
+		    data->Identifier = SERVICES_ONE_UNIT;
+
+			//fill up editor-sttribut with default
+			service_loadEditDefault (editor_data);
+
+			//clear the editor-buffer
+			memset(data->edt_Buf,'\0',sizeof(data->edt_Buf));
+
+           /* let to show the current price per unit, before the user change it */
+            memcpy(data->edt_Buf, data->aocInfo.ppu, sizeof(data->aocInfo.ppu));
+
+			for (i=0; i< MAX_ENTER_UNIT-1; i++)
+			{
+				if (data->edt_Buf[i] EQ 0x80 OR data->edt_Buf[i] EQ 0xFF )
+					data->edt_Buf[i] = '\0';
+			}
+
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+			AUI_edit_SetBuffer(editor_data, ATB_DCS_ASCII, (UBYTE *)data->edt_Buf, MAX_ENTER_UNIT);
+			AUI_edit_SetTextStr(editor_data, TxtSoftOK, TxtDelete, Txt1Unit, NULL);
+			AUI_edit_SetEvents(editor_data, data->Identifier, TRUE, FOREVER, (T_AUI_EDIT_CB)service_editor_cb);
+			AUI_edit_SetMode(editor_data, 0, ED_CURSOR_BAR);
+
+			AUI_calc_Start(data->service_win, editor_data);
+#else /* NEW_EDITOR */
+			editor_data->editor_attr.text	= data->edt_Buf;  /* buffer to be edited */
+			editor_data->editor_attr.size	= MAX_ENTER_UNIT;/* limit to 5 numerics */
+			editor_data->LeftSoftKey			= TxtSoftOK;
+			editor_data->RightSoftKey		= TxtDelete;
+			editor_data->TextId				= Txt1Unit;
+			editor_data->Identifier			= data->Identifier;
+			editor_data->mode				= CALC_MODE;
+			editor_data->AlternateLeftSoftKey     = TxtNull;
+			editor_data->min_enter		    = 1;
+
+			/* create the dialog handler */
+			editor_start(data->service_win, editor_data);  /* start the editor */
+#endif /* NEW_EDITOR */
+			break;
+
+
+		case SERVICES_RATE_CHANGED:
+			createAOCDialog( win,  TxtRate, TxtChanged, NULL, event);
+			break;
+
+		case SERVICES_LIMIT_VIEW:
+
+            memset(line,'\0',sizeof(line));
+
+            cm_get_aoc_value(CM_AOC_ACMMAX,&data->aocInfo);  /* Get the ACM MAX     */
+            cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);    /* Get currency and price per unit */
+
+            TRACE_EVENT_P1("ACMMAX: %ld", data->aocInfo.acm_max);
+            TRACE_EVENT_P1("ACM: %ld", data->aocInfo.acm);
+            TRACE_EVENT_P1("PPU:%s", data->aocInfo.ppu);
+            TRACE_EVENT_P1("CUR:%s", data->aocInfo.cur);
+
+            if((strlen((char*)data->aocInfo.ppu) EQ 0) && data->aocInfo.acm_max NEQ '\0')
+            {
+                sprintf(line, "%ld", data->aocInfo.acm_max);     /* Show only ACMmax  */
+	            TRACE_EVENT ("get only :ACMMAX ; PPU ==0 and ACMMAX!=0");
+            }
+            if((strlen((char*)data->aocInfo.ppu) NEQ 0) && data->aocInfo.acm_max NEQ '\0')
+            {
+				service_calculate (win, (char*)line, data->aocInfo.acm_max);
+
+                TRACE_EVENT ("calculate ACMMAX * PPU; PPU !=0 and ACMMAX!=0");
+            }
+
+			for (i=0; i< MAX_LINE; i++)
+			{
+				if (line[i] EQ 0x80 OR line[i] EQ 0xFF )
+					line[i] = '\0';
+			}
+
+            if(data->aocInfo.acm_max NEQ '\0')
+            {
+				createAOCDialog( win,  TxtLimitEq, TxtNull, line, event);
+            }
+            else
+            {
+				createAOCDialog( win,  TxtNo, TxtLimit, NULL, event);
+            }
+
+			  /*
+			   * Call Info Screen
+			   */
+
+			break;
+
+		case SERVICES_LIMIT_CHANGE:
+
+			//fill up editor-sttribut with default
+			service_loadEditDefault (editor_data);
+
+			//clear the editor-buffer
+			memset(data->edt_Buf,'\0',sizeof(data->edt_Buf));
+
+			data->Identifier = SERVICES_LIMIT_CHANGE; /*SPR 2500*/
+
+
+			data->Identifier = SERVICES_LIMIT_CHANGE;
+
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+
+			AUI_edit_SetBuffer(editor_data, ATB_DCS_ASCII, (UBYTE *)data->edt_Buf, MAX_ENTER_LIMIT);
+			AUI_edit_SetTextStr(editor_data, TxtSoftOK, TxtDelete, TxtEnterLimit, NULL);
+			AUI_edit_SetEvents(editor_data, data->Identifier, TRUE, FOREVER, (T_AUI_EDIT_CB)service_editor_cb);
+			AUI_edit_SetMode(editor_data, 0, ED_CURSOR_BAR);
+
+			AUI_calc_Start(data->service_win, editor_data);
+#else /* NEW_EDITOR */
+			editor_data->editor_attr.text	= data->edt_Buf;  /* buffer to be edited */
+			editor_data->editor_attr.size	= MAX_ENTER_LIMIT; /* limit to 6 terms of units */
+			editor_data->LeftSoftKey			= TxtSoftOK;
+			editor_data->RightSoftKey		= TxtDelete;
+			editor_data->TextId				= TxtEnterLimit;
+			editor_data->Identifier			= data->Identifier;
+			editor_data->mode				= CALC_MODE;
+			editor_data->AlternateLeftSoftKey     = TxtNull;
+			editor_data->min_enter		    = 1;
+
+			/* create the dialog handler */
+			editor_start(data->service_win, editor_data);  /* start the editor */
+#endif /* NEW_EDITOR */
+
+			break;
+		case SERVICES_LIMIT_CANCEL:
+
+					// clear the limit
+                    data->aocInfo.acm_max = 0;
+
+					// Password not necessary, Pin2 scenario done
+                    memset(PWD, 0x00, 16);
+
+			cm_set_aoc_value(CM_AOC_ACMMAX, &data->aocInfo, PWD);	/* save ACMmax in AOC */
+
+			TRACE_EVENT_P1("%ld", data->aocInfo.acm_max);
+
+                    SEND_EVENT (win, SERVICES_LIMIT_CHANGED, 0, 0);
+
+			break;
+
+		case SERVICES_LIMIT_CHANGED:
+			createAOCDialog( win,  TxtLimit, TxtChanged, NULL, event);
+
+			break;
+
+		case SERVICES_LAST_CHARGE:
+
+            cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);    /* Get currency and price per unit */
+            cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);    /* Get currency and price per unit */
+
+		    if ( strlen((char*)data->aocInfo.ppu) EQ 0 )
+            {
+                TRACE_EVENT ("get only :ACM ; PPU ==0 and ACM!=0");
+
+				//show only the units ACM from last call
+                sprintf(line, "%ld", acm_last_call);
+
+
+            }
+			else
+            {
+                TRACE_EVENT ("get only :ACM ; PPU !=0 and ACM!=0");
+
+				// add currency
+				sprintf(line, "%ld %s", acm_last_call, data->aocInfo.cur);
+
+            }
+
+
+
+			if (acm_last_call EQ '\0')
+           		strcpy ((char *)line, "0");
+
+			createAOCDialog( win,  TxtLastCharge, TxtNull, line, event);
+            break;
+
+		case SERVICES_TOTAL_CHARGE:
+
+            memset(line,'\0',sizeof(line));
+
+            cm_get_aoc_value(CM_AOC_ACM,&data->aocInfo);  /* Get the ACM      */
+            cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);    /* Get currency and price per unit */
+
+
+		    /* nm test only  set the default  */
+
+			TRACE_EVENT_P1("ACM: %ld", data->aocInfo.acm);
+			TRACE_EVENT_P1("PPU:%s", data->aocInfo.ppu);
+			TRACE_EVENT_P1("CUR:%s", data->aocInfo.cur);
+
+
+            if((strlen((char*)data->aocInfo.ppu) EQ 0) && data->aocInfo.acm NEQ '\0')
+            {
+				//show only the units ACM
+                sprintf(line, "%ld", data->aocInfo.acm);
+                TRACE_EVENT ("get only :ACM ; PPU ==0 and ACM!=0");
+
+            }
+            if((strlen((char*)data->aocInfo.ppu) NEQ 0) && data->aocInfo.acm NEQ '\0')
+            {
+
+				service_calculate (win, (char*)line, data->aocInfo.acm);
+
+                TRACE_EVENT ("calculate ACM * PPU; PPU !=0 and ACM!=0");
+            }
+
+			if (data->aocInfo.acm EQ '\0')
+           		strcpy ((char *)line, "0");
+
+			createAOCDialog( win,  TxtTotalCharge, TxtNull, line, event);
+
+			break;
+
+		case SERVICES_RESET_CHARGE:
+
+			// clear the charge counter for all calls
+            data->aocInfo.acm = 0;
+			acm_last_call	 = 0;
+
+			(void)cm_set_aoc_value(CM_AOC_ACM, &data->aocInfo, PWD);		/* save ACM in AOC */
+
+			TRACE_EVENT_P1("%ld", data->aocInfo.acm);
+
+            SEND_EVENT (win, SERVICES_CHARGE_CHANGED, 0, 0);
+
+			break;
+
+		case SERVICES_CHARGE_CHANGED:
+			createAOCDialog( win,  TxtResetCharge, TxtNull, NULL, event);
+			break;
+		case SERVICES_OUT_OF_RANGE:
+
+				TRACE_EVENT("SERVICES_OUT_OF_RANGE");
+			createAOCDialog( win,  TxtOutofRange, TxtNull, NULL, event);
+ 			break;
+
+		case SERVICES_AOC_NOT_SUPPORTED:
+				TRACE_EVENT("SERVICES_NOT_ALLOWED");
+			createAOCDialog( win,  TxtNotAllowed, TxtNull, NULL, event);
+ 			break;
+
+
+	}
+
+     /* CQ13428 - NDH - Use dynamically allocated memory to prevent MMI Stack Overflow */
+#ifdef NEW_EDITOR
+     FREE_MEMORY((void *)editor_data, sizeof (T_AUI_EDITOR_DATA));
+#else
+     FREE_MEMORY((void *)editor_data, sizeof (T_EDITOR_DATA));
+#endif
+     return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	service_loadEditDefault
+
+ $Description:	fill up editor-sttribut with default
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+#ifdef NEW_EDITOR
+/* SPR#1428 - SH - New Editor changes */
+void service_loadEditDefault (T_AUI_EDITOR_DATA *editor_data)
+{
+		TRACE_FUNCTION ("service_loadEditDefault()");
+
+		AUI_edit_SetDefault(editor_data);
+		AUI_edit_SetDisplay(editor_data, ZONE_FULL_SK_TITLE, COLOUR_EDITOR, EDITOR_FONT);
+		AUI_edit_SetEvents(editor_data, 0, TRUE, FOREVER, (T_AUI_EDIT_CB)service_editor_cb);
+		AUI_edit_SetTextStr(editor_data, TxtSoftSelect, TxtSoftBack, TxtNull, NULL);
+		AUI_edit_SetMode(editor_data, 0, ED_CURSOR_UNDERLINE);
+		AUI_edit_SetAltTextStr(editor_data, 1, TxtNull, FALSE, TxtNull);
+		return;
+}
+#else /* NEW_EDITOR */
+void service_loadEditDefault (T_EDITOR_DATA *editor_data)
+{
+		TRACE_FUNCTION ("service_loadEditDefault()");
+
+		editor_attr_init(&editor_data->editor_attr, ZONE_SMALL_EDITOR, edtCurBar1, NULL, NULL, 0, COLOUR_EDITOR);
+	    editor_data->editor_attr.font     = 0;
+
+		editor_data_init( editor_data, (T_EDIT_CB)service_editor_cb, TxtSoftSelect, TxtSoftBack, TxtNull, 1, DIGITS_MODE, FOREVER);
+		editor_data->hide			    = FALSE;
+		editor_data->destroyEditor	    = TRUE;
+		editor_data->AlternateLeftSoftKey   = TxtNull;
+}
+#endif /* NEW_EDITOR */
+
+/*******************************************************************************
+
+ $Function:    	service_calc_balance
+
+ $Description:	Calculate the Credit remaining
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+void service_calc_balance (T_MFW_HND win,char* line)
+{
+    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
+	T_SERVICES    * data     = (T_SERVICES *)win_data->user;
+
+
+    char line2[MAX_LINE];
+    char *pdest,*src,*dst,*POINT;
+    LONG result;
+    int  ch = '.';
+    UBYTE counter=0;
+	if ((!win) ||
+	     (!win_data) ||
+	     (!data))
+	{
+		TRACE_ERROR("service_calc_balance : Invalid Pointer passed");
+		return;
+	}
+
+    /*SPR 2500, chack validity of pointers before continuing*/
+	if ((!win) ||
+	     (!win_data) ||
+	     (!data))
+	{
+		TRACE_ERROR("service_calc_balance : Invalid Pointer passed");
+		return;
+	}
+
+    memset(line2,'\0',sizeof(line2));
+
+    cm_get_aoc_value(CM_AOC_ACMMAX,&data->aocInfo);  /* Get the ACM MAX     */
+    cm_get_aoc_value(CM_AOC_ACM,&data->aocInfo);     /* Get ACM  */
+    cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);    /* Get currency and price per unit */
+
+
+
+    /* Search for '.' */
+    pdest =(char *) strchr((char*) data->aocInfo.ppu, ch );
+
+    if( pdest EQ NULL )                              /* '.' not founded  */
+    {
+        result = atol((char*)data->aocInfo.ppu );                /* STRING => LONG   */
+        result= result *(data->aocInfo.acm_max - data->aocInfo.acm); /* (ACMmax-ACM) * PPU */
+        sprintf(line, "%ld %s", result,data->aocInfo.cur); /* LONG => STRING   */
+    }
+    else                                        /* '.' found  */
+    {
+    /*
+    * '.' found, *pdest EQ '.'
+        */
+        counter = strlen(pdest + 1); /* store the decimal place */
+
+        src = (char*)data->aocInfo.ppu;
+        dst = line;
+        do                           /* remove the '.'   */
+        {
+            if (*src NEQ '.')
+            {
+                *dst++ = *src;
+            }
+        } while (*src++ NEQ '\0');
+        /* STRING => LONG   */
+        result= (atol(line))*(data->aocInfo.acm_max - data->aocInfo.acm); /* (ACMmax - ACM) * PPU */
+        sprintf(line, "%ld", result);        /* LONG => STRING   */
+
+        if(strlen(line) < counter)
+        {
+            src = line;
+            dst = line2;
+            *dst++ = '0';
+            *dst++ = '.';
+            counter = counter - strlen(line);
+            do                               /* fill up with '0'   */
+            {
+                *dst++ = '0';
+            } while (--counter NEQ 0);
+
+            memcpy (dst,src,sizeof(src));
+            sprintf(line, "%s %s", line2,data->aocInfo.cur);     /* add the currency */
+            return;
+        }
+        src = line;
+        dst = line2;
+        POINT= src + strlen(src) - counter;
+        do                                  /* set the '.'   */
+        {
+            if (src EQ POINT)
+            {
+                *dst++ = '.';
+            }
+            *dst++ = *src++;
+
+        } while (*src NEQ '\0');
+
+        if (line2[0] EQ '.')
+            sprintf(line, "0%s %s", line2,data->aocInfo.cur);     /* add the currency */
+
+        if (line2[0] NEQ '.')
+            sprintf(line, "%s %s", line2,data->aocInfo.cur);     /* add the currency */
+
+    }
+    return;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	service_calculate
+
+ $Description:	Calculate the value with price per unit and currency.
+
+ 				"value * PPU" @ currency
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+
+
+void service_calculate (T_MFW_HND win, char* line, long value)
+{
+    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
+	T_SERVICES      * data     = (T_SERVICES *)win_data->user;
+
+    char line2[MAX_LINE];
+    char *pdest,*src,*dst,*POINT;
+    LONG result;
+    int  ch = '.';
+    UBYTE counter=0;
+
+    /*SPR2500, check validity of pinters before continuing*/
+	if ((!win) ||
+	     (!win_data) ||
+	     (!data))
+	{
+		TRACE_ERROR("service_calculate : Invalid Pointer passed");
+		return;
+	}
+
+    memset(line2,'\0',sizeof(line2));
+
+    cm_get_aoc_value(CM_AOC_ACM,&data->aocInfo);     /* Get ACM  */
+    cm_get_aoc_value(CM_AOC_PUCT,&data->aocInfo);    /* Get currency and price per unit */
+
+
+
+
+    /* Search for '.' */
+    pdest =(char *) strchr((char*) data->aocInfo.ppu, ch );
+    if( pdest EQ NULL )                              /* '.' not founded  */
+    {
+        result = atol((char*)data->aocInfo.ppu );                /* STRING => LONG   */
+        result= result * value;            /* value * PPU */
+        sprintf(line, "%ld %s", result,data->aocInfo.cur); /* LONG => STRING   */
+    }
+    else                                        /* '.' found  */
+    {
+        /*
+         * '.' found, *pdest EQ '.'
+         */
+        counter = strlen(pdest + 1); /* store the decimal place */
+
+        src = (char*)data->aocInfo.ppu;
+        dst = line;
+        do                           /* remove the '.'   */
+        {
+            if (*src NEQ '.')
+            {
+                *dst++ = *src;
+            }
+        } while (*src++ NEQ '\0');
+
+        /* STRING => LONG   */
+        result= atol(line) * value;        /* value * PPU     */
+        sprintf(line, "%ld", result);        /* LONG => STRING   */
+
+        if(strlen(line) < counter)
+        {
+            src = line;
+            dst = line2;
+            *dst++ = '0';
+            *dst++ = '.';
+            counter = counter - strlen(line);
+            do                               /* fill up with '0'   */
+            {
+                *dst++ = '0';
+            } while (--counter NEQ 0);
+
+            memcpy (dst,src,sizeof(src));
+            sprintf(line, "%s %s", line2,data->aocInfo.cur);     /* add the currency */
+            return;
+        }
+        src = line;
+        dst = line2;
+        POINT= src + strlen(src) - counter;
+        do                                  /* set the '.'   */
+        {
+            if (src EQ POINT)
+            {
+                *dst++ = '.';
+            }
+            *dst++ = *src++;
+
+        } while (*src NEQ '\0');
+
+        if (line2[0] EQ '.')
+            sprintf(line, "0%s %s", line2,data->aocInfo.cur);     /* add the currency */
+
+        if (line2[0] NEQ '.')
+            sprintf(line, "%s %s", line2,data->aocInfo.cur);     /* add the currency */
+    }
+    return;
+}
+
+/*******************************************************************************
+
+ $Function:    	service_check_pin_for_aoc
+
+ $Description: this function check the PIN 2 requirement & availability of AOC
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+USHORT service_check_pin_for_aoc (void)
+{
+	T_MFW_AOC_ACCESS access;
+
+	/* check PIN 2 requirement & availability of AOC */
+	sim_configuration (NULL, NULL, NULL, NULL, NULL, &access);
+
+	TRACE_EVENT_P3("acm:%d acmmax:%d,puct:%d", access.access_acm,access.access_acmmax,access.access_puct);
+
+
+	if (access.access_acm     EQ MFW_SIM_PIN2 &&
+	   access.access_acmmax EQ MFW_SIM_PIN2 &&
+	   access.access_puct     EQ MFW_SIM_PIN2)
+	{
+		TRACE_EVENT("PIN 2 required");
+		return MFW_SIM_PIN2_REQ;
+
+	}
+	else if (access.access_acm     EQ MFW_SIM_PIN1 &&
+	       access.access_acmmax EQ MFW_SIM_PIN1 &&
+	       access.access_puct     EQ MFW_SIM_PIN1)
+	{
+		TRACE_EVENT("PIN 1 required");
+		return MFW_SIM_PIN_REQ;
+
+	}
+	else if (access.access_acm     EQ MFW_SIM_NO_PIN &&
+	       access.access_acmmax EQ MFW_SIM_NO_PIN &&
+	       access.access_puct     EQ MFW_SIM_NO_PIN)
+	{
+		TRACE_EVENT("no any PIN  required");
+		return MFW_SIM_NO_PIN;
+
+	}
+	else if (access.access_acm     EQ MFW_SIM_UNKNOWN &&
+	       access.access_acmmax EQ MFW_SIM_UNKNOWN &&
+	       access.access_puct     EQ MFW_SIM_UNKNOWN)
+	{
+		TRACE_EVENT("AOC not supported");
+		return MFW_SIM_FAILURE;
+	}
+
+
+}
+
+/*******************************************************************************
+
+ $Function:    	service_check_aoc
+
+ $Description:   If there is no support for AOC on SIM card
+ 			   the item "Charge Timers" will not Appear on the menulist
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+USHORT service_check_aoc (struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi)
+{
+	TRACE_FUNCTION("service_check_aoc");
+
+	switch (service_check_pin_for_aoc ())
+	{
+		case MFW_SIM_PIN2_REQ:
+		case MFW_SIM_PIN_REQ:
+		case MFW_SIM_NO_PIN:
+			TRACE_EVENT("AOC item visible");
+			return 0;
+			//break;   // RAVI
+
+		case MFW_SIM_FAILURE:
+			TRACE_EVENT("AOC item not visible");
+			return 1;
+			//break;  // RAVI
+	}
+
+
+}