diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/ssmpolicyplugins/ssmshutdownpolicy/src/ssmshutdownpolicy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/ssmpolicyplugins/ssmshutdownpolicy/src/ssmshutdownpolicy.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,220 @@ +/* +* Copyright (c) 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: Implementation of CSsmShutdownPolicy class. +* +*/ + +#include +#include +#include +#include +#include +#include + +#include "ssmsubstateext.hrh" +#include "ssmmapperutility.h" +#include "ssmshutdownpolicy.h" +#include "trace.h" + +/** +* Shutdown state policy resource file path format : +* "\private\\shutdown\" +*/ +_LIT( KCommandListPath, "Z:\\private\\2000D75B\\shutdown\\" ); + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// FromStarterReasonToCenRep +// --------------------------------------------------------------------------- +// +static TInt FromStarterReasonToCenRep( const TInt aReasonCode ) + { + FUNC_LOG; + INFO_1( "Startup reason from RStarterSession %d", aReasonCode ); + + switch ( aReasonCode ) + { + case KSsmCLayerPowerOffReason: return ENormalStartup; + case RStarterSession::ELanguageSwitchReset: return ELanguageSwitchReset; + case RStarterSession::ENormalRFSReset: return ENormalRFSReset; + case RStarterSession::EDeepRFSReset: return EDeepRFSReset; + case RStarterSession::EOperatorSettingReset: return EOperatorSettingReset; + case RStarterSession::ENetworkModeChangeReset: return ENetworkModeChangeReset; + case RStarterSession::ESIMStatusChangeReset: return ESIMStatusChangeReset; + case RStarterSession::EDRMReset: return EDRMReset; + case RStarterSession::EFirmwareUpdate: return EFirmwareUpdate; + case RStarterSession::EDataRestoreReset: return EDataRestoreReset; + case RStarterSession::EFieldTestReset: return EFieldTestReset; + case RStarterSession::EUnknownReset: + default: + return EUnknownReset; + } + } + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::NewL +// --------------------------------------------------------------------------- +// +EXPORT_C MSsmStatePolicy* CSsmShutdownPolicy::NewL() + { + CSsmShutdownPolicy* self = new( ELeave ) CSsmShutdownPolicy; + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::~CSsmShutdownPolicy +// --------------------------------------------------------------------------- +// +CSsmShutdownPolicy::~CSsmShutdownPolicy() + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::GetNextState +// --------------------------------------------------------------------------- +// +TBool CSsmShutdownPolicy::GetNextState( + TSsmState aCurrentTransition, + TInt aReason, + TInt ERROR_PARAM( aError ), + TInt ERROR_PARAM( aSeverity ), + TSsmState& aNextState ) + { + FUNC_LOG; + INFO_3( "Current state %04x.%04x, reason %d", + aCurrentTransition.MainState(), aCurrentTransition.SubState(), aReason ); + ERROR_1( aError, "State transition resulted in an error, severity %d", aSeverity ); + ASSERT_TRACE( aCurrentTransition.MainState() == ESsmShutdown ); + + TBool moreToCome = EFalse; + switch( aCurrentTransition.SubState() ) + { + case ESsmErrorShutdown: + case KSsmAnySubState: + case ESsmNormalShutdown: // Fall through + aNextState = TSsmState( ESsmShutdown, ESsmShutdownSubStateCritical ); + moreToCome = ETrue; + break; + case ESsmShutdownSubStateCritical: + aNextState = TSsmState( ESsmShutdown, ESsmShutdownSubStateNonCritical ); + moreToCome = ETrue; + break; + case ESsmShutdownSubStateNonCritical: + aNextState = TSsmState( ESsmShutdown, ESsmShutdownSubStatePowerOff ); + moreToCome = ETrue; + break; + default: + break; + } + + if ( aCurrentTransition.SubState() == ESsmErrorShutdown ) + { + TRAPD_ERR( errorCode, StoreStartupReasonL( EUnknownReset ) ); + ERROR( errorCode, "Failed to store startup reason" ); + } + else if ( aCurrentTransition.SubState() == KSsmAnySubState || + aCurrentTransition.SubState() == ESsmNormalShutdown ) + { + // This needs to be done before Startup adaptation shutdown command + TRAPD_ERR( errorCode, StoreStartupReasonL( + FromStarterReasonToCenRep( aReason ) ) ); + ERROR( errorCode, "Failed to store startup reason" ); + } + + return moreToCome; + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::CSsmShutdownPolicy +// --------------------------------------------------------------------------- +// +CSsmShutdownPolicy::CSsmShutdownPolicy() + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::GetCommandListPathL +// --------------------------------------------------------------------------- +// +void CSsmShutdownPolicy::GetCommandListPathL( TDes& aCmdListPath ) + { + FUNC_LOG; + + aCmdListPath.Format( KCommandListPath ); + iUtil->GetCommandListPath( aCmdListPath ); + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::IsAllowedTargetState +// --------------------------------------------------------------------------- +// +TBool CSsmShutdownPolicy::IsAllowedTargetState( + const TSsmStateTransition& INFO_PARAM(aRequest) ) const + { + FUNC_LOG; + + INFO_2( "Requested target state = %04x.%04x", + aRequest.State().MainState(), aRequest.State().SubState() ); + + return EFalse; + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::TargetSubState +// --------------------------------------------------------------------------- +// +TUint16 CSsmShutdownPolicy::TargetSubState( const TUint16 aRequestedSubState ) + { + FUNC_LOG; + INFO_1( "Requested sub state %04x", aRequestedSubState ); + + TUint16 subState = ( aRequestedSubState == KSsmAnySubState ) ? + ESsmNormalShutdown : aRequestedSubState; + + INFO_1( "Target sub state %04x", subState ); + return subState; + } + + +// --------------------------------------------------------------------------- +// CSsmShutdownPolicy::StoreStartupReasonL +// --------------------------------------------------------------------------- +// +void CSsmShutdownPolicy::StoreStartupReasonL( const TInt aReasonCode ) + { + FUNC_LOG; + INFO_1( "Storing startup reason %d", aReasonCode ); + + CRepository* repository = + CRepository::NewLC( iUtil->CrUid( KCRUidStartup ) ); + TInt errorCode = repository->Set( KStartupReason, aReasonCode ); + ERROR( errorCode, "Failed to set KStartupReason CenRep key" ); + CleanupStack::PopAndDestroy( repository ); + User::LeaveIfError( errorCode ); + }