--- /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<TUint32>& 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<TUint32>& 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<TUint32>& 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<TUint32>& 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<TUint32> array;
+ CleanupClosePushL(array);
+
+ CConditionEvaluateBase* expr = DoEvaluateLC(aResourceFile, aResourceId, array);
+ TBool retVal = expr->EvaluateL();
+
+ CleanupStack::PopAndDestroy(expr);
+ CleanupStack::PopAndDestroy(&array);
+ return retVal;
+ }