--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/interpretsislib/expressionevaluator.h Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,273 @@
+/*
+* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+
+#ifndef EXPRESSIONEVALUATOR_H
+#define EXPRESSIONEVALUATOR_H
+
+#include "sisfile.h"
+#include "sisregistry.h"
+#include "errors.h"
+#include "sisexpression.h"
+
+// Classes referenced
+class RomManager;
+class ConfigManager;
+
+// Max recursion depth
+const static int KMaxExpressionDepth=100;
+
+/**
+* @file EXPRESSIONEVALUATOR.H
+*
+* @internalComponent
+* @released
+*/
+class ExpressionEnvironment
+ {
+public:
+ ExpressionEnvironment( const SisFile& aSisFile,
+ const SisRegistry& aRegistry,
+ RomManager& aRomManager,
+ ConfigManager& aConfigManager,
+ const std::wstring& aCDrive );
+
+ /**
+ * Check whether a file exists, corresponds to EXISTS() function in package
+ * format.
+ */
+ bool FindFile(const std::wstring& aFileName);
+
+ /**
+ * Queries an application property, which is a key,value pair associated
+ * with an isntalled package. This corresponds to APPPROP() function in
+ * package format.
+ */
+ TUint32 ApplicationProperty(TUint32 aPackageUid, TUint32 aKey);
+
+ /**
+ * Queries the registry to check if a package exists or not.
+ */
+ bool Package(TUint32 aKey);
+
+ int Variable( int aVariableId );
+
+ const std::wstring GetPackageName();
+
+ /**
+ * Queries the registry to determine whether the version of a specific
+ * installed package satisfies the given relational condition
+ *
+ * @param aArgsString The argument string should contain the following
+ * comma seperated parameters:
+ *
+ * -packageUid - UID of the package to check
+ * -relational Operator - Comparision operator
+ * -vMajor - Major Version component
+ * -vMinor - Minor Version component
+ * -vBuild - Build Version component
+ *
+ * @return "TRUE" if the queried package version satisfies the
+ * condition, otherwise "FALSE".
+ */
+ bool PackageVersion(const std::wstring& aArgsString);
+
+ /**
+ * Check whether a languageID exists within the list device supported languages.
+ *
+ * @param aLanguageIdString The Language Id to check for.
+ * @return True if the language exists, False otherwise.
+ */
+ bool DeviceLanguage(const std::wstring& aLanguageIdString);
+
+private:
+ const SisFile& iSisFile;
+ const SisRegistry& iSisRegistry;
+ RomManager& iRomManager;
+ ConfigManager& iConfigManager;
+ const std::wstring& iCDrive;
+ };
+
+
+
+
+
+
+
+
+
+
+
+/**
+Implements the ExpressionResult.
+@internalComponent
+*/
+class ExpressionResult
+ {
+public:
+ enum TType { EString, EInt };
+ ExpressionResult(const std::wstring& aString);
+ ExpressionResult(TUint32 aInt);
+ TUint32 IntegerValue() const;
+ bool BoolValue() const;
+ const std::wstring& StringValue() const;
+ TType Type() const { return iType; }
+
+private:
+ TType iType;
+ union
+ {
+ const std::wstring* iString;
+ TUint32 iInt;
+ };
+ };
+
+
+
+
+
+
+
+
+
+
+
+
+
+inline bool operator==( const ExpressionResult& aLhs, const ExpressionResult& aRhs )
+ {
+ bool result( false );
+ //
+ if ( aLhs.Type() != aRhs.Type() )
+ {
+ std::string error = "corrupt SIS file: expression corrupt in condition statement";
+ throw InvalidSis("",error,INVALID_SIS);
+ }
+ else if ( aLhs.Type() == ExpressionResult::EInt )
+ {
+ result = ( aLhs.IntegerValue() == aRhs.IntegerValue() );
+ }
+ else
+ {
+ result = ( aLhs.StringValue() == aRhs.StringValue() );
+ }
+ //
+ return result;
+ }
+
+
+inline ExpressionResult operator!=( const ExpressionResult& aLhs, const ExpressionResult& aRhs )
+ {
+ bool equal = ( aLhs == aRhs );
+ const ExpressionResult result( !equal );
+ return result;
+ }
+
+
+inline ExpressionResult operator!( const ExpressionResult& aExpression )
+ {
+ if ( aExpression.Type() != ExpressionResult::EInt )
+ {
+ std::string error = "corrupt SIS file: expression corrupt in condition statement";
+ throw InvalidSis("",error,INVALID_SIS);
+ }
+ //
+ return ExpressionResult(!aExpression.IntegerValue()); // Will Never Leave
+ }
+
+
+inline ExpressionResult operator<( const ExpressionResult& aLhs, const ExpressionResult& aRhs )
+ {
+ if ( aLhs.Type() != aRhs.Type() || aLhs.Type() != ExpressionResult::EInt )
+ {
+ std::string error = "corrupt SIS file: expression corrupt in condition statement";
+ throw InvalidSis("",error,INVALID_SIS);
+ }
+ //
+ const ExpressionResult result( aLhs.IntegerValue() < aRhs.IntegerValue() );
+ return result;
+ }
+
+
+inline ExpressionResult operator>( const ExpressionResult& aLhs, const ExpressionResult& aRhs )
+ {
+ if ( aLhs.Type() != aRhs.Type() || aLhs.Type() != ExpressionResult::EInt )
+ {
+ std::string error = "corrupt SIS file: expression corrupt in condition statement";
+ throw InvalidSis("",error,INVALID_SIS);
+ }
+ //
+ const ExpressionResult result( aLhs.IntegerValue() > aRhs.IntegerValue() );
+ return result;
+ }
+
+
+inline ExpressionResult operator<=( const ExpressionResult& aLhs, const ExpressionResult& aRhs )
+ {
+ if ( aLhs.Type() != aRhs.Type() || aLhs.Type() != ExpressionResult::EInt )
+ {
+ std::string error = "corrupt SIS file: expression corrupt in condition statement";
+ throw InvalidSis("",error,INVALID_SIS);
+ }
+ //
+ const ExpressionResult result( aLhs.IntegerValue() <= aRhs.IntegerValue() );
+ return result;
+ }
+
+
+inline ExpressionResult operator>=( const ExpressionResult& aLhs, const ExpressionResult& aRhs )
+ {
+ if ( aLhs.Type() != aRhs.Type() || aLhs.Type() != ExpressionResult::EInt )
+ {
+ std::string error = "corrupt SIS file: expression corrupt in condition statement";
+ throw InvalidSis("",error,INVALID_SIS);
+ }
+ //
+ const ExpressionResult result( aLhs.IntegerValue() >= aRhs.IntegerValue() );
+ return result;
+ }
+
+
+
+
+
+
+
+/**
+Implements the ExpressionEvaluator.
+@internalComponent
+*/
+class ExpressionEvaluator
+ {
+public:
+ ExpressionEvaluator(ExpressionEnvironment& aEnvironment);
+ void SetFile(const SisFile& aSisFile);
+ void SetRegistry(const SisRegistry& aSisRegistry);
+
+ ExpressionResult Evaluate(const CSISExpression& aExpression);
+ ExpressionResult Evaluate(const CSISExpression* aExpression);
+
+private:
+ void Require(const void *aPointer) const;
+
+private:
+ ExpressionEnvironment& iExpEnv;
+ int iExpressionDepth;
+ ExpressionResult iTempResult;
+ };
+
+#endif /* EXPRESSIONEVALUATOR_H */
\ No newline at end of file