diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/src/basicoperationsplugin/cfcontextoperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfw/src/basicoperationsplugin/cfcontextoperation.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,247 @@ +/* +* 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: CCFContextOperation class implementation. +* +*/ + + +// INCLUDES +#include // for KExtDelimiter '.' and KDriveDelimiter ':' + +#include "cfcontextoperation.h" +#include "cfbasicoptrace.h" + +// CONSTANTS +const TInt KCFContextOperationNoContextLevelDelay = 0; +const TInt KDefaultPreviousValueLength = 256; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CCFContextOperation::CCFContextOperation +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CCFContextOperation::CCFContextOperation( MCFOperationServices& aServices, + CCFOperationNode* aParent, + HBufC* aType, + HBufC* aSource ) + : CCFOperationNode( aServices, aParent ), + iContextLevelDelay( 0 ), + iSource( aSource ), + iType( aType ) + { + FUNC_LOG; + + iPreviousValue = HBufC::New( KDefaultPreviousValueLength ); + } + + +// Destructor +CCFContextOperation::~CCFContextOperation() + { + FUNC_LOG; + + delete iSource; + delete iType; + delete iPreviousValue; + } + + +// --------------------------------------------------------------------------- +// CCFContextOperation::Evaluate +// --------------------------------------------------------------------------- +// +TBool CCFContextOperation::Evaluate( const CCFContextObject& aContext, + TInt& aContextLevelDelay ) + { + FUNC_LOG; + + DOM_INFO( "CCFContextOperation::Evaluate" ); + + // Check that context value has changed (context is state information) + if ( iPreviousValue && ( *iPreviousValue ).Compare( aContext.Value() ) == 0 ) + { + INFO_2( "CCFContextOperation::Evaluate - NOT evaluating (prev value [%S] == arg value [%S])!", + iPreviousValue, &aContext.Value() ); + aContextLevelDelay = KCFContextOperationNoContextLevelDelay; + return EFalse; + } + TInt err = UpdatePreviousValue( aContext.Value() ); + ERROR( err, "Previous value update failed!" ); + + // Ask concrete implementation if it is true + TInt val( EFalse ); + TRAP( err, val = IsTrueL( aContext ) ); + + if ( err != KErrNone ) + { + ERROR( err, "CCFContextOperation: IsTrueL leave occurred, evaluation cancelled" ); + return EFalse; + } + + // Evaluate parents if we have changed + if ( val != iValue ) + { + INFO_1( "CCFContextOperation::Evaluate - Value changed to (-1=undefined, 0=false, 1=true): %d", val ); + + iValue = static_cast< TCFConditionValue >( val ); + if ( iParent ) + { + iParent->Evaluate(); + } + } + else + { + INFO_1( "CCFContextOperation::Evaluate - Value still (-1=undefined, 0=false, 1=true): %d", val ); + } + + aContextLevelDelay = iContextLevelDelay; + return ETrue; + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::Source +// --------------------------------------------------------------------------- +// +TPtrC CCFContextOperation::Source() const + { + FUNC_LOG; + + return TPtrC( *iSource ); + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::Type +// --------------------------------------------------------------------------- +// +TPtrC CCFContextOperation::Type() const + { + FUNC_LOG; + + return TPtrC( *iType ); + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::IsAllRequired +// --------------------------------------------------------------------------- +// +TBool CCFContextOperation::IsAllRequired() const + { + FUNC_LOG; + + return EFalse; + } + + +// --------------------------------------------------------------------------- +// CCFContextOperation::UpdatePreviousValue +// --------------------------------------------------------------------------- +// +TInt CCFContextOperation::UpdatePreviousValue( const TDesC& aNewValue ) + { + FUNC_LOG; + + TInt err = KErrNone; + if( !iPreviousValue ) + { + iPreviousValue = HBufC::New( KDefaultPreviousValueLength ); + } + + if( iPreviousValue ) + { + TPtr previousValuePtr = iPreviousValue->Des(); + if( previousValuePtr.MaxLength() >= aNewValue.Length() ) + { + previousValuePtr.Copy( aNewValue ); + } + else + { + delete iPreviousValue; + iPreviousValue = NULL; + iPreviousValue = aNewValue.Alloc(); + if( !iPreviousValue ) + { + err = KErrNoMemory; + } + } + } + else + { + err = KErrNoMemory; + } + + return err; + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::PreviousValue +// --------------------------------------------------------------------------- +// +const TDesC& CCFContextOperation::PreviousValue() + { + if ( iPreviousValue ) + { + return *iPreviousValue; + } + return KNullDesC; + } + + +// --------------------------------------------------------------------------- +// CCFContextOperation::ActivateL +// --------------------------------------------------------------------------- +// +void CCFContextOperation::ActivateL() + { + FUNC_LOG; + + iServices.SubscribeContextL( this ); + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::Deactivate +// --------------------------------------------------------------------------- +// +void CCFContextOperation::Deactivate() + { + FUNC_LOG; + + iServices.RemoveSubscription( this ); + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::CheckSecurity +// --------------------------------------------------------------------------- +// +TInt CCFContextOperation::CheckSecurity() + { + FUNC_LOG; + + if ( !iSource || !iType ) + { + return KErrBadDescriptor; + } + + return iServices.CheckContextReadSecurity( *iSource, *iType ); + } + +// --------------------------------------------------------------------------- +// CCFContextOperation::Evaluate +// --------------------------------------------------------------------------- +// +void CCFContextOperation::Evaluate() + { + FUNC_LOG; + }