diff -r 000000000000 -r 164170e6151a wim/WimServer/src/WimTimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimServer/src/WimTimer.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,281 @@ +/* +* Copyright (c) 2002 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: Timer class +* +*/ + + + +// INCLUDE FILES +#include "WimTimer.h" +#include "WimConsts.h" +#include "WimTrace.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWimTimer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWimTimer* CWimTimer::NewL( MWimTimerListener* aTimerListener ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::NewL | Begin")); + CWimTimer *self = new( ELeave ) CWimTimer; + CleanupStack::PushL( self ); + self->ConstructL( aTimerListener ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CWimTimer::CWimTimer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWimTimer::CWimTimer() : CActive( EPriorityStandard ), iHeartBeatCount( 0 ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::CWimTimer | Begin")); + } + +// Destructor +CWimTimer::~CWimTimer() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::~CWimTimer | Begin")); + Cancel(); + iTimer.Close(); + delete iHeartbeat; + } + +// ----------------------------------------------------------------------------- +// CWimTimer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWimTimer::ConstructL( MWimTimerListener* aTimerListener ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::ConstructL | Begin")); + User::LeaveIfError( iTimer.CreateLocal() ); + iTimerListener = aTimerListener; + CActiveScheduler::Add( this ); + iDelay = 0; + iHeartbeat = CHeartbeat::NewL( 0 ); // neutral priority + } + +// ----------------------------------------------------------------------------- +// CWimTimer::SetCloseAfter +// Set timeout of timer, delay given in seconds +// ----------------------------------------------------------------------------- +// +void CWimTimer::SetCloseAfter( const RMessage2& aMessage ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::SetCloseAfter | Begin")); + TInt closeAfter = aMessage.Int0(); + + // Check that given value is in limits + if ( closeAfter < KWimNoTimeout || closeAfter > KWimTimeoutMax ) + { + aMessage.Complete( KErrArgument ); + } + else // Value is OK, set timer + { + DoSetCloseAfter( closeAfter ); + aMessage.Complete( KErrNone ); + } + } + +// ----------------------------------------------------------------------------- +// CWimTimer::SetCloseAfter +// Set timeout of timer, delay given in seconds +// ----------------------------------------------------------------------------- +// +void CWimTimer::DoSetCloseAfter( TInt aCloseAfter ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::DoSetCloseAfter | Begin")); + if ( IsActive() ) // Timeout already set, cancel + { + Cancel(); + } + if ( aCloseAfter == KWimNoTimeout ) // No timeout, cancel timer + { + Cancel(); + iDelay = KWimNoTimeout; + } + else + { + iDelay = aCloseAfter * 1000 * 1000; // Timer takes delay in microseconds + iTimer.After( iStatus, iDelay ); + SetActive(); + StartHeartBeat(); + } + } +// ----------------------------------------------------------------------------- +// CWimTimer::GetCloseAfterL +// Return delay given in SetCloseAfter in seconds +// If no timeout is set return -1 (KWimNoTimeout) +// ----------------------------------------------------------------------------- +// +void CWimTimer::GetCloseAfterL( const RMessage2& aMessage ) const + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::Delay | Begin")); + + TInt delay = 0; + + if ( iDelay.Int() == KWimNoTimeout ) + { + delay = KWimNoTimeout; + } + else + { + // Timer takes delay in microseconds + delay = iDelay.Int() / ( 1000 * 1000 ); + } + + TPckgBuf closeAfterPckg( delay ); + aMessage.WriteL( 0, closeAfterPckg ); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CWimTimer::RunL() +// Handles an active object’s request completion event +// ----------------------------------------------------------------------------- +// +void CWimTimer::RunL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::RunL | Begin")); + if ( iTimerListener ) + { + iTimerListener->TimerExpired(); + } + } + +// ----------------------------------------------------------------------------- +// CWimTimer::DoCancel +// Cancellation of an outstanding request +// ----------------------------------------------------------------------------- +// +void CWimTimer::DoCancel() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::DoCancel | Begin")); + iTimer.Cancel(); + iHeartbeat->Cancel(); + } + +// ----------------------------------------------------------------------------- +// CWimTimer::ResetTimer +// Resets active timer. +// ----------------------------------------------------------------------------- +// +void CWimTimer::ResetTimer() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::ResetTimer | Begin")); + if ( IsActive() ) + { + Cancel(); + iTimer.After( iStatus, iDelay ); + SetActive(); + iHeartbeat->Cancel(); + StartHeartBeat(); + } + } + +// ----------------------------------------------------------------------------- +// CWimTimer::TimeRemainingL +// Returns remaining time of the timer in seconds. If timer has no timeout +// then KWimNoTimeout (-1) is returned. +// ----------------------------------------------------------------------------- +// +void CWimTimer::TimeRemainingL( const RMessage2& aMessage ) const + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::TimeRemainingL | Begin")); + + TInt timeRemaining; + + if ( iDelay.Int() == KWimNoTimeout ) + { + timeRemaining = KWimNoTimeout; + } + else + { + // Timer takes delay in microseconds + TInt delay = iDelay.Int() / ( 1000 * 1000 ); + timeRemaining = delay - iHeartBeatCount; + } + + TPckgBuf timeRemainingPckg( timeRemaining ); + aMessage.WriteL( 0, timeRemainingPckg ); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CWimTimer::TimeRemaining +// Used inside wimserver +// ----------------------------------------------------------------------------- +// +TInt CWimTimer::TimeRemaining() const + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::TimeRemaining | Begin")); + + TInt timeRemaining; + + if ( iDelay.Int() == KWimNoTimeout ) + { + timeRemaining = KWimNoTimeout; + } + else + { + // Timer takes delay in microseconds + TInt delay = iDelay.Int() / ( 1000 * 1000 ); + timeRemaining = delay - iHeartBeatCount; + } + + return timeRemaining; + } + +// ----------------------------------------------------------------------------- +// CWimTimer::StartHeartBeat +// Start heart beating +// ----------------------------------------------------------------------------- +// +void CWimTimer::StartHeartBeat() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::StartHeartBeat | Begin")); + iHeartbeat->Start( ETwelveOClock, this ); // 1 second intervals + } + +// ----------------------------------------------------------------------------- +// CWimTimer::Beat +// Beat has occurred, increase counter +// ----------------------------------------------------------------------------- +// +void CWimTimer::Beat() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::Beat | Begin")); + iHeartBeatCount++; + } + +// ----------------------------------------------------------------------------- +// CWimTimer::Synchronize +// Synchronize the timer. +// ----------------------------------------------------------------------------- +// +void CWimTimer::Synchronize() + { + _WIMTRACE(_L("WIM | WIMServer | CWimTimer::Synchronize | Begin")); + } + +// End of File