diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/simtsy/src/CSimPhoneSecurity.cpp --- a/telephonyserverplugins/simtsy/src/CSimPhoneSecurity.cpp Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/simtsy/src/CSimPhoneSecurity.cpp Thu May 06 15:10:38 2010 +0100 @@ -1,1810 +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 -#include "CSimTsyMode.h" -#include - -// -// 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(KICCProfileGranularity); - iICCSettingProfile=new(ELeave) CArrayFixFlat(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;iItem(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;iItem(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 (dataPtr), - aPckg.Des2n()); - - case EMobilePhoneNotifySecurityCodeInfoChange: - return NotifySecurityCodeInfoChange(aReqHandle, - reinterpret_cast (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 (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 (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* passPckg= (TPckg*)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* eventPckg=(TPckg*)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(iNotifySecurityCodeInfo.iNotifyData)=aSecurityCodeInfo; - *reinterpret_cast(iNotifySecurityCodeInfo.iNotifyDataXtra)=aSecurityCode; - iNotifySecurityCodeInfo.iNotifyPending=EFalse; - iPhone->ReqCompleted(iNotifySecurityCodeInfo.iNotifyHandle,KErrNone); - } - } - +// 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 +#include "CSimTsyMode.h" +#include + +// +// 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(KICCProfileGranularity); + iICCSettingProfile=new(ELeave) CArrayFixFlat(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;iItem(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;iItem(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 (dataPtr), + aPckg.Des2n()); + + case EMobilePhoneNotifySecurityCodeInfoChange: + return NotifySecurityCodeInfoChange(aReqHandle, + reinterpret_cast (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 (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 (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* passPckg= (TPckg*)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* eventPckg=(TPckg*)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(iNotifySecurityCodeInfo.iNotifyData)=aSecurityCodeInfo; + *reinterpret_cast(iNotifySecurityCodeInfo.iNotifyDataXtra)=aSecurityCode; + iNotifySecurityCodeInfo.iNotifyPending=EFalse; + iPhone->ReqCompleted(iNotifySecurityCodeInfo.iNotifyHandle,KErrNone); + } + } +