telephonyserverplugins/simtsy/src/CSimPhoneSecurity.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/CSimPhoneSecurity.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1810 @@
+// Copyright (c) 2002-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:
+// Implements the Phone Security manipulation code.
+// 
+//
+
+/**
+ @file
+*/
+
+#include "CSimPhone.h"
+#include "Simlog.h"
+#include "utils.h"
+#include "CSimPhoneSecurity.h"
+#include <testconfigfileparser.h>
+#include "CSimTsyMode.h"
+#include <e32math.h>
+
+//
+// CSimPhoneSecurity
+//
+const TInt KICCProfileGranularity=5;		// < Granularity for Icc profile list array
+
+const TInt KDefaultPinEntryAttempts=3;		// < default number of PIN entry attempts if not defined in the config file
+const TInt KDefaultPukEntryAttempts=10;		// < default number of PUK entry attempts if not defined in the config file
+
+CSimPhoneSecurity* CSimPhoneSecurity::NewL(CSimPhone* aPhone)
+/**
+ * Standard two phase constructor.
+ * @param aPhone The phone object from which the PhoneSecurity was opened.
+ */
+	{
+	CSimPhoneSecurity* obj=new(ELeave) CSimPhoneSecurity(aPhone);
+	CleanupStack::PushL(obj);
+	obj->ConstructL();
+	CleanupStack::Pop();
+	return obj;
+	}
+
+CSimPhoneSecurity::CSimPhoneSecurity(CSimPhone* aPhone)
+		: iPhone(aPhone) 
+/**
+ * Trivial first phase constructor.
+ * @param aPhone	The phone object from which this phonebook was opened.
+ */
+	{}
+
+void CSimPhoneSecurity::Init()
+	{}
+
+void CSimPhoneSecurity::ConstructL()
+/** Change
+ * Second phase constructor that allocates memory for the phonebook, batch read buffer and
+ * a delayed completion timer.  The constructor also reads the individual and batch read
+ * delays from the configuration file.
+ */
+	{
+	LOGPHONE1("Starting to parse PhoneSecurity additional config parameters...");
+	
+	iNotifySettingsTimer = CIccTimer::NewL();
+	iNotifySecurityEventsTimer = CIccTimer::NewL();
+	
+	iNotifySettingsTimer->iTimer = CSimTimer::NewL(iPhone);
+	iNotifySecurityEventsTimer->iTimer = CSimTimer::NewL(iPhone);
+	const CTestConfigItem* item=NULL;
+	TInt ret=KErrNone;
+	TInt i;
+	iICCStatusProfile=new(ELeave) CArrayFixFlat<TICCStatusEntry>(KICCProfileGranularity);
+	iICCSettingProfile=new(ELeave) CArrayFixFlat<TICCSettingEntry>(KICCProfileGranularity);
+
+	item=CfgFile()->Item(KSecurityCodes);
+	if(item)
+		{
+		TPtrC8 temp;
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,0,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iPin1.Copy(temp);
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,1,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iPin2.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,2,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iPuk1.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,3,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iPuk2.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,4,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iPhonePassword.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,5,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iSPC.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,6,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iPhBkHiddenKey.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,7,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iUSimAppPin.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,8,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iSecondUSimAppPin.Copy(temp);
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,9,&KSecurityCodes);
+			}
+		else
+			iSecCodes.iUniversalPin.Copy(temp);
+		}
+	
+	
+	item=CfgFile()->Item(KSecurityCodeAttempts);
+	if(item)
+		{
+		TInt temp;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR(&KSecurityCodeAttempts,ret,0,&KSecurityCodeAttempts);
+			}
+		else
+			{
+			if (temp <= 0)
+				{
+				LOGPARSERRANGE(&KSecurityCodeAttempts,temp,"> 0",0,&KSecurityCodeAttempts);
+				LOGCONFIG1("Using default value...");
+				temp = KDefaultPinEntryAttempts;
+				}
+			iSecurityCodeRemainigAttempts.iPin1=temp;
+			iSecurityCodeDefaultRemainigAttempts.iPin1=temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR(&KSecurityCodeAttempts,ret,1,&KSecurityCodeAttempts);
+			}
+		else
+			{
+			if (temp <= 0)
+				{
+				LOGPARSERRANGE(&KSecurityCodeAttempts,temp,"> 0",1,&KSecurityCodeAttempts);
+				LOGCONFIG1("Using default value...");
+				temp = KDefaultPinEntryAttempts;
+				}
+			iSecurityCodeRemainigAttempts.iPin2=temp;
+			iSecurityCodeDefaultRemainigAttempts.iPin2=temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR(&KSecurityCodeAttempts,ret,2,&KSecurityCodeAttempts);
+			}
+		else
+			{
+			if (temp <= 0)
+				{
+				LOGPARSERRANGE(&KSecurityCodeAttempts,temp,"> 0",2,&KSecurityCodeAttempts);
+				LOGCONFIG1("Using default value...");
+				temp = KDefaultPukEntryAttempts;
+				}
+			iSecurityCodeRemainigAttempts.iPuk1=temp;
+			iSecurityCodeDefaultRemainigAttempts.iPuk1=temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR(&KSecurityCodeAttempts,ret,3,&KSecurityCodeAttempts);
+			}
+		else
+			{
+			if (temp <= 0)
+				{
+				LOGPARSERRANGE(&KSecurityCodeAttempts,temp,"> 0",3,&KSecurityCodeAttempts);
+				LOGCONFIG1("Using default value...");
+				temp = KDefaultPukEntryAttempts;
+				}
+			iSecurityCodeRemainigAttempts.iPuk2=temp;
+			iSecurityCodeDefaultRemainigAttempts.iPuk2=temp;
+			}
+		}
+	else
+		{
+		LOGPHONE2("NOTE tag %S not defined, using default values",&KSecurityCodeAttempts);
+		iSecurityCodeDefaultRemainigAttempts.iPin1= KDefaultPinEntryAttempts;
+		iSecurityCodeRemainigAttempts.iPin1= iSecurityCodeDefaultRemainigAttempts.iPin1;
+		iSecurityCodeDefaultRemainigAttempts.iPin2= KDefaultPinEntryAttempts;
+		iSecurityCodeRemainigAttempts.iPin2= iSecurityCodeDefaultRemainigAttempts.iPin2;
+		iSecurityCodeDefaultRemainigAttempts.iPuk1= KDefaultPukEntryAttempts;
+		iSecurityCodeRemainigAttempts.iPuk1= iSecurityCodeDefaultRemainigAttempts.iPuk1;
+		iSecurityCodeDefaultRemainigAttempts.iPuk2= KDefaultPukEntryAttempts;
+		iSecurityCodeRemainigAttempts.iPuk2 = iSecurityCodeDefaultRemainigAttempts.iPuk2;
+		}
+	
+	item=CfgFile()->Item(KICCLockedAtStart);
+	if(item)
+		{
+		TInt temp;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,0,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iPin1=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iPin1=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,1,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iPin2=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iPin2=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,2,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iPuk1=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iPuk1=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,3,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iPuk2=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iPuk2=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,4,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,4,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iPhonePassword=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iPhonePassword=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,5,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,5,&KICCLockedAtStart);
+			}
+		else
+			iSecStatus.iSPC=(RMobilePhone::TMobilePhoneLockStatus) temp;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,6,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,6,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iPhBkHiddenKey=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iPhBkHiddenKey=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,7,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,7,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iUSimAppPin=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iUSimAppPin=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,8,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,8,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iSecondUSimAppPin=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iSecondUSimAppPin=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,9,temp);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("temp",ret,9,&KICCLockedAtStart);
+			}
+		else
+			{
+			iSecStatus.iUniversalPin=(RMobilePhone::TMobilePhoneLockStatus) temp;
+			iSecSetting.iUniversalPin=(RMobilePhone::TMobilePhoneLockSetting) temp;
+			}
+		}
+		
+		TInt count=CfgFile()->ItemCount(KICCStatus);
+		for(i=0;i<count;i++)
+			{
+			item=CfgFile()->Item(KICCStatus,i);
+			if(!item)
+				break;
+
+			TInt duration;
+			TInt ICCStatus;
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
+			if(ret!=KErrNone)
+				{
+				LOGPARSERR("duration",ret,0,&KICCStatus);
+				continue;
+				}
+			
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,ICCStatus);
+			if(ret!=KErrNone)
+				{
+				LOGPARSERR("ICCStatus",ret,1,&KICCStatus);
+				continue;
+				}
+			
+			TICCStatusEntry icc;
+			icc.iDuration=duration;
+			icc.iICCStatus=(RMobilePhone::TMobilePhoneSecurityEvent) ICCStatus;
+			iICCStatusProfile->AppendL(icc);
+			}
+			
+			
+		count=CfgFile()->ItemCount(KICCSetting);
+		for(i=0;i<count;i++)
+			{
+			item=CfgFile()->Item(KICCSetting,i);
+			if(!item)
+				break;
+
+	
+			TInt duration(0), lock(0), lockSetting(0), lockStatus(0);
+
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0,duration);
+			if(ret!=KErrNone)
+				{
+				LOGPARSERR("duration",ret,0,&KICCSetting);
+				continue;
+				}
+				
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1,lock);
+			if(ret!=KErrNone)
+				{
+				LOGPARSERR("lock",ret,1,&KICCSetting);
+				continue;
+				}
+			
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,2,lockSetting);
+			if(ret!=KErrNone)
+				{
+				LOGPARSERR("lockSetting",ret,2,&KICCSetting);
+				continue;
+				}
+			
+			ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,3,lockStatus);
+			if(ret!=KErrNone)
+				{
+				LOGPARSERR("lockStatus",ret,3,&KICCSetting);
+				continue;
+				}
+			
+			TICCSettingEntry icc;
+			icc.iLock = (RMobilePhone::TMobilePhoneLock)lock;
+			icc.iDuration=duration;
+			icc.iLockInfo.iSetting=(RMobilePhone::TMobilePhoneLockSetting) lockSetting;
+			icc.iLockInfo.iStatus=(RMobilePhone::TMobilePhoneLockStatus) lockStatus;
+			iICCSettingProfile->AppendL(icc);
+			}
+
+	}
+
+
+CSimPhoneSecurity::~CSimPhoneSecurity()
+/**
+ * Standard destructor.  Any objects created by the ::ConstructL() function
+ * will be destroyed here.
+ */
+	{
+
+	if(iICCStatusProfile)
+		{
+		iICCStatusProfile->Delete(0,iICCStatusProfile->Count());
+		delete iICCStatusProfile;
+		}
+	if(iICCSettingProfile)
+		{
+		iICCSettingProfile->Delete(0, iICCSettingProfile->Count());
+		delete iICCSettingProfile;
+		}
+		
+	delete iNotifySettingsTimer;
+	delete iNotifySecurityEventsTimer;
+	
+	if (iUnlockNamTimer)
+		{
+		iUnlockNamTimer->Cancel();
+		delete iUnlockNamTimer;
+		iUnlockNamTimer = NULL;
+		}
+	if (iLockNamTimer)
+		{
+		iLockNamTimer->Cancel();
+		delete iLockNamTimer;
+		iLockNamTimer = NULL;
+		}
+	}
+
+TInt CSimPhoneSecurity::ExtFunc(const TTsyReqHandle aReqHandle,const TInt aIpc, const TDataPackage& aPckg)
+/**
+ * Dispatch function for all Phonebook Store requests.
+ * @param aReqHandle	The TSY request handle for this request.
+ * @param aIpc			The IPC number of this request.
+ * @param aPckg			The parameter package related to this request.
+ * @return TInt			The return error condition.
+ */
+	{
+
+	TAny* dataPtr = aPckg.Ptr1();
+	TAny* dataPtr2 = aPckg.Ptr2();
+
+// The following requests can be completed even if the completion of another request is pending.
+	switch(aIpc)
+		{
+	case EMobilePhoneGetSecurityCaps:
+		return GetSecurityCaps(aReqHandle,
+			REINTERPRET_CAST(TUint32*, dataPtr));
+
+	case EMobilePhoneNotifySecurityCapsChange:
+		return NotifySecurityCapsChange(aReqHandle, 
+			REINTERPRET_CAST(TUint32*, dataPtr2));
+
+	case EMobilePhoneGetLockInfo:
+		return GetLockInfo(aReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneLock*, dataPtr), 
+			aPckg.Des2n());
+
+	case EMobilePhoneNotifyLockInfoChange:
+		return NotifyLockInfoChange(aReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneLock*, dataPtr), 
+			aPckg.Des2n());
+
+	case EMobilePhoneSetLockSetting:
+		return SetLockSetting(aReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneLock*, dataPtr), 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneLockSetting*, dataPtr2));
+
+	case EMobilePhoneGetSecurityCodeInfo:
+		return GetSecurityCodeInfo(aReqHandle, 
+			reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCode*> (dataPtr), 
+			aPckg.Des2n());
+
+	case EMobilePhoneNotifySecurityCodeInfoChange:
+		return NotifySecurityCodeInfoChange(aReqHandle, 
+			reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCode*> (dataPtr), 
+			aPckg.Des2n());
+		
+	case EMobilePhoneChangeSecurityCode:
+		return ChangeSecurityCode(aReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneSecurityCode*, dataPtr),
+			aPckg.Des2n());
+
+	case EMobilePhoneNotifySecurityEvent:
+		return NotifySecurityEvent(aReqHandle, aPckg.Des1n());
+
+	case EMobilePhoneVerifySecurityCode:
+		return VerifySecurityCode(aReqHandle, 
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneSecurityCode*, dataPtr), 
+			REINTERPRET_CAST(RMobilePhone::TCodeAndUnblockCode*, dataPtr2));
+ 
+	case EMobilePhoneAbortSecurityCode:
+		return AbortSecurityCode(aReqHandle,
+			REINTERPRET_CAST(RMobilePhone::TMobilePhoneSecurityCode*, dataPtr));
+	default:
+		break;
+		}
+
+
+// The TSY can only process one of the following requests at a time.  If a second is received
+// while processing the first, then it will be errored with KErrInUse.  This restriction will
+// be removed later, by inserting a request queuing mechanism.  Note that the standard TSY
+// "flow control" mechanism works phone-wide and so is not suitable.
+
+//	switch(aIpc)
+//		{
+//	default:
+//		break;
+//		}
+
+	return KErrNotSupported;
+	}
+
+CTelObject* CSimPhoneSecurity::OpenNewObjectByNameL(const TDesC& /*aName*/)
+/**
+ * The API does not support any objects that could be opened from this one.
+ */
+	{
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+CTelObject* CSimPhoneSecurity::OpenNewObjectL(TDes&)
+/**
+ * The API does not support any objects that could be opened from this one.
+ */
+	{
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+CTelObject::TReqMode CSimPhoneSecurity::ReqModeL(const TInt aIpc)
+/**
+ * This function returns the Request Mode for the request with the passed IPC value.
+ * @param aIpc		The IPC number of the request.
+ * @return TReqMode	The request mode.
+ */
+	{
+	CTelObject::TReqMode ret=0;	
+	// This function seems be unused. ReqModeL for security related IPC is in CSimPhone. 
+	switch(aIpc)
+		{
+	case EMobilePhoneGetSecurityCaps:
+	case EMobilePhoneGetLockInfo:
+	case EMobilePhoneSetLockSetting:
+	case EMobilePhoneChangeSecurityCode:
+	case EMobilePhoneVerifySecurityCode:
+	case EMobilePhoneAbortSecurityCode:
+		break;
+
+	case EMobilePhoneNotifyLockInfoChange:
+	case EMobilePhoneNotifySecurityCapsChange:
+	case EMobilePhoneNotifySecurityEvent:
+		ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+		break;
+
+	default:
+		User::Leave(KErrNotSupported);
+		break;
+		}
+
+	return ret;
+	}
+
+TInt CSimPhoneSecurity::RegisterNotification(const TInt /*aIpc*/)
+/**
+ * The ETel Server calls this function when the first client makes a notification
+ * request.  If supported by the underlying protocol controlling the
+ * signalling stack, this can be used to start requesting updates for the relevant
+ * service.
+ */
+	{
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::DeregisterNotification(const TInt /*aIpc*/)
+/**
+ * The ETel Server calls this function when the last client that had previously
+ * made a notification request closes its ETel Server handle.  If supported by
+ * the underlying protocol controlling the	signalling stack, this can be used
+ * to stop requesting updates for the relevant service.
+ */
+	{
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NumberOfSlotsL(const TInt aIpc)
+/**
+ * Return the number of slots that the ETel Server should allocate for buffering requests
+ * of the given IPC number.
+ */
+	{
+	switch(aIpc)
+		{
+	case EMobilePhoneNotifyLockInfoChange:
+	case EMobilePhoneNotifySecurityCapsChange:
+	case EMobilePhoneNotifySecurityEvent:
+		return KDefaultNumberOfSlots;
+
+	default:
+		LOGPHONE1("CSimPhoneSecurity: Number of Slots error, unknown IPC");
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	return KDefaultNumberOfSlots;
+	}
+
+TInt CSimPhoneSecurity::CancelService(const TInt aIpc, const TTsyReqHandle aReqHandle)
+/**
+ * Cancel an outstanding request.
+ * @param aIpc			The IPC number of the request that is to be cancelled.
+ * @param aTsyReqHandle	The TSY request handle of the request that is to be cancelled.
+ * @param TInt			Standard return value.
+ */
+	{
+	switch(aIpc)
+		{
+	case EMobilePhoneNotifySecurityCapsChange:
+		return NotifySecurityCapsChangeCancel(aReqHandle);
+
+	case EMobilePhoneGetLockInfo:
+		return GetLockInfoCancel(aReqHandle);
+
+	case EMobilePhoneNotifyLockInfoChange:
+		return NotifyLockInfoChangeCancel(aReqHandle);
+
+	case EMobilePhoneSetLockSetting:
+		return SetLockSettingCancel(aReqHandle);
+
+	case EMobilePhoneGetSecurityCodeInfo:
+		return GetSecurityCodeInfoCancel(aReqHandle);
+		
+	case EMobilePhoneNotifySecurityCodeInfoChange:
+		return NotifySecurityCodeInfoChangeCancel(aReqHandle);
+	
+	case EMobilePhoneChangeSecurityCode:
+		return ChangeSecurityCodeCancel(aReqHandle);
+
+	case EMobilePhoneNotifySecurityEvent:
+		return NotifySecurityEventCancel(aReqHandle);
+
+	case EMobilePhoneVerifySecurityCode:
+		return VerifySecurityCodeCancel(aReqHandle);
+	default:
+		break;
+		}
+	return KErrNone;
+	}
+
+
+const CTestConfigSection* CSimPhoneSecurity::CfgFile()
+/**
+* Returns a pointer to the config file section
+*
+* @return CTestConfigSection a pointer to the configuration file data section
+*/
+	{
+	LOGPHONE1(">>CSimPhoneSecurity::CfgFile");
+	return iPhone->CfgFile();
+	}
+
+
+TInt CSimPhoneSecurity::GetSecurityCaps(const TTsyReqHandle aReqHandle, TUint32* aCaps)
+	{
+		//Support all the security features that can be configured using config.txt
+		*aCaps= ( RMobilePhone::KCapsLockPhone |
+				  RMobilePhone::KCapsLockICC |
+				  RMobilePhone::KCapsAccessPin1 |
+				  RMobilePhone::KCapsAccessPin2 |
+				  RMobilePhone::KCapsAccessPhonePassword |
+				  RMobilePhone::KCapsAccessSPC |
+				  RMobilePhone::KCapsAccessHiddenKey |
+				  RMobilePhone::KCapsAccessUSIMAppPin |
+				  RMobilePhone::KCapsAccessUSIMAppSecondPin |
+				  RMobilePhone::KCapsAccessUniversalPin );  
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NotifySecurityCapsChange(const TTsyReqHandle aReqHandle, TUint32* /*aCaps*/)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NotifySecurityCapsChangeCancel(const TTsyReqHandle aReqHandle)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::GetLockInfo(const TTsyReqHandle aReqHandle, RMobilePhone::TMobilePhoneLock* aLock, TDes8* aLockInfo)
+	{
+		RMobilePhone::TMobilePhoneLockInfoV1Pckg* lockPckg = (RMobilePhone::TMobilePhoneLockInfoV1Pckg*) aLockInfo;
+		RMobilePhone::TMobilePhoneLockInfoV1& lock = (*lockPckg)();
+
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion(lock);
+		if(err != KErrNone)
+			{
+			iPhone->ReqCompleted(aReqHandle, err);
+			return KErrNone;
+			}
+
+		switch(*aLock)
+		{
+		case RMobilePhone::ELockICC:
+			lock.iStatus=iSecStatus.iPin1;
+			lock.iSetting=iSecSetting.iPin1;
+			break;
+		case RMobilePhone::ELockPin2:
+			lock.iStatus=iSecStatus.iPin2;
+			lock.iSetting=iSecSetting.iPin2;
+			break;
+		case RMobilePhone::ELockHiddenKey:
+			lock.iStatus=iSecStatus.iPhBkHiddenKey;
+			lock.iSetting=iSecSetting.iPhBkHiddenKey;
+			break;
+		case RMobilePhone::ELockUSimApp:
+			lock.iStatus=iSecStatus.iUSimAppPin;
+			lock.iSetting=iSecSetting.iUSimAppPin;
+			break;
+		case RMobilePhone::ELockSecondUSimApp:
+			lock.iStatus=iSecStatus.iSecondUSimAppPin;
+			lock.iSetting=iSecSetting.iSecondUSimAppPin;
+			break;
+		case RMobilePhone::ELockUniversalPin:
+			lock.iStatus=iSecStatus.iUniversalPin;
+			lock.iSetting=iSecSetting.iUniversalPin;
+			break;
+
+		case RMobilePhone::ELockNam:
+			iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+			return KErrNone;	
+				
+//		Not supported!
+//		case RMobilePhone::ELockPhoneDevice:
+//		case RMobilePhone::ELockPhoneToIcc:
+//		case RMobilePhone::ELockPhoneToFirstIcc:
+//		case RMobilePhone::ELockOTA:	
+		default:
+			iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+			return KErrNone;	
+		}
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::GetLockInfoCancel(const TTsyReqHandle aReqHandle)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NotifyLockInfoChange(const TTsyReqHandle aReqHandle, RMobilePhone::TMobilePhoneLock* aLock, TDes8* aLockInfo)
+	{
+	RMobilePhone::TMobilePhoneLockInfoV1Pckg* lockPckg = (RMobilePhone::TMobilePhoneLockInfoV1Pckg*) aLockInfo;
+	RMobilePhone::TMobilePhoneLockInfoV1& lock = (*lockPckg)();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(lock);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aReqHandle, err);
+		return KErrNone;
+		}
+
+	__ASSERT_ALWAYS(!iNotifyLock.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+	
+	if (iNotifySettingsTimer->iIndex <  iICCSettingProfile->Count())
+		{
+		TICCSettingEntry entry = iICCSettingProfile->At(iNotifySettingsTimer->iIndex);
+		if(iNotifySettingsTimer->iTimerStarted)
+			{
+			delete iNotifySettingsTimer->iTimer;
+			iNotifySettingsTimer->iTimer = NULL;
+			TRAPD(err,iNotifySettingsTimer->iTimer=CSimTimer::NewL(iPhone));
+			if (err!=KErrNone)
+				return (err);
+			}
+		iNotifySettingsTimer->iTimer->Start(entry.iDuration, this, ETimerIdSecurityNotifyLockInfo);
+		iNotifySettingsTimer->iTimerStarted = ETrue;
+		}
+	
+	iNotifyLock.iNotifyPending=ETrue;
+	iNotifyLock.iNotifyHandle=aReqHandle;
+	iNotifyLock.iNotifyData=&lock;
+	iNotifyLock.iNotifyDataXtra=aLock;
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NotifyLockInfoChangeCancel(const TTsyReqHandle aReqHandle)
+	{
+	if(iNotifyLock.iNotifyPending)
+		{
+		iNotifyLock.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(aReqHandle,KErrCancel);
+		return KErrNone;
+		}	
+	iPhone->ReqCompleted(aReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::SetLockSetting(const TTsyReqHandle aTsyReqHandle,
+									   RMobilePhone::TMobilePhoneLock* aLock,
+									   RMobilePhone::TMobilePhoneLockSetting* aSetting)
+	{
+	// create dummy RMobilePhone::TMobilePhoneLockInfoV1 for
+	// UpdateLockInfo and CompleteNotifyLockInfoChange
+	RMobilePhone::TMobilePhoneLockInfoV1 lockInfo;
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(lockInfo);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, err);
+		return KErrNone;
+		}
+
+	lockInfo.iSetting = *aSetting;
+
+	// set the iStatus of our local lock info to whatever the current
+	// lock info iStatus is set to. The reason is because the intent of
+	// SetLockSetting is to set the iSetting value of the lock while
+	// leaving the iStatus value untouched
+	switch(*aLock)
+		{
+		case RMobilePhone::ELockICC:
+			lockInfo.iStatus=iSecStatus.iPin1;
+			break;
+		case RMobilePhone::ELockPin2:
+			lockInfo.iStatus=iSecStatus.iPin2;
+			break;
+		case RMobilePhone::ELockHiddenKey:
+			lockInfo.iStatus=iSecStatus.iPhBkHiddenKey;
+			break;
+		case RMobilePhone::ELockUSimApp:
+			lockInfo.iStatus=iSecStatus.iUSimAppPin;
+			break;
+		case RMobilePhone::ELockSecondUSimApp:
+			lockInfo.iStatus=iSecStatus.iSecondUSimAppPin;
+			break;
+		case RMobilePhone::ELockUniversalPin:
+			lockInfo.iStatus=iSecStatus.iUniversalPin;
+			break;
+
+		case RMobilePhone::ELockNam:
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNotSupported);
+			return KErrNone;	
+				
+//		Not supported!
+//		case RMobilePhone::ELockPhoneDevice:
+//		case RMobilePhone::ELockPhoneToIcc:
+//		case RMobilePhone::ELockPhoneToFirstIcc:
+//		case RMobilePhone::ELockOTA:
+		default:
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNotSupported);
+			return KErrNone;
+		}
+
+	err = UpdateLockInfo(*aLock, lockInfo);
+	if(err)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle,err);
+		return KErrNone;	
+		}
+
+	CompleteNotifyLockInfoChange(*aLock, lockInfo);		
+
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::SetLockSettingCancel(const TTsyReqHandle aReqHandle)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::GetSecurityCodeInfo(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TMobilePhoneSecurityCode* aSecurityCode,TDes8* aSecurityCodeInfo)
+/**
+Handle GetSecurityCodeInfo request
+
+@param aTsyReqHandle		TSY handle associated with this request
+@param aSecurityCode		Security code to get info on
+@param aSecurityCodeInfo	The TMobilePhoneSecurityCodeInfoV5 that will be populated with the
+							security code information
+@return KErrNone
+*/
+	{
+	RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg* securityCodeInfoPckg = 
+		reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*> (aSecurityCodeInfo);
+	RMobilePhone::TMobilePhoneSecurityCodeInfoV5& securityCodeInfo = (*securityCodeInfoPckg)();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(securityCodeInfo);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, err);
+		return KErrNone;
+		}
+
+	switch(*aSecurityCode)
+		{
+		case RMobilePhone::ESecurityCodePin1:
+			securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPin1;
+			break;
+		case RMobilePhone::ESecurityCodePin2:
+			securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPin2;
+			break;
+		case RMobilePhone::ESecurityCodePuk1:
+			securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPuk1;
+			break;
+		case RMobilePhone::ESecurityCodePuk2:
+			securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPuk2;
+			break;
+		default:
+			iPhone->ReqCompleted(aTsyReqHandle,KErrNotFound);
+			return KErrNone;
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+	
+TInt CSimPhoneSecurity::GetSecurityCodeInfoCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+Retrieve a security code information
+
+@param aTsyReqHandle		TSY handle associated with this request
+@return KErrNone
+*/
+	{
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NotifySecurityCodeInfoChange(const TTsyReqHandle aTsyReqHandle, RMobilePhone::TMobilePhoneSecurityCode* aSecurityCode,TDes8* aSecurityCodeInfo)
+/**
+Record a client's interest in being notified when information of asecurity code changes.
+
+@param aTsyReqHandle		TSY handle associated with this request
+@param aSecurityCode		pointer that will be populated with the security code that changed
+@param aSecurityCodeInfo	The TMobilePhoneSecurityCodeInfoV5 that will be populated with the
+							security code information
+@return KErrNone
+*/
+	{
+	__ASSERT_ALWAYS(!iNotifySecurityCodeInfo.iNotifyPending,SimPanic(ENotificationAlreadyPending));
+
+	RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg* securityCodeInfoPckg = 
+		reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*> (aSecurityCodeInfo);
+	RMobilePhone::TMobilePhoneSecurityCodeInfoV5& securityCodeInfo = (*securityCodeInfoPckg)();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(securityCodeInfo);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, err);
+		return KErrNone;
+		}
+
+	iNotifySecurityCodeInfo.iNotifyPending=ETrue;
+	iNotifySecurityCodeInfo.iNotifyHandle=aTsyReqHandle;
+	iNotifySecurityCodeInfo.iNotifyData=&securityCodeInfo;
+	iNotifySecurityCodeInfo.iNotifyDataXtra=aSecurityCode;
+	return KErrNone;
+	}
+	
+TInt CSimPhoneSecurity::NotifySecurityCodeInfoChangeCancel(const TTsyReqHandle aReqHandle)
+/**
+Cancel a client's interest in being notified when the RMobileCall capabilities change.
+
+@param aTsyReqHandle		TSY handle associated with this request
+@return KErrNone
+*/
+	{
+	if(iNotifySecurityCodeInfo.iNotifyPending)
+		{
+		iNotifySecurityCodeInfo.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(aReqHandle,KErrCancel);
+		return KErrNone;
+		}	
+	iPhone->ReqCompleted(aReqHandle,KErrNone);
+	return KErrNone;
+	}
+	
+TInt CSimPhoneSecurity::ChangeSecurityCode(const TTsyReqHandle aReqHandle, RMobilePhone::TMobilePhoneSecurityCode* aType,const TDes8* aChange)
+	{
+	TPckg<RMobilePhone::TMobilePhonePasswordChangeV1>* passPckg= (TPckg<RMobilePhone::TMobilePhonePasswordChangeV1>*)aChange;
+	RMobilePhone::TMobilePhonePasswordChangeV1& pass = (*passPckg)();
+
+	// Check that the data structure is supported by the simulated TSY version
+	TInt err = iPhone->CheckSimTsyVersion(pass);
+	if(err != KErrNone)
+		{
+		iPhone->ReqCompleted(aReqHandle, err);
+		return KErrNone;
+		}
+
+	switch(*aType)
+		{
+		case RMobilePhone::ESecurityCodePin1:
+			if(iSecCodes.iPin1 == pass.iOldPassword)
+				{
+				iSecCodes.iPin1.Copy(pass.iNewPassword);
+				Pin1Success();
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Pin1Failure();
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecurityCodePin2:
+			if(iSecCodes.iPin2==pass.iOldPassword)
+				{
+				iSecCodes.iPin2.Copy(pass.iNewPassword);
+				Pin2Success();
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Pin2Failure();
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecurityCodePuk1:
+			if(iSecCodes.iPuk1==pass.iOldPassword)
+				{
+				iSecCodes.iPuk1.Copy(pass.iNewPassword);
+				Puk1Success();
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Puk1Failure();
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecurityCodePuk2:
+			if(iSecCodes.iPuk2==pass.iOldPassword)
+				{
+				iSecCodes.iPuk2.Copy(pass.iNewPassword);
+				Puk2Success();
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Puk2Failure();
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecurityHiddenKey:
+			if(iSecCodes.iPhBkHiddenKey==pass.iOldPassword)
+				iSecCodes.iPhBkHiddenKey.Copy(pass.iNewPassword);
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecurityUSIMAppPin:
+			if(iSecCodes.iUSimAppPin==pass.iOldPassword)
+				iSecCodes.iUSimAppPin.Copy(pass.iNewPassword);
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecuritySecondUSIMAppPin:
+			if(iSecCodes.iSecondUSimAppPin==pass.iOldPassword)
+				iSecCodes.iSecondUSimAppPin.Copy(pass.iNewPassword);
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+			break;
+		case RMobilePhone::ESecurityUniversalPin:
+			if(iSecCodes.iUniversalPin==pass.iOldPassword)
+				iSecCodes.iUniversalPin.Copy(pass.iNewPassword);
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+			break;
+	//  Not supported
+	//	case RMobilePhone::ESecurityCodePhonePassword:
+	//	case RMobilePhone::ESecurityCodeSPC:
+	
+		default:
+			iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+			return KErrNone;
+		}
+	iPhone->ReqCompleted(aReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::ChangeSecurityCodeCancel(const TTsyReqHandle aReqHandle)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+/*TInt CSimPhoneSecurity::UnlockNam(const TTsyReqHandle aReqHandle, const RMobilePhone::TMobilePassword* aSpc)
+	{
+	if(iSecStatus.iSPC==RMobilePhone::EStatusUnlocked)
+		{
+		iPhone->ReqCompleted(aReqHandle,KErrNotReady);
+		return KErrNone;
+		}	
+	else if(iSecCodes.iSPC==*aSpc)
+		{
+		iUnlockNamHandle = aReqHandle;
+		iUnlockNamTimer->Start(KNamTimeout,this,ETimerIdSecurityUnlockNam);
+		return KErrNone;
+		}
+	else
+		{
+		iPhone->ReqCompleted(aReqHandle,KErrAccessDenied);
+		return KErrNone;
+		}
+	}*/
+	
+void CSimPhoneSecurity::TimerCallBackUnlockNam()
+	{
+	SecurityEvent(RMobilePhone::ESPCVerified);
+	iPhone->ReqCompleted(iUnlockNamHandle,KErrNone);
+	}
+
+TInt CSimPhoneSecurity::UnlockNamCancel(const TTsyReqHandle aReqHandle)
+	{
+	iUnlockNamTimer->Cancel();
+	iPhone->ReqCompleted(aReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+void CSimPhoneSecurity::TimerCallBackLockNam()
+	{
+	LockSpc();
+	iPhone->ReqCompleted(iLockNamHandle,KErrNone);
+	}
+
+TInt CSimPhoneSecurity::LockNamCancel(const TTsyReqHandle aReqHandle)
+	{
+	iLockNamTimer->Cancel();
+	iPhone->ReqCompleted(aReqHandle,KErrCancel);
+	return KErrNone;
+	}
+
+
+TInt CSimPhoneSecurity::VerifySecurityCode(const TTsyReqHandle aReqHandle, RMobilePhone::TMobilePhoneSecurityCode* aType, const RMobilePhone::TCodeAndUnblockCode* aCode)
+	{
+	switch(*aType)
+		{
+		case RMobilePhone::ESecurityCodePin1:
+			if(iSecCodes.iPin1==(*aCode).iCode)
+				{
+				SecurityEvent(RMobilePhone::EPin1Verified);
+				Pin1Success();
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Pin1Failure();
+				return KErrNone;
+				}
+		case RMobilePhone::ESecurityCodePin2:
+			if(iSecCodes.iPin2==(*aCode).iCode)
+				{
+				SecurityEvent(RMobilePhone::EPin2Verified);
+				Pin2Success();
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Pin2Failure();
+				return KErrNone;
+				}
+		case RMobilePhone::ESecurityCodePuk1:
+			if(iSecCodes.iPuk1==(*aCode).iUnblockCode)
+				{
+				SecurityEvent(RMobilePhone::EPuk1Verified);
+				Puk1Success();
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Puk1Failure();
+				return KErrNone;
+				}
+		case RMobilePhone::ESecurityCodePuk2:
+			if(iSecCodes.iPuk2==(*aCode).iUnblockCode)
+				{
+				SecurityEvent(RMobilePhone::EPuk2Verified);
+				Puk2Success();
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				Puk2Failure();
+				return KErrNone;
+				}
+		case RMobilePhone::ESecurityHiddenKey:
+			if(iSecCodes.iPhBkHiddenKey==(*aCode).iCode)
+				{
+				SecurityEvent(RMobilePhone::EHiddenKeyVerified);
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+		case RMobilePhone::ESecurityUSIMAppPin:
+			if(iSecCodes.iUSimAppPin==(*aCode).iCode)
+				{
+				SecurityEvent(RMobilePhone::EUSIMAppPinVerified);
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrAccessDenied);
+				return KErrNone;
+				}
+		case RMobilePhone::ESecuritySecondUSIMAppPin:
+			if(iSecCodes.iSecondUSimAppPin==(*aCode).iCode)
+				{
+				SecurityEvent(RMobilePhone::ESecondUSIMAppPinVerified);
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+		case RMobilePhone::ESecurityUniversalPin:
+			if(iSecCodes.iUniversalPin==(*aCode).iCode)
+				{
+				SecurityEvent(RMobilePhone::EUniversalPinVerified);
+				break;
+				}
+			else
+				{
+				iPhone->ReqCompleted(aReqHandle,KErrArgument);
+				return KErrNone;
+				}
+	//  Not supported
+	//	case RMobilePhone::ESecurityCodePhonePassword:
+	//	case RMobilePhone::ESecurityCodeSPC:
+	
+		default:
+			iPhone->ReqCompleted(aReqHandle,KErrNotSupported);
+			return KErrNone;
+		}
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::VerifySecurityCodeCancel(const TTsyReqHandle aReqHandle)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::AbortSecurityCode(const TTsyReqHandle aReqHandle, RMobilePhone::TMobilePhoneSecurityCode* /*aType*/)
+	{
+		iPhone->ReqCompleted(aReqHandle,KErrNone);
+		return KErrNone;
+	}
+
+
+TInt CSimPhoneSecurity::NotifySecurityEvent(const TTsyReqHandle aTsyReqHandle, TDes8* aPckg1)
+/**
+ * Registers a Client Interest in security event 
+ *
+ */
+	{
+	__ASSERT_ALWAYS(!iNotifyEvent.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+	
+	TPckg<TUint32>* eventPckg=(TPckg<TUint32>*)aPckg1;
+	TUint32& event=(*eventPckg)();
+
+	TInt count = iICCStatusProfile->Count();
+	
+	if (iNotifySecurityEventsTimer->iIndex < count)
+		{
+		TICCStatusEntry entry = iICCStatusProfile->At(iNotifySecurityEventsTimer->iIndex);
+		if(iNotifySecurityEventsTimer->iTimerStarted)
+			{
+			delete iNotifySecurityEventsTimer->iTimer;
+			iNotifySecurityEventsTimer->iTimer=NULL;
+			TRAPD(err,iNotifySecurityEventsTimer->iTimer=CSimTimer::NewL(iPhone));
+			if (err!=KErrNone)
+				{
+				return (err);
+				}
+			}
+		iNotifySecurityEventsTimer->iTimer->Start(entry.iDuration, this, ETimerIdSecurityNotifyEvent);
+		iNotifySecurityEventsTimer->iTimerStarted = ETrue;
+		}
+
+	iNotifyEvent.iNotifyPending=ETrue;
+	iNotifyEvent.iNotifyHandle=aTsyReqHandle;
+	iNotifyEvent.iNotifyData=&event;
+	
+	return KErrNone;
+	}
+
+TInt CSimPhoneSecurity::NotifySecurityEventCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * De-registeres the client interest in security events
+ *
+ */
+	{
+	if(iNotifyEvent.iNotifyPending)
+		{
+		iNotifyEvent.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(aTsyReqHandle, KErrCancel);
+		return KErrNone;
+		}
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+
+void CSimPhoneSecurity::SecurityEvent(RMobilePhone::TMobilePhoneSecurityEvent aEvent)
+/** 
+ * Hanldes events related to the ICC state (locked/unlocked)
+ *
+ */
+	{
+	switch(aEvent)
+		{
+		case RMobilePhone::EPin1Required:
+			LockICC();		
+			break;
+		case  RMobilePhone::EPin1Verified:
+			UnLockICC();
+			break;
+		case RMobilePhone::EPin2Required:
+			LockPIN2();
+			break;
+		case RMobilePhone::EPin2Verified:
+			UnLockPIN2();
+			break;
+		case RMobilePhone::EHiddenKeyRequired:
+			HideEntries();
+			break;
+		case RMobilePhone::EHiddenKeyVerified:
+			ShowHidden();
+			break;
+		case RMobilePhone::ESPCVerified:
+			 return;
+				
+		case RMobilePhone::ESPCRequired:
+			return;
+		case RMobilePhone::ENoICCFound:
+		case RMobilePhone::EICCTerminated:
+		case RMobilePhone::EPhonePasswordRequired:
+		case RMobilePhone::EPhonePasswordVerified:
+		case RMobilePhone::ESecondUSIMAppPinRequired:
+		case RMobilePhone::ESecondUSIMAppPinVerified:
+		case RMobilePhone::EUniversalPinRequired:
+		case RMobilePhone::EUniversalPinVerified:
+			return;
+		
+		case RMobilePhone::EUSIMAppPinRequired:
+		case RMobilePhone::EUSIMAppPinVerified:			
+			break;
+
+		case RMobilePhone::ESPCChanged:
+			//  FALLTHRU
+		default:
+			LOGPHONE4("CSimPhoneSecurity::SecurityEvent %d OOR [%d,%d]",
+					aEvent, RMobilePhone::ENoICCFound, RMobilePhone::ESPCChanged);
+			return;
+		}
+	
+	if(iNotifyEvent.iNotifyPending)
+		{
+		iNotifyEvent.iNotifyPending=EFalse;
+		*(RMobilePhone::TMobilePhoneSecurityEvent*)iNotifyEvent.iNotifyData=aEvent;
+		iPhone->ReqCompleted(iNotifyEvent.iNotifyHandle, KErrNone);
+		}
+	}
+
+void CSimPhoneSecurity::TimerCallBack(TInt aId)
+/**
+ * The timer callback function.  This function will be called when the timer
+ * completes.  It indicates a change in ICC state.  So, the new
+ * ICC state settings must be loaded into the member variables representing
+ * the current settings   Finally, the next timer is started.
+ *
+ * @param aId	This parameter is unused.  It is only required for CSimXxx classes
+ *				that have more than one timer instance and need to identify which
+ *				timer has expired.
+ */
+	{
+	if(aId == ETimerIdSecurityNotifyEvent)
+		{
+		if((iNotifySecurityEventsTimer->iIndex < iICCStatusProfile->Count()) && iNotifyEvent.iNotifyPending)
+			{
+			TICCStatusEntry entry = iICCStatusProfile->At(iNotifySecurityEventsTimer->iIndex);
+			SecurityEvent(entry.iICCStatus);
+			iNotifySecurityEventsTimer->iIndex++;
+			}
+		}
+	else if(aId == ETimerIdSecurityNotifyLockInfo)
+		{
+		if((iNotifySettingsTimer->iIndex < iICCSettingProfile->Count()) &&	iNotifyLock.iNotifyPending)
+			{
+			TICCSettingEntry entry = iICCSettingProfile->At(iNotifySettingsTimer->iIndex);
+			UpdateLockInfo(entry.iLock, entry.iLockInfo);
+			iNotifySettingsTimer->iIndex++;
+			iNotifySettingsTimer->iTimerStarted = EFalse;
+			CompleteNotifyLockInfoChange(entry.iLock, entry.iLockInfo);			
+			}
+		}
+
+	}
+
+TBool CSimPhoneSecurity::IsICCLocked()
+	{
+	if((iSecStatus.iPin1==RMobilePhone::EStatusLocked) &&
+	   (iSecSetting.iPin1==RMobilePhone::ELockSetEnabled)) 
+			return ETrue;
+	
+	 return EFalse;
+	}
+	
+TBool CSimPhoneSecurity::IsPIN2Locked()
+	{
+	if((iSecStatus.iPin2==RMobilePhone::EStatusLocked) &&
+	   (iSecSetting.iPin2==RMobilePhone::ELockSetEnabled)) 
+			return ETrue;
+	
+	 return EFalse;
+	}	
+
+void CSimPhoneSecurity::LockICC()
+	{
+	iSecStatus.iPin1=RMobilePhone::EStatusLocked;
+	return;
+	}
+
+void CSimPhoneSecurity::UnLockICC()
+	{
+	iSecStatus.iPin1=RMobilePhone::EStatusUnlocked;
+	return;
+	}
+	
+void CSimPhoneSecurity::LockPIN2()
+	{
+	iSecStatus.iPin2=RMobilePhone::EStatusLocked;
+	return;
+	}
+
+void CSimPhoneSecurity::UnLockPIN2()
+	{
+	iSecStatus.iPin2=RMobilePhone::EStatusUnlocked;
+	return;
+	}
+
+TBool CSimPhoneSecurity::IsHiddenEnabled()
+	{
+	if((iSecStatus.iPhBkHiddenKey==RMobilePhone::EStatusLocked) &&
+	   (iSecSetting.iPhBkHiddenKey==RMobilePhone::ELockSetEnabled)) 
+		return ETrue;
+	
+	 return EFalse;
+	}
+
+void CSimPhoneSecurity::HideEntries()
+	{
+	iSecStatus.iPhBkHiddenKey=RMobilePhone::EStatusLocked;
+	return;
+	}
+
+void CSimPhoneSecurity::ShowHidden()
+	{
+	iSecStatus.iPhBkHiddenKey=RMobilePhone::EStatusUnlocked;
+	return;
+	}
+	
+void CSimPhoneSecurity::LockSpc()
+	{
+	if (iNotifyLock.iNotifyPending)
+		{
+		// there is a notification waiting
+		RMobilePhone::TMobilePhoneLockInfoV1 lockInfo;
+
+		lockInfo.iStatus = RMobilePhone::EStatusLocked;
+		lockInfo.iSetting = RMobilePhone::ELockSetEnabled;
+		CompleteNotifyLockInfoChange(RMobilePhone::ELockNam, lockInfo);
+		}
+	iSecStatus.iSPC=RMobilePhone::EStatusLocked;
+	return;
+	}
+
+void CSimPhoneSecurity::UnLockSpc()
+	{
+	if (iNotifyLock.iNotifyPending)
+		{
+		RMobilePhone::TMobilePhoneLockInfoV1 lockInfo;
+
+		lockInfo.iStatus = RMobilePhone::EStatusUnlocked;
+		lockInfo.iSetting = RMobilePhone::ELockSetEnabled;
+		// there is a notification waiting
+		CompleteNotifyLockInfoChange(RMobilePhone::ELockNam, lockInfo);
+		}
+	iSecStatus.iSPC=RMobilePhone::EStatusUnlocked;
+	return;
+	}
+
+CSimPhoneSecurity::CIccTimer::CIccTimer()
+	: iTimerStarted(EFalse)
+	, iIndex(0)
+	, iTimer(NULL)
+	{
+	}
+
+CSimPhoneSecurity::CIccTimer::~CIccTimer()
+	{
+	if(iTimer)
+		iTimer->Cancel();
+	delete iTimer; 
+	}
+	
+CSimPhoneSecurity::CIccTimer* CSimPhoneSecurity::CIccTimer::NewL()
+	{
+	CSimPhoneSecurity::CIccTimer* self = new(ELeave)CSimPhoneSecurity::CIccTimer;
+	return self;
+	}
+	
+TInt CSimPhoneSecurity::UpdateLockInfo(RMobilePhone::TMobilePhoneLock aLock, const RMobilePhone::TMobilePhoneLockInfoV1& aLockInfo)
+	{
+	TInt err = KErrNone;
+	switch(aLock)
+		{
+		case RMobilePhone::ELockICC:
+			iSecSetting.iPin1 = aLockInfo.iSetting;	
+			iSecStatus.iPin1 = aLockInfo.iStatus;	
+			break;
+		case RMobilePhone::ELockPin2:
+			iSecSetting.iPin2 = aLockInfo.iSetting;
+			iSecStatus.iPin2 = aLockInfo.iStatus;	
+			break;
+		case RMobilePhone::ELockHiddenKey:
+			iSecSetting.iPhBkHiddenKey = aLockInfo.iSetting;
+			iSecStatus.iPhBkHiddenKey = aLockInfo.iStatus;	
+			break;
+		case RMobilePhone::ELockUSimApp:
+			iSecSetting.iUSimAppPin = aLockInfo.iSetting;
+			iSecStatus.iUSimAppPin = aLockInfo.iStatus;	
+			break;
+		case RMobilePhone::ELockSecondUSimApp:
+			iSecSetting.iSecondUSimAppPin = aLockInfo.iSetting;
+			iSecStatus.iSecondUSimAppPin = aLockInfo.iStatus;	
+			break;
+		case RMobilePhone::ELockUniversalPin:
+			iSecSetting.iUniversalPin = aLockInfo.iSetting;
+			iSecStatus.iUniversalPin = aLockInfo.iStatus;	
+			break;
+
+		case RMobilePhone::ELockNam:
+			err = KErrNotSupported;	
+		
+			break;
+
+//		Not supported!
+//		case RMobilePhone::ELockPhoneDevice:
+//		case RMobilePhone::ELockPhoneToIcc:
+//		case RMobilePhone::ELockPhoneToFirstIcc:
+//		case RMobilePhone::ELockOTA:
+		
+		default:
+			err = KErrNotSupported;	
+		}
+	return err;
+	}
+
+void CSimPhoneSecurity::Pin1Failure()
+/**
+Handle wrong PIN1 entry. Decrement the entry counter, lock the corresponding lock after the maximum 
+of entry. Complete the Security Code Info Change Notification if the counter has changed
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPin1 > 0)
+		{
+		iSecurityCodeRemainigAttempts.iPin1--;
+		if (iSecurityCodeRemainigAttempts.iPin1 == 0)
+			{
+			iSecStatus.iPin1 = RMobilePhone::EStatusBlocked;
+			RMobilePhone::TMobilePhoneLockInfoV1 lockInfo;
+
+			lockInfo.iSetting = iSecSetting.iPin1;
+			lockInfo.iStatus = iSecStatus.iPin1;
+			CompleteNotifyLockInfoChange(RMobilePhone::ELockICC,lockInfo);
+			}
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPin1;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePin1,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Pin1Success()
+/**
+Handle correct PIN1 entry. if require, Reset the entry counter and complete the Security Code Info 
+Change Notification.
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPin1 <  iSecurityCodeDefaultRemainigAttempts.iPin1)
+		{
+		iSecurityCodeRemainigAttempts.iPin1 = iSecurityCodeDefaultRemainigAttempts.iPin1;
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPin1;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePin1,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Pin2Failure()
+/**
+Handle wrong PIN2 entry. Decrement the entry counter, lock the corresponding lock after the maximum 
+of entry. Complete the Security Code Info Change Notification if the counter has changed
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPin2 > 0)
+		{
+		iSecurityCodeRemainigAttempts.iPin2--;
+		if (iSecurityCodeRemainigAttempts.iPin2 == 0)
+			{
+			iSecStatus.iPin2 = RMobilePhone::EStatusBlocked;
+			RMobilePhone::TMobilePhoneLockInfoV1 lockInfo;
+
+			lockInfo.iSetting = iSecSetting.iPin2;
+			lockInfo.iStatus = iSecStatus.iPin2;
+			CompleteNotifyLockInfoChange(RMobilePhone::ELockPin2,lockInfo);
+			}
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPin2;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePin2,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Pin2Success()
+/**
+Handle correct PIN2 entry. if require, Reset the entry counter and complete the Security Code Info 
+Change Notification.
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPin2 <  iSecurityCodeDefaultRemainigAttempts.iPin2)
+		{
+		iSecurityCodeRemainigAttempts.iPin2 = iSecurityCodeDefaultRemainigAttempts.iPin2;
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPin2;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePin2,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Puk1Failure()
+/**
+Handle wrong PUK1 entry. Decrement the entry counter. Complete the Security Code Info Change Notification 
+if the counter has changed
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPuk1 > 0)
+		{
+		iSecurityCodeRemainigAttempts.iPuk1--;
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPuk1;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePuk1,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Puk1Success()
+/**
+Handle correct PUK1 entry. if require, Reset the entry counter and complete the Security Code Info 
+Change Notification.
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPuk1 <  iSecurityCodeDefaultRemainigAttempts.iPuk1)
+		{
+		iSecurityCodeRemainigAttempts.iPuk1 = iSecurityCodeDefaultRemainigAttempts.iPuk1;
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPuk1;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePuk1,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Puk2Failure()
+/**
+Handle wrong PUK2 entry. Decrement the entry counter. Complete the Security Code Info Change Notification 
+if the counter has changed
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPuk2 > 0)
+		{
+		iSecurityCodeRemainigAttempts.iPuk2--;
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPuk2;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePuk2,securityCodeInfo);
+		}
+	}
+
+void CSimPhoneSecurity::Puk2Success()
+/**
+Handle correct PUK2 entry. if require, Reset the entry counter and complete the Security Code Info 
+Change Notification.
+*/
+	{
+	if (iSecurityCodeRemainigAttempts.iPuk2 <  iSecurityCodeDefaultRemainigAttempts.iPuk2)
+		{
+		iSecurityCodeRemainigAttempts.iPuk2 = iSecurityCodeDefaultRemainigAttempts.iPuk2;
+		RMobilePhone::TMobilePhoneSecurityCodeInfoV5 securityCodeInfo;
+		// Simulated version checking is omitted in this case - function is called after a ReqCompleted
+
+		securityCodeInfo.iRemainingEntryAttempts = iSecurityCodeRemainigAttempts.iPuk2;
+		CompleteNotifySecurityCodeInfoChange(RMobilePhone::ESecurityCodePuk2,securityCodeInfo);
+		}
+	}
+	
+void CSimPhoneSecurity::CompleteNotifyLockInfoChange(RMobilePhone::TMobilePhoneLock aLock, const RMobilePhone::TMobilePhoneLockInfoV1& aLockInfo)
+	{
+	if (iNotifyLock.iNotifyPending)
+		{
+		*(RMobilePhone::TMobilePhoneLockInfoV1*)iNotifyLock.iNotifyData=aLockInfo;
+		*(RMobilePhone::TMobilePhoneLock*)iNotifyLock.iNotifyDataXtra=aLock;
+		iNotifyLock.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(iNotifyLock.iNotifyHandle,KErrNone);
+		}
+	}
+
+void CSimPhoneSecurity::CompleteNotifySecurityCodeInfoChange(RMobilePhone::TMobilePhoneSecurityCode aSecurityCode, const RMobilePhone::TMobilePhoneSecurityCodeInfoV5& aSecurityCodeInfo)
+/**
+Complete a Security code info notification if pending.
+
+@param aSecurityCode 		security code that must be notified
+@param aSecurityCodeInfo	security code information for the notification
+*/
+	{
+	if (iNotifySecurityCodeInfo.iNotifyPending)
+		{
+		*reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCodeInfoV5*>(iNotifySecurityCodeInfo.iNotifyData)=aSecurityCodeInfo;
+		*reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCode*>(iNotifySecurityCodeInfo.iNotifyDataXtra)=aSecurityCode;
+		iNotifySecurityCodeInfo.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(iNotifySecurityCodeInfo.iNotifyHandle,KErrNone);
+		}
+	}
+