videofeeds/vcnsuiengine/src/vcxnscontentsearchhandler.cpp
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/vcnsuiengine/src/vcxnscontentsearchhandler.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,351 @@
+/*
+* 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 search functionality*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <bldvariant.hrh>
+#include "IptvDebug.h"
+#include "TIptvRssSearchQuery.h"
+
+#include "CIptvVodContentClient.h"
+#include "vcxnscontentsearchobserver.h"
+#include "vcxnscontentclienthandler.h"
+#include "vcxnscontentsearchhandler.h"
+#include "vcxnsuiengine.h"
+#include "vcxnscategory.h"
+#include "vcxnscategoryprovider.h"
+#include "vcxnscontentprovider.h"
+#include "vcxnsserviceprovider.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::CVcxNsContentSearchHandler()
+// -----------------------------------------------------------------------------
+//
+CVcxNsContentSearchHandler::CVcxNsContentSearchHandler( 
+    CVcxNsUiEngine& aUiEngine ) 
+:   iUiEngine( aUiEngine )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxNsContentSearchHandler* CVcxNsContentSearchHandler::NewL( 
+    CVcxNsUiEngine& aUiEngine )
+    {
+    IPTVLOGSTRING_HIGH_LEVEL("UI Engine ## CVcxNsContentSearchHandler::NewL()");
+    
+    return new (ELeave) CVcxNsContentSearchHandler( aUiEngine );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::~CVcxNsContentSearchHandler()
+// -----------------------------------------------------------------------------
+//
+CVcxNsContentSearchHandler::~CVcxNsContentSearchHandler()
+    {
+    iSearchObservers.Reset();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::StartNewSearchL()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::StartNewSearchL()
+    {
+    for (TInt i = 0; i < iSearchObservers.Count(); i++ )
+        {
+        iSearchObservers[i]->StartSearchL( EFalse );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::SearchL()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::SearchL( const TDesC& aSearchString )
+    {
+    CIptvVodContentClient* contentClient ( 
+        iUiEngine.GetContentClientHandlerL()->GetVodContentClientL( 
+                                             iUiEngine.ActiveService()));
+    if ( contentClient )
+        {
+        TIptvRssSearchQuery query;
+        // Set search string does not really change the given descriptor.
+        query.SetSearchString( const_cast<TDesC&>( aSearchString ) );
+        contentClient->Search( query );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::CancelSearchL()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::CancelSearchL()
+    {
+    CIptvVodContentClient* contentClient ( 
+        iUiEngine.GetContentClientHandlerL()->GetVodContentClientL( 
+                                             iUiEngine.ActiveService()));
+    if ( contentClient )
+        {
+        contentClient->CancelSearch( );
+        }
+    
+    UpdateCategoryVideoCountL();
+    SearchCancelled();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::HandleSearchMsgL()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::HandleSearchMsgL( TInt aStatus, TInt aInfo )
+    {
+    IPTVLOGSTRING_HIGH_LEVEL("UI Engine ## CVcxNsContentSearchHandler::HandleSearchMsgL()");
+    
+    TVcxNsAppState appState = iUiEngine.VcAppState();
+    
+    switch ( aStatus )
+        {
+        case KIptvErrorRssSearchNoIap: 
+            {
+            //KIptvErrorRssSearchNoIap was handled earlier, and if status comes
+            //to this point, start search again.
+            IPTVLOGSTRING_HIGH_LEVEL("UI Engine ##  IAP selected, start search again");
+            for (TInt i = 0; i < iSearchObservers.Count(); i++ )
+                {
+                iSearchObservers[i]->StartSearchL( ETrue );
+                }
+            }
+            break;
+        case KIptvErrorRssSearchStarted:
+            {
+            IPTVLOGSTRING_HIGH_LEVEL("UI Engine ##  Search Started ");
+            ShowInfoPopupL( EFalse );
+            
+            for (TInt i = 0; i < iSearchObservers.Count(); i++ )
+                {
+                iSearchObservers[i]->SearchStartedL();
+                }
+
+            //When new search has started, empty existing search result list.
+            if ( iUiEngine.ContentProvider() )
+                {
+                iUiEngine.ContentProvider()->RemoveCategoryData( 
+                        iUiEngine.ActiveService(), KIptvRssSearchCategoryId );
+                }
+                
+            if ( appState == EStateContentView &&
+                 iUiEngine.ContentProvider() &&                                           
+                 iUiEngine.ActiveCategory() == KIptvRssSearchCategoryId )
+                {
+                iUiEngine.ContentProvider()->RefreshView();
+                }
+            }
+            break;
+            
+        case KIptvErrorRssSearchFailed:
+            {
+            IPTVLOGSTRING_HIGH_LEVEL("UI Engine ##  Search Failed ");
+            ShowInfoPopupL( EFalse );
+            
+            for (TInt i = 0; i < iSearchObservers.Count(); i++ )
+                {
+                iSearchObservers[i]->HandleSearchResultL( EFalse );
+                }            
+            }
+            break;
+            
+        case KIptvErrorRssSearchSucceed:
+            {
+            IPTVLOGSTRING_HIGH_LEVEL("UI Engine ##  Search Succeeded ");
+            ShowInfoPopupL( EFalse );
+            
+            if ( appState == EStateContentView &&
+                 iUiEngine.ContentProvider() &&
+                 iUiEngine.ActiveCategory() == KIptvRssSearchCategoryId )
+                {
+                iUiEngine.ContentProvider()->UpdateIconsPathL();
+                iUiEngine.ContentProvider()->RefreshView();
+                }
+            }
+            break;
+
+        case KIptvRssSearchContentUpdateCompleted:
+            {
+            IPTVLOGSTRING_HIGH_LEVEL("UI Engine ##  Search content update completed ");
+
+            //Remove category data again to make sure that we have valid cache for search results
+            if ( iUiEngine.ContentProvider() )
+                {
+                iUiEngine.ContentProvider()->RemoveCategoryData( iUiEngine.ActiveService(),
+                                                                 KIptvRssSearchCategoryId );
+                }
+
+            //Category state: Switch to content state, set search category as active category
+            //Content state: List contents (refresh view) with search results 
+            
+            for (TInt i = 0; i < iSearchObservers.Count(); i++ )
+                {
+                iSearchObservers[i]->HandleSearchResultL( ETrue );
+                }
+            
+            if ( appState == EStateCategoryView )
+                {
+                iUiEngine.SetActiveCategory ( KIptvRssSearchCategoryId );        
+                iUiEngine.SetVcAppState( EStateContentView );
+                iUiEngine.CategoryProvider()->HandleAppStateChangedL();
+                }
+            else if ( appState == EStateCustomView  )                
+                {
+                iUiEngine.SetActiveCategory ( KIptvRssSearchCategoryId );        
+                iUiEngine.SetVcAppState( EStateContentView );
+                iUiEngine.ServiceProvider()->HandleAppStateChangedL();                
+                }
+            else if ( appState == EStateContentView )
+                {
+                iUiEngine.ContentProvider()->RefreshView();
+                }
+
+            UpdateCategoryVideoCountL();
+            }
+            break;
+
+        case KIptvRssSearchThumbnailCount:
+            {
+            IPTVLOGSTRING2_HIGH_LEVEL("UI Engine ##  Search thumbnail count %d", aInfo);
+            iThumbnailCount = aInfo;
+            ShowInfoPopupL( ETrue );
+            }
+            break;
+
+        case KIptvRssSearchContentThumbnailDownloaded:
+            {
+            iThumbnailsDownloaded++;
+            IPTVLOGSTRING2_HIGH_LEVEL("UI Engine ##  Search thumbnail %d downloaded", iThumbnailsDownloaded);
+            ShowInfoPopupL( ETrue );
+            }
+            break;
+
+        default:
+            break;
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::RegisterObserver()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::RegisterObserver( MVcxNsContentSearchObserver* aObserver )
+    {
+    // should use find instead of loop
+    for ( TInt i = 0; i < iSearchObservers.Count(); i++ )
+        {
+        if( iSearchObservers[i] == aObserver )
+            {
+            return;
+            }
+        }
+    
+    iSearchObservers.Append( aObserver );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::DeRegisterObserver()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::DeRegisterObserver( MVcxNsContentSearchObserver* aObserver )
+    {
+    // should use find instead of loop
+    for ( TInt i = 0; i < iSearchObservers.Count(); i++ )
+        {
+        if( iSearchObservers[i] == aObserver )
+            {
+            iSearchObservers.Remove( i );
+            iSearchObservers.Compress();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxNsContentSearchHandler::UpdateCategoryVideoCountL()
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::UpdateCategoryVideoCountL( )
+    {
+    //Category's video count needs to be updated to keep search 
+    //category's video count in UI up to date.
+    //Other categories are updated during normal content update.
+    CVcxNsCategory* activeCategory =  
+        iUiEngine.GetCategoryProviderL()->GetActiveCategoryDataL();
+    
+    if ( activeCategory )
+        {
+        TInt videoCount = iUiEngine.GetContentProviderL()->GetContentsL().Count();
+        activeCategory->SetVideoCount( videoCount );
+        iUiEngine.CategoryProvider()->UpdateActiveCategoryDataL( *activeCategory );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Shows thumbnail loading pop-up
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::ShowInfoPopupL( TBool aVisible )
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentSearchHandler::ShowInfoPopupL");
+    if ( !aVisible )
+        {
+        // Hiding pop-up, so reset the values
+        iThumbnailCount = 0;
+        iThumbnailsDownloaded = 0;
+        }
+
+    if ( iUiEngine.VcAppState() == EStateContentView && 
+            iUiEngine.ActiveCategory() == KIptvRssSearchCategoryId )
+        {
+        if (  iUiEngine.ContentProvider() && 
+             ( !iUiEngine.ServiceProvider() ||
+               !iUiEngine.ServiceProvider()->GetActiveServiceData() ||
+                iUiEngine.ServiceProvider()->GetActiveServiceData()->GetUpdateStatus() 
+                != CVcxNsService::EUpdateOngoing ) )
+            {
+            iUiEngine.ContentProvider()->ShowUpdatingNoteL( 
+                aVisible, iThumbnailCount, iThumbnailsDownloaded );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Search cancelled by user
+// -----------------------------------------------------------------------------
+//
+void CVcxNsContentSearchHandler::SearchCancelled( )
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CVcxNsContentSearchHandler::SearchCancelled()");
+    if ( iUiEngine.VcAppState() == EStateCustomView && 
+         iUiEngine.ActiveCategory() == KIptvRssSearchCategoryId )
+        {
+        iUiEngine.SetActiveService( iUiEngine.ActiveServiceGroup() );
+        iUiEngine.SetActiveServiceGroup( KMaxTUint );        
+        }
+    }