--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmCustomSecurityTsy.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,695 @@
+// 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:
+//
+
+
+
+// INCLUDE FILES
+#include "CMmCustomSecurityTsy.h"
+#include <ctsy/tflogger.h>
+#include "cmmphonegsmwcdmaext.h"
+#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmCustomSecurityTsy::CMmCustomSecurityTsy()
+ {
+ }
+
+void CMmCustomSecurityTsy::ConstructL(
+ CMmCustomTsy* aMmCustomTsy,
+ CMmPhoneTsy* aMmPhoneTsy )
+ {
+TFLOGSTRING("TSY: CMmCustomSecurityTsy::ConstructL");
+ iMmCustomTsy = aMmCustomTsy;
+ iMmPhoneTsy = aMmPhoneTsy;
+
+ // register securitytsy in the message manager
+ iMmPhoneTsy->MessageManager()->RegisterTsyObject(
+ CMmMessageManagerBase::ESecurityTsy, this );
+
+ // Create req handle store
+#ifdef REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( iMmCustomTsy,
+ iMmCustomTsy->iMmPhoneTsy, ESecurityRequestTypeMaxNumOfRequests,
+ iSecReqHandles );
+#else
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ ESecurityRequestTypeMaxNumOfRequests, iSecReqHandles );
+#endif //REQHANDLE_TIMER
+
+ return;
+ }
+
+CMmCustomSecurityTsy* CMmCustomSecurityTsy::NewL(
+ CMmCustomTsy* aMmCustomTsy,
+ CMmPhoneTsy* aPhoneTsy )
+ {
+TFLOGSTRING("TSY: CMmCustomSecurityTsy::NewL");
+ CMmCustomSecurityTsy* self = new (ELeave) CMmCustomSecurityTsy();
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aMmCustomTsy, aPhoneTsy );
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+CMmCustomSecurityTsy::~CMmCustomSecurityTsy()
+ {
+ if (iMmPhoneTsy )
+ {
+ // deregister tsy object from message manager
+ iMmPhoneTsy->MessageManager()->DeregisterTsyObject(this);
+ }
+ delete iTsyReqHandleStore;
+
+ return;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::Init
+// Initialisation method that is called from ETel Server.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::Init()
+ {
+ return;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::SupportingIPC
+// Tells whether the object supports given IPC.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmCustomSecurityTsy::SupportingIPC(
+ TInt aIpc )
+ {
+ TInt ret( EFalse );
+
+ switch (aIpc)
+ {
+ case ECustomIsBlockedIPC:
+ case ECustomCheckSecurityCodeIPC:
+ case ECustomDisablePhoneLockIPC:
+ case ECustomGetActivePinIPC:
+ ret = ETrue;
+ break;
+ default:
+ ret = EFalse;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::DoExtFuncL
+// Dispatches extension function requests.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+ TInt ret( KErrGeneral );
+
+ // reset last tsy request type
+ iReqHandleType = ESecurityTsyReqHandleUnknown;
+
+ switch (aIpc)
+ {
+ case ECustomIsBlockedIPC:
+ ret = IsBlocked( aTsyReqHandle,
+ REINTERPRET_CAST( RMmCustomAPI::TSecurityCodeType*,
+ aPackage.Ptr1() ),
+ REINTERPRET_CAST( TBool*, aPackage.Ptr2() ) );
+ break;
+ case ECustomCheckSecurityCodeIPC:
+ ret = CheckSecurityCodeL( aTsyReqHandle,
+ REINTERPRET_CAST( RMmCustomAPI::TSecurityCodeType*,
+ aPackage.Ptr1() ) );
+ break;
+ case ECustomDisablePhoneLockIPC:
+ ret = DisablePhoneLockL( aTsyReqHandle,
+ REINTERPRET_CAST( RMobilePhone::TMobilePassword*,
+ aPackage.Ptr1() ) );
+ break;
+ case ECustomGetActivePinIPC:
+ ret = GetActivePin( aTsyReqHandle,
+ REINTERPRET_CAST( RMobilePhone::TMobilePhoneSecurityCode*,
+ aPackage.Ptr1() ) );
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ // save request handle
+ if( ESecurityTsyReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::ReqModeL
+// Returns request mode for given IPC. If the IPC number belongs to some of
+// the Security API functions.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmCustomSecurityTsy::ReqModeL(
+ const TInt aIpc )
+ {
+ CTelObject::TReqMode ret = 0;
+
+ switch (aIpc)
+ {
+ case ECustomCheckSecurityCodeIPC:
+ case ECustomIsBlockedIPC:
+ case ECustomDisablePhoneLockIPC:
+ case ECustomGetActivePinIPC:
+ break;
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::NumberOfSlotsL
+// Returns number of slots to be used for given IPC.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots( KMmCustomDefaultSlots );
+
+ switch ( aIpc )
+ {
+ case ECustomIsBlockedIPC:
+ numberOfSlots = KMmCustomIsBlockedSlots;
+ break;
+ case ECustomCheckSecurityCodeIPC:
+ case ECustomDisablePhoneLockIPC:
+ numberOfSlots = KMmCustomCheckSecurityCodeSlots;
+ break;
+ case ECustomGetActivePinIPC:
+ numberOfSlots = KMmCustomDefaultSlots;
+ break;
+ default:
+ // Unknown or invalid IPC
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return numberOfSlots;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CancelService
+// When the clients close their sub-sessions (eg. by calling RPhone::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 function in the TSY.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle )
+ {
+ TInt ret( KErrNone );
+ TInt trapError( KErrNone );
+
+ TRAP( trapError, // START TRAP
+ switch ( aIpc )
+ {
+ case ECustomCheckSecurityCodeIPC:
+ ret = CheckSecurityCodeCancelL();
+ break;
+ case ECustomDisablePhoneLockIPC: //This IPC cannot be cancelled
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrGeneral;
+ break;
+ }
+ ); // END TRAP
+ if ( KErrNone != trapError )
+ {
+ ret = trapError;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::RegisterNotification
+// RegisterNotification is called when the server recognises
+// that this notification is being posted for the first time on this sub-
+// session object. It enables the TSY to "turn on" any regular notification
+// messages that it may receive from DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::RegisterNotification(
+ const TInt )
+ {
+ // No supported notifications in CMmCustomSecurityTsy
+ return KErrNotSupported;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::DeregisterNotification
+// DeregisterNotification is called when the server recognises that this
+// notification will not be posted again because the last client to have
+// a handle on this sub-session object has just closed the handle. It
+// enables the TSY to "turn off" any regular notification messages that
+// it may receive from DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::DeregisterNotification(
+ const TInt )
+ {
+ // No supported notifications in CMmCustomSecurityTsy
+ return KErrNotSupported;
+ }
+
+#ifdef REQHANDLE_TIMER
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::SetTypeOfResponse
+// Sets the type of response for a given handle.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::SetTypeOfResponse(
+ const TInt aReqHandleType,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ // Does not use timer
+ iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, aTsyReqHandle );
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::Complete
+// Completes the request due the timer expiration
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::Complete(
+ TInt aReqHandleType,
+ TInt aError )
+ {
+TFLOGSTRING3( "CustomTSY: CMmCustomSecurityTsy::Complete.\n\t ReqHandleType:%d \n\t Error:%d\n", aReqHandleType, aError );
+ // All possible TSY req handle types are listed in the
+ // switch case below.
+ switch ( aReqHandleType )
+ {
+ case ESecurityRequestTypeCheckSecurityCode:
+ CompleteCheckSecurityCode( aError );
+ break;
+ case ESecurityRequestTypeIsBlocked:
+ CompleteIsBlocked( aError, *iIsBlocked );
+ break;
+ case ESecurityRequestTypeDisablePhoneLock:
+ CompleteDisablePhoneLock( aError );
+ break;
+ default:
+ iMmCustomTsy->ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
+ aReqHandleType ), aError );
+ break;
+ }
+ }
+#endif // REQHANDLE_TIMER
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::IsBlocked
+// This method gets the is blocked status
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::IsBlocked(
+ const TTsyReqHandle aTsyReqHandle,
+ RMmCustomAPI::TSecurityCodeType* aCode,
+ TBool* aIsBlocked )
+ {
+ if ( NULL != iTsyReqHandleStore->GetTsyReqHandle(
+ ESecurityRequestTypeIsBlocked ) )
+ {
+ return KErrServerBusy;
+ }
+TFLOGSTRING2( "TSY: CMmPhoneTsy::IsBlocked - Code to check: %d", *aCode );
+
+ switch ( *aCode )
+ {
+ case RMmCustomAPI::ESecurityCodePin1:
+ iCodeID = KSecCodePin;
+ break;
+ case RMmCustomAPI::ESecurityCodePin2:
+ iCodeID = KSecCodePin2;
+ break;
+ case RMmCustomAPI::ESecurityUniversalPin:
+ if ( CMmPhoneGsmWcdmaExt::EICCTypeSim3G ==
+ iMmPhoneTsy->GetActivePhoneExtension()->CurrentICCType() )
+ {
+ iCodeID = KSecCodeUpin;
+ }
+ else
+ {
+ return KErrArgument;
+ }
+ break;
+ case RMmCustomAPI::ESecurityCodePassPhrase:
+ iCodeID = KSecCodeSecurity;
+ break;
+ default:
+ return KErrArgument;
+ }
+
+ // save pointer to client data
+ iIsBlocked = aIsBlocked;
+
+ // Send ISI message to SIM Server to check security code and
+ // intialize ret value
+
+ CMmDataPackage aPackage;
+ aPackage.PackData( &iCodeID );
+
+ TInt retValue = KErrNone;
+ TRAPD(err, retValue = iMmPhoneTsy->MessageManager()->HandleRequestL
+ ( ECustomIsBlockedIPC, &aPackage ) );
+ if(err != KErrNone)
+ {
+ retValue = err;
+ }
+
+ // check result
+ if ( KErrNone != retValue )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, retValue );
+ }
+ else
+ {
+ // Save the req handle type
+ iReqHandleType = ESecurityRequestTypeIsBlocked;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CompleteIsBlocked
+// Completes a isblocked request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::CompleteIsBlocked(
+ TInt aErrorCode,
+ TBool aIsBlocked )
+ {
+ // reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ ESecurityRequestTypeIsBlocked );
+
+ // check the handle and complete
+ if( ESecurityTsyReqHandleUnknown != reqHandle )
+ {
+ //set the information for the client
+ *iIsBlocked = aIsBlocked;
+
+ //reset pointer to client data
+ iIsBlocked = NULL;
+
+ iMmCustomTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CheckSecurityCodeL
+// This method sends the check security code request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::CheckSecurityCodeL(
+ const TTsyReqHandle aTsyReqHandle,
+ RMmCustomAPI::TSecurityCodeType* aCode )
+ {
+ if ( NULL != iTsyReqHandleStore->GetTsyReqHandle(
+ ESecurityRequestTypeCheckSecurityCode ) )
+ {
+ return KErrServerBusy;
+ }
+
+ switch ( *aCode )
+ {
+ case RMmCustomAPI::ESecurityCodePin1:
+ iCodeID = KSecCodePin;
+ break;
+ case RMmCustomAPI::ESecurityCodePin2:
+ iCodeID = KSecCodePin2;
+ break;
+ case RMmCustomAPI::ESecurityCodePuk1:
+ iCodeID = KSecCodePuk;
+ break;
+ case RMmCustomAPI::ESecurityCodePuk2:
+ iCodeID = KSecCodePuk2;
+ break;
+ case RMmCustomAPI::ESecurityCodePassPhrase:
+ iCodeID = KSecCodeSecurity;
+ break;
+ default:
+ return KErrArgument;
+ }
+
+ CMmDataPackage aPackage;
+ aPackage.PackData( &iCodeID, &iSecCode );
+
+TFLOGSTRING2( "TSY: CMmCustomSecurityTsy::CheckSecurityCodeL iSecCode: %S", &iSecCode );
+ TInt retValue ( iMmPhoneTsy->MessageManager()->HandleRequestL(
+ ECustomCheckSecurityCodeIPC, &aPackage ) );
+
+ // check result
+ if ( KErrNone != retValue )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, retValue );
+ }
+ else
+ {
+ // Save the req handle type
+ iReqHandleType = ESecurityRequestTypeCheckSecurityCode;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CompleteCheckSecurityCode
+// Completes a CheckSecurityCode request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::CompleteCheckSecurityCode(
+ TInt aErrorCode )
+ {
+TFLOGSTRING2("TSY: CMmCustomSecurityTsy::CompleteCheckSecurityCode - Error code: %d", aErrorCode );
+ // reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ ESecurityRequestTypeCheckSecurityCode );
+
+ if ( ESecurityTsyReqHandleUnknown != reqHandle )
+ {
+ iMmCustomTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+
+ // If error is not KErrNone, then security code verify has failed and
+ // we need to cancel ECustomCheckSecurityCodeCancelIPC.
+ // If error is KErrCancel, we have already cancelled
+ // ECustomCheckSecurityCodeCancelIPC.
+ if ( ( KErrNone != aErrorCode ) && ( KErrCancel != aErrorCode ) )
+ {
+ TBool cancelFalse (EFalse);
+ CMmDataPackage aPackage;
+ aPackage.PackData( &iCodeID, &cancelFalse );
+
+ TRAP_IGNORE( void( iMmPhoneTsy->MessageManager()->HandleRequestL(
+ ECustomCheckSecurityCodeCancelIPC, &aPackage ) ); );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CheckSecurityCodeCancelL
+// This function cancels an check security code request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::CheckSecurityCodeCancelL()
+ {
+ // Send message to Security Server to check security code and
+ // intialize ret value. This is cancel request, so 3rd parameter
+ // is true to indicate that.
+ CMmDataPackage aPackage;
+ TBool trueCancel (ETrue);
+ aPackage.PackData( &iCodeID, &trueCancel );
+
+ TInt retValue ( iMmPhoneTsy->MessageManager()->HandleRequestL(
+ ECustomCheckSecurityCodeCancelIPC, &aPackage ) );
+
+ return retValue;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CompleteCheckSecurityCodeCancel
+// Completes a CheckSecurityCodeCancel request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::CompleteCheckSecurityCodeCancel()
+ {
+TFLOGSTRING("TSY: CMmCustomSecurityTsy::CompleteCheckSecurityCodeCancel");
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::DeliverCodeL
+// Brings required code to the Custom TSY.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::DeliverCodeL(
+ RMobilePhone::TCodeAndUnblockCode aCodes )
+ {
+ iSecCode.Copy( aCodes.iCode );
+
+ CMmDataPackage aPackage;
+ aPackage.PackData( &iSecCode );
+ iMmPhoneTsy->MessageManager()->HandleRequestL(
+ ECustomSecurityDeliverCodeIPC, &aPackage );
+
+TFLOGSTRING2( "TSY: CMmCustomSecurityTsy::DeliverCodeL iSecCode: %S", &iSecCode );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::DisablePhoneLockL
+// This method disables phone lock
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::DisablePhoneLockL(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TMobilePassword* aVerifyCode )
+ {
+ if ( NULL != iTsyReqHandleStore->GetTsyReqHandle(
+ ESecurityRequestTypeDisablePhoneLock ) )
+ {
+ return KErrServerBusy;
+ }
+
+ // Send message to Security Server to disable security code
+ // and intialize ret value
+ CMmDataPackage aPackage;
+ aPackage.PackData( aVerifyCode );
+ TInt retValue ( iMmPhoneTsy->MessageManager()->HandleRequestL(
+ ECustomDisablePhoneLockIPC, &aPackage ) );
+
+ // check result
+ if ( KErrNone != retValue )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, retValue );
+ }
+ else
+ {
+ // Save the req handle type
+ iReqHandleType = ESecurityRequestTypeDisablePhoneLock;
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::CompleteDisablePhoneLock
+// Completes a DisablePhoneLock request
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::CompleteDisablePhoneLock(
+ TInt aErrorCode )
+ {
+TFLOGSTRING2("TSY: CMmCustomSecurityTsy::CompleteDisablePhoneLock - Error code: %d", aErrorCode );
+ // reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ ESecurityRequestTypeDisablePhoneLock );
+
+ if ( ESecurityTsyReqHandleUnknown != reqHandle )
+ {
+ iMmCustomTsy->ReqCompleted( reqHandle, aErrorCode );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::GetActivePin
+// Returns the currently active PIN. The value is updated by
+// events coming from security server.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmCustomSecurityTsy::GetActivePin(
+ const TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TMobilePhoneSecurityCode* aActivePin )
+ {
+ *aActivePin = iActivePin;
+ iMmCustomTsy->ReqCompleted ( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmCustomSecurityTsy::SetActivePin
+// Updates the information of the currently active PIN.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmCustomSecurityTsy::SetActivePin(
+ CMmDataPackage* aDataPackage )
+ {
+ RMobilePhone::TMobilePhoneSecurityCode* activePin = NULL;
+ // Get the new data
+ aDataPackage->UnPackData( &activePin );
+
+ // Update the current information
+ iActivePin = *activePin;
+ }
+
+// End of File