--- /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;
+ }
+ }