diff -r 000000000000 -r a2952bb97e68 mmappcomponents/harvester/collectionmediator/src/mpxmoveitemhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/harvester/collectionmediator/src/mpxmoveitemhelper.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,342 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Helper class to move items to different collections +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mpxmediatorobserver.h" +#include "mpxmoveobserver.h" +#include "mpxmoveitemhelper.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CMPXMoveItemHelper::CMPXMoveItemHelper( MMPXMoveItemObserver* aObs ) + : iObs(aObs), + iMoveState(EIdle ) + { + } + + +// --------------------------------------------------------------------------- +// 2nd phased constructor +// --------------------------------------------------------------------------- +// +void CMPXMoveItemHelper::ConstructL() + { + iCollection = MMPXCollectionUtility::NewL( NULL ); + + RArray ary; + CleanupClosePushL( ary ); + + ary.AppendL( TUid::Uid(EMPXCollectionPluginPodCast) ); + iPodCastCollectionID = iCollection->CollectionIDL( ary.Array() ); + + ary.Reset(); + ary.AppendL( TUid::Uid(EMPXCollectionPluginMusic) ); + iMusicCollectionID = iCollection->CollectionIDL( ary.Array() ); + + CleanupStack::PopAndDestroy( &ary ); + } + + +// --------------------------------------------------------------------------- +// Two phase constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CMPXMoveItemHelper* CMPXMoveItemHelper::NewL( MMPXMoveItemObserver* aObs ) + { + CMPXMoveItemHelper* self = CMPXMoveItemHelper::NewLC(aObs); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Two phased constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CMPXMoveItemHelper* CMPXMoveItemHelper::NewLC( MMPXMoveItemObserver* aObs ) + { + CMPXMoveItemHelper* self = new( ELeave ) CMPXMoveItemHelper(aObs); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// virtual destructor +// --------------------------------------------------------------------------- +// +CMPXMoveItemHelper::~CMPXMoveItemHelper() + { + if( iCollection ) + { + iCollection->Close(); + } + } + +// --------------------------------------------------------------------------- +// Move an item synchronously +// Three things to do to move an item +// 1: Remove item from old db +// 2: Udpdate media with new collection id +// 3: Add item into new db +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXMoveItemHelper::MoveItemL( CMPXMedia& aMedia, TUid aNewCollection ) + { + MMPXPlaybackUtility* pbUtil = MMPXPlaybackUtility::UtilityL( KPbModeActivePlayer ); + CleanupClosePushL(*pbUtil); + + // Media as a container or item + // + TMPXGeneralType type = + aMedia.ValueTObjectL( TMPXAttribute( KMPXMediaIdGeneral, + EMPXMediaGeneralType ) ); + + if ( type == EMPXGroup ) + { + const CMPXMediaArray* array = aMedia.Value( + TMPXAttribute( KMPXMediaIdContainer, + EMPXMediaArrayContents ) ); + if( !array ) + { + User::Leave( KErrNoMemory ); + } + + TInt count( array->Count() ); + if( count == 0 ) + { + User::Leave( KErrNotFound ); + } + for( TInt i=0; iAtL(i); + + // Notify the playback utility before removing the media item + if(entry->IsSupported(KMPXMediaGeneralId)) + { + TMPXItemId mediaId(entry->ValueTObjectL(KMPXMediaGeneralId)); + TRAP_IGNORE(pbUtil->CommandL( EPbCmdCloseItem, mediaId)); + } + + TUid oldCollection = entry->ValueTObjectL(TMPXAttribute(KMPXMediaIdGeneral, + EMPXMediaGeneralCollectionId)); + + DoRemoveL( entry, oldCollection ); + + entry->SetTObjectValueL(TMPXAttribute(KMPXMediaIdGeneral, + EMPXMediaGeneralCollectionId), + aNewCollection); + + UpdateMediaForMoveL( *entry, oldCollection, aNewCollection ); + DoAddL( entry, aNewCollection ); + } + } + else + { + TUid oldCollection = aMedia.ValueTObjectL(TMPXAttribute(KMPXMediaIdGeneral, + EMPXMediaGeneralCollectionId)); + + aMedia.SetTObjectValueL(TMPXAttribute(KMPXMediaIdGeneral, + EMPXMediaGeneralCollectionId), + aNewCollection); + + if(aMedia.IsSupported(KMPXMediaGeneralId)) + { + TMPXItemId mediaId(aMedia.ValueTObjectL(KMPXMediaGeneralId)); + TRAP_IGNORE(pbUtil->CommandL( EPbCmdCloseItem, mediaId)); + } + + DoRemoveL( &aMedia, oldCollection ); + + UpdateMediaForMoveL( aMedia, oldCollection, aNewCollection ); + DoAddL( &aMedia, aNewCollection ); + } + + CleanupStack::PopAndDestroy(pbUtil); + } + +// --------------------------------------------------------------------------- +// Fetch an item then move it async +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXMoveItemHelper::FetchAndMoveItemL( const CMPXMedia& aMedia, + TUid aNewCollection ) + { + ASSERT( iMoveState == EIdle ); + ASSERT( iObs ); + // Fetch item from collection asynchronously + // + // Look for the item, and fetch all relavant info + // + RArray atts; + CleanupClosePushL( atts ); + atts.Append(KMPXMediaGeneralAll); + atts.Append(KMPXMediaAudioAudioAll); + atts.Append(KMPXMediaMusicAll); + + iCollection->Collection().FindAllL( aMedia, atts.Array(), *this ); + CleanupStack::PopAndDestroy( &atts ); + iMoveState = EFind; + iMoveTarget = aNewCollection; + } + +// --------------------------------------------------------------------------- +// Fetch an item then move it sync +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXMoveItemHelper::FetchAndMoveItemSyncL( const CMPXMedia& aMedia, + TUid aNewCollection ) + { + // Look for the item, and fetch all relavant info + // + RArray atts; + CleanupClosePushL( atts ); + atts.Append(KMPXMediaGeneralAll); + atts.Append(KMPXMediaAudioAudioAll); + atts.Append(KMPXMediaMusicAll); + + CMPXMedia* result = iCollection->Collection().FindAllL( aMedia, + atts.Array() ); + CleanupStack::PopAndDestroy( &atts ); + CleanupStack::PushL( result ); + + // Move the item as normal + MoveItemL( *result, aNewCollection ); + CleanupStack::PopAndDestroy( result ); + } + +// --------------------------------------------------------------------------- +// Updates a media object for collection specific detail +// --------------------------------------------------------------------------- +// +void CMPXMoveItemHelper::UpdateMediaForMoveL( CMPXMedia& aMedia, + TUid& aOldCollection, + TUid& aNewCollection ) + { + // If we are moving from podcast collection -> local audio + // + if( aNewCollection == iMusicCollectionID && + aOldCollection == iPodCastCollectionID ) + { + aMedia.SetTObjectValueL(TMPXAttribute(KMPXMediaIdGeneral, + EMPXMediaGeneralCategory), + EMPXSong); + } + // Move from local collection -> podcast + // + else if( aOldCollection == iMusicCollectionID && + aNewCollection == iPodCastCollectionID ) + { + aMedia.SetTObjectValueL(TMPXAttribute(KMPXMediaIdGeneral, + EMPXMediaGeneralCategory), + EMPXPodcast); + } + } //lint !e961 + +// --------------------------------------------------------------------------- +// Add an item to the collection +// --------------------------------------------------------------------------- +// +void CMPXMoveItemHelper::DoAddL( CMPXMedia* aMedia, TUid aCollectionId ) + { + CMPXCommand* cmd = CMPXCommand::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXCommandIdCollectionAdd ); + cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue ); + cmd->SetTObjectValueL( KMPXCommandGeneralCollectionId, aCollectionId.iUid ); + cmd->SetCObjectValueL( KMPXCommandColAddMedia, aMedia ); + + iCollection->Collection().CommandL( *cmd ); + CleanupStack::PopAndDestroy( cmd ); + } + +// --------------------------------------------------------------------------- +// Set an item to the collection +// --------------------------------------------------------------------------- +// +void CMPXMoveItemHelper::DoRemoveL( CMPXMedia* aMedia, TUid aCollectionId ) + { + CMPXCommand* cmd = CMPXCommand::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXCommandIdCollectionRemoveMedia ); + cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue ); + cmd->SetTObjectValueL( KMPXCommandCollectionRemoveMediaDeleteRecord, ETrue ); + cmd->SetTObjectValueL( KMPXCommandGeneralCollectionId, aCollectionId.iUid ); + cmd->SetCObjectValueL( KMPXCommandCollectionRemoveMedia, aMedia ); + + iCollection->Collection().CommandL( *cmd ); + CleanupStack::PopAndDestroy( cmd ); + } + +// --------------------------------------------------------------------------- +// Handle find all callback +// --------------------------------------------------------------------------- +// +void CMPXMoveItemHelper::HandleFindAllL( const CMPXMedia& aResults, + TBool /*aComplete*/,TInt aError) + { + // Make sure the mode is correct + ASSERT( iMoveState == EFind ); + + TInt err ( aError ); + if( err == KErrNone ) + { + TRAP( err, DoHandleFindAllL( aResults ) ); + } + + // Find all is the most time consuming part. + // + iObs->HandleMoveCompleteL( err ); + iMoveState = EIdle; + } + +// --------------------------------------------------------------------------- +// Handle find all callback +// --------------------------------------------------------------------------- +// +void CMPXMoveItemHelper::DoHandleFindAllL( const CMPXMedia& aResult ) + { + // Need to make a tmp copy because we have to modify collection id + // + CMPXMedia* tmp = CMPXMedia::NewL(); + CleanupStack::PushL( tmp ); + *tmp = aResult; + MoveItemL( *tmp, iMoveTarget ); + CleanupStack::PopAndDestroy( tmp ); + } + +// End of file