diff -r 000000000000 -r b497e44ab2fc terminalsecurity/SCP/SCPServer/src/SCPLockSettingEventHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/terminalsecurity/SCP/SCPServer/src/SCPLockSettingEventHandler.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,487 @@ +/* +* Copyright (c) 2000 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: Implementation of terminalsecurity components +* +*/ + + +// INCLUDE FILES +#include +#include + +#include +#include + + + +#include +#include // Property values +#include + + + +#include +#include +#include + +#include "SCPLockSettingEventHandler.h" +#include "SCPSession.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::CSCPLockSettingEventHandler() +// C++ default constructor +// +// Status : Approved +// --------------------------------------------------------- + +CSCPLockSettingEventHandler::CSCPLockSettingEventHandler( + const RMessage2& aLockMessage, + CSCPSession* aSession, + TBool aState, + TBool aAutolock, + CSCPServer* aServer + ) + :CSCPLockEventHandler( aServer ), + iLockMessage( aLockMessage ), + iSession( aSession ), + iState( aState ), + iAutolock( aAutolock ), + iWaitingForAck( EFalse ), + iAckReceived( EFalse ), + iUnlockSent( EFalse ), + iMessageStatus( KErrNone ) + { + Dprint( (_L("--> CSCPLockSettingEventHandler::CSCPLockSettingEventHandler()") )); + + Dprint( (_L("<-- CSCPLockSettingEventHandler::CSCPLockSettingEventHandler()") )); + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::ConstructL() +// Symbian 2nd phase constructor +// +// Status : Approved +// --------------------------------------------------------- + +void CSCPLockSettingEventHandler::ConstructL() + { + Dprint( (_L("--> CSCPLockSettingEventHandler::ConstructL()") )); + + BaseConstructL(); + + Dprint( (_L("<-- CSCPLockSettingEventHandler::ConstructL()") )); + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::StartL() +// Initiates the lock/unlock operation. +// +// Status : Approved +// --------------------------------------------------------- + +void CSCPLockSettingEventHandler::StartL() + { +#ifndef __WINS__ + + // If this is an unlock call, we must check whether SMS Lock or Autolock is active + // before disabling the DOS side lock. + if ( ( !iState ) && + ( ( CSCPSession::IsSMSLockActiveL() ) || + ( iSession->IsAutolockActive() ) ) + ) + { + Dprint( (_L("CSCPLockSettingEventHandler::ConstructL(): AL or SMS lock active,\ + leaving DOS lock on.") )); + + // Just unlock Symbian side, if Autolock handling specified + if ( iAutolock ) + { + TRAPD( err, SetAutolockStateL( EFalse ) ); + + if ( err == KErrNone ) + { + // Inform the session-class that an unlock-message has been sent + // (the server won't respond to Autolock until the handler finishes) + iSession->LockOperationPending( ESCPCommandUnlockPhone, &iStatus ); + iUnlockSent = ETrue; + SetActive(); // Wait for the session-class to complete this call + } + else + { + // Failed to signal autolock, this call is complete + iLockMessage.Complete( err ); + iSession->LockOperationCompleted(); + } + } + } + else // Set both the DOS side and the Symbian side locks, starting with SetLockSetting + { + RMobilePhone::TMobilePhoneLock lockType = RMobilePhone::ELockPhoneDevice; + + // Run the SetLockSetting-command, either to activate or to disable the lock + Dprint( (_L("CSCPLockSettingEventHandler::ConstructL():\ + Running SetLockSetting") )); + + if ( iState ) + { + iPhone->SetLockSetting( iStatus, lockType, RMobilePhone::ELockSetEnabled ); + } + else + { + iPhone->SetLockSetting( iStatus, lockType, RMobilePhone::ELockSetDisabled ); + } + + Dprint( (_L("CSCPLockSettingEventHandler::ConstructL(): Running SetActive") )); + + SetActive(); + } + +#else // __WINS__. In emulator we only care about Autolock + + if ( iAutolock ) + { + // Autolock activation/deactivation was requested + TRAPD( err, SetAutolockStateL( iState ) ); + + if ( err != KErrNone ) + { + // If the call failed, send the result as the message status + iMessageStatus = err; + } + else if ( !iState ) + { + // Inform the session-class that an unlock-message has been sent + // (the server won't respond to Autolock until the handler finishes) + iSession->LockOperationPending( ESCPCommandUnlockPhone, &iStatus ); + iUnlockSent = ETrue; + SetActive(); // Wait for the session-class to complete this call + } + else + { + // This call is complete, Autolock activated + iLockMessage.Complete( KErrNone ); + iSession->LockOperationCompleted(); + } + } + +#endif // __WINS__ + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::NewL() +// Static constructor. +// +// Status : Approved +// --------------------------------------------------------- + +CSCPLockSettingEventHandler* CSCPLockSettingEventHandler::NewL( + const RMessage2& aLockMessage, + CSCPSession* aSession, + TBool aState, + TBool aAutolock, + CSCPServer* aServer ) + { + Dprint( (_L("--> CSCPLockSettingEventHandler::NewL()") )); + + CSCPLockSettingEventHandler* self = CSCPLockSettingEventHandler::NewLC( aLockMessage, + aSession, aState, aAutolock, aServer ); + CleanupStack::Pop( self ); + + Dprint( (_L("<-- CSCPLockSettingEventHandler::NewL()") )); + return self; + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::NewLC() +// Static constructor, leaves object pointer to the cleanup stack. +// +// Status : Approved +// --------------------------------------------------------- + +CSCPLockSettingEventHandler* CSCPLockSettingEventHandler::NewLC( + const RMessage2& aLockMessage, + CSCPSession* aSession, + TBool aState, + TBool aAutolock, + CSCPServer* aServer ) + { + Dprint( (_L("--> CSCPLockSettingEventHandler::NewLC()") )); + + CSCPLockSettingEventHandler* self = new (ELeave) CSCPLockSettingEventHandler( + aLockMessage, aSession, aState, aAutolock, aServer ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + Dprint( (_L("<-- CSCPLockSettingEventHandler::NewLC()") )); + return self; + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::AckReceived() +// Destructor +// +// Status : Approved +// --------------------------------------------------------- + +CSCPLockSettingEventHandler::~CSCPLockSettingEventHandler() + { + Dprint( (_L("--> CSCPLockSettingEventHandler::~CSCPLockSettingEventHandler()") )); + + if ( IsActive() ) + { + Dprint( (_L("CSCPLockSettingEventHandler::\ + CSCPLockSettingEventHandler(): Cancelling call") )); + Cancel(); + } + + Dprint( (_L("<-- CSCPLockSettingEventHandler::~CSCPLockSettingEventHandler()") )); + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::AckReceived() +// Sets the ackReceived member to indicate that the call has +// already been acknowledged. +// +// Status : Approved +// --------------------------------------------------------- + +void CSCPLockSettingEventHandler::AckReceived() + { + iAckReceived = ETrue; + } + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::SetAutolockStateL( TBool aActive ) +// Activates Autolock by signalling the SA/PubSub event, or +// deactivates it by sending it the deactivation message. +// +// Status : Approved +// --------------------------------------------------------- + +void CSCPLockSettingEventHandler::SetAutolockStateL( TBool aActive ) + { + if ( aActive ) + { + // Activation call, set the admin flag and signal the lock event + + TInt tarmFlag = 0; + TInt tRet = RProperty::Get( KSCPSIDAutolock, SCP_TARM_ADMIN_FLAG_UID, tarmFlag ); + + if ( tRet == KErrNone ) + { + tarmFlag |= KSCPFlagAdminLock; + tRet = RProperty::Set( KSCPSIDAutolock, SCP_TARM_ADMIN_FLAG_UID, tarmFlag ); + } + + if ( tRet != KErrNone ) + { + #if defined(_DEBUG) + RDebug::Print(_L("CSCPLockSettingEventHandler::SetAutolockStateL():\ + FAILED to set TARM Admin Flag")); + #endif + } +#ifdef RD_REMOTELOCK + // ERemoteLocked is meant for Remote Locking using SMS. Mfe/USB charging needed the lock status to be Manual. + tRet = RProperty::Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, EManualLocked ); + +#else //RD_REMOTELOCK + + tRet = RProperty::Set(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, EAutolockOn ); + +#endif//RD_REMOTELOCK + + if ( tRet == KErrNone ) + { + Dprint( (_L("CSCPLockSettingEventHandler::SetAutolockStateL():\ + Autolock signalled OK") )); + } + else + { + Dprint( (_L("CSCPLockSettingEventHandler::SetAutolockStateL():\ + FAILED to signal Autolock: %d"), tRet )); + } + } + else + { + // Deactivation call, send the deactivation message to Autolock + RWsSession wsSession; + if ( wsSession.Connect() != KErrNone ) + { + Dprint( (_L("CSCPLockSettingEventHandler::SetAutolockStateL():\ + WsSession connection failed") )); + User::Leave( KErrGeneral ); + } + CleanupClosePushL( wsSession ); + + TApaTaskList taskList( wsSession ); + TApaTask task = taskList.FindApp( TUid::Uid( KSCPServerSIDAutolock ) ); // Autolock + + if ( task.Exists() ) + { + Dprint( (_L("CSCPLockSettingEventHandler::SetAutolockStateL():\ + Autolock task found, sending msg") )); + // No parameters, just a dummy buffer + TBuf8<8> buf; + buf.Zero(); + const TPtrC8& message = buf; + User::LeaveIfError( + task.SendMessage( TUid::Uid( SCP_CMDUID_UNLOCK ), message ) + ); + } + else + { + Dprint( (_L("CSCPLockSettingEventHandler::SetAutolockStateL():\ + Autolock task not found") )); + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy(); // wsSession + } + } + + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::RunL() +// Checks the status, and activates/deactivates autolock on success. +// +// Status : Approved +// --------------------------------------------------------- +// +void CSCPLockSettingEventHandler::RunL() + { + TInt ret = iStatus.Int(); + TBool finalCall = ETrue; + TBool startFinalPhase = EFalse; + + Dprint( (_L("--> CSCPLockSettingEventHandler::RunL()") )); + + if ( iUnlockSent ) // Received an acknowledgement for the unlock-message + { + if ( ret == KErrNone ) + { + Dprint( (_L("CSCPLockSettingEventHandler::RunL(): Unlock ack received") )); + } + else if ( ret == KErrCancel ) + { + Dprint( (_L("CSCPLockSettingEventHandler::RunL(): Unlock call TIMEOUT") )); + iMessageStatus = ret; + } + } + else if ( iWaitingForAck ) // Received an acknowledgement for the set lock setting call + { + if ( ret == KErrNone ) + { + Dprint( (_L("CSCPLockSettingEventHandler::RunL():\ + Acknowledgement received") )); + startFinalPhase = ETrue; + } + else if ( ret == KErrCancel ) + { + Dprint( (_L("CSCPLockSettingEventHandler::RunL():\ + Lock setting call TIMEOUT") )); + iMessageStatus = ret; + } + } + else // SetLockSetting completed + { + // Save the status of the lock setting call + iMessageStatus = ret; + + Dprint( (_L("CSCPLockSettingEventHandler::RunL():\ + SetLockSetting returned: %d"), ret )); + + if ( iAckReceived ) + { + Dprint( (_L("CSCPLockSettingEventHandler::RunL(): Ack already received") )); + startFinalPhase = ETrue; + } + else + { + iSession->LockOperationPending( ESCPCommandLockPhone, &iStatus ); + iWaitingForAck = ETrue; + finalCall = EFalse; + SetActive(); // Wait for the session-class to complete this call + } + } + + if ( ( startFinalPhase ) && ( iAutolock ) ) + { + // Autolock activation/deactivation was requested + TRAPD( err, SetAutolockStateL( iState ) ); + + if ( err != KErrNone ) + { + // If the call failed, send the result as the message status + iMessageStatus = err; + } + else if ( !iState ) + { + // Inform the session-class that an unlock-message has been sent + // (the server won't respond to Autolock until the handler finishes) + iSession->LockOperationPending( ESCPCommandUnlockPhone, &iStatus ); + iUnlockSent = ETrue; + finalCall = EFalse; + SetActive(); // Wait for the session-class to complete this call + } + } + + if ( finalCall ) + { + Dprint( (_L("CSCPLockSettingEventHandler::RunL():\ + Completing set lock state call, status: %d"), ret )); + + iLockMessage.Complete( iMessageStatus ); + // Inform the SessionBase class that this operation is complete + iSession->LockOperationCompleted(); + } + + Dprint( (_L("<-- CSCPLockSettingEventHandler::RunL()") )); + } + +// --------------------------------------------------------- +// void CSCPLockSettingEventHandler::DoCancel() +// Cancel function, aborts the TSY request +// +// Status : Approved +// --------------------------------------------------------- +// +void CSCPLockSettingEventHandler::DoCancel() + { + Dprint( (_L("--> CSCPLockSettingEventHandler::DoCancel()") )); + + if ( !iWaitingForAck ) + { + iPhone->CancelAsyncRequest( EMobilePhoneSetLockSetting ); + } + + iLockMessage.Complete( KErrCancel ); + iSession->LockOperationCompleted(); + + Dprint( (_L("<-- CSCPLockSettingEventHandler::DoCancel()") )); + } + + +// ================= OTHER EXPORTED FUNCTIONS ============== + +// End of File +