diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/cmd/src/ssmcommandlistutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatemgr/cmd/src/ssmcommandlistutils.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,138 @@ +// 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 + +#include "ssmcommandlistutils.h" +#include +#include "ssmdebug.h" +#include "ssmpanic.h" + + +EXPORT_C TBool CSsmCommandListUtils::IsValidStateList(const CSsmCommandList& aCommandList) + { + // Validation 1: A command list used to transition to a system state must + // contain exactly one publish system state command + // and must not contain any publish swp commands + + //Validation 2:In a command list, if there are one or more commands with their + //execution behaviour as ESsmDeferredWaitForSignal that should be followed by a + //SSM_MULTIPLE_WAIT command + + + return IsValidList(aCommandList, ESsmCmdPublishSystemState) && ValidateDeferredWaitCommand(aCommandList); + } + +EXPORT_C TBool CSsmCommandListUtils::IsValidSwpList(const CSsmCommandList& aCommandList) + { + //Validation 1: A command list used to change the value of a swp must + // contain exactly one publish swp command + // and must not contain any publish system state commands + + //Validation 2:In a command list, if there are one or more commands with their + //execution behaviour as ESsmDeferredWaitForSignal that should be followed by a + //SSM_MULTIPLE_WAIT command + + return IsValidList(aCommandList, ESsmCmdPublishSwp) && ValidateDeferredWaitCommand(aCommandList); + } + +TBool CSsmCommandListUtils::IsValidList(const CSsmCommandList& aCommandList, TSsmCommandType aRequiredType) + { + TBool ret = EFalse; + TInt publishSystemStateCount = 0; + TInt publishSwpCount = 0; + const TInt KRequiredCount = 1; + + //From Commandlist fetch 1.) no. of publish system state command + //2.) no. of publish swp command + + aCommandList.GetDataToValidateCommandlist(publishSystemStateCount,publishSwpCount); + + if (aRequiredType == ESsmCmdPublishSystemState) //if commandlist has a Publish System State command + { + if (publishSwpCount != 0) //and a Publish SWP command also + { + DEBUGPRINT1A("PublishSwp command illegal in PublishSystemState command list"); + } + else if (publishSystemStateCount != KRequiredCount) //number of publish System State commands is not equal to 1 + { + DEBUGPRINT2A("Command list incorrectly contains %d PublishSystemState command ", publishSystemStateCount); + } + else + { + ret = ETrue; + } + } + else if (aRequiredType == ESsmCmdPublishSwp) //if commandlist has a Publish SWP command + { + if (publishSystemStateCount != 0) //and a Publish System state command also + { + DEBUGPRINT1A("PublishSystemState command illegal in PublishSwp command list"); + } + else if (publishSwpCount != KRequiredCount) //number of publish SWP commands is not equal to 1 + { + DEBUGPRINT2A("Command list incorrectly contains %d PublishSwp command ", publishSwpCount); + } + else + { + ret = ETrue; + } + } + + return ret; + } + +/** +This method runs through the command list from start to end checks for existence +of command with execution behaviour ESsmDeferredWaitForSignal +If one or more such commands found then it checks for ESsmCmdMultipleWait type command. +If ESsmCmdMultipleWait command not found corresponding to one or more ESsmDeferredWaitForSignal +returns EFalse. +*/ + +TBool CSsmCommandListUtils::ValidateDeferredWaitCommand(const CSsmCommandList& aCommandList) + { + TBool ret = ETrue; + TBool deferredWaitFound = EFalse; + const TInt CommandsCount = aCommandList.Count(); + + TSsmCommandType commandType; + + for (TInt count = 0 ; count < CommandsCount ; count++) + { + if(deferredWaitFound) + { + commandType = aCommandList[count]->Type(); + if(commandType == ESsmCmdMultipleWait) + { + deferredWaitFound = EFalse; + } + } + if(aCommandList[count]->ExecutionBehaviour() == ESsmDeferredWaitForSignal) + { + deferredWaitFound = ETrue; + } + } + + if(deferredWaitFound) + { + DEBUGPRINT1A("Command list incorrectly contains deferredWaitSignal command and no later Multiple_Wait"); + ret = EFalse; + } + + return ret; + }