sysstatemgmt/systemstatereferenceplugins/clayer/src/rfstatusswppolicy.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatereferenceplugins/clayer/src/rfstatusswppolicy.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,156 @@
+// 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:
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#include "rfstatusswppolicy.h"
+#include "ssmdebug.h"
+#include "clayerpanic.h"
+#include <ssm/ssmcommandlistresourcereader.h>
+#include <ssm/ssmpatchableconstants.h>
+#include <ssm/clayerswp.hrh>
+
+
+//Path for RF status SwP command list resource file
+_LIT(KRFStatusSwPCmdListPath, "z:\\private\\2000d75b\\rfstatusswpcmdlist\\");
+
+_LIT_SECURE_ID(KSsmSecureId , 0x2000D75B);
+
+EXPORT_C MSsmSwpPolicy* CRFStatusSwPPolicy ::NewL()
+	{
+	CRFStatusSwPPolicy * self = new (ELeave) CRFStatusSwPPolicy ;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+ 
+CRFStatusSwPPolicy ::CRFStatusSwPPolicy ()
+	{
+	}
+
+CRFStatusSwPPolicy ::~CRFStatusSwPPolicy ()
+	{
+	iFs.Close();
+	delete iCommandListResourceReader;
+	}
+
+void CRFStatusSwPPolicy ::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	// create resource reader
+	iCommandListResourceReader = CSsmCommandListResourceReader::NewL(iFs, KRFStatusSwPCmdListPath(), *this);
+	}
+
+void CRFStatusSwPPolicy ::Initialize(TRequestStatus& aStatus)
+	{
+	__ASSERT_DEBUG(iCommandListResourceReader, CLAYER_PANIC(ECLayerInvalidResourceReader));
+
+	//Initialise the command list resource reader.
+	iCommandListResourceReader->Initialise(aStatus);
+	}
+
+void CRFStatusSwPPolicy ::InitializeCancel()
+	{
+	__ASSERT_DEBUG(iCommandListResourceReader, CLAYER_PANIC(ECLayerInvalidResourceReader));
+
+	iCommandListResourceReader->InitialiseCancel();
+	}
+
+void CRFStatusSwPPolicy ::Release()
+	{
+	delete this;
+	}
+
+MSsmSwpPolicy::TResponse CRFStatusSwPPolicy ::TransitionAllowed(const TSsmSwp& aSwp, const RMessagePtr2& aMessage)
+	{
+	MSsmSwpPolicy::TResponse isTransitionAllowed = ENotAllowed;   
+	TBool hasCapability = aMessage.HasCapability(ECapabilityWriteDeviceData, ECapabilityPowerMgmt,
+	                    __PLATSEC_DIAGNOSTIC_STRING( "Platsec violation, RF status SwP transition" ));
+	
+	if(hasCapability)
+        {        
+        if (IsSsmGracefulOffline())
+            {
+            //RF ON/OFF is implemented as a substate in Normal instead of SwP for graceful offline notification.
+            //Hence the SwP RF OFF/RF ON is restricted for the request which has SSM SID. Only BtSap SwP transition is 
+            //allowed to any client with appropriate capability.
+            if (aMessage.SecureId() == KSsmSecureId || aSwp.Value() == ESsmBtSap )
+                {
+                //Allow SwP change only if request has SsmSecureId or the SwP request for BtSap
+                isTransitionAllowed = EAllowed;
+                }
+            }
+        else
+            {
+            isTransitionAllowed = EAllowed;
+            }
+        }	
+	return isTransitionAllowed;
+	}
+
+void CRFStatusSwPPolicy ::PrepareCommandList(const TSsmSwp& aSwp, TRequestStatus& aStatus)
+	{
+	__ASSERT_DEBUG(iCommandListResourceReader, CLAYER_PANIC(ECLayerInvalidResourceReader));
+	
+	iCommandListResourceReader->PrepareCommandList(aSwp.Value(), aSwp, aStatus);
+	}
+
+void CRFStatusSwPPolicy ::PrepareCommandListCancel()
+	{
+	__ASSERT_DEBUG(iCommandListResourceReader, CLAYER_PANIC(ECLayerInvalidResourceReader));
+	iCommandListResourceReader->PrepareCommandListCancel();
+	}
+
+CSsmCommandList* CRFStatusSwPPolicy ::CommandList()
+	{
+	__ASSERT_DEBUG(iCommandListResourceReader, CLAYER_PANIC(ECLayerInvalidResourceReader));
+	return iCommandListResourceReader->GetCommandList();
+	}
+
+void CRFStatusSwPPolicy ::HandleCleReturnValue(const TSsmSwp& aSwp, TInt aError, TInt /*aSeverity*/, TRequestStatus& aStatus)
+	{
+	TRequestStatus* rs = &aStatus;
+	(void)aSwp;
+	(void)aError;
+
+#if defined(_DEBUG)
+	if(KErrNone != aError)
+		{
+		DEBUGPRINT3A("ERROR: Request SwP change for RF status (SwP key %d) completed with error %d", aSwp.Key(), aError);
+		}
+	//Complete the status with the error which inturn panics SSM server
+	User::RequestComplete(rs, aError);
+#else
+	//Completing the status with KErrNone to avoid panic in SSM server
+	User::RequestComplete(rs, KErrNone);
+#endif
+	}
+
+
+void CRFStatusSwPPolicy ::HandleCleReturnValueCancel()
+	{
+	// Nothing to do as HandleCleReturnValue always completes immediately
+	}
+
+TBool CRFStatusSwPPolicy ::ConditionalCommandAllowedL(CResourceFile& /*aResourceFile*/, TInt /*aResourceId*/)
+	{
+	__ASSERT_DEBUG(iCommandListResourceReader, CLAYER_PANIC(ECLayerConditionalInfoNotImplemented));
+	return EFalse;
+	}