videocollection/mpxmyvideoscollection/src/vcxmyvideosopenhandler.cpp
changeset 0 96612d01cf9f
child 10 ce5ada96ab30
child 15 cf5481c2bc0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosopenhandler.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,296 @@
+/*
+* Copyright (c) 2007 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:   Handles collection Open operation related functionality.*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <mpxlog.h>
+#include <mpxcollectionplugin.h>
+#include <mpxcollectionpluginobserver.h>
+#include <mpxmediacontainerdefs.h>
+#include <mpxmediageneraldefs.h>
+
+#include "vcxmyvideoscollectionplugin.h"
+#include "vcxmyvideosopenhandler.h"
+#include "vcxmyvideosvideocache.h"
+#include "vcxmyvideosmdsdb.h"
+#include "vcxmyvideoscategories.h"
+#include "vcxmyvideosmessagelist.h"
+#include "vcxmyvideoscollectionutil.h"
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CVcxMyVideosOpenHandler::CVcxMyVideosOpenHandler( CVcxMyVideosCollectionPlugin& aCollection,
+        CVcxMyVideosVideoCache& aCache,
+        CVcxMyVideosMdsDb& aMds )
+: iCollection( aCollection ), iCache( aCache ), iMds( aMds )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd-phase constructor
+// ---------------------------------------------------------------------------
+//
+void CVcxMyVideosOpenHandler::ConstructL()
+    {
+    iCategoryIdsBeingOpened.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// Two-Phase Constructor
+// ---------------------------------------------------------------------------
+//
+CVcxMyVideosOpenHandler* CVcxMyVideosOpenHandler::NewL( CVcxMyVideosCollectionPlugin& aCollection,
+        CVcxMyVideosVideoCache& aCache,
+        CVcxMyVideosMdsDb& aMds )
+    {
+    CVcxMyVideosOpenHandler* self = new(ELeave) CVcxMyVideosOpenHandler( aCollection,
+            aCache, aMds );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CVcxMyVideosOpenHandler::~CVcxMyVideosOpenHandler()
+    {
+    iCategoryIdsBeingOpened.Close();
+    
+    TInt count = iVideoListsBeingOpened.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        delete iVideoListsBeingOpened[i];
+        iVideoListsBeingOpened[i] = NULL; 
+        }
+    iVideoListsBeingOpened.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CVcxMyVideosOpenHandler::OpenL
+// ---------------------------------------------------------------------------
+//
+void CVcxMyVideosOpenHandler::OpenL(
+    const CMPXCollectionPath& aPath )
+    {
+    MPX_FUNC("CVcxMyVideosOpenHandler::OpenL");
+
+    MPX_DEBUG1("CVcxMyVideosOpenHandler:: path before open:");
+    MPX_DEBUG_PATH( aPath );
+
+    switch ( aPath.Levels() )
+        {
+        case 1:
+            {
+            //we are at root level, return main level items (categories)
+            
+            // this is needed to update category counters
+            TRAPD( err, iCache.CreateVideoListL() );
+            
+            if ( err != KErrNone )
+                {
+                MPX_DEBUG2("iCache->CreateVideoListL() left: %d. Returning categories anyway.", err);
+                }
+            iCollection.iObs->HandleOpen( iCollection.CategoriesL().iList, KErrNone );
+            }
+            break;
+
+        case 2:
+            {
+            //we are at second level, return video list from some category
+
+            TInt categoryId = aPath.Id();
+
+            MPX_DEBUG2("CVcxMyVideosOpenHandler:: opening category %d", categoryId);
+            
+            if ( categoryId != KVcxMvcCategoryIdAll &&
+                 categoryId != KVcxMvcCategoryIdDownloads &&
+                 categoryId != KVcxMvcCategoryIdTvRecordings &&
+                 categoryId != KVcxMvcCategoryIdCaptured &&
+                 categoryId != KVcxMvcCategoryIdOther )
+                {
+                MPX_DEBUG2("CVcxMyVideosOpenHandler:: category ID not valid (%d) -> calling HandleOpen with KErrNotFound", categoryId);
+                iCollection.iObs->HandleOpen( static_cast<CMPXMedia*>(NULL), KErrNotFound );
+                return;
+                }
+
+            TUint8 origin = static_cast<TUint8>( TVcxMyVideosCollectionUtil::Origin( categoryId ) );
+
+            iCache.CreateVideoListL(); // Causes async call to MDS, callbacks to DoHandleCreateVideoListRespL will happen.
+                                       // If iCache.iVideoList is complete and can be used (correct sorting order),
+                                       // then nothing is done.
+
+            if ( !iCache.iVideoListIsPartial )
+                {
+                MPX_DEBUG1("CVcxMyVideosOpenHandler:: videolist complete");
+
+                // iCache.iVideoList is complete
+                if ( categoryId == KVcxMvcCategoryIdAll )
+                    {
+                    MPX_DEBUG1("CVcxMyVideosOpenHandler:: KVcxMvcCategoryIdAll: calling HandleOpen(iCache.iVideoList)");
+                    iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone );                    
+                    }
+                else
+                    {
+                    MPX_DEBUG1("CVcxMyVideosOpenHandler:: other than KVcxMvcCategoryIdAll: creating new category video list");
+                    CMPXMedia* videoList = iCache.CreateVideoListByOriginL( origin );
+                    MPX_DEBUG1("CVcxMyVideosOpenHandler:: calling HandleOpen(new list)");
+                    iCollection.iObs->HandleOpen( videoList, KErrNone );
+                    delete videoList;
+                    }
+                iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete );
+                iCollection.iMessageList->SendL();
+
+                // No append events will arrive anymore -> we create our own version of the
+                // video list.
+                iCache.ReCreateVideoListL();
+                }
+            else
+                {
+                MPX_DEBUG1("CVcxMyVideosOpenHandler:: video list incomplete");
+                // iCache.iVideoList is incomplete                
+
+                if ( categoryId == KVcxMvcCategoryIdAll )
+                    {
+                    MPX_DEBUG1("CVcxMyVideosOpenHandler:: KVcxMvcCategoryIdAll, calling HandleOpen");
+                    iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone  );
+                    }
+                else
+                    {   
+                    MPX_DEBUG1("CVcxMyVideosOpenHandler:: other than KVcxMvcCategoryIdAll");
+
+                    TInt pos = iCategoryIdsBeingOpened.Find( categoryId );
+                    if ( pos == KErrNotFound )
+                        {
+                        MPX_DEBUG1("CVcxMyVideosOpenHandler:: category was not opened yet, creating list for it");
+                        iCategoryIdsBeingOpened.AppendL( categoryId ); 
+                        CMPXMedia* videoList = iCache.CreateVideoListByOriginL( origin );
+                        iVideoListsBeingOpened.AppendL( videoList );
+                        MPX_DEBUG1("CVcxMyVideosOpenHandler:: calling HandleOpen");
+                        iCollection.iObs->HandleOpen( iCache.iVideoList, KErrNone  );
+                        }
+                    else
+                        {
+                        MPX_DEBUG1("CVcxMyVideosOpenHandler:: category was already being opened, calling HandleOpen with that");                        
+                        iCollection.iObs->HandleOpen( iVideoListsBeingOpened[pos], KErrNone  );
+                        }
+                    }
+                }
+
+            }
+            break;
+
+        case 3:
+			{
+			iCollection.iObs->HandleOpen(const_cast<CMPXCollectionPath*> (&aPath), KErrNone);
+			}
+			break;
+
+        default:
+            break;
+
+        } //switch
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosOpenHandler::DoHandleCreateVideoListRespL
+// New items fetched from MDS. iCache.iVideoList = aVideoList.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosOpenHandler::DoHandleCreateVideoListRespL(
+        CMPXMedia* aVideoList, TInt aNewItemsStartIndex, TBool aComplete )
+    {
+    MPX_FUNC("CVcxMyVideosOpenHandler::DoHandleCreateVideoListRespL()");
+
+    MPX_DEBUG2("CVcxMyVideosOpenHandler:: aComplete = %d", aComplete);
+    
+    if ( aNewItemsStartIndex != KErrNotFound )
+        {
+        //iCache.iVideoList now contains new items, tell iCache to check if partial list contains the new items
+        iCache.CheckForPartialVideoListItemsL( aNewItemsStartIndex );
+        }
+
+    // Append new items to category video lists. All category is using iCache.iVideoList, thus no need to append to it.
+    TInt count = iCategoryIdsBeingOpened.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        iCache.AppendToListL( *iVideoListsBeingOpened[i], *aVideoList,
+                TVcxMyVideosCollectionUtil::Origin( iCategoryIdsBeingOpened[i] ),
+                aNewItemsStartIndex );
+        }
+            
+    if ( aComplete == 0 )
+        {
+        iCollection.iMessageList->AddEventL( KVcxMessageMyVideosItemsAppended );
+
+        // Still fetching items
+        // Missing download fields filled from download manager
+        TRAP_IGNORE( iCollection.SyncVideoListWithDownloadsL( *(iCache.iVideoList),
+                EFalse /* dont send events */, aNewItemsStartIndex ); ); 
+        iCollection.CategoriesL().UpdateCategoriesL( *aVideoList, aNewItemsStartIndex );
+        }                           
+    else
+        {
+        // End event arrived
+        
+        iCache.iVideoListIsPartial = EFalse;
+
+        // Create modify event for All category.
+        // This will cause client to make a new OpenL() call.
+        // Also this causes collection framework to purge its possibly outdated
+        // (KVcxMessageMyVideosItemsAppended events don't update collection framework cache) cache.
+        MPX_DEBUG3("CVcxMyVideosOpenHandler:: adding modify event for category[%d], extra info = %d",
+                KVcxMvcCategoryIdAll, EVcxMyVideosVideoListOrderChanged );
+        iCollection.iMessageList->AddEventL( TMPXItemId( KVcxMvcCategoryIdAll, 1 ), EMPXItemModified,
+                EVcxMyVideosVideoListOrderChanged );
+        // We dont send here, the send is at the end of this function.
+
+        for ( TInt i = 0; i < count; i++ )
+            {
+            // Create modify event for other than All categories.
+            // This will cause client to make a new OpenL() call.
+            // Also this causes collection framework to purge its possibly outdated
+            // (KVcxMessageMyVideosItemsAppended events don't update collection frameworks cache) cache.
+            MPX_DEBUG3("CVcxMyVideosOpenHandler:: adding modify event for category[%d], extra info = %d",
+                    iCategoryIdsBeingOpened[i], EVcxMyVideosVideoListOrderChanged );
+            iCollection.iMessageList->AddEventL( TMPXItemId( iCategoryIdsBeingOpened[i], 1 ), EMPXItemModified,
+                    EVcxMyVideosVideoListOrderChanged );
+            // We dont send here, the send is at the end of this function.
+            delete iVideoListsBeingOpened[i]; // we can delete our copy, client has its own copy
+            iVideoListsBeingOpened[i] = NULL;
+            }
+        iVideoListsBeingOpened.Reset();
+        iCategoryIdsBeingOpened.Reset();
+
+        // all category, lets delete our copy and start using new one, this gives the full ownership to client
+        iCache.ReCreateVideoListL();
+
+        iCollection.CategoriesL().UpdateCategoriesNewVideoNamesL();
+
+        iCollection.iMessageList->AddEventL( KVcxMessageMyVideosListComplete );
+        }
+    iCollection.iMessageList->SendL();
+    }
+
+// END OF FILE