sysstatemgmt/systemstateplugins/conditionevaluator/src/conditionevaluate.cpp
changeset 0 4e1aa6a622a0
child 7 1a73e8f1b64d
--- /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;
+    }