diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simatktsy/src/csattimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simatktsy/src/csattimer.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,468 @@ +// 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 : CSatTimer.cpp +// Part of : Common Sim Atk TSY / commonsimatktsy +// Implementation of the sat timer functions. +// Version : 1.0 +// + + + +// INCLUDE FILES +#include "CSatTimer.h" // Class header +#include "TfLogger.h" // For TFLOGSTRING +#include "CSatNotificationsTsy.h" // Sat Tsy class +#include "CSatDataPackage.h" // For data packages + + +// ----------------------------------------------------------------------------- +// CSatNotificationsTsy::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatTimer* CSatTimer::NewL(CSatNotificationsTsy* aSatNotificationsTsy) + { + CSatTimer* const self = new ( ELeave ) CSatTimer(); + CleanupStack::PushL( self ); + self->ConstructL(aSatNotificationsTsy); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::ConstructL +// Creates CSatTimer object. +// ----------------------------------------------------------------------------- +// +void CSatTimer::ConstructL + ( + CSatNotificationsTsy* aSatNotificationsTsy + ) + { + + TFLOGSTRING( "CSAT: CSatTimer::ConstructL" ); + iSatNotificationsTsy = aSatNotificationsTsy; + iTimerTable = new ( ELeave ) RArray( KMaxNumberOfParallelTimers ); + // Neutral priority, 0 + iTimer = CHeartbeat::NewL( CActive::EPriorityStandard ); + + } + +// ----------------------------------------------------------------------------- +// CSatTimer::CSatTimer +// C++ constructor +// ----------------------------------------------------------------------------- +// +CSatTimer::CSatTimer() + { + // None + } + + +// ----------------------------------------------------------------------------- +// CSatTimer::~CSatTimer +// Destructor +// ----------------------------------------------------------------------------- +// +CSatTimer::~CSatTimer + ( + //None + ) + { + TFLOGSTRING( "CSAT: CSatTimer::~CSatTimer" ); + if ( iTimer ) + { + // Stop calling Beat... + iTimer->Cancel(); + delete iTimer; + } + + if ( iTimerTable ) + { + iTimerTable->Close(); + delete iTimerTable; + } + } + +// ----------------------------------------------------------------------------- +// CSatTimer::Start +// Starts timer. +// ----------------------------------------------------------------------------- +// +TInt CSatTimer::Start + ( + TInt aTimerId, // Timer Id + TUint32 aTimerValue // Timer value + ) + { + TFLOGSTRING( "CSAT: CSatTimer::Start" ); + TInt ret( KErrNone ); + + // Check if the entry is already in the table + if ( CheckTimerTable( aTimerId ) ) + { + // Delete the old entry + DeleteTimerById( aTimerId ); + } + + // Calculate the trigger time (actual beat amount + timeout) + TUint32 timeStamp = iBeatCounter + aTimerValue; + // Create timer + TTimer timer( aTimerId, iBeatCounter, timeStamp ); + + // Insert the entry in the table + ret = iTimerTable->InsertInOrderAllowRepeats( timer, + TTimer::OrderEntries ); + + // Check if active + if ( ( KErrNone == ret ) && ( !iTimer->IsActive() ) ) + { + // Timer tick is on the second + iTimer->Start( ETwelveOClock, this ); + } + + return ret; + + } + +// ----------------------------------------------------------------------------- +// CSatTimer::Stop +// Stops timer +// ----------------------------------------------------------------------------- +// +void CSatTimer::Stop + ( + //None + ) + { + TFLOGSTRING( "CSAT: CSatTimer::Stop" ); + // Check if active + if ( iTimer->IsActive () ) + { + // Cancel beat method calling + iTimer->Cancel(); + } + } + +// ----------------------------------------------------------------------------- +// CSatTimer::Beat +// Beat is called once every second. +// ----------------------------------------------------------------------------- +// +void CSatTimer::Beat + ( + //None + ) + { + TInt ret( KErrNone ); + iBeatCounter++; + TBool timeStampGreater( ETrue ); + for( TInt numberOfTimers = iTimerTable->Count(); + timeStampGreater && 0 < numberOfTimers; numberOfTimers-- ) + { + // Get the pointer to the TimerTable + TTimer& timerTable = ( *iTimerTable )[ numberOfTimers - 1 ]; + + if ( timerTable.TimeStamp() <= iBeatCounter ) + { + // Proactive command ongoing + if( !( iIsProactiveCommandOnGoing ) ) + { + // Call completion of the request due expired timer + TRAPD( trapError, ret = iSatNotificationsTsy->TimerExpirationL( + timerTable.TimerId(), + iBeatCounter - timerTable.TimerStartTime() ) + ); + + if ( trapError ) + { + ret = trapError; + TFLOGSTRING2("CSAT: CSatTimer::Beat, Trap error: %d", + trapError); + } + + // Remove timer from the table + if ( KErrNone == ret ) + { + DeleteTimerById( timerTable.TimerId() ); + } + } + } + else // TimerTable->iTimeStamp > iBeatCounter + { + // Table is ordered -> Break + timeStampGreater = EFalse; + } + } + } + +// ----------------------------------------------------------------------------- +// CSatTimer::Synchronize +// Called when synchronization is lost. The iBeatCounter is increased. +// ----------------------------------------------------------------------------- +// +void CSatTimer::Synchronize + ( + // None + ) + { + TFLOGSTRING( "CSAT: CSatTimer::Synchronize" ); + iBeatCounter++; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::CheckTimerTable +// Check if an entry is in iEntryTable +// ----------------------------------------------------------------------------- +// +TBool CSatTimer::CheckTimerTable + ( + TInt aTimerId + ) + { + + TFLOGSTRING( "CSAT: CSatTimer::CheckTimerTable" ); + TBool ret( EFalse ); + + // Create the entry with meaningful values only + TTimer timer( aTimerId, 0, 0 ); + + // Find the entry for this Handle in the list + TInt position = iTimerTable->Find ( timer, TTimer::CompareEntries ); + + if ( KErrNotFound != position ) + { + ret = ETrue; + } + + return ret; + + } + +// ----------------------------------------------------------------------------- +// CSatTimer::DeleteTimerById +// Deletes an entry from the entry table using the handle type +// and the handle store as identificators. +// ----------------------------------------------------------------------------- +// +TInt CSatTimer::DeleteTimerById + ( + TInt aTimerId // Timer identifier + ) + { + + TFLOGSTRING( "CSAT: CSatTimer::DeleteTimerById" ); + TInt ret( KErrNotFound ); + + // Create the entry with meaningful values only + TTimer timer( aTimerId, 0, 0 ); + + // Find the entry for this Handle in the list + TInt position = iTimerTable->Find ( timer, + TTimer::CompareEntries ); + // Check if element is found + if ( KErrNotFound != position ) + { + iTimerTable->Remove( position ); + iTimerTable->Compress(); + // Check if empty + if ( 0 == iTimerTable->Count() ) + { + // Restart the beatCounter + iBeatCounter = 0; + // Stop timer till new entry is done + Stop(); + } + ret = KErrNone; + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::CurrentValueOfTimerById +// Finds an entry from the entry table using the timer identification +// ----------------------------------------------------------------------------- +// +TUint32 CSatTimer::CurrentValueOfTimerById + ( + TInt aTimerId // Timer identifier + ) + { + TFLOGSTRING( "CSAT: CSatTimer::CurrentValueOfTimerById" ); + TInt ret( KErrNotFound ); + + // Create the entry with meaningful values only + TTimer timer( aTimerId, 0, 0 ); + + // Find the entry for this Handle in the list + TInt position = iTimerTable->Find( timer, + TTimer::CompareEntries ); + + // Check if element is found + if ( KErrNotFound != position ) + { + // Get the pointer to the TimerTable + TTimer& timerTable = ( *iTimerTable )[ position ]; + + // Get timeStamp + TUint32 timerStamp = timerTable.TimeStamp(); + + // Current timer value = timer timeout value - current time + ret = timerStamp - iBeatCounter; + + // If current timer value is smaller than zero set value to 0 + // this can happen if there is some kind of delay before + // timer is expired and iBeatCounter is still counting... + if( 0 > ret ) + { + ret = 0; + } + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::SetProactiveCommandOnGoingStatus +// Sets ProactiveCommandOngoing status +// ----------------------------------------------------------------------------- +// +void CSatTimer::SetProactiveCommandOnGoingStatus + ( + TBool aStatus + ) + { + TFLOGSTRING( "CSAT: CSatTimer::SetProactiveCommandOnGoingStatus" ); + iIsProactiveCommandOnGoing = aStatus; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::TTimer +// Default constructor Sets timer information to the TimerTable +// ----------------------------------------------------------------------------- +// +CSatTimer::TTimer::TTimer + ( + TInt aTimerId, // Timer id + TUint32 aStartTime, // Timer start time + TUint32 aTimeStamp // Time stamp + ): iTimerId( aTimerId ), iStartTime( aStartTime ), + iTimeStamp( aTimeStamp ) + { + TFLOGSTRING( "CSAT: TTimer::TTimer" ); + } + +// ----------------------------------------------------------------------------- +// CSatTimer::TimeStamp +// Gets the value of iTimeStamp +// ----------------------------------------------------------------------------- +// +TUint32 CSatTimer::TTimer::TimeStamp + ( + // None + ) + { + TFLOGSTRING( "CSAT: TTimer::TimeStamp" ); + return iTimeStamp; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::TimerId +// Gets the value of iTimerId +// ----------------------------------------------------------------------------- +// +TInt CSatTimer::TTimer::TimerId + ( + // None + ) + { + TFLOGSTRING( "CSAT: TTimer::TimerId" ); + return iTimerId; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::TimerStartTime +// Gets the value of iStartTime +// ----------------------------------------------------------------------------- +// +TUint32 CSatTimer::TTimer::TimerStartTime + ( + // None + ) + { + TFLOGSTRING( "CSAT: TTimer::TimerStartTime" ); + return iStartTime; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::CompareEntries +// Compares two entries are return if the are same of not. +// ----------------------------------------------------------------------------- +// +TBool CSatTimer::TTimer::CompareEntries + ( + const CSatTimer::TTimer& aArg1, + const CSatTimer::TTimer& aArg2 + ) + { + TFLOGSTRING( "CSAT: CSatTimer::TTimer::CompareEntries" ); + TBool ret( EFalse ); + + // We are interested only in the timer id + if ( aArg1.iTimerId == aArg2.iTimerId ) + { + ret = ETrue; + } + else + { + TFLOGSTRING( "CSAT: CSatTimer::TTimer::CompareEntries, Not equal" ); + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CSatTimer::OrderEntries +// Compares two entries and returns which is the order between them. +// ----------------------------------------------------------------------------- +// +TInt CSatTimer::TTimer::OrderEntries + ( + const CSatTimer::TTimer& aArg1, + const CSatTimer::TTimer& aArg2 + ) + { + TFLOGSTRING( "CSAT: CSatTimer::TTimer::OrderEntries" ); + TInt ret( KFirstTimeStampSmaller ); + + // We are interested only in the time stamp + if ( aArg1.iTimeStamp == aArg2.iTimeStamp ) + { + ret = KTimeStampsEqual; + } + else if ( aArg1.iTimeStamp > aArg2.iTimeStamp ) + { + ret = KFirstTimeStampBigger; + } + else + { + TFLOGSTRING( "CSAT: CSatTimer::TTimer::OrderEntries, \ + KFirstTimeStampSmaller" ); + } + + return ret; + } + +// End of File +