diff -r 000000000000 -r 96612d01cf9f videofeeds/vcnsuiengine/src/vcxnscontentprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/vcnsuiengine/src/vcxnscontentprovider.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,1041 @@ +/* +* 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: +* +*/ + + + + +// INCLUDE FILES +#include +#include "IptvDebug.h" + +#include "CIptvMediaContent.h" +#include "IptvLiveDataStructures.h" + +#include +#include +#include +#include "CIptvUtil.h" + +#include "CIptvMyVideosGlobalFileId.h" +#include "MIptvVodContentClientObserver.h" +#include "CIptvVodContentContentBriefDetails.h" +#include "CIptvVodContentContentFullDetails.h" +#include "CIptvVodContentClient.h" +#include "vcxnsserviceprovider.h" +#include "vcxnscontentproviderobserver.h" +#include "vcxnscontentclienthandler.h" +#include "vcxnsmpxcollectionclienthandler.h" +#include "vcxnscontentprovider.h" +#include "vcxnscategoryprovider.h" +#include "vcxnsuiengine.h" +#include "vcxnscontent.h" +#include "vcxnscontentaccess.h" +#include "vcxnsdatalist.h" + +// CONSTS +const TInt KMaxContentHistory = 50; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::CVcxNsContentProvider() +// ----------------------------------------------------------------------------- +// +CVcxNsContentProvider::CVcxNsContentProvider( CVcxNsUiEngine& aUiEngine ) : + iUiEngine( aUiEngine ) + { + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::NewL() +// ----------------------------------------------------------------------------- +// +CVcxNsContentProvider* CVcxNsContentProvider::NewL( CVcxNsUiEngine& aUiEngine ) + { + IPTVLOGSTRING_HIGH_LEVEL("UI Engine ## CVcxNsContentProvider::NewL()"); + + return new (ELeave) CVcxNsContentProvider( aUiEngine ); + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::~CVcxNsContentProvider() +// ----------------------------------------------------------------------------- +// +CVcxNsContentProvider::~CVcxNsContentProvider() + { + iContentObservers.Reset(); + + iContentListList.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// Get contents for active service and active category +// ----------------------------------------------------------------------------- +// +RPointerArray& CVcxNsContentProvider::GetContentsL( TInt& aHighlight ) + { + //Check if current state is content state and last state was category state: + + if ( iUiEngine.CategoryProvider() ) + { + aHighlight = iUiEngine.CategoryProvider()->GetCurrentHighlightL(); + } + else + { + aHighlight = 0; + } + + return GetContentsL(); + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::GetContentsL() +// ----------------------------------------------------------------------------- +// +RPointerArray& CVcxNsContentProvider::GetContentsL() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::GetContentsL"); + + // Dl list does not need to be updated, if fetching same old list again. + if( iPreviousList && + iPreviousList->iServiceId == iUiEngine.ActiveService() && + iPreviousList->iCategoryId == iUiEngine.ActiveCategory() ) + { + return iPreviousList->iArray; + } + + CVcxNsContentList* list = NULL; + + list = GetListFromCache(); + + if( !list ) + { + // Reset old download list, items might not be visible anymore. + iUiEngine.GetMpxCollectionClientHandlerL()->ResetDownloadList( + EFalse /* don't reset commands from content items */); + list = LoadEpgDataL(); + BuildDownloadListL( list->iArray ); + iUiEngine.GetMpxCollectionClientHandlerL()->LoadMpxMediaObjectsL(); + } + else + { + // Reset old download list, items might not be visible anymore. + iUiEngine.GetMpxCollectionClientHandlerL()->ResetDownloadList( + ETrue /* reset commands from content items */); + BuildDownloadListL( list->iArray ); + } + + iPreviousList = list; + + return list->iArray; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::RefreshContentsL() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::RefreshContentsL() + { + return iUiEngine.GetContentClientHandlerL()->UpdateEcgL( iUiEngine.ActiveService() ); + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::StartDownloadL() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::StartDownloadL( TInt aIndex ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::StartDownloadL"); + CVcxNsService* service = ( iUiEngine.GetServiceProviderL()->GetActiveServiceData() ); + CVcxNsContent* content = NULL; + + RPointerArray& contents = GetContentsL(); + + if( service && aIndex >= 0 && aIndex < contents.Count() ) + { + content = contents[aIndex]; + } + else + { + return KErrArgument; + } + + TInt retVal( KErrNotFound ); + + if( service && content ) + { + retVal = iUiEngine.GetMpxCollectionClientHandlerL()->DownloadL( *service, *content ); + } + + return retVal; + } + + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::PauseDownloadL() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::PauseDownloadL( TInt aIndex ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::PauseDownloadL"); + CVcxNsContent* content = NULL; + RPointerArray& contents = GetContentsL(); + + if( aIndex >= 0 && aIndex < contents.Count() ) + { + content = contents[aIndex]; + } + else + { + return KErrArgument; + } + + TInt retVal( KErrNotFound ); + + if( content ) + { + retVal = iUiEngine.GetMpxCollectionClientHandlerL()->PauseDownloadL( *content ); + } + + return retVal; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::ResumeDownloadL() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::ResumeDownloadL( TInt aIndex ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::ResumeDownloadL"); + CVcxNsContent* content = NULL; + RPointerArray& contents = GetContentsL(); + + + if( aIndex >= 0 && aIndex < contents.Count() ) + { + content = contents[aIndex]; + } + else + { + return KErrArgument; + } + + TInt retVal( KErrNotFound ); + + if( content ) + { + retVal = iUiEngine.GetMpxCollectionClientHandlerL()->ResumeDownloadL( *content ); + } + + return retVal; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::ResumeDownloadL() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::ResumeDownloadL( CVcxNsContent& aContent ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::ResumeDownloadL()"); + + if ( iUiEngine.ServiceProvider() ) + { + return iUiEngine.GetMpxCollectionClientHandlerL()->ResumeDownloadL( aContent ); + } + + return KErrGeneral; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::CancelDownloadL() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::CancelDownloadL( TInt aIndex ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::CancelDownloadL"); + CVcxNsContent* content = NULL; + RPointerArray& contents = GetContentsL(); + + if( aIndex >= 0 && aIndex < contents.Count() ) + { + content = contents[aIndex]; + } + else + { + return KErrArgument; + } + + TInt retVal( KErrNotFound ); + + if( content ) + { + retVal = iUiEngine.GetMpxCollectionClientHandlerL()->CancelDownloadL( *content ); + } + + return retVal; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::RemoveServiceData +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::RemoveServiceData( TUint32 aServiceId ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::RemoveServiceData"); + + if( iPreviousList && iPreviousList->iServiceId == aServiceId ) + { + iPreviousList = NULL; + } + + for( TInt k = 0; k < iContentListList.Count(); k++ ) + { + if( (iContentListList[k])->iServiceId == aServiceId ) + { + delete (iContentListList[k]); + iContentListList.Remove( k ); + iContentListList.Compress(); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::RemoveCategoryData +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::RemoveCategoryData( + TUint32 aServiceId, + TUint32 aCategoryId ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::RemoveCategoryData"); + + if( iPreviousList && iPreviousList->iServiceId == aServiceId ) + { + iPreviousList = NULL; + } + + for( TInt k = 0; k < iContentListList.Count(); k++ ) + { + if( (iContentListList[k])->iServiceId == aServiceId + && (iContentListList[k])->iCategoryId == aCategoryId ) + { + delete (iContentListList[k]); + iContentListList.Remove( k ); + iContentListList.Compress(); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::RegisterObserver() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::RegisterObserver( MVcxNsContentProviderObserver* aObserver ) + { + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if( iContentObservers[i] == aObserver ) + { + return; + } + } + + iContentObservers.Append( aObserver ); + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::DeRegisterObserver() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::DeRegisterObserver( MVcxNsContentProviderObserver* aObserver ) + { + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if( iContentObservers[i] == aObserver ) + { + iContentObservers.Remove( i ); + + iContentObservers.Compress(); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::ContentUpdated() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::ContentUpdated( TInt aIndex ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::ContentUpdated"); + + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if( iContentObservers[i] ) + { + iContentObservers[i]->ContentUpdated( aIndex ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::RefreshView() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::RefreshView() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::RefreshView"); + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if( iContentObservers[i] ) + { + iContentObservers[i]->RefreshView(); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::UpdateIconsPathL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::UpdateIconsPathL() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::UpdateIconsPathL"); + + CVcxNsContentList* list = NULL; + list = LoadEpgDataL(); + + if ( list && iPreviousList ) + { + for ( TInt i = 0; i < list->iArray.Count(); i++ ) + { + for ( TInt j = 0; j < iPreviousList->iArray.Count(); j++ ) + { + if ( ( iPreviousList->iArray[j]->GetContentId() == list->iArray[i]->GetContentId() ) && + ( iPreviousList->iArray[j]->GetServiceId() == list->iArray[i]->GetServiceId() ) ) + { + iPreviousList->iArray[j]->SetIconPathL( list->iArray[i]->GetIconPath() ); + break; + } + } + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::HandleAppStateChanged() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::HandleAppStateChangedL() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::HandleAppStateChangedL"); + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if( iContentObservers[i] ) + { + iContentObservers[i]->HandleAppStateChangedL(); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::SearchContentByUri() +// ----------------------------------------------------------------------------- +// +CVcxNsContent* CVcxNsContentProvider::SearchContentByUri( const TDesC& aUri ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByUri IN"); + for( TInt i = iContentListList.Count()-1; i >= 0 ; i-- ) + { + // improve nested loops + for( TInt j = (iContentListList[i])->iArray.Count()-1; j >= 0 ; j-- ) + { + TPtrC contentUri = TPtrC( ((iContentListList[i])->iArray[j])->GetUrl( CVcxNsContent::EVcxContentTypeVideo ) ); + + if ( contentUri.CompareF( aUri ) == 0 ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByUri OUT"); + return (iContentListList[i])->iArray[j]; + } + } + } + + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByUri OUT"); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::SearchContentByMpxId() +// ----------------------------------------------------------------------------- +// +CVcxNsContent* CVcxNsContentProvider::SearchContentByMpxId( TMPXItemId aItemId ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByMpxId IN"); + CVcxNsContent* content = NULL; + + for( TInt i = iContentListList.Count()-1; i >= 0 ; i-- ) + { + for( TInt j = (iContentListList[i])->iArray.Count()-1; j >= 0 ; j-- ) + { + CMPXMedia* media = ((iContentListList[i])->iArray[j])->GetMpxMedia( CVcxNsContent::EVcxContentTypeVideo ); + TUint32 mediaId = aItemId.iId1; + + if( media ) + { + TUint32 contentsId = media->ValueTObjectL( KMPXMediaGeneralId ).iId1; + + if ( mediaId == contentsId ) + { + content = (iContentListList[i])->iArray[j]; + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByMpxId OUT, id found from mpx data"); + return content; + } + } + else if ( ((iContentListList[i])->iArray[j])->GetMpxId( CVcxNsContent::EVcxContentTypeVideo ) && + ((iContentListList[i])->iArray[j])->GetMpxId( CVcxNsContent::EVcxContentTypeVideo ) == mediaId ) + { + content = (iContentListList[i])->iArray[j]; + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByMpxId OUT, found by stored mpx id "); + return content; + } + } + } + + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::SearchContentByMpxId OUT"); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::SearchContentById() +// ----------------------------------------------------------------------------- +// +CVcxNsContent* CVcxNsContentProvider::SearchContentById( TUint32 aServiceId, + TUint32 aContentId ) + { + // improve nested loops + for( TInt i = iContentListList.Count()-1; i >= 0 ; i-- ) + { + if( (iContentListList[i])->iServiceId == aServiceId ) + { + for( TInt j = (iContentListList[i])->iArray.Count()-1; j >= 0 ; j-- ) + { + if (((iContentListList[i])->iArray[j])->GetContentId() == aContentId ) + { + return (iContentListList[i])->iArray[j]; + } + } + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::ContentIndex() +// ----------------------------------------------------------------------------- +// +TInt CVcxNsContentProvider::ContentIndex( CVcxNsContent* aContent ) + { + if( !aContent ) + { + return KErrArgument; + } + + for( TInt i = iContentListList.Count()-1; i >= 0 ; i-- ) + { + if( iUiEngine.ActiveService() == (iContentListList[i])->iServiceId && + iUiEngine.ActiveCategory() == (iContentListList[i])->iCategoryId ) + { + for( TInt j = (iContentListList[i])->iArray.Count()-1; j >= 0 ; j-- ) + { + if ( ((iContentListList[i])->iArray[j])->GetContentId() == aContent->GetContentId() ) + { + return j; + } + } + break; + } + } + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::UpdateContent() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::UpdateContent( CVcxNsContent* aContentdata ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::UpdateContent"); + if( aContentdata ) + { + TInt index = ContentIndex( aContentdata ); + + if( index >= 0 ) + { + ContentUpdated( index ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::ShowUpdatingNoteL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::ShowUpdatingNoteL( + TBool aShow, + TInt aDownloadedTbns, + TInt aTotalTbns ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentProvider::ShowUpdatingNote"); + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if( iContentObservers[i] ) + { + iContentObservers[i]->ShowUpdatingNoteL( aShow, aDownloadedTbns, aTotalTbns ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::StoreLastPlayPosL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::StoreLastPlayPosL( CVcxNsContent* aContent, + CVcxNsContent::TVcxNsContentAccessType aType, + TReal32 aPos ) + { + + if( aType == CVcxNsContent::EVcxContentTypeStream ) + { + CVcxNsContentAccess* access = aContent->GetContentAccess( aType ); + + if ( access ) + { + iUiEngine.GetContentClientHandlerL()-> + StoreLastPlayPosL( aContent->GetServiceId(), + aContent->GetContentId(), + access->iIndex, + aPos ); + // Stream's pos is stored to epg, but it's fetched only when + // loading content list, so it needs to be set to content item. + CVcxNsContent* contentInCache = SearchContentById( aContent->GetServiceId(), aContent->GetContentId() ); + + if( contentInCache ) + { + contentInCache->SetLastPlaybackPosition( aPos, aType ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::HandleErrorL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::HandleErrorL( + TInt aError, + TBool aUpdate, + TUint32 aServiceId ) + { + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if ( iContentObservers[i] && + aUpdate && + aServiceId == iUiEngine.ActiveService() ) + { + iContentObservers[i]->HandleUpdateErrorL( aError ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::HandleDlErrorL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::HandleDlErrorL( + TIptvDlError aError, + CVcxNsContent& aContent ) + { + for ( TInt i = 0; i < iContentObservers.Count(); i++ ) + { + if ( iContentObservers[i] ) + { + iContentObservers[i]->HandleDownloadErrorL( aError, aContent ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::GetListFromCache() +// ----------------------------------------------------------------------------- +// +CVcxNsContentList* CVcxNsContentProvider::GetListFromCache() + { + for( TInt k = 0; k < iContentListList.Count(); k++ ) + { + if( (iContentListList[k])->iServiceId == iUiEngine.ActiveService() && + (iContentListList[k])->iCategoryId == iUiEngine.ActiveCategory() ) + { + // Sort the data by use order + CVcxNsContentList* list = iContentListList[k]; + if( k != iContentListList.Count()-1 ) + { + iContentListList.Remove( k ); + iContentListList.Compress(); + iContentListList.Append( list ); + } + return list; + } + } + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::GetListFromCache() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::BuildDownloadListL( RPointerArray& aContentList ) + { + for( TInt k = 0; k < aContentList.Count(); k++ ) + { + if( (aContentList[k])->GetMpxId( CVcxNsContent::EVcxContentTypeVideo ) ) + { + iUiEngine.GetMpxCollectionClientHandlerL()->AppendToDownloadList( (aContentList[k]) ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::GetListFromCache() +// ----------------------------------------------------------------------------- +// +CVcxNsContentList* CVcxNsContentProvider::LoadEpgDataL() + { + RPointerArray ecgList; + TUint32 total; + TBuf<1>KEmptyDes( KNullDesC ); + + TInt error = iUiEngine.GetContentClientHandlerL()->GetVodContentClientL( + iUiEngine.ActiveService() )->GetEcgListL( + iUiEngine.ActiveCategory(), + KEmptyDes, + 0, + 0, + total, + ecgList ); + + // If cache is already full, remove the oldest data. + if( iContentListList.Count() >= KMaxContentHistory ) + { + delete iContentListList[0]; + iContentListList.Remove(0); + iContentListList.Compress(); + } + + // Append the new data to cache + CVcxNsContentList* entry = new (ELeave) CVcxNsContentList; + entry->iCategoryId = iUiEngine.ActiveCategory(); + entry->iServiceId = iUiEngine.ActiveService(); + iContentListList.AppendL( entry ); + RPointerArray& contentList = entry->iArray; + + // Translate data classes + if ( error == KErrNone ) + { + CVcxNsContent* content = NULL; + + for( TInt i = 0; i < ecgList.Count(); i++ ) + { + content = ConstructContentItemL( ecgList[ i ], iUiEngine.ActiveService() ); + + if( content ) + { + contentList.AppendL( content ); + } + } + } + + ecgList.ResetAndDestroy(); + + return entry; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::HasVideoDetailsL() +// ----------------------------------------------------------------------------- +// +TBool CVcxNsContentProvider::HasVideoDetailsL( TInt aSelected ) + { + TBool hasDetails ( EFalse ); + CVcxNsContent* content = NULL; + RPointerArray& contents = GetContentsL(); + + if( aSelected >= 0 && aSelected < contents.Count() ) + { + content = contents[aSelected]; + } + + if ( content ) + { + hasDetails = ( content->GetLanguage() != KNullDesC ) || + ( content->GetLength() > 0 ) || + ( content->GetSize() > 0 ) || + ( content->GetDescription() != KNullDesC ) || + ( content->GetAuthor() != KNullDesC ) || + ( content->GetCopyright() != KNullDesC ); + } + + if ( !hasDetails && content ) + { + FetchFullDetailsL( content ); + + hasDetails = ( content->GetDescription() != KNullDesC ) || + ( content->GetAuthor() != KNullDesC ) || + ( content->GetCopyright() != KNullDesC ); + } + + return hasDetails; + } + + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::FullDetailsL() +// ----------------------------------------------------------------------------- +// +CVcxNsContent* CVcxNsContentProvider::GetFullDetailsL( TInt aSelected ) + { + CVcxNsContent* content = NULL; + RPointerArray& contents = GetContentsL(); + + if( aSelected >= 0 && aSelected < contents.Count() ) + { + content = contents[aSelected]; + } + + if ( content ) + { + //if full details have already been fetched for this item, no need to fetch again + if ( content->GetDescription().Length() > 0 || + content->GetAuthor().Length() > 0 || + content->GetCopyright().Length() > 0 ) + { + return content; + } + else + { + FetchFullDetailsL( content ); + } + } + return content; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::AddContentAccessesL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::AddContentAccessesL( CVcxNsContent& aContent, + RPointerArray& aContentAccessList ) + { + for ( TInt i=0; i < aContentAccessList.Count(); i++ ) + { + TUint32 type = (aContentAccessList[i])->iDownloadType; + TUint32 expr = (aContentAccessList[i])->iExpression; + + if( expr == CIptvMediaContent::EFull && type == EIptvDownloadTypeStream ) + { + CVcxNsContentAccess* contentAccess = CVcxNsContentAccess::NewL(); + CleanupStack::PushL( contentAccess ); + + contentAccess->SetUrlL( (aContentAccessList[i])->GetMediaContentUrl() ); + contentAccess->iType = CVcxNsContent::EVcxContentTypeStream; + contentAccess->iIndex = i; + contentAccess->iLastPosition = (aContentAccessList[i])->iLastPosition; + + aContent.AddContentAccess( contentAccess ); + CleanupStack::Pop( contentAccess ); + } + else if( expr == CIptvMediaContent::EFull && type == EIptvDownloadTypeImmediate ) + { + CVcxNsContentAccess* contentAccess = CVcxNsContentAccess::NewL(); + CleanupStack::PushL( contentAccess ); + + contentAccess->SetUrlL( (aContentAccessList[i])->GetMediaContentUrl() ); + contentAccess->iType = CVcxNsContent::EVcxContentTypeVideo; + contentAccess->iIndex = i; + contentAccess->iMpxId = (aContentAccessList[i])->iFileId; + + aContent.AddContentAccess( contentAccess ); + CleanupStack::Pop( contentAccess ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::GetContentL() +// ----------------------------------------------------------------------------- +// +CVcxNsContent* CVcxNsContentProvider::GetContentL( TUint32 aServiceId, TUint32 aContentId ) + { + CVcxNsContent* cnt = SearchContentById( aServiceId, aContentId ); + + if( !cnt ) + { + // Get all contents of the service to cache + RPointerArray ecgList; + TUint32 total; + TBuf<1>KEmptyDes( KNullDesC ); + + TInt error = iUiEngine.GetContentClientHandlerL()->GetVodContentClientL( aServiceId )-> + GetEcgAllListL( KEmptyDes, 0, 0, total, ecgList ); + + User::LeaveIfError( error ); + + CVcxNsContentList* entry = new (ELeave) CVcxNsContentList; + entry->iServiceId = aServiceId; + entry->iCategoryId = KIptvVodContentCategoryRootId; + iContentListList.AppendL( entry ); + RPointerArray& contentList = entry->iArray; + + // Translate data classes + CVcxNsContent* content = NULL; + + for( TInt i = 0; i < ecgList.Count(); i++ ) + { + content = ConstructContentItemL( ecgList[ i ], aServiceId ); + + if( content ) + { + contentList.AppendL( content ); + } + } + + ecgList.ResetAndDestroy(); + + // Search the content from new list + for( TInt i = 0; i < contentList.Count() ; i++ ) + { + if ( contentList[i]->GetContentId() == aContentId ) + { + cnt = contentList[i]; + break; + } + } + } + + return cnt; + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::ConstructContentItemL() +// ----------------------------------------------------------------------------- +// +CVcxNsContent* CVcxNsContentProvider::ConstructContentItemL( CIptvVodContentContentBriefDetails* aData, + TUint32 aServiceId ) + { + CVcxNsContent* content = CVcxNsContent::NewL(); + + CleanupStack::PushL( content ); + + content->SetNameL( aData->iName ); + content->SetIconPathL( aData->iThumbnailPath ); + content->SetServiceId( aServiceId ); + content->SetContentId( aData->iContentId ); + content->SetSize( aData->iSize ); + content->SetLength( aData->iPlaytime ); + content->SetLanguageL( aData->iLanguage ); + content->SetBrowserUrlL( aData->GetBrowserUrlL() ); + content->SetAgeProfile( aData->iRatingAge ); + + RPointerArray caList; + CleanupResetAndDestroyPushL( caList ); + TInt ret = iUiEngine.GetContentClientHandlerL()->GetVodContentClientL( content->GetServiceId() )->GetContentAccessListL( content->GetContentId(), caList ); + + if( KErrNone == ret && caList.Count() > 0 ) + { + AddContentAccessesL( *content, caList ); + + CleanupStack::PopAndDestroy( &caList ); + CleanupStack::Pop( content ); + + return content; + } + else + { + // Trash 'em + CleanupStack::PopAndDestroy( &caList ); + CleanupStack::PopAndDestroy( content ); + + return NULL; + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsContentProvider::FetchFullDetailsL() +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::FetchFullDetailsL( CVcxNsContent* aContent ) + { + if ( aContent->FullDetailsFetched() ) + { + // Do this only once + return; + } + + CIptvVodContentContentFullDetails* fullDetails = CIptvVodContentContentFullDetails::NewL(); + CleanupStack::PushL( fullDetails ); + + TInt err = iUiEngine.GetContentClientHandlerL()->GetVodContentClientL( + iUiEngine.ActiveService() )->GetContentDetailsL( + aContent->GetContentId(), *fullDetails ); + + if ( err == KErrNone ) + { + aContent->SetFullDetailsFetched( ETrue ); + + if ( fullDetails->iDescription != KNullDesC ) + { + aContent->SetDescriptionL( fullDetails->iDescription ); + } + if ( fullDetails->iAuthor != KNullDesC ) + { + aContent->SetAuthorL( fullDetails->iAuthor ); + } + if ( fullDetails->iCopyright != KNullDesC ) + { + aContent->SetCopyrightL( fullDetails->iCopyright ); + } + } + + CleanupStack::PopAndDestroy( fullDetails ); + } + +// ----------------------------------------------------------------------------- +// Set highlighted content index for active category +// ----------------------------------------------------------------------------- +// +void CVcxNsContentProvider::SetContentHighlight( TInt aHighlight ) + { + if ( iUiEngine.CategoryProvider() ) + { + if ( aHighlight < 0 ) + { + aHighlight = 0; + } + + TRAP_IGNORE( + iUiEngine.CategoryProvider()->SetCurrentHighlightL( aHighlight ) ); + } + }