diff -r 55fa1ec415c6 -r 8f0df5c82986 videocollection/hgmyvideos/src/vcxhgmyvideosdownloadupdater.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideosdownloadupdater.cpp Tue May 11 16:15:40 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,460 +0,0 @@ -/* -* 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: Class for following and updating download progress.* -*/ - - - - -// INCLUDE FILES -#include -#include -#include - -#include "IptvDebug.h" -#include - -#include "vcxhgmyvideosdownloadupdater.h" -#include "vcxhgmyvideosvideolist.h" -#include "vcxhgmyvideosvideomodelhandler.h" -#include "vcxhgmyvideospanics.h" - -// CONSTANTS -const TInt KVcxHgUpdateDelay = 2500000; // 2,5 seconds - -// ========================== MEMBER FUNCTIONS =============================== - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::CVcxHgMyVideosDownloadUpdater() -// --------------------------------------------------------------------------- -// -CVcxHgMyVideosDownloadUpdater::CVcxHgMyVideosDownloadUpdater( - CVcxHgMyVideosVideoModelHandler& aParent, - CVcxHgMyVideosVideoList& aVideoArray ) - : iParent( aParent ), - iVideoArray( aVideoArray ) - { - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::ConstructL() -// --------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::ConstructL() - { - iTimer = CPeriodic::NewL( EPriorityNormal ); - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::NewL() -// --------------------------------------------------------------------------- -// -CVcxHgMyVideosDownloadUpdater* CVcxHgMyVideosDownloadUpdater::NewL( - CVcxHgMyVideosVideoModelHandler& aParent, - CVcxHgMyVideosVideoList& aVideoArray ) - { - CVcxHgMyVideosDownloadUpdater* self = - new( ELeave ) CVcxHgMyVideosDownloadUpdater( aParent, aVideoArray ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::~CVcxHgMyVideosDownloadUpdater() -// --------------------------------------------------------------------------- -// -CVcxHgMyVideosDownloadUpdater::~CVcxHgMyVideosDownloadUpdater() - { - if( iTimer ) - { - iTimer->Cancel(); - } - delete iTimer; - iDownloadArray.Close(); - } - -// ----------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::VideoArrayChangedL() -// ----------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::VideoArrayChangedL() - { - IPTVLOGSTRING_LOW_LEVEL( - "MPX My Videos UI # CVcxHgMyVideosDownloadUpdater::VideoArrayChangedL()" ); - - ResetDownloadsToFollowL(); - ContinueToFollowDownloads(); - } - -// ----------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::VideoModifiedL() -// -// Note: Currently expects and handles only aEventType == EMPXItemModified. -// ----------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::VideoModifiedL( TMPXChangeEventType /*aEventType*/, - TMPXItemId aMpxItemId, - TInt32 /*aExtraInfo*/ ) - { - CMPXMedia* media = NULL; - - // If object is on download array, check if download has completed. - for ( TInt i = 0; i < iDownloadArray.Count(); i++ ) - { - media = iDownloadArray[i].iMedia; - - if ( media->IsSupported( KMPXMediaGeneralId ) ) - { - if ( aMpxItemId == media->ValueTObjectL( KMPXMediaGeneralId ) ) - { - TBool remove( EFalse ); - - if ( ! media->IsSupported( KVcxMediaMyVideosDownloadId ) || - ! media->IsSupported( KVcxMediaMyVideosDownloadState ) ) - { - remove = ETrue; - } - else if ( *( media->Value( KVcxMediaMyVideosDownloadId ) ) == 0 ) - { - remove = ETrue; - } - else - { - TVcxMyVideosDownloadState state = static_cast( - *( media->Value( KVcxMediaMyVideosDownloadState ) ) ); - - if ( state == EVcxMyVideosDlStateNone || - state == EVcxMyVideosDlStateDownloaded ) - { - remove = ETrue; - } - } - - if ( remove ) - { - iDownloadArray.Remove( i ); - } - - return; - } - } - } - - // If object was not on download array, check if it should be added. - media = iVideoArray.MPXMediaByMPXItemId( aMpxItemId ); - - if ( media && FindDownload( media ) == KErrNotFound ) - { - if ( media->IsSupported( KVcxMediaMyVideosDownloadId ) && - media->IsSupported( KVcxMediaMyVideosDownloadState ) ) - { - // Download ID is non-zero if download status exists. - if ( *( media->Value( KVcxMediaMyVideosDownloadId ) ) != 0 ) - { - TVcxMyVideosDownloadState state( EVcxMyVideosDlStateNone ); - - state = static_cast( - *( media->Value( KVcxMediaMyVideosDownloadState ) ) ); - - if ( state == EVcxMyVideosDlStateDownloading || - state == EVcxMyVideosDlStateFailed || - state == EVcxMyVideosDlStatePaused ) - { - TDownloadItem item; - item.iMedia = media; - item.iProgress = 0; - item.iState = state; - item.iProgressivePlayQueried = EFalse; - item.iIsPlayPossible = EFalse; - iDownloadArray.AppendL( item ); - } - } - } - } - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::IsPlayPossible() -// --------------------------------------------------------------------------- -// -TBool CVcxHgMyVideosDownloadUpdater::IsPlayPossible( TInt aIndex ) - { - IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # CVcxHgMyVideosDownloadUpdater::IsPlayPossible" ); - - TInt dlIndex( KErrNotFound ); - CMPXMedia* media = iVideoArray.MPXMedia( aIndex ); - - if ( ! media ) - { - return EFalse; - } - - TInt count( iDownloadArray.Count() ); - for ( TInt i = 0; i < count; i++ ) - { - // Compare pointers as they are the same in this case, and fast to use. - if ( media == iDownloadArray[i].iMedia ) - { - dlIndex = i; - break; - } - } - - if ( dlIndex != KErrNotFound ) - { - // These two lines make sure that class starts to follow availability - // of progressive play, if it is not being followed yet. - iDownloadArray[dlIndex].iProgressivePlayQueried = ETrue; - ContinueToFollowDownloads(); - - iDownloadArray[dlIndex].iIsPlayPossible = - ( iDownloadArray[dlIndex].iMedia->ValueTObjectL( KVcxMediaMyVideosDownloadProgress ) > 0 && - iDownloadArray[dlIndex].iMedia->ValueText( KMPXMediaGeneralUri ).Length() > 0 ); - - // Return the response immediately, as it is needed from use cases like - // DynInitMenuPaneL(). Real status will be updated - // to UI asynchronously when background timer has checked the playability. - return iDownloadArray[dlIndex].iIsPlayPossible; - } - - return EFalse; - } - -// ----------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::SetPausedL() -// ----------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::SetPausedL( TBool aPaused ) - { - IPTVLOGSTRING2_LOW_LEVEL( - "MPX My Videos UI # CVcxHgMyVideosDownloadUpdater::SetPausedL(%d)", aPaused ); - - iPaused = aPaused; - - ContinueToFollowDownloads(); - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::RemoveDownload() -// --------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::RemoveDownload( TMPXItemId aMPXItemId ) - { - CMPXMedia* media( NULL ); - media = iVideoArray.MPXMediaByMPXItemId( aMPXItemId ); - - if ( media ) - { - TInt index( KErrNotFound ); - index = FindDownload( media ); - - if ( index != KErrNotFound ) - { - iDownloadArray.Remove( index ); - } - - if ( iDownloadArray.Count() < 1 ) - { - iTimer->Cancel(); - } - } - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::FindDownload() -// --------------------------------------------------------------------------- -// -TInt CVcxHgMyVideosDownloadUpdater::FindDownload( CMPXMedia* aMedia ) - { - TInt index( KErrNotFound ); - - if ( aMedia ) - { - for ( TInt i = iDownloadArray.Count() - 1; i >= 0; i-- ) - { - if ( iDownloadArray[i].iMedia->Match( *aMedia, KMPXMediaGeneralId ) ) - { - index = i; - break; - } - } - } - return index; - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::ContinueToFollowDownloads() -// --------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::ContinueToFollowDownloads() - { - if ( iPaused || iDownloadArray.Count() == 0 ) - { - if ( iTimer->IsActive() ) - { - iTimer->Cancel(); - } - } - else - { - if ( ! iTimer->IsActive() ) - { - TCallBack callback = TCallBack( Callback, this ); - const TTimeIntervalMicroSeconds32 KUpdateInterval( KVcxHgUpdateDelay ); - iTimer->Start( KUpdateInterval, KUpdateInterval, callback ); - } - } - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::ResetDownloadsToFollowL() -// --------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::ResetDownloadsToFollowL() - { - iDownloadArray.Reset(); - - TVcxMyVideosDownloadState state( EVcxMyVideosDlStateNone ); - TDownloadItem item; - CMPXMedia* media = NULL; - TInt count( iVideoArray.VideoCount() ); - - for ( TInt i = 0; i < count; i++ ) - { - media = iVideoArray.MPXMedia( i ); - - if ( media && - media->IsSupported( KVcxMediaMyVideosDownloadId ) && - media->IsSupported( KVcxMediaMyVideosDownloadState ) ) - { - // Download ID is non-zero if download status exists. - if ( *( media->Value( KVcxMediaMyVideosDownloadId ) ) != 0 ) - { - state = static_cast( - *( media->Value( KVcxMediaMyVideosDownloadState ) ) ); - - if ( state == EVcxMyVideosDlStateDownloading || - state == EVcxMyVideosDlStateFailed || - state == EVcxMyVideosDlStatePaused ) - { - item.iMedia = media; - item.iProgress = 0; - item.iState = state; - item.iProgressivePlayQueried = EFalse; - item.iIsPlayPossible = EFalse; - iDownloadArray.AppendL( item ); - - IPTVLOGSTRING3_LOW_LEVEL( - "MPX My Videos UI # Download to follow: Id:%d, State:%d", - static_cast( - media->ValueTObjectL( KMPXMediaGeneralId ) ), - static_cast( - media->ValueTObjectL( KVcxMediaMyVideosDownloadState ) ) ); - } - } - } - } - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::Callback() -// --------------------------------------------------------------------------- -// -TInt CVcxHgMyVideosDownloadUpdater::Callback( TAny *aPtr ) - { - CVcxHgMyVideosDownloadUpdater* ptr = static_cast( aPtr ); - TRAP_IGNORE( ptr->UpdateDownloadsL() ); - return 0; - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::UpdateDownloadsL() -// --------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::UpdateDownloadsL() - { - for ( TInt i = 0; i < iDownloadArray.Count(); i++ ) - { - UpdateDownloadL( iDownloadArray[i] ); - } - } - -// --------------------------------------------------------------------------- -// CVcxHgMyVideosDownloadUpdater::UpdateDownloadL() -// --------------------------------------------------------------------------- -// -void CVcxHgMyVideosDownloadUpdater::UpdateDownloadL( TDownloadItem& aItem ) - { - TBool itemChanged( EFalse ); - - // Check download progress. - TVcxMyVideosDownloadState state = static_cast( - aItem.iMedia->ValueTObjectL( KVcxMediaMyVideosDownloadState ) ); - TInt8 progress = aItem.iMedia->ValueTObjectL( KVcxMediaMyVideosDownloadProgress ); - - if ( progress == 0 && aItem.iProgress > 0 ) - { - IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # UpdateDownloadL() Resume started from beginning." ); - TUint32 mpxId = aItem.iMedia->ValueTObjectL( KMPXMediaGeneralId ).iId1; - iParent.ResumeStartedFromBeginningL( mpxId ); - } - if ( state != aItem.iState || progress != aItem.iProgress ) - { - aItem.iState = state; - aItem.iProgress = progress; - itemChanged = ETrue; - } - - // Progressive playback check is needed in two cases: - // 1) It has been queried by user and old status is EFalse, in this case the status - // has not been check ever yet. - // 2) Progress has changed, and old status is EFalse. In this case we might have - // received enough data to support progressive play. - if ( ( aItem.iProgressivePlayQueried && ! aItem.iIsPlayPossible ) || - ( itemChanged && ! aItem.iIsPlayPossible ) ) - { - aItem.iProgressivePlayQueried = EFalse; - - if ( aItem.iMedia->ValueTObjectL( KVcxMediaMyVideosDownloadProgress ) > 0 && - aItem.iMedia->ValueText( KMPXMediaGeneralUri ).Length() > 0 ) - { - aItem.iIsPlayPossible = ETrue; - } - - if ( aItem.iIsPlayPossible ) - { - itemChanged = ETrue; - } - } - - IPTVLOGSTRING4_LOW_LEVEL( - "MPX My Videos UI # UpdateDownloadL() Id:%d State:%d Progress:%d", - static_cast( aItem.iMedia->ValueTObjectL( KMPXMediaGeneralId ) ), - static_cast( state ), static_cast( progress ) ); - IPTVLOGSTRING3_LOW_LEVEL( - "MPX My Videos UI # UpdateDownloadL() Path:%S Progressive Play:%d", - &( aItem.iMedia->ValueText( KMPXMediaGeneralUri ) ), - static_cast( aItem.iIsPlayPossible ) ); - - if ( itemChanged ) - { - iParent.VideoModifiedL( - EMPXItemModified, - aItem.iMedia->ValueTObjectL( KMPXMediaGeneralId ), - EVcxMyVideosListNoInfo, - ETrue ); // Mark event as simulated, not originated from MPX Collection. - } - }