mobilemessaging/smilui/playersrc/SmilPlayerTimeIndicatorTimer.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smilui/playersrc/SmilPlayerTimeIndicatorTimer.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2005 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: SmilPlayerTimeIndicatorTimer implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <AknUtils.h>       // AknTextUtils
+#include <StringLoader.h>   // StringLoader
+#include <avkon.rsg>        // R_QTN_TIME_DURAT_MIN_SEC
+#include <SmilPlayer.rsg>   // R_SMILPLAYER_PRESENTATION_DURATION
+
+#include "SmilPlayerTimeIndicatorTimer.h"
+#include "SmilPlayerTimeObserver.h"
+
+// CONSTANTS
+const TInt KTimeControlIntToMicroSec            = 1000000;
+const TInt KMaxTimeInSeconds                    = 3599;
+const TInt KTimeControlStartDelay               = 500000; //0.5 sec
+const TInt KTimeControlProceedingTime           = 200000; //0.2 sec
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::CSmilPlayerTimeIndicatorTimer
+// C++ constructor.
+// ----------------------------------------------------------------------------
+// 
+CSmilPlayerTimeIndicatorTimer::CSmilPlayerTimeIndicatorTimer( MSmilPlayerTimeObserver* aObserver, 
+                                                              CCoeEnv* aCoeEnv ) :
+    CTimer( EPriorityStandard ),
+    iTimeObserver( aObserver ),
+    iCurrentValue( 0 ),
+    iState( EReadyForAction ),
+    iCoeEnv( aCoeEnv )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::ConstructL
+// Symbian 2nd phase constructor. Initializes timer and loads corret resource string
+// for localizable time string.
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::ConstructL()
+    {
+    CTimer::ConstructL();
+
+    StringLoader::Load( iTimeDuratMinSecWithZero, R_QTN_TIME_DURAT_MIN_SEC, iCoeEnv );
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::NewL
+// Symbian two phased constructor
+// ----------------------------------------------------------------------------
+// 
+CSmilPlayerTimeIndicatorTimer* CSmilPlayerTimeIndicatorTimer::NewL( MSmilPlayerTimeObserver* aObserver,
+                                                                    CCoeEnv* aCoeEnv )
+    {
+    CSmilPlayerTimeIndicatorTimer* self = new(ELeave) CSmilPlayerTimeIndicatorTimer( aObserver, 
+                                                                                     aCoeEnv );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::~CSmilPlayerTimeIndicatorTimer
+// Destructor
+// ----------------------------------------------------------------------------
+// 
+CSmilPlayerTimeIndicatorTimer::~CSmilPlayerTimeIndicatorTimer()
+    {    
+    iTimeObserver = NULL; //For LINT
+    iCoeEnv = NULL; // For LINT
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::RunL
+// Called when timer triggers to update time indicator string if approriate.
+// Also resets inactivity timer so that sceensaver is not triggered during
+// playback.
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::RunL()
+    {
+    TInt previousTotalDuration( iDurationValue );
+    TInt previousTime( iCurrentValue );
+
+    // Updating current time
+    TInt newTime( iTimeObserver->CurrentTime() );
+
+    // Check to see if we are preparing to end even
+    // if state is not updated correctly.
+    if ( iState == ERunning && 
+         iCurrentValue == (iDurationValue - 1) &&
+         iCurrentValue != newTime )
+        {
+        iState = EPreparingForEnd;
+        }
+
+    if ( iState == EPreparingForEnd )
+        {
+        newTime = iDurationValue;
+        previousTime = 0; // Force update
+        }
+    
+    // Updating duration
+    if ( !iTimeObserver->IsDurationFinite() )
+        {
+        iCurrentValue = newTime;
+        iDurationValue = 0;
+        }
+    else
+        {
+        //store current time to the member
+        iCurrentValue = newTime;
+    
+        //store current duration to the member 
+        iDurationValue = iTimeObserver->PresentationDuration();
+        }
+        
+    //check here is the current time or duration has changed
+    if ( previousTime != iCurrentValue ||
+         previousTotalDuration != iDurationValue )
+        {
+        // Reset inactivity timer.
+        User::ResetInactivityTime();
+        
+        CreateNewTimeStringL();
+        }
+    
+    // start the timer again
+    After( KTimeControlProceedingTime );//0.2sec
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::Start
+// Cancels the old time indicator refreshing is ongoing.
+// Sets current time to zero and tries to create new time string so that new time value is 
+// refreshed immediatelly to indicator. Error on creating time string are ignored
+// since time string update is not critical task and allowing leaves from function
+// would create multiple TRAPs to other places.
+// After this timer is started to update the time indicator and state is set to running. 
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::Start()
+    {
+    Cancel();
+    
+    iCurrentValue = 0;
+    TRAP_IGNORE( CreateNewTimeStringL() );
+    
+    After( KTimeControlStartDelay );
+    iState = ERunning;
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::Pause
+// Pauses time string update.
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::Pause()
+    {
+    iState = EPaused;
+    Cancel();
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::Resume
+// Continues time string update.
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::Resume()
+    {
+    iState = ERunning;
+    After( KTimeControlProceedingTime );
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::Stop
+// Stops time string update. Tries to update current value if possible.
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::Stop()
+    {
+    // Updating current time
+    iCurrentValue = iTimeObserver->CurrentTime();
+    
+    TRAP_IGNORE( CreateNewTimeStringL() );
+    iState = EReadyForAction;
+    Cancel();
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::EndReached
+// Indicates that presentation end has been reached. Sets timer state to preparing
+// for end. 
+// ----------------------------------------------------------------------------
+// 
+void CSmilPlayerTimeIndicatorTimer::EndReached()
+    {
+    iState = EPreparingForEnd;
+    iCurrentValue = iDurationValue;
+    }
+
+// ----------------------------------------------------------------------------
+// CSmilPlayerTimeIndicatorTimer::CreateNewTimeStringL
+// Constructs new time string and updates it to observer.
+// ----------------------------------------------------------------------------
+//
+void CSmilPlayerTimeIndicatorTimer::CreateNewTimeStringL()
+    {
+    // do not draw any time ( for example interactive presentation )
+    if ( iCurrentValue != 0 || iDurationValue != 0 )
+        {
+        HBufC* timeBuffer = NULL;
+
+        TBuf<KTimeControlMaxLength> timeString;
+        
+        TInt64 timeValue = MAKE_TINT64( 0, Min( KMaxTimeInSeconds, iCurrentValue ) );
+        timeValue *= KTimeControlIntToMicroSec;
+        
+        TTime time( timeValue );
+        time.FormatL( timeString, iTimeDuratMinSecWithZero );
+        
+        // checks if needed to draw total duration
+        // and load localised string from resources
+        if( iDurationValue != 0 )
+            {
+            TBuf<KTimeControlMaxLength> durationString;
+            TInt64 durationValue = MAKE_TINT64( 0, Min( KMaxTimeInSeconds, iDurationValue ) );
+            durationValue *= KTimeControlIntToMicroSec;
+            TTime duration( durationValue );
+            duration.FormatL( durationString,
+                              iTimeDuratMinSecWithZero );
+            
+            //load localised string for presentation duration
+            CDesCArrayFlat* array = new(ELeave) CDesCArrayFlat( 2 );
+            CleanupStack::PushL( array );
+            
+            AknTextUtils::LanguageSpecificNumberConversion( timeString );
+            array->AppendL( timeString );
+            
+            AknTextUtils::LanguageSpecificNumberConversion( durationString );
+            array->AppendL( durationString );
+            
+            timeBuffer = StringLoader::LoadL( R_SMILPLAYER_PRESENTATION_DURATION,
+                                              *array,
+                                              iCoeEnv );
+                                              
+            CleanupStack::PopAndDestroy( array );
+            }
+        else
+            {
+            //only current time is drawn (no duration)
+            //and localisation string is not needed to be used
+            AknTextUtils::LanguageSpecificNumberConversion( timeString );
+            timeBuffer = timeString.AllocL();
+            }
+        
+        CleanupStack::PushL( timeBuffer );    
+        iTimeObserver->TimeChangedL( *timeBuffer );
+        CleanupStack::PopAndDestroy( timeBuffer );
+        }
+    }
+        
+// End of file