--- /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