diff -r 000000000000 -r 8e480a14352b messagingfw/scheduledsendmtm/schedulesendmtm/src/MsvSysAgentAction.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/scheduledsendmtm/schedulesendmtm/src/MsvSysAgentAction.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,219 @@ +// Copyright (c) 2000-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: +// MsvSysAgentCondAction.CPP +// +// + +#ifdef _DEBUG +#undef _MSG_NO_LOGGING +#endif + +#include +#include + +#include + +#include +#include +#include +#include + +#ifndef _MSG_NO_LOGGING +#include +_LIT(KSysAgentActionsLog, "sysagent.txt"); +#endif + + +/** +Default constructor. +*/ + +EXPORT_C TMsvSysAgentConditionAction::TMsvSysAgentConditionAction() + { + iUseDefaultSysAgentAction = ETrue; + } + + + + +/** +Constructor. +*/ + + +EXPORT_C CMsvSysAgentActions::CMsvSysAgentActions() +: CArrayFixFlat(KMsvSchsendArrayGrowth) + + { + } + + +/** +Destructor. +*/ + + +EXPORT_C CMsvSysAgentActions::~CMsvSysAgentActions() + { + } + + +/** +Tests if system agent conditions are met. + +@param aErrorAction +On return, error action to use. + +@return True if conditions are met, else false. + +@leave One of the system-wide error codes +RSystemAgent::Connect() returned an error. +*/ + +EXPORT_C TBool CMsvSysAgentActions::ConditionsMetL(TMsvSendErrorAction& aErrorAction) + { + aErrorAction = iDefault; + TBool retVal = ETrue; + + + CArrayFixFlat* uids = new (ELeave) CArrayFixFlat(KMsvSchsendArrayGrowth); + CleanupStack::PushL(uids); + + CArrayFixFlat* states = new (ELeave) CArrayFixFlat(KMsvSchsendArrayGrowth); + CleanupStack::PushL(states); + + GetConditionVariablesL(*uids); + + TInt count = uids->Count(); + + states->ResizeL(count); + for(TInt i = 0; i < count; ++i) + { + TInt val = 0; + TInt uid = (*uids)[i].iUid; + + User::LeaveIfError(RProperty::Get(KUidSystemCategory, uid, val)); + + states->At(i) = val; + } + + retVal = CheckStates(*states, aErrorAction); + + CleanupStack::PopAndDestroy(2); + + return retVal; + } + + +void CMsvSysAgentActions::GetConditionVariablesL(CArrayFix& aUids) const + { + TInt count = Count(); + + for (TInt curCond = 0; curCond < count; curCond++) //order important, therefore not a while loop + { + TMsvSysAgentConditionAction condAction = At(curCond); + aUids.AppendL(condAction.iCondition.iVariable); + } + } + + +TBool CMsvSysAgentActions::CheckStates(const CArrayFix& aStates, TMsvSendErrorAction& aErrorAction) const + { + aErrorAction = iDefault; + TBool retVal = ETrue; + TBool useDefault = ETrue; + TInt count = Count(); + + for (TInt curCond = 0; curCond < count; curCond++) //order important, therefore not a while loop + { + TMsvSysAgentConditionAction condAction = At(curCond); + TInt state = aStates.At(curCond); + +#ifndef _MSG_NO_LOGGING + RFileLogger::WriteFormat(KSchSendLogDir, KSysAgentActionsLog, EFileLoggingModeAppend, _L("Cond: %d, Type %d, Expected %d, Actual %d"), condAction.iCondition.iVariable.iUid, condAction.iCondition.iType, condAction.iCondition.iState, state); +#endif + + if (!ConditionOK(condAction, state)) + { + retVal = EFalse; + + if (useDefault && !condAction.iUseDefaultSysAgentAction) + { + aErrorAction = condAction.iErrorAction; + } + else if (!useDefault && !condAction.iUseDefaultSysAgentAction) + { + if (condAction.iErrorAction.iAction == ESendActionFail) + { + aErrorAction = condAction.iErrorAction; + } + else if (condAction.iErrorAction.iAction == ESendActionRetryLater && aErrorAction.iAction == ESendActionRetryImmediately) + { + aErrorAction = condAction.iErrorAction; + } + else if (condAction.iErrorAction.iRetries == ESendRetriesFixed && aErrorAction.iRetries == ESendRetriesInfinite) + { + aErrorAction = condAction.iErrorAction; + } + else + { + //use the current aErrorAction + } + } + else + { + //use the default error action (iDefault) + } + + useDefault &= condAction.iUseDefaultSysAgentAction; + } + } //end for + + return retVal; + } + + +TBool CMsvSysAgentActions::ConditionOK(const TMsvSysAgentConditionAction& aCondAction, const TInt aState) const + { + // If system agent hasn't defined the variable the condition should be satisfied + if (aState == KErrUnknown) + return ETrue; + + switch (aCondAction.iCondition.iType) + { + case TMsvCondition::EMsvSchSendEquals: + { + return (aState == aCondAction.iCondition.iState); + } + case TMsvCondition::EMsvSchSendNotEquals: + { + return (aState != aCondAction.iCondition.iState); + } + case TMsvCondition::EMsvSchSendGreaterThan: + { + return (aState > aCondAction.iCondition.iState); + } + case TMsvCondition::EMsvSchSendLessThan: + { + return (aState < aCondAction.iCondition.iState); + } + + + default: + gPanic(ESysAgentConditionTypeNotSupported); + break; + } //end switch + + return ETrue; //should not be reached + }