--- a/authenticationservices/authenticationserver/source/common/authexpression.cpp Tue Aug 31 17:00:08 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,891 +0,0 @@
-/*
-* 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:
-*
-*/
-
-
-#include "authcommon_impl.h"
-#include <scs/cleanuputils.h>
-
-using namespace AuthServer;
-
-const TInt CAuthExpressionImpl::KVersion = 1;
-
-// -------- TAuthExpressionWrapper --------
-
-
-TAuthExpressionWrapper::TAuthExpressionWrapper(CAuthExpression* aExpression)
-/**
- This constructor stores the supplied expression pointer.
-
- @param aExpression A pointer to the supplied expression
- is stored in the TAuthExpressionWrapper
- object. On exit, this object owns
- the expression.
- */
-: iPtr(aExpression)
- {
- // empty.
- }
-
-
-TAuthExpressionWrapper::TAuthExpressionWrapper(TAuthPluginType aType)
-/**
- Allocates a new instance of CAuthExpressionImpl which
- describes the supplied plugin type. If there is not
- enough memory, the pointer is NULL on exit.
-
- @param aType Plugin type used to create new instance
- of CAuthExpressionImpl.
- */
-: iPtr(new CAuthExpressionImpl(aType))
- {
- // empty.
- }
-
-
-TAuthExpressionWrapper::TAuthExpressionWrapper(TPluginId aPluginId)
-/**
- Allocates a new instance of CAuthExpressionImpl which
- describes the supplied plugin ID. If there is not
- enough memory, the pointer is NULL on exit.
-
- @param aPluginId Value which describes a specific plugin.
- */
-: iPtr(new CAuthExpressionImpl(aPluginId))
- {
- // empty.
- }
-
-TAuthExpressionWrapper::TAuthExpressionWrapper()
-/**
- Allocates a new instance of CAuthExpressionImpl which
- describes the default plugin ID. If there is not
- enough memory, the pointer is NULL on exit.
-
- */
-: iPtr(new CAuthExpressionImpl())
- {
- // empty.
- }
-
-// -------- factory functions --------
-
-
-static CAuthExpressionImpl* AuthComb(
- CAuthExpressionImpl::TType aType, CAuthExpressionImpl* aLeft, CAuthExpressionImpl* aRight);
-
-
-EXPORT_C TAuthExpressionWrapper AuthServer::AuthExpr(TAuthPluginType aType)
-/**
- Returns a wrapper around a new authentication expression.
-
- @param aType Identifies a type of plugin.
- @return Wrapper object for an instance
- of CAuthExpressionImpl. The authentication
- expression is allocated on the heap,
- and is NULL if there is not
- enough memory.
- */
- {
- return TAuthExpressionWrapper(aType);
- }
-
-
-EXPORT_C TAuthExpressionWrapper AuthServer::AuthExpr(TPluginId aPluginId)
-/**
- Returns a wrapper around a new authentication expression.
-
- @param aPluginId Identifies a specific plugin.
- @return Wrapper object for an instance
- of CAuthExpressionImpl. The authentication
- expression is allocated on the heap,
- and is NULL if there is not
- enough memory.
- */
- {
- return TAuthExpressionWrapper(aPluginId);
- }
-
-EXPORT_C TAuthExpressionWrapper AuthServer::AuthExpr()
-/**
- Returns a wrapper around a new authentication expression.
-
- @return Wrapper object for an instance
- of CAuthExpressionImpl. The authentication
- expression is allocated on the heap,
- and is NULL if there is not
- enough memory.
- */
- {
- return TAuthExpressionWrapper();
- }
-
-EXPORT_C TAuthExpressionWrapper AuthServer::AuthOr(CAuthExpression* aLeft, CAuthExpression* aRight)
-/**
- Allocate a CAuthExpressionImpl node which combines the supplied
- left and right nodes as an OR operation.
-
- If either aLeft or aRight are NULL, or this operation fails
- to allocate the required memory, then any allocated memory
- is cleaned up NULL is returned.
-
- @param aLeft Left node. This must be an instance
- of CAuthExpresionImpl.
- @param aRight Right node. This must be an instance
- of CAuthExpresionImpl.
- @return New wrapper around CAuthExpression, NULL
- if could not allocate, or if either the
- supplied nodes were NULL.
- */
- {
- CAuthExpressionImpl* leftImpl = static_cast<CAuthExpressionImpl*>(aLeft);
- CAuthExpressionImpl* rightImpl = static_cast<CAuthExpressionImpl*>(aRight);
- return AuthComb(CAuthExpressionImpl::EOr, leftImpl, rightImpl);
- }
-
-
-EXPORT_C TAuthExpressionWrapper AuthServer::AuthAnd(CAuthExpression* aLeft, CAuthExpression* aRight)
-/**
- Allocate a CAuthExpressionImpl node which combines the supplied
- left and right nodes as an AND operation.
-
- If either aLeft or aRight are NULL, or this operation fails
- to allocate the required memory, then the subexpressions are
- deleted and this function returns NULL.
-
- @param aLeft Left node.
- @param aRight Right node.
- @return New wrapper around CAuthExpression, NULL
- if could not allocate, or if either the
- supplied nodes were NULL.
- @see AuthOr
- */
- {
- CAuthExpressionImpl* leftImpl = static_cast<CAuthExpressionImpl*>(aLeft);
- CAuthExpressionImpl* rightImpl = static_cast<CAuthExpressionImpl*>(aRight);
- return AuthComb(CAuthExpressionImpl::EAnd, leftImpl, rightImpl);
- }
-
-
-static CAuthExpressionImpl* AuthComb(
- CAuthExpressionImpl::TType aType, CAuthExpressionImpl* aLeft, CAuthExpressionImpl* aRight)
-/**
- Helper function for AuthOr and AuthAnd. This function
- allocates the combining node, storing the combining method (AND
- or OR) and pointers to the left and right nodes.
-
- If aLeft or aRight are NULL on entry, or this function cannot
- allocate the required memory, then any previously allocated nodes
- are freed, and this function returns NULL.
-
- @param aType Type of expression, AND/OR
- @param aLeft Left node.
- @param aRight Right node.
- @return New wrapper around CAuthExpression, NULL
- if could not allocate, or if either the
- supplied nodes were NULL.
- @see AuthAnd
- @see AuthOr
- */
- {
- CAuthExpressionImpl* compound = 0;
-
- if (aLeft == 0 || aRight == 0)
- goto failed;
-
- compound = new CAuthExpressionImpl(aType, aLeft, aRight);
- if (compound == 0)
- goto failed;
-
- return compound;
-
-failed:
- delete aLeft;
- delete aRight;
-
- return 0;
- }
-
-
-// -------- TSizeStream --------
-
-
-EXPORT_C void TSizeStream::DoWriteL(const TAny* /* aPtr */, TInt aLength)
-/**
- Override MStreamBuf by incrementing the
- accumulated size by aLength.
-
- @param aLength Length of data to write to stream.
- */
- {
- iSize += aLength;
- }
-
-
-// -------- CAuthExpressionImpl --------
-
-
-#ifdef _DEBUG
-#define VAR_FOLLOWS(___c, ___v1, ___v2) \
- (_FOFF(___c, ___v2) >= _FOFF(___c, ___v1) + sizeof(___c::___v1))
-#endif
-
-
-CAuthExpressionImpl::CAuthExpressionImpl(TAuthPluginType aType)
-: iType(EPluginType),
- iPluginType(aType)
-/**
- Initialise this leaf node authentication expression
- as describing a plugin type.
-
- @param aType Identifies a type of plugin.
- @panic AUTHEXPR 16 This constructed object is internally
- inconsistent (debug only.)
- */
- {
-#ifdef _DEBUG
- // non-aligned value to detect invalid node pointers
- __ASSERT_COMPILE(VAR_FOLLOWS(CAuthExpressionImpl, iPluginType, iComb.iRight));
- iComb.iRight = (CAuthExpressionImpl*)0xB51DE;
-#endif
-
- __ASSERT_DEBUG(Invariant(), Panic(ECtTyInvariant));
- }
-
-
-CAuthExpressionImpl::CAuthExpressionImpl(TPluginId aPluginId)
-/**
- Initialise this leaf node authentication expression
- as describing a specific plugin.
-
- @param aPluginId Identifies a specific plugin.
- @panic AUTHEXPR 32 This constructed object is internally
- inconsistent (debug only.)
- */
-: iType(EPluginId),
- iPluginId(aPluginId)
- {
-#ifdef _DEBUG
- // non-aligned value to detect invalid node pointers
- __ASSERT_COMPILE(VAR_FOLLOWS(CAuthExpressionImpl, iPluginId, iComb.iRight));
- iComb.iRight = (CAuthExpressionImpl*)0xB51DE;
-#endif
-
- __ASSERT_DEBUG(Invariant(), Panic(ECtIdInvariant));
- }
-
-CAuthExpressionImpl::CAuthExpressionImpl()
-/**
- Initialise this leaf node authentication expression
- as describing a specific plugin.
-
- @panic AUTHEXPR 32 This constructed object is internally
- inconsistent (debug only.)
- */
-: iType(ENull)
- {
-#ifdef _DEBUG
- // non-aligned value to detect invalid node pointers
- __ASSERT_COMPILE(VAR_FOLLOWS(CAuthExpressionImpl, iPluginId, iComb.iRight));
- iComb.iRight = (CAuthExpressionImpl*)0xB51DE;
-#endif
-
- __ASSERT_DEBUG(Invariant(), Panic(ECtIdInvariant));
-
- }
-
-
-CAuthExpressionImpl::CAuthExpressionImpl(TType aType, CAuthExpressionImpl* aLeft, CAuthExpressionImpl* aRight)
-/**
- Initialise a complex - AND or OR - expression.
-
- @param aType The type of combination. The only
- allowed values are EAnd and EOr.
- @param aLeft Left expression. This cannot be NULL.
- @param aRight Right expression. This cannot be NULL.
- @panic AUTHEXPR 48 Called with expression type that was
- neither AND nor OR (debug only.)
- @panic AUTHEXPR 49 Called with NULL left node (debug only.)
- @panic AUTHEXPR 50 Called with NULL right node (debug only.)
- @panic AUTHEXPR 51 This object is internally inconsistent
- after construction (debug only.)
- */
-: iType(aType)
- {
- __ASSERT_DEBUG(aType == EAnd || aType == EOr, Panic(ECt2BadComb));
- __ASSERT_DEBUG(aLeft != 0, Panic(ECt2NullLeft));
- __ASSERT_DEBUG(aRight != 0, Panic(ECt2NullRight));
-
- iComb.iLeft = aLeft;
- iComb.iRight = aRight;
- aLeft->iParent = aRight->iParent = this;
-
- __ASSERT_DEBUG(Invariant(), Panic(ECt2Invariant));
- }
-
-
-CAuthExpressionImpl::~CAuthExpressionImpl()
-/**
- Deletes resources used by this expression. If this is a complex
- expression then it deletes the subexpression nodes.
- */
- {
- // by construction iType is always correctly initialized
- // before this function is called.
- if (iType == EAnd || iType == EOr)
- {
- delete iComb.iLeft;
- delete iComb.iRight;
- }
- }
-
-
-EXPORT_C void CAuthExpressionImpl::ExternalizeL(RWriteStream& aWriteStream) const
-/**
- Write a persistent version of this object to the supplied
- stream. This function is used to transfer the expression
- to the authentication server.
-
- @param aWriteStream Stream to write object to.
- @panic AUTHEXPR 160 This object is internally inconsistent
- when this function is called.
- */
- {
- __ASSERT_DEBUG(Invariant(), Panic(EExtInvariant));
-
- aWriteStream.WriteInt8L(KVersion);
- Externalize2L(aWriteStream);
- }
-
-
-void CAuthExpressionImpl::Externalize2L(RWriteStream& aWriteStream) const
-/**
- Helper function for ExternalizeL. This function writes
- a persistent version of this expression object, including
- any subexpressions, to the supplied stream.
-
- @param aWriteStream Stream to write object to.
- @panic AUTHEXPR 144 This object is internally inconsistent
- when this function is called.
- */
- {
- __ASSERT_DEBUG(Invariant(), Panic(EExtInvariant));
-
- aWriteStream.WriteInt8L(iType);
-
- switch (iType)
- {
- case EAnd:
- case EOr:
- iComb.iLeft->Externalize2L(aWriteStream);
- iComb.iRight->Externalize2L(aWriteStream);
- break;
-
- case EPluginId:
- aWriteStream.WriteInt32L(iPluginId);
- break;
-
- case EPluginType:
- aWriteStream.WriteInt32L(iPluginType);
- break;
-
- case ENull:
- aWriteStream.WriteInt32L(iPluginId);
- break;
- default:
- // this case should not be reached because this
- // object has passed the invariant.
- break;
- }
- }
-
-
-// restore the encoded authentication expression
-
-
-EXPORT_C CAuthExpressionImpl* CAuthExpressionImpl::NewL(RReadStream& aReadStream)
-/**
- Factory function reconstructs an authentication
- expression from the supplied stream.
-
- @param aReadStream Stream containing externalized
- authentication expression. This must
- have been generated with CAuthExpressionImpl::ExternalizeL.
- @return Authorisation expression internalized
- from the supplied stream.
- @leave KErrNoMemory Not enough memory to reconstruct the expression.
- @leave KErrInternalizeInvalidAuthExpr The supplied stream does not
- describe a valid authentication expression.
- @leave KErrAuthServUnsupportedExprVersion The supplied stream
- was created with a later version of CAuthExpressionImpl.
- @see CAuthExpressionImpl::ExternalizeL
- */
- {
- TInt8 ver = aReadStream.ReadInt8L();
- if (ver > KVersion)
- User::Leave(KErrAuthServUnsupportedExprVersion);
-
- return New2L(aReadStream);
- }
-
-CAuthExpressionImpl* CAuthExpressionImpl::New2L(RReadStream& aReadStream)
-/**
- Helper function for NewL. This recursively constructs the
- authentication expression after NewL has checked that it
- supports the encoded version.
-
- @param aReadStream Stream containing externalized
- authentication expression. This must
- have been generated with CAuthExpressionImpl::ExternalizeL.
- @return Authorisation expression internalized
- from the supplied stream.
- @leave KErrNoMemory Not enough memory to reconstruct the expression.
- @leave KErrInternalizeInvalidAuthExpr The supplied stream does not
- describe a valid authentication expression.
- @see CAuthExpressionImpl::ExternalizeL
- */
- {
- CAuthExpressionImpl::TType t;
- t = static_cast<CAuthExpressionImpl::TType>(aReadStream.ReadInt8L());
-
- switch(t)
- {
- case CAuthExpressionImpl::EAnd:
- case CAuthExpressionImpl::EOr:
- {
- CAuthExpressionImpl* left = CAuthExpressionImpl::New2L(aReadStream);
- CleanupStack::PushL(left);
- CAuthExpressionImpl* right = CAuthExpressionImpl::New2L(aReadStream);
- CleanupStack::PushL(right);
- CAuthExpressionImpl* complex = new(ELeave) CAuthExpressionImpl(t, left, right);
- CleanupStack::Pop(2, left); // complex now owns left and right
- return complex;
- }
-
- case CAuthExpressionImpl::EPluginId:
- return new(ELeave) CAuthExpressionImpl(
- static_cast<TPluginId>(aReadStream.ReadInt32L()));
-
- case CAuthExpressionImpl::EPluginType:
- return new(ELeave) CAuthExpressionImpl(
- static_cast<TAuthPluginType>(aReadStream.ReadInt32L()));
-
-
- case CAuthExpressionImpl::ENull:
- return new(ELeave) CAuthExpressionImpl();
-
- default:
- User::Leave(KErrAuthServInvalidInternalizeExpr);
- return 0; // avoid 'return value expected' warning
- }
- }
-
-/**
- Helper function which converts the string into a form that can
- be processed as tokens by TLex.Essentially, this method parses and appends
- space in the input string when delimiters("(",")","&" and "|") are
- encountered, consequenty the resultant string thus obtained can be parsed
- using TLex.
-
- @param aStringToBeProcessed string to be processed.
- @param aResultantString a buffer which does not already own any allocated memory, and is populated
- with a string resulting from processing aStringToBeProcessed.
-
- */
-
-EXPORT_C void CAuthExpressionImpl::InsertSpaceBetweenOperatorsL(const TDesC& aStringToBeProcessed, RBuf& aResultantString)
- {
- TChar ch = 0;
- _LIT(KSeparator, " ");
- HBufC* strBuffer = HBufC::NewLC(KMaxBufferSize);
- TPtr strPtr(strBuffer->Des());
-
- // length of 2 KSeparator and 1 ch.
- const TInt KAddLength = 3;
-
- for(TInt i = 0; i < aStringToBeProcessed.Length(); ++i)
- {
- ch = aStringToBeProcessed[i];
-
- // check whether appending 3 characters(2 KSeparator and 1 ch) to
- // aResultantAliasString exceeds the Maxlength.
- TInt resultingLen = strPtr.Length() + KAddLength;
- if(resultingLen > KMaxBufferSize)
- {
- strBuffer->ReAllocL(resultingLen);
- }
-
- if(ch == '(' || ch == ')' || ch == '&' || ch == '|')
- {
- strPtr.Append(KSeparator);
- strPtr.Append(ch);
- strPtr.Append(KSeparator);
- }
-
- else
- {
- strPtr.Append(ch);
- }
- }
-
- CleanupStack::Pop(strBuffer);
- aResultantString.Assign(strBuffer);
- }
-
-/**
- Creates CAuthExpression object from a string defining an authentication.
- strength.The ownership of CAuthExpression object is transferred to the caller.
-
- @param aStrengthAliasString a string defining an authentication.
- strength obtained from the authserver cenrep file.
-
- @return CAuthExpression object.
-
- @leave KErrAuthServInvalidAliasStringExpression, when aStrengthAliasString contains tokens other than pluginId, pluginType
- and operators '&', '|', '(' and ')'
-
- */
-
- EXPORT_C CAuthExpression* CAuthExpressionImpl::CreateAuthExprObjectL(const TDesC& aStrengthAliasString)
- {
- RBuf resultantAliasString;
- CleanupClosePushL(resultantAliasString);
-
- // tokenize aStrengthAliasString, to facilitate parsing using TLex.
- InsertSpaceBetweenOperatorsL(aStrengthAliasString, resultantAliasString);
-
- // facilitates ordering of expression evaluation via brackets.
- CAuthExpression* authExpression = EvaluateAliasStringL(resultantAliasString);
- CleanupStack::PopAndDestroy();
-
- return authExpression;
- }
-
-
- /**
- This method facilitates ordering of alias string expression (containing pluginIds or pluginTypes
- or a combination of both) evaluation via brackets.The ownership of CAuthExpression object is
- transferred to the caller.
-
- @param aStrengthAliasString an alias string to be parsed and processed.This must be enclosed within brackets.
-
- @return CAuthExpression object.
-
- @leave KErrAuthServInvalidAliasStringExpression, when aStrengthAliasString contains tokens other than pluginId, pluginType
- and operators('&', '|') and brackets.
-
- */
-
- CAuthExpression* CAuthExpressionImpl::EvaluateAliasStringL(const RBuf& aStrengthAliasString)
- {
- TLex input(aStrengthAliasString);
-
- // array of operators (& and |) and brackets.
- const TInt KGranularity = 8;
- CArrayFixFlat<TPtrC>* opStack = new(ELeave) CArrayFixFlat<TPtrC>(KGranularity);
- CleanupStack::PushL(opStack);
-
- // array of CAuthExpression objects.
- RPointerArray<CAuthExpression> authExpressionArray;
- CleanupResetAndDestroyPushL(authExpressionArray);
-
- for (TPtrC token = input.NextToken(); token.Size() > 0 ;
- token.Set(input.NextToken()))
- {
- TInt count = 0;
- TInt index = 0;
- if(token.CompareF(KAuthOpOr) == 0)
- {
- count = opStack->Count();
- index = count - 1;
- // only when the previous element in the opStack is not "&" , will token be added on the opStack.
- if(index >= 0 && opStack->At(index) != KAuthOpAnd)
- {
- opStack->AppendL(token);
- }
-
- else
- {
- // atleast 1 element in opStack is "&",hence iterate through opStack and
- // keep creating auth expression object until the loop ends.
- while(index >= 0 && opStack->At(index) == KAuthOpAnd)
- {
- CAuthExpression* authExpr = CreateAuthExpressionL(authExpressionArray, opStack->At(index));
- opStack->Delete(index);
- opStack->Compress();
- CleanupStack::PushL(authExpr);
- authExpressionArray.AppendL(authExpr);
- CleanupStack::Pop(authExpr);
- --index;
- }
-
- opStack->AppendL(token);
- }
- } //if(token.CompareF(KAuthOpOr) == 0)
-
- else if(token.CompareF(KAuthOpAnd) == 0 || token.CompareF(KOpenBracket) == 0)
- {
- opStack->AppendL(token);
- }
-
- else if(token.CompareF(KCloseBracket) == 0)
- {
- // when the previous element in the opStack is "(", delete it.
- count = opStack->Count();
- index = count - 1;
- TInt exprCount = authExpressionArray.Count();
-
- if(index >= 0 && opStack->At(index) == KOpenBracket)
- {
- opStack->Delete(index);
- opStack->Compress();
- }
-
- // the previous element could be an operator/operators of same precedence.
- else
- {
- while(index >= 0 && opStack->At(index) != KOpenBracket)
- {
- CAuthExpression* expr = CreateAuthExpressionL(authExpressionArray, opStack->At(index));
- CleanupStack::PushL(expr);
- authExpressionArray.AppendL(expr);
- CleanupStack::Pop(expr);
- opStack->Delete(index);
- opStack->Compress();
- --index;
- } //while
-
- if(index == -1)
- {
- User::Leave(KErrAuthServInvalidAliasStringExpression);
- }
-
- opStack->Delete(index);
- opStack->Compress();
- }
- } //else if(token.CompareF(KCloseBracket) == 0)
-
- //when the token is neither "(","|","&" and ")" , it must be a plugin id or plugin Type,
- //hence create a CAuthExpression object.
- else
- {
- CAuthExpression* expression = CreateAuthExpressionL(token);
- CleanupStack::PushL(expression);
- authExpressionArray.AppendL(expression);
- CleanupStack::Pop(expression);
- }
- } //for loop
-
- // since authExpressionArray will eventually contain only 1 authExpression pointer,
- // remove it from the array, as the ownership of this pointer is transferred to the caller.
- __ASSERT_ALWAYS((authExpressionArray.Count() == 1), User::Leave(KErrAuthServInvalidAliasStringExpression));
-
- CAuthExpression* authExpression = authExpressionArray[0];
- authExpressionArray.Remove(0);
-
- CleanupStack::PopAndDestroy(2, opStack); //opStack and authExpressionArray
- return authExpression;
-
- }
-
-/**
- Creates CAuthExpression object from an alias string containing either
- plugin Id or plugin type.The ownership of the object is transferred to the caller.
-
- @param aAliasString string containing either plugin Id or plugin Type.
-
- @return CAuthExpression object.
-
- @leave KErrAuthServInvalidAliasStringExpression, if the operands or operators are invalid strings.
-
- @leave KErrNoMemory, if there was insufficient memory to allocate the CAuthExpression object.
- */
- CAuthExpression* CAuthExpressionImpl::CreateAuthExpressionL(const TDesC& aAliasString)
- {
- TLex input(aAliasString);
- CAuthExpression* expression = 0;
- TPluginId plugin = 0;
-
- for (TPtrC token = input.NextToken(); token.Size() > 0 ;
- token.Set(input.NextToken()))
- {
- TLex lexer(token);
- if(token.CompareF(KAuthBiometric) == 0)
- {
- expression = AuthExpr(EAuthBiometric);
- }
- else if(token.CompareF(KAuthKnowledge) == 0)
- {
- expression = AuthExpr(EAuthKnowledge);
- }
- else if(token.CompareF(KAuthToken) == 0)
- {
- expression = AuthExpr(EAuthToken);
- }
- else if(token.CompareF(KAuthPerformance) == 0)
- {
- expression = AuthExpr(EAuthPerformance);
- }
- else if(token.CompareF(KAuthDefault) == 0)
- {
- expression = AuthExpr(EAuthDefault);
- }
- else if(lexer.Val(plugin, EHex) == KErrNone)
- {
- expression = AuthExpr(plugin);
- }
- else
- {
- User::Leave(KErrAuthServInvalidAliasStringExpression);
- }
- }
-
-
- if(expression == NULL)
- {
- User::Leave(KErrNoMemory);
- }
-
- return expression;
- }
-
-/**
- Creates CAuthExpression object from an array of authexpression objects and an operator.
- The ownership of the object is transferred to the caller.
-
- @param aAuthExprArray an array of authexpression objects.
- @param aOperator an authexpression operator ( '&' or '|').
-
- @return CAuthExpression object.
- @leave KErrAuthServInvalidAliasStringExpression, if the operands or operators are invalid strings.
-
- */
- CAuthExpression* CAuthExpressionImpl::CreateAuthExpressionL(RPointerArray<CAuthExpression>& aAuthExprArray, TPtrC aOperator)
- {
- // aAuthExprArray must contain minimum of 2 elements.
- __ASSERT_ALWAYS((aAuthExprArray.Count() >= 2), User::Leave(KErrAuthServInvalidAliasStringExpression));
-
- CAuthExpression* authExpression = 0;
- TInt exprIndex = aAuthExprArray.Count() - 1;
-
- if(aOperator.CompareF(KAuthOpAnd) == 0)
- {
- authExpression = AuthAnd(aAuthExprArray[exprIndex], aAuthExprArray[exprIndex-1]);
- }
-
- else if(aOperator.CompareF(KAuthOpOr) == 0)
- {
- authExpression = AuthOr(aAuthExprArray[exprIndex], aAuthExprArray[exprIndex-1]);
- }
-
- else
- {
- User::Leave(KErrAuthServInvalidAliasStringExpression);
- }
-
- // array elements are not deleted since the ownership is transferred to authExpression,
- aAuthExprArray.Remove(exprIndex);
- aAuthExprArray.Remove(exprIndex-1);
- aAuthExprArray.Compress();
-
- return authExpression;
- }
-
-
-#ifndef _DEBUG
-// In release mode provide stub functions for Panic() and Invariant().
-
-EXPORT_C void CAuthExpressionImpl::Panic(TPanic /* aPanic */)
- {
- // empty.
- }
-
-EXPORT_C TBool CAuthExpressionImpl::Invariant() const
- {
- return ETrue;
- }
-
-#else
-
-EXPORT_C void CAuthExpressionImpl::Panic(TPanic aPanic)
-/**
- This function is defined for debug builds only.
- It halts the current thread when an invalid
- argument is supplied to one of CAuthExpressionImpl's functions.
-
- The current thread is panicked with category "AUTHEXPR"
- and the supplied reason.
-
- @param aPanic Panic reason.
- */
- {
- _LIT(KPanicCat, "AUTHEXPR");
- User::Panic(KPanicCat, aPanic);
- }
-
-EXPORT_C TBool CAuthExpressionImpl::Invariant() const
-/**
- This function is defined for debug builds, and
- checks that the object is internally consistent.
-
- The node's type must be a supported value - AND, OR,
- plugin ID, or plugin type.
-
- If this is a combining node then recursively ensure
- that both the left and right nodes are internally
- consistent.
- */
- {
- // this node's parent sees it as a child
- if (iParent != 0 && !(iParent->iComb.iLeft == this || iParent->iComb.iRight == this))
- return EFalse;
-
- switch (iType)
- {
- case EPluginId:
- case EPluginType:
- return ETrue;
-
- case EAnd:
- case EOr:
- // these will fault, as opposed to fail the invariant,
- // if the pointers are invalid, but so would the original
- // call to this function if the this pointer were invalid.
-
- // this node's children see it as the parent
- // don't use Parent() because that asserts on the
- // subexpression, whereas this function should
- // return EFalse.
- if (iComb.iLeft->iParent != this)
- return EFalse;
-
- if (iComb.iRight->iParent != this)
- return EFalse;
-
- return iComb.iLeft->Invariant() && iComb.iRight->Invariant();
-
- case ENull:
- return ETrue;
-
- default:
- // unrecognized node type, so fail invariant
- return EFalse;
- }
- }
-
-#endif // #ifdef _DEBUG
-
-