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