--- a/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmsecuritytsy.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmsecuritytsy.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,1735 +1,1735 @@
-// Copyright (c) 2006-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:
-//
-
-
-
-//INCLUDES
-#include "cmmsecuritytsy.h"
-#include "cmmphonetsy.h"
-#include "cmmtsyreqhandlestore.h"
-#include <ctsy/pluginapi/cmmdatapackage.h>
-#include "cmmmessagemanagerbase.h"
-#include "cmmphoneextinterface.h"
-#include "CMmCommonStaticUtility.h"
-#include "CMmCustomSecurityTsy.h"
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmSecurityTsy* CMmSecurityTsy::NewL(
- CMmPhoneTsy* aPhoneTsy ) // Ptr to PhoneTsy
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::NewL");
- CMmSecurityTsy* const mmSecurityTsy = new ( ELeave ) CMmSecurityTsy();
- CleanupStack::PushL( mmSecurityTsy );
- mmSecurityTsy->iMmPhoneTsy = aPhoneTsy;
- mmSecurityTsy->ConstructL();
- CleanupStack::Pop( mmSecurityTsy );
-
- return mmSecurityTsy;
- }
-
-CMmSecurityTsy::CMmSecurityTsy()
- {
- }
-
-void CMmSecurityTsy::ConstructL()
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::ConstructL");
- // Is security codes (PIN and phone password) checked in boot
- iSecurityCheckedForBoot = EFalse;
-
- // information to know is PIN1 or PIN2 last requested
- iLastPinRequested = EPinUnknown;
-
- // Is TSY storing ntofication for "Lock if SIM changed" in boot
- iIsSecurityCodeRequestCachedInBoot = EFalse;
-
- // Is PIN1 disable supported, by default ETrue. Changed when SIM
- // Service Table is read and it does not support PIN1 disable.
- iPin1DisableSupported = ETrue;
-
- // Set lock setting to unknown
- iLockSetting = RMobilePhone::ELockSetUnknown;
-
- //Set iPhonePasswordVerify to EFalse
- iPhonePasswordVerify = EFalse;
-
- //Set change UPIN state to idle
- iActiveCodeToUpinState = EActiveCodeToUpinIdle;
- }
-
-CMmSecurityTsy::~CMmSecurityTsy()
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::~CMmSecurityTsy");
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::DoExtFunc
-// Security-specific functionality of CMmPhoneTsy::DoExtFuncL
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::DoExtFuncL(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3("TSY: CMmSecurityTsy::DoExtFuncL.\n \t\t\t IPC:%d\n \t\t\t Handle:%d", aIpc, aTsyReqHandle);
-
- TInt ret ( KErrNone );
-
- TAny* dataPtr = aPackage.Ptr1();
-
- switch ( aIpc )
- {
- // Get Security Capabilities
- case EMobilePhoneGetSecurityCaps:
- ret = GetSecurityCaps( aTsyReqHandle,
- REINTERPRET_CAST( TUint32*, dataPtr ) );
- break;
- // Notify Change of Security Capabilities
- case EMobilePhoneNotifySecurityCapsChange:
- ret = NotifySecurityCapsChange(
- REINTERPRET_CAST( TUint32*, dataPtr ) );
- break;
- case EMobilePhoneGetLockInfo:
- ret = GetLockInfoL( aPackage );
- break;
- // Notify Change of Lock Information
- case EMobilePhoneNotifyLockInfoChange:
- ret = NotifyLockInfoChange(
- REINTERPRET_CAST( RMobilePhone::TMobilePhoneLock*, dataPtr ),
- aPackage.Des2n() );
- break;
- // Set Lock Setting
- case EMobilePhoneSetLockSetting:
- ret = SetLockSettingL( aTsyReqHandle,
- aPackage );
- break;
- // Change Security Code
- case EMobilePhoneChangeSecurityCode:
- ret = ChangeSecurityCodeL( aTsyReqHandle, aPackage );
- break;
- // Notify Security Event
- case EMobilePhoneNotifySecurityEvent:
- ret = NotifySecurityEventL(
- REINTERPRET_CAST( RMobilePhone::TMobilePhoneSecurityEvent*,
- dataPtr ) );
- break;
- // Verify Security Code
- case EMobilePhoneVerifySecurityCode:
- ret = VerifySecurityCodeL( aTsyReqHandle, aPackage );
- break;
- // Abort Security Code
- case EMobilePhoneAbortSecurityCode:
- ret = AbortSecurityCodeL( aTsyReqHandle, aPackage );
- break;
- case EMobilePhoneGetSecurityCodeInfo:
- ret = GetSecurityCodeInfoL( aTsyReqHandle, REINTERPRET_CAST(
- RMobilePhone::TMobilePhoneSecurityCode*, dataPtr ),
- aPackage.Des2n() );
- break;
- case EMobilePhoneNotifySecurityCodeInfoChange:
- ret = NotifySecurityCodeInfoChange( REINTERPRET_CAST(
- RMobilePhone::TMobilePhoneSecurityCode*, dataPtr ),
- aPackage.Des2n() );
- break;
- default:
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CancelService
-// Cancels Security requests
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::CancelService(
- const TInt aIpc,
- const TTsyReqHandle aTsyReqHandle )
- {
- TInt ret ( KErrNotSupported );
-
- //When the clients close their sub-sessions (eg. by calling RLine::Close),
- //they may not have cancelled all their outstanding asynchronous requests
- //before closing. It is up to the ETel server to clean up in this
- //situation, so the server will find the list of outstanding requests
- //related to that sub-session object and pass these outstanding IPC
- //request numbers, one at a time, to the CancelService method in the TSY.
-
- switch ( aIpc )
- {
- case EMobilePhoneNotifySecurityCapsChange:
- ret = NotifySecurityCapsChangeCancel( aTsyReqHandle );
- break;
- case EMobilePhoneGetLockInfo:
- ret = GetLockInfoCancel ( aTsyReqHandle );
- break;
- case EMobilePhoneSetLockSetting:
- ret = SetLockSettingCancel( aTsyReqHandle );
- break;
- case EMobilePhoneNotifyLockInfoChange:
- ret = NotifyLockInfoChangeCancel( aTsyReqHandle );
- break;
- case EMobilePhoneNotifySecurityEvent:
- ret = NotifySecurityEventCancel( aTsyReqHandle );
- break;
- case EMobilePhoneGetSecurityCodeInfo:
- ret = GetSecurityCodeInfoCancel( aTsyReqHandle );
- break;
- case EMobilePhoneNotifySecurityCodeInfoChange:
- ret = NotifySecurityCodeInfoChangeCancel( aTsyReqHandle );
- break;
- //Default case
- default:
- ret = KErrNone;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::GetSecurityCaps
-// returns a snapshot of the combination of the
-// static and dynamic security capabilities of the phone.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::GetSecurityCaps(
- const TTsyReqHandle aTsyReqHandle,
- TUint32* aCaps )
- {
-
- TInt ret ( KErrAccessDenied );
- ret = iMmPhoneTsy->iMmPhoneExtInterface->GetSecurityCaps( aCaps );
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifySecurityCapsChange
-// This request allows a client to be notified when the phone's
-// security capabilities change
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifySecurityCapsChange(
- TUint32* aCaps )
- {
- iRetNotifySecurityCapsChange = aCaps;
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneNotifySecurityCapsChange;
-
- return KErrNone;
- }
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifySecurityCapsChangeCancel
-// This method cancels an outstanding asynchronous
-// NotifySecurityCapsChange request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifySecurityCapsChangeCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iRetNotifySecurityCapsChange = NULL;
-
- iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneNotifySecurityCapsChange );
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteNotifySecurityCapsChange
-// This method completes an outstanding asynchronous
-// NotifySecurityCapsChange request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::CompleteNotifySecurityCapsChange(
- TUint32 aCaps )
- {
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneNotifySecurityCapsChange );
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- *iRetNotifySecurityCapsChange = aCaps;
- iMmPhoneTsy->ReqCompleted( reqHandle, KErrNone );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::GetLockInfoL
-// This method retrieves the current status and setting of a lock.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::GetLockInfoL( const TDataPackage& aPackage )
- {
-TFLOGSTRING("LTSY: CMmSecurityTsy::GetLockInfoL - Client call");
-
- TInt ret ( KErrArgument );
-
- TDes8* data = reinterpret_cast<TDes8*> ( aPackage.Des2n() );
-
- if ( sizeof ( RMobilePhone::TMobilePhoneLockInfoV1 ) <=
- data->MaxLength() )
- {
- //save pointer to client side for completion
- iRetGetLockInfo = data;
-
- ret = iMmPhoneTsy->iMmPhoneExtInterface->GetLockInfoL( aPackage );
-
- if ( KErrNone == ret )
- {
- //save req handle type
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetLockInfo;
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifyLockInfoChange
-// This method allows a client to be notified when any part of
-// the lock information changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifyLockInfoChange(
- RMobilePhone::TMobilePhoneLock* aLock,
- TDes8* aLockInfo )
- {
-TFLOGSTRING2("LTSY: CMmSecurityTsy::NotifyLockInfoChange - Lock: %d", aLock);
-
- TInt ret( KErrNone );
-
- if ( sizeof ( RMobilePhone::TMobilePhoneLockInfoV1 ) <=
- aLockInfo->MaxLength() )
- {
- iRetNotifyLockInfoChange = aLockInfo;
- iRetNotifyPhoneLockChange = aLock;
-
- //save tsy req handle type
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneNotifyLockInfoChange;
- }
- else
- {
- ret = KErrArgument;
- }
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifyLockInfoChangeCancel
-// This method cancels an outstanding asynchronous
-// NotifyLockInfoChange request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifyLockInfoChangeCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("LTSY: CMmSecurityTsy::NotifyLockInfoChangeCancel");
-
- iRetNotifyLockInfoChange = NULL;
- iRetNotifyPhoneLockChange = NULL;
-
- iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneNotifyLockInfoChange );
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteNotifyLockInfoChange
-// This method completes an outstanding asynchronous
-// NotifyLockInfoChange request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteNotifyLockInfoChange(
- CMmDataPackage* aDataPackage, TInt aErrorCode )
- {
-
- //reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneNotifyLockInfoChange );
-
- if (KErrNone != aErrorCode)
- {
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- return;
- }
-
- RMobilePhone::TMobilePhoneLock* lock = NULL;
- RMobilePhone::TMobilePhoneLockInfoV1* lockInfo = NULL;
- aDataPackage->UnPackData( &lockInfo, &lock );
-
- //update the status of the lock in the extension
- iMmPhoneTsy->iMmPhoneExtInterface->UpdateLockInfo( lockInfo->iStatus,
- lockInfo->iSetting, *lock );
-
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- RMobilePhone::TMobilePhoneLockInfoV1Pckg lockInfoPckg( *lockInfo );
-
- *iRetNotifyLockInfoChange = lockInfoPckg;
- *iRetNotifyPhoneLockChange = *lock;
-
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::SetLockSettingL
-// This function prevents some other client to set lock setting
-// while previous process is still going on because of password query from
-// the client. If process in question is still going function then the request
-// complete with error code KErrServerBusy. Some lock settings requires
-// code verification. This method will call CompleteNotifySecurityEvent with
-// required even in each case.(other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::SetLockSettingL(
- const TTsyReqHandle aTsyReqHandle,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING("LTSY: CMmSecurityTsy::SetLockSettingL - Client call" );
-
- TInt ret( KErrNone );
-
- // Check if request handle already exists
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- {
- ret = LockSettingL( aTsyReqHandle, aPackage );
- // if error is other than KErrAccessDenied or KErrNone, complete now
- // KErrAccessDenied means we need verification first, not that an
- // error has occured and we ought to complete the request.
- // KErrNone means that EMobilePhoneSetLockSetting request has been
- // successfully sent to LTSY.
- if ( !( KErrNone == ret || KErrAccessDenied == ret ) )
- {
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
- }
- }
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::SetLockSettingCancel
-// Use this method to cancel a previously placed asynchronous
-// SetLockSetting request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::SetLockSettingCancel(
- TTsyReqHandle aTsyReqHandle )
- {
- iActiveCodeToUpinState = EActiveCodeToUpinIdle;
-
- //reset the req handle
- iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- //complete with cancel
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::LockSettingL
-// This method allows a client to change the current setting of
-// a lock. If password is required, function triggers completion of
-// security event notification and stores required variables for possible
-// retry. Other possible errors are reported to client as well
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::LockSettingL(
- const TTsyReqHandle,
- const TDataPackage& aPackage )
- {
- TInt ret ( KErrNotSupported );
-
- RMobilePhone::TMobilePhoneLock* lock =
- reinterpret_cast<RMobilePhone::TMobilePhoneLock* >
- ( aPackage.Ptr1() );
- RMobilePhone::TMobilePhoneLockSetting* setting =
- reinterpret_cast<RMobilePhone::TMobilePhoneLockSetting* >
- ( aPackage.Ptr2() );
-
-TFLOGSTRING3("LTSY: CMmSecurityTsy::LockSetting - Lock:%d, Setting:%d",
- *lock, *setting );
-
- // Some SIM cards might not support PIN1 disable. Thus
- // return error if client tries to disable it.
- // complete the request immediately with error.
- if ( ( RMobilePhone::ELockSetDisabled == *setting ) &&
- ( RMobilePhone::ELockICC == *lock ||
- RMobilePhone::ELockUniversalPin == *lock ) &&
- !iPin1DisableSupported )
- {
- // Operation is not allowed as SIM does not support changing
- // SIM from ON to OFF.
- ret = KErrGsm0707OperationNotAllowed;
- }
- else
- {
- //check if the request made is an state change attempt
- if ( RMobilePhone::ELockSetUnknown != *setting )
- {
- //check if the lock to be set requires previous verification
- RMobilePhone::TMobilePhoneSecurityEvent event (
- RMobilePhone::ENoICCFound );
- //be pesimistic
- ret = KErrAccessDenied;
-
- //Check the lock to be set
- switch ( *lock )
- {
- case RMobilePhone::ELockPhoneDevice:
- case RMobilePhone::ELockPhoneToICC:
- event = RMobilePhone::EPhonePasswordRequired;
- break;
- case RMobilePhone::ELockICC:
- event = RMobilePhone::EPin1Required;
- break;
- // In USIM cards disabling PIN2 is also allowed
- case RMobilePhone::ELockPin2:
- event = RMobilePhone::EPin2Required;
- break;
- case RMobilePhone::ELockUniversalPin:
- // This is here to prompt PIN query in case of replacing
- // PIN1 with UPIN
- event = RMobilePhone::EUniversalPinRequired;
- if ( RMobilePhone::ELockReplaced == *setting )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::LockSetting RMobilePhone::ELockReplaced");
- iActiveCodeToUpinState = EActiveCodeToUpinAskUpin;
- }
- break;
- // This setting is not supported
- case RMobilePhone::ELockPhoneToFirstICC:
- ret = KErrNotSupported;
- break;
-
- case RMobilePhone::ELockOTA:
- case RMobilePhone::ELockHiddenKey:
- case RMobilePhone::ELockUSimApp:
- case RMobilePhone::ELockSecondUSimApp:
- default:
- //other locks are not a problem
- ret = KErrNone;
- break;
- }
- //if the access is denied, notify the client about
- //the security event
- if ( KErrAccessDenied == ret )
- {
- CompleteNotifySecurityEventL( event, KErrNone );
- // Store these for the retry once the
- //VerifySecurityCode is issued by client
- iLockSettingPhoneLock = *lock;
- iLockSetting = *setting;
- //the setLockSetting is ongoing
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneSetLockSetting;
- }
- //Check if the lock can be set directly
- else if ( KErrNone == ret )
- {
- CMmDataPackage dataPackage;
- dataPackage.SetPacketData ( &aPackage );
- iMmPhoneTsy->iMmPhoneExtInterface->
- SetLockSettingL( &dataPackage );
- //the SetLockSetting is ongoing
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneSetLockSetting;
- }
- }
-
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteSetLockSetting
-// This method completes either an outstanding asynchronous
-// SimPinEnable or SetLockSetting request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteSetLockSetting(
- TInt aErrorCode, //Error code
- RMobilePhone::TMobilePhoneLockStatus,
- RMobilePhone::TMobilePhoneLockSetting )
- {
-TFLOGSTRING2("LTSY: CMmSecurityTsy::CompleteSetLockSetting - Error:%d", aErrorCode);
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- // Check if handle for set lock setting exists
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- iActiveCodeToUpinState = EActiveCodeToUpinIdle;
-
- //If the code verification has been requested complete it too.
- TTsyReqHandle verifyHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != verifyHandle )
- {
- // Change these so that they wont mess up anything.
- iLockSetting = RMobilePhone::ELockSetUnknown;
- // Complete verify
- iMmPhoneTsy->ReqCompleted( verifyHandle, aErrorCode );
- }
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::ChangeSecurityCodeL
-// This method allows a client to change a security code.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::ChangeSecurityCodeL(
- const TTsyReqHandle aTsyReqHandle,
- const TDataPackage& aPackage )
- {
-
- TInt ret = iMmPhoneTsy->iMmPhoneExtInterface->
- ChangeSecurityCodeL( aPackage );
-
- if ( KErrNone == ret )
- {
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneChangeSecurityCode;
- }
- else
- {
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteChangeSecurityCode
-// This method completes an outstanding asynchronous
-// ChangeSecurityCode request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::CompleteChangeSecurityCode(
- TInt aErrorCode ) // Error code
- {
- TFLOGSTRING2("TSY: CMmSecurityTsy::CompleteChangeSecurityCode - Error:%d", aErrorCode);
-
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneChangeSecurityCode );
-
- if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
- {
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifySecurityEventL
-// This method allows a client to be notified when the phone
-// has detected the occurrence of one of the security related events.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifySecurityEventL(
- RMobilePhone::TMobilePhoneSecurityEvent* aEvent )
- {
-
- iRetNotifySecurityEvent = aEvent;
-
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneNotifySecurityEvent;
-
- // If requested after boot, then we need to query security server
- // state for phone password. If it is enabled, we will not have
- // security indication as Security server boots up faster than
- // TSY and has already sent the indications when TSY is loaded.
- // Thus this is the only way to get the information in boot.
- if ( iSecurityCheckedForBoot == EFalse )
- {
-TFLOGSTRING( "TSY: CMmSecurityTsy::NotifySecurityEvent - Checking PIN state");
- // We can't do anything if sending fails. If this happens,
- // then every send to IsaApi should fail.
- (void)iMmPhoneTsy->iMmPhoneExtInterface->GetICCTypeL();
- }
-
- // If we have cached notification for security code in boot, then
- // complete it once to client.
- if ( iIsSecurityCodeRequestCachedInBoot &&
- !iMmPhoneTsy->iBootState.iSecReady )
- {
-TFLOGSTRING( "TSY: CMmSecurityTsy::NotifySecurityEventL - Completing security code event");
-
- CompleteNotifySecurityEventL( RMobilePhone::EPhonePasswordRequired,
- KErrNone );
- iIsSecurityCodeRequestCachedInBoot = EFalse;
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifySecurityEventCancel
-// This function cancels an outstanding asynchronous
-// NotifySecurityEvent request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifySecurityEventCancel(
- const TTsyReqHandle aTsyReqHandle )
- {
- iRetNotifySecurityEvent = NULL;
-
- iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneNotifySecurityEvent );
-
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteNotifySecurityEventL
-// This function completes an outstanding asynchronous
-// NotifySecurityEvent request. If handle for security event notification
-// does not exist, it also completes those functions that would otherwise
-// require the presence of the handle to complete themselves.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteNotifySecurityEventL(
- RMobilePhone::TMobilePhoneSecurityEvent aEvent,
- TInt aErrorCode )
- {
-TFLOGSTRING3("TSY: CMmSecurityTsy::CompleteNotifySecurityEvent - Event: %d, Error: %d",
- aEvent, aErrorCode );
-
- if ( iLastPinRequested != EPinUnknown &&
- ( RMobilePhone::EPin1Verified == aEvent ) ||
- ( RMobilePhone::EPin2Verified == aEvent ) )
- {
-TFLOGSTRING( "TSY: CMmSecurityTsy::CompleteNotifySecurityEvent - iLastPinRequested != EPinUnknown");
- iLastPinRequested = EPinUnknown;
- }
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneNotifySecurityEvent );
-
- //Check if handle exists
- if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
- {
- // When client is informed about security code state in boot,
- // then this flag needs to be ETrue. There will be no more checking
- // later on
- iSecurityCheckedForBoot = ETrue;
-
- // Set value if the result is KErrNone
- if ( KErrNone == aErrorCode )
- {
- *iRetNotifySecurityEvent = aEvent;
- }
- //reset pointer to client side
- iRetNotifySecurityEvent = NULL;
- // Complete the client request
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
- else
- {
- // Client has not yet requested this notification, so cache it
- // if event is for phone password and boot is not yet done.
- // It is possible that this indication is received before
- // client has booted up.
- if ( ( RMobilePhone::EPhonePasswordRequired == aEvent ) &&
- !iMmPhoneTsy->iBootState.iSecReady &&
- !iIsSecurityCodeRequestCachedInBoot )
-
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::CompleteNotifySecurityEvent - Caching event");
- iIsSecurityCodeRequestCachedInBoot = ETrue;
- }
-
- // Check if the event is a PIN2 requirement
- if ( aEvent == RMobilePhone::EPin2Required )
- {
- // These are the methods that must be completed, if there is no
- // handle that can be used for informing client about password
- // verification query.
- TInt errorCode = CMmCommonStaticUtility::EpocErrorCode(
- KErrAccessDenied, KErrGsm0707SimPin2Required );
-
- reqHandle = iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
- // Check if handle for setfdnsetting exists
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- iMmPhoneTsy->CompleteSetFdnSettingL( errorCode );
- }
- }
- // Check if the event is a PIN1 or security code requirement.
- if ( aEvent == RMobilePhone::EPin1Required ||
- aEvent == RMobilePhone::EPhonePasswordRequired )
- {
- TTsyReqHandle setLockSettingHandle =
- iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetLockSetting );
- // Check if handle for setlocksetting exists. If so, complete
- // lock setting, because client can not be informed about password
- // verification requirement without notify security event handle
- if ( setLockSettingHandle > 0 )
- {
- CompleteSetLockSetting( KErrAccessDenied,
- RMobilePhone::EStatusLockUnknown,
- RMobilePhone::ELockSetUnknown );
- }
- }
- }
- // Update security capabilities and check if notification completion for
- // capabilities is required
- iMmPhoneTsy->iMmPhoneExtInterface->UpdateSecurityCaps( aEvent );
- }
-
-#ifndef USING_CTSY_DISPATCHER
-
-/**
- * Checks that security codes are well formed.
- */
-TBool CMmSecurityTsy::AreCodesWellFormed(
- const RMobilePhone::TMobilePhoneSecurityCode& aCodeType,
- const RMobilePhone::TCodeAndUnblockCode& aCodes ) const
- {
-
- const TUint8 KPukCodeLength(8);
- const TUint8 KMaxPinCodeLength(8);
- const TUint8 KMinPinCodeLength(4);
-
- switch (aCodeType)
- {
- case RMobilePhone::ESecurityCodePuk1:
- case RMobilePhone::ESecurityCodePuk2:
- {
- //
- // Verify PUK code is well formed according to 3GPP TS 11.11
- // (8 numeric digits)
- //
- if (aCodes.iUnblockCode.Length() != KPukCodeLength)
- {
- return EFalse;
- }
- TChar c(0);
- for (TInt i=0; i<KPukCodeLength; ++i)
- {
- c = aCodes.iUnblockCode[i];
- if (c < '0' || c > '9' )
- return EFalse;
- }
- }
- //
- // and fall through to verify PIN is well formed too
- //
- case RMobilePhone::ESecurityCodePin1:
- case RMobilePhone::ESecurityCodePin2:
- {
- //
- // Verify PIN code conforms with 3GPP TS 11.11
- // (between 4 and 8 numeric digits)
- //
- TInt len = aCodes.iCode.Length();
- if ( (len < KMinPinCodeLength) || (len > KMaxPinCodeLength) )
- return EFalse;
- TChar c(0);
- for (TInt i=0; i < len; ++i)
- {
- c = aCodes.iCode[i];
- if (c < '0' || c > '9' )
- return EFalse;
- }
- }
- break;
-
- default:
- // For all other types of code, check should happen in the LTSY.
- // Returning ETrue will ensure request goes on to LTSY.
- break;
- }
-
- return ETrue;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::VerifySecurityCodeL
-// This method sends a security code requiring verification to
-// the phone. If code is required for lock setting, it sends it to the
-// extension and orders re-execution of SetLockSetting function.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::VerifySecurityCodeL(
- const TTsyReqHandle aTsyReqHandle,
- const TDataPackage& aPackage )
- {
-
- RMobilePhone::TMobilePhoneSecurityCode* type =
- reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCode*>
- ( aPackage.Ptr1() );
- RMobilePhone::TCodeAndUnblockCode* codes =
- reinterpret_cast<RMobilePhone::TCodeAndUnblockCode*>
- ( aPackage.Ptr2() );
-
- // Get request handle to check whether server is busy with previous
- // request
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
-
- if ( 0 < reqHandle )
- {
- //The request is already in processing because of previous request
- //Complete request with status value informing the client about
- //the situation.
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
- }
- else
- {
-
- TInt ret( KErrArgument );
-
- // Check that received codes are well formed
- if (!AreCodesWellFormed(*type,*codes))
- {
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrArgument );
- return KErrNone;
- }
-
- if ( RMobilePhone::ESecurityCodePin1 == *type )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PIN VERIFY REQUESTED");
- iLastPinRequested = EPin1Requested;
- }
- if ( RMobilePhone::ESecurityCodePin2 == *type )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PIN2 VERIFY REQUESTED");
- iLastPinRequested = EPin2Requested;
- }
- //This is to prevent unnecessary PIN1 request after PUK code
- //request. Corrected at the same time with error TKEN-5WFJ7Y
- if ( ( ( RMobilePhone::ESecurityCodePuk1 == *type ) ||
- ( RMobilePhone::ESecurityCodePuk2 == *type ) ) &&
- ( 0 < codes->iUnblockCode.Length() ) )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PUK VERIFY REQUESTED");
- iPukCodeVerify = ETrue;
- }
- //This is to prevent unnecessary PIN1 request after phone password
- //request (PYRA-5UBCLC)
- if ( RMobilePhone::ESecurityCodePhonePassword == *type )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PHONE PASSWORD VERIFY REQUESTED");
- iPhonePasswordVerify = ETrue;
- }
- iMmPhoneTsy->iMmPhoneExtInterface->DeliverCode( *codes );
-
- // CheckSecurityCode needs to set the lock as well, so pass the
- // code for lock setting
- if ( iMmPhoneTsy->iMmCustomTsy )
- {
- iMmPhoneTsy->iMmCustomTsy->DeliverCodeL( *codes );
- }
-
- //Check if the SetLockSetting is ongoing, in some cases
- //SetLockSetting requires a verification of PIN1 or security code
- //before continue with the lock setting
- reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown &&
- EActiveCodeToUpinAskUpin != iActiveCodeToUpinState )
- {
- CMmDataPackage dataPackage;
- //add into the package the stored lock and setting
- dataPackage.PackData( &iLockSettingPhoneLock, &iLockSetting );
- ret = iMmPhoneTsy->iMmPhoneExtInterface->
- SetLockSettingL( &dataPackage );
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneVerifySecurityCode;
-
- if ( KErrNone != ret )
- {
- CompleteSetLockSetting( ret,
- RMobilePhone::EStatusLockUnknown,
- RMobilePhone::ELockSetUnknown );
- }
- }
- //This is a regular verification or active code
- //change from PIN to UPIN
- else
- {
- ret = iMmPhoneTsy->iMmPhoneExtInterface->
- VerifySecurityCodeL( aPackage );
-
- if ( KErrNone == ret )
- {
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneVerifySecurityCode;
- }
- else
- {
- // Complete verify with error
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
-
- // If FDN request is on-going, complete is also with error
- reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
- if ( reqHandle !=
- CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
- {
- iMmPhoneTsy->CompleteSetFdnSettingL( ret );
- }
- reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown !=
- reqHandle && EActiveCodeToUpinAskUpin ==
- iActiveCodeToUpinState )
- {
- //Verifying UPIN failed
- CompleteSetLockSetting( ret,
- RMobilePhone::EStatusLockUnknown,
- RMobilePhone::ELockSetUnknown );
- }
- }
- }
-
- } // end check request handle
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteVerifySecurityCodeL
-// This method completes an outstanding asynchronous
-// VerifySecurityCode request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteVerifySecurityCodeL(
- TInt aErrorCode )
- {
-TFLOGSTRING2("TSY: CMmSecurityTsy::CompleteVerifySecurityCode - Error:%d", aErrorCode);
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- // Complete the request
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
-
- // This needs to be done for PIN code verification when user has
- // dual line SIM and user has changed the line. If PIN code
- // verification fails, we need to request PIN code again.
-
- // NOTE! This MUST NOT happen in bootup when PIN code is verified
- // and NOT when PIN code is changed to ON/OFF from settings.
-
- // DO NOT complete if SetLockSetting is called -> PIN ON/OFF change
- // from general settings.
-
- // Not completed if PUK code verify or Phonepassword verify
- TTsyReqHandle phoneSetLockSettingHandle =
- iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- // DO NOT complete if booting up
- if ( ( iMmPhoneTsy->iBootState.iSecReady ) &&
- ( iLastPinRequested != EPinUnknown ) &&
- ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown ==
- phoneSetLockSettingHandle ) &&
- ( KErrNone != aErrorCode ) &&
- ( !iPukCodeVerify ) &&
- ( !iPhonePasswordVerify ) )
- {
- // IF PIN1 REQUESTED LAST
- if ( iLastPinRequested == EPin1Requested )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::CompleteVerifySecurityCodeL - PIN VERIFICATION NEEDED");
- CompleteNotifySecurityEventL( RMobilePhone::EPin1Required,
- KErrNone );
- iLastPinRequested = EPinUnknown;
- }
- // IF PIN2 REQUESTED LAST
- if (iLastPinRequested == EPin2Requested)
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::CompleteVerifySecurityCodeL - PIN2");
- iLastPinRequested = EPinUnknown;
- }
- }
- else if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown !=
- phoneSetLockSettingHandle && EActiveCodeToUpinAskUpin ==
- iActiveCodeToUpinState )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::CompleteVerifySecurityCodeL - iActiveCodeToUpinState = EActiveCodeToUpinAskPin");
- if ( KErrNone == aErrorCode )
- {
- iActiveCodeToUpinState = EActiveCodeToUpinAskPin;
- CompleteNotifySecurityEventL(
- RMobilePhone::EPin1Required, KErrNone );
- }
- else
- {
- iActiveCodeToUpinState = EActiveCodeToUpinIdle;
- CompleteSetLockSetting( KErrAccessDenied,
- RMobilePhone::EStatusLockUnknown,
- RMobilePhone::ELockSetUnknown );
- }
- }
- //Set iPukCodeVerify to EFalse
- iPukCodeVerify = EFalse;
-
- //Set iPhonePasswordVerify to EFalse
- iPhonePasswordVerify = EFalse;
-
- // FDN HANDLING
- reqHandle = iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
-
- if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
- {
- if ( KErrNone == aErrorCode )
- {
- aErrorCode = iMmPhoneTsy->iMmPhoneExtInterface->
- SetFdnSetting( iMmPhoneTsy->iRetFdnSetting );
- }
- else
- {
- iMmPhoneTsy->CompleteSetFdnSettingL( aErrorCode );
- }
- }
-
- // Reset just used code, empty for next round.
- RMobilePhone::TCodeAndUnblockCode codes;
- _LIT( KNullCharacter, "\0" );
- codes.iCode.Copy( KNullCharacter );
- iMmPhoneTsy->iMmPhoneExtInterface->DeliverCode( codes );
- }
- }
-#endif //USING_CTSY_DISPATCHER
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::AbortSecurityCodeL
-// This function informs the phone that the user has cancelled
-// an outstanding "get security code" request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::AbortSecurityCodeL(
- const TTsyReqHandle aTsyReqHandle,
- const TDataPackage& aPackage )
- {
- TInt ret = KErrNone;
-
- // Check if security code verification was aborted for the lock setting
- TTsyReqHandle reqHandle =
- iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetLockSetting );
-
- // Check also that VerifySecurityCode has not yet been called
- TTsyReqHandle verifyHandle =
- iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
-
- // If so, complete set lock setting
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle &&
- CMmPhoneTsy::EMultimodePhoneReqHandleUnknown == verifyHandle )
- {
- // Complete with abort error code
- CompleteSetLockSetting( KErrAbort,
- RMobilePhone::EStatusLockUnknown,
- RMobilePhone::ELockSetUnknown );
-
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
- }
- // In other cases we need to inform Licencee TSY about the abort request
- //for further processing
- else
- {
- // Check if security code verification was aborted for the fdn setting
- reqHandle = iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
-
- if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
- {
- // Security UI excepts KErrAbort for abort security code
- iMmPhoneTsy->CompleteSetFdnSettingL( KErrAbort );
-
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
- }
- else
- {
-
- // allow for EMobilePhoneAbortSecurityCode immediate completion
-#ifdef REQHANDLE_TIMER
- iMmPhoneTsy->SetTypeOfResponse(
- CMmPhoneTsy::EMultimodePhoneAbortSecurityCode,
- aTsyReqHandle );
-#else
- iMmPhoneTsy->iTsyReqHandleStore->SetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneAbortSecurityCode,
- aTsyReqHandle );
-#endif
- ret = iMmPhoneTsy->iMmPhoneExtInterface->AbortSecurityCodeL(
- aPackage );
-
- // dos layer returned with error and didn't complete request
- if ( ret != KErrNone )
- {
- CompleteAbortSecurityCode(ret);
- }
- }
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteAbortSecurityCode
-// This function completes outstanding asynchronous
-// AbortSecurityCode request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteAbortSecurityCode(
- TInt aErrorCode )
- {
-TFLOGSTRING2("TSY: CMmSecurityTsy::CompleteAbortSecurityCode - Error:%d", aErrorCode);
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneAbortSecurityCode );
-
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::SetPin1DisableNotSupported
-// Sets iPin1DisableSupported to EFalse. PIN can't be disabled.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::SetPin1DisableNotSupported()
- {
- iPin1DisableSupported = EFalse;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteGetLockInfo
-// This method completes either an outstanding asynchronous
-// SimPinEnable, GetLockInfo or SetLockSetting request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteGetLockInfo(
- CMmDataPackage* aDataPackage,
- TInt aErrorCode )
- {
-TFLOGSTRING2("LTSY: CMmSecurityTsy::CompleteGetLockInfo - Error:%d", aErrorCode);
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneGetLockInfo );
-
- // check if handle is present
- if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
-
- if ( KErrNone == aErrorCode )
- {
- //unpack the data
- RMobilePhone::TMobilePhoneLockStatus* status = NULL;
- RMobilePhone::TMobilePhoneLockSetting* setting = NULL;
-
- aDataPackage->UnPackData( &status, &setting );
-
- RMobilePhone::TMobilePhoneLockInfoV1 apckg;
- apckg.iStatus = *status;
- apckg.iSetting = *setting;
-
- RMobilePhone::TMobilePhoneLockInfoV1Pckg lockInfoPckg( apckg );
-
- *iRetGetLockInfo = lockInfoPckg;
- }
-
- iRetGetLockInfo = NULL;
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::GetLockInfoCancel
-// This method cancels either an outstanding asynchronous
-// SimPinEnable, GetLockInfo or SetLockSetting request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::GetLockInfoCancel(
- TTsyReqHandle aTsyReqHandle )
- {
- //reset the pointer to the client side
- iRetGetLockInfo = NULL;
-
- //reset the req handle
- iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetLockInfo );
-
- //complete with cancel
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::GetSecurityCodeInfoL
-// This method retrieves the current number of remaining entry attemps of
-// security code.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::GetSecurityCodeInfoL(
- const TTsyReqHandle aTsyReqHandle,
- RMobilePhone::TMobilePhoneSecurityCode* aSecurityCode,
- TDes8* aSecurityCodeInfo )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::GetSecurityCodeInfoL");
-
- TInt ret( KErrNone );
-
- if ( sizeof ( RMobilePhone::TMobilePhoneSecurityCodeInfoV5 ) <=
- aSecurityCodeInfo->MaxLength() )
- {
- TBool reqAlreadyProcessing( EFalse );
- // Check if the request is already processing
- for( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
- {
- if( iGetSecurityCodeInfoRequests[ i ]->iSecurityCode
- == *aSecurityCode )
- {
- reqAlreadyProcessing = ETrue;
- break;
- }
- }
-
- // The request is already in processing because of previous request
- // Complete request with status value informing the client about
- if( reqAlreadyProcessing )
- {
- TGetSecurityCodeInfoRequest* req = new ( ELeave )
- TGetSecurityCodeInfoRequest();
- req->iReqHandle = aTsyReqHandle;
- req->iSecurityCode = *aSecurityCode;
- req->iSecurityCodeInfo = aSecurityCodeInfo;
- iGetSecurityCodeInfoRequests.AppendL( req );
- }
- else
- {
- CMmDataPackage dataPackage;
- dataPackage.PackData( aSecurityCode );
-
- ret = iMmPhoneTsy->MessageManager()->HandleRequestL(
- EMobilePhoneGetSecurityCodeInfo, &dataPackage );
-
- if ( KErrNone == ret )
- {
- //save tsy req handle type
- switch (*aSecurityCode)
- {
- case RMobilePhone::ESecurityCodePin1:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin1;
- break;
- case RMobilePhone::ESecurityCodePin2:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin2;
- break;
- case RMobilePhone::ESecurityCodePuk1:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk1;
- break;
- case RMobilePhone::ESecurityCodePuk2:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk2;
- break;
- case RMobilePhone::ESecurityCodePhonePassword:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonePassword;
- break;
- case RMobilePhone::ESecurityCodeSPC:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSPC;
- break;
- case RMobilePhone::ESecurityHiddenKey:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonebookHiddenKey;
- break;
- case RMobilePhone::ESecurityUSIMAppPin:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUSIMAppPin;
- break;
- case RMobilePhone::ESecuritySecondUSIMAppPin:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSecondUSIMAppPin;
- break;
- case RMobilePhone::ESecurityUniversalPin:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPin;
- break;
- case RMobilePhone::ESecurityUniversalPuk:
- iMmPhoneTsy->iReqHandleType =
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPuk;
- break;
- }
-
- // save request in queue for completion
- TGetSecurityCodeInfoRequest* req = new ( ELeave )
- TGetSecurityCodeInfoRequest();
- req->iReqHandle = aTsyReqHandle;
- req->iSecurityCode = *aSecurityCode;
- req->iSecurityCodeInfo = aSecurityCodeInfo;
- iGetSecurityCodeInfoRequests.AppendL( req );
- }
- }
- }
- else
- {
- ret = KErrArgument;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteGetSecurityCodeInfo
-// This method completes the GetSecurityCodeInfo request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteGetSecurityCodeInfo(
- CMmDataPackage* aDataPackage,
- TInt aErrorCode )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::CompleteGetSecurityCodeInfo");
-
- RMobilePhone::TMobilePhoneSecurityCode* securityCode;
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5* securityCodeInfoV5;
- aDataPackage->UnPackData( &securityCode, &securityCodeInfoV5 );
-
- ResetGetSecurityCodeInfoTsyReqHandle(*securityCode);
-
- for ( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
- {
- if( iGetSecurityCodeInfoRequests[ i ]->iSecurityCode
- == *securityCode )
- {
- if (aErrorCode == KErrNone)
- {
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*
- securityCodeInfoV5Pckg = REINTERPRET_CAST(
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*,
- iGetSecurityCodeInfoRequests[ i ]->iSecurityCodeInfo );
-
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5& securityCodeInfo =
- ( *securityCodeInfoV5Pckg )();
-
- securityCodeInfo.iRemainingEntryAttempts
- = securityCodeInfoV5->iRemainingEntryAttempts;
- }
- iMmPhoneTsy->ReqCompleted(
- iGetSecurityCodeInfoRequests[ i ]->iReqHandle, aErrorCode );
-
- delete iGetSecurityCodeInfoRequests[ i ];
- iGetSecurityCodeInfoRequests.Remove( i );
- }
- }
-
- iGetSecurityCodeInfoRequests.Compress();
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::GetSecurityCodeInfoCancel
-// This method cancels the GetSecurityCodeInfo request
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::GetSecurityCodeInfoCancel(
- TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::GetSecurityCodeInfoCancel");
-
- RMobilePhone::TMobilePhoneSecurityCode secCode = RMobilePhone::ESecurityCodePin1;
- TBool reqHandleExist = EFalse;
-
- for ( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
- {
- TGetSecurityCodeInfoRequest* req = iGetSecurityCodeInfoRequests[ i ];
-
- if( aTsyReqHandle == req->iReqHandle )
- {
- secCode = req->iSecurityCode;
- iMmPhoneTsy->ReqCompleted( req->iReqHandle, KErrCancel );
- delete iGetSecurityCodeInfoRequests[ i ];
- iGetSecurityCodeInfoRequests.Remove( i );
- reqHandleExist = ETrue;
- break;
- }
- }
-
- if (reqHandleExist)
- {
- iGetSecurityCodeInfoRequests.Compress();
-
- TBool secCodeExist = EFalse;
-
- for ( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
- {
- TGetSecurityCodeInfoRequest* req = iGetSecurityCodeInfoRequests[ i ];
-
- if (iGetSecurityCodeInfoRequests[i]->iSecurityCode == secCode)
- {
- secCodeExist = ETrue;
- break;
- }
- }
-
- if (!secCodeExist)
- {
- ResetGetSecurityCodeInfoTsyReqHandle(secCode);
- }
- }
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::ResetGetSecurityCodeInfoTsyReqHandle
-// This method resets the (GetSecurityCodeInfo) request handle.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::ResetGetSecurityCodeInfoTsyReqHandle(
- const RMobilePhone::TMobilePhoneSecurityCode aSecurityCode )
- {
- switch (aSecurityCode)
- {
- case RMobilePhone::ESecurityCodePin1:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin1);
- break;
- case RMobilePhone::ESecurityCodePin2:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin2 );
- break;
- case RMobilePhone::ESecurityCodePuk1:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk1 );
- break;
- case RMobilePhone::ESecurityCodePuk2:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk2 );
- break;
- case RMobilePhone::ESecurityCodePhonePassword:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonePassword );
- break;
- case RMobilePhone::ESecurityCodeSPC:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSPC );
- break;
- case RMobilePhone::ESecurityHiddenKey:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonebookHiddenKey );
- break;
- case RMobilePhone::ESecurityUSIMAppPin:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUSIMAppPin );
- break;
- case RMobilePhone::ESecuritySecondUSIMAppPin:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSecondUSIMAppPin );
- break;
- case RMobilePhone::ESecurityUniversalPin:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPin );
- break;
- case RMobilePhone::ESecurityUniversalPuk:
- iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPuk );
- break;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifySecurityCodeInfoChange
-// This method allows a client to be notified when the security code
-// information changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifySecurityCodeInfoChange(
- RMobilePhone::TMobilePhoneSecurityCode* aSecurityCode,
- TDes8* aSecurityCodeInfo )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::NotifySecurityCodeInfoChange");
-
- TInt ret( KErrNone );
-
- if ( sizeof ( RMobilePhone::TMobilePhoneSecurityCodeInfoV5 ) <=
- aSecurityCodeInfo->MaxLength() )
- {
- iRetNotifySecurityCode = aSecurityCode;
- iRetNotifySecurityCodeInfo = aSecurityCodeInfo;
-
- iMmPhoneTsy->iReqHandleType
- = CMmPhoneTsy::EMultimodePhoneNotifySecurityCodeInfoChange;
- }
- else
- {
- ret = KErrArgument;
- }
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::CompleteNotifySecurityCodeInfoChange
-// This method completes the NotifySecurityCodeInfoChange notification.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmSecurityTsy::CompleteNotifySecurityCodeInfoChange(
- CMmDataPackage* aDataPackage,
- TInt aErrorCode )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::CompleteNotifySecurityCodeInfoChange");
-
- TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
- ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneNotifySecurityCodeInfoChange );
-
- if( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
- {
- if ( KErrNone == aErrorCode )
- {
- RMobilePhone::TMobilePhoneSecurityCode* securityCode;
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5* securityCodeInfoV5;
- aDataPackage->UnPackData( &securityCode, &securityCodeInfoV5 );
-
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*
- securityCodeInfoV5Pckg = REINTERPRET_CAST(
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*,
- iRetNotifySecurityCodeInfo );
-
- RMobilePhone::TMobilePhoneSecurityCodeInfoV5& securityCodeInfo
- = ( *securityCodeInfoV5Pckg )();
-
- securityCodeInfo.iRemainingEntryAttempts
- = securityCodeInfoV5->iRemainingEntryAttempts;
- *iRetNotifySecurityCode = *securityCode;
- }
-
- // clean the pointers to client side
- iRetNotifySecurityCodeInfo = NULL;
- iRetNotifySecurityCode = NULL;
-
- iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmSecurityTsy::NotifySecurityCodeInfoChangeCancel
-// This method cancels the NotifySecurityCodeInfoChange notification.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmSecurityTsy::NotifySecurityCodeInfoChangeCancel(
- TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING("TSY: CMmSecurityTsy::NotifySecurityCodeInfoChangeCancel");
-
- iRetNotifySecurityCodeInfo = NULL;
- iRetNotifySecurityCode = NULL;
-
- iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
- CMmPhoneTsy::EMultimodePhoneNotifySecurityCodeInfoChange );
-
- iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
-
- return KErrNone;
- }
-
-
-// End of File
+// Copyright (c) 2006-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:
+//
+
+
+
+//INCLUDES
+#include "cmmsecuritytsy.h"
+#include "cmmphonetsy.h"
+#include "cmmtsyreqhandlestore.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+#include "cmmmessagemanagerbase.h"
+#include "cmmphoneextinterface.h"
+#include "CMmCommonStaticUtility.h"
+#include "CMmCustomSecurityTsy.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmSecurityTsy* CMmSecurityTsy::NewL(
+ CMmPhoneTsy* aPhoneTsy ) // Ptr to PhoneTsy
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::NewL");
+ CMmSecurityTsy* const mmSecurityTsy = new ( ELeave ) CMmSecurityTsy();
+ CleanupStack::PushL( mmSecurityTsy );
+ mmSecurityTsy->iMmPhoneTsy = aPhoneTsy;
+ mmSecurityTsy->ConstructL();
+ CleanupStack::Pop( mmSecurityTsy );
+
+ return mmSecurityTsy;
+ }
+
+CMmSecurityTsy::CMmSecurityTsy()
+ {
+ }
+
+void CMmSecurityTsy::ConstructL()
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::ConstructL");
+ // Is security codes (PIN and phone password) checked in boot
+ iSecurityCheckedForBoot = EFalse;
+
+ // information to know is PIN1 or PIN2 last requested
+ iLastPinRequested = EPinUnknown;
+
+ // Is TSY storing ntofication for "Lock if SIM changed" in boot
+ iIsSecurityCodeRequestCachedInBoot = EFalse;
+
+ // Is PIN1 disable supported, by default ETrue. Changed when SIM
+ // Service Table is read and it does not support PIN1 disable.
+ iPin1DisableSupported = ETrue;
+
+ // Set lock setting to unknown
+ iLockSetting = RMobilePhone::ELockSetUnknown;
+
+ //Set iPhonePasswordVerify to EFalse
+ iPhonePasswordVerify = EFalse;
+
+ //Set change UPIN state to idle
+ iActiveCodeToUpinState = EActiveCodeToUpinIdle;
+ }
+
+CMmSecurityTsy::~CMmSecurityTsy()
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::~CMmSecurityTsy");
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::DoExtFunc
+// Security-specific functionality of CMmPhoneTsy::DoExtFuncL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3("TSY: CMmSecurityTsy::DoExtFuncL.\n \t\t\t IPC:%d\n \t\t\t Handle:%d", aIpc, aTsyReqHandle);
+
+ TInt ret ( KErrNone );
+
+ TAny* dataPtr = aPackage.Ptr1();
+
+ switch ( aIpc )
+ {
+ // Get Security Capabilities
+ case EMobilePhoneGetSecurityCaps:
+ ret = GetSecurityCaps( aTsyReqHandle,
+ REINTERPRET_CAST( TUint32*, dataPtr ) );
+ break;
+ // Notify Change of Security Capabilities
+ case EMobilePhoneNotifySecurityCapsChange:
+ ret = NotifySecurityCapsChange(
+ REINTERPRET_CAST( TUint32*, dataPtr ) );
+ break;
+ case EMobilePhoneGetLockInfo:
+ ret = GetLockInfoL( aPackage );
+ break;
+ // Notify Change of Lock Information
+ case EMobilePhoneNotifyLockInfoChange:
+ ret = NotifyLockInfoChange(
+ REINTERPRET_CAST( RMobilePhone::TMobilePhoneLock*, dataPtr ),
+ aPackage.Des2n() );
+ break;
+ // Set Lock Setting
+ case EMobilePhoneSetLockSetting:
+ ret = SetLockSettingL( aTsyReqHandle,
+ aPackage );
+ break;
+ // Change Security Code
+ case EMobilePhoneChangeSecurityCode:
+ ret = ChangeSecurityCodeL( aTsyReqHandle, aPackage );
+ break;
+ // Notify Security Event
+ case EMobilePhoneNotifySecurityEvent:
+ ret = NotifySecurityEventL(
+ REINTERPRET_CAST( RMobilePhone::TMobilePhoneSecurityEvent*,
+ dataPtr ) );
+ break;
+ // Verify Security Code
+ case EMobilePhoneVerifySecurityCode:
+ ret = VerifySecurityCodeL( aTsyReqHandle, aPackage );
+ break;
+ // Abort Security Code
+ case EMobilePhoneAbortSecurityCode:
+ ret = AbortSecurityCodeL( aTsyReqHandle, aPackage );
+ break;
+ case EMobilePhoneGetSecurityCodeInfo:
+ ret = GetSecurityCodeInfoL( aTsyReqHandle, REINTERPRET_CAST(
+ RMobilePhone::TMobilePhoneSecurityCode*, dataPtr ),
+ aPackage.Des2n() );
+ break;
+ case EMobilePhoneNotifySecurityCodeInfoChange:
+ ret = NotifySecurityCodeInfoChange( REINTERPRET_CAST(
+ RMobilePhone::TMobilePhoneSecurityCode*, dataPtr ),
+ aPackage.Des2n() );
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CancelService
+// Cancels Security requests
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt ret ( KErrNotSupported );
+
+ //When the clients close their sub-sessions (eg. by calling RLine::Close),
+ //they may not have cancelled all their outstanding asynchronous requests
+ //before closing. It is up to the ETel server to clean up in this
+ //situation, so the server will find the list of outstanding requests
+ //related to that sub-session object and pass these outstanding IPC
+ //request numbers, one at a time, to the CancelService method in the TSY.
+
+ switch ( aIpc )
+ {
+ case EMobilePhoneNotifySecurityCapsChange:
+ ret = NotifySecurityCapsChangeCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneGetLockInfo:
+ ret = GetLockInfoCancel ( aTsyReqHandle );
+ break;
+ case EMobilePhoneSetLockSetting:
+ ret = SetLockSettingCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneNotifyLockInfoChange:
+ ret = NotifyLockInfoChangeCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneNotifySecurityEvent:
+ ret = NotifySecurityEventCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneGetSecurityCodeInfo:
+ ret = GetSecurityCodeInfoCancel( aTsyReqHandle );
+ break;
+ case EMobilePhoneNotifySecurityCodeInfoChange:
+ ret = NotifySecurityCodeInfoChangeCancel( aTsyReqHandle );
+ break;
+ //Default case
+ default:
+ ret = KErrNone;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::GetSecurityCaps
+// returns a snapshot of the combination of the
+// static and dynamic security capabilities of the phone.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::GetSecurityCaps(
+ const TTsyReqHandle aTsyReqHandle,
+ TUint32* aCaps )
+ {
+
+ TInt ret ( KErrAccessDenied );
+ ret = iMmPhoneTsy->iMmPhoneExtInterface->GetSecurityCaps( aCaps );
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifySecurityCapsChange
+// This request allows a client to be notified when the phone's
+// security capabilities change
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifySecurityCapsChange(
+ TUint32* aCaps )
+ {
+ iRetNotifySecurityCapsChange = aCaps;
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityCapsChange;
+
+ return KErrNone;
+ }
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifySecurityCapsChangeCancel
+// This method cancels an outstanding asynchronous
+// NotifySecurityCapsChange request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifySecurityCapsChangeCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iRetNotifySecurityCapsChange = NULL;
+
+ iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityCapsChange );
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteNotifySecurityCapsChange
+// This method completes an outstanding asynchronous
+// NotifySecurityCapsChange request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::CompleteNotifySecurityCapsChange(
+ TUint32 aCaps )
+ {
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityCapsChange );
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ *iRetNotifySecurityCapsChange = aCaps;
+ iMmPhoneTsy->ReqCompleted( reqHandle, KErrNone );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::GetLockInfoL
+// This method retrieves the current status and setting of a lock.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::GetLockInfoL( const TDataPackage& aPackage )
+ {
+TFLOGSTRING("LTSY: CMmSecurityTsy::GetLockInfoL - Client call");
+
+ TInt ret ( KErrArgument );
+
+ TDes8* data = reinterpret_cast<TDes8*> ( aPackage.Des2n() );
+
+ if ( sizeof ( RMobilePhone::TMobilePhoneLockInfoV1 ) <=
+ data->MaxLength() )
+ {
+ //save pointer to client side for completion
+ iRetGetLockInfo = data;
+
+ ret = iMmPhoneTsy->iMmPhoneExtInterface->GetLockInfoL( aPackage );
+
+ if ( KErrNone == ret )
+ {
+ //save req handle type
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetLockInfo;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifyLockInfoChange
+// This method allows a client to be notified when any part of
+// the lock information changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifyLockInfoChange(
+ RMobilePhone::TMobilePhoneLock* aLock,
+ TDes8* aLockInfo )
+ {
+TFLOGSTRING2("LTSY: CMmSecurityTsy::NotifyLockInfoChange - Lock: %d", aLock);
+
+ TInt ret( KErrNone );
+
+ if ( sizeof ( RMobilePhone::TMobilePhoneLockInfoV1 ) <=
+ aLockInfo->MaxLength() )
+ {
+ iRetNotifyLockInfoChange = aLockInfo;
+ iRetNotifyPhoneLockChange = aLock;
+
+ //save tsy req handle type
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneNotifyLockInfoChange;
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifyLockInfoChangeCancel
+// This method cancels an outstanding asynchronous
+// NotifyLockInfoChange request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifyLockInfoChangeCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("LTSY: CMmSecurityTsy::NotifyLockInfoChangeCancel");
+
+ iRetNotifyLockInfoChange = NULL;
+ iRetNotifyPhoneLockChange = NULL;
+
+ iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneNotifyLockInfoChange );
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteNotifyLockInfoChange
+// This method completes an outstanding asynchronous
+// NotifyLockInfoChange request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteNotifyLockInfoChange(
+ CMmDataPackage* aDataPackage, TInt aErrorCode )
+ {
+
+ //reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneNotifyLockInfoChange );
+
+ if (KErrNone != aErrorCode)
+ {
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ return;
+ }
+
+ RMobilePhone::TMobilePhoneLock* lock = NULL;
+ RMobilePhone::TMobilePhoneLockInfoV1* lockInfo = NULL;
+ aDataPackage->UnPackData( &lockInfo, &lock );
+
+ //update the status of the lock in the extension
+ iMmPhoneTsy->iMmPhoneExtInterface->UpdateLockInfo( lockInfo->iStatus,
+ lockInfo->iSetting, *lock );
+
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ RMobilePhone::TMobilePhoneLockInfoV1Pckg lockInfoPckg( *lockInfo );
+
+ *iRetNotifyLockInfoChange = lockInfoPckg;
+ *iRetNotifyPhoneLockChange = *lock;
+
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::SetLockSettingL
+// This function prevents some other client to set lock setting
+// while previous process is still going on because of password query from
+// the client. If process in question is still going function then the request
+// complete with error code KErrServerBusy. Some lock settings requires
+// code verification. This method will call CompleteNotifySecurityEvent with
+// required even in each case.(other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::SetLockSettingL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING("LTSY: CMmSecurityTsy::SetLockSettingL - Client call" );
+
+ TInt ret( KErrNone );
+
+ // Check if request handle already exists
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ ret = LockSettingL( aTsyReqHandle, aPackage );
+ // if error is other than KErrAccessDenied or KErrNone, complete now
+ // KErrAccessDenied means we need verification first, not that an
+ // error has occured and we ought to complete the request.
+ // KErrNone means that EMobilePhoneSetLockSetting request has been
+ // successfully sent to LTSY.
+ if ( !( KErrNone == ret || KErrAccessDenied == ret ) )
+ {
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::SetLockSettingCancel
+// Use this method to cancel a previously placed asynchronous
+// SetLockSetting request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::SetLockSettingCancel(
+ TTsyReqHandle aTsyReqHandle )
+ {
+ iActiveCodeToUpinState = EActiveCodeToUpinIdle;
+
+ //reset the req handle
+ iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ //complete with cancel
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::LockSettingL
+// This method allows a client to change the current setting of
+// a lock. If password is required, function triggers completion of
+// security event notification and stores required variables for possible
+// retry. Other possible errors are reported to client as well
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::LockSettingL(
+ const TTsyReqHandle,
+ const TDataPackage& aPackage )
+ {
+ TInt ret ( KErrNotSupported );
+
+ RMobilePhone::TMobilePhoneLock* lock =
+ reinterpret_cast<RMobilePhone::TMobilePhoneLock* >
+ ( aPackage.Ptr1() );
+ RMobilePhone::TMobilePhoneLockSetting* setting =
+ reinterpret_cast<RMobilePhone::TMobilePhoneLockSetting* >
+ ( aPackage.Ptr2() );
+
+TFLOGSTRING3("LTSY: CMmSecurityTsy::LockSetting - Lock:%d, Setting:%d",
+ *lock, *setting );
+
+ // Some SIM cards might not support PIN1 disable. Thus
+ // return error if client tries to disable it.
+ // complete the request immediately with error.
+ if ( ( RMobilePhone::ELockSetDisabled == *setting ) &&
+ ( RMobilePhone::ELockICC == *lock ||
+ RMobilePhone::ELockUniversalPin == *lock ) &&
+ !iPin1DisableSupported )
+ {
+ // Operation is not allowed as SIM does not support changing
+ // SIM from ON to OFF.
+ ret = KErrGsm0707OperationNotAllowed;
+ }
+ else
+ {
+ //check if the request made is an state change attempt
+ if ( RMobilePhone::ELockSetUnknown != *setting )
+ {
+ //check if the lock to be set requires previous verification
+ RMobilePhone::TMobilePhoneSecurityEvent event (
+ RMobilePhone::ENoICCFound );
+ //be pesimistic
+ ret = KErrAccessDenied;
+
+ //Check the lock to be set
+ switch ( *lock )
+ {
+ case RMobilePhone::ELockPhoneDevice:
+ case RMobilePhone::ELockPhoneToICC:
+ event = RMobilePhone::EPhonePasswordRequired;
+ break;
+ case RMobilePhone::ELockICC:
+ event = RMobilePhone::EPin1Required;
+ break;
+ // In USIM cards disabling PIN2 is also allowed
+ case RMobilePhone::ELockPin2:
+ event = RMobilePhone::EPin2Required;
+ break;
+ case RMobilePhone::ELockUniversalPin:
+ // This is here to prompt PIN query in case of replacing
+ // PIN1 with UPIN
+ event = RMobilePhone::EUniversalPinRequired;
+ if ( RMobilePhone::ELockReplaced == *setting )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::LockSetting RMobilePhone::ELockReplaced");
+ iActiveCodeToUpinState = EActiveCodeToUpinAskUpin;
+ }
+ break;
+ // This setting is not supported
+ case RMobilePhone::ELockPhoneToFirstICC:
+ ret = KErrNotSupported;
+ break;
+
+ case RMobilePhone::ELockOTA:
+ case RMobilePhone::ELockHiddenKey:
+ case RMobilePhone::ELockUSimApp:
+ case RMobilePhone::ELockSecondUSimApp:
+ default:
+ //other locks are not a problem
+ ret = KErrNone;
+ break;
+ }
+ //if the access is denied, notify the client about
+ //the security event
+ if ( KErrAccessDenied == ret )
+ {
+ CompleteNotifySecurityEventL( event, KErrNone );
+ // Store these for the retry once the
+ //VerifySecurityCode is issued by client
+ iLockSettingPhoneLock = *lock;
+ iLockSetting = *setting;
+ //the setLockSetting is ongoing
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting;
+ }
+ //Check if the lock can be set directly
+ else if ( KErrNone == ret )
+ {
+ CMmDataPackage dataPackage;
+ dataPackage.SetPacketData ( &aPackage );
+ iMmPhoneTsy->iMmPhoneExtInterface->
+ SetLockSettingL( &dataPackage );
+ //the SetLockSetting is ongoing
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting;
+ }
+ }
+
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteSetLockSetting
+// This method completes either an outstanding asynchronous
+// SimPinEnable or SetLockSetting request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteSetLockSetting(
+ TInt aErrorCode, //Error code
+ RMobilePhone::TMobilePhoneLockStatus,
+ RMobilePhone::TMobilePhoneLockSetting )
+ {
+TFLOGSTRING2("LTSY: CMmSecurityTsy::CompleteSetLockSetting - Error:%d", aErrorCode);
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ // Check if handle for set lock setting exists
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ iActiveCodeToUpinState = EActiveCodeToUpinIdle;
+
+ //If the code verification has been requested complete it too.
+ TTsyReqHandle verifyHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != verifyHandle )
+ {
+ // Change these so that they wont mess up anything.
+ iLockSetting = RMobilePhone::ELockSetUnknown;
+ // Complete verify
+ iMmPhoneTsy->ReqCompleted( verifyHandle, aErrorCode );
+ }
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::ChangeSecurityCodeL
+// This method allows a client to change a security code.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::ChangeSecurityCodeL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TDataPackage& aPackage )
+ {
+
+ TInt ret = iMmPhoneTsy->iMmPhoneExtInterface->
+ ChangeSecurityCodeL( aPackage );
+
+ if ( KErrNone == ret )
+ {
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneChangeSecurityCode;
+ }
+ else
+ {
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteChangeSecurityCode
+// This method completes an outstanding asynchronous
+// ChangeSecurityCode request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::CompleteChangeSecurityCode(
+ TInt aErrorCode ) // Error code
+ {
+ TFLOGSTRING2("TSY: CMmSecurityTsy::CompleteChangeSecurityCode - Error:%d", aErrorCode);
+
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneChangeSecurityCode );
+
+ if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
+ {
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifySecurityEventL
+// This method allows a client to be notified when the phone
+// has detected the occurrence of one of the security related events.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifySecurityEventL(
+ RMobilePhone::TMobilePhoneSecurityEvent* aEvent )
+ {
+
+ iRetNotifySecurityEvent = aEvent;
+
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityEvent;
+
+ // If requested after boot, then we need to query security server
+ // state for phone password. If it is enabled, we will not have
+ // security indication as Security server boots up faster than
+ // TSY and has already sent the indications when TSY is loaded.
+ // Thus this is the only way to get the information in boot.
+ if ( iSecurityCheckedForBoot == EFalse )
+ {
+TFLOGSTRING( "TSY: CMmSecurityTsy::NotifySecurityEvent - Checking PIN state");
+ // We can't do anything if sending fails. If this happens,
+ // then every send to IsaApi should fail.
+ (void)iMmPhoneTsy->iMmPhoneExtInterface->GetICCTypeL();
+ }
+
+ // If we have cached notification for security code in boot, then
+ // complete it once to client.
+ if ( iIsSecurityCodeRequestCachedInBoot &&
+ !iMmPhoneTsy->iBootState.iSecReady )
+ {
+TFLOGSTRING( "TSY: CMmSecurityTsy::NotifySecurityEventL - Completing security code event");
+
+ CompleteNotifySecurityEventL( RMobilePhone::EPhonePasswordRequired,
+ KErrNone );
+ iIsSecurityCodeRequestCachedInBoot = EFalse;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifySecurityEventCancel
+// This function cancels an outstanding asynchronous
+// NotifySecurityEvent request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifySecurityEventCancel(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ iRetNotifySecurityEvent = NULL;
+
+ iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityEvent );
+
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteNotifySecurityEventL
+// This function completes an outstanding asynchronous
+// NotifySecurityEvent request. If handle for security event notification
+// does not exist, it also completes those functions that would otherwise
+// require the presence of the handle to complete themselves.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteNotifySecurityEventL(
+ RMobilePhone::TMobilePhoneSecurityEvent aEvent,
+ TInt aErrorCode )
+ {
+TFLOGSTRING3("TSY: CMmSecurityTsy::CompleteNotifySecurityEvent - Event: %d, Error: %d",
+ aEvent, aErrorCode );
+
+ if ( iLastPinRequested != EPinUnknown &&
+ ( RMobilePhone::EPin1Verified == aEvent ) ||
+ ( RMobilePhone::EPin2Verified == aEvent ) )
+ {
+TFLOGSTRING( "TSY: CMmSecurityTsy::CompleteNotifySecurityEvent - iLastPinRequested != EPinUnknown");
+ iLastPinRequested = EPinUnknown;
+ }
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneNotifySecurityEvent );
+
+ //Check if handle exists
+ if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
+ {
+ // When client is informed about security code state in boot,
+ // then this flag needs to be ETrue. There will be no more checking
+ // later on
+ iSecurityCheckedForBoot = ETrue;
+
+ // Set value if the result is KErrNone
+ if ( KErrNone == aErrorCode )
+ {
+ *iRetNotifySecurityEvent = aEvent;
+ }
+ //reset pointer to client side
+ iRetNotifySecurityEvent = NULL;
+ // Complete the client request
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ else
+ {
+ // Client has not yet requested this notification, so cache it
+ // if event is for phone password and boot is not yet done.
+ // It is possible that this indication is received before
+ // client has booted up.
+ if ( ( RMobilePhone::EPhonePasswordRequired == aEvent ) &&
+ !iMmPhoneTsy->iBootState.iSecReady &&
+ !iIsSecurityCodeRequestCachedInBoot )
+
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::CompleteNotifySecurityEvent - Caching event");
+ iIsSecurityCodeRequestCachedInBoot = ETrue;
+ }
+
+ // Check if the event is a PIN2 requirement
+ if ( aEvent == RMobilePhone::EPin2Required )
+ {
+ // These are the methods that must be completed, if there is no
+ // handle that can be used for informing client about password
+ // verification query.
+ TInt errorCode = CMmCommonStaticUtility::EpocErrorCode(
+ KErrAccessDenied, KErrGsm0707SimPin2Required );
+
+ reqHandle = iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
+ // Check if handle for setfdnsetting exists
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ iMmPhoneTsy->CompleteSetFdnSettingL( errorCode );
+ }
+ }
+ // Check if the event is a PIN1 or security code requirement.
+ if ( aEvent == RMobilePhone::EPin1Required ||
+ aEvent == RMobilePhone::EPhonePasswordRequired )
+ {
+ TTsyReqHandle setLockSettingHandle =
+ iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+ // Check if handle for setlocksetting exists. If so, complete
+ // lock setting, because client can not be informed about password
+ // verification requirement without notify security event handle
+ if ( setLockSettingHandle > 0 )
+ {
+ CompleteSetLockSetting( KErrAccessDenied,
+ RMobilePhone::EStatusLockUnknown,
+ RMobilePhone::ELockSetUnknown );
+ }
+ }
+ }
+ // Update security capabilities and check if notification completion for
+ // capabilities is required
+ iMmPhoneTsy->iMmPhoneExtInterface->UpdateSecurityCaps( aEvent );
+ }
+
+#ifndef USING_CTSY_DISPATCHER
+
+/**
+ * Checks that security codes are well formed.
+ */
+TBool CMmSecurityTsy::AreCodesWellFormed(
+ const RMobilePhone::TMobilePhoneSecurityCode& aCodeType,
+ const RMobilePhone::TCodeAndUnblockCode& aCodes ) const
+ {
+
+ const TUint8 KPukCodeLength(8);
+ const TUint8 KMaxPinCodeLength(8);
+ const TUint8 KMinPinCodeLength(4);
+
+ switch (aCodeType)
+ {
+ case RMobilePhone::ESecurityCodePuk1:
+ case RMobilePhone::ESecurityCodePuk2:
+ {
+ //
+ // Verify PUK code is well formed according to 3GPP TS 11.11
+ // (8 numeric digits)
+ //
+ if (aCodes.iUnblockCode.Length() != KPukCodeLength)
+ {
+ return EFalse;
+ }
+ TChar c(0);
+ for (TInt i=0; i<KPukCodeLength; ++i)
+ {
+ c = aCodes.iUnblockCode[i];
+ if (c < '0' || c > '9' )
+ return EFalse;
+ }
+ }
+ //
+ // and fall through to verify PIN is well formed too
+ //
+ case RMobilePhone::ESecurityCodePin1:
+ case RMobilePhone::ESecurityCodePin2:
+ {
+ //
+ // Verify PIN code conforms with 3GPP TS 11.11
+ // (between 4 and 8 numeric digits)
+ //
+ TInt len = aCodes.iCode.Length();
+ if ( (len < KMinPinCodeLength) || (len > KMaxPinCodeLength) )
+ return EFalse;
+ TChar c(0);
+ for (TInt i=0; i < len; ++i)
+ {
+ c = aCodes.iCode[i];
+ if (c < '0' || c > '9' )
+ return EFalse;
+ }
+ }
+ break;
+
+ default:
+ // For all other types of code, check should happen in the LTSY.
+ // Returning ETrue will ensure request goes on to LTSY.
+ break;
+ }
+
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::VerifySecurityCodeL
+// This method sends a security code requiring verification to
+// the phone. If code is required for lock setting, it sends it to the
+// extension and orders re-execution of SetLockSetting function.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::VerifySecurityCodeL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TDataPackage& aPackage )
+ {
+
+ RMobilePhone::TMobilePhoneSecurityCode* type =
+ reinterpret_cast<RMobilePhone::TMobilePhoneSecurityCode*>
+ ( aPackage.Ptr1() );
+ RMobilePhone::TCodeAndUnblockCode* codes =
+ reinterpret_cast<RMobilePhone::TCodeAndUnblockCode*>
+ ( aPackage.Ptr2() );
+
+ // Get request handle to check whether server is busy with previous
+ // request
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
+
+ if ( 0 < reqHandle )
+ {
+ //The request is already in processing because of previous request
+ //Complete request with status value informing the client about
+ //the situation.
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+
+ TInt ret( KErrArgument );
+
+ // Check that received codes are well formed
+ if (!AreCodesWellFormed(*type,*codes))
+ {
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrArgument );
+ return KErrNone;
+ }
+
+ if ( RMobilePhone::ESecurityCodePin1 == *type )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PIN VERIFY REQUESTED");
+ iLastPinRequested = EPin1Requested;
+ }
+ if ( RMobilePhone::ESecurityCodePin2 == *type )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PIN2 VERIFY REQUESTED");
+ iLastPinRequested = EPin2Requested;
+ }
+ //This is to prevent unnecessary PIN1 request after PUK code
+ //request. Corrected at the same time with error TKEN-5WFJ7Y
+ if ( ( ( RMobilePhone::ESecurityCodePuk1 == *type ) ||
+ ( RMobilePhone::ESecurityCodePuk2 == *type ) ) &&
+ ( 0 < codes->iUnblockCode.Length() ) )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PUK VERIFY REQUESTED");
+ iPukCodeVerify = ETrue;
+ }
+ //This is to prevent unnecessary PIN1 request after phone password
+ //request (PYRA-5UBCLC)
+ if ( RMobilePhone::ESecurityCodePhonePassword == *type )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::VerifySecurityCodeL - PHONE PASSWORD VERIFY REQUESTED");
+ iPhonePasswordVerify = ETrue;
+ }
+ iMmPhoneTsy->iMmPhoneExtInterface->DeliverCode( *codes );
+
+ // CheckSecurityCode needs to set the lock as well, so pass the
+ // code for lock setting
+ if ( iMmPhoneTsy->iMmCustomTsy )
+ {
+ iMmPhoneTsy->iMmCustomTsy->DeliverCodeL( *codes );
+ }
+
+ //Check if the SetLockSetting is ongoing, in some cases
+ //SetLockSetting requires a verification of PIN1 or security code
+ //before continue with the lock setting
+ reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ GetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown &&
+ EActiveCodeToUpinAskUpin != iActiveCodeToUpinState )
+ {
+ CMmDataPackage dataPackage;
+ //add into the package the stored lock and setting
+ dataPackage.PackData( &iLockSettingPhoneLock, &iLockSetting );
+ ret = iMmPhoneTsy->iMmPhoneExtInterface->
+ SetLockSettingL( &dataPackage );
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneVerifySecurityCode;
+
+ if ( KErrNone != ret )
+ {
+ CompleteSetLockSetting( ret,
+ RMobilePhone::EStatusLockUnknown,
+ RMobilePhone::ELockSetUnknown );
+ }
+ }
+ //This is a regular verification or active code
+ //change from PIN to UPIN
+ else
+ {
+ ret = iMmPhoneTsy->iMmPhoneExtInterface->
+ VerifySecurityCodeL( aPackage );
+
+ if ( KErrNone == ret )
+ {
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneVerifySecurityCode;
+ }
+ else
+ {
+ // Complete verify with error
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
+
+ // If FDN request is on-going, complete is also with error
+ reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
+ if ( reqHandle !=
+ CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
+ {
+ iMmPhoneTsy->CompleteSetFdnSettingL( ret );
+ }
+ reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown !=
+ reqHandle && EActiveCodeToUpinAskUpin ==
+ iActiveCodeToUpinState )
+ {
+ //Verifying UPIN failed
+ CompleteSetLockSetting( ret,
+ RMobilePhone::EStatusLockUnknown,
+ RMobilePhone::ELockSetUnknown );
+ }
+ }
+ }
+
+ } // end check request handle
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteVerifySecurityCodeL
+// This method completes an outstanding asynchronous
+// VerifySecurityCode request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteVerifySecurityCodeL(
+ TInt aErrorCode )
+ {
+TFLOGSTRING2("TSY: CMmSecurityTsy::CompleteVerifySecurityCode - Error:%d", aErrorCode);
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ // Complete the request
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+
+ // This needs to be done for PIN code verification when user has
+ // dual line SIM and user has changed the line. If PIN code
+ // verification fails, we need to request PIN code again.
+
+ // NOTE! This MUST NOT happen in bootup when PIN code is verified
+ // and NOT when PIN code is changed to ON/OFF from settings.
+
+ // DO NOT complete if SetLockSetting is called -> PIN ON/OFF change
+ // from general settings.
+
+ // Not completed if PUK code verify or Phonepassword verify
+ TTsyReqHandle phoneSetLockSettingHandle =
+ iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ // DO NOT complete if booting up
+ if ( ( iMmPhoneTsy->iBootState.iSecReady ) &&
+ ( iLastPinRequested != EPinUnknown ) &&
+ ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown ==
+ phoneSetLockSettingHandle ) &&
+ ( KErrNone != aErrorCode ) &&
+ ( !iPukCodeVerify ) &&
+ ( !iPhonePasswordVerify ) )
+ {
+ // IF PIN1 REQUESTED LAST
+ if ( iLastPinRequested == EPin1Requested )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::CompleteVerifySecurityCodeL - PIN VERIFICATION NEEDED");
+ CompleteNotifySecurityEventL( RMobilePhone::EPin1Required,
+ KErrNone );
+ iLastPinRequested = EPinUnknown;
+ }
+ // IF PIN2 REQUESTED LAST
+ if (iLastPinRequested == EPin2Requested)
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::CompleteVerifySecurityCodeL - PIN2");
+ iLastPinRequested = EPinUnknown;
+ }
+ }
+ else if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown !=
+ phoneSetLockSettingHandle && EActiveCodeToUpinAskUpin ==
+ iActiveCodeToUpinState )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::CompleteVerifySecurityCodeL - iActiveCodeToUpinState = EActiveCodeToUpinAskPin");
+ if ( KErrNone == aErrorCode )
+ {
+ iActiveCodeToUpinState = EActiveCodeToUpinAskPin;
+ CompleteNotifySecurityEventL(
+ RMobilePhone::EPin1Required, KErrNone );
+ }
+ else
+ {
+ iActiveCodeToUpinState = EActiveCodeToUpinIdle;
+ CompleteSetLockSetting( KErrAccessDenied,
+ RMobilePhone::EStatusLockUnknown,
+ RMobilePhone::ELockSetUnknown );
+ }
+ }
+ //Set iPukCodeVerify to EFalse
+ iPukCodeVerify = EFalse;
+
+ //Set iPhonePasswordVerify to EFalse
+ iPhonePasswordVerify = EFalse;
+
+ // FDN HANDLING
+ reqHandle = iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
+
+ if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
+ {
+ if ( KErrNone == aErrorCode )
+ {
+ aErrorCode = iMmPhoneTsy->iMmPhoneExtInterface->
+ SetFdnSetting( iMmPhoneTsy->iRetFdnSetting );
+ }
+ else
+ {
+ iMmPhoneTsy->CompleteSetFdnSettingL( aErrorCode );
+ }
+ }
+
+ // Reset just used code, empty for next round.
+ RMobilePhone::TCodeAndUnblockCode codes;
+ _LIT( KNullCharacter, "\0" );
+ codes.iCode.Copy( KNullCharacter );
+ iMmPhoneTsy->iMmPhoneExtInterface->DeliverCode( codes );
+ }
+ }
+#endif //USING_CTSY_DISPATCHER
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::AbortSecurityCodeL
+// This function informs the phone that the user has cancelled
+// an outstanding "get security code" request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::AbortSecurityCodeL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TDataPackage& aPackage )
+ {
+ TInt ret = KErrNone;
+
+ // Check if security code verification was aborted for the lock setting
+ TTsyReqHandle reqHandle =
+ iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetLockSetting );
+
+ // Check also that VerifySecurityCode has not yet been called
+ TTsyReqHandle verifyHandle =
+ iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneVerifySecurityCode );
+
+ // If so, complete set lock setting
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle &&
+ CMmPhoneTsy::EMultimodePhoneReqHandleUnknown == verifyHandle )
+ {
+ // Complete with abort error code
+ CompleteSetLockSetting( KErrAbort,
+ RMobilePhone::EStatusLockUnknown,
+ RMobilePhone::ELockSetUnknown );
+
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ // In other cases we need to inform Licencee TSY about the abort request
+ //for further processing
+ else
+ {
+ // Check if security code verification was aborted for the fdn setting
+ reqHandle = iMmPhoneTsy->iTsyReqHandleStore->GetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneSetFdnSetting );
+
+ if ( reqHandle != CMmPhoneTsy::EMultimodePhoneReqHandleUnknown )
+ {
+ // Security UI excepts KErrAbort for abort security code
+ iMmPhoneTsy->CompleteSetFdnSettingL( KErrAbort );
+
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+
+ // allow for EMobilePhoneAbortSecurityCode immediate completion
+#ifdef REQHANDLE_TIMER
+ iMmPhoneTsy->SetTypeOfResponse(
+ CMmPhoneTsy::EMultimodePhoneAbortSecurityCode,
+ aTsyReqHandle );
+#else
+ iMmPhoneTsy->iTsyReqHandleStore->SetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneAbortSecurityCode,
+ aTsyReqHandle );
+#endif
+ ret = iMmPhoneTsy->iMmPhoneExtInterface->AbortSecurityCodeL(
+ aPackage );
+
+ // dos layer returned with error and didn't complete request
+ if ( ret != KErrNone )
+ {
+ CompleteAbortSecurityCode(ret);
+ }
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteAbortSecurityCode
+// This function completes outstanding asynchronous
+// AbortSecurityCode request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteAbortSecurityCode(
+ TInt aErrorCode )
+ {
+TFLOGSTRING2("TSY: CMmSecurityTsy::CompleteAbortSecurityCode - Error:%d", aErrorCode);
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneAbortSecurityCode );
+
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::SetPin1DisableNotSupported
+// Sets iPin1DisableSupported to EFalse. PIN can't be disabled.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::SetPin1DisableNotSupported()
+ {
+ iPin1DisableSupported = EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteGetLockInfo
+// This method completes either an outstanding asynchronous
+// SimPinEnable, GetLockInfo or SetLockSetting request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteGetLockInfo(
+ CMmDataPackage* aDataPackage,
+ TInt aErrorCode )
+ {
+TFLOGSTRING2("LTSY: CMmSecurityTsy::CompleteGetLockInfo - Error:%d", aErrorCode);
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle( CMmPhoneTsy::EMultimodePhoneGetLockInfo );
+
+ // check if handle is present
+ if ( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+
+ if ( KErrNone == aErrorCode )
+ {
+ //unpack the data
+ RMobilePhone::TMobilePhoneLockStatus* status = NULL;
+ RMobilePhone::TMobilePhoneLockSetting* setting = NULL;
+
+ aDataPackage->UnPackData( &status, &setting );
+
+ RMobilePhone::TMobilePhoneLockInfoV1 apckg;
+ apckg.iStatus = *status;
+ apckg.iSetting = *setting;
+
+ RMobilePhone::TMobilePhoneLockInfoV1Pckg lockInfoPckg( apckg );
+
+ *iRetGetLockInfo = lockInfoPckg;
+ }
+
+ iRetGetLockInfo = NULL;
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::GetLockInfoCancel
+// This method cancels either an outstanding asynchronous
+// SimPinEnable, GetLockInfo or SetLockSetting request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::GetLockInfoCancel(
+ TTsyReqHandle aTsyReqHandle )
+ {
+ //reset the pointer to the client side
+ iRetGetLockInfo = NULL;
+
+ //reset the req handle
+ iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetLockInfo );
+
+ //complete with cancel
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::GetSecurityCodeInfoL
+// This method retrieves the current number of remaining entry attemps of
+// security code.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::GetSecurityCodeInfoL(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TMobilePhoneSecurityCode* aSecurityCode,
+ TDes8* aSecurityCodeInfo )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::GetSecurityCodeInfoL");
+
+ TInt ret( KErrNone );
+
+ if ( sizeof ( RMobilePhone::TMobilePhoneSecurityCodeInfoV5 ) <=
+ aSecurityCodeInfo->MaxLength() )
+ {
+ TBool reqAlreadyProcessing( EFalse );
+ // Check if the request is already processing
+ for( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
+ {
+ if( iGetSecurityCodeInfoRequests[ i ]->iSecurityCode
+ == *aSecurityCode )
+ {
+ reqAlreadyProcessing = ETrue;
+ break;
+ }
+ }
+
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ if( reqAlreadyProcessing )
+ {
+ TGetSecurityCodeInfoRequest* req = new ( ELeave )
+ TGetSecurityCodeInfoRequest();
+ req->iReqHandle = aTsyReqHandle;
+ req->iSecurityCode = *aSecurityCode;
+ req->iSecurityCodeInfo = aSecurityCodeInfo;
+ iGetSecurityCodeInfoRequests.AppendL( req );
+ }
+ else
+ {
+ CMmDataPackage dataPackage;
+ dataPackage.PackData( aSecurityCode );
+
+ ret = iMmPhoneTsy->MessageManager()->HandleRequestL(
+ EMobilePhoneGetSecurityCodeInfo, &dataPackage );
+
+ if ( KErrNone == ret )
+ {
+ //save tsy req handle type
+ switch (*aSecurityCode)
+ {
+ case RMobilePhone::ESecurityCodePin1:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin1;
+ break;
+ case RMobilePhone::ESecurityCodePin2:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin2;
+ break;
+ case RMobilePhone::ESecurityCodePuk1:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk1;
+ break;
+ case RMobilePhone::ESecurityCodePuk2:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk2;
+ break;
+ case RMobilePhone::ESecurityCodePhonePassword:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonePassword;
+ break;
+ case RMobilePhone::ESecurityCodeSPC:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSPC;
+ break;
+ case RMobilePhone::ESecurityHiddenKey:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonebookHiddenKey;
+ break;
+ case RMobilePhone::ESecurityUSIMAppPin:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUSIMAppPin;
+ break;
+ case RMobilePhone::ESecuritySecondUSIMAppPin:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSecondUSIMAppPin;
+ break;
+ case RMobilePhone::ESecurityUniversalPin:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPin;
+ break;
+ case RMobilePhone::ESecurityUniversalPuk:
+ iMmPhoneTsy->iReqHandleType =
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPuk;
+ break;
+ }
+
+ // save request in queue for completion
+ TGetSecurityCodeInfoRequest* req = new ( ELeave )
+ TGetSecurityCodeInfoRequest();
+ req->iReqHandle = aTsyReqHandle;
+ req->iSecurityCode = *aSecurityCode;
+ req->iSecurityCodeInfo = aSecurityCodeInfo;
+ iGetSecurityCodeInfoRequests.AppendL( req );
+ }
+ }
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteGetSecurityCodeInfo
+// This method completes the GetSecurityCodeInfo request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteGetSecurityCodeInfo(
+ CMmDataPackage* aDataPackage,
+ TInt aErrorCode )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::CompleteGetSecurityCodeInfo");
+
+ RMobilePhone::TMobilePhoneSecurityCode* securityCode;
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5* securityCodeInfoV5;
+ aDataPackage->UnPackData( &securityCode, &securityCodeInfoV5 );
+
+ ResetGetSecurityCodeInfoTsyReqHandle(*securityCode);
+
+ for ( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
+ {
+ if( iGetSecurityCodeInfoRequests[ i ]->iSecurityCode
+ == *securityCode )
+ {
+ if (aErrorCode == KErrNone)
+ {
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*
+ securityCodeInfoV5Pckg = REINTERPRET_CAST(
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*,
+ iGetSecurityCodeInfoRequests[ i ]->iSecurityCodeInfo );
+
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5& securityCodeInfo =
+ ( *securityCodeInfoV5Pckg )();
+
+ securityCodeInfo.iRemainingEntryAttempts
+ = securityCodeInfoV5->iRemainingEntryAttempts;
+ }
+ iMmPhoneTsy->ReqCompleted(
+ iGetSecurityCodeInfoRequests[ i ]->iReqHandle, aErrorCode );
+
+ delete iGetSecurityCodeInfoRequests[ i ];
+ iGetSecurityCodeInfoRequests.Remove( i );
+ }
+ }
+
+ iGetSecurityCodeInfoRequests.Compress();
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::GetSecurityCodeInfoCancel
+// This method cancels the GetSecurityCodeInfo request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::GetSecurityCodeInfoCancel(
+ TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::GetSecurityCodeInfoCancel");
+
+ RMobilePhone::TMobilePhoneSecurityCode secCode = RMobilePhone::ESecurityCodePin1;
+ TBool reqHandleExist = EFalse;
+
+ for ( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
+ {
+ TGetSecurityCodeInfoRequest* req = iGetSecurityCodeInfoRequests[ i ];
+
+ if( aTsyReqHandle == req->iReqHandle )
+ {
+ secCode = req->iSecurityCode;
+ iMmPhoneTsy->ReqCompleted( req->iReqHandle, KErrCancel );
+ delete iGetSecurityCodeInfoRequests[ i ];
+ iGetSecurityCodeInfoRequests.Remove( i );
+ reqHandleExist = ETrue;
+ break;
+ }
+ }
+
+ if (reqHandleExist)
+ {
+ iGetSecurityCodeInfoRequests.Compress();
+
+ TBool secCodeExist = EFalse;
+
+ for ( TInt i = 0; i < iGetSecurityCodeInfoRequests.Count(); i++ )
+ {
+ TGetSecurityCodeInfoRequest* req = iGetSecurityCodeInfoRequests[ i ];
+
+ if (iGetSecurityCodeInfoRequests[i]->iSecurityCode == secCode)
+ {
+ secCodeExist = ETrue;
+ break;
+ }
+ }
+
+ if (!secCodeExist)
+ {
+ ResetGetSecurityCodeInfoTsyReqHandle(secCode);
+ }
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::ResetGetSecurityCodeInfoTsyReqHandle
+// This method resets the (GetSecurityCodeInfo) request handle.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::ResetGetSecurityCodeInfoTsyReqHandle(
+ const RMobilePhone::TMobilePhoneSecurityCode aSecurityCode )
+ {
+ switch (aSecurityCode)
+ {
+ case RMobilePhone::ESecurityCodePin1:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin1);
+ break;
+ case RMobilePhone::ESecurityCodePin2:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPin2 );
+ break;
+ case RMobilePhone::ESecurityCodePuk1:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk1 );
+ break;
+ case RMobilePhone::ESecurityCodePuk2:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPuk2 );
+ break;
+ case RMobilePhone::ESecurityCodePhonePassword:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonePassword );
+ break;
+ case RMobilePhone::ESecurityCodeSPC:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSPC );
+ break;
+ case RMobilePhone::ESecurityHiddenKey:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoPhonebookHiddenKey );
+ break;
+ case RMobilePhone::ESecurityUSIMAppPin:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUSIMAppPin );
+ break;
+ case RMobilePhone::ESecuritySecondUSIMAppPin:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoSecondUSIMAppPin );
+ break;
+ case RMobilePhone::ESecurityUniversalPin:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPin );
+ break;
+ case RMobilePhone::ESecurityUniversalPuk:
+ iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneGetSecurityCodeInfoUniversalPuk );
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifySecurityCodeInfoChange
+// This method allows a client to be notified when the security code
+// information changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifySecurityCodeInfoChange(
+ RMobilePhone::TMobilePhoneSecurityCode* aSecurityCode,
+ TDes8* aSecurityCodeInfo )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::NotifySecurityCodeInfoChange");
+
+ TInt ret( KErrNone );
+
+ if ( sizeof ( RMobilePhone::TMobilePhoneSecurityCodeInfoV5 ) <=
+ aSecurityCodeInfo->MaxLength() )
+ {
+ iRetNotifySecurityCode = aSecurityCode;
+ iRetNotifySecurityCodeInfo = aSecurityCodeInfo;
+
+ iMmPhoneTsy->iReqHandleType
+ = CMmPhoneTsy::EMultimodePhoneNotifySecurityCodeInfoChange;
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::CompleteNotifySecurityCodeInfoChange
+// This method completes the NotifySecurityCodeInfoChange notification.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmSecurityTsy::CompleteNotifySecurityCodeInfoChange(
+ CMmDataPackage* aDataPackage,
+ TInt aErrorCode )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::CompleteNotifySecurityCodeInfoChange");
+
+ TTsyReqHandle reqHandle = iMmPhoneTsy->iTsyReqHandleStore->
+ ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityCodeInfoChange );
+
+ if( CMmPhoneTsy::EMultimodePhoneReqHandleUnknown != reqHandle )
+ {
+ if ( KErrNone == aErrorCode )
+ {
+ RMobilePhone::TMobilePhoneSecurityCode* securityCode;
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5* securityCodeInfoV5;
+ aDataPackage->UnPackData( &securityCode, &securityCodeInfoV5 );
+
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*
+ securityCodeInfoV5Pckg = REINTERPRET_CAST(
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5Pckg*,
+ iRetNotifySecurityCodeInfo );
+
+ RMobilePhone::TMobilePhoneSecurityCodeInfoV5& securityCodeInfo
+ = ( *securityCodeInfoV5Pckg )();
+
+ securityCodeInfo.iRemainingEntryAttempts
+ = securityCodeInfoV5->iRemainingEntryAttempts;
+ *iRetNotifySecurityCode = *securityCode;
+ }
+
+ // clean the pointers to client side
+ iRetNotifySecurityCodeInfo = NULL;
+ iRetNotifySecurityCode = NULL;
+
+ iMmPhoneTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmSecurityTsy::NotifySecurityCodeInfoChangeCancel
+// This method cancels the NotifySecurityCodeInfoChange notification.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmSecurityTsy::NotifySecurityCodeInfoChangeCancel(
+ TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING("TSY: CMmSecurityTsy::NotifySecurityCodeInfoChangeCancel");
+
+ iRetNotifySecurityCodeInfo = NULL;
+ iRetNotifySecurityCode = NULL;
+
+ iMmPhoneTsy->iTsyReqHandleStore->ResetTsyReqHandle(
+ CMmPhoneTsy::EMultimodePhoneNotifySecurityCodeInfoChange );
+
+ iMmPhoneTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+
+// End of File