contextframework/cfw/src/basicoperationsplugin/cfcontextchanged.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfw/src/basicoperationsplugin/cfcontextchanged.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,293 @@
+/*
+* 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:  CCFContextChanged class implementation.
+*
+*/
+
+
+
+// INCLUDES
+#include "cfcontextchanged.h"
+#include "cfcontextoperationutils.h"
+#include "cfbasicoptrace.h"
+
+#include <gmxmlnode.h>
+
+// CONSTANTS
+_LIT( KScriptChangedName, "contextChanged" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCFContextChanged::CCFContextChanged
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCFContextChanged::CCFContextChanged( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    HBufC* aName,
+    HBufC* aSource )
+    : CCFContextOperation( aServices, aParent, aName, aSource )
+    {
+    FUNC_LOG;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextChanged::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCFContextChanged::ConstructL( const TDesC& aValue )
+    {
+    FUNC_LOG;
+
+    if ( aValue.Length() )
+        {
+        iCmpValue = aValue.AllocL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextChanged::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCFContextChanged* CCFContextChanged::NewL( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    const TDesC& aName,
+    const TDesC& aSource,
+    const TDesC& aValue )
+    {
+    FUNC_LOG;
+
+    CCFContextChanged* self
+        = NewLC( aServices, aParent, aName, aSource, aValue );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextChanged::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCFContextChanged* CCFContextChanged::NewLC( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    const TDesC& aName,
+    const TDesC& aSource,
+    const TDesC& aValue )
+    {
+    FUNC_LOG;
+
+    HBufC* name = aName.AllocLC();
+    HBufC* source = aSource.AllocLC();
+    CCFContextChanged* self
+        = new( ELeave ) CCFContextChanged( 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;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextChanged::ParseL
+// Construction with parsing from a DOM node.
+// -----------------------------------------------------------------------------
+//
+CCFContextChanged* CCFContextChanged::ParseL( MCFOperationServices& aServices,
+    CCFOperationNode* aParent,
+    CMDXMLNode& aNode )
+    {
+    FUNC_LOG;
+
+    if ( aNode.NodeName().CompareF( KScriptChangedName ) != 0 )
+        {
+        return NULL; // Cannot create context changed 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();
+        }
+
+    CCFContextChanged* self = NULL;
+    if ( argsOK && contextRefOK )
+        {
+        self = NewL( aServices,
+                aParent,
+                contextType,
+                contextSource,
+                contextValue );
+        if ( contextLevelDelay )
+            {
+            self->iContextLevelDelay = contextLevelDelay;
+            }
+        }
+    else
+        {
+        INFO( "CCFContextChanged::ParseL - Unsupported arguments" );
+        }
+
+    CREATE_DOM_INFO( self, aNode );
+
+    return self;
+    }
+
+
+// Destructor
+CCFContextChanged::~CCFContextChanged()
+    {
+    FUNC_LOG;
+
+    delete iCmpValue;
+    }
+
+// ---------------------------------------------------------------------------
+// CCFContextChanged::IsAllRequired
+// ---------------------------------------------------------------------------
+//
+TBool CCFContextChanged::IsAllRequired() const
+    {
+    FUNC_LOG;
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CCFContextChanged::Evaluate
+// ---------------------------------------------------------------------------
+//
+TBool CCFContextChanged::Evaluate( const CCFContextObject& aContext,
+    TInt& aContextLevelDelay )
+    {
+    FUNC_LOG;
+
+    DOM_INFO( "CCFContextChanged::Evaluate" );
+
+    // Ask concrete implementation if it is true.
+    TInt val( EFalse );
+    TRAPD( err, val = IsTrueL( aContext ) );
+
+    if ( err != KErrNone )
+        {
+        ERROR( err,
+            "CCFContextChanged: IsTrueL leave occurred, evaluation cancelled" );
+        return EFalse;
+        }
+
+    // Evaluate parents if we have changed.
+    if ( val != iValue )
+        {
+        INFO_1( "CCFContextChanged::Evaluate - Value changed to (-1=undefined, 0=false, 1=true): %d", val );
+
+        iValue = static_cast< TCFConditionValue >( val );
+        if ( iParent )
+            {
+            iParent->Evaluate();
+            }
+        }
+    else
+        {
+        INFO_1( "CCFContextChanged::Evaluate - Value still (-1=undefined, 0=false, 1=true): %d", val );
+        }
+
+    if ( iPreviousTruthCheckWithReferencedContext )
+        {
+        aContextLevelDelay = iContextLevelDelay;
+        }
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CCFContextChanged::IsTrueL
+// -----------------------------------------------------------------------------
+//
+TBool CCFContextChanged::IsTrueL( const CCFContextObject& aContext )
+    {
+    FUNC_LOG;
+
+    TBool value( EFalse );
+    if ( aContext.Source() == Source() && aContext.Type() == Type() )
+        {
+        INFO_2( "CCFContextChanged::IsTrueL - Current value [%S] <> [%S] new value",
+            &PreviousValue(), &aContext.Value() );
+
+        // Check if context has changed since last time.
+        if ( PreviousValue() != aContext.Value() )
+            {
+            if ( iCmpValue )
+                {
+                if ( aContext.Value() == *iCmpValue )
+                    {
+                    value = ETrue;
+                    }
+                }
+            else
+                {
+                value = ETrue;
+                }
+
+            TInt err = UpdatePreviousValue( aContext.Value() );
+            ERROR( err, "Previous value update failed! [CCFContextChanged]" );
+            }
+        iPreviousTruthCheckWithReferencedContext = ETrue;
+        }
+    else
+        {
+        iPreviousTruthCheckWithReferencedContext = EFalse;
+        }
+
+    return value;
+    }