diff -r 000000000000 -r a2952bb97e68 mmappcomponents/harvester/collectionmediator/src/mpxcollectionmediator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/harvester/collectionmediator/src/mpxcollectionmediator.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,602 @@ +/* +* 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: mediator class to handle music specific collection requirements +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // to get podcasting cenrep key + +#include +#include +#include "mpxcollectionmediator.h" +#include "mpxmediatorobserver.h" +#include "mpxmoveitemhelper.h" + +// CONSTANTS +_LIT( KPodCastPath, "\\podcasts\\"); + +_LIT( KMediatorResource, "mpxmediator.rsc" ); + +const TUid KCRUIDHarvesterFeatures = { 0x101FFCD2 }; +const TInt KDisablePodcasting = 5; + +// --------------------------------------------------------------------------- +// Default Constructor +// --------------------------------------------------------------------------- +// +CMPXCollectionMediator::CMPXCollectionMediator( MMPXCollection& aColUtil, + MMPXMediatorObserver* aObs ) : + iObserver( aObs ) + { + iColUtil = &aColUtil; + } + +// --------------------------------------------------------------------------- +// Default Constructor +// --------------------------------------------------------------------------- +// +CMPXCollectionMediator::CMPXCollectionMediator() + { + + } + +// --------------------------------------------------------------------------- +// 2nd Phase Constructor +// --------------------------------------------------------------------------- +// +void CMPXCollectionMediator::ConstructL() + { + User::LeaveIfError( iFs.Connect() ); + + TParse parse; + TFileName resFile; + parse.Set( KMediatorResource, &KDC_APP_RESOURCE_DIR, NULL ); + resFile.Copy(parse.FullName()); + User::LeaveIfError( MPXUser::CompleteWithDllPath( resFile ) ); + + BaflUtils::NearestLanguageFile(iFs, resFile); + RResourceFile resourceFile; + resourceFile.OpenL(iFs, resFile); + resourceFile.ConfirmSignatureL(0); // magic + + TResourceReader resReader; + + // Get the first podcast buf + HBufC8* buf = resourceFile.AllocReadLC( R_GENRE_PODCAST ); + resReader.SetBuffer( buf ); + iPodCastBuf = resReader.ReadHBufCL(); + CleanupStack::PopAndDestroy( buf ); + buf = NULL; + + // Get the second podcast buf + buf = resourceFile.AllocReadLC( R_GENRE_PODCAST_ENGLISH ); + resReader.SetBuffer( buf ); + iPodCastEngBuf = resReader.ReadHBufCL(); + CleanupStack::PopAndDestroy( buf ); + + // Get the unknwon podcast buf + buf = resourceFile.AllocReadLC( R_GENRE_UNKNOWN ); + resReader.SetBuffer( buf ); + iUnknownBuf = resReader.ReadHBufCL(); + CleanupStack::PopAndDestroy( buf ); + + // Fetch the real implementation ID for collection plugins + RArray ary; + CleanupClosePushL( ary ); + + MMPXCollectionUtility* temp = MMPXCollectionUtility::NewL(); + CleanupClosePushL( *temp ); + ary.AppendL( TUid::Uid(EMPXCollectionPluginPodCast) ); + iPodCastCollectionID = temp->CollectionIDL( ary.Array() ); + + ary.Reset(); + ary.AppendL( TUid::Uid(EMPXCollectionPluginMusic) ); + iMusicCollectionID = temp->CollectionIDL( ary.Array() ); + CleanupStack::PopAndDestroy( temp ); + + CleanupStack::PopAndDestroy( &ary ); + + resourceFile.Close(); + } + + +// --------------------------------------------------------------------------- +// Two-Phased Constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CMPXCollectionMediator* CMPXCollectionMediator::NewL( + MMPXCollection& aColUtil, + MMPXMediatorObserver* aObs ) + { + CMPXCollectionMediator* self = CMPXCollectionMediator::NewLC( aColUtil, + aObs ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Two-Phased Constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CMPXCollectionMediator* CMPXCollectionMediator::NewL() + { + CMPXCollectionMediator* self = new( ELeave ) CMPXCollectionMediator(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Two-Phased Constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CMPXCollectionMediator* CMPXCollectionMediator::NewLC( + MMPXCollection& aColUtil, + MMPXMediatorObserver* aObs ) + { + CMPXCollectionMediator* self = new( ELeave ) CMPXCollectionMediator + ( aColUtil, + aObs ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMPXCollectionMediator::~CMPXCollectionMediator() + { + iFs.Close(); + + delete iPodCastBuf; + delete iPodCastEngBuf; + delete iUnknownBuf; + delete iMoveHelper; + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::AddItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::AddItemL( CMPXMedia*& aMedia ) + { + ASSERT( iColUtil ); + + // If this is a podcast, change the collection id + if( IsPodcastL( *aMedia ) ) + { + UpdatePathToPodcastL( *aMedia ); + } + + // Add it to the collection + CMPXCommand* cmd = CMPXMedia::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL(KMPXCommandGeneralId, KMPXCommandIdCollectionAdd ); + cmd->SetTObjectValueL(KMPXCommandGeneralDoSync, ETrue ); + cmd->SetCObjectValueL(KMPXCommandColAddMedia, aMedia); // copied + + if (aMedia->IsSupported(KMPXMediaGeneralCollectionId)) + { + TUid collectionId = aMedia->ValueTObjectL(KMPXMediaGeneralCollectionId); + cmd->SetTObjectValueL(KMPXCommandGeneralCollectionId, collectionId.iUid); + } + else + { + User::Leave( KErrArgument ); + } + + iColUtil->CommandL(*cmd); + + TMPXItemId mediaId = cmd->ValueTObjectL(KMPXCommandColAddRtnId); + CleanupStack::PopAndDestroy(cmd); + + // put mediaId in aMedia + aMedia->SetTObjectValueL(KMPXMediaGeneralId, mediaId); + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::AddItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::AddItemL( CMPXMediaArray& aMPArray ) + { + ASSERT( iColUtil ); + + // Check each media property and update as needed + // + CMPXMediaArray* musicArray = CMPXMediaArray::NewL(); + CleanupStack::PushL( musicArray ); + CMPXMediaArray* podcastArray = CMPXMediaArray::NewL(); + CleanupStack::PushL( podcastArray ); + + TInt count( aMPArray.Count() ); + for( TInt i=0; iIsSupported(KMPXMediaGeneralCollectionId) ) + { + User::Leave( KErrArgument ); + } + + const TUid& oldCol = curMP->ValueTObjectL( KMPXMediaGeneralCollectionId ); + + UpdatePathToPodcastL( *curMP ); + if( iObserver ) + { + TRAP_IGNORE(iObserver->HandleMediatorPathUpdatedL( curMP, oldCol ) ); + } + + // Add this to podcast collection + curMP->SetTObjectValueL( KMPXMediaGeneralCollectionId, + iPodCastCollectionID ); + // Make a copy reference + podcastArray->AppendL(*curMP); + } + else + { + // Make a copy reference + musicArray->AppendL(*curMP); + } + } + // Package it as a CMPXMediaContainer class, then send to collection + // + if( musicArray->Count() ) + { + RArray contId; + CleanupClosePushL( contId ); + contId.AppendL( KMPXMediaIdGeneral ); + contId.AppendL( KMPXMediaIdContainer ); + + CMPXMedia* container = CMPXMedia::NewL( contId.Array() ); + CleanupStack::PushL( container ); + container->SetTObjectValueL( KMPXMediaGeneralType, + EMPXGroup ); + container->SetTObjectValueL( KMPXMediaGeneralCategory, + EMPXCollection ); + + container->SetCObjectValueL( KMPXMediaArrayContents, + musicArray ); + container->SetTObjectValueL(KMPXMediaArrayCount, musicArray->Count() ); + + // Add remainder to music collection + DoAddToCollectionL( container, iMusicCollectionID ); + CleanupStack::PopAndDestroy( container ); + CleanupStack::PopAndDestroy( &contId ); + contId.Close(); + } + if( podcastArray->Count() ) + { + RArray contId; + CleanupClosePushL( contId ); + contId.AppendL( KMPXMediaIdGeneral ); + contId.AppendL( KMPXMediaIdContainer ); + + CMPXMedia* container = CMPXMedia::NewL( contId.Array() ); + CleanupStack::PushL( container ); + container->SetTObjectValueL( KMPXMediaGeneralType, + EMPXGroup ); + container->SetTObjectValueL( KMPXMediaGeneralCategory, + EMPXCollection ); + + container->SetCObjectValueL( KMPXMediaArrayContents, + podcastArray ); + container->SetTObjectValueL(KMPXMediaArrayCount, podcastArray->Count() ); + + // Add remainder to podcast collection + DoAddToCollectionL( container, iPodCastCollectionID ); + CleanupStack::PopAndDestroy( container ); + CleanupStack::PopAndDestroy( &contId ); + contId.Close(); + } + CleanupStack::PopAndDestroy( podcastArray ); + CleanupStack::PopAndDestroy( musicArray ); + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::SetItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::SetItemL( CMPXMediaArray& aMPArray ) + { + ASSERT( iColUtil ); + + // Set each item + // + TInt count( aMPArray.Count() ); + for( TInt i=0; iValueTObjectL( KMPXMediaGeneralCollectionId ); + + // No need to move it is already in podcast + if( oldCol != iPodCastCollectionID ) + { + TRAPD( err, DoMoveItemL( aMedia, iPodCastCollectionID ) ); + + if( err == KErrNone ) + { + if( iObserver ) + { + iObserver->HandleMediatorPathUpdatedL( aMedia, oldCol ); + } + } + else + { + DoSetToCollectionL( aMedia, iPodCastCollectionID ); + } + } + else + { + DoSetToCollectionL( aMedia, iPodCastCollectionID ); + } + } + else + { + // Update as usual + // + DoSetToCollectionL( aMedia, + aMedia->ValueTObjectL(KMPXMediaGeneralCollectionId) ); + } + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::SetItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::SetItemL( + TArray& /*aArray*/, + CMPXCollectionPath& /*aPath*/, + RArray& /*aIndices*/ ) + { + // Not necessary for Increment 8 timeframe + ASSERT( iColUtil ); + ASSERT( 0 ); + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::CheckItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::CheckItemL( CMPXMedia& aMedia ) + { + MPX_DEBUG1( "CMPXCollectionMediator::CheckItemL <---" ); + if( IsPodcastL( aMedia ) ) + { + MPX_DEBUG1( "CMPXCollectionMediator::CheckItemL - changing collection id" ); + UpdatePathToPodcastL( aMedia ); + } + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::MoveItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::MoveItemL( + CMPXMedia*& aMedia, + TUid aOldCollection, + TUid aNewCollection ) + { + ASSERT( iColUtil ); + + // If we are moving from podcast collection -> local audio, we strip the + // podcast genre + // + if( aNewCollection == iMusicCollectionID && + aOldCollection == iPodCastCollectionID ) + { + aMedia->SetTextValueL(KMPXMediaMusicGenre, + *iUnknownBuf ); + DoSetToCollectionL( aMedia, iPodCastCollectionID ); + } + + // Do the actual move operation + // + DoMoveItemL( aMedia, aNewCollection ); + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::MoveItemL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::MoveItemL( + CMPXMedia*& aMedia, + TUid aOldCollection, + TUid aNewCollection, + MMPXMoveItemObserver* aObs ) + { + ASSERT( iColUtil ); + + // If we are moving from podcast collection -> local audio, we strip the + // podcast genre + // + if( aNewCollection == iMusicCollectionID && + aOldCollection == iPodCastCollectionID ) + { + aMedia->SetTextValueL(KMPXMediaMusicGenre, + *iUnknownBuf ); + DoSetToCollectionL( aMedia, iPodCastCollectionID ); + } + + // Do the actual move operation + // + delete iMoveHelper; + iMoveHelper = NULL; + iMoveHelper = CMPXMoveItemHelper::NewL(aObs); + iMoveHelper->FetchAndMoveItemL( *aMedia, aNewCollection ); + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::IsPodcast() +// --------------------------------------------------------------------------- +// +TBool CMPXCollectionMediator::IsPodcastL( CMPXMedia& aMedia ) + { + MPX_DEBUG1( "CMPXCollectionMediator::IsPodcast <---" ); + + ASSERT(aMedia.IsSupported(KMPXMediaGeneralCategory)); + + TBool isPodCast( EFalse ); + + // Get podcasting key + TBool disablePodcast( EFalse ); + CRepository* repository = CRepository::NewL( KCRUIDHarvesterFeatures ); + repository->Get( KDisablePodcasting, disablePodcast ); + delete repository; + + if ( !disablePodcast ) + { + const TDesC& genre = aMedia.ValueText(KMPXMediaMusicGenre); + const TDesC& path = aMedia.ValueText(KMPXMediaGeneralUri); + if ( aMedia.ValueTObjectL( KMPXMediaGeneralCategory ) != EMPXPlaylist ) + { + if( genre.Length() ) + { + // Make everything lower case for easy comparison + // + HBufC* buf = genre.AllocL(); + TPtr ptr = buf->Des(); + ptr.LowerCase(); + + if( !ptr.CompareF( *iPodCastBuf ) || + !ptr.CompareF( *iPodCastEngBuf ) ) + { + isPodCast = ETrue; + } + delete buf; + } + if( path.Length() ) // also check podcast + { + HBufC* buf = path.AllocL(); + TPtr ptr = buf->Des(); + ptr.LowerCase(); + + if( KErrNotFound != buf->Find( KPodCastPath ) ) + { + isPodCast = ETrue; + } + delete buf; + } + } + } + MPX_DEBUG2( "CMPXCollectionMediator::IsPodcast %i --->", isPodCast ); + + return isPodCast; + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::UpdatePathToPodcastL() +// --------------------------------------------------------------------------- +// +void CMPXCollectionMediator::UpdatePathToPodcastL( CMPXMedia& aMedia ) + { + aMedia.SetTObjectValueL(KMPXMediaGeneralCollectionId, + iPodCastCollectionID ); + } + +// --------------------------------------------------------------------------- +// CMPXCollectionMediator::DoMoveItemL() +// --------------------------------------------------------------------------- +// +void CMPXCollectionMediator::DoMoveItemL( CMPXMedia*& aMedia, + TUid aNewCollection ) + { + CMPXMoveItemHelper* mHelper = CMPXMoveItemHelper::NewL(NULL); + CleanupStack::PushL( mHelper ); + mHelper->FetchAndMoveItemSyncL( *aMedia, aNewCollection ); + CleanupStack::PopAndDestroy( mHelper ); + } + +// --------------------------------------------------------------------------- +// Add an item to the collection +// --------------------------------------------------------------------------- +// +void CMPXCollectionMediator::DoAddToCollectionL( 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 ); + + iColUtil->CommandL( *cmd ); + CleanupStack::PopAndDestroy( cmd ); + } + +// --------------------------------------------------------------------------- +// Set an item to the collection +// --------------------------------------------------------------------------- +// +void CMPXCollectionMediator::DoSetToCollectionL( CMPXMedia* aMedia, + TUid aCollectionId ) + { + CMPXCommand* cmd = CMPXCommand::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXCommandIdCollectionSet ); + cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue ); + cmd->SetTObjectValueL( KMPXCommandGeneralCollectionId, aCollectionId.iUid ); + cmd->SetCObjectValueL( KMPXCommandColSetMedia, aMedia ); + + iColUtil->CommandL( *cmd ); + CleanupStack::PopAndDestroy( cmd ); + } + +// END OF FILE +