multimediacommsengine/mmcesrv/mmceserver/src/mcetimermanager.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcetimermanager.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,276 @@
+/*
+* Copyright (c) 2006 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:  
+*
+*/
+
+
+
+
+#include "mcetimermanager.h"
+#include "mcesrvlogs.h"
+#include "mcesip.h"
+
+// Granularity for timer entry array iEntries
+const TInt KArrayGranularity( 8);
+
+// One millisecond as microseconds
+const TInt KOneMillisAsMicros( 1000);
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::NewL
+// -----------------------------------------------------------------------------
+//
+
+CMceTimerManager* CMceTimerManager::NewL()
+    {
+    CMceTimerManager* self = CMceTimerManager::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::NewLC
+// -----------------------------------------------------------------------------
+//
+CMceTimerManager* CMceTimerManager::NewLC()
+    {
+    CMceTimerManager* self = new( ELeave ) CMceTimerManager;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::~CMceTimerManager
+// -----------------------------------------------------------------------------
+//
+CMceTimerManager::~CMceTimerManager()
+    {
+    if(iTimerContainer)
+    	{
+    	iTimerContainer->Cancel();
+    	delete iTimerContainer;
+    	}
+	iEntries.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::StartL
+// -----------------------------------------------------------------------------
+//
+TMceTimerId CMceTimerManager::StartL(MMCEExpirationHandler* aObserver,
+        TUint aMilliseconds)
+    {
+    MCESRV_DEBUG("2 CMceTimerManager::StartL, Entry");
+    return StartL(aObserver, aMilliseconds, NULL);
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::StartL
+// -----------------------------------------------------------------------------
+//
+TMceTimerId CMceTimerManager::StartL(MMCEExpirationHandler* aObserver,
+        TUint aMilliseconds, TAny* aTimerParam)
+    {
+    MCESRV_DEBUG("CMceTimerManager::StartL, Entry");
+    // Do not accept a NULL observer
+    if ( !aObserver)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    // Get new unique timer id
+
+    TMceTimerId newTimerId = NewTimerId();
+    MCESRV_DEBUG_DVALUES( "timer", newTimerId, "timeout", aMilliseconds );
+
+    // Define a new entry with the new id
+    TEntry *newEntry = new ( ELeave ) TEntry();
+    CleanupStack::PushL( newEntry );
+    
+    newEntry->iId = newTimerId;
+    newEntry->iObserver = aObserver;
+    newEntry->iObserverParam = aTimerParam;
+    newEntry->iCallBack = TCallBack( TimerExpiredCallBack, newEntry );
+    newEntry->iEntry = TDeltaTimerEntry( newEntry->iCallBack );
+    newEntry->iTimerManager = this;
+
+    iEntries.InsertL(newEntry, 0);
+    CleanupStack::Pop( newEntry );
+    
+    TTimeIntervalMicroSeconds interval( TInt64( aMilliseconds ) * KOneMillisAsMicros );
+
+    if (KErrNone != iTimerContainer->QueueLong( interval, newEntry->iEntry ) )
+        {
+        MCESRV_DEBUG("CMceTimerManager:: CDeltaTimer::QueueLong Error!!!");
+        return CMceTimerManager::KNoSuchTimer;
+        }
+
+    MCESRV_DEBUG("CMceTimerManager::StartL, Exit");
+    return newEntry->iId;
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::Stop
+// -----------------------------------------------------------------------------
+//
+TInt CMceTimerManager::Stop(TMceTimerId aTimerId)
+    {
+    MCESRV_DEBUG("CMceTimerManager::Stop, Entry");
+    MCESRV_DEBUG_DVALUE("timer", aTimerId );
+
+    // Find the timer entry to be stopped
+    TInt entryIndex = FindEntry(aTimerId);
+    if (entryIndex == KErrNotFound)
+        {
+        MCESRV_DEBUG("CMceTimerManager::Stop - Invalid TimerId, timer not found");
+        return KErrNotFound;
+        }
+
+    // Remove timer information from container and delete entry
+    TEntry* entry = iEntries[entryIndex];
+    iTimerContainer->Remove(entry->iEntry);
+    iEntries.Remove(entryIndex);
+    delete entry;
+    entry = NULL;
+
+    MCESRV_DEBUG("CMceTimerManager::Stop, Exit");
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::IsRunning
+// -----------------------------------------------------------------------------
+//
+TBool CMceTimerManager::IsRunning(TMceTimerId aTimerId) const
+    {
+
+    TInt entryIndex = FindEntry(aTimerId);
+    if (entryIndex != KErrNotFound)
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::NewTimerId
+// -----------------------------------------------------------------------------
+//
+TMceTimerId CMceTimerManager::NewTimerId()
+    {
+    // Note that a rolling unsigned 32bit integer id counter
+    // is not strictly unique - however, it is not possible
+    // to have a timer with id 1 and id 2^32-1 at the same time
+    // due to time and memory constraints.
+    iTimerIdCounter++;
+    if (iTimerIdCounter == KNoSuchTimer)
+        {
+        iTimerIdCounter++;
+        }
+    return iTimerIdCounter;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::FindEntry
+// -----------------------------------------------------------------------------
+//
+TInt CMceTimerManager::FindEntry(TMceTimerId aTimerId) const
+    {
+    // Search for an entry with a matching id
+    TInt count = iEntries.Count();
+    for (TInt i = 0; i < count; i++)
+        {
+
+        if (iEntries[ i ]->iId == aTimerId)
+            {
+
+            return i;
+
+            }
+        }
+
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::CMceTimerManager
+// -----------------------------------------------------------------------------
+//
+CMceTimerManager::CMceTimerManager() :
+    iEntries(KArrayGranularity), iTimerIdCounter(KNoSuchTimer),
+            iTimerContainer(NULL)
+
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceTimerManager::ConstructL()
+    {
+
+    iTimerContainer = CDeltaTimer::NewL(CActive::EPriorityStandard);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::TimerExpiredCallBack
+// -----------------------------------------------------------------------------
+//
+TInt CMceTimerManager::TimerExpiredCallBack(TAny *aPtr)
+    {
+
+    MCESRV_DEBUG("TimerExpiredCallBack, Entry");
+    if (aPtr != NULL)
+        {
+
+        TEntry* entry = static_cast<TEntry*> (aPtr );
+        MCESRV_DEBUG_DVALUE(
+                "CMceTimerManager:timer expired - calling observer.timer", entry->iId );
+
+        // Call timer expired function
+        TRAP_IGNORE( entry->iObserver->TimerExpiredL( entry->iId,
+                        entry->iObserverParam ) );
+
+        // Remove the TEntry pointer from iEntries
+        TInt index = entry->iTimerManager->iEntries.Find(entry);
+        if (index != KErrNotFound)
+            {
+            entry->iTimerManager->iEntries.Remove(index);
+            }
+
+        // Delete entry
+        delete entry;
+        return KErrNone;
+
+        }
+
+    MCESRV_DEBUG("TimerExpiredCallBack, Exit");
+    return KErrArgument;
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMceTimerManager::TEntry::TEntry
+// -----------------------------------------------------------------------------
+//
+CMceTimerManager::TEntry::TEntry() :
+    iId(KNoSuchTimer), iObserver( NULL), iObserverParam( NULL), iTimerManager( NULL )
+    {
+    }
+