diff -r fc7b30ed2058 -r 05bc53fe583b keepalive/flextimer/server/engine/src/flextimerengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/keepalive/flextimer/server/engine/src/flextimerengine.cpp Tue Aug 31 15:35:44 2010 +0300 @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2010 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 + * + * Description: + * This class contains implementation of CFlexTimerEngine. + * + */ + +// System include files +// None + +// User include files +#include "flextimerengine.h" +#include "flextimercontainer.h" +#include "flextimerwakeuptimer.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "flextimerengineTraces.h" +#endif + + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +EXPORT_C CFlexTimerEngine* CFlexTimerEngine::NewL() + { + CFlexTimerEngine* self = new (ELeave) CFlexTimerEngine(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CFlexTimerEngine::~CFlexTimerEngine() + { + OstTrace0( TRACE_INTERNAL, + CFLEXTIMERENGINE_CFLEXTIMERENGINE, + "CFlexTimerEngine::~CFlexTimerEngine" ); + + delete iFlexTimerContainer; + delete iWakeUpTimer; + } +// --------------------------------------------------------------------------- +// Add new timer and trap leave. Return Leave code to session. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CFlexTimerEngine::AddTimer( + const TTimeIntervalMicroSeconds& aWinStartInterval, + const TTimeIntervalMicroSeconds& aWinEndInterval, + TBool aCancelAtSystemTimeChange, + const MFlexTimerServiceCB* aFlexTimerServiceCB ) + { + TRAPD( err, + iFlexTimerContainer->AddTimerL( aWinStartInterval, + aWinEndInterval, + aCancelAtSystemTimeChange, + aFlexTimerServiceCB ) ); + + if ( KErrNone == err ) + { + StartTimer(); + } + return err; + } +// --------------------------------------------------------------------------- +// Remove timer from container queue and start new wakeup watch timer +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CFlexTimerEngine::CancelTimer( + const MFlexTimerServiceCB* aFlexTimerServiceCB ) + { + TInt error = iFlexTimerContainer->RemoveTimer( aFlexTimerServiceCB ); + StartTimer(); + + return error; + } + +// --------------------------------------------------------------------------- +// Wakeup timer expired, Fire timers according to some algorithm set and +// restart wakeup timer. +// --------------------------------------------------------------------------- +// +void CFlexTimerEngine::WakeUp() + { + OstTrace0( TRACE_INTERNAL, + CFLEXTIMERENGINE_WAKEUP, + "CFlexTimerEngine::WakeUp" ); + + iFlexTimerContainer->FireTimers( + CFlexTimerContainer::EFlexTimerAlgorithmLatestPossible ); + + StartTimer(); + } +// --------------------------------------------------------------------------- +// System time is changed. Abort all timers that need to be aborted and +// restart wakeup timer. +// --------------------------------------------------------------------------- +// +void CFlexTimerEngine::SystemTimeChanged() + { + OstTrace0( TRACE_INTERNAL, + CFLEXTIMERENGINE_SYSTEMTIMECHANGED, + "CFlexTimerEngine::SystemTimeChanged" ); + + iFlexTimerContainer->AbortTimersDueToTimeChange( KErrAbort ); + StartTimer(); + } +// --------------------------------------------------------------------------- +// Private constructor +// --------------------------------------------------------------------------- +// +CFlexTimerEngine::CFlexTimerEngine() : iFlexTimerContainer( NULL ), + iWakeUpTimer( NULL ) + { + OstTrace0( TRACE_INTERNAL, + DUP_CFLEXTIMERENGINE_CFLEXTIMERENGINE, + "CFlexTimerEngine::CFlexTimerEngine" ); + //Nothing to do here + } +// --------------------------------------------------------------------------- +// Private 2nd phase construction +// --------------------------------------------------------------------------- +// +void CFlexTimerEngine::ConstructL() + { + iFlexTimerContainer = CFlexTimerContainer::NewL(); + iWakeUpTimer = CFlexTimerWakeUpTimer::NewL( *this ); + } +// --------------------------------------------------------------------------- +// Stop timer just in case it is already running (e.g. after AddTimer()) +// and Start new wakeup timer according to current situation in container +// queues If timeout window has passed fire timers right now. +// --------------------------------------------------------------------------- +// +void CFlexTimerEngine::StartTimer() + { + TTimeIntervalMicroSeconds nextTimeout; + + // Stop the timer, because, if there are no more pending timeouts, the + // wake-up timer needs to be stopped. If timeouts are found, the timer is + // is restarted below. + iWakeUpTimer->StopTimer(); + + if ( iFlexTimerContainer->GetNextTimeout( nextTimeout ) ) + { + // If timeout is in the future, timer is started to wake up at that + // moment. + if ( nextTimeout > TTimeIntervalMicroSeconds( 0 ) ) + { + iWakeUpTimer->StartTimer( nextTimeout ); + } + // If timer is due now or in the past, Lets fire those right now. + else + { + WakeUp(); + } + } + // Else no timers, so no need for timeouts. Server is propably about to be + // deleted. + }