telephonyserverplugins/simtsy/src/CSimUsimR6.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/CSimUsimR6.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,2473 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This file contains the implementation for the Simulator USIM R6 class 'CSimUsimR6'
+// 
+//
+
+/**
+ @file
+*/
+
+#include <e32property.h>
+#include <testconfigfileparser.h>
+#include <sacls.h>
+#include <e32math.h>
+#include "CSimPhone.h"
+#include "Simlog.h"
+#include "CSimPubSubChange.h"
+#include "CSimTsyMode.h"
+#include <etelmmerr.h>
+#include "CSimPubSub.h"
+#include "SimTsy.h"
+#include "simtsyglobalproperties.h"
+#include "CSimUsimR6.h"
+#include <et_phone.h>
+
+const TInt KUsimGranularity=2;		// < Granularity for USIM list array
+const TInt KUsimRel6DurationTimeoutDefault=1;
+const TInt KUsimRel6DurationTimeoutDefault1=2;
+const TInt KUsimRel6DurationTimeoutDefault2=3;
+
+CSimUsimR6* CSimUsimR6::NewL(CSimPhone* aPhone)
+/**
+ * Standard two-phase constructor.
+ * @param aPhone				The parent phone object.
+ * @return CSimUsimR6	The new network status class.
+ */
+	{
+	CSimUsimR6* self=new(ELeave) CSimUsimR6(aPhone);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CSimUsimR6::CSimUsimR6(CSimPhone* aPhone)
+: iPhone(aPhone)
+/**
+* Trivial first phase construction.
+* @param aPhone				The parent phone object.
+*/
+	{
+	iMailBoxNumberChangePending = EFalse;
+	iIccMessageWaitingPending = EFalse;
+	iMessageWaitingPending = EFalse;
+	iMailBoxNumberChangePendingV8 = EFalse;
+	iIccMessageWaitingPendingV8 = EFalse;
+	iNotifyWlanDataChangePending=EFalse;
+	iNotifyPreferredWlanSIDListChangePending= EFalse;
+	}
+
+void CSimUsimR6::ConstructL()
+/**
+ * Second phase construction. Create instances of the necessary heap-based objects and read the necessary Release6  information
+ * from the configuration file. The config file informations simulates the information given by Network
+ *
+ * 
+ */
+	{
+	LOGMISC1("CSimUsimR6: Entered ConstructL()");
+	iVoiceMailIds=new(ELeave) CArrayFixFlat<RMobilePhone::TMobilePhoneVoicemailIdsV8>(KUsimGranularity);
+	iMessageWaiting=new(ELeave) CArrayFixFlat<RMobilePhone::TMobilePhoneMessageWaitingV8>(KUsimGranularity);
+	
+	iWlanData=new(ELeave) CArrayFixFlat<RMobilePhone::TUsimWlanDataV8>(KUsimGranularity);
+	iWlanSid=new(ELeave) CArrayFixFlat<RMobilePhone::TWlanSIDV8>(KUsimGranularity);	
+	iPreferredNetworks=new(ELeave) CArrayFixFlat<RMobilePhone::TMobilePreferredNetworkEntryV3>(KUsimGranularity);
+	
+	iGBAAuthInfoList =new(ELeave) CArrayFixFlat<TGBAAuthInfo>(KUsimGranularity);
+	iMBMSInfoList = new(ELeave) CArrayFixFlat<TMBMSInfo>(KUsimGranularity);
+
+	iGbaNafList = CMobilePhoneGbaNafIdList::NewL();
+	iMbmsMskList = CMobilePhoneMbmsMskIdList::NewL();
+	
+	iTimer = CSimTimer::NewL(iPhone);
+	iWlanTimer = CSimTimer::NewL(iPhone);
+	iNotifyAuthTimer = CSimTimer::NewL(iPhone);
+	
+	iAuthListInfo = new(ELeave)CArrayPtrFlat<CListReadAllAttempt>(1);
+	iGetWlanSIDsData = new(ELeave) CArrayPtrFlat<CListReadAllAttempt>(1);
+	iGetPreferredNetworks = new(ELeave) CArrayPtrFlat<CListReadAllAttempt>(1);
+
+	iCurrentNotifyMailboxIndex=0;
+	iCurrentIccMessageWaitingIndex=0;
+	iCurrentMessageWaitingIndex=0;
+	iGetIccMsgIdCurrentIndex=0;
+	iSetIccMsgIdCurrentIndex=0;
+	iNotifyWlanDataChangeIndex=0;
+	iNotifyPreferredWlanSIDListChangeIndex=0;
+	iNotifyPreferredNetworksChangeIndex=0;
+	iMailBoxIndex=0;			
+	iIndex=0;
+	
+	TInt count;
+	count=CfgFile()->ItemCount(KUsimMailBoxIdInfo);
+	CTestConfigItem* item=NULL;
+	TInt ret=KErrNone;
+
+	TInt i;
+	for(i=0;i<count;i++)
+		{
+		item=const_cast<CTestConfigItem*>(CfgFile()->Item(KUsimMailBoxIdInfo,i));
+		if(!item)
+			{
+			break;
+			}
+		TInt voice,data,fax,other,video;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,voice);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("voice",ret,0,&KUsimMailBoxIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,data);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("data",ret,1,&KUsimMailBoxIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,fax);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("fax",ret,2,&KUsimMailBoxIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,other);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("other",ret,3,&KUsimMailBoxIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,video);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("video",ret,4,&KUsimMailBoxIdInfo);
+			continue;
+			}
+		RMobilePhone::TMobilePhoneVoicemailIdsV8 mailboxIdInfo;
+		mailboxIdInfo.iVoice=voice;
+		mailboxIdInfo.iData=data;
+		mailboxIdInfo.iFax=fax;
+		mailboxIdInfo.iOther=other;
+		mailboxIdInfo.iVideo=video;	
+		iVoiceMailIds->AppendL(mailboxIdInfo);
+		}
+	count=CfgFile()->ItemCount(KUsimMessageWaitingIdInfo);
+	item=NULL;
+	for(i=0;i<count;i++)
+		{
+		item=const_cast<CTestConfigItem*>(CfgFile()->Item(KUsimMessageWaitingIdInfo,i));
+		if(!item)
+			{
+			break;
+			}
+		TInt displayStatus,voiceMsgs,auxVoiceMsgs,dataMsgs,faxMsgs,emailMsgs,otherMsgs,videoMsgs;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,displayStatus);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("displayStatus",ret,0,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,voiceMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("voiceMsgs",ret,1,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,auxVoiceMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("auxVoiceMsgs",ret,2,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,dataMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("dataMsgs",ret,3,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,faxMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("faxMsgs",ret,4,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,emailMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("emailMsgs",ret,5,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,otherMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("otherMsgs",ret,6,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,videoMsgs);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("longName",ret,7,&KUsimMessageWaitingIdInfo);
+			continue;
+			}
+		RMobilePhone::TMobilePhoneMessageWaitingV8 messageWaiting;
+		messageWaiting.iDisplayStatus = RMobilePhone::TMobilePhoneIndicatorDisplay(displayStatus);
+		messageWaiting.iVoiceMsgs = voiceMsgs;
+		messageWaiting.iAuxVoiceMsgs = auxVoiceMsgs;
+		messageWaiting.iDataMsgs = dataMsgs;
+		messageWaiting.iFaxMsgs = faxMsgs;
+		messageWaiting.iEmailMsgs = emailMsgs;
+		messageWaiting.iOtherMsgs = otherMsgs;
+		messageWaiting.iVideoMsgs = videoMsgs;
+		iMessageWaiting->AppendL(messageWaiting);
+		}
+	count=CfgFile()->ItemCount(KUsimWlanDataInfo);
+	item=NULL;
+	TUint16 digit=0;
+	RMobilePhone::TUsimWlanDataV8 wlanData;
+	for(i=0;i<count;i++)
+		{
+		item=const_cast<CTestConfigItem*>(CfgFile()->Item(KUsimWlanDataInfo,i));
+		if(!item)
+			{
+			break;
+			}
+		TPtrC8 FieldsUsed,Pseudonym,ReauthenticationId,MasterKey,Counter;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,FieldsUsed);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Fields Used",ret,0,&KUsimWlanDataInfo);
+			continue;
+			}
+		else 
+			{
+			if(AsciiToNum(FieldsUsed, digit)==KErrNone)
+				{
+				wlanData.iFieldsUsed=digit;
+				}
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,Pseudonym);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Pseudonym",ret,1,&KUsimWlanDataInfo);
+			continue;
+			}
+		else
+			{
+			wlanData.iPseudonym.Copy(Pseudonym);
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,ReauthenticationId);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("ReauthenticationId",ret,2,&KUsimWlanDataInfo);
+			continue;
+			}
+		else
+			{
+			wlanData.iReauthenticationId.Copy(ReauthenticationId);
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,MasterKey);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("MasterKey",ret,3,&KUsimWlanDataInfo);
+			continue;
+			}
+		else
+			{
+			wlanData.iMasterKey.Copy(MasterKey);
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,Counter);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Counter",ret,4,&KUsimWlanDataInfo);
+			continue;
+			}
+		else
+			{
+			wlanData.iCounter.Copy(Counter);
+			}
+		iWlanData->AppendL(wlanData);
+		}
+	count=CfgFile()->ItemCount(KUsimWlanSidInfo);
+	item=NULL;
+	RMobilePhone::TWlanSIDV8 wlanSid;
+	for(i=0;i<count;i++)
+		{
+		item=const_cast<CTestConfigItem*>(CfgFile()->Item(KUsimWlanSidInfo,i));
+		if(!item)
+			{
+			break;
+			}
+		TPtrC8 wlanSidBuf;
+		TInt userDef;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,wlanSidBuf);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Wlan Sid Buffer",ret,0,&KUsimWlanSidInfo);
+			continue;
+			}
+		else 
+			{
+			wlanSid.iWSID.Copy(wlanSidBuf);
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,userDef);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("User Defined",ret,1,&KUsimWlanSidInfo);
+			continue;
+			}
+		else
+			{
+			wlanSid.iUserDefined=userDef;
+			}
+		iWlanSid->AppendL(wlanSid);
+		}
+	count=CfgFile()->ItemCount(KUsimPreferredNetworksInfo);
+	item=NULL;
+	RMobilePhone::TMobilePreferredNetworkEntryV3 networkEntry;
+	for(i=0;i<count;i++)
+		{
+		item=const_cast<CTestConfigItem*>(CfgFile()->Item(KUsimPreferredNetworksInfo,i));
+		if(!item)
+			{
+			break;
+			}
+		TPtrC8 accessId,countryCode,networkId;
+		TInt userDef;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,accessId);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Access Id",ret,0,&KUsimPreferredNetworksInfo);
+			continue;
+			}
+		else 
+			{
+			if(AsciiToNum(accessId, digit)==KErrNone)
+				{
+				networkEntry.iAccess=digit;
+				}
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,userDef);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("User Defined",ret,1,&KUsimPreferredNetworksInfo);
+			continue;
+			}
+		else
+			{
+			networkEntry.iUserDefined=userDef;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,countryCode);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Country Code",ret,1,&KUsimPreferredNetworksInfo);
+			continue;
+			}
+		else
+			{
+			networkEntry.iCountryCode.Copy(countryCode);
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,networkId);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("Network Id",ret,1,&KUsimPreferredNetworksInfo);
+			continue;
+			}
+		else
+			{
+			networkEntry.iNetworkId.Copy(networkId);
+			}
+		
+		iPreferredNetworks->AppendL(networkEntry);
+		}	
+	LOGPHONE1("Starting to Parse GBA Authentication Info");
+	count = CfgFile()->ItemCount(KGBAAuthInfo);
+	TGBAAuthInfo authInfo;
+
+	TInt index;
+	for(index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KGBAAuthInfo, index));
+		if(item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL(item);
+		TInt ret = KErrNone, authErr = KErrNone;
+		TPtrC8 AUTN, RAND, appId, RES, AUTS, NAFID,IMPI, KSExtNaf, BtID, KeyLifeTime ;
+		TBool OtherApplnBusy, applnActive;
+
+		//Get the AUTN
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, AUTN);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("AUTN",ret,0,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAUTN.Copy(AUTN);
+			}
+		//Get the RAND
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, RAND);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("RAND",ret,1,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iRAND.Copy(RAND);
+			}
+		//Get the APPID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 2, appId);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("APPID",ret,2,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAID.Copy(appId);
+			}
+		//Get the RES
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 3, RES);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("RES",ret,3,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iRES.Copy(RES);
+			}
+		//Get the AUTS
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 4, AUTS);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("AUTS",ret,4,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAUTS.Copy(AUTS);
+			}
+		//Get the NAFID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 5, NAFID);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("NAFID",ret,5,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iNAFID.Copy(NAFID);
+			}
+		//Get the IMPI
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 6, IMPI);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("IMPI",ret,6,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iIMPI.Copy(IMPI);
+			}
+		//Get the KsExtNaf
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 7, KSExtNaf);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("KSExtNaf",ret,7,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iKsExtNaf.Copy(KSExtNaf);
+			}
+		//Get the BtID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 8, BtID);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("BtID",ret,8,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iBtid.Copy(BtID);
+			}
+		//Get the KeyLifeTime
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 9, KeyLifeTime);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("KeyLifeTime",ret,9,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iKeyLifeTime.Copy(KeyLifeTime);
+			}
+		//Get the OtherApplnBusy
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 10, OtherApplnBusy);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("OtherApplnBusy",ret,10,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iOtherAppBusy = OtherApplnBusy;
+			}
+		//Get the CurrentApplnActive
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 11, applnActive);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("applnActive",ret,11,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAppActive = applnActive;
+			}
+		//Get authentication error
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 12, authErr);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("authErr",ret,12,&KGBAAuthInfo);
+			continue;
+			}
+		else
+			{
+			authInfo.iAuthErr = authErr;
+			}
+		iGBAAuthInfoList->AppendL(authInfo);
+		CleanupStack::Pop(item);
+		} // end FOR Loop
+	LOGPHONE1("Starting to Parse GBA 2 Phase Retrieval list information");
+	count = CfgFile()->ItemCount(KGBAListInfo);
+	RMobilePhone::TGbaNafEntryV8 entry;
+	for(index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KGBAListInfo, index));
+		if(item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL(item);
+		TInt ret = KErrNone;
+		TPtrC8 NafId, Btid;
+		
+		//Get the NafID
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, NafId);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("NafID",ret,0,&KGBAListInfo);
+			continue;
+			}
+		else
+			{
+			entry.iNafId.Copy(NafId);
+			}
+
+		//Get the Btid
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, Btid);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("BTID",ret,1,&KGBAListInfo);
+			continue;
+			}
+		else
+			{
+			entry.iBtid.Copy(Btid);
+			}
+		
+		iGbaNafList->AddEntryL(entry);
+		CleanupStack::Pop(item);
+		}	
+	LOGPHONE1("Starting to Parse MBMS related config information");
+	count = CfgFile()->ItemCount(KMBMSInfo);
+	TMBMSInfo tMbmsInfo;
+	for(index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KMBMSInfo, index));
+		if(item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL(item);
+		
+		TInt ret = KErrNone;
+		TPtrC8 iMikey,oMikey,mtk,saltKey,keyDmn, MskIdgrp;
+		TPtrC8 MukId,MukIdi,MukIdr,MukTimeStamp,appId,KSIntNaf;
+		TBool applnActive;
+		TInt authErr;
+		
+		//Get the input Mikey
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, iMikey);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("iMikey",ret,0,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iInputMikey.Copy(iMikey);
+			}
+		
+		//Get the output Mikey
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, oMikey);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("oMikey",ret,1,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iOutputMikey.Copy(oMikey);
+			}
+
+		//Get the MTK
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 2, mtk);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("MTK",ret,2,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMtk.Copy(mtk);
+			}
+
+		//Get the SaltKey
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 3, saltKey);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("saltKey",ret,3,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iSaltkey.Copy(saltKey);
+			}
+
+		//Get the KeyDomain
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 4, keyDmn );
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("keyDmn ",ret,4,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iKeyDmn.Copy(keyDmn );
+			}
+
+		//Get the MskIdgrp
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 5, MskIdgrp);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("MskIdgrp",ret,5,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMskIdGrp.Copy(MskIdgrp);
+			}
+
+		//Get the iMukid
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 6, MukId );
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("iMukIdTlv ",ret,6,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukIdTlv.Copy(MukId );
+			}
+
+		//Get the MukIdi
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 7, MukIdi);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("MukIdi",ret,7,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukIdi.Copy(MukIdi);
+			}
+
+		//Get the MukIdr 
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 8, MukIdr );
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("MukIdr ",ret,8,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukIdr.Copy(MukIdr );
+			}
+
+		//Get the MukTimeStamp
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 9, MukTimeStamp );
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("iMikey",ret,9,&KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iMukTimestamp.Copy(MukTimeStamp );
+			}
+		
+		//Get the APPID
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 10, appId);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("APPID", ret, 10, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iAID.Copy (appId);
+			}
+
+		//Get the KsIntNaf
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 11,KSIntNaf);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("KSIntNaf", ret, 11, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iKsIntNaf.Copy (KSIntNaf);
+			}
+
+		//Get the CurrentApplnActive
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 12,applnActive);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("applnActive", ret, 12, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iAppActive = applnActive;
+			}
+
+		//Get authentication error
+		ret = CTestConfig::GetElement (item->Value (), KStdDelimiter, 13,authErr);
+		if ( ret != KErrNone)
+			{
+			LOGPARSERR ("authErr", ret, 13, &KMBMSInfo);
+			continue;
+			}
+		else
+			{
+			tMbmsInfo.iAuthErr = authErr;
+			}
+
+		iMBMSInfoList->AppendL(tMbmsInfo);
+		CleanupStack::Pop(item);
+		}
+	
+	LOGPHONE1("Starting to Parse MBMS 2 Phase Retrieval list information");
+	count = CfgFile()->ItemCount(KMBMSListInfo);
+	RMobilePhone::TMskEntryV8 mskEntry;
+	for(index = 0; index < count; index++)
+		{
+		item = const_cast<CTestConfigItem*>(CfgFile()->Item(KMBMSListInfo, index));
+		if(item == NULL)
+			{
+			break;
+			}
+		CleanupStack::PushL(item);
+		TInt ret = KErrNone;
+		TPtrC8 MskId,KeyDomain,TimeStamp;
+		
+		//Get the MskId
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 0, MskId);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("MskId",ret,0,&KMBMSListInfo);
+			continue;
+			}
+		else
+			{
+			mskEntry.iMskId.Copy(MskId);
+			}
+
+		//Get the KeyDomainGroup
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 1, KeyDomain);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("KeyDomain",ret,1,&KMBMSListInfo);
+			continue;
+			}
+		else
+			{
+			mskEntry.iKeyDomainId.Copy(KeyDomain);
+			}
+		
+		//Get the TimeStampCounter
+		
+		ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, 2, TimeStamp);
+		if(ret != KErrNone)
+			{
+			LOGPARSERR("TimeStampCounter",ret,2,&KMBMSListInfo);
+			continue;
+			}
+		else
+			{
+			mskEntry.iTimeStampCounter.Copy(TimeStamp);
+			}
+
+		iMbmsMskList->AddEntryL(mskEntry);
+		CleanupStack::Pop(item);
+		}
+	if((iGBAAuthInfoList->Count()!=0) ||
+			(iMBMSInfoList->Count() !=0 ) ||
+			(iMessageWaiting->Count()!=0))
+		{
+		iListIndex=0;
+		iTimer->Start(KUsimRel6DurationTimeoutDefault2,this,ETimerIdNotifyUSimRel6Event);
+		}
+	};
+
+CSimUsimR6::~CSimUsimR6()
+/**
+* Trivial Destructor
+* Closes all CObject type objects and destroys all other objects created in the ConstructL()
+*
+*/
+	{
+	LOGMISC1("CSimUsimR6: Entered destructor");
+	if(iTimer)
+		{
+		delete iTimer;
+		}
+	if(iWlanTimer)
+		{
+		delete iWlanTimer;
+		}		
+	if(iNotifyAuthTimer)
+		{
+		delete iNotifyAuthTimer;
+		}
+	if (iVoiceMailIds)
+		{
+		iVoiceMailIds->Delete(0,iVoiceMailIds->Count());
+		delete iVoiceMailIds;
+		}
+	if (iMessageWaiting)
+		{
+		iMessageWaiting->Delete(0,iMessageWaiting->Count());
+		delete iMessageWaiting;
+		}
+	if (iWlanData)
+		{
+		iWlanData->Delete(0,iWlanData->Count());
+		delete iWlanData;
+		}
+	if (iWlanSid)
+		{
+		iWlanSid->Delete(0,iWlanSid->Count());
+		delete iWlanSid;
+		}
+	if (iPreferredNetworks)
+		{
+		iPreferredNetworks->Delete(0,iPreferredNetworks->Count());
+		delete iPreferredNetworks;
+		}
+	if(iGetWlanSIDsData)
+		{
+		iGetWlanSIDsData->ResetAndDestroy();
+		}
+	delete iGetWlanSIDsData;
+	if(iGetPreferredNetworks)
+		{
+		iGetPreferredNetworks->ResetAndDestroy();	
+		}
+	delete iGetPreferredNetworks;
+	if(iGBAAuthInfoList)
+		{
+		iGBAAuthInfoList->Delete(0,iGBAAuthInfoList->Count());
+		delete iGBAAuthInfoList;
+		}
+	if(iAuthListInfo)
+		{
+		iAuthListInfo->ResetAndDestroy();
+		}
+	delete iAuthListInfo;
+	if(iMBMSInfoList)
+		{
+		iMBMSInfoList->Delete(0,iMBMSInfoList->Count());
+		delete iMBMSInfoList;	
+		}
+	if(iGbaNafList)
+		{
+		delete iGbaNafList;
+		}
+	if(iMbmsMskList)
+		{
+		delete iMbmsMskList;
+		}
+	LOGMISC1("CSimUsimR6: Leaving destructor");
+	}
+
+const CTestConfigSection* CSimUsimR6::CfgFile()
+/**
+ * Returns a pointer to the current configuration file section.
+ *
+ * @return CTestConfigSection	A pointer to the current configuration file data section.
+ */
+	{
+	return iPhone->CfgFile();
+	}
+
+void CSimUsimR6::TimerCallBack(TInt /**aId*/)
+/**
+* Timer callback function.  When the timer goes off, it will call back into this
+* function for further processing.
+*
+* @param aId an id identifying which timer callback is being called
+*/
+	{
+	if (iMailBoxNumberChangePending)
+		{
+		iMailBoxNumberChangePending = EFalse;
+		RMobilePhone::TMobilePhoneVoicemailIdsV3* mailbox = reinterpret_cast<RMobilePhone::TMobilePhoneVoicemailIdsV3*>(iMailBoxNumberChange);
+		mailbox->iVoice = iVoiceMailIds->At(0).iVoice;
+		mailbox->iData= iVoiceMailIds->At(0).iData;
+		mailbox->iFax = iVoiceMailIds->At(0).iFax;
+		mailbox->iOther = iVoiceMailIds->At(0).iOther;
+		iPhone->ReqCompleted (iMailBoxNumberChangeNotificationReqHandle,KErrNone);
+		iTimer->Start (KUsimRel6DurationTimeoutDefault2, this,ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if (iMailBoxNumberChangePendingV8)
+		{
+		iMailBoxNumberChangePendingV8 = EFalse;
+		RMobilePhone::TMobilePhoneVoicemailIdsV8* mailbox = reinterpret_cast<RMobilePhone::TMobilePhoneVoicemailIdsV8*>(iMailBoxNumberChangeV8);
+		mailbox->iVoice = iVoiceMailIds->At(iCurrentNotifyMailboxIndex).iVoice;
+		mailbox->iData= iVoiceMailIds->At(iCurrentNotifyMailboxIndex).iData;
+		mailbox->iFax = iVoiceMailIds->At(iCurrentNotifyMailboxIndex).iFax;
+		mailbox->iOther = iVoiceMailIds->At(iCurrentNotifyMailboxIndex).iOther;
+		mailbox->iVideo= iVoiceMailIds->At(iCurrentNotifyMailboxIndex).iVideo;
+		iPhone->ReqCompleted (iMailBoxNumberChangeNotificationReqHandleV8,KErrNone);
+		iCurrentNotifyMailboxIndex++;
+		iTimer->Start (KUsimRel6DurationTimeoutDefault2, this,ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if (iIccMessageWaitingPending)
+		{
+		iIccMessageWaitingPending=EFalse;
+		RMobilePhone::TMobilePhoneMessageWaitingV1* messageWaiting = reinterpret_cast<RMobilePhone::TMobilePhoneMessageWaitingV1*>(iIccMsgWaiting);
+		messageWaiting->iDisplayStatus = iMessageWaiting->At(0).iDisplayStatus;
+		messageWaiting->iVoiceMsgs= iMessageWaiting->At(0).iVoiceMsgs;
+		messageWaiting->iAuxVoiceMsgs = iMessageWaiting->At(0).iAuxVoiceMsgs;
+		messageWaiting->iDataMsgs = iMessageWaiting->At(0).iDataMsgs;
+		messageWaiting->iFaxMsgs= iMessageWaiting->At(0).iFaxMsgs;
+		messageWaiting->iEmailMsgs= iMessageWaiting->At(0).iEmailMsgs;
+		messageWaiting->iOtherMsgs= iMessageWaiting->At(0).iOtherMsgs;
+		iPhone->ReqCompleted (iIccMessageWaitingNotificationReqHandle,KErrNone);
+		iTimer->Start (KUsimRel6DurationTimeoutDefault1, this,ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if (iIccMessageWaitingPendingV8)
+		{
+		iIccMessageWaitingPendingV8=EFalse;
+		RMobilePhone::TMobilePhoneMessageWaitingV8* messageWaiting = reinterpret_cast<RMobilePhone::TMobilePhoneMessageWaitingV8*>(iIccMsgWaitingV8);
+		messageWaiting->iDisplayStatus = iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iDisplayStatus;
+		messageWaiting->iVoiceMsgs= iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iVoiceMsgs;
+		messageWaiting->iAuxVoiceMsgs = iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iAuxVoiceMsgs;
+		messageWaiting->iDataMsgs = iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iDataMsgs;
+		messageWaiting->iFaxMsgs= iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iFaxMsgs;
+		messageWaiting->iEmailMsgs= iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iEmailMsgs;
+		messageWaiting->iOtherMsgs= iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iOtherMsgs;
+		messageWaiting->iVideoMsgs= iMessageWaiting->At(iCurrentIccMessageWaitingIndex).iVideoMsgs;
+		iPhone->ReqCompleted (iIccMessageWaitingNotificationReqHandleV8, KErrNone);
+		iCurrentIccMessageWaitingIndex++;
+		iTimer->Start (KUsimRel6DurationTimeoutDefault1, this,ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if (iMessageWaitingPending)
+		{
+		iMessageWaitingPending=EFalse;
+		*iMsgWaitingCount=6;
+		iPhone->ReqCompleted (iMessageWaitingNotificationReqHandle, KErrNone);
+		iTimer->Start (KUsimRel6DurationTimeoutDefault, this,ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if (iNotifyPreferredWlanSIDListChangePending)
+		{
+		iNotifyPreferredWlanSIDListChangePending=EFalse;
+		iPhone->ReqCompleted (iNotifyPreferredWlanSIDListReqHandle,KErrNone);
+		iNotifyPreferredWlanSIDListChangeIndex++;
+		iTimer->Start (KUsimRel6DurationTimeoutDefault1,this, ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if ( iNotifyPreferredNetworksChangePending)
+		{
+		iNotifyPreferredNetworksChangePending=EFalse;
+		iPhone->ReqCompleted (iNotifyPreferredNetworksReqHandle,KErrNone);
+		iNotifyPreferredNetworksChangeIndex++;
+		iTimer->Start (KUsimRel6DurationTimeoutDefault1, this,ETimerIdNotifyUSimRel6Event);
+		}
+
+	else if (iNotifyWlanDataChangePending)
+		{
+		iNotifyWlanDataChangePending=EFalse;
+		if (iNotifyWlanDataChange->iFieldsUsed == iWlanData->At(0).iFieldsUsed)
+			{
+			iNotifyWlanDataChange->iPseudonym = iWlanData->At(0).iPseudonym;
+			iNotifyWlanDataChange->iReauthenticationId = iWlanData->At(0).iReauthenticationId;
+			}
+		else if (iNotifyWlanDataChange->iFieldsUsed == iWlanData->At(1).iFieldsUsed)
+			{
+			iNotifyWlanDataChange->iPseudonym = iWlanData->At(1).iPseudonym;
+			iNotifyWlanDataChange->iReauthenticationId = iWlanData->At(1).iReauthenticationId;
+			iNotifyWlanDataChange->iMasterKey = iWlanData->At(1).iMasterKey;
+			iNotifyWlanDataChange->iCounter = iWlanData->At(1).iCounter;
+			}
+		else
+			{
+			iNotifyWlanDataChange->iFieldsUsed = iWlanData->At(1).iFieldsUsed;
+			iNotifyWlanDataChange->iPseudonym = iWlanData->At(1).iPseudonym;
+			iNotifyWlanDataChange->iReauthenticationId = iWlanData->At(1).iReauthenticationId;
+			iNotifyWlanDataChange->iMasterKey = iWlanData->At(1).iMasterKey;
+			iNotifyWlanDataChange->iCounter = iWlanData->At(1).iCounter;	
+			}
+		iPhone->ReqCompleted (iNotifyWlanDataChangeReqHandle,KErrNone);
+		iNotifyWlanDataChangeIndex++;
+		}
+
+	else if (iSetGBABootstrapParams.iNotifyPending ||
+		  iNotifyAuthDataChange.iNotifyPending ||
+		  iGetAuthParams.iNotifyPending)
+		{
+		if (iSetGBABootstrapParams.iNotifyPending)
+			{
+			RMobilePhone::TBsfDataV8
+					&bsfDataV8 = *(RMobilePhone::TBsfDataV8*)iSetGBABootstrapParams.iNotifyData;
+
+			if ((bsfDataV8.iBtid != iGBAAuthInfoList->At(iListIndex).iBtid)||(bsfDataV8.iKeyLifetime != iGBAAuthInfoList->At(iListIndex).iKeyLifeTime))
+				{
+				iPhone->ReqCompleted (
+						iSetGBABootstrapParams.iNotifyHandle,
+						KErrAccessDenied);
+				}
+			else
+				{
+				iPhone->ReqCompleted (
+						iSetGBABootstrapParams.iNotifyHandle,
+						KErrNone);
+				}
+			iSetGBABootstrapParams.iNotifyPending = EFalse;
+			}
+
+		if (iNotifyAuthDataChange.iNotifyPending)
+			{
+			iNotifyAuthDataChange.iNotifyPending = EFalse;
+			RMobilePhone::TAuthInfoV8
+					&authInfoV8 = *(RMobilePhone::TAuthInfoV8*) iNotifyAuthDataChange.iNotifyData;
+
+			authInfoV8.iAID = iGBAAuthInfoList->At(iListIndex).iAID;
+
+			if (iGBAAuthInfoList->At(iListIndex).iAppActive)
+				{
+				authInfoV8.iData = RMobilePhone::EGbaBootstrapParams;
+				}
+			else
+				{
+				authInfoV8.iData = RMobilePhone::EGbaNafIdList;
+				}
+			iPhone->ReqCompleted (iNotifyAuthDataChange.iNotifyHandle, KErrNone);
+			}
+		if (iGetAuthParams.iNotifyPending)
+			{
+			RMobilePhone::TMultimodeType
+					&tMultimode = *(RMobilePhone::TMultimodeType*) iGetAuthParams.iNotifyData;
+			TInt ret = iGBAAuthInfoList->At(iListIndex).iAuthErr;
+			TInt ret1 = iMBMSInfoList->At(iListIndex).iAuthErr;
+			if (ret == KErrNone || ret1 == KErrNone)
+				{
+				if (tMultimode.ExtensionId ()== RMobilePhone::KETelMobileGbaBootstrapParamsV8)
+					{
+					// for GBA
+					RMobilePhone::TGbaBootstrapParamsV8
+							&tGbaBootstrapV8 = *(RMobilePhone::TGbaBootstrapParamsV8*) iGetAuthParams.iNotifyData;
+					tGbaBootstrapV8.iBtid = iGBAAuthInfoList->At(iListIndex).iBtid;
+					tGbaBootstrapV8.iKeyLifetime = iGBAAuthInfoList->At(iListIndex).iKeyLifeTime;
+					tGbaBootstrapV8.iRand = iGBAAuthInfoList->At(iListIndex).iRAND;
+					}
+				else
+					if ( tMultimode.ExtensionId ()== RMobilePhone::KETelMobileMbmsUserKeyV8)
+						{
+						// for MBMS
+						RMobilePhone::TMbmsUserKeyV8
+								&tMbmsUserKeyV8 = *(RMobilePhone::TMbmsUserKeyV8*) iGetAuthParams.iNotifyData;
+						tMbmsUserKeyV8.iMukIdi = iMBMSInfoList->At(iListIndex).iMukIdi;
+						tMbmsUserKeyV8.iMukIdr = iMBMSInfoList->At(iListIndex).iMukIdr;
+						tMbmsUserKeyV8.iTimeStampCounter = iMBMSInfoList->At(iListIndex).iMukTimestamp;
+						}
+					else
+						{
+						// handle error scenario.
+						(void) tMultimode;
+						iPhone->ReqCompleted (
+								iGetAuthParams.iNotifyHandle,
+								KErrCorrupt);
+						}
+				iPhone->ReqCompleted (iGetAuthParams.iNotifyHandle, KErrNone);
+				}
+			else
+				{
+				if (tMultimode.ExtensionId ()== RMobilePhone::KETelMobileMbmsUserKeyV8 && ret1 != KErrNone)
+					{
+					if (!(ret1 == KErrAccessDenied))
+						{
+						// for MBMS
+						RMobilePhone::TMbmsUserKeyV8
+								&tMbmsUserKeyV8 = *(RMobilePhone::TMbmsUserKeyV8*) iGetAuthParams.iNotifyData;
+						tMbmsUserKeyV8.iMukIdi = iMBMSInfoList->At(iListIndex).iMukIdi;
+						tMbmsUserKeyV8.iMukIdr = iMBMSInfoList->At(iListIndex).iMukIdr;
+						tMbmsUserKeyV8.iTimeStampCounter = iMBMSInfoList->At(iListIndex).iMukTimestamp;
+						}
+					iPhone->ReqCompleted (iGetAuthParams.iNotifyHandle, ret1);
+					}
+				else
+					{
+					iPhone->ReqCompleted (iGetAuthParams.iNotifyHandle, ret);
+					}
+				}
+			iGetAuthParams.iNotifyPending = EFalse;
+			}
+		iTimer->Start (RandTime (), this);
+		LOGMISC1("<<CSimUsimR6::TimerCallBack - Exited ");
+		}
+	}
+			
+TInt CSimUsimR6::NotifyMailboxNumbersChange(TTsyReqHandle aReqHandle, TDes8* aMailBox)
+/**
+ * This function member notifies the client of changes to any of the Mailbox numbers identifiers.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aMailBox		This parameter is filled with new mailbox numbers identifiers.
+ * @return TInt			Standard error value.
+ */
+	{
+	TPckg<RMobilePhone::TMultimodeType>* paramPckg=(TPckg<RMobilePhone::TMultimodeType>*)aMailBox;
+	RMobilePhone::TMultimodeType& paramclass=(*paramPckg)();
+	if(paramclass.ExtensionId() == KETelExtMultimodeV3)
+		{
+		__ASSERT_ALWAYS(!iMailBoxNumberChangePending,SimPanic(ENotificationReqAlreadyOutstanding));
+		RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg* voicemailPckg=(RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg*)aMailBox;
+		RMobilePhone::TMobilePhoneVoicemailIdsV3& voicemail=(*voicemailPckg)();
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion(voicemail);
+		if(err != KErrNone)
+			{
+			iPhone->ReqCompleted(aReqHandle, err);
+			return KErrNone;
+			}
+		iMailBoxNumberChangePending=ETrue;
+		iMailBoxNumberChangeNotificationReqHandle=aReqHandle;
+		iMailBoxNumberChange=&voicemail;
+		}
+	if(paramclass.ExtensionId() == KEtelExtMultimodeV8)
+		{
+		__ASSERT_ALWAYS(!iMailBoxNumberChangePendingV8,SimPanic(ENotificationReqAlreadyOutstanding));
+		RMobilePhone::TMobilePhoneVoicemailIdsV8Pckg* voicemailV8Pckg=(RMobilePhone::TMobilePhoneVoicemailIdsV8Pckg*)aMailBox;
+		RMobilePhone::TMobilePhoneVoicemailIdsV8& voicemailV8=(*voicemailV8Pckg)();
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion(voicemailV8);
+		if(err != KErrNone)
+			{
+			iPhone->ReqCompleted(aReqHandle, err);
+			return KErrNone;
+			}
+		iMailBoxNumberChangePendingV8=ETrue;
+		iMailBoxNumberChangeNotificationReqHandleV8=aReqHandle;
+		iMailBoxNumberChangeV8=&voicemailV8;
+		}	
+	else 
+		{	
+		iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+		return KErrNone;
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::NotifyMailboxNumbersChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a previous request from an client to be notified of a change in mailbox numbers identifiers..
+* @param aTsyReqHandle request handle
+*/
+	{
+	if(iMailBoxNumberChangePending && iMailBoxNumberChangeNotificationReqHandle == aTsyReqHandle)
+		{
+		iMailBoxNumberChangePending=EFalse;
+		iPhone->ReqCompleted(iMailBoxNumberChangeNotificationReqHandle,KErrCancel);
+		}
+	else if(iMailBoxNumberChangePendingV8 && iMailBoxNumberChangeNotificationReqHandleV8 == aTsyReqHandle)
+		{
+		iMailBoxNumberChangePendingV8=EFalse;
+		iPhone->ReqCompleted(iMailBoxNumberChangeNotificationReqHandleV8,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::NotifyMessageWaiting(TTsyReqHandle aReqHandle, TInt* aCount)
+/**
+ * This function member allows a client to be notified when the phone receives 
+ * a message waiting indication from the network.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aCount		This parameter is filled with the number of voice mail messages waiting in the network. 
+ * @return TInt			Standard error value.
+ */	
+	{
+	__ASSERT_ALWAYS(!iMessageWaitingPending,SimPanic(ENotificationReqAlreadyOutstanding));
+	iMessageWaitingPending=ETrue;
+	iMessageWaitingNotificationReqHandle=aReqHandle;
+	iMsgWaitingCount=aCount;
+	return KErrNone;		
+	};
+
+TInt CSimUsimR6::NotifyMessageWaitingCancel(const TTsyReqHandle aReqHandle)
+	{
+	if(iMessageWaitingPending && iMessageWaitingNotificationReqHandle == aReqHandle)
+		{
+		iMessageWaitingPending=EFalse;
+		iPhone->ReqCompleted(iMessageWaitingNotificationReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	};
+		
+TInt CSimUsimR6::NotifyIccMessageWaitingIndicatorsChange(TTsyReqHandle aReqHandle, TDes8* aMsgIndicators)
+/**
+ * This function member notifies the client if the message waiting indicators 
+ * on the current ICC change.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aMsgIndicators  This parameter is filled with the message waiting indicators infromation. 
+ * @return TInt			Standard error value.
+ */	
+	{
+	TPckg<RMobilePhone::TMultimodeType>* paramPckg=(TPckg<RMobilePhone::TMultimodeType>*)aMsgIndicators;
+	RMobilePhone::TMultimodeType& paramclass=(*paramPckg) ();
+	if ( paramclass.ExtensionId ()== KETelExtMultimodeV1)
+		{
+		__ASSERT_ALWAYS(!iIccMessageWaitingPending,SimPanic(ENotificationReqAlreadyOutstanding));
+		RMobilePhone::TMobilePhoneMessageWaitingV1Pckg* messagewaitingPckg=(RMobilePhone::TMobilePhoneMessageWaitingV1Pckg*)aMsgIndicators;
+		RMobilePhone::TMobilePhoneMessageWaitingV1& messagewaiting=(*messagewaitingPckg) ();
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion (messagewaiting);
+		if ( err != KErrNone)
+			{
+			iPhone->ReqCompleted (aReqHandle, err);
+			return KErrNone;
+			}
+		iIccMessageWaitingPending=ETrue;
+		iIccMessageWaitingNotificationReqHandle=aReqHandle;
+		iIccMsgWaiting=&messagewaiting;
+		}
+	if (paramclass.ExtensionId ()== KEtelExtMultimodeV8)
+		{
+		__ASSERT_ALWAYS(!iIccMessageWaitingPendingV8,SimPanic(ENotificationReqAlreadyOutstanding));
+		RMobilePhone::TMobilePhoneMessageWaitingV8Pckg* messagewaitingPckg=(RMobilePhone::TMobilePhoneMessageWaitingV8Pckg*)aMsgIndicators;
+		RMobilePhone::TMobilePhoneMessageWaitingV8& messagewaiting=(*messagewaitingPckg) ();
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion (messagewaiting);
+		if ( err != KErrNone)
+			{
+			iPhone->ReqCompleted (aReqHandle, err);
+			return KErrNone;
+			}
+		iIccMessageWaitingPendingV8=ETrue;
+		iIccMessageWaitingNotificationReqHandleV8=aReqHandle;
+		iIccMsgWaitingV8=&messagewaiting;
+		}
+	else
+		{
+		iPhone->ReqCompleted (aReqHandle, KErrNotSupported);
+		return KErrNone;
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::NotifyIccMessageWaitingIndicatorsChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel a previous request from an client to be notified of a change in the message waiting indicators 
+* on the current ICC.
+* @param aTsyReqHandle request handle
+*/
+	{
+	if ( iIccMessageWaitingPending && iIccMessageWaitingNotificationReqHandle == aTsyReqHandle)
+		{
+		iIccMessageWaitingPending=EFalse;
+		iPhone->ReqCompleted (iIccMessageWaitingNotificationReqHandle, KErrCancel);
+		}
+	else
+		if ( iIccMessageWaitingPendingV8 && iIccMessageWaitingNotificationReqHandleV8 == aTsyReqHandle)
+			{
+			iIccMessageWaitingPendingV8=EFalse;
+			iPhone->ReqCompleted (iIccMessageWaitingNotificationReqHandleV8, KErrCancel);
+			}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetMailboxNumbers(TTsyReqHandle aReqHandle,TDes8* aMailBox)
+/**
+ * Retrieves the Mailbox numbers identifier information from the EF_MBI file in the USIM.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aMailBox		This will be populated with the
+ *						mailbox identifier information to be returned.
+ * @return TInt			Standard error value.
+ */
+	{
+	RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg* voicemailPckg=(RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg*)aMailBox;
+	RMobilePhone::TMultimodeType& packagetype = (*voicemailPckg)();
+	
+	if(packagetype.ExtensionId() == KETelExtMultimodeV3 || packagetype.ExtensionId() == KEtelExtMultimodeV8)
+		{	
+		RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg* voicemailPckg=(RMobilePhone::TMobilePhoneVoicemailIdsV3Pckg*)aMailBox;
+		RMobilePhone::TMobilePhoneVoicemailIdsV3& mailbox=(*voicemailPckg)();		
+		mailbox.iVoice = iVoiceMailIds->At(iCurrentIndex).iVoice;
+		mailbox.iData = iVoiceMailIds->At(iCurrentIndex).iData;
+		mailbox.iFax = iVoiceMailIds->At(iCurrentIndex).iFax;
+		mailbox.iOther = iVoiceMailIds->At(iCurrentIndex).iOther;
+		}
+	if(packagetype.ExtensionId() == KEtelExtMultimodeV8)
+		{	
+		RMobilePhone::TMobilePhoneVoicemailIdsV8Pckg* voicemailV8Pckg=(RMobilePhone::TMobilePhoneVoicemailIdsV8Pckg*)aMailBox;
+		RMobilePhone::TMobilePhoneVoicemailIdsV8& voicemailV8=(*voicemailV8Pckg)();		
+		voicemailV8.iVideo = iVoiceMailIds->At(iCurrentIndex).iVideo;
+		}
+	iCurrentIndex++;
+	iPhone->ReqCompleted(aReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetIccMessageWaitingIndicators(TTsyReqHandle aReqHandle,TDes8* aMsgIndicators)
+/**
+ * This function member retrieves the set of message waiting indicators from the 
+ * current ICC. 
+ * @param aReqHandle	        The request handle associated with this request.
+ * @param aMsgIndicators		The first parameter package.This will be populated with the
+ *						        message waiting indicators  information to be returned.
+ * @return TInt		        	Standard error value.
+ */
+	{
+	RMobilePhone::TMobilePhoneMessageWaitingV1Pckg* messagewaitPckg=(RMobilePhone::TMobilePhoneMessageWaitingV1Pckg*)aMsgIndicators;
+	RMobilePhone::TMultimodeType& packagetype = (*messagewaitPckg)();
+	
+	if(packagetype.ExtensionId() == KETelExtMultimodeV1 || packagetype.ExtensionId() == KEtelExtMultimodeV8)
+		{	
+		RMobilePhone::TMobilePhoneMessageWaitingV1Pckg* messagewaitingPckg=(RMobilePhone::TMobilePhoneMessageWaitingV1Pckg*)aMsgIndicators;
+		RMobilePhone::TMobilePhoneMessageWaitingV1& messagewaiting=(*messagewaitingPckg)();		
+		messagewaiting.iDisplayStatus=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iDisplayStatus;
+		messagewaiting.iVoiceMsgs=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iVoiceMsgs;
+		messagewaiting.iAuxVoiceMsgs=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iAuxVoiceMsgs;
+		messagewaiting.iDataMsgs =iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iDataMsgs;
+		messagewaiting.iFaxMsgs=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iFaxMsgs;
+		messagewaiting.iEmailMsgs=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iEmailMsgs;
+		messagewaiting.iOtherMsgs=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iOtherMsgs;
+		}
+	if(packagetype.ExtensionId() == KEtelExtMultimodeV8)
+		{	
+		RMobilePhone::TMobilePhoneMessageWaitingV8Pckg* messagewaitingV8Pckg=(RMobilePhone::TMobilePhoneMessageWaitingV8Pckg*)aMsgIndicators;
+		RMobilePhone::TMobilePhoneMessageWaitingV8& messagewaitingV8=(*messagewaitingV8Pckg)();		
+		messagewaitingV8.iVideoMsgs=iMessageWaiting->At(iGetIccMsgIdCurrentIndex).iVideoMsgs;
+		iGetIccMsgIdCurrentIndex++;
+		}
+	else
+		{
+		iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+		return KErrNone;		
+		}
+	iPhone->ReqCompleted(aReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::SetIccMessageWaitingIndicators(TTsyReqHandle aReqHandle,TDes8* aMsgIndicators)
+/**
+ * Sending information about the set of message waiting indicators from the 
+ * current ICC.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aMsgIndicators		The first parameter package.This contains the
+ *						message waiting indicators  information
+ * @return TInt			Standard error value.
+ */
+	{
+	RMobilePhone::TMobilePhoneMessageWaitingV1Pckg* messagewaitPckg=(RMobilePhone::TMobilePhoneMessageWaitingV1Pckg*)aMsgIndicators;
+	RMobilePhone::TMultimodeType& packagetype = (*messagewaitPckg)();
+	
+	if(packagetype.ExtensionId() == KETelExtMultimodeV1)
+		{	
+		RMobilePhone::TMobilePhoneMessageWaitingV1Pckg* messagewaitingPckg=(RMobilePhone::TMobilePhoneMessageWaitingV1Pckg*)aMsgIndicators;
+		RMobilePhone::TMobilePhoneMessageWaitingV1& messagewaiting=(*messagewaitingPckg)();		
+
+		if ((messagewaiting.iVoiceMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iVoiceMsgs) ||
+			(messagewaiting.iAuxVoiceMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iAuxVoiceMsgs) ||
+			(messagewaiting.iDataMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iDataMsgs) ||
+			(messagewaiting.iFaxMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iFaxMsgs) ||
+			(messagewaiting.iEmailMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iEmailMsgs)  ||
+			(messagewaiting.iOtherMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iOtherMsgs))
+			{
+			iPhone->ReqCompleted(aReqHandle,KErrCorrupt); //KErrCorrupt
+			}
+		else
+			{	
+			iPhone->ReqCompleted(aReqHandle,KErrNone);
+			}
+		}
+		
+	if(packagetype.ExtensionId() == KEtelExtMultimodeV8)
+		{	
+		RMobilePhone::TMobilePhoneMessageWaitingV8Pckg* messagewaitingV8Pckg=(RMobilePhone::TMobilePhoneMessageWaitingV8Pckg*)aMsgIndicators;
+		RMobilePhone::TMobilePhoneMessageWaitingV8& messagewaitingV8=(*messagewaitingV8Pckg)();		
+
+		if ((messagewaitingV8.iVoiceMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iVoiceMsgs) ||
+			(messagewaitingV8.iAuxVoiceMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iAuxVoiceMsgs) ||
+			(messagewaitingV8.iDataMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iDataMsgs) ||
+			(messagewaitingV8.iFaxMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iFaxMsgs) ||
+			(messagewaitingV8.iEmailMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iEmailMsgs)  ||
+			(messagewaitingV8.iOtherMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iOtherMsgs) ||
+			(messagewaitingV8.iVideoMsgs != iMessageWaiting->At(iSetIccMsgIdCurrentIndex).iVideoMsgs))
+			{
+			iPhone->ReqCompleted(aReqHandle,KErrCorrupt); //KErrCorrupt
+			}
+		else
+			{	
+			iSetIccMsgIdCurrentIndex++;
+			iPhone->ReqCompleted(aReqHandle,KErrNone);
+			}
+		}
+	else
+		{
+		iPhone->ReqCompleted(aReqHandle,KErrNotSupported);		
+		}
+	return KErrNone;	
+	}
+
+//
+// Wireless LAN (WLAN)
+//
+
+TInt CSimUsimR6::NotifyWlanDataChange(const TTsyReqHandle aTsyReqHandle,TDes8* aData)
+/**
+ * Notification request posted by the client is completed by the TSY when there is a change in 
+ * the Wlan Data. This API upon completion returns the current Wlan Data to the client.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aData			This contains the current Wlan data upon completion.
+ * @return TInt			Standard error value.
+ */
+	{
+	__ASSERT_ALWAYS(!iNotifyWlanDataChangePending,SimPanic(ENotificationReqAlreadyOutstanding));
+	RMobilePhone::TUsimWlanDataV8Pckg *WlanDataV8Pckg = reinterpret_cast<RMobilePhone::TUsimWlanDataV8Pckg*> (aData);
+	RMobilePhone::TUsimWlanDataV8 &WlanDataV8 = (*WlanDataV8Pckg)();
+	iNotifyWlanDataChangeReqHandle=aTsyReqHandle;
+	iNotifyWlanDataChange=&WlanDataV8;
+	if(iIndex%2==0)
+		{
+		iNotifyWlanDataChangePending=ETrue;
+		iWlanTimer->Start(KUsimRel6DurationTimeoutDefault,this,ETimerIdNotifyWlanDataEvent);
+		}
+	iIndex++;
+	return KErrNone;	
+	}
+
+TInt CSimUsimR6::NotifyWlanDataChangeCancel(TTsyReqHandle aTsyReqHandle)
+/**
+ * This API is used by the TSY to cancel any pending NotifyWlanDataChange request. 
+ * @param aReqHandle	The request handle associated with this request.
+ * @return TInt			Standard error value.
+ */
+	{
+	if(iNotifyWlanDataChangeReqHandle==aTsyReqHandle)
+		{
+		iNotifyWlanDataChangePending=EFalse;
+		iPhone->ReqCompleted(iNotifyWlanDataChangeReqHandle,KErrCancel);
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::SetWlanData(const TTsyReqHandle aTsyReqHandle,TDes8* aData)
+/**
+ * This API is used by the TSY to receive the Wlan data sent by the client.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aData			This contains the Wlan Data.
+ * @return TInt			Standard error value.
+ */
+	{
+	RMobilePhone::TUsimWlanDataV8Pckg *WlanDataV8Pckg = reinterpret_cast<RMobilePhone::TUsimWlanDataV8Pckg*> (aData);
+	RMobilePhone::TUsimWlanDataV8 &WlanDataV8 = (*WlanDataV8Pckg)();
+	
+	if(WlanDataV8.iPseudonym==SIMTSY_PHONE_WLAN_ACESS_DENIED)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrAccessDenied);
+		}
+	else if(WlanDataV8.iFieldsUsed == iWlanData->At(0).iFieldsUsed)
+		{
+		if((WlanDataV8.iPseudonym != iWlanData->At(0).iPseudonym) ||
+			(WlanDataV8.iReauthenticationId != iWlanData->At(0).iReauthenticationId))
+			{
+			iPhone->ReqCompleted(aTsyReqHandle,KErrCorrupt);
+			}
+		else
+			{
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+			}
+		}
+	else if(WlanDataV8.iFieldsUsed == iWlanData->At(1).iFieldsUsed)
+		{	
+		if((WlanDataV8.iPseudonym != iWlanData->At(1).iPseudonym) ||
+			(WlanDataV8.iReauthenticationId != iWlanData->At(1).iReauthenticationId) ||
+			(WlanDataV8.iMasterKey != iWlanData->At(1).iMasterKey) ||
+			(WlanDataV8.iCounter != iWlanData->At(1).iCounter))
+			{
+			iPhone->ReqCompleted(aTsyReqHandle,KErrCorrupt);
+			}
+		else
+			{
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+			}		
+		}
+	else
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	return KErrNone;	
+	}
+
+TInt CSimUsimR6::GetWlanData(const TTsyReqHandle aTsyReqHandle,TDes8* aData)
+/**
+ * This API is used by the TSY to send the Wlan data information requested by the client
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aData			This contains the current Wlan data upon completion.
+ * @return TInt			Standard error value.
+ */
+	{
+	RMobilePhone::TUsimWlanDataV8Pckg *WlanDataV8Pckg = reinterpret_cast<RMobilePhone::TUsimWlanDataV8Pckg*> (aData);
+	RMobilePhone::TUsimWlanDataV8 &WlanDataV8 = (*WlanDataV8Pckg)();
+
+	if(WlanDataV8.iPseudonym==SIMTSY_PHONE_WLAN_ACESS_DENIED)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrAccessDenied);
+		}
+	else if(WlanDataV8.iCounter == iWlanData->At(2).iCounter)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNotSupported);
+		}
+	else if(WlanDataV8.iFieldsUsed ==iWlanData->At(0).iFieldsUsed )
+		{
+		WlanDataV8.iPseudonym = iWlanData->At(0).iPseudonym;
+		WlanDataV8.iReauthenticationId = iWlanData->At(0).iReauthenticationId;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	else if(WlanDataV8.iFieldsUsed ==iWlanData->At(1).iFieldsUsed )
+		{
+		WlanDataV8.iPseudonym = iWlanData->At(1).iPseudonym;
+		WlanDataV8.iReauthenticationId = iWlanData->At(1).iReauthenticationId;
+		WlanDataV8.iMasterKey = iWlanData->At(1).iMasterKey;
+		WlanDataV8.iCounter = iWlanData->At(1).iCounter ;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	else
+		{
+		WlanDataV8.iFieldsUsed =iWlanData->At(1).iFieldsUsed; 
+		WlanDataV8.iPseudonym = iWlanData->At(1).iPseudonym;
+		WlanDataV8.iReauthenticationId = iWlanData->At(1).iReauthenticationId;
+		WlanDataV8.iMasterKey = iWlanData->At(1).iMasterKey;
+		WlanDataV8.iCounter = iWlanData->At(1).iCounter ;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNone);	
+		}
+	return KErrNone;	
+	}
+
+TInt CSimUsimR6::StorePreferredWlanSIDList(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+/**
+ * This API is used by the TSY to store the Preferred Wlan SID List sent by the Client.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aBuffer		This contains the Preferred Wlan SID List.
+ * @return TInt			Standard error value.
+ */
+	{
+	TInt ret=KErrNone;
+	TInt leaveCode=KErrNone;
+	TRAP(leaveCode, ret=ProcessStorePreferredWlanSIDListL(aTsyReqHandle, aBuffer););
+	if (leaveCode != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+	return ret;
+	}
+
+TInt CSimUsimR6::ProcessStorePreferredWlanSIDListL(TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+/**
+ * This API is used by the TSY to process the Preferred Wlan SID List sent by the Client and verify it.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aBuffer		This contains the Preferred Wlan SID List.
+ * @return TInt			Standard error value.
+ */
+	{
+	CMobilePhoneStoredWlanSIDList* list=CMobilePhoneStoredWlanSIDList::NewL();
+	CleanupStack::PushL(list);
+	list->RestoreL(*aBuffer);
+	RMobilePhone::TWlanSIDV8 entry;
+	if (list->Enumerate() > SIMTSY_PHONE_WLAN_SIDLIST_COUNT)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNoMemory);
+		CleanupStack::PopAndDestroy(); // list
+		return KErrNone;
+		}
+	TInt error=KErrCorrupt;
+	TInt ret;
+	for (TInt i=0; i<SIMTSY_PHONE_WLAN_SIDLIST_COUNT; ++i)
+		{
+		TRAP(ret,entry=list->GetEntryL(i));
+		if (ret != KErrNone)
+			{
+			break;
+			}
+		switch(i)
+			{
+		case 0:
+			if((entry.iWSID == iWlanSid->At(0).iWSID||entry.iWSID != iWlanSid->At(1).iWSID ||entry.iWSID != iWlanSid->At(2).iWSID)
+			   && (entry.iUserDefined == iWlanSid->At(0).iUserDefined || entry.iUserDefined == iWlanSid->At(1).iUserDefined || 
+			   entry.iUserDefined == iWlanSid->At(2).iUserDefined))
+				{
+				error  = KErrNone;
+				}
+			break;
+		case 1:
+			if((entry.iWSID == iWlanSid->At(0).iWSID||entry.iWSID != iWlanSid->At(1).iWSID ||entry.iWSID != iWlanSid->At(2).iWSID)
+			   && (entry.iUserDefined == iWlanSid->At(0).iUserDefined || entry.iUserDefined == iWlanSid->At(1).iUserDefined ||
+			    entry.iUserDefined == iWlanSid->At(2).iUserDefined))
+				{
+				error  = KErrNone;
+				}
+			break;
+		case 2:
+		default:
+			if((entry.iWSID == iWlanSid->At(0).iWSID||entry.iWSID != iWlanSid->At(1).iWSID ||entry.iWSID != iWlanSid->At(2).iWSID)
+			   && (entry.iUserDefined == iWlanSid->At(0).iUserDefined || entry.iUserDefined == iWlanSid->At(1).iUserDefined ||
+			    entry.iUserDefined == iWlanSid->At(2).iUserDefined))
+				{
+				error  = KErrNone;
+				}
+			break;
+			}
+		}
+	if(error == KErrNone)	
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNone);	
+		}
+	else
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrCorrupt);
+		}
+	CleanupStack::PopAndDestroy(); 
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::NotifyPreferredWlanSIDListChange(TTsyReqHandle aTsyReqHandle)
+/**
+ * This API is used by the TSY to complete the Preferred Wlan SID List change
+ * notification request posted by the client.
+ * 
+ * @param aReqHandle	The request handle associated with this request.
+ * @return TInt			Standard error value.
+ */
+	{
+	iNotifyPreferredWlanSIDListChangePending=ETrue;
+	iNotifyPreferredWlanSIDListReqHandle=aTsyReqHandle;
+	return KErrNone;
+	}
+	
+TInt CSimUsimR6::NotifyPreferredWlanSIDListChangeCancel(TTsyReqHandle /**aTsyReqHandle*/)
+/**
+ * This API is used by TSY to cancel any NotifyPreferredWlanSIDListChange outstanding requests 
+ * @return TInt			Standard error value.
+ */
+	{
+	iNotifyPreferredWlanSIDListChangePending=EFalse;
+	iPhone->ReqCompleted(iNotifyPreferredWlanSIDListReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetPreferredWlanSIDsPhase1(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aClient, TInt* aBufSize)
+/** 
+ * Tsy uses this API to retrieve the Preferred Wlan SIDs of each line from phone, 
+ * store each Preferred Wlan SID as a list entry,
+ * stream the list and then return size of this buffer to client.
+ * @param aReqHandle  Handle to the request.
+ * @param aClient     Pointer to the client.
+ * @param aBufSize    Size of the buffer the client has to allocate for the 2nd pahase.
+ */
+	{
+	TInt ret=KErrNone;
+	TInt leaveCode=KErrNone;
+	TRAP(leaveCode, ret=ProcessGetPreferredWlanSIDsPhase1L(aTsyReqHandle, aClient, aBufSize););
+	if (leaveCode != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+	return ret;
+	}	
+	
+TInt CSimUsimR6::ProcessGetPreferredWlanSIDsPhase1L(const TTsyReqHandle aTsyReqHandle, 
+													 RMobilePhone::TClientId* aClient, 
+													 TInt* aBufSize)
+/**
+* Retrieve stored Wlan specific IDs from USIM.
+* Store each entry,stream the list and then return size of this buffer to client
+* @param aReqHandle  Handle to the request.
+* @param aClient     Pointer to the client.
+* @param aBufSize    Size of the buffer the client has to allocate for the 2nd pahase.
+*/	
+	{
+	CMobilePhoneStoredWlanSIDList* list=CMobilePhoneStoredWlanSIDList::NewL();
+	CleanupStack::PushL(list);
+	RMobilePhone::TWlanSIDV8 entry;
+	// fill up an example list
+	for (TInt index=0; index < SIMTSY_PHONE_WLAN_SIDLIST_COUNT; index++)
+		{
+		switch (index)
+			{
+		case 0:
+			entry.iWSID = iWlanSid->At(0).iWSID;
+		    entry.iUserDefined = iWlanSid->At(0).iUserDefined;
+			break;
+		case 1:
+			entry.iWSID = iWlanSid->At(1).iWSID;
+		    entry.iUserDefined = iWlanSid->At(1).iUserDefined;
+			break;
+		case 2:
+		default:
+			entry.iWSID = iWlanSid->At(2).iWSID ;
+		    entry.iUserDefined = iWlanSid->At(2).iUserDefined;
+			break;
+			}
+		// Add the entry into the list, at the next empty location
+		list->AddEntryL(entry);
+		}
+	// Store the streamed list and the client ID
+	CListReadAllAttempt* read=CListReadAllAttempt::NewL(*aClient,aTsyReqHandle);
+	CleanupStack::PushL(read);
+	
+	read->iListBuf = list->StoreLC();
+	CleanupStack::Pop(); // pop the CBufBase allocated by StoreLC
+	
+	iGetWlanSIDsData->AppendL(read);
+	CleanupStack::Pop(); // pop the CListReadAllAttempt
+	
+	// return the CBufBase’s size to client
+	*aBufSize=(read->iListBuf)->Size();
+	
+	// Complete first phase of list retrieval
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	CleanupStack::PopAndDestroy(); // pop&destroy list
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetPreferredWlanSIDsPhase2(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aClient, TDes8* aBuf)
+/**
+* 2nd phase retrieval of the the Preferred Wlan SIDs list.
+* @param aReqHandle   Handle to the request.
+* @param aClient      Pointer to the client.
+* @param aBuf Buffer  Containing the Preferred Wlan SIDs list.
+*/
+	{
+	CListReadAllAttempt* read=NULL;
+	// Find the get preferred wlan SIDs from this client
+	for (TInt i=0; i<iGetWlanSIDsData->Count(); ++i)
+		{
+		read = iGetWlanSIDsData->At(i);
+		if ((read->iClient.iSessionHandle==aClient->iSessionHandle) &&
+		    (read->iClient.iSubSessionHandle==aClient->iSubSessionHandle))
+			{
+			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+			// Copy the streamed list to the client
+			aBuf->Copy(bufPtr);
+			delete read;
+			iGetWlanSIDsData->Delete(i);
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+			return KErrNone;
+			}
+		}
+	// Should handle error case of not finding the matching client from read all phase 1
+	return KErrNotFound;
+	}
+
+TInt CSimUsimR6::GetPreferredWlanSIDsCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel the request to retrieve the Preferred Wlan SIDs List.
+* @param aTsyReqHandle handle to the request
+*/
+	{
+	LOGCALL1("CSimPhone::GetPreferredNetworksCancel");
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	// Remove the read all attempt from iGetWlanSIDsData
+	CListReadAllAttempt* read=NULL;
+	for (TInt i=0; i<iGetWlanSIDsData->Count(); ++i)
+		{
+		read = iGetWlanSIDsData->At(i);
+		if (read->iReqHandle == aTsyReqHandle)
+			{
+			delete read;
+			iGetWlanSIDsData->Delete(i);
+			break;
+			}
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+	LOGCALL1("CSimPhone::GetPreferredWlanSIDsCancel");
+	return KErrNone;
+	}
+	
+TInt CSimUsimR6::GetPreferredNetworksPhase1(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aClient, TInt* aBufSize)
+/** 
+ * Tsy uses this API to retrieve the Preferred Networks of each line from phone, 
+ * store each Preferred Networks as a list entry,
+ * stream the list and then return size of this buffer to client.
+ * @param aReqHandle  Handle to the request.
+ * @param aClient     Pointer to the client.
+ * @param aBufSize    Size of the buffer the client has to allocate for the 2nd pahase.
+ */
+	{
+	TInt ret=KErrNone;
+	TInt leaveCode=KErrNone;
+	TRAP(leaveCode, ret=ProcessGetPreferredNetworksPhase1L(aTsyReqHandle, aClient, aBufSize););
+	if (leaveCode != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+	return ret;
+	}	
+	
+TInt CSimUsimR6::ProcessGetPreferredNetworksPhase1L(const TTsyReqHandle aTsyReqHandle, 
+													 RMobilePhone::TClientId* aClient, 
+													 TInt* aBufSize)
+/**
+* Retrieve stored Preferred Networks from USIM.
+* Store each entry,stream the list and then return size of this buffer to client
+* @param aReqHandle  Handle to the request.
+* @param aClient     Pointer to the client.
+* @param aBufSize    Size of the buffer the client has to allocate for the 2nd pahase.
+*/
+	{
+	CMobilePhoneStoredNetworkList* list=CMobilePhoneStoredNetworkList::NewL();
+	CleanupStack::PushL(list);
+	RMobilePhone::TMobilePreferredNetworkEntryV3 entry;
+	// fill up an example list
+	for (TInt index=0; index < SIMTSY_PHONE_NTWK_LIST_ENTRIES; index++)
+		{
+		switch (index)
+			{
+		case 0:
+			entry.iAccess = iPreferredNetworks->At(0).iAccess;
+			entry.iUserDefined = iPreferredNetworks->At(0).iUserDefined;
+			entry.iCountryCode = iPreferredNetworks->At(0).iCountryCode;
+			entry.iNetworkId = iPreferredNetworks->At(0).iNetworkId;
+			break;
+		case 1:
+			entry.iAccess = iPreferredNetworks->At(1).iAccess;
+			entry.iUserDefined = iPreferredNetworks->At(1).iUserDefined;
+			entry.iCountryCode = iPreferredNetworks->At(1).iCountryCode;
+			entry.iNetworkId = iPreferredNetworks->At(1).iNetworkId;
+			break;
+		case 2:
+		default:
+			entry.iAccess = iPreferredNetworks->At(2).iAccess;
+			entry.iUserDefined = iPreferredNetworks->At(2).iUserDefined;
+			entry.iCountryCode = iPreferredNetworks->At(2).iCountryCode;
+			entry.iNetworkId = iPreferredNetworks->At(2).iNetworkId;
+			break;
+		case 3:
+			entry.iAccess = iPreferredNetworks->At(3).iAccess;
+			entry.iUserDefined = iPreferredNetworks->At(3).iUserDefined;
+			entry.iCountryCode = iPreferredNetworks->At(3).iCountryCode;
+			entry.iNetworkId = iPreferredNetworks->At(3).iNetworkId;
+			break;
+			}
+		// Add the entry into the list, at the next empty location
+		list->AddEntryL(entry);
+		}
+	// Store the streamed list and the client ID
+	CListReadAllAttempt* read=CListReadAllAttempt::NewL(*aClient,aTsyReqHandle);
+	CleanupStack::PushL(read);
+	
+	read->iListBuf = list->StoreLC();
+	CleanupStack::Pop(); // pop the CBufBase allocated by StoreLC
+	
+	iGetPreferredNetworks->AppendL(read);
+	CleanupStack::Pop(); // pop the CListReadAllAttempt
+	
+	// return the CBufBase’s size to client
+	*aBufSize=(read->iListBuf)->Size();
+	
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	CleanupStack::PopAndDestroy(); // pop&destroy list
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetPreferredNetworksPhase2(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aClient, TDes8* aBuf)
+/**
+* 2nd phase retrieval of the the Preferred Networks list.
+* @param aReqHandle   Handle to the request.
+* @param aClient      Pointer to the client.
+* @param aBuf Buffer  Containing the Preferred Networks list.
+*/
+	{
+	CListReadAllAttempt* read=NULL;
+	// Find the get detected network attempt from this client
+	for (TInt i=0; i<iGetPreferredNetworks->Count(); ++i)
+		{
+		read = iGetPreferredNetworks->At(i);
+		if ((read->iClient.iSessionHandle==aClient->iSessionHandle) &&
+		    (read->iClient.iSubSessionHandle==aClient->iSubSessionHandle))
+			{
+			TPtr8 bufPtr((read->iListBuf)->Ptr(0));
+			// Copy the streamed list to the client
+			aBuf->Copy(bufPtr);
+			delete read;
+			iGetPreferredNetworks->Delete(i);
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+			return KErrNone;
+			}
+		}
+	// Should handle error case of not finding the matching client from read all phase 1
+	return KErrNotFound;
+	}
+
+TInt CSimUsimR6::GetPreferredNetworksCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+* Cancel the request to retrieve the Preferred Networks List.
+* @param aTsyReqHandle handle to the request
+*/
+	{
+	LOGCALL1("CSimPhone::GetPreferredNetworksCancel");
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	CListReadAllAttempt* read=NULL;
+	for (TInt i=0; i<iGetPreferredNetworks->Count(); ++i)
+		{
+		read = iGetPreferredNetworks->At(i);
+		if (read->iReqHandle == aTsyReqHandle)
+			{
+			delete read;
+			iGetPreferredNetworks->Delete(i);
+			break;
+			}
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+	LOGCALL1("CSimPhone::GetPreferredNetworksCancel");
+	return KErrNone;
+	}
+		
+TInt CSimUsimR6::StorePreferredNetworksList(const TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+/**
+ * This API is used by the TSY to store the Preferred Networks List sent by the Client.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aBuffer		This contains the Preferred Networks List.
+ * @return TInt			Standard error value.
+ */
+	{
+	TInt ret=KErrNone;
+	TInt leaveCode=KErrNone;
+	TRAP(leaveCode, ret=ProcessStorePreferredNetworksListL(aTsyReqHandle, aBuffer););
+	if (leaveCode != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+	return ret;
+	};
+
+TInt CSimUsimR6::ProcessStorePreferredNetworksListL(TTsyReqHandle aTsyReqHandle, TDes8* aBuffer)
+/**
+ * This API is used by the TSY to process the Preferred Networks List sent by the Client and verify it.
+ * @param aReqHandle	The request handle associated with this request.
+ * @param aBuffer		This contains the Preferred Networks List.
+ * @return TInt			Standard error value.
+ */
+	{
+	CMobilePhoneStoredNetworkList* list=CMobilePhoneStoredNetworkList::NewL();
+	CleanupStack::PushL(list);
+	
+	list->RestoreL(*aBuffer);
+
+	RMobilePhone::TMobilePreferredNetworkEntryV3 entry;
+
+	if (list->Enumerate() > SIMTSY_PHONE_NTWK_LIST_ENTRIES)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNoMemory);
+		CleanupStack::PopAndDestroy(); // list
+		return KErrNone;
+		}
+	TInt error=KErrCorrupt;
+	TInt ret;
+	for (TInt i=0; i<SIMTSY_PHONE_NTWK_LIST_ENTRIES; ++i)
+		{
+		TRAP(ret,entry=list->GetEntryL(i));
+		if (ret != KErrNone)
+			{
+			break;
+			}
+			switch(i)
+				{
+			case 0:
+				if((entry.iAccess == iPreferredNetworks->At(0).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(1).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(2).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(3).iAccess ) && 
+				(entry.iUserDefined == iPreferredNetworks->At(0).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(1).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(2).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(3).iUserDefined) && 
+			    (entry.iCountryCode == iPreferredNetworks->At(0).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(1).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(2).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(3).iCountryCode ) &&
+				(entry.iNetworkId == iPreferredNetworks->At(0).iNetworkId ||
+				entry.iNetworkId == iPreferredNetworks->At(1).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(2).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(3).iNetworkId ))
+					{
+					error  = KErrNone;
+					}
+				break;
+			case 1:
+				if((entry.iAccess == iPreferredNetworks->At(0).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(1).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(2).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(3).iAccess ) && 
+				(entry.iUserDefined == iPreferredNetworks->At(0).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(1).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(2).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(3).iUserDefined) && 
+			    (entry.iCountryCode == iPreferredNetworks->At(0).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(1).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(2).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(3).iCountryCode ) &&
+				(entry.iNetworkId == iPreferredNetworks->At(0).iNetworkId ||
+				entry.iNetworkId == iPreferredNetworks->At(1).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(2).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(3).iNetworkId ))
+					{
+					error  = KErrNone;
+					}
+				break;
+			case 2:
+				if((entry.iAccess == iPreferredNetworks->At(0).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(1).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(2).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(3).iAccess ) && 
+				(entry.iUserDefined == iPreferredNetworks->At(0).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(1).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(2).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(3).iUserDefined) && 
+			    (entry.iCountryCode == iPreferredNetworks->At(0).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(1).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(2).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(3).iCountryCode ) &&
+				(entry.iNetworkId == iPreferredNetworks->At(0).iNetworkId ||
+				entry.iNetworkId == iPreferredNetworks->At(1).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(2).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(3).iNetworkId ))
+					{
+					error  = KErrNone;
+					}
+				break;
+			case 3:
+			default:
+				if((entry.iAccess == iPreferredNetworks->At(0).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(1).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(2).iAccess ||
+				entry.iAccess == iPreferredNetworks->At(3).iAccess ) && 
+				(entry.iUserDefined == iPreferredNetworks->At(0).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(1).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(2).iUserDefined ||
+				entry.iUserDefined == iPreferredNetworks->At(3).iUserDefined) && 
+			    (entry.iCountryCode == iPreferredNetworks->At(0).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(1).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(2).iCountryCode  ||
+				entry.iCountryCode == iPreferredNetworks->At(3).iCountryCode ) &&
+				(entry.iNetworkId == iPreferredNetworks->At(0).iNetworkId ||
+				entry.iNetworkId == iPreferredNetworks->At(1).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(2).iNetworkId || 
+				entry.iNetworkId == iPreferredNetworks->At(3).iNetworkId ))
+					{
+					error  = KErrNone;
+					}
+				break;
+			}
+		}
+	if(error==KErrNone)	
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+		}
+	else
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,KErrCorrupt);
+		}
+	CleanupStack::PopAndDestroy(); // list
+	return KErrNone;
+	}
+	
+TInt CSimUsimR6::NotifyStorePreferredNetworksListChange(TTsyReqHandle aTsyReqHandle)
+/**
+ * This API is used by the TSY to complete the Preferred Networks List change
+ * notification request posted by the client.
+ * 
+ * @param aReqHandle	The request handle associated with this request.
+ * @return TInt			Standard error value.
+ */
+	{
+	iNotifyPreferredNetworksChangePending=ETrue;
+	iNotifyPreferredNetworksReqHandle=aTsyReqHandle;
+	return KErrNone;
+	}
+	
+TInt CSimUsimR6::NotifyStorePreferredNetworksListChangeCancel(TTsyReqHandle /**aTsyReqHandle*/)
+/**
+ * This API is used by TSY to cancel any NotifyPreferredNetworksListChange outstanding requests 
+
+ * @return TInt			Standard error value.
+ */
+	{
+	iNotifyPreferredNetworksChangePending=EFalse;
+	iPhone->ReqCompleted(iNotifyPreferredNetworksReqHandle,KErrCancel);
+	return KErrNone;
+	}
+	
+TInt CSimUsimR6::SetGbaBootstrapParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg, const RMobilePhone::TAID* aAID)
+	{
+	
+	RMobilePhone::TBsfDataV8Pckg *bsfDataV8Pckg = reinterpret_cast<RMobilePhone::TBsfDataV8Pckg*> (aPckg);
+	RMobilePhone::TBsfDataV8 &bsfDataV8 = (*bsfDataV8Pckg) ();
+	if((aAID == NULL) || (*aAID == iGBAAuthInfoList->At(iListIndex).iAID))
+		{
+		iSetGBABootstrapParams.iNotifyPending = ETrue;
+		iSetGBABootstrapParams.iNotifyHandle = aTsyReqHandle;
+		iSetGBABootstrapParams.iNotifyData = &bsfDataV8;
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::SetGbaBootstrapParamsCancel(const TTsyReqHandle /**aTsyReqHandle*/)
+	{
+	if(iSetGBABootstrapParams.iNotifyPending)
+		{
+		iSetGBABootstrapParams.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(iSetGBABootstrapParams.iNotifyHandle,KErrCancel);
+		}
+	else
+		{
+		iPhone->ReqCompleted(iSetGBABootstrapParams.iNotifyHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+
+TInt CSimUsimR6::NotifyAuthenticateDataChange(TTsyReqHandle aTsyReqHandle, TDes8* aPckg)
+	{
+	RMobilePhone::TAuthInfoV8Pckg *authInfV8Pckg = reinterpret_cast<RMobilePhone::TAuthInfoV8Pckg*> (aPckg);
+	RMobilePhone::TAuthInfoV8 &authInfoV8 = (*authInfV8Pckg)();
+	iNotifyAuthDataChange.iNotifyPending = ETrue;
+	iNotifyAuthDataChange.iNotifyHandle = aTsyReqHandle;
+	iNotifyAuthDataChange.iNotifyData = &authInfoV8;
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::NotifyAuthenticateDataChangeCancel(const TTsyReqHandle /**aTsyReqHandle*/)
+	{
+	if(iNotifyAuthDataChange.iNotifyPending)
+		{
+		iNotifyAuthDataChange.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(iNotifyAuthDataChange.iNotifyHandle,KErrCancel);
+		}
+	else
+		{
+		iPhone->ReqCompleted(iNotifyAuthDataChange.iNotifyHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetAuthenticationParams(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg, TDes8* aPckg2)
+	{
+	RMobilePhone::TAuthInfoV8Pckg *authInfoV8Pckg = reinterpret_cast<RMobilePhone::TAuthInfoV8Pckg*> (aPckg);
+	RMobilePhone::TAuthInfoV8 &authInfoV8 = (*authInfoV8Pckg)();
+	if ( authInfoV8.iAID == iGBAAuthInfoList->At(iListIndex).iAID ||
+			authInfoV8.iAID == iMBMSInfoList->At(iListIndex).iAID )
+		{
+		iGetAuthParams.iNotifyPending = ETrue;
+		iGetAuthParams.iNotifyHandle = aTsyReqHandle;
+		if ( authInfoV8.iData == RMobilePhone::EGbaBootstrapParams)
+			{
+			RMobilePhone::TGbaBootstrapParamsV8Pckg
+					*gbaBootstrapV8Pckg = reinterpret_cast<RMobilePhone::TGbaBootstrapParamsV8Pckg*> (aPckg2);
+			RMobilePhone::TGbaBootstrapParamsV8 &gbaBootstrapV8 = (*gbaBootstrapV8Pckg) ();
+			iGetAuthParams.iNotifyData = &gbaBootstrapV8;
+			return KErrNone;
+			}
+		if ( authInfoV8.iData == RMobilePhone::EMbmsMuk)
+			{
+			RMobilePhone::TMbmsUserKeyV8Pckg
+					*mbmsUserKeyV8Pckg = reinterpret_cast<RMobilePhone::TMbmsUserKeyV8Pckg*> (aPckg2);
+			RMobilePhone::TMbmsUserKeyV8 &mbmsUserKeyV8 = (*mbmsUserKeyV8Pckg) ();
+
+			iGetAuthParams.iNotifyData = &mbmsUserKeyV8;
+			return KErrNone;
+			}
+		iGetAuthParams.iNotifyData = NULL;
+		}
+	else
+		{
+		iGetAuthParams.iNotifyPending = ETrue;
+		iGetAuthParams.iNotifyHandle = aTsyReqHandle;
+		iGetAuthParams.iNotifyData = NULL;
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetAuthenticationParamsCancel(const TTsyReqHandle /**aTsyReqHandle*/)
+	{
+	if(iGetAuthParams.iNotifyPending)
+		{
+		iGetAuthParams.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(iGetAuthParams.iNotifyHandle,KErrCancel);
+		}
+	else
+		{
+		iPhone->ReqCompleted(iGetAuthParams.iNotifyHandle,KErrNone);
+		}
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetAuthenticationListPhase1(const TTsyReqHandle aTsyReqHandle,
+		CRetrieveMobilePhoneAuthenticationIds::TAuthRequestData* aRequest,TInt* aBufSize)
+	/**
+	1st phase retrieval of the the call waiting status list
+	@param aReqHandle Handle to the request
+	@param aReqData information about the request
+	@param aBufSize Size of the buffer the client has to allocate for the 2nd pahase
+  	*/
+	{
+	TInt ret=KErrNone;
+	TInt leaveCode=KErrNone;
+	if (aRequest->iAuthInfo.iData==RMobilePhone::EGbaNafIdList)
+		{
+		iAuthType = EGba;
+		TRAP(leaveCode, ret=ProcessGetGbaPhase1L(aTsyReqHandle,& (aRequest->iClient),aBufSize));
+		}
+	else if(aRequest->iAuthInfo.iData==RMobilePhone::EMbmsMskIdList)
+		{
+		iAuthType = EMbms;
+		TRAP(leaveCode, ret=ProcessGetMbmsPhase1L(aTsyReqHandle,& (aRequest->iClient),aBufSize));
+		}
+	else
+		{
+		leaveCode = KErrCorrupt;
+		}
+	if (leaveCode != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,leaveCode);
+		}
+	return ret;
+	};
+
+TInt CSimUsimR6::ProcessGetGbaPhase1L(const TTsyReqHandle aTsyReqHandle,
+		RMobilePhone::TClientId* aClientId,TInt* aBufSize)
+/** Retrieve call waiting status of each line from phone, 
+ store each CB status response as a list entry,
+ stream the list and then return size of this buffer to client
+ @param aReqHandle Handle to the request
+ @param aReqData information about the request
+ @param aBufSize Size of the buffer the client has to allocate for the 2nd pahase
+ */
+	{
+	// read the list, store its content and then return size of this buffer to client
+	CMobilePhoneGbaNafIdList* list=CMobilePhoneGbaNafIdList::NewL();
+	CleanupStack::PushL(list);
+	TInt maxList = iGbaNafList->Enumerate();
+	if(maxList)
+		{
+		for (TInt i=0;i<maxList;i++)
+			{
+			list->AddEntryL(iGbaNafList->GetEntryL(i));
+			}
+		}
+	else
+		{
+		CleanupStack::PopAndDestroy(list);
+		*aBufSize = 10;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrCorrupt);
+		return KErrNotFound;
+		}
+	// Store the streamed list and the client ID
+	CListReadAllAttempt* read=CListReadAllAttempt::NewL(*(aClientId), aTsyReqHandle);
+	CleanupStack::PushL(read);
+
+	read->iListBuf = list->StoreLC();
+	CleanupStack::Pop(); // pop the CBufFlat allocated by StoreLC
+
+	iAuthListInfo->AppendL(read);
+	CleanupStack::Pop(); // pop the CListReadAllAttempt
+
+	// return the CBufFlat’s size to client
+	*aBufSize=(read->iListBuf)->Size();
+
+	CleanupStack::PopAndDestroy(list);
+	
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::ProcessGetMbmsPhase1L(const TTsyReqHandle aTsyReqHandle,
+		RMobilePhone::TClientId* aClientId,TInt* aBufSize)
+	{
+	CMobilePhoneMbmsMskIdList* list=CMobilePhoneMbmsMskIdList::NewL();
+	CleanupStack::PushL(list);
+	TInt maxList;
+	if(iAuthType == EGba)
+		{
+		maxList = iGbaNafList->Enumerate();
+		}
+	else
+		{
+		maxList = iMbmsMskList->Enumerate();
+		}
+	if(maxList)
+		{
+		for (TInt i=0;i<maxList;i++)
+			{
+			list->AddEntryL(iMbmsMskList->GetEntryL(i));
+			}
+		}
+	else
+		{
+		CleanupStack::PopAndDestroy(list);
+		*aBufSize = 10;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrCorrupt);
+		return KErrNotFound;
+		}
+	
+	// Store the streamed list and the client ID
+	CListReadAllAttempt* read=CListReadAllAttempt::NewL(*(aClientId), aTsyReqHandle);
+	CleanupStack::PushL(read);
+
+	read->iListBuf = list->StoreLC();
+	CleanupStack::Pop(); // pop the CBufFlat allocated by StoreLC
+
+	iAuthListInfo->AppendL(read);
+	CleanupStack::Pop(); // pop the CListReadAllAttempt
+
+	// return the CBufFlat’s size to client
+	*aBufSize=(read->iListBuf)->Size();
+
+	CleanupStack::PopAndDestroy(list);
+	
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimUsimR6::GetAuthenticationListPhase2(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TClientId* aId,TDes8* aBuf)
+/**
+ *	 2nd phase retrieval of the the call waiting status list
+ @param aReqHandle Handle to the request
+ @param aClient Ponter to the client
+ @param aBuf Buffer containiong the call waiting status list
+ */
+	{
+	CListReadAllAttempt* read=NULL;
+	TBool tPosScen = ETrue;
+	
+	// Find the Authentication information for the client
+	if ( iAuthType == EGba)
+		{
+		for (TInt i=0; i<iAuthListInfo->Count (); ++i)
+			{
+			read = iAuthListInfo->At (i);
+			if ( (read->iClient.iSessionHandle==aId->iSessionHandle)&&(read->iClient.iSubSessionHandle==aId->iSubSessionHandle))
+				{
+				if ( tPosScen)
+					{
+					TPtr8 bufPtr((read->iListBuf)->Ptr (0));
+					// Copy the streamed list to the client
+					aBuf->Copy (bufPtr);
+					}
+				delete read;
+				iAuthListInfo->Delete (i);
+				User::After (300000);
+				iPhone->ReqCompleted (aTsyReqHandle, KErrNone);
+				return KErrNone;
+				}
+			}
+		}
+	else // authtype = EMbms
+		{
+		for (TInt i=0; i<iAuthListInfo->Count (); ++i)
+			{
+			read = iAuthListInfo->At (i);
+			if ( (read->iClient.iSessionHandle==aId->iSessionHandle)&&(read->iClient.iSubSessionHandle==aId->iSubSessionHandle))
+				{
+				if ( tPosScen)
+					{
+					TPtr8 bufPtr((read->iListBuf)->Ptr (0));
+					// Copy the streamed list to the client
+					aBuf->Copy (bufPtr);
+					}
+				delete read;
+				iAuthListInfo->Delete (i);
+				User::After (300000);
+				iPhone->ReqCompleted (aTsyReqHandle, KErrNone);
+				return KErrNone;
+				}
+			}
+		}
+	// Should handle error case of not finding the matching client from read phase 1
+	return KErrNotFound;
+	}
+
+TInt CSimUsimR6::GetAuthenticationListCancel(const TTsyReqHandle aTsyReqHandle)
+	{
+	// Remove the read all attempt from iAuthReadAll
+	
+	CListReadAllAttempt* read=NULL;
+	for (TInt i=0; i<iAuthListInfo->Count(); ++i)
+		{
+		read = iAuthListInfo->At(i);
+		if (read->iReqHandle == aTsyReqHandle)
+			{
+			delete read;
+			iAuthListInfo->Delete(i);
+			break;
+			}
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+	return KErrNone;
+	}
+	
+TInt CSimUsimR6::RandTime()
+/** Function that generates time(in seconds) at random for the SimTSY 
+ * Maximum of ten seconds; zero seconds also included just to simulate the 
+ * synchronous call scenario 
+ */
+	{
+	TInt ranT= Math::Random()%10; 
+	return(ranT);
+	}
+
+
+