--- /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 <centralrepository.h>
+#include <ssm/ssmclayer.h>
+#include <ssm/ssmstate.h>
+#include <ssm/ssmstatetransition.h>
+#include <ssm/starterclient.h>
+#include <ssm/starterdomaincrkeys.h>
+
+#include "ssmsubstateext.hrh"
+#include "ssmmapperutility.h"
+#include "ssmshutdownpolicy.h"
+#include "trace.h"
+
+/**
+* Shutdown state policy resource file path format :
+* "\private\<SID of SSM>\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 );
+ }