diff -r 000000000000 -r 96612d01cf9f videofeeds/vcnsuiengine/src/vcxnseventrouter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/vcnsuiengine/src/vcxnseventrouter.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,599 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vcxnseventrouter.h" +#include "vcxnsuiengine.h" +#include "CIptvSmEvent.h" +#include "CIptvUtil.h" +#include "vcxnsserviceprovider.h" +#include "vcxnscontentprovider.h" +#include "vcxnscategoryprovider.h" +#include "vcxnsservice.h" +#include "vcxnscontent.h" +#include "vcxnscategory.h" +#include "vcxnsmpxcollectionclienthandler.h" +#include "vcxnscontentsearchhandler.h" +#include "vcxnsupdateprogresshandler.h" + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::CVcxNsEventRouter() +// ----------------------------------------------------------------------------- +// +CVcxNsEventRouter::CVcxNsEventRouter( CVcxNsUiEngine& aUiEngine ) + :iUiEngine( aUiEngine ) + { + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::~CVcxNsEventRouter() +// ----------------------------------------------------------------------------- +// +CVcxNsEventRouter::~CVcxNsEventRouter( ) + { + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::NewL() +// ----------------------------------------------------------------------------- +// +CVcxNsEventRouter* CVcxNsEventRouter::NewL( CVcxNsUiEngine& aUiEngine ) + { + CVcxNsEventRouter* self = new ( ELeave ) CVcxNsEventRouter( aUiEngine ); + return self; + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::HandleSmEvent() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::HandleSmEvent( CIptvSmEvent& aEvent ) + { + // check when to reset the data + if( iUiEngine.ServiceProvider() ) + { + iUiEngine.ServiceProvider()->RemoveServiceData(); + } + + RemoveServiceData( aEvent.iServiceId ); + + if( iUiEngine.VcAppState() == EStateServiceView || + aEvent.iServiceId == iUiEngine.ActiveService() ) + { + // Services can be added or deleted, so let's redraw all. + UpdateActiveView(); + + if ( aEvent.iEvent == CIptvSmEvent::EServiceAdded ) + { + // Assume that the added is always first + iUiEngine.ServiceProvider()->ServiceAdded( 0 ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::HandleEpgManagerMsgL() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::HandleEpgManagerMsgL( + TInt aMsg, TInt aInfo, TIptvServiceId aServiceId ) + { + CVcxNsUpdateProgressHandler* progressHandler = iUiEngine.GetProgressHandler(); + if ( progressHandler ) + { + progressHandler->HandleUpdateStatusChangeL( aServiceId, aMsg, aInfo ); + } + + CVcxNsServiceProvider* serviceProvider = iUiEngine.ServiceProvider(); + User::LeaveIfNull( serviceProvider ); + + switch( aMsg ) + { + case KIptvVodUpdateNotStarted: + { + serviceProvider->RefreshNextPendingService(); + + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvVodUpdateNotStarted"); + } + break; + case KIptvVodUpdateStarted: //Update process started + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvVodUpdateStarted"); + iUpdatedService = aServiceId; + serviceProvider->UpdateServiceUpdateStatusL( aServiceId, CVcxNsService::EUpdateOngoing ); + if ( iUiEngine.VcAppState() == EStateContentView && + iUiEngine.GetContentProviderL()->GetContentsL().Count() == 0 ) + { + UpdateActiveView(); + } + + iThumbnailCount = 0; + iThumbnailsDownloaded = 0; + UpdateInfoPopupL(); + } + break; + + case KIptvContentUpdateCompleted: + { + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvContentUpdateCompleted"); + + // Refresh the view before thumbnails are downloaded, if there was + // no old data. Empty category view shouldn't be ever shown. + + RPointerArray< CVcxNsCategory > categories = + iUiEngine.GetCategoryProviderL()->GetCategorysL(); + + if( ( iUiEngine.VcAppState() == EStateContentView && + categories.Count() == 0 ) + || ( iUiEngine.VcAppState() == EStateCategoryView && + categories.Count() == 0 ) + || ( iUiEngine.VcAppState() == EStateCategoryView && + categories.Count() == 1 && + categories[0]->GetCategoryId() == KIptvRssSearchCategoryId ) + || ( iUiEngine.VcAppState() == EStateCustomView && + iUiEngine.ActiveService() == aServiceId ) ) + { + if ( !( iUiEngine.VcAppState() == EStateCustomView ) ) + { + CheckAppStateL( aServiceId ); + } + UpdateActiveView(); + } + + iThumbnailCount = 0; + iThumbnailsDownloaded = 0; + UpdateInfoPopupL(); + } + break; + + case KIptvThumbnailCount: + { + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvThumbnailCount"); + + // Store the tbn count even if we're in wrong service. + iThumbnailCount = aInfo; + UpdateInfoPopupL(); + } + break; + + case KIptvServiceThumbnailDownloaded: + { + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvServiceThumbnailDownloaded"); + serviceProvider->ReloadThumbnailPathL( aServiceId ); + if( iUiEngine.VcAppState() == EStateServiceView ) + { + serviceProvider->UpdateService( aServiceId ); + } + + iThumbnailsDownloaded++; + UpdateInfoPopupL(); + } + break; + + case KIptvContentThumbnailDownloaded: + { + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvContentThumbnailDownloaded"); + //When downloading group thumbnails, + //aInfo includes service id information for grouped service + CVcxNsService* serviceData = serviceProvider->GetServiceDataById( aServiceId ); + if ( serviceData && serviceData->Type() == CVcxNsService::EVcxNsMainGroup ) + { + serviceProvider->ReloadThumbnailPathL( aInfo ); + } + + // Store the tbn count even if we're in wrong service. + iThumbnailsDownloaded++; + UpdateInfoPopupL(); + } + break; + + case KIptvErrorEpgUpdateStopped: + { + //This event comes when plugin has stopped all activities for update + //We can start updating next service as server is not busy with last update anymore. + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvErrorEpgUpdateStopped"); + serviceProvider->RefreshNextPendingService(); + } + break; + case KIptvErrorEpgUpdateSuccessed: + { + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvErrorEpgUpdateSuccessed"); + HandleEpgUpdateSucceededL( aServiceId ); + } + break; + + case KIptvErrorEpgUpdateFailed: + { + IPTVLOGSTRING_LOW_LEVEL( + "CVcxNsEventRouter::HandleEpgManagerMsgL: KIptvErrorEpgUpdateFailed"); + HandleEpgUpdateFailedL( aInfo, aServiceId ); + } + break; + case KIptvErrorRssSearchNoIap: //fall trough + case KIptvErrorRssSearchStarted: //fall through + case KIptvErrorRssSearchFailed: //fall through + case KIptvErrorRssSearchSucceed: //fall through + case KIptvRssSearchContentUpdateCompleted: //fall through + case KIptvRssSearchThumbnailCount: //fall through + case KIptvRssSearchContentThumbnailDownloaded: + iUiEngine.GetContentSearchHandlerL()->HandleSearchMsgL( aMsg, aInfo ); + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::HandleCollectionMessageL() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::HandleCollectionMessageL( CMPXMessage* aMsg, TInt /*aErr*/ ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleCollectionMessageL IN"); + // what the err represents? + + if( !iUiEngine.ContentProvider() ) + { + return; + } + + TUid colId = aMsg->ValueTObjectL(KMPXMessageCollectionId); + TMPXChangeEventType type = aMsg->ValueTObjectL(KMPXMessageChangeEventType); + + if( colId.iUid == KVcxUidMyVideosMpxCollection ) + { + TMPXItemId itemId = aMsg->ValueTObjectL( KMPXMessageMediaGeneralId ); + + if ( type == EMPXItemModified ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleCollectionMessageL EMPXItemModified"); + CVcxNsContent* content = iUiEngine.GetMpxCollectionClientHandlerL()->SearchFromDownloadList( itemId ); + if( content ) + { + iUiEngine.ContentProvider()->UpdateContent( content ); + } + } + } + + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleCollectionMessageL OUT"); + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::UpdateActiveView +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::UpdateActiveView() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::UpdateActiveView"); + + if( iUiEngine.VcAppState()== EStateServiceView + || iUiEngine.VcAppState()== EStateCustomView ) + { + if ( iUiEngine.ServiceProvider() ) + { + iUiEngine.ServiceProvider()->RefreshView(); + } + } + else if( iUiEngine.VcAppState()== EStateContentView ) + { + if( iUiEngine.ContentProvider() ) + { + iUiEngine.ContentProvider()->RefreshView(); + } + } + else if( iUiEngine.VcAppState()== EStateCategoryView ) + { + if( iUiEngine.CategoryProvider() ) + { + iUiEngine.CategoryProvider()->RefreshView(); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::RemoveServiceData() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::RemoveServiceData( TUint32 aServiceId ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::RemoveServiceData"); + + CVcxNsMpxCollectionClientHandler* collectionClient( NULL ); + + TRAP_IGNORE( collectionClient = iUiEngine.GetMpxCollectionClientHandlerL() ); + + if ( collectionClient && iUiEngine.ActiveService() == aServiceId ) + { + collectionClient->ResetDownloadList( ETrue ); + } + if ( iUiEngine.ContentProvider() ) + { + iUiEngine.ContentProvider()->RemoveServiceData( aServiceId ); + } + if ( iUiEngine.CategoryProvider() ) + { + iUiEngine.CategoryProvider()->RemoveServiceData( aServiceId ); + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::UpdateInfoPopupL() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::UpdateInfoPopupL() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::UpdateInfoPopupL"); + CVcxNsServiceProvider* serviceProvider = iUiEngine.ServiceProvider(); + if ( !serviceProvider ) + { + return; + } + + CVcxNsService* service = serviceProvider->GetServiceDataById( iUpdatedService ); + + CVcxNsService::TServiceUpdateStatus status ( CVcxNsService::ENotUpdating ); + + if ( service ) + { + status = service->GetUpdateStatus(); + } + + TBool updating = ( status == CVcxNsService::EUpdateOngoing ? ETrue : EFalse ); + + if( iUiEngine.ActiveService() == iUpdatedService ) + { + switch( iUiEngine.VcAppState() ) + { + case EStateContentView: + { + if( iUiEngine.ContentProvider() ) + { + iUiEngine.ContentProvider()->ShowUpdatingNoteL( + updating ,iThumbnailCount, iThumbnailsDownloaded ); + } + break; + } + case EStateCategoryView: + { + if( iUiEngine.CategoryProvider() ) + { + iUiEngine.CategoryProvider()->ShowUpdatingNoteL( + updating, iThumbnailCount, iThumbnailsDownloaded ); + } + break; + } + default: + { + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::HandleEpgUpdateFailedL() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::HandleEpgUpdateFailedL( + TInt aError, + TIptvServiceId aServiceId ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleEpgUpdateFailedL"); + TVcxNsAppState appState = iUiEngine.VcAppState(); + CVcxNsServiceProvider* serviceProvider = iUiEngine.ServiceProvider(); + + if ( serviceProvider ) + { + // Check if Updating manually failed, epg update still pending (EUpdatePending) + serviceProvider->UpdateServiceUpdateStatusL( + aServiceId, CVcxNsService::EUpdateFailed ); + + if( appState == EStateServiceView ) + { + serviceProvider->UpdateService( aServiceId ); + } + } + + if ( appState == EStateCategoryView && iUiEngine.CategoryProvider() ) + { + iUiEngine.CategoryProvider()->HandleErrorL( aError, aServiceId ); + } + + if ( appState == EStateContentView && iUiEngine.ContentProvider() ) + { + iUiEngine.ContentProvider()->HandleErrorL( aError, ETrue, aServiceId ); + } + + if ( appState == EStateCustomView && serviceProvider ) + { + serviceProvider->RefreshView(); + } + + iThumbnailCount = 0; + iThumbnailsDownloaded = 0; + UpdateInfoPopupL(); + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::HandleEpgUpdateSucceededL() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::HandleEpgUpdateSucceededL( TIptvServiceId aServiceId ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleEpgUpdateSucceededL"); + + CheckAppStateL( aServiceId ); + + iUiEngine.ServiceProvider()->UpdateServiceUpdateStatusL( + aServiceId, CVcxNsService::ENotUpdating ); + + iUiEngine.ServiceProvider()->UpdateServiceInCacheL( aServiceId ); + + if( iUiEngine.VcAppState() == EStateServiceView ) + { + // Update just the one item + iUiEngine.ServiceProvider()->UpdateService( aServiceId ); + } + else if( ( iUiEngine.VcAppState() == EStateContentView || + iUiEngine.VcAppState() == EStateCategoryView || + iUiEngine.VcAppState() == EStateCustomView ) && + iUiEngine.ActiveService() == aServiceId ) + { + // Update whole list + UpdateActiveView(); + } + + iThumbnailCount = 0; + iThumbnailsDownloaded = 0; + UpdateInfoPopupL(); + } + +// ----------------------------------------------------------------------------- +// Check, is the view switch needed +// Note that this removes old service data. +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::CheckAppStateL( TIptvServiceId aServiceId ) + { + TUint32 activeServiceId = iUiEngine.ActiveService(); + + if( aServiceId == activeServiceId && + iUiEngine.CategoryProvider() && + ( iUiEngine.VcAppState() == EStateContentView || + iUiEngine.VcAppState() == EStateCategoryView ) ) + { + RPointerArray oldCategories = + iUiEngine.CategoryProvider()->GetCategorysL(); + TInt oldCategoryCount = oldCategories.Count(); + TBool wasSingle = oldCategoryCount == 0 || + ( oldCategoryCount == 1 && + oldCategories[0]->GetCategoryId() != + KIptvRssSearchCategoryId ) ? ETrue : EFalse ; + + RemoveServiceData( aServiceId ); + + RPointerArray newCategories = + iUiEngine.CategoryProvider()->GetCategorysL(); + TInt newCategoryCount = newCategories.Count(); + TBool isSingle = newCategoryCount == 0 || + ( newCategoryCount == 1 && + newCategories[0]->GetCategoryId() != + KIptvRssSearchCategoryId ) ? ETrue : EFalse ; + + + TVcxNsAppState oldState = iUiEngine.VcAppState(); + // check that the old category really exists + TBool activeCategoryExists = + iUiEngine.CategoryProvider()->GetActiveCategoryDataL() + ? ETrue : EFalse; + + // Used only if switching to single category view. + TUint32 newActiveCategory( newCategoryCount == 1 ? + ( newCategories[0] )->GetCategoryId(): + KIptvVodContentCategoryRootId ); + + // Categories are increased from single to multiple + if ( wasSingle && !isSingle && + oldState == EStateContentView ) + { + iUiEngine.PopAppStateStack(); // Back to service level + iUiEngine.SetVcAppState( EStateCategoryView ); + iUiEngine.ContentProvider()->HandleAppStateChangedL(); + } + // Categories kept single, check still if category has changed. + else if ( wasSingle && isSingle && + oldState == EStateContentView ) + { + iUiEngine.SetActiveCategory( newActiveCategory ); + } + // Category count has dropped from multiple to single, in category view. + else if ( !wasSingle && isSingle && + oldState == EStateCategoryView ) + { + iUiEngine.PopAppStateStack(); // Back to service level + iUiEngine.SetVcAppState( EStateContentView ); + iUiEngine.SetActiveCategory( newActiveCategory ); + iUiEngine.CategoryProvider()->HandleAppStateChangedL(); + } + // Category count has dropped from multiple to single, in content view. + else if ( !wasSingle && isSingle && + oldState == EStateContentView ) + { + iUiEngine.PopAppStateStack(); // Back to category level + iUiEngine.PopAppStateStack(); // Back to service level + iUiEngine.SetActiveCategory( newActiveCategory ); + iUiEngine.SetVcAppState( EStateContentView ); + iUiEngine.ContentProvider()->HandleAppStateChangedL(); + } + // Category count has not changed from multiple to single. + else if( !wasSingle && !isSingle && + oldState == EStateContentView && + !activeCategoryExists ) + { + iUiEngine.HandleBack(); // Back to category level + iUiEngine.ContentProvider()->HandleAppStateChangedL(); + } + } + else + { + RemoveServiceData( aServiceId ); + } + } + +// ----------------------------------------------------------------------------- +// CVcxNsEventRouter::HandleDlErrorL() +// ----------------------------------------------------------------------------- +// +void CVcxNsEventRouter::HandleDlErrorL( + TIptvDlError aError, + CVcxNsContent& aContent ) + { + IPTVLOGSTRING_LOW_LEVEL("CVcxNsEventRouter::HandleDlErrorL"); + + TVcxNsAppState appState = iUiEngine.VcAppState(); + + if ( appState == EStateContentView && iUiEngine.ContentProvider() ) + { + iUiEngine.ContentProvider()->HandleDlErrorL( aError, aContent ); + } + }