sysstatemgmt/systemstatereferenceplugins/custcmd/src/cmdpublishstartupmode.cpp
changeset 0 4e1aa6a622a0
child 20 1ddbe54d0645
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatereferenceplugins/custcmd/src/cmdpublishstartupmode.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,229 @@
+// 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:
+//
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#include <ssm/starterdomaincrkeys.h>
+#include <centralrepository.h>
+#include <e32property.h>
+#include <ssm/startupdomainpskeys.h>
+
+#include "cmdpublishstartupmode.h"
+#include "ssmuiproviderdll.h"
+#include "ssmdebug.h"
+
+
+/**
+ * Constructs and returns a new custom command, leaving on errors.
+ * 
+ * @internalComponent
+ */
+CCustomCmdPublishStartupMode* CCustomCmdPublishStartupMode::NewL()
+	{
+	CCustomCmdPublishStartupMode* self = new (ELeave) CCustomCmdPublishStartupMode();
+	return self;
+	}
+
+CCustomCmdPublishStartupMode::CCustomCmdPublishStartupMode()
+:	CActive(EPriorityNormal)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CCustomCmdPublishStartupMode::~CCustomCmdPublishStartupMode()
+	{
+	Deque();
+	//Cancel the request if there is any
+	iSsmMiscAdaptation.Cancel();
+	
+	//Close RSsmMiscAdaptation
+	iSsmMiscAdaptation.Close();
+	
+	delete iRepository;
+	}
+
+/**
+ * Initializes this custom command. This consists of connecting to the required servers.
+ * 
+ * @internalComponent
+ */
+TInt CCustomCmdPublishStartupMode::Initialize(CSsmCustomCommandEnv* /*aCmdEnv*/)
+	{
+	iHiddenResetPckg = EFalse;
+	iState = EInitial;
+	// Connect to the central repository
+	TRAPD(err, iRepository = CRepository::NewL(KCRUidStartup));
+	if(KErrNone != err && KErrNotFound != err)
+			{
+			return err;
+			}
+	
+	//Connect to RSsmMiscAdaptation
+	err = iSsmMiscAdaptation.Connect();
+	return err;
+	}
+
+/**
+ * Destory this object and any resources allocated to it.
+ * 
+ * @internalComponent
+ */
+void CCustomCmdPublishStartupMode::Close()
+	{
+	}
+
+void CCustomCmdPublishStartupMode::Release()
+	{
+	delete this;
+	}
+
+/**
+ * Issues the required requests to publish the startup mode. Completes aStatus upon completion.
+ * 
+ * @internalComponent
+ */
+void CCustomCmdPublishStartupMode::Execute(const TDesC8& /*aParams*/, TRequestStatus& aStatus)
+	{
+	// Remember our completion value
+	iReturnStatus = &aStatus;
+	aStatus = KRequestPending;
+    iState = ERequestingStartupMode;
+
+	// Issue request
+	iSsmMiscAdaptation.GetGlobalStartupMode(iStartupModePckg, iStatus);
+	SetActive();
+	}
+
+void CCustomCmdPublishStartupMode::PublishStartupModeL()
+    {
+    if(iStatus != KErrNone)
+         {
+         DEBUGPRINT2A("Request GetGlobalStartupMode returned error: %d", iStatus.Int());
+         User::Leave(iStatus.Int());
+         }
+
+     // Publish startup mode
+     TInt err = RProperty::Set(CSsmUiSpecific::StartupPSUid(), KPSGlobalStartupMode, iStartupModePckg());
+     if(KErrNone != err)
+         {
+         DEBUGPRINT2A("Publishing startup mode returned error: %d", err);
+         User::Leave(err);
+         }
+
+     iState = ERequestingHiddenReset;
+     iSsmMiscAdaptation.GetHiddenReset(iHiddenResetPckg, iStatus);
+     SetActive();
+    }
+
+void CCustomCmdPublishStartupMode::PublishHiddenResetL()
+    {
+    DEBUGPRINT2A("Request GetHiddenReset completed with errorcode: %d", iStatus.Int());
+    // Only if we've been able to open the repository it is published from.
+    if(iRepository != NULL)
+        {
+        // Retrieve startup reason
+        TInt startupReason = 0;
+        TInt err = iRepository->Get(KStartupReason, startupReason);
+
+        if (KErrNone == err)
+            {
+            if ( startupReason == ENormalStartup &&
+                 iStatus.Int() == KErrNone && // Hidden reset query was successful
+                 iHiddenResetPckg())
+                {
+                DEBUGPRINT1A("Hidden reset detected");
+                startupReason = EUnknownReset;
+                }
+            
+            // Publish startup reason
+            err = RProperty::Set(CSsmUiSpecific::StartupPSUid(), KPSStartupReason, startupReason);
+            if(KErrNone != err)
+                {
+                DEBUGPRINT2A("Publishing startup reason returned error: %d", err);
+                User::Leave(err);
+                }
+            DEBUGPRINT2A( "Startup reason set to %d", startupReason);
+            }
+        }
+
+    // Command complete, signal back
+    User::RequestComplete(iReturnStatus, KErrNone);
+    // Reset iReturnStatus so it is not completed again in future
+    iReturnStatus = NULL;       
+    }
+
+/**
+ * From CActive::RunL()
+ * 
+ * @internalComponent 
+ */
+void CCustomCmdPublishStartupMode::RunL()
+	{
+	switch(iState)
+	    {
+	    case ERequestingStartupMode:
+	        {
+	        PublishStartupModeL();
+	        break;
+	        }
+	    case ERequestingHiddenReset:
+	        {
+	        PublishHiddenResetL();
+	        break;
+	        }
+	    default:
+	        {
+	        User::Leave(KErrArgument);
+	        }
+	    }
+	}
+
+/**
+ * From CActive::DoCancel()
+ * 
+ * @internalComponent 
+ */
+void CCustomCmdPublishStartupMode::DoCancel()
+	{
+	//Cancel the request if there is any
+	iSsmMiscAdaptation.Cancel();
+	}
+
+/**
+ * From CActive::RunError()
+ * 
+ * @internalComponent 
+ */
+TInt CCustomCmdPublishStartupMode::RunError(TInt aError)
+	{
+	DEBUGPRINT2A("CCustomCmdPublishStartupMode::RunError received error: %d", aError);
+	User::RequestComplete(iReturnStatus, aError);
+	// We've returned the error via the status so return KErrNone here.
+	return KErrNone;
+	}
+
+void CCustomCmdPublishStartupMode::ExecuteCancel()
+	{
+	Cancel();
+	if(iReturnStatus != NULL)
+		{
+		User::RequestComplete(iReturnStatus, KErrCancel);
+		iReturnStatus = NULL;
+		}
+	}