videocollection/mpxmyvideoscollection/src/vcxmyvideosalbums.cpp
branchRCL_3
changeset 26 67eb01668b0e
child 45 baf439b22ddd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/mpxmyvideoscollection/src/vcxmyvideosalbums.cpp	Wed Jun 09 09:44:23 2010 +0300
@@ -0,0 +1,806 @@
+/*
+* 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:  Albums related collection functionality (except db operations).
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <mpxlog.h>
+#include <mpxmediacontainerdefs.h>
+#include <mpxcollectionpluginobserver.h>
+#include <mpxmediageneraldefs.h>
+#include "vcxmyvideosalbums.h"
+#include "vcxmyvideoscollectionutil.h"
+#include "vcxmyvideoscollectionplugin.h"
+#include "vcxmyvideosmdsdb.h"
+#include "vcxmyvideosmdsalbums.h"
+#include "vcxmyvideoscollectionutil.h"
+#include "vcxmyvideosmessagelist.h"
+#include "vcxmyvideosopenhandler.h"
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CVcxMyVideosAlbums::CVcxMyVideosAlbums( CVcxMyVideosCollectionPlugin& aCollection )
+: iCollection( aCollection )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// 2nd-phase constructor
+// ---------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::ConstructL()
+    {
+    iAlbums.Reset();
+    iChangedAlbums.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// Two-Phase Constructor
+// ---------------------------------------------------------------------------
+//
+CVcxMyVideosAlbums* CVcxMyVideosAlbums::NewL( CVcxMyVideosCollectionPlugin& aCollection )
+    {
+    CVcxMyVideosAlbums* self = new(ELeave) CVcxMyVideosAlbums( aCollection );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CVcxMyVideosAlbums::~CVcxMyVideosAlbums()
+    {
+    delete iAlbumList;
+    TInt count = iAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        delete iAlbums[i];
+        }
+    iAlbums.Close();
+    iMdsOpTargetIds.Close();
+    iMdsOpResults.Close();
+    iMdsOpResultsUint32.Close();
+    iRemoveFromAlbumVideos.Close();
+    iChangedAlbums.Close();
+    }
+    
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::CreateAlbumListL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::CreateAlbumListL()
+    {
+    if ( iAlbumList )
+        {
+        return;
+        }
+    iAlbumList = TVcxMyVideosCollectionUtil::CreateEmptyMediaListL();
+    iCollection.iMyVideosMdsDb->iAlbums->GetAlbumsL( iAlbumList, *this );
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::CreateAlbumsL
+// Called when iAlbumList is ready, fills iAlbums.
+// Pointers to CVcxMyVideosVideoCache::iVideoList are not filled in yet.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::CreateAlbumsL()
+    {
+    CMPXMediaArray* albumArray = iAlbumList->Value<CMPXMediaArray>( KMPXMediaArrayContents );
+
+    TInt count = albumArray->Count();
+    CVcxMyVideosAlbum* album;
+    CMPXMedia* media;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        media = albumArray->AtL( i );
+        album = CVcxMyVideosAlbum::NewLC( iCollection );
+        album->iMdsId = TVcxMyVideosCollectionUtil::IdL( *media ).iId1;
+        album->iMedia = media;
+        iAlbums.AppendL( album );
+        CleanupStack::Pop( album );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::GetAlbumContentIdsL
+// Fetches MDS IDs for all albums.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::GetAlbumContentIdsL()
+    {
+    TInt count = iAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        // These calls go to queue and responses arrive asynchronously
+        // to HandleGetAlbumContentIdsRespL.
+        iCollection.iMyVideosMdsDb->iAlbums->GetAlbumContentIdsL( iAlbums[i]->iMdsId,
+                iAlbums[i]->iVideoList, *this );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::Album
+// ----------------------------------------------------------------------------
+//
+CVcxMyVideosAlbum* CVcxMyVideosAlbums::Album( TUint32 aMdsId, TInt* aPos )
+    {
+    TInt count = iAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( iAlbums[i]->iMdsId == aMdsId )
+            {
+            if ( aPos )
+                {
+                *aPos = i;
+                }
+            return iAlbums[i];
+            }
+        }
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::AddVideosToAlbumL
+// Command from MPX client.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::AddVideosToAlbumL( CMPXMedia* aCmd )
+    {    
+    TInt albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd );
+    CVcxMyVideosAlbum* album = Album( albumId );
+    if ( album )
+        {
+        CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd );
+        TInt count = mediaArray->Count();
+        CMPXMedia* video;
+        TInt mdsId;
+        RArray<TUint32> uniqueVideoIds;
+        uniqueVideoIds.Reset();
+        CleanupClosePushL( uniqueVideoIds );
+        
+        for ( TInt i = 0; i < count; i++ )
+            {
+            video = mediaArray->AtL( i );
+            mdsId = TVcxMyVideosCollectionUtil::IdL( *video ).iId1;
+
+            // Mark duplicates as failed to aCmd (KErrAlreadyExists)
+            if ( uniqueVideoIds.Find( mdsId ) == KErrNotFound )
+                {
+                uniqueVideoIds.AppendL( mdsId );
+
+                // Mark videos which are already in album as failed to aCmd (KErrAlreadyExists)
+                if ( album->BelongsToAlbum( mdsId ) )
+                    {
+                    MPX_DEBUG3("CVcxMyVideosAlbums:: %d already belongs to %d album",
+                            mdsId, albumId );
+                    video->SetTObjectValueL<TInt32>( KVcxMediaMyVideosInt32Value, KErrAlreadyExists );
+                    }
+                else
+                    {
+                    video->SetTObjectValueL<TInt32>( KVcxMediaMyVideosInt32Value, KErrNone );
+                    }
+                }
+            else
+                {
+                MPX_DEBUG2("CVcxMyVideosAlbums:: %d already present in the aCmd, marking as KErrAlreadyExists", mdsId);
+                video->SetTObjectValueL<TInt32>( KVcxMediaMyVideosInt32Value, KErrAlreadyExists );
+                }
+
+            }
+        
+        CleanupStack::PopAndDestroy( &uniqueVideoIds );
+        }
+    
+    iCollection.iMyVideosMdsDb->iAlbums->AddVideosToAlbumL( aCmd, *this );
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::RemoveVideosFromAlbumL
+// Converts video mpx ids to relation ids and calls RemoveRelationsL.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::RemoveVideosFromAlbumL( CMPXMedia* aCmd )
+    {
+    TInt albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd );
+    CMPXMediaArray* array = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd );
+    TVcxMyVideosAlbumVideo video;
+    TInt index;
+    TInt error;
+    CMPXMedia* media;
+    TInt count = array->Count();
+    iMdsOpTargetIds.Reset();
+    iMdsOpTargetIds.Reserve( count );
+    iRemoveFromAlbumVideos.Reset();
+    iRemoveFromAlbumVideos.Reserve( count );
+    TVcxMyVideosAlbumVideo paddingVideo;
+    paddingVideo.iMdsId         = 0;
+    paddingVideo.iRelationMdsId = 0;
+    
+    for ( TInt i = 0; i < count; i++ )
+        {
+        media = array->AtL( i );
+        error = Album( albumId )->Video(
+                TVcxMyVideosCollectionUtil::IdL( *media ).iId1, video, index );
+        if ( error == KErrNone )
+            {
+            iRemoveFromAlbumVideos.AppendL( video ); //store album video data now to avoid second search when response arrives
+            iMdsOpTargetIds.AppendL( video.iRelationMdsId );
+            }
+        else
+            {
+            iRemoveFromAlbumVideos.AppendL( paddingVideo ); //add dummy video to keep media array and iRemoveFromAlbumVideos in sync
+            }
+        }
+    iMdsOpResultsUint32.Reset();
+    iCollection.iMyVideosMdsDb->iAlbums->RemoveRelationsL(
+            iMdsOpTargetIds, iMdsOpResultsUint32, *this );
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::AddAlbumL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::AddAlbumL( CMPXMedia& aCmd )
+    {
+    if ( TVcxMyVideosCollectionUtil::Title( aCmd ).Length() > 255 )
+        {
+        User::Leave( KErrArgument );
+        }
+    
+    iCollection.iMyVideosMdsDb->iAlbums->AddAlbumL( aCmd );
+    
+    TUint32 mdsId = TVcxMyVideosCollectionUtil::IdL( aCmd ).iId1;
+    if ( !Album( mdsId ) )
+        {
+        CMPXMediaArray* albumArray = iAlbumList->Value<CMPXMediaArray>( KMPXMediaArrayContents );
+        albumArray->AppendL( aCmd );
+        
+        CVcxMyVideosAlbum* album = CVcxMyVideosAlbum::NewLC( iCollection );
+        album->iMdsId = mdsId;
+        album->iMedia = albumArray->AtL( albumArray->Count() - 1 );
+        iAlbums.AppendL( album );
+        CleanupStack::Pop( album );
+        
+        iCollection.iMessageList->AddEventL( TMPXItemId( mdsId, KVcxMvcMediaTypeAlbum ),
+                EMPXItemInserted, EVcxMyVideosListNoInfo, album->iMedia );
+        iCollection.iMessageList->SendL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::RemoveAlbumsFromMdsOnlyL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::RemoveAlbumsFromMdsOnlyL( CMPXMedia* aCmd )
+    {
+    iCollection.iMyVideosMdsDb->iAlbums->RemoveAlbumsL( aCmd, *this );
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::RemoveAlbumsL
+// From MDS delete event.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::RemoveAlbumsL( RArray<TUint32>& aAlbumIds )
+    {
+    TInt count = aAlbumIds.Count();
+    for ( TInt i = count -1; i >= 0; i-- )
+        {
+        TBool removed = RemoveAlbumL( aAlbumIds[i], EFalse /* dont compress */);
+        if ( removed )
+            {
+            aAlbumIds.Remove( i );
+            }
+        }
+    iAlbums.Compress();
+    
+    iCollection.iMessageList->SendL();        
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::RemoveAlbumL
+// ----------------------------------------------------------------------------
+//
+TBool CVcxMyVideosAlbums::RemoveAlbumL( TUint32 aMdsId, TBool aCompress )
+    {
+    TInt pos;
+    CVcxMyVideosAlbum* album = Album( aMdsId, &pos );
+    if ( album )
+        {
+        CMPXMediaArray* albumArray = TVcxMyVideosCollectionUtil::MediaArrayL( *iAlbumList );
+        
+        iAlbums.Remove( pos );
+        albumArray->Remove( pos );
+        
+        MPX_DEBUG2("CVcxMyVideosAlbums:: removing album from pos %d", pos);
+        
+        if ( aCompress )
+            {
+            iAlbums.Compress();
+            }
+        iCollection.iMessageList->AddEventL( TMPXItemId( aMdsId, KVcxMvcMediaTypeAlbum ),
+                EMPXItemDeleted, EVcxMyVideosListNoInfo );
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::CalculateAttributesL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::CalculateAttributesL()
+    {
+    TInt count = iAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        iAlbums[i]->CalculateAttributesL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::AddAlbumsFromMdsL
+// From MDS insert event, no need to fetch content since the album was just
+// created.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::AddAlbumsFromMdsL( RArray<TUint32>& /*aAlbumIds*/ )
+    {
+    //TODO: implement if we want to support albums which are added by someone else
+    //      than My Videos Collection.
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleGetAlbumsRespL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleGetAlbumsRespL( CMPXMedia* aAlbumList )
+    {
+    // aAlbumList = iAlbumList
+    CMPXMediaArray* array = aAlbumList->Value<CMPXMediaArray>( KMPXMediaArrayContents );
+    TInt count = array->Count();
+    TMPXItemId mpxId;
+    CMPXMedia* album;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        album = array->AtL( i );
+        mpxId = TVcxMyVideosCollectionUtil::IdL( *album );
+        iCollection.iMessageList->AddEventL( mpxId, EMPXItemInserted, 0, album );
+        }
+    CreateAlbumsL(); //fills in iAlbums from iAlbumList
+    GetAlbumContentIdsL(); //fills iAlbums with MDS IDs of the videos asynchronously
+    iCollection.iMessageList->SendL();
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleGetAlbumContentIdsRespL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleGetAlbumContentIdsRespL( TUint32 aAlbumId,
+        RArray<TVcxMyVideosAlbumVideo>& /*aAlbumContentIds*/ )
+    {    
+    //&aAlbumContent = iAlbums[x]->iVideoList
+    
+    CVcxMyVideosAlbum* album( Album( aAlbumId ) ); 
+    if ( album )
+        {
+        album->Sort(); //sorts iAlbum[x]->iVideoList by MDS ID.
+        }
+
+    //if last album -> album list is complete
+    if ( iAlbums[iAlbums.Count() -1]->iMdsId == aAlbumId )
+        {
+        MPX_DEBUG1("CVcxMyVideosAlbums:: content ids for last album arrived -> album list is complete" );
+        iAlbumListIsComplete = ETrue;
+
+        if ( iCollection.iOpenHandler->iPendingAlbumOpenId )
+            {
+            MPX_DEBUG1("CVcxMyVideosAlbums:: there was album open pending, calling HandleAlbumOpenL()" );
+
+            TRAPD( err, iCollection.iOpenHandler->HandleAlbumOpenL() );
+            if ( err != KErrNone )
+                {
+                MPX_DEBUG3("CVcxMyVideosAlbums:: HandleAlbumOpenL() left: %d, calling HandleOpen(NULL,%d)",
+                        err, err);
+                iCollection.iObs->HandleOpen( static_cast<CMPXMedia*>(NULL), err );
+                }
+            }
+        }
+    
+    
+#ifdef _DEBUG
+    if ( album )
+        {
+        TInt count = album->iVideoList.Count();
+
+        MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: content ids for album %d arrived", aAlbumId);
+
+        for ( TInt i = 0; i < album->iVideoList.Count(); i++ )
+            {
+            MPX_DEBUG2("CVcxMyVideosCollectionPlugin:: mds id = %d", album->iVideoList[i].iMdsId );
+            }
+        }
+#endif
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleGetAlbumsResp
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleGetAlbumsResp( CMPXMedia* aAlbumList )
+    {
+    TRAP_IGNORE( HandleGetAlbumsRespL( aAlbumList ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleGetAlbumContentIdsResp
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleGetAlbumContentIdsResp( TUint32 aAlbumId,
+        RArray<TVcxMyVideosAlbumVideo>& aAlbumContent )
+    {
+    TRAP_IGNORE( HandleGetAlbumContentIdsRespL( aAlbumId, aAlbumContent ) );    
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleAddVideosToAlbumResp
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleAddVideosToAlbumResp( CMPXMedia* aCmd,
+        RPointerArray<CMdEInstanceItem>& aItemArray )
+    {    
+    TRAPD( err, DoHandleAddVideosToAlbumRespL( aCmd, aItemArray ) );
+    
+    if ( err != KErrNone )
+        {
+        CMPXMedia* cmd = iCollection.iActiveTask->Command(); 
+        if ( cmd )
+            {
+            cmd->SetTObjectValueL<TInt>( KVcxMediaMyVideosInt32Value, err );
+            iCollection.iActiveTask->Done();
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::DoHandleAddVideosToAlbumResp
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::DoHandleAddVideosToAlbumRespL( CMPXMedia* aCmd,
+        RPointerArray<CMdEInstanceItem>& aItemArray )
+    {
+    MPX_DEBUG1("CVcxMyVideosAlbums::DoHandleAddVideosToAlbumResp() start");
+
+    TUint32 albumId = TVcxMyVideosCollectionUtil::Uint32ValueL( *aCmd );
+    CVcxMyVideosAlbum* album = Album( albumId );
+
+    CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd );
+    
+    TVcxMyVideosAlbumVideo video;
+    RArray<CVcxMyVideosAlbum*> modifiedAlbums;
+    modifiedAlbums.Reset();
+    CleanupClosePushL( modifiedAlbums );
+
+    TInt mediaArrayCount  = mediaArray->Count();
+    TInt resultArrayCount = aItemArray.Count();
+    CMPXMedia* media;
+    TInt j = 0;
+    for ( TInt i = 0; i < mediaArrayCount; i++ )
+        {
+        if ( j > resultArrayCount - 1 )
+            {
+            MPX_DEBUG1("CVcxMyVideosAlbums:: result array already at end, skipping the rest");
+            break; //break from for loop
+            }
+
+        media = mediaArray->AtL( i );
+
+        // Skip items which were already failed (KErrAlreadyExists)
+        if ( TVcxMyVideosCollectionUtil::Int32ValueL( *media ) != KErrAlreadyExists )
+            {
+            video.iRelationMdsId = aItemArray[j]->Id(); 
+            MPX_DEBUG3( "CVcxMyVideosAlbums:: item result[%d] = %d (id)", j, video.iRelationMdsId );
+            if ( video.iRelationMdsId == KNoId )
+                {
+                media->SetTObjectValueL<TInt>( KVcxMediaMyVideosInt32Value,
+                        KErrGeneral );
+                }
+            else
+                {
+                media->SetTObjectValueL<TInt>( KVcxMediaMyVideosInt32Value, KErrNone );
+                video.iMdsId = TVcxMyVideosCollectionUtil::IdL( *media ).iId1;
+                if ( album )
+                    {
+                    album->AddL( video );
+                    if ( modifiedAlbums.Find( album ) == KErrNotFound )
+                        {
+                        modifiedAlbums.AppendL( album );
+                        }
+                    iCollection.iMessageList->AddEventL( TMPXItemId( albumId, KVcxMvcMediaTypeAlbum ),
+                            EMPXItemModified, EVcxMyVideosVideoListOrderChanged );
+                    }
+                }
+            j++;
+            }
+        else
+            {
+            MPX_DEBUG2("CVcxMyVideosAlbums:: skipping already failed %d(KErrAlreadyExists) media array item",
+                    TVcxMyVideosCollectionUtil::IdL( *media ).iId1 );
+            }
+        }
+
+    TInt count = modifiedAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        modifiedAlbums[i]->CalculateAttributesL();
+        }
+    
+    CleanupStack::PopAndDestroy( &modifiedAlbums );
+    
+    iCollection.iActiveTask->Done();
+    iCollection.iMessageList->SendL();
+    
+    MPX_DEBUG1("CVcxMyVideosAlbums::DoHandleAddVideosToAlbumResp() exit");
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleRemoveRelationsResp
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleRemoveRelationsResp( RArray<TUint32>& /*aRelationIds*/,
+        RArray<TUint32>& aResults )
+    {
+    MPX_DEBUG1("CVcxMyVideosAlbums::HandleRemoveRelationsResp() start");
+    
+    // iRemoveFromAlbumVideos and mediaArray are in sync
+    
+    TRAP_IGNORE(
+    
+    CMPXMedia* cmd             = iCollection.iActiveTask->Command();
+    CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *cmd );
+    TInt count                 = iRemoveFromAlbumVideos.Count();
+    CMPXMedia* video;
+    TInt relationId;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        video = mediaArray->AtL( i );
+        relationId = iRemoveFromAlbumVideos[i].iRelationMdsId;
+        if ( relationId != 0 && 
+                aResults.Find( relationId ) != KErrNotFound )
+            {
+            video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrNone );
+            }
+        else
+            {
+            video->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrGeneral );
+            }
+        }
+    
+    );
+    
+    iRemoveFromAlbumVideos.Reset();
+    
+    iCollection.iActiveTask->Done();
+
+    MPX_DEBUG1("CVcxMyVideosAlbums::HandleRemoveRelationsResp() exit");
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleRemoveAlbumsResp
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleRemoveAlbumsResp( CMPXMedia* aCmd,
+        RArray<TUint32>& aResultIds )
+    {    
+    TRAP_IGNORE(
+    
+    CMPXMediaArray* mediaArray = TVcxMyVideosCollectionUtil::MediaArrayL( *aCmd );
+    TInt count = mediaArray->Count();
+    TUint32 mdsId;
+    CMPXMedia* album;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        album = mediaArray->AtL( i );
+        mdsId = TVcxMyVideosCollectionUtil::IdL( *album ).iId1;
+        if ( aResultIds.Find( mdsId ) != KErrNotFound )
+            {
+            album->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrNone );
+            }
+        else
+            {
+            album->SetTObjectValueL( KVcxMediaMyVideosInt32Value, KErrGeneral );
+            }
+        }
+    
+    );
+    
+    iCollection.iActiveTask->Done();
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::HandleRelationEvent
+// Only relation removed events are received here.
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::HandleRelationEvent( TObserverNotificationType /*aType*/,
+        const RArray<TMdERelation>& aRelationArray )
+    {    
+    TRAP_IGNORE(
+
+    RArray<CVcxMyVideosAlbum*> modifiedAlbums;
+    modifiedAlbums.Reset();
+    CleanupClosePushL( modifiedAlbums );
+
+    TUint albumId;
+    CVcxMyVideosAlbum* album;
+    TInt count = aRelationArray.Count();
+    
+    
+    for ( TInt i = 0; i < count; i++ )
+        {
+        albumId = aRelationArray[i].LeftObjectId();
+        
+        MPX_DEBUG3("CVcxMyVideosAlbums:: relation (%d,%d) deleted from MDS",
+                aRelationArray[i].LeftObjectId(), aRelationArray[i].RightObjectId() );
+        
+        if ( iAlbumListIsComplete )
+            {
+            album = Album( albumId );
+            if ( album )
+                {
+                if ( modifiedAlbums.Find( album ) == KErrNotFound )
+                    {
+                    modifiedAlbums.AppendL( album );
+                    }
+                album->Remove( aRelationArray[i].RightObjectId(), ETrue /* compress */ );
+                iCollection.iMessageList->AddEventL( TMPXItemId( albumId, KVcxMvcMediaTypeAlbum ),
+                        EMPXItemModified, EVcxMyVideosVideoListOrderChanged );
+                }
+            }
+        else
+            {
+            //We are fetching albums already, we assume that it will be up to date.
+            //If that is not the case, then we should set some flag here and restart
+            //album fetching from scratch.
+            }
+        }
+    
+    count = modifiedAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        modifiedAlbums[i]->CalculateAttributesL();
+        }
+    
+    CleanupStack::PopAndDestroy( &modifiedAlbums );
+    
+    iCollection.iMessageList->SendL();
+    
+    );
+    }
+
+//HandleRelationIdEvent
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::UpdateAlbumL
+// Updates album attributes from aAlbum, if album is not found from memory,
+// nothing is done (no fetching from MDS).
+// This func is also called (by MDS modified event) when items are added or
+// removed from album.
+// ----------------------------------------------------------------------------
+//
+TBool CVcxMyVideosAlbums::UpdateAlbumL( const CMPXMedia& aAlbum )
+    {
+    TBool changed = EFalse;
+    
+    TMPXItemId mpxId = TVcxMyVideosCollectionUtil::IdL( aAlbum );
+    CVcxMyVideosAlbum* album = Album( mpxId.iId1 );
+
+    if ( album && album->iMedia )
+        {
+        CMPXMedia* media = album->iMedia;
+
+        if ( media->IsSupported( KMPXMediaGeneralTitle ) )
+            {
+            TPtrC newTitle( TVcxMyVideosCollectionUtil::Title( aAlbum ) );
+            TPtrC oldTitle( TVcxMyVideosCollectionUtil::Title( *media ) );
+
+            if ( newTitle != oldTitle )
+                {
+                media->SetTextValueL( KMPXMediaGeneralTitle, newTitle );
+                iCollection.iMessageList->AddEventL( mpxId, EMPXItemModified );
+                changed = ETrue;
+                }
+            }
+        // calculate attributes, in case that videos were removed or added to this album
+        album->CalculateAttributesL();
+        }
+        
+    return changed;
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::NewVideoFlagChangedL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::NewVideoFlagChangedL( TUint32 aMdsId )
+    {    
+    TInt count = iAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( iAlbums[i]->BelongsToAlbum( aMdsId ) )
+            {
+            iAlbums[i]->CalculateAttributesL();
+            iCollection.iMessageList->AddEventL(
+                    TMPXItemId( iAlbums[i]->iMdsId, KVcxMvcMediaTypeAlbum ),
+                    EMPXItemModified, EVcxMyVideosListNoInfo );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::VideoTitleChangedL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::VideoTitleChangedL( TUint32 aMdsId )
+    {    
+    NewVideoFlagChangedL( aMdsId ); // same calculation works for this
+    }
+
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::VideoAddedOrRemovedFromCacheL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::VideoAddedOrRemovedFromCacheL( CMPXMedia& aVideo )
+    {
+    TInt count = iAlbums.Count();
+    TUint32 mdsId = TVcxMyVideosCollectionUtil::IdL( aVideo ).iId1;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( iAlbums[i]->BelongsToAlbum( mdsId ) )
+            {
+            if ( iChangedAlbums.Find( i ) == KErrNotFound )
+                {
+                iChangedAlbums.AppendL( i );
+                }
+            }
+        }    
+    }
+// ----------------------------------------------------------------------------
+// CVcxMyVideosAlbums::UpdateChangedAlbumsL
+// ----------------------------------------------------------------------------
+//
+void CVcxMyVideosAlbums::UpdateChangedAlbumsL()
+    {
+    TInt count = iChangedAlbums.Count();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        iCollection.iMessageList->AddEventL(
+                TMPXItemId( iAlbums[iChangedAlbums[i]]->iMdsId, KVcxMvcMediaTypeAlbum ),
+                EMPXItemModified, EVcxMyVideosVideoListOrderChanged );
+        iAlbums[iChangedAlbums[i]]->CalculateAttributesL();
+        }
+    iChangedAlbums.Reset();
+    }
+// END OF FILE