authenticationservices/authenticationserver/source/common/authexpression_impl.h
changeset 19 ece3df019add
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/source/common/authexpression_impl.h	Tue Nov 24 09:06:03 2009 +0200
@@ -0,0 +1,199 @@
+/*
+* Copyright (c) 2005-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: 
+* This file contains the implementation for CAuthExpression which is only visible
+* to implementation, and not the the client code.
+*
+*/
+
+
+/**
+ @file 
+ @released
+ @internalComponent
+*/
+ 
+#ifndef AUTHEXPRESSION_IMPL_H
+#define AUTHEXPRESSION_IMPL_H
+
+#include <s32buf.h>
+#include <authserver/authexpression.h>
+
+namespace AuthServer {
+
+// constants and operators used for processing authentication expression.
+
+_LIT(KAuthOpAnd,"&");
+_LIT(KAuthOpOr,"|");
+_LIT(KAuthBiometric, "Biometric");
+_LIT(KAuthDefault, "Default");
+_LIT(KAuthKnowledge, "Knowledge");
+_LIT(KAuthToken, "Token");
+_LIT(KAuthPerformance, "Performance");
+_LIT(KOpenBracket, "(");
+_LIT(KCloseBracket, ")");
+const TInt KMaxBufferSize = 2048;
+    
+class TSizeStream : public MStreamBuf
+/**
+	This subclass of MStreamBuf is used with
+	RWriteStream to count how many bytes are
+	required to externalize an object.
+ */
+	{
+public:
+	inline TSizeStream();
+	inline TInt Size() const;
+
+	// override MStreamBuf
+	IMPORT_C virtual void DoWriteL(const TAny* /* aPtr */, TInt aLength);
+
+private:
+	/** Accumulated stream length in bytes. */
+	TInt iSize;
+	};
+
+
+class CAuthExpressionImpl : public CAuthExpression
+/**
+	This class, which is not visible to clients,
+	defines the variables and functions which are
+	used by authentication expressions.
+	
+	Clients should use the CAuthExpression base class
+	which provides type safety but provides no implementation,
+	so authentication expressions can be re-implemented
+	later without breaking BC.
+
+	@internalComponent
+ */
+	{
+public:
+	/**
+		The type of expression represented by an instance
+		of this object, namely a plugin type, a plugin ID,
+		or a complex AND expression, OR expression or a 
+		NULL expression.
+	 */
+	enum TType {EPluginType, EPluginId, EAnd, EOr, ENull};
+		
+	CAuthExpressionImpl(TAuthPluginType aType);
+	CAuthExpressionImpl(TPluginId aPluginId);
+	CAuthExpressionImpl();
+	CAuthExpressionImpl(TType aType, CAuthExpressionImpl* aLeft, CAuthExpressionImpl* aRight);
+
+	IMPORT_C static CAuthExpressionImpl* NewL(RReadStream& aReadStream);
+
+	virtual ~CAuthExpressionImpl();
+
+	// implement CAuthExpression
+	virtual void ExternalizeL(RWriteStream& aWriteStream) const;
+	
+	IMPORT_C static CAuthExpression* CreateAuthExprObjectL(const TDesC& aStrengthAliasString);
+	
+	IMPORT_C static void InsertSpaceBetweenOperatorsL(const TDesC& aAliasStringToBeProcessed, RBuf& aResultantAliasString);
+	
+	inline TType Type() const;
+	inline const CAuthExpressionImpl* Left() const;
+	inline const CAuthExpressionImpl* Right() const;
+	inline TAuthPluginType PluginType() const;
+	inline TPluginId PluginId() const;
+	inline CAuthExpressionImpl* Parent() const;
+
+private:
+	/**
+		Current authentication expression version.
+		This is embedded in the externalized expression
+		so the server can reject the expression if it
+		uses an unsupported version.
+	 */
+	static const TInt KVersion;
+	void Externalize2L(RWriteStream& aWriteStream) const;
+	static CAuthExpressionImpl* New2L(RReadStream& aReadStream);
+	static CAuthExpression* CreateAuthExpressionL(const TDesC& aAliasString);
+	static CAuthExpression* CreateAuthExpressionL(RPointerArray<CAuthExpression>& aAuthExprArray, TPtrC aOperator);
+	static CAuthExpression* EvaluateAliasStringL(const RBuf& aStrengthAliasString);
+	
+	
+private:
+	/**
+		This expression's parent node.  This value is
+		used to navigate the expression tree during
+		evaluation.
+	 */
+	CAuthExpressionImpl* iParent;
+	
+	/** This expression's type. */
+	TType iType;
+	
+	class TBinaryComb
+	/**
+		This class contains pointers to the left and
+		right subexpressions when this expression is
+		an AND or an OR.
+	 */
+		{
+	public:
+		/** Left subexpression.  This cannot be NULL. */
+		CAuthExpressionImpl* iLeft;
+		/** Right subexpression.  This cannot be NULL. */
+		CAuthExpressionImpl* iRight;
+		};
+
+	union
+		{
+		/** This field is valid iff iType == EPluginType. */
+		TAuthPluginType iPluginType;
+		/** This field is valid iff iType == EPluginId. */
+		TPluginId iPluginId;
+		/** This field is valid iff iType == EAnd or iType == EOr. */
+		TBinaryComb iComb;
+		};
+		
+private:
+	// Invariant and Panic are defined, but only as stub
+	// functions for release mode.
+
+	enum TPanic
+	/**
+		In debug builds the current thread can be halted
+		with panic category "AUTHEXPR" and one of the
+		following reasons to indicate that the object has
+		become corrupt or that a caller has supplied an
+		invalid argument to one of this class' functions.
+	 */
+		{
+		ECtTyInvariant = 0x10,
+		ECtIdInvariant = 0x20,
+		ECt2BadComb = 0x30, ECt2NullLeft, ECt2NullRight, ECt2Invariant,
+		ETyAInvariant = 0x40,
+		ELfInvariant = 0x50, ELfNotComplex,
+		ERgInvariant = 0x60, ERgNotComplex,
+		EPTyInvariant = 0x70, EPTyNotPluginType,
+		EPIdInvariant = 0x80, EPIdNotPluginId,
+		EPPrInvariant = 0x90,
+		EExtInvariant = 0xa0
+		};
+		
+
+	IMPORT_C TBool Invariant() const;
+	IMPORT_C static void Panic(TPanic aPanic);
+	};
+
+}	// namespace AuthServer {
+
+#include "authexpression_impl.inl"
+
+#endif	// #ifndef AUTHEXPRESSION_IMPL_H
+