diff -r 000000000000 -r 96612d01cf9f videofeeds/vcnsuiengine/src/vcxnsupdateprogresshandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/vcnsuiengine/src/vcxnsupdateprogresshandler.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,369 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Content update progress handling* +*/ + + + + +// INCLUDE FILES +#include +#include "CIptvUtil.h" +#include "CIptvTimer.h" +#include "IptvDebug.h" +#include "vcxnsupdateprogresshandler.h" +#include "vcxnsserviceprovider.h" +#include "vcxnsuiengine.h" + +//CONSTANTS +const TInt KVcxNsProgCompletedNoThumbnails = 10; +const TInt KVcxNsProgStartedNoThumbnails = 5; +const TInt KVcxNsProgStartedThumbnails = 3; +const TInt KVcxNsThumbProgressPercentVal = 3; +const TInt KVcxNsProgressUpdateStarted = 5; +const TInt KVcxNsProgressUpdateCompletedNoThumb = 70; +const TInt KVcxNsProgressUpdateCompleted = 40; +const TInt KVcxNsProgressUpdateSucceeded = 99; +const TInt KVcxNsProgressTimerDefault = 200000; // 0,2 sec + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVcxNsUpdateProgressHandler::CVcxNsUpdateProgressHandler() +// ----------------------------------------------------------------------------- +// +CVcxNsUpdateProgressHandler::CVcxNsUpdateProgressHandler( + CVcxNsUiEngine& aUiEngine ) +: iUiEngine( aUiEngine ), + iThumbnails ( EFalse ), + iPreviousProgress ( 0 ), + iProgressPerThumbnail ( 0 ), + iThumbnailsInPercent ( 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CVcxNsUpdateProgressHandler::NewL() +// ----------------------------------------------------------------------------- +// +CVcxNsUpdateProgressHandler* CVcxNsUpdateProgressHandler::NewL( + CVcxNsUiEngine& aUiEngine ) + { + IPTVLOGSTRING_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::NewL()"); + return new (ELeave) CVcxNsUpdateProgressHandler( aUiEngine ); + } + +// ----------------------------------------------------------------------------- +// CVcxNsUpdateProgressHandler::~CVcxNsUpdateProgressHandler() +// ----------------------------------------------------------------------------- +// +CVcxNsUpdateProgressHandler::~CVcxNsUpdateProgressHandler() + { + if ( iProgressTimer && iProgressTimer->IsActive() ) + { + iProgressTimer->Cancel(); + } + + delete iProgressTimer; + } + +// ----------------------------------------------------------------------------- +// CVcxNsUpdateProgressHandler::RegisterObserver() +// ----------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::RegisterObserver( + MVcxNsUpdateProgressObserver* aObserver ) + { + IPTVLOGSTRING_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::RegisterObserver()"); + iProgressObserver = aObserver; + } + +// ----------------------------------------------------------------------------- +// CVcxNsUpdateProgressHandler::DeRegisterObserver() +// ----------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::DeRegisterObserver( + MVcxNsUpdateProgressObserver* aObserver ) + { + IPTVLOGSTRING_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::DeRegisterObserver()"); + + if ( aObserver == iProgressObserver ) + { + iProgressObserver = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsUpdateProgressHandler::GetProgress +// ----------------------------------------------------------------------------- +// +TInt CVcxNsUpdateProgressHandler::GetProgress( TUint32 aServiceId ) + { + if ( aServiceId == iCurrentServiceId ) + { + IPTVLOGSTRING2_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::GetProgress( %d )", + iPreviousProgress ); + return iPreviousProgress; + } + + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// Handle service update status +// ----------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::HandleUpdateStatusChangeL( + TUint32 aServiceId, + TInt aUpdateStatusMsg, + TInt aInfo ) + { + IPTVLOGSTRING_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::HandleUpdateStatusChangeL()"); + + TInt progress( iPreviousProgress ); + iCurrentServiceId = aServiceId; + iCurrentStatus = aUpdateStatusMsg; + + if ( iProgressTimer && iProgressTimer->IsActive() ) + { + iProgressTimer->Cancel(); + } + + switch ( aUpdateStatusMsg ) + { + case KIptvVodUpdateStarted: + { + //Update started: progress 5% + progress = KVcxNsProgressUpdateStarted; + TRAP_IGNORE( iThumbnails = ThumbnailsAllowedL() ); + StartProgressUpdateTimerL( ); + } + break; + case KIptvContentUpdateCompleted: + { + if ( iThumbnails ) + { + //Update completed, thumbnails: progress 40% + if ( progress < KVcxNsProgressUpdateCompleted ) + { + progress = KVcxNsProgressUpdateCompleted; + } + } + else + { + if ( progress < KVcxNsProgressUpdateCompletedNoThumb ) + { + //Update completed, no thumbnails: progress 70% + progress = KVcxNsProgressUpdateCompletedNoThumb; + } + StartProgressUpdateTimerL(); + } + } + break; + case KIptvThumbnailCount: + { + if ( aInfo > 0 && iThumbnails ) + { + TInt thumbnailPercentage = + ( KVcxNsProgressUpdateSucceeded - KVcxNsProgressUpdateCompleted ); + + iProgressPerThumbnail = ( thumbnailPercentage / aInfo ); + + //If there's more thumbnails than percents left: + if ( iProgressPerThumbnail == 0 ) + { + iThumbnailsInPercent = ( aInfo / thumbnailPercentage ); + } + } + } + break; + case KIptvServiceThumbnailDownloaded: + case KIptvContentThumbnailDownloaded: + { + if ( iProgressPerThumbnail > 0 ) + { + progress += iProgressPerThumbnail; + } + else + { + iThumbnailCounter++; + if ( iThumbnailCounter == + ( iThumbnailsInPercent * KVcxNsThumbProgressPercentVal ) ) + { + //When downloaded enough for increasing progress, + //zero thumbnail counter + progress += KVcxNsThumbProgressPercentVal; + iThumbnailCounter = 0; + } + } + } + break; + case KIptvErrorEpgUpdateSuccessed: + //Update succeeded: progress 99% + progress = KVcxNsProgressUpdateSucceeded; + break; + + case KIptvErrorEpgUpdateFailed: + case KIptvErrorEpgUpdateStopped: + { + progress = 0; + iPreviousProgress = 0; + iProgressPerThumbnail = 0; + iThumbnailsInPercent = 0; + iThumbnailCounter = 0; + } + break; + default: + break; + } + + if ( progress > 0 && progress > iPreviousProgress ) + { + //Refresh only if any progress + RefreshProgressL( progress ); + } + } + +// -------------------------------------------------------------------------- +// Timer expired +// -------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::TimerExpired( CIptvTimer* /*aTimer*/ ) + { + TInt progress ( iPreviousProgress ); + TInt timeout ( KVcxNsProgressTimerDefault ); + + if ( iThumbnails && + progress < KVcxNsProgressUpdateCompleted && + iCurrentStatus == KIptvVodUpdateStarted ) + { + progress += KVcxNsProgStartedThumbnails; + } + else if ( !iThumbnails && + progress < KVcxNsProgressUpdateCompletedNoThumb && + iCurrentStatus == KIptvVodUpdateStarted ) + { + progress += KVcxNsProgStartedNoThumbnails; + } + else if ( !iThumbnails && + iCurrentStatus == KIptvContentUpdateCompleted ) + { + progress += KVcxNsProgCompletedNoThumbnails; + } + + if ( progress > iPreviousProgress ) + { + TRAP_IGNORE( RefreshProgressL( progress ) ); + } + + if ( iProgressTimer ) + { + if ( iProgressTimer ->IsActive() ) + { + iProgressTimer->Cancel(); + } + iProgressTimer->After( timeout ); + } + } + +// -------------------------------------------------------------------------- +// Cancel progress handler timer +// -------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::Cancel() + { + if ( iProgressTimer && iProgressTimer->IsActive() ) + { + IPTVLOGSTRING_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::Cancel()"); + iProgressTimer->Cancel(); + } + } + +// -------------------------------------------------------------------------- +// Check if thumbnails are allowed +// -------------------------------------------------------------------------- +// +TBool CVcxNsUpdateProgressHandler::ThumbnailsAllowedL() const + { + TBool thumbnails( EFalse ); + CRepository* cenRep = CRepository::NewL( KIptvCenRepUid ); + if ( cenRep ) + { + TInt value; + TInt error = cenRep->Get( KIptvCenRepVoDThumbnailsKey, value ); + if ( error == KErrNone && value == 1 ) + { + thumbnails = ETrue; + } + } + + delete cenRep; + return thumbnails; + } + +// -------------------------------------------------------------------------- +// Check progress +// -------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::StartProgressUpdateTimerL( ) + { + IPTVLOGSTRING_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::StartProgressUpdateTimerL()"); + + if ( iProgressTimer && iProgressTimer->IsActive()) + { + iProgressTimer->Cancel(); + } + + if ( !iProgressTimer ) + { + iProgressTimer = CIptvTimer::NewL( CActive::EPriorityUserInput, *this ); + } + + iProgressTimer->After( KVcxNsProgressTimerDefault ); + } + +// -------------------------------------------------------------------------- +// Refresh progress +// -------------------------------------------------------------------------- +// +void CVcxNsUpdateProgressHandler::RefreshProgressL( TInt aProgress ) + { + IPTVLOGSTRING2_HIGH_LEVEL( + "UI Engine ## CVcxNsUpdateProgressHandler::RefreshProgressL( %d )", + aProgress ); + + if ( aProgress > KVcxNsProgressUpdateSucceeded ) + { + aProgress = KVcxNsProgressUpdateSucceeded; + } + + iPreviousProgress = aProgress; + + CVcxNsServiceProvider* serviceProvider = iUiEngine.ServiceProvider(); + if ( serviceProvider && aProgress > 0 ) + { + TInt index = serviceProvider->ServiceIndex( iCurrentServiceId ); + if ( iProgressObserver ) + { + iProgressObserver->HandleFeedUpdateProgressL( index, aProgress ); + } + } + }