sysstatemgmt/ssmpolicyplugins/ssmshutdownpolicy/src/ssmshutdownpolicy.cpp
changeset 0 4e1aa6a622a0
child 7 1fc153c72b60
--- /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 );
+    }