diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatereferenceplugins/custcmd/src/cmddevicesecuritycheck.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatereferenceplugins/custcmd/src/cmddevicesecuritycheck.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,308 @@ +// Copyright (c) 2008-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: +// Name : strtdevlockcheck.cpp +// Part of : System Startup / StrtDevLockPlg +// Implementation of CStrtDevLockCheck class. +// Version : %version: 1 % +// This material, including documentation and any related computer +// programs, is protected by copyright controlled by Nokia. All +// rights are reserved. Copying, including reproducing, storing, +// adapting or translating, any or all of this material requires the +// prior written consent of Nokia. This material also contains +// confidential information which may not be disclosed to others +// without the prior written consent of Nokia. +// Template version: 4.1.1 +// Nokia Core OS * +// File renamed from strtdevlockcheck.cpp to cmddevicesecuritycheck.cpp as part of Core OS transfer. +// + + + + +/** + @file + @internalComponent + @released +*/ + +#include "ssmsecuritychecknotifier.h" +#include "cmddevicesecuritycheck.h" +#include "ssmuiproviderdll.h" +#include "ssmrefcustomcmdcommon.h" +#include "ssmdebug.h" + +CCustomCmdDeviceSecurityCheck* CCustomCmdDeviceSecurityCheck::NewL() + { + CCustomCmdDeviceSecurityCheck* self = new (ELeave) CCustomCmdDeviceSecurityCheck(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CCustomCmdDeviceSecurityCheck::ConstructL() + { + TInt errorCode = iServer.Connect(); + + if(KErrNone != errorCode) + { + DEBUGPRINT2A("Failed to connect to TelServer with error %d", errorCode); + User::Leave(errorCode); + } + + iTsyModuleName = CSsmUiSpecific::GetTsyModuleNameL(); + errorCode = iServer.LoadPhoneModule(*iTsyModuleName); + + if (KErrNone != errorCode && KErrAlreadyExists != errorCode) + { + // KErrAlreadyExists may be returned if some other has already loaded + // the TSY module. + DEBUGPRINT2A("Failed to load phone module with error %d", errorCode); + User::Leave(errorCode); + } + + HBufC* tsyPhoneName = CSsmUiSpecific::PhoneTsyNameL(); + errorCode = iPhone.Open(iServer, *tsyPhoneName); + delete tsyPhoneName; + + if(KErrNone != errorCode) + { + DEBUGPRINT2A("Failed to open phone subsession with error %d", errorCode); + User::Leave(errorCode); + } + + //Add active object to active scheduler + CActiveScheduler::Add(this); + } + +CCustomCmdDeviceSecurityCheck::CCustomCmdDeviceSecurityCheck() + : CActive(EPriorityStandard), + iState(EGetLockPhoneDevice), + iLockInfoPckg(iLockInfo) + { + } + +CCustomCmdDeviceSecurityCheck::~CCustomCmdDeviceSecurityCheck() + { + ExecuteCancel(); + delete iSsmSecurityCheckNotifier; + + iPhone.Close(); + if (iServer.Handle()) + { + iServer.UnloadPhoneModule(*iTsyModuleName); + iServer.Close(); + } + delete iTsyModuleName; + } + +TInt CCustomCmdDeviceSecurityCheck::Initialize(CSsmCustomCommandEnv* /*aCmdEnv*/) + { + return KErrNone; + } + +void CCustomCmdDeviceSecurityCheck::Close() + { + } + +void CCustomCmdDeviceSecurityCheck::Release() + { + delete this; + } + +void CCustomCmdDeviceSecurityCheck::Execute(const TDesC8& /*aParams*/, TRequestStatus& aStatus) + { + //Set the user request to pending + aStatus = KRequestPending; + iExecuteRequest = &aStatus; + +#ifdef __WINS__ +#ifdef TEST_CUSTCMD_MACRO + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); +#else + // The device lock status can not be read in the emulator. + // Just pretend the lock is not enabled. + TInt errorCode = RProperty::Set(CSsmUiSpecific::StarterPSUid(), KStarterSecurityPhase, EStarterSecurityPhaseSimOk); + CompleteClientRequest(errorCode); +#endif //TEST_CUSTCMD_MACRO + +#else + if (CSsmUiSpecific::IsNormalBoot() || CSsmUiSpecific::IsSimChangedReset()) + { + iPhone.GetLockInfo( iStatus, RMobilePhone::ELockPhoneDevice, iLockInfoPckg ); + SetActive(); + } + else + { + TInt errorCode = RProperty::Set( + CSsmUiSpecific::StarterPSUid(), KStarterSecurityPhase, EStarterSecurityPhaseSecOk ); + CompleteClientRequest( errorCode ); + } +#endif //__WINS__ + } + +void CCustomCmdDeviceSecurityCheck::ExecuteCancel() + { + //Call cancel method of CActive + Cancel(); + } + +void CCustomCmdDeviceSecurityCheck::RunL() + { + switch (iState) + { + case EGetLockPhoneDevice: + LockPhoneDeviceRespReceivedL(); + break; + case EGetLockPhoneToIcc: + LockPhoneToIccRespReceivedL(); + break; + case EQuerySecCode: + SecCodeQueryRespReceivedL(); + break; + default: + __ASSERT_ALWAYS((iState <= EDeviceSecurityCheckNone) || (iState >= EDeviceSecurityCheckMaxState), + PanicNow(KPanicCustomCmdDeviceSecurityCheck, EInvalidDeviceSecurityState)); + break; + } + } + +void CCustomCmdDeviceSecurityCheck::LockPhoneDeviceRespReceivedL() + { + if (iStatus.Int() == KErrNone) + { + DEBUGPRINT3A("ELockPhoneDevice: status: %d, setting: %d", + iLockInfo.iStatus, iLockInfo.iSetting); + + DEBUGPRINT3A("ELockPhoneDevice: RMobilePhone::EStatusLocked: %d, RMobilePhone::ELockSetEnabled: %d", + RMobilePhone::EStatusLocked, RMobilePhone::ELockSetEnabled); + + //Ask for security code if status is locked and lock is enabled + if (iLockInfo.iStatus == RMobilePhone::EStatusLocked && + iLockInfo.iSetting == RMobilePhone::ELockSetEnabled) + { + QuerySecCodeL(); + } + else + { + DEBUGPRINT2A("ELockPhoneDevice: Check ELockPhoneToICC while SimPresent = %d", CSsmUiSpecific::IsSimPresent()); + iState = EGetLockPhoneToIcc; + iPhone.GetLockInfo( + iStatus, RMobilePhone::ELockPhoneToICC, iLockInfoPckg ); + SetActive(); + } + } + else + { + CompleteClientRequest(iStatus.Int()); + } + } + +void CCustomCmdDeviceSecurityCheck::LockPhoneToIccRespReceivedL() + { + if (iStatus.Int() == KErrNone) + { + DEBUGPRINT4A("1ELockPhoneDevice: status: %d, setting: %d, IsSimPresent: %d", + iLockInfo.iStatus, iLockInfo.iSetting, CSsmUiSpecific::IsSimPresent()); + + DEBUGPRINT3A("1ELockPhoneDevice: RMobilePhone::EStatusLocked: %d, RMobilePhone::ELockSetEnabled: %d", + RMobilePhone::EStatusLocked, RMobilePhone::ELockSetEnabled); + + if (iLockInfo.iSetting == RMobilePhone::ELockSetEnabled && + (EFalse == CSsmUiSpecific::IsSimPresent() || ( iLockInfo.iStatus == RMobilePhone::EStatusLocked))) + { + QuerySecCodeL(); + } + else + { + CompleteClientRequest(iStatus.Int()); + } + } + else + { + CompleteClientRequest(iStatus.Int()); + } + } + +void CCustomCmdDeviceSecurityCheck::SecCodeQueryRespReceivedL() + { + __ASSERT_DEBUG(NULL != iSsmSecurityCheckNotifier, PanicNow(KPanicCustomCmdDeviceSecurityCheck, ECmdNullPtr)); + if (iStatus.Int() == KErrNone && iSsmSecurityCheckNotifier->SecurityCheckResult() == KErrNone) + { + CompleteClientRequest(KErrNone); + } + else if (iStatus.Int() != KErrNone) + { + // Fatal error + CompleteClientRequest(iStatus.Int()); + } + else + { + // Wrong code, try again + QuerySecCodeL(); + } + } + +void CCustomCmdDeviceSecurityCheck::QuerySecCodeL() + { + iState = EQuerySecCode; + TInt errorCode = KErrNone; + + if (!iSsmSecurityCheckNotifier) + { + TRAP(errorCode, iSsmSecurityCheckNotifier = CSsmSecurityCheckNotifier::NewL(ESecCodePasswd)); + } + + if (KErrNone == errorCode) + { + iSsmSecurityCheckNotifier->ShowNoteL(iStatus); + SetActive(); + } + else + { + DEBUGPRINT2A("Failed to create CSsmSecurityCheckNotifier with error %d", errorCode); + CompleteClientRequest(errorCode); + } + } + +void CCustomCmdDeviceSecurityCheck::DoCancel() + { + if (iSsmSecurityCheckNotifier) + { + iSsmSecurityCheckNotifier->Cancel(); + } + iPhone.CancelAsyncRequest(EMobilePhoneGetLockInfo); + CompleteClientRequest(KErrCancel); + } + +TInt CCustomCmdDeviceSecurityCheck::RunError(TInt aError) + { + //Call cancel method of CActive + Cancel(); + CompleteClientRequest(aError); + return KErrNone; + } + +void CCustomCmdDeviceSecurityCheck::CompleteClientRequest(TInt aReason) + { + //Complete client request with reason code + if (iExecuteRequest) + { + TInt errorCode = RProperty::Set(CSsmUiSpecific::StarterPSUid(), KStarterSecurityPhase, + aReason == KErrNone ? EStarterSecurityPhaseSecOk : EStarterSecurityPhaseSecNok ); + User::RequestComplete(iExecuteRequest, aReason); + } + }