diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstateplugins/conditionevaluator/src/conditionevaluate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstateplugins/conditionevaluator/src/conditionevaluate.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,237 @@ +// 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: +// Name : resourcecondition.cpp +// Part of : System Startup / Condition +// Implementation of ResourceCondition class +// Version : %version: 1 % +// This material, including documentation and any related computer +// programs, is protected by copyright controlled by Nokia. All +// rights are reserved. Copying, including reproducing, storing, +// adapting or translating, any or all of this material requires the +// prior written consent of Nokia. This material also contains +// confidential information which may not be disclosed to others +// without the prior written consent of Nokia. +// Template version: 4.1 +// Nokia Core OS * +// File renamed from resourcecondition.cpp to conditionevaluate.cpp as part of Core OS transfer. +// + + + +#include "conditionevaluate.h" +#include "cndlogical.h" +#include "cndfeature.h" +#include "cndcentralrepository.h" +#include "cndpublishsubscribe.h" +#include "cndsystemwideproperty.h" + +CConditionEvaluate::CConditionEvaluate() + { + } + +EXPORT_C CConditionEvaluate::~CConditionEvaluate() + { + } + +EXPORT_C CConditionEvaluate* CConditionEvaluate::NewLC() + { + CConditionEvaluate* self = CConditionEvaluate::NewL(); + CleanupStack::PushL(self); + return self; + } + +EXPORT_C CConditionEvaluate* CConditionEvaluate::NewL() + { + CConditionEvaluate* self = new (ELeave)CConditionEvaluate(); + return self; + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnFeatureMatchL(TResourceReader& aReader) + { + const TInt featureId = aReader.ReadInt32(); + return CCndFeature::NewL(ECompareValue, featureId); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnFeatureL(TResourceReader& aReader) + { + const TInt featureId = aReader.ReadInt32(); + const TUint32 aCndValue = aReader.ReadUint32(); + return CCndFeature::NewL(ECompareFeatureData, featureId, aCndValue); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnCentRepFlagL(TResourceReader& aReader) + { + const TInt repositoryId = aReader.ReadInt32(); + const TUint32 key = aReader.ReadUint32(); + const TInt mask = aReader.ReadInt32(); + return CCndCentralRepository::NewL(ECompareBitwiseAnd, repositoryId, key, mask); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnCentRepMatchL(TResourceReader& aReader) + { + const TInt repositoryId = aReader.ReadInt32(); + const TUint32 key = aReader.ReadUint32(); + const TInt value = aReader.ReadInt32(); + return CCndCentralRepository::NewL(ECompareValue, repositoryId, key, value ); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnPubSubFlagL(TResourceReader& aReader) + { + const TInt category = aReader.ReadInt32(); + const TUint32 key = aReader.ReadUint32(); + const TInt mask = aReader.ReadInt32(); + + return CCndPublishSubscribe::NewL(ECompareBitwiseAnd, category, key, mask); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnPubSubMatchL(TResourceReader& aReader) + { + const TInt category = aReader.ReadInt32(); + const TUint32 key = aReader.ReadUint32(); + const TInt value = aReader.ReadInt32(); + + return CCndPublishSubscribe::NewL(ECompareValue, category, key, value); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnSwpMatchL(TResourceReader& aReader) + { + const TUint32 key = aReader.ReadUint32(); + const TInt value = aReader.ReadInt32(); + + return CCndSwp::NewL(ECompareValue, key, value); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadConditionOnSwpFlagL(TResourceReader& aReader) + { + const TUint32 key = aReader.ReadUint32(); + const TInt mask = aReader.ReadInt32(); + + return CCndSwp::NewL(ECompareBitwiseAnd, key, mask); + } + +CConditionEvaluateBase* CConditionEvaluate::ReadLogicalNotL(const CResourceFile& aResourceFile,TResourceReader& aReader, + RArray& aUsedResourceIds) + { + const TUint32 resourceId = aReader.ReadUint32(); + CConditionEvaluateBase* sub = DoEvaluateLC(aResourceFile, resourceId, aUsedResourceIds); + CConditionEvaluateBase* retVal = new (ELeave) CLogicalNot(sub); + CleanupStack::Pop(sub); // CLogicalNot owns it now + return retVal; + } + +CConditionEvaluateBase* CConditionEvaluate::ReadLogicalAndL(const CResourceFile& aResourceFile,TResourceReader& aReader, + RArray& aUsedResourceIds) + { + const TUint32 lhsId = aReader.ReadUint32(); + const TUint32 rhsId = aReader.ReadUint32(); + + CConditionEvaluateBase* lhs = DoEvaluateLC(aResourceFile, lhsId, aUsedResourceIds); + CConditionEvaluateBase* rhs = DoEvaluateLC(aResourceFile, rhsId, aUsedResourceIds); + CConditionEvaluateBase* retVal = new (ELeave) CLogicalAnd(lhs, rhs); + CleanupStack::Pop(rhs); // CLogicalAnd owns it now + CleanupStack::Pop(lhs); // CLogicalAnd owns it now + + return retVal; + } + +CConditionEvaluateBase* CConditionEvaluate::ReadLogicalOrL(const CResourceFile& aResourceFile,TResourceReader& aReader, + RArray& aUsedResourceIds) + { + const TUint32 lhsId = aReader.ReadUint32(); + const TUint32 rhsId = aReader.ReadUint32(); + CConditionEvaluateBase* lhs = DoEvaluateLC(aResourceFile, lhsId, aUsedResourceIds); + CConditionEvaluateBase* rhs = DoEvaluateLC(aResourceFile, rhsId, aUsedResourceIds); + CConditionEvaluateBase* retVal = new (ELeave) CLogicalOr(lhs, rhs); + CleanupStack::Pop(rhs); // CLogicalOr owns it now + CleanupStack::Pop(lhs); // CLogicalOr owns it now + + return retVal; + } + +CConditionEvaluateBase* CConditionEvaluate::DoEvaluateLC(const CResourceFile& aResourceFile, const TInt aResourceId, + RArray& aUsedResourceIds) + { + // Check for any recursive conditions + TInt idx = aUsedResourceIds.FindReverse(aResourceId); + if (0 <= idx) + { + //Leave in case of any recursive condition + User::Leave(KErrCorrupt); + } + aUsedResourceIds.AppendL(aResourceId); + + HBufC8* buf = aResourceFile.AllocReadLC(aResourceId); + TResourceReader reader; + reader.SetBuffer(buf); + + TUint16 type = reader.ReadUint16(); + CConditionEvaluateBase* retVal = NULL; + + switch (type) + { + case EFeatureFlag: + retVal = ReadConditionOnFeatureMatchL(reader); + break; + case EFeatureFlagData: + retVal = ReadConditionOnFeatureL(reader); + break; + case ECentRepFlag: + retVal = ReadConditionOnCentRepFlagL(reader); + break; + case ECentRepIntVal: + retVal = ReadConditionOnCentRepMatchL(reader); + break; + case EPubSubFlag: + retVal = ReadConditionOnPubSubFlagL(reader); + break; + case EPubSubIntVal: + retVal = ReadConditionOnPubSubMatchL(reader); + break; + case ELogicalNot: + retVal = ReadLogicalNotL(aResourceFile, reader, aUsedResourceIds); + break; + case ELogicalAnd: + retVal = ReadLogicalAndL(aResourceFile, reader, aUsedResourceIds); + break; + case ELogicalOr: + retVal = ReadLogicalOrL(aResourceFile, reader, aUsedResourceIds); + break; + case ESwpIntVal: + retVal = ReadConditionOnSwpMatchL(reader); + break; + case ESwpFlag: + retVal = ReadConditionOnSwpFlagL(reader); + break; + default: + User::Leave(KErrCorrupt); + } + + aUsedResourceIds.Remove(aUsedResourceIds.Count() - 1); + CleanupStack::PopAndDestroy(buf); + CleanupStack::PushL(retVal); + return retVal; + } + +EXPORT_C TBool CConditionEvaluate::EvaluateL(const CResourceFile& aResourceFile, const TInt aResourceId) + { + RArray array; + CleanupClosePushL(array); + + CConditionEvaluateBase* expr = DoEvaluateLC(aResourceFile, aResourceId, array); + TBool retVal = expr->EvaluateL(); + + CleanupStack::PopAndDestroy(expr); + CleanupStack::PopAndDestroy(&array); + return retVal; + }