diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/src/basicoperationsplugin/cfdelay.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfw/src/basicoperationsplugin/cfdelay.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,149 @@ +/* +* Copyright (c) 2007-2007 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: CCFDelay class implementation. +* +*/ + + + +// INCLUDE FILES +#include "cfdelay.h" +#include "cfbasicoptrace.h" + + +// ======== MEMBER FUNCTIONS ======== + +//----------------------------------------------------------------------------- +// CCFDelay::CCFDelay +// Delayed evaluation should be as exact as possible. Set high priority. +//----------------------------------------------------------------------------- +// +CCFDelay::CCFDelay( MCFDelayExpired& aDelayer ) + : CTimer( EPriorityHigh ), + iDelayer( aDelayer ) + { + FUNC_LOG; + } + +//----------------------------------------------------------------------------- +// CCFDelay::ConstructL +//----------------------------------------------------------------------------- +// +void CCFDelay::ConstructL() + { + FUNC_LOG; + + // Construct ctimer + CTimer::ConstructL(); + + // Add into active scheduler if not already added + if( !IsAdded() ) + { + CActiveScheduler::Add( this ); + } + } + +//----------------------------------------------------------------------------- +// CCFDelay::NewL +//----------------------------------------------------------------------------- +// +CCFDelay* CCFDelay::NewL( MCFDelayExpired& aDelayer ) + { + FUNC_LOG; + + CCFDelay* self = CCFDelay::NewLC( aDelayer ); + CleanupStack::Pop( self ); + return self; + } + +//----------------------------------------------------------------------------- +// CCFDelay::NewLC +//----------------------------------------------------------------------------- +// +CCFDelay* CCFDelay::NewLC( MCFDelayExpired& aDelayer ) + { + FUNC_LOG; + + CCFDelay* self = new( ELeave ) CCFDelay( aDelayer ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor +CCFDelay::~CCFDelay() + { + FUNC_LOG; + + Cancel(); + } + + +//----------------------------------------------------------------------------- +// CCFDelay::Delay +//----------------------------------------------------------------------------- +// +void CCFDelay::Delay( const TTimeIntervalMicroSeconds32& aDelay ) + { + FUNC_LOG; + + TBool startDelay = ETrue; + if ( IsActive() ) + { + TTime currentTime; + currentTime.HomeTime(); + TInt64 elapsedTime = currentTime.Int64() - iDelayStartTime.Int64(); + if ( aDelay.Int() < ( iDelay - elapsedTime ) ) + { + startDelay = EFalse; // Current delay outlasts the new one + } + } + + if ( startDelay ) + { + Cancel(); // Cancel ongoing timer if any + + iDelay = aDelay.Int(); + iDelayStartTime.HomeTime(); + After( aDelay ); // Start delay + } + } + +//----------------------------------------------------------------------------- +// CCFDelay::RunL +//----------------------------------------------------------------------------- +// +void CCFDelay::RunL() + { + FUNC_LOG; + + iDelayer.ExpiredL(); + } + +//----------------------------------------------------------------------------- +// CCFDelay::RunError +//----------------------------------------------------------------------------- +// +#ifndef ERROR_TRACE +TInt CCFDelay::RunError( TInt /*aError*/ ) +#else // ERROR_TRACE defined +TInt CCFDelay::RunError( TInt aError ) +#endif + { + FUNC_LOG; + + ERROR( aError, "Call MCFDelayExpired::ExpiredL() leave code: %d (skipped)" ); + + return KErrNone; // Ignore errors + }