telephonyserverplugins/simatktsy/src/csattimer.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /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<TTimer>( 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
+