diff -r 000000000000 -r 72b543305e3a mobilemessaging/smilui/playersrc/SmilPlayerTimeIndicatorTimer.cpp --- /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 // AknTextUtils +#include // StringLoader +#include // R_QTN_TIME_DURAT_MIN_SEC +#include // 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 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 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