sysstatemgmt/systemstatemgr/test/tcmn/src/t_stateawaresessionwrapper.cpp
changeset 76 cb32bcc88bad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/src/t_stateawaresessionwrapper.cpp	Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,841 @@
+// Copyright (c) 2010 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: Test wrapper for RSsmStateAwareSession
+
+#include <e32std.h>
+#include <e32capability.h>
+#include <test/datawrapper.h>
+#include <ssm/ssmdomaindefs.h> 
+#include <ssm/ssmsubstates.hrh>
+#include <ssm/startupdomainpskeys.h>
+#include <e32debug.h>
+
+#include "t_stateawaresessionwrapper.h"
+
+//
+_LIT(KDomainId,                  "domainId"); 
+_LIT(KAcknowledge,               "acknowledge");
+_LIT(KError,                     "error");
+_LIT(KCancelDeferral,            "cancelDeferral");
+_LIT(KCount,                     "count"); 
+_LIT(KAckLastState,              "ackLastState");
+_LIT(KDeferTwice,                "deferTwice"); 
+
+//commands
+_LIT(KCmdNewL,                                      "NewL");
+_LIT(KCmdConnect,                                   "Connect");
+_LIT(KCmdReadIniData,                               "ReadIniData");
+_LIT(KCmdRequestStateNotification,                  "RequestStateNotification");
+_LIT(KCmdAcknowledgeStateNotification,              "AcknowledgeStateNotification");
+_LIT(KCmdClose,                                     "Close");
+_LIT(KCmdRequestStateNotificationCancel,            "RequestStateNotificationCancel");
+_LIT(KCmdAcknowledgeAndRequestStateNotification,    "AcknowledgeAndRequestStateNotification");
+_LIT(KCmdDeferAcknowledgement,                      "DeferAcknowledgement");
+_LIT(KCmdReturnCount,                               "ReturnCount");
+_LIT(KCmdDestructor,                                "~");
+
+/**
+ * Helper method to map the DomainIds.
+ */
+static TBool MapToDomainId(TPtrC& aDomainIdName, TDmDomainId& aDomainId);
+
+/**
+ * Constructor
+ */
+TIniData1::TIniData1()
+        : iCancelDeferral(EFalse)
+        , iAckLastState(EFalse)
+        , iDeferTwice(EFalse)
+        , iCount(0)
+        , iAcknowledge(ETrue)
+        {}
+
+/**
+ * Constructor
+ */
+TIniData2::TIniData2()
+        : iCount(0)
+        , iAcknowledge(ETrue)
+        {}
+
+/**
+ * Two phase constructor
+ */
+CTestRStateAwareSession1* CTestRStateAwareSession1::NewL()
+    {
+    CTestRStateAwareSession1*  testStateAwareSession = new (ELeave) CTestRStateAwareSession1();
+    CleanupStack::PushL(testStateAwareSession);
+    testStateAwareSession->ConstructL();
+    CleanupStack::Pop(testStateAwareSession);
+    return testStateAwareSession; 
+    }
+
+/**
+* @return pointer to the object that the data wraps
+*/
+TAny*  CTestRStateAwareSession1::GetObject()
+    {
+    return iSsmStateAwareSession;
+    }
+
+/**
+ * SetObjectL
+ */
+void CTestRStateAwareSession1::SetObjectL(TAny* aAny)
+    {
+    DoCleanup();
+    iSsmStateAwareSession=static_cast<RSsmStateAwareSession*> (aAny);
+    }
+
+/**
+ * DisownObjectL
+ */
+void CTestRStateAwareSession1::DisownObjectL()
+    {
+    iSsmStateAwareSession=NULL;
+    }
+
+/**
+ * Protected constructor. First phase construction
+ */
+CTestRStateAwareSession1::CTestRStateAwareSession1():
+CDataWrapper()
+    {
+    }
+
+/**
+ * Protected constructor. Second phase construction
+ */
+void CTestRStateAwareSession1::ConstructL()
+    {
+    iActiveNotifyOnChange = CActiveCallback::NewL(*this);
+    iActiveNotifyOnChange2 = CActiveCallback::NewL(*this);
+    }
+
+/**
+ * Destructor.
+ */
+CTestRStateAwareSession1::~CTestRStateAwareSession1()
+    {
+    DoCleanup();
+    delete iActiveNotifyOnChange;
+    delete iActiveNotifyOnChange2;
+    }
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand  the command to process
+ * @param aSection      the entry in the ini file requiring the command to be processed
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CTestRStateAwareSession1::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+    {
+    TBool retVal = ETrue;
+    if (aCommand == KCmdNewL)
+        {
+        DoCmdNew();
+        }
+    else if (aCommand == KCmdConnect)
+        {
+        DoCmdConnect(aSection);
+        }
+    else if (aCommand == KCmdReadIniData)
+        {
+        DoCmdReadIniData(aSection);
+        }
+    else if (aCommand == KCmdRequestStateNotification)
+        {
+        DoCmdRequestStateNotification(aAsyncErrorIndex);
+        }
+    else if (aCommand == KCmdAcknowledgeStateNotification)
+        {
+        DoCmdAcknowledgeStateNotification(aSection);
+        }
+    else if (aCommand == KCmdClose)
+        {
+        DoCmdClose();
+        }
+    else if (aCommand == KCmdRequestStateNotificationCancel)
+        {
+        DoCmdRequestStateNotificationCancel();
+        }
+    else if (aCommand == KCmdAcknowledgeAndRequestStateNotification)
+        {
+        DoCmdAcknowledgeAndRequestStateNotification(aSection, aAsyncErrorIndex);
+        }
+    else if (aCommand == KCmdDeferAcknowledgement)
+        {
+        DoCmdDeferAcknowledgement( aAsyncErrorIndex);
+        }
+    else if (aCommand == KCmdReturnCount)
+        {
+        DoCmdReturnCount(aSection);
+        }
+    else if (aCommand == KCmdDestructor)
+        {
+        DoCmdDestructor();
+        }
+    else
+        {
+        retVal = EFalse;
+        }    
+   
+    return retVal;
+    }
+
+/**
+ * Creates RSSmStateAwareSession class instance
+ */
+void CTestRStateAwareSession1::DoCmdNew()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: Create RSsmStateAwareSession class instance"));
+    DoCleanup();
+    
+    TRAPD(err, iSsmStateAwareSession = new (ELeave)RSsmStateAwareSession());
+    
+    if (err != KErrNone)
+        {
+        ERR_PRINTF2(_L("CTestRStateAwareSession1: new error %d"), err);
+        SetError(err);
+        }      
+    }
+
+/**
+ * Close RSsmStateAwareSession handle
+ */
+void CTestRStateAwareSession1::DoCmdClose()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: Close RSsmStateAwareSession"));
+    iSsmStateAwareSession->Close();
+    }
+
+/**
+ * Contains cleanup implementation
+ */
+void CTestRStateAwareSession1::DoCleanup()
+    {
+    if(iSsmStateAwareSession != NULL)
+        {
+        INFO_PRINTF1(_L("CTestRStateAwareSession1: Deleting current RSsmStateAwareSession"));
+        delete iSsmStateAwareSession;
+        iSsmStateAwareSession = NULL;
+        }
+    }
+
+/**
+ * Destroy RSsmStateAwareSession object
+ */
+void CTestRStateAwareSession1::DoCmdDestructor()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: Destroying the RStateAwareSession object"));
+    DoCleanup();
+    }
+
+/**
+ * Check whether the client is deferred expected no. of times 
+ */
+void CTestRStateAwareSession1::DoCmdReturnCount(const TDesC& aSection)
+    {
+    TInt expectedCount = 0;
+    if ( !GetIntFromConfig(aSection, KCount(), expectedCount))
+        {
+        ERR_PRINTF1(_L("CTestRStateAwareSession1: Error reading ini file data"));
+        SetError(KErrNotFound);        
+        }
+    if (iCount == expectedCount)
+        return;
+    ERR_PRINTF3(_L("CTestRStateAwareSession1: Actual count = %d, Expected count = %d"), iCount, expectedCount);
+    SetError(KErrGeneral);
+    }
+
+/*
+ * Helper function to read ini file data
+ */
+void CTestRStateAwareSession1::DoCmdReadIniData(const TDesC& aSection)
+    {
+    if( !GetIntFromConfig(aSection, KCount(), iIniData.iCount) ||
+        !GetBoolFromConfig(aSection, KCancelDeferral(), iIniData.iCancelDeferral) ||
+        !GetBoolFromConfig(aSection, KAckLastState(), iIniData.iAckLastState) ||
+        !GetBoolFromConfig(aSection, KDeferTwice(), iIniData.iDeferTwice) )
+        {
+        ERR_PRINTF1(_L("CTestRStateAwareSession1: Error reading ini file data"));
+        SetError(KErrNotFound);
+        }
+    }
+
+/**
+ * Connects a client to RSsmStateAwareSession with Domain Id
+ */
+void CTestRStateAwareSession1::DoCmdConnect(const TDesC& aSection)
+    {
+    TPtrC domainIdName;
+    if (!GetStringFromConfig(aSection, KDomainId(), domainIdName))
+        {
+        //set default domainId if value is not provided in .ini file
+        domainIdName.Set(_L("KSM2UiServicesDomain1"));        
+        }
+    TDmDomainId domainId;
+    if(MapToDomainId(domainIdName, domainId ))
+       {
+       INFO_PRINTF2(_L("CTestRStateAwareSession1: Calling RSsmStateAwareSession->Connect with domain id %S"), &domainIdName );
+       TInt  err = iSsmStateAwareSession->Connect(domainId);          
+       if (KErrNone != err)
+            {
+            ERR_PRINTF2(_L("CTestRStateAwareSession1: Connect() error %d"), err);
+            SetError(err);  
+            }       
+       } 
+    else
+        {
+        ERR_PRINTF2(_L("CTestRStateAwareSession1: Could not map %S to domain Id"), &domainIdName );
+        SetBlockResult(EFail);
+        }
+    }
+
+/**
+ * DoCmdRequestStateNotification 
+ */
+void CTestRStateAwareSession1::DoCmdRequestStateNotification(const TInt aAsyncErrorIndex)
+    {
+    INFO_PRINTF2(_L("CTestRStateAwareSession1: RequestStateNotification with Async Error Index: %d"), aAsyncErrorIndex);
+    iSsmStateAwareSession->RequestStateNotification(iActiveNotifyOnChange->iStatus);
+    iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+    IncOutstanding();    
+    }
+
+/**
+ * DoCmdAcknowledgeStateNotification
+ */
+void CTestRStateAwareSession1::DoCmdAcknowledgeStateNotification(const TDesC& aSection)
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: AcknowledgeStateNotification"));
+    TInt error;
+    if (!GetIntFromConfig(aSection, KError(), error ))
+        {
+        //set default error value if value is not provided in .ini file
+        error = KErrNone;
+        }
+   iSsmStateAwareSession->AcknowledgeStateNotification(error);    
+    }
+
+/**
+ * DoCmdAcknowledgeAndRequestStateNotification
+ */
+void CTestRStateAwareSession1::DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection, const TInt aAsyncErrorIndex)
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: AcknowledgeAndRequestStateNotification"));
+    TInt error;
+    if (!GetIntFromConfig(aSection, KError(), error ))
+        {
+        //set default error value if value is not provided in .ini file
+        error = KErrNone;
+        }
+    iSsmStateAwareSession->AcknowledgeAndRequestStateNotification(error, iActiveNotifyOnChange->iStatus );
+    iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+    IncOutstanding();        
+    }
+
+/**
+ * DoCmdRequestStateNotificationCancel
+ */
+void CTestRStateAwareSession1::DoCmdRequestStateNotificationCancel()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: RequestStateNotificationCancel is called "));
+    iSsmStateAwareSession->RequestStateNotificationCancel();
+    }
+
+void CTestRStateAwareSession1::DoCmdDeferAcknowledgement(const TInt aAsyncErrorIndex)
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: DeferAcknowledgement is called"));
+    iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+    iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+    IncOutstanding();
+    }
+
+void CTestRStateAwareSession1::RunL(CActive* aActive, TInt aIndex)
+    {
+    TInt error = KErrNone;
+
+    if ( aActive == iActiveNotifyOnChange )
+        {
+        error = iActiveNotifyOnChange->iStatus.Int();
+        switch ( error )
+            {
+            case KErrNone:
+                {  
+                //Request has completed i.e. The member must either defer again or acknowledge.
+                TSsmState currentState = iSsmStateAwareSession->State(); 
+                // This component only responds to Shutdown state events.
+                if ( (currentState.MainState() == ESsmShutdown) &&
+                     (currentState.SubState() == ESsmShutdownSubStateCritical || currentState.SubState() == ESsmShutdownSubStateNonCritical) )
+                    {
+                    if( iCount < iIniData.iCount )
+                        {
+                        iCount++;
+                        iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+                        iActiveNotifyOnChange->Activate(aIndex);
+                        IncOutstanding();                    
+                        if( iIniData.iDeferTwice )
+                            {
+                            iCount++;
+                            iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange2->iStatus);
+                            iActiveNotifyOnChange2->Activate(aIndex);
+                            IncOutstanding();
+                            }
+                        else if( iIniData.iAckLastState )
+                            {
+                            iSsmStateAwareSession->AcknowledgeStateNotification(KErrNone);
+                            }
+                        else if( iIniData.iCancelDeferral )
+                            {
+                            iSsmStateAwareSession->CancelDeferral();
+                            }
+                        }
+                    else
+                        {
+                        //Acknowledge with success
+                        if (iIniData.iAcknowledge)
+                            {
+                            iSsmStateAwareSession->AcknowledgeStateNotification(KErrNone);
+                            }
+                        }
+                    }  
+                break;
+                }
+            default:
+                {
+                // Error
+                INFO_PRINTF2(_L("CTestRStateAwareSession1: Test returned with error = %d"),error);
+                SetAsyncError(aIndex, error);
+                }
+            }   
+        }
+    else if ( aActive == iActiveNotifyOnChange2 )
+        {
+        error = iActiveNotifyOnChange2->iStatus.Int();
+        SetAsyncError(aIndex, error);
+        }
+    DecOutstanding();
+    }
+
+/**
+ Virtual DoCancel - Request to cancel the asynchronous command
+ @see - MTPActiveCallback
+ @param aActive Active Object that DoCancel has been called on
+ @pre - N/A
+ @post - N/A
+ @leave system wide error code
+*/
+void CTestRStateAwareSession1::DoCancel(CActive* aActive, TInt aIndex)
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession1: DoCancel"));
+    if(aActive ==  iActiveNotifyOnChange) 
+        {
+        TInt err =  iActiveNotifyOnChange->iStatus.Int(); 
+        if (err != KErrNone)
+            {
+            ERR_PRINTF2(_L("CTestRStateAwareSession1: DoCancel Error %d"), err);
+            SetAsyncError(aIndex, err);
+            }
+        }
+    else if(aActive == iActiveNotifyOnChange2)
+        {
+        TInt err =  iActiveNotifyOnChange2->iStatus.Int(); 
+        if (err != KErrNone)
+            {
+            ERR_PRINTF2(_L("CTestRStateAwareSession1: DoCancel Error %d"), err);
+            SetAsyncError(aIndex, err);
+            }
+        }
+    DecOutstanding();   
+    }
+
+/**
+ * Helper method to map the DomainIds. This can be extendable for other domain Ids
+ */
+static TBool MapToDomainId(TPtrC& aDomainIdName, TDmDomainId& aDomainId)
+    {
+    TBool ret = ETrue;
+    if (!(aDomainIdName.Compare(_L("KSM2UiServicesDomain1"))))
+        {
+        aDomainId = KSM2UiServicesDomain1;
+        }
+    else if (!(aDomainIdName.Compare(_L("KSM2HALDomain2"))))
+        {
+        aDomainId = KSM2HALDomain2;
+        }
+    else if (!(aDomainIdName.Compare(_L("KSM2HALDomain3"))))
+        {
+        aDomainId = KSM2HALDomain3;  
+        }
+    else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain1"))))
+        {
+        aDomainId = KSM2AppServicesDomain1;  
+        }
+    else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain2"))))
+        {
+        aDomainId = KSM2AppServicesDomain2;  
+        }
+    else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain3"))))
+        {
+        aDomainId = KSM2AppServicesDomain3;  
+        } 
+    else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain4"))))
+        {
+        aDomainId = KSM2AppServicesDomain4;  
+        } 
+    else 
+        {
+        ret = EFalse;
+        }   
+    return ret;
+    }
+
+
+/**
+ * Two phase constructor
+ */
+CTestRStateAwareSession2* CTestRStateAwareSession2::NewL()
+    {
+    CTestRStateAwareSession2*  testStateAwareSession = new (ELeave) CTestRStateAwareSession2();
+    CleanupStack::PushL(testStateAwareSession);
+    testStateAwareSession->ConstructL();
+    CleanupStack::Pop(testStateAwareSession);
+    return testStateAwareSession; 
+    }
+
+/**
+* @return pointer to the object that the data wraps
+*/
+TAny*  CTestRStateAwareSession2::GetObject()
+    {
+    return iSsmStateAwareSession;
+    }
+
+/**
+ * SetObjectL
+ */
+void CTestRStateAwareSession2::SetObjectL(TAny* aAny)
+    {
+    DoCleanup();
+    iSsmStateAwareSession=static_cast<RSsmStateAwareSession*> (aAny);
+    }
+
+/**
+ * DisownObjectL
+ */
+void CTestRStateAwareSession2::DisownObjectL()
+    {
+    iSsmStateAwareSession=NULL;
+    }
+
+/**
+ * Protected constructor. First phase construction
+ */
+CTestRStateAwareSession2::CTestRStateAwareSession2():
+CDataWrapper()
+    {
+    }
+
+/**
+ * Protected constructor. Second phase construction
+ */
+void CTestRStateAwareSession2::ConstructL()
+    {
+    iActiveNotifyOnChange = CActiveCallback::NewL(*this);
+    }
+
+/**
+ * Destructor.
+ */
+CTestRStateAwareSession2::~CTestRStateAwareSession2()
+    {
+    DoCleanup();
+    delete iActiveNotifyOnChange;
+    }
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand  the command to process
+ * @param aSection      the entry in the ini file requiring the command to be processed
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CTestRStateAwareSession2::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+    {
+    TBool retVal = ETrue;
+    if (aCommand == KCmdNewL)
+        {
+        DoCmdNew();
+        }
+    else if (aCommand == KCmdConnect)
+        {
+        DoCmdConnect(aSection);
+        }
+    else if (aCommand == KCmdReadIniData)
+        {
+        DoCmdReadIniData(aSection);
+        }
+    else if (aCommand == KCmdRequestStateNotification)
+        {
+        DoCmdRequestStateNotification(aAsyncErrorIndex);
+        }
+    else if (aCommand == KCmdAcknowledgeStateNotification)
+        {
+        DoCmdAcknowledgeStateNotification(aSection);
+        }
+    else if (aCommand == KCmdClose)
+        {
+        DoCmdClose();
+        }
+    else if (aCommand == KCmdRequestStateNotificationCancel)
+        {
+        DoCmdRequestStateNotificationCancel();
+        }
+    else if (aCommand == KCmdAcknowledgeAndRequestStateNotification)
+        {
+        DoCmdAcknowledgeAndRequestStateNotification(aSection, aAsyncErrorIndex);
+        }
+    else if (aCommand == KCmdDestructor)
+        {
+        DoCmdDestructor();
+        }
+    else
+        {
+        retVal = EFalse;
+        }    
+   
+    return retVal;
+    }
+
+/**
+ * Creates RSSmStateAwareSession class instance
+ */
+void CTestRStateAwareSession2::DoCmdNew()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession2: Create RSsmStateAwareSession class instance"));
+    DoCleanup();
+    
+    TRAPD(err, iSsmStateAwareSession = new (ELeave)RSsmStateAwareSession());
+    
+    if (err != KErrNone)
+        {
+        ERR_PRINTF2(_L("CTestRStateAwareSession2: new error %d"), err);
+        SetError(err);
+        }      
+    }
+
+/**
+ * Close RSsmStateAwareSession handle
+ */
+void CTestRStateAwareSession2::DoCmdClose()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession2: Close RSsmStateAwareSession"));
+    iSsmStateAwareSession->Close();
+    }
+
+/**
+ * Contains cleanup implementation
+ */
+void CTestRStateAwareSession2::DoCleanup()
+    {
+    if(iSsmStateAwareSession != NULL)
+        {
+        INFO_PRINTF1(_L("CTestRStateAwareSession2: Deleting current RSsmStateAwareSession"));
+        delete iSsmStateAwareSession;
+        iSsmStateAwareSession = NULL;
+        }
+    }
+
+/**
+ * Destroy RSsmStateAwareSession object
+ */
+void CTestRStateAwareSession2::DoCmdDestructor()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession2: Destroying the RStateAwareSession object"));
+    DoCleanup();
+    }
+
+/**
+ * Connects a client to RSsmStateAwareSession with Domain Id
+ */
+void CTestRStateAwareSession2::DoCmdConnect(const TDesC& aSection)
+    {
+    TPtrC domainIdName;
+    if (!GetStringFromConfig(aSection, KDomainId(), domainIdName))
+        {
+        //set default domainId if value is not provided in .ini file
+        domainIdName.Set(_L("KSM2UiServicesDomain1"));        
+        }
+    TDmDomainId domainId;
+    if(MapToDomainId(domainIdName, domainId ))
+       {
+       INFO_PRINTF2(_L("CTestRStateAwareSession2: Calling RSsmStateAwareSession->Connect with domain id %S"), &domainIdName );
+       TInt  err = iSsmStateAwareSession->Connect(domainId);          
+       if (KErrNone != err)
+            {
+            ERR_PRINTF2(_L("CTestRStateAwareSession2: Connect() error %d"), err);
+            SetError(err);  
+            }       
+       } 
+    else
+        {
+        ERR_PRINTF2(_L("CTestRStateAwareSession2: Could not map %S to domain Id"), &domainIdName );
+        SetBlockResult(EFail);
+        }
+    }
+
+/*
+ * Helper function to read ini file data
+ */
+void CTestRStateAwareSession2::DoCmdReadIniData(const TDesC& aSection)
+{
+    if( !GetIntFromConfig(aSection,KCount(), iIniData.iCount) ||
+        !GetBoolFromConfig(aSection,KAcknowledge(), iIniData.iAcknowledge) )
+        {
+        ERR_PRINTF1(_L("Error reading ini file data"));
+        SetError(KErrNotFound);
+        }
+}
+
+/**
+ * DoCmdRequestStateNotification 
+ */
+void CTestRStateAwareSession2::DoCmdRequestStateNotification(const TInt aAsyncErrorIndex)
+    {
+    INFO_PRINTF2(_L("CTestRStateAwareSession2: RequestStateNotification with Asyc Error Index: %d"), aAsyncErrorIndex);
+    iSsmStateAwareSession->RequestStateNotification(iActiveNotifyOnChange->iStatus);
+    iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+    IncOutstanding();    
+    }
+
+/**
+ * DoCmdAcknowledgeStateNotification
+ */
+void CTestRStateAwareSession2::DoCmdAcknowledgeStateNotification(const TDesC& aSection)
+    {
+    TInt error;
+    if (!GetIntFromConfig(aSection, KError(), error ))
+        {
+        //set default error value if value is not provided in .ini file
+        error = KErrNone;
+        }
+   iSsmStateAwareSession->AcknowledgeStateNotification(error);    
+    }
+
+/**
+ * DoCmdAcknowledgeAndRequestStateNotification
+ */
+void CTestRStateAwareSession2::DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection, const TInt aAsyncErrorIndex)
+    {
+    TInt error;
+    if (!GetIntFromConfig(aSection, KError(), error ))
+        {
+        //set default error value if value is not provided in .ini file
+        error = KErrNone;
+        }
+    iSsmStateAwareSession->AcknowledgeAndRequestStateNotification(error, iActiveNotifyOnChange->iStatus );
+    iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+    IncOutstanding();        
+    }
+
+/**
+ * DoCmdRequestStateNotificationCancel
+ */
+void CTestRStateAwareSession2::DoCmdRequestStateNotificationCancel()
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession2: RequestStateNotificationCancel is called "));
+    iSsmStateAwareSession->RequestStateNotificationCancel();
+    }
+
+/**
+ Virtual RunL - Called on completion of an asynchronous command
+ @see MTPActiveCallback
+ @param aActive Active Object that RunL has been called on
+ @pre N/A
+ @post N/A
+ @leave system wide error code
+*/
+void CTestRStateAwareSession2::RunL(CActive* aActive, TInt aIndex)
+    {
+    TInt error = KErrNone;
+
+    if (aActive == iActiveNotifyOnChange)
+        {
+        error = iActiveNotifyOnChange->iStatus.Int();
+        if (error == KErrNone)
+            {
+            // Request has completed i.e. The member must either defer again or acknowledge.
+            TSsmState currentState = iSsmStateAwareSession->State(); 
+            // This component only responds to Shutdown state events.
+            if ( (currentState.MainState() == ESsmShutdown) &&
+                 (currentState.SubState() == ESsmShutdownSubStateCritical || currentState.SubState() == ESsmShutdownSubStateNonCritical) )
+                {
+                if(iCount < iIniData.iCount)
+                    {
+                    iCount++;
+                    iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+                    iActiveNotifyOnChange->Activate(aIndex);
+                    IncOutstanding();
+                    }
+                else
+                    {
+                    //Acknowledge with success/failure
+                    if (iIniData.iAcknowledge)
+                        {
+                        iSsmStateAwareSession->AcknowledgeStateNotification(KErrNone);
+                        }
+                    }
+                }
+            else
+                {
+                INFO_PRINTF1(_L("CTestRStateAwareSession2: Deferring acknowledgement for a state that doesn't support transition monitoring"));
+                iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+                iActiveNotifyOnChange->Activate(aIndex);
+                IncOutstanding();
+                }
+            }
+        else
+            {
+            INFO_PRINTF2(_L("CTestRStateAwareSession2: RunL Error %d"), error);
+            SetAsyncError(aIndex, error);
+            }       
+        }
+    DecOutstanding();
+    }
+
+/**
+ Virtual DoCancel - Request to cancel the asynchronous command
+ @see - MTPActiveCallback
+ @param aActive Active Object that DoCancel has been called on
+ @pre - N/A
+ @post - N/A
+ @leave system wide error code
+*/
+void CTestRStateAwareSession2::DoCancel(CActive* aActive, TInt aIndex)
+    {
+    INFO_PRINTF1(_L("CTestRStateAwareSession2: DoCancel"));
+    if(aActive ==  iActiveNotifyOnChange) 
+        {
+        TInt err =  iActiveNotifyOnChange->iStatus.Int(); 
+        if (err!=KErrNone)
+            {
+            ERR_PRINTF2(_L("CTestRStateAwareSession2: DoCancel Error %d"), err);
+            SetAsyncError(aIndex, err);
+            }
+        }   
+    DecOutstanding();   
+    }