diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/ssm/src/ssmswprequesthandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatemgr/ssm/src/ssmswprequesthandler.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,214 @@ +// Copyright (c) 2007-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: +// + +#include + +#include "ssmdebug.h" +#include "ssmserverpanic.h" +#include "ssmswprequesthandler.h" +#include "ssmswptransitionscheduler.h" +#include "ssmswptransitionengine.h" +#include "ssmswppolicyresolverproxy.h" +#include "ssmswppolicyframe.h" + + +// +// Creation and Construction methods +// + +/** +@leave One of the system-wide error codes. +@return A newly created CSsmSwpRequestHandler +*/ +CSsmSwpRequestHandler* CSsmSwpRequestHandler::NewL( ) + { + CSsmSwpRequestHandler* self = NewLC ( ); + CleanupStack::Pop (self ); + return self; + } + +/** +@leave One of the system-wide error codes. +@return A newly created CSsmSwpRequestHandler on the cleanup stack +*/ +CSsmSwpRequestHandler* CSsmSwpRequestHandler::NewLC( ) + { + CSsmSwpRequestHandler* self = new (ELeave) CSsmSwpRequestHandler(); + CleanupStack::PushL (self ); + self->ConstructL ( ); + return self; + } + +/** +Empty constructor +*/ +CSsmSwpRequestHandler::CSsmSwpRequestHandler() : iPerformCommandListValidation(ETrue) + { + } + +/** + Construct transition scheduler + + @leave One of the system-wide error codes. + */ +void CSsmSwpRequestHandler::ConstructL( ) + { + iSwpTransitionScheduler = CSsmSwpTransitionScheduler::NewL ( ); + } + +/** +Empty destructor +*/ +CSsmSwpRequestHandler::~CSsmSwpRequestHandler( ) + { + delete iSwpTransitionScheduler; + } + +// +// Public API methods +// + +void CSsmSwpRequestHandler::SetSwpHandlerMonitor(MSwpHandlerMonitor* aMonitor) + { + iSwpHandlerMonitor = aMonitor; + } + +void CSsmSwpRequestHandler::SetSwpPolicyResolverProxy(MSsmSwpPolicyResolverProxy* aPolicyResolverProxy) + { + iSwpPolicyResolverProxy = aPolicyResolverProxy; + } + +void CSsmSwpRequestHandler::SetCleSessionProxy(MCleSessionProxy* aCleSessionProxy) + { + iCleSessionProxy = aCleSessionProxy; + } + +void CSsmSwpRequestHandler::PerformCommandListValidation(TBool aSetting) + { + iPerformCommandListValidation = aSetting; +#ifdef _DEBUG + if(iPerformCommandListValidation) + { + DEBUGPRINT1(_L("Turning on State command list validation")); + } + else + { + DEBUGPRINT1(_L("Turning off State command list validation")); + } +#endif + } + +/** +Receives a swp request and handles it synchronously + +@param aRequest An swp change request +@leave One of the system-wide error codes. +*/ +void CSsmSwpRequestHandler::SubmitRequestL(const TSsmSwp& aRequest ) + { + __ASSERT_DEBUG(NULL != iSwpTransitionScheduler, PanicNow(KPanicSysStateMgr,ESwpRequestHandlerError1)); + DoSubmitRequestL (aRequest, NULL ); + } + +/** +Receives a swp request and handles it asynchronously + +@param aRequest An swp change request +@param aMessage Client message to complete +@leave One of the system-wide error codes. +*/ +void CSsmSwpRequestHandler::SubmitRequestL(const TSsmSwp& aRequest, + const RMessage2& aMessage ) + { + __ASSERT_DEBUG(NULL != iSwpTransitionScheduler, PanicNow(KPanicSysStateMgr,ESwpRequestHandlerError2)); + DoSubmitRequestL (aRequest, &aMessage ); + } + +/** + Cancel all running and queued requests + */ +void CSsmSwpRequestHandler::Cancel(CSession2* aSession) + { + __ASSERT_DEBUG(NULL != iSwpTransitionScheduler, PanicNow(KPanicSysStateMgr,ESwpRequestHandlerError3)); + iSwpTransitionScheduler->Cancel(aSession); + } + +// +// Private methods +// + +/** +Resolve the policy for the swp value +Set up the engine ready for running +Add the engine to the scheduler + +@param aRequest An swp change request +@leave KErrNotFound If swp value is not registered +@leave Or one of the system-wide error codes +*/ + +void CSsmSwpRequestHandler::DoSubmitRequestL(const TSsmSwp& aRequest, const RMessage2* aMessage) + { + __ASSERT_DEBUG(NULL != iSwpPolicyResolverProxy, PanicNow(KPanicSysStateMgr,ESwpRequestHandlerError4)); + __ASSERT_DEBUG(NULL != iCleSessionProxy, PanicNow(KPanicSysStateMgr,ESwpRequestHandlerError5)); + + NotifyRequestMade (aRequest ); + + // get the policy + CSsmSwpPolicyFrame* policyFrame = iSwpPolicyResolverProxy->GetSwpPolicyL(aRequest); + SSMLOGLEAVEIFNULL(policyFrame); + CleanupStack::PushL(policyFrame); + + // Create an engine + CSsmSwpTransitionEngine* engine = CSsmSwpTransitionEngine::NewL (aRequest); + engine->SetCleSessionProxy(iCleSessionProxy); + engine->SetSwpPolicyFrame(policyFrame); // and take ownership + CleanupStack::Pop (policyFrame ); // engine takes ownership + CleanupStack::PushL (engine); + + engine->PerformCommandListValidation(iPerformCommandListValidation); + + iSwpTransitionScheduler->SubmitL (engine ); // scheduler takes ownership + CleanupStack::Pop (engine ); + + engine->SetClientMessage (aMessage ); // client wants to be notified + } + +// +//Event notification interface +// + +/** +Flag request made + +@param aRequest Value of swp request +*/ +void CSsmSwpRequestHandler::NotifyRequestMade(const TSsmSwp& aRequest ) + { + if (NULL != iSwpHandlerMonitor ) + { + iSwpHandlerMonitor->SwpRequestMade (aRequest ); + } + } +/** + * Used only for testing purposes + * Cleans up the Transition Scheduler + */ +#ifdef _DEBUG +void CSsmSwpRequestHandler::CleanupSwpTransitionScheduler() + { + iSwpTransitionScheduler->CleanupIndividualSchedulerArray(); + } +#endif