telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmsecuritytsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- 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