menufw/hierarchynavigator/hnmetadatamodel/src/hnconditionfactory.cpp
changeset 0 f72a12da539e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menufw/hierarchynavigator/hnmetadatamodel/src/hnconditionfactory.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2007-2008 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: 
+*
+*/
+
+
+#include "hnconditionfactory.h"
+#include "hnsimplecondition.h"
+#include "hncomplexcondition.h"
+#include "hnglobals.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnConditionInterface* HnConditionFactory::NewL( TXmlEngAttr aElement )
+    {
+    CHnConditionInterface* self = HnConditionFactory::NewLC( aElement );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnConditionInterface* HnConditionFactory::NewLC( TXmlEngAttr aElement )
+    {
+    TPtrC8 condition = aElement.Value();
+    CHnConditionInterface* self = ConstructConditionL( condition );
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnConditionInterface* HnConditionFactory::NewL( TDesC8 & aElement )
+    {
+    CHnConditionInterface* self = HnConditionFactory::NewLC( aElement );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnConditionInterface* HnConditionFactory::NewLC( TDesC8 & aElement )
+    {
+    CHnConditionInterface* self = HnConditionFactory::ConstructConditionL( aElement );
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void HnConditionFactory::TrimConditionL( RBuf8 & aConditionString )
+    {
+    TBool ret;
+    do
+        {
+        ret = EFalse;
+        aConditionString.TrimAll();
+        TInt conditionLastIndex = aConditionString.Length()-1;
+        if (aConditionString[0] == EOpeningBrace 
+                && aConditionString[conditionLastIndex] == EClosingBrace )
+            {
+            aConditionString[0] = ESpace;
+            aConditionString[conditionLastIndex] = ESpace;
+            
+            ret = ETrue;
+            
+            if ( CheckBraceIntegrityL( aConditionString ) )
+                {
+                aConditionString[0] = EOpeningBrace;
+                aConditionString[conditionLastIndex] = EClosingBrace;
+                ret = EFalse;
+                }
+            }
+        }
+    while (ret);
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool HnConditionFactory::CheckBraceIntegrityL( TDesC8 & aConditionString )
+    {
+    TInt ret(KErrNone);
+    TLex8 lexer( aConditionString );
+    TInt lookForClosingBrace( 0 );
+    while  ( !lexer.Eos() )
+        {
+        switch ( TUint( lexer.Get() ) )
+            {
+            case EOpeningBrace :
+                lookForClosingBrace++;
+                break;
+            case EClosingBrace :
+                lookForClosingBrace--;
+                if (lookForClosingBrace < 0)
+                    {
+                    ret = KErrGeneral;
+                    lexer.Inc( lexer.Remainder().Length() );
+                    }
+                break;             
+            }
+        }
+    
+    if (lookForClosingBrace > 0)
+        {
+        ret = KErrGeneral;
+        }
+    
+    return ret;  
+    }
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnConditionInterface* HnConditionFactory::ConstructConditionL(
+        TDesC8 & aConditionString )
+    {
+    RBuf8 condition;
+    CleanupClosePushL( condition );
+    condition.CreateL( aConditionString );
+    HnConditionFactory::TrimConditionL( condition );
+    User::LeaveIfError( HnConditionFactory::CheckBraceIntegrityL(condition) );
+    
+    CHnConditionInterface* ret = NULL;
+    
+    if ( aConditionString.Find( HnLogicalRelations::KLogicalAnd8 ) == KErrNotFound
+         && aConditionString.Find( HnLogicalRelations::KLogicalOr8 ) == KErrNotFound )
+        {
+        ret =  CHnSimpleCondition::NewL( condition );
+        }
+    else
+        {
+        ret = CHnComplexCondition::NewL( condition );
+        }
+    
+    CleanupStack::PopAndDestroy( &condition );
+    return ret;
+    }
+