diff -r 489cf6208544 -r 95d45f234cf3 keepalive/flextimer/server/engine/inc/flextimercontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/keepalive/flextimer/server/engine/inc/flextimercontainer.h Wed Jun 23 18:39:24 2010 +0300 @@ -0,0 +1,217 @@ +/* + * 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 definition of CFlexTimerContainer. + * + */ + +// Protection against nested includes +#ifndef FLEXTIMERCONTAINER_H +#define FLEXTIMERCONTAINER_H + +// System includes +#include + +// Forward declarations +class MFlexTimerServiceCB; +class CFlexTimerItem; + +// Class declaration +/** + * Timer container that contains list of CFlexTimerItems, means to add and + * delete them and implementation of algorithms that select which timers + * should be expired. + */ +class CFlexTimerContainer : public CBase + { +public: + /** Supported timer algorithms.*/ + enum TFlexTimerAlgorithm + { + /** Simple algorithm timeouts all timers that have open timeout + * window when one timer expires. + */ + EFlexTimerAlgorithmSimple = 1, + /** Latest possible algorithm tries to delay expiration of timer + * as long as possible. + */ + EFlexTimerAlgorithmLatestPossible + }; + + /** + * Constructs new CFlexTimerContainer. + */ + static CFlexTimerContainer* NewL(); + + /** + * Destructs timercontainer and all timers in the internal lists. + */ + virtual ~CFlexTimerContainer(); + +public: + /** + * Makes new timer item and adds it to timerlist. + * + * @param aWinStartInterval Time interval from present to left side of the + * timer launch window + * @param aWinEndInterval Time interval from present to right side of the + * timer launch window + * @param aCancelAtSystemTimeChange Whether system time change should + * trigger abort + * @param aFlexTimerServiceCB Call back interface. Used to inform about + * timeout, abort etc. + */ + void AddTimerL( + const TTimeIntervalMicroSeconds& aWinStartInterval, + const TTimeIntervalMicroSeconds& aWinEndInterval, + TBool aCancelAtSystemTimeChange, + const MFlexTimerServiceCB* aFlexTimerServiceCB ); + + /** + * Finds correct timer according to aFlexTimerServiceCB and removes it + * from list and finally + * deletes the corresponding CFlexTimerItem. + * @param aFlexTimerServiceCB Call back interface aka. session that + * handles timer. + * @return KErrNone or some system wide error code. + */ + TInt RemoveTimer( const MFlexTimerServiceCB* aFlexTimerServiceCB ); + + /** + * Finds earliest moment that at least one timer must expire and after + * this function returns aNextTimeoutDelay contains number of microseconds + * from now to that moment. + * + * @param after return aNextTimeoutDelay contains time in microseconds + * from now till next timer expiry. If aNextTimeoutDelay is zero, it means + * that expiry time has already passed or is due right now + * @return Active timers indication + * - ETrue if there is at least one timer in queue + * - EFalse if there are no timers + */ + TBool GetNextTimeout( TTimeIntervalMicroSeconds& aNextTimeoutDelay ); + + /** + * Fires all timers that can be fired according to algorithm that is + * supplied as parameter. + * + * @param aAlgorithmToBeUsed Algorithm that is used to fire timers. + * - EFlexTimerAlgorithmSimple + * - EFlexTimerAlgorithmLatestPossible + */ + void FireTimers( TFlexTimerAlgorithm aAlgorithmToBeUsed ); + + /** + * Aborts and removes all timers that are marked with + * aCancelAtSystemTimeChange = ETrue during adding timer. + * + * @param aReason Timers will be aborted with this reason code. Can be + * e.g. KErrAbort + */ + void AbortTimersDueToTimeChange( TInt aReason ); + +private: + /** + * Private constructor. + */ + CFlexTimerContainer(); + + /** + * Excecutes simple algorithm. + * + * Moves timers (that can be fired right now) from iTimerList to + * candidateList. + * + * @param aCandidateList After this function returns, this list contains + * all timers that can be fire right now. + * @param aCurrentTime Current safe UTC time. + */ + void SimpleAlgorithm( TSglQue& aCandidateList, + TTime& aCurrentTime ); + + /** + * Excecutes latest possible algorithm. + * + * Moves timers (that don't necessarily be fired right now) from + * candidateList to iTimerList. + * + * @param aCandidateList After this function returns, this list contains + * all timers that can be fire right now. + */ + void LatestPossibleAlgorithm( TSglQue& aCandidateList ); + + /** + * Fires all timers in aCandidateList. Calls Timeout() to all timers and + * deletes timer items. + * + * @param aCandidateList Timers that are fired. + */ + void ExpireTimers( TSglQue& aCandidateList ); + + /** + * Gets current absolute time. The time in FlexTimer engine time base, not + * system time base. This time base is begins from the first call to + * GetCurrentTime and it is base on system ticks. + * + * @param aCurrentAbsoluteTime After this function returns this contains + * current flextimer timebase time. + */ + void GetCurrentTime( TTime& aCurrentAbsoluteTime ); + + /** + * Converts microseconds interval to tick based reference time used by + * FlexTimer engine (also in microseconds). All FlexTimer timeout element + * time handling is based on this tick based absolute time. + * + * @param aInterval Interval to be converted. + */ + inline TInt64 IntervalToAbsoluteTime( + const TTimeIntervalMicroSeconds& aInterval ); + + /** + * Converts ticks to microseconds. + * + * @param aTicks. Ticks to be converted to microseconds + */ + inline TInt64 TicksToAbsoluteTime( TUint32 aTicks ); + +private: + // Data + /** + * Linked list and iterator for all timer objects. + */ + TSglQue iTimerList; + + /** + * Length of system tick in milliseconds. The value is read once + * to member variable during construction of FlexTimerContainer so that + * it does not need be read every time the absolute time is calculated. + */ + TInt iTickPeriod; + + /** + * Number of tics during the last time they were read. This is used to + * detect possible tick counter overflow and to calculate time passed + * since the last read. + */ + TUint32 iLastTicks; + + /** + * Current FlexTimer engine time. This is system tick based time and + * it is updated every time someone request for it. + */ + TInt64 iCurrentAbsoluteTime; + }; + +#include "flextimercontainer.inl" + +#endif //FLEXTIMERCONTAINER_H