diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/LightWeightTimer/src/singletimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/LightWeightTimer/src/singletimer.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,178 @@ +// Copyright (c) 2005-2009 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: +// Name : singletimer.cpp +// Part of : LightWeightTimer +// Version : SIP/4.0 +// + + + +#include "SipAssert.h" +#include "singletimer.h" +#include "TimerManager.h" +#include "mtimernotifier.h" +#include "timerlog.h" + + +// ----------------------------------------------------------------------------- +// CSingleTimer::NewL +// ----------------------------------------------------------------------------- +// +CSingleTimer* CSingleTimer::NewL(MTimerNotifier& aObserver) + { + CSingleTimer* self = new (ELeave) CSingleTimer(aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::CSingleTimer +// ----------------------------------------------------------------------------- +// +CSingleTimer::CSingleTimer(MTimerNotifier& aObserver) : + CActive(EPriorityStandard), + iObserver(aObserver), + iTimerId(MTimerManager::KNoSuchTimer) + { + CActiveScheduler::Add(this); + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::ConstructL +// ----------------------------------------------------------------------------- +// +void CSingleTimer::ConstructL() + { + User::LeaveIfError(iTimer.CreateLocal()); + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::~CSingleTimer +// ----------------------------------------------------------------------------- +// +CSingleTimer::~CSingleTimer() + { + Cancel(); + iTimer.Close(); + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::TimerId +// ----------------------------------------------------------------------------- +// +TTimerId CSingleTimer::TimerId() const + { + return iTimerId; + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::SetAfter +// If the equipment is switched off, timer set with After expires late. +// ----------------------------------------------------------------------------- +// +void CSingleTimer::SetAfter(TUint32 aDelay, TTimerId aTimerId) + { + __SIP_ASSERT_RETURN(!IsActive(), KErrNotReady); + __SIP_ASSERT_RETURN(aDelay <= KMaxTimerAfterDuration, KErrOverflow); + __SIP_ASSERT_RETURN(aTimerId != CTimerManager::KNoSuchTimer, KErrArgument); + +#if defined(WRITE_TIMER_LOG) + __SIP_INT_LOG2( "LwTimer SetAfter (id,delay)", aTimerId, aDelay ) +#endif + + iTimerId = aTimerId; + + //If the duration is very short, expire immediately for better performance. +#ifdef __WINSCW__ + if (aDelay < KEmulatorDelay) +#else + if (aDelay < KTargetHwDelay) +#endif + { + ExpireImmediately(); + } + else + { + iTimer.After(iStatus, aDelay * 1000); + SetActive(); + } + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::DoCancel +// ----------------------------------------------------------------------------- +// +void CSingleTimer::DoCancel() + { + iTimer.Cancel(); + iTimerId = MTimerManager::KNoSuchTimer; + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::RunL +// Even in case of error, continue normally. +// ----------------------------------------------------------------------------- +// +void CSingleTimer::RunL() + { +#if defined(WRITE_TIMER_LOG) + if (iStatus.Int() != KErrNone) + { + __SIP_INT_LOG2( "LwTimer SingleTimer:RunL (status,id)", + iStatus.Int(), iTimerId ) + } +#endif + + iObserver.TimerExpiredL(iTimerId); + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::RunError +// ----------------------------------------------------------------------------- +// +TInt CSingleTimer::RunError(TInt aError) + { +#if defined(WRITE_TIMER_LOG) + __SIP_INT_LOG1( "LwTimer SingleTimer:RunError error", aError ) +#endif + + TInt err = iObserver.LeaveOccurred(); + + if (aError == KErrNoMemory || err == KErrNoMemory) + { + return KErrNoMemory; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSingleTimer::ExpireImmediately +// Callback is not used from here, as it may lead to recursion if the callback +// sets another timer with delay = 0. +// CSingleTimer doesn't have a flag like CTimerManager::iNowExpiring. +// ----------------------------------------------------------------------------- +// +void CSingleTimer::ExpireImmediately() + { + //Initiate request + iStatus = KRequestPending; + SetActive(); + + //Complete request + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + }