diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/src/basicoperationsplugin/cfcontextchanged.cpp --- /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 + +// 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; + }