contextframework/cfw/src/basicoperationsplugin/cfcontextupdated.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfw/src/basicoperationsplugin/cfcontextupdated.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2002-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:  CCFContextUpdated class implementation.
+*
+*/
+
+
+
+// INCLUDES
+#include "cfcontextupdated.h"
+#include "cfcontextoperationutils.h"
+#include "cfbasicoptrace.h"
+
+#include <gmxmlnode.h>
+
+// CONSTANTS
+_LIT( KScriptUpdatedName, "contextUpdated" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCFContextUpdated::CCFContextUpdated
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCFContextUpdated::CCFContextUpdated( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    HBufC* aName,
+    HBufC* aSource )
+    : CCFContextOperation( aServices, aParent, aName, aSource )
+    {
+    FUNC_LOG;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextUpdated::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCFContextUpdated::ConstructL( const TDesC& aValue )
+    {
+    FUNC_LOG;
+
+    if ( aValue.Length() )
+        {
+        iCmpValue = aValue.AllocL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextUpdated::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCFContextUpdated* CCFContextUpdated::NewL( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    const TDesC& aName,
+    const TDesC& aSource,
+    const TDesC& aValue )
+    {
+    FUNC_LOG;
+
+    CCFContextUpdated* self
+        = NewLC( aServices, aParent, aName, aSource, aValue );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextUpdated::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCFContextUpdated* CCFContextUpdated::NewLC( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    const TDesC& aName,
+    const TDesC& aSource,
+    const TDesC& aValue )
+    {
+    FUNC_LOG;
+
+    HBufC* name = aName.AllocLC();
+    HBufC* source = aSource.AllocLC();
+    CCFContextUpdated* self
+        = new( ELeave ) CCFContextUpdated( aServices, aParent, name, source );
+    CleanupStack::PushL( self );
+    self->ConstructL( aValue );
+
+    // Cleanup
+    CleanupStack::Pop( self );
+    CleanupStack::Pop( source );
+    CleanupStack::Pop( name );
+
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextUpdated::ParseL
+// Construction with parsing from a DOM node.
+// -----------------------------------------------------------------------------
+//
+CCFContextUpdated* CCFContextUpdated::ParseL( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    CMDXMLNode& aNode )
+    {
+    FUNC_LOG;
+
+    if ( aNode.NodeName().CompareF( KScriptUpdatedName ) != 0 )
+        {
+        return NULL; // Cannot create context updated operation from the node.
+        }
+
+    TPtrC contextSource;
+    TPtrC contextType;
+    TPtrC contextValue;
+    TInt contextLevelDelay( 0 );
+
+    TBool argsOK( ETrue );
+    TBool contextRefOK( EFalse );
+    CMDXMLNode* child = aNode.FirstChild();
+    while ( child )
+        {
+        if ( child->NodeType() == CMDXMLNode::EElementNode )
+            {
+            if ( !contextRefOK )
+                {
+                contextRefOK = CFContextOperationUtils::ParseContextRef(
+                        *child,
+                        contextSource,
+                        contextType,
+                        contextValue,
+                        contextLevelDelay );
+                if ( !contextRefOK )
+                    {
+                    argsOK = EFalse;
+                    break;
+                    }
+                }
+            else
+                {
+                argsOK = EFalse;
+                break;
+                }
+            }
+        else if ( child->NodeType() != CMDXMLNode::ECommentNode )
+            {
+            argsOK = EFalse; // Unsupported node encountered.
+            break;
+            }
+        child = child->NextSibling();
+        }
+
+    CCFContextUpdated* self = NULL;
+    if ( argsOK && contextRefOK )
+        {
+        self = NewL( aServices,
+                aParent,
+                contextType,
+                contextSource,
+                contextValue );
+        if ( contextLevelDelay )
+            {
+            self->iContextLevelDelay = contextLevelDelay;
+            }
+        }
+    else
+        {
+        INFO( "CCFContextUpdated::ParseL - Unsupported arguments" );
+        }
+
+    CREATE_DOM_INFO( self, aNode );
+
+    return self;
+    }
+
+
+// Destructor
+CCFContextUpdated::~CCFContextUpdated()
+    {
+    FUNC_LOG;
+
+    delete iCmpValue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCFContextUpdated::IsAllRequired
+// ---------------------------------------------------------------------------
+//
+TBool CCFContextUpdated::IsAllRequired() const
+    {
+    FUNC_LOG;
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CCFContextUpdated::Evaluate
+// ---------------------------------------------------------------------------
+//
+TBool CCFContextUpdated::Evaluate( const CCFContextObject& aContext,
+    TInt& aContextLevelDelay )
+    {
+    FUNC_LOG;
+
+    DOM_INFO( "CCFContextUpdated::Evaluate" );
+
+    // Ask concrete implementation if it is true.
+    TInt val( EFalse );
+    TRAPD( err, val = IsTrueL( aContext ) );
+
+    if ( err != KErrNone )
+        {
+        ERROR( err,
+            "CCFContextUpdated: IsTrueL leave occurred, evaluation cancelled" );
+        return EFalse;
+        }
+
+    // Evaluate parents if we have changed.
+    if ( val != iValue )
+        {
+        INFO_1( "CCFContextUpdated::Evaluate - Value changed to (-1=undefined, 0=false, 1=true): %d", val );
+
+        iValue = static_cast< TCFConditionValue >( val );
+        if ( iParent )
+            {
+            iParent->Evaluate();
+            }
+        }
+    else
+        {
+        INFO_1( "CCFContextUpdated::Evaluate - Value still (-1=undefined, 0=false, 1=true): %d", val );
+        }
+
+    if ( iPreviousTruthCheckWithReferencedContext )
+        {
+        aContextLevelDelay = iContextLevelDelay;
+        }
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextUpdated::IsTrueL
+// -----------------------------------------------------------------------------
+//
+TBool CCFContextUpdated::IsTrueL( const CCFContextObject& aContext )
+    {
+    FUNC_LOG;
+
+    TBool value( EFalse );
+    if ( aContext.Source() == Source() && aContext.Type() == Type() )
+        {
+        // Context was updated, no need to check for change.
+        if ( iCmpValue )
+            {
+            if ( aContext.Value() == *iCmpValue )
+                {
+                value = ETrue;
+                }
+            }
+        else
+            {
+            value = ETrue;
+            }
+        iPreviousTruthCheckWithReferencedContext = ETrue;
+        }
+    else
+        {
+        iPreviousTruthCheckWithReferencedContext = EFalse;
+        }
+
+    return value;
+    }