diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcetimermanager.cpp --- /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 (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 ) + { + } +