realtimenetprots/sipfw/SIP/LightWeightTimer/src/singletimer.cpp
changeset 0 307788aac0a8
child 55 36ea1f90a3d8
--- /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);
+	}