keepalive/flextimer/server/engine/src/flextimerengine.cpp
branchRCL_3
changeset 57 05bc53fe583b
--- /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.
+    }