diff -r 2a40e88564c8 -r 4e84c994a771 mpviewplugins/mpcollectionviewplugin/src/mpmpxframeworkwrapper_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpcollectionviewplugin/src/mpmpxframeworkwrapper_p.cpp Fri Mar 19 09:28:13 2010 +0200 @@ -0,0 +1,917 @@ +/* +* Copyright (c) 2009 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: Wrapper for mpx framework utilities - private implementation. +* +*/ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mpmpxframeworkwrapper_p.h" +#include "mpmpxframeworkwrapper.h" +#include "mpmpxcollectiondata.h" +#include "mpcommondefs.h" +#include "mptrace.h" +#include "mpsettingsmanager.h" + +const TInt KIncrementalDelayNone = 0; +const TInt KIncrementalDelayHalfSecond = 1000000; +const TInt KIncrementalFetchBlockSize = 40; + +const TInt KMPXChunkSize = 100; // number of songs added in each chunk, IncAddL +_LIT( KPlaylistPath, "C:\\Data\\Playlists\\" ); // Todo + +/*! + \class MpMpxFrameworkWrapperPrivate + \brief Wrapper for mpx framework utilities - private implementation. + + This is a private implementation of the mpx framework wrapper utilties interface. +*/ + +/*! + \internal + */ +MpMpxFrameworkWrapperPrivate::MpMpxFrameworkWrapperPrivate( MpMpxFrameworkWrapper *wrapper ) + : q_ptr(wrapper), + iCollectionUtility(0), + iCollectionUiHelper(0), + iIncrementalOpenUtil(0), + iPlaybackUtility(0), + iHarvesterUtility(0), + iCollectionData(0), + iFirstIncrementalOpen(EFalse), + iUserPlaylists(0) +{ + TX_LOG +} + +/*! + \internal + */ +MpMpxFrameworkWrapperPrivate::~MpMpxFrameworkWrapperPrivate() +{ + TX_ENTRY + delete iCollectionData; + + if ( iCollectionUtility ) { + iCollectionUtility->Collection().CancelRequest(); + iCollectionUtility->Close(); + } + + if ( iCollectionUiHelper ) { + iCollectionUiHelper->Close(); + } + + if ( iPlaybackUtility ) { + iPlaybackUtility->Close(); + } + + if ( iHarvesterUtility ) { + iHarvesterUtility->Close(); + } + + delete iIncrementalOpenUtil; + delete iUserPlaylists; + + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::init( MpCommon::MpViewMode viewMode ) +{ + + iViewMode = viewMode; + TRAPD(err, DoInitL()); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::openCollection( TCollectionContext context ) +{ + TRAPD(err, DoOpenCollectionL(context)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::openCollectionItem( int index ) +{ + TRAPD(err, DoOpenCollectionItemL(index)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::reopenCollection() +{ + TRAPD(err, DoReopenCollectionL()); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::back() +{ + TRAPD(err, DoBackL()); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::findPlaylists( QStringList &playlists ) +{ + TRAPD(err, DoFindPlaylistsL(playlists)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::createPlaylist( QString playlistName, QList selection ) +{ + TRAPD(err, DoCreatePlaylistL(playlistName, selection)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::saveToPlaylist( int playlistIndex, QList selection ) +{ + TRAPD(err, DoSaveToPlaylistL(playlistIndex, selection)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::deleteSongs( QList selection ) +{ + TRAPD(err, DoDeleteSongsL(selection)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::renamePlaylist( QString newName, int index ) +{ + TRAPD(err, DoRenamePlaylistL(newName, index)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::renamePlaylist( QString newName ) +{ + TRAPD(err, DoRenamePlaylistL(newName)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::setShuffle( bool active ) +{ + TRAPD(err, DoSetShuffleL(active)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::scan() +{ + TRAPD(err, DoScanL()); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::cancelScan() +{ + TRAPD(err, DoCancelScanL()); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::previewItem( int index ) +{ + TRAPD(err, DoPreviewItemL(index)); + if ( err != KErrNone ) { + TX_LOG_ARGS("Error: " << err << "; should never get here."); + } +} + +/*! + \internal + */ +MpMpxCollectionData *MpMpxFrameworkWrapperPrivate::collectionData() +{ + return iCollectionData; +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::HandleOpenL( + const CMPXMedia& aEntries, + TInt aIndex, + TBool aComplete, + TInt aError ) +{ + Q_UNUSED(aIndex); + TX_UNUSED(aComplete); + TX_ENTRY_ARGS("aError=" << aError << "aComplete=" << aComplete); + if ( aError == KErrNone ) { + if ( iFirstIncrementalOpen ) { + iCollectionData->setMpxMedia(aEntries); + iFirstIncrementalOpen = EFalse; + } + } + else { + TX_LOG_ARGS("Error: " << aError << "; should never get here."); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::HandleOpenL( + const CMPXCollectionPlaylist& aPlaylist, + TInt aError ) +{ + TX_ENTRY_ARGS("aError=" << aError); + + if ( aError == KErrNone ) { + if ( !iPlaybackUtility ) { + iPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid(MpCommon::KMusicPlayerUid) ); + if ( iViewMode == MpCommon::DefaultView ) { + iPlaybackUtility->SetL( EPbPropertyRandomMode, MpSettingsManager::shuffle() ? ETrue : EFalse ); + iPlaybackUtility->SetL( EPbPropertyRepeatMode, MpSettingsManager::repeat() ? EPbRepeatAll : EPbRepeatOff); + } + } + iPlaybackUtility->InitL( aPlaylist, ETrue ); + emit q_ptr->collectionPlaylistOpened(); + } + else { + TX_LOG_ARGS("Error: " << aError << "; should never get here."); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::HandleCollectionMessage( + CMPXMessage* aMsg, + TInt aErr ) +{ + TX_ENTRY_ARGS("aErr=" << aErr); + if ( aErr == KErrNone && aMsg ) + { + TRAP_IGNORE( DoHandleCollectionMessageL( *aMsg ) ); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::HandleCollectionMediaL( + const CMPXMedia& aMedia, + TInt aError ) +{ + Q_UNUSED(aMedia); + Q_UNUSED(aError); +} + +/*! + \internal + Handles the completion of any collection helper event. + */ +void MpMpxFrameworkWrapperPrivate::HandleOperationCompleteL( + TCHelperOperation aOperation, + TInt aErr, + void* aArgument ) +{ + TX_ENTRY_ARGS("aErr=" << aErr); + switch( aOperation ) { + case EDeleteOp: + if ( KErrNone == aErr ) { + emit q_ptr->songsDeleted(true); + } + else { + emit q_ptr->songsDeleted(false); + } + break; + case EAddOp: + if ( KErrNone == aErr ) { + emit q_ptr->playlistSaved(true); + } + else { + emit q_ptr->playlistSaved(false); + } + break; + case ERenameOp: + if ( KErrNone == aErr ) { + emit q_ptr->playlistsRenamed(true); + } + else { + emit q_ptr->playlistsRenamed(false); + } + break; + default: + break; + } + + if ( aArgument ) { + delete ( CBase* )aArgument; + } +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoInitL() +{ + TX_ENTRY + iCollectionUtility = MMPXCollectionUtility::NewL( this, KMcModeDefault ); + iCollectionUiHelper = CMPXCollectionHelperFactory:: NewCollectionUiHelperL(); + iIncrementalOpenUtil = CMPXCollectionOpenUtility::NewL( this ); + + iHarvesterUtility = CMPXHarvesterFactory::NewL(); + iHarvesterUtility->CheckForSystemEventsL(); + + iCollectionData = new MpMpxCollectionData(); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoOpenCollectionL( + TCollectionContext aContext ) +{ + TX_ENTRY_ARGS("aContext=" << aContext); + + switch ( aContext ) { + case ECollectionContextAllSongs: + { + CMPXCollectionPath* cpath = iCollectionUiHelper->MusicAllSongsPathL(); + CleanupStack::PushL( cpath ); + iCollectionUtility->Collection().OpenL( *cpath ); + CleanupStack::PopAndDestroy( cpath ); + break; + } + case ECollectionContextArtistAlbums: + { + CMPXCollectionPath* cpath = iCollectionUiHelper->MusicMenuPathL(); + CleanupStack::PushL( cpath ); + cpath->AppendL( 3 ); + iCollectionUtility->Collection().OpenL( *cpath ); + CleanupStack::PopAndDestroy( cpath ); + break; + } + case ECollectionContextPlaylists: + { + CMPXCollectionPath* cpath = iCollectionUiHelper->MusicPlaylistPathL(); + CleanupStack::PushL( cpath ); + iCollectionUtility->Collection().OpenL( *cpath ); + CleanupStack::PopAndDestroy( cpath ); + break; + } + case ECollectionContextGenres: + { + CMPXCollectionPath* cpath = iCollectionUiHelper->MusicMenuPathL(); + CleanupStack::PushL( cpath ); + // Temp + cpath->AppendL( 5 ); + iCollectionUtility->Collection().OpenL( *cpath ); + CleanupStack::PopAndDestroy( cpath ); + break; + } + default: + TX_LOG_ARGS("Error: Unexpected context; should never get here."); + break; + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoOpenCollectionItemL( TInt aIndex ) + { + TX_ENTRY_ARGS("aIndex=" << aIndex); + iCollectionUtility->Collection().OpenL( aIndex ); + TX_EXIT + } + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoIncrementalOpenL() +{ + TX_ENTRY + // Cancel any reads + iIncrementalOpenUtil->Stop(); + + // Start the read + iFirstIncrementalOpen = ETrue; + RArray attrs; + CleanupClosePushL( attrs ); + TArray ary = attrs.Array(); + iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone ); + iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize, + KErrNotFound, CMPXCollectionOpenUtility::EFetchNormal ); + iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond ); + CleanupStack::PopAndDestroy( &attrs ); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoReopenCollectionL() +{ + TX_ENTRY + CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL(); + CleanupStack::PushL( cpath ); + cpath->Back(); + iCollectionUtility->Collection().OpenL(*cpath); + CleanupStack::PopAndDestroy( cpath ); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoBackL() +{ + TX_ENTRY + iCollectionUtility->Collection().BackL(); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoFindPlaylistsL( QStringList &playlists ) +{ + TX_ENTRY + delete iUserPlaylists; + iUserPlaylists = NULL; + + RArray attrs; + CleanupClosePushL( attrs ); + attrs.Append( KMPXMediaGeneralId ); + attrs.Append( KMPXMediaGeneralTitle ); + + CMPXMedia* criteria = CMPXMedia::NewL(); + CleanupStack::PushL( criteria ); + criteria->SetTObjectValueL( + KMPXMediaGeneralType, EMPXGroup ); + criteria->SetTObjectValueL( + KMPXMediaGeneralCategory, EMPXPlaylist ); + + // Look up collection UID and set to criteria + RArray ary; + CleanupClosePushL( ary ); + ary.AppendL( TUid::Uid(EMPXCollectionPluginMusic) ); + TUid musicCollection = iCollectionUtility->CollectionIDL( ary.Array() ); + CleanupStack::PopAndDestroy( &ary ); + + criteria->SetTObjectValueL( KMPXMediaGeneralCollectionId, musicCollection ); + + iUserPlaylists = iCollectionUtility->Collection().FindAllL( *criteria, attrs.Array() ); + CleanupStack::PopAndDestroy( criteria ); + CleanupStack::PopAndDestroy( &attrs ); + + if ( iUserPlaylists ) { + const CMPXMediaArray* mediaArray = + iUserPlaylists->Value( KMPXMediaArrayContents ); + User::LeaveIfNull(const_cast(mediaArray)); + TInt count = mediaArray->Count(); + for ( TInt i = 0; i < count; i++ ) { + CMPXMedia* media( mediaArray->AtL(i) ); + const TDesC& titleText = media->ValueText( KMPXMediaGeneralTitle ); + if ( titleText.Compare( KNullDesC ) != 0 ) { + playlists += QString::fromUtf16( titleText.Ptr(), titleText.Length() ); + } + } + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoCreatePlaylistL( QString playlistName, QList selection ) +{ + TX_ENTRY_ARGS("playlistName=" << playlistName); + CMPXMedia* tracks = CMPXMedia::NewL(); + CleanupStack::PushL( tracks ); + + TPtrC ptr(reinterpret_cast(playlistName.constData())); + tracks->SetTextValueL( KMPXMediaGeneralTitle, ptr ); + tracks->SetTextValueL( KMPXMediaGeneralUri, KPlaylistPath ); + PreparePlaylistMediaL(*tracks, selection); + + iCollectionUiHelper->IncAddL( *tracks, this, KMPXChunkSize ); + CleanupStack::PopAndDestroy( tracks ); +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoSaveToPlaylistL( int playlistIndex, QList selection ) +{ + TX_ENTRY_ARGS("playlistIndex=" << playlistIndex); + CMPXMedia* tracks = CMPXMedia::NewL(); + CleanupStack::PushL( tracks ); + + const CMPXMediaArray* mediaArray = + iUserPlaylists->Value( KMPXMediaArrayContents ); + User::LeaveIfNull( const_cast( mediaArray )); + CMPXMedia* media( mediaArray->AtL(playlistIndex) ); + TMPXItemId playlistId = media->ValueTObjectL( KMPXMediaGeneralId ); + + RArray ary; + CleanupClosePushL( ary ); + ary.AppendL( TUid::Uid(EMPXCollectionPluginMusic) ); + TUid musicCollection = iCollectionUtility->CollectionIDL( ary.Array() ); + CleanupStack::PopAndDestroy( &ary ); + + tracks->SetTObjectValueL( KMPXMediaGeneralId, playlistId ); + tracks->SetTObjectValueL( KMPXMediaGeneralCollectionId, musicCollection ); + PreparePlaylistMediaL(*tracks, selection); + + iCollectionUiHelper->IncAddL( *tracks, this, KMPXChunkSize ); + CleanupStack::PopAndDestroy( tracks ); +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoDeleteSongsL( QList selection ) +{ + int count = selection.count(); + TX_ENTRY_ARGS("selection count=" << count); + + CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() ); + CleanupStack::PushL( path ); + + for ( TInt i = 0; i < count; i++ ) { + path->SelectL( selection.at(i) ); + } + iCollectionUiHelper->DeleteL( *path, this ); + CleanupStack::PopAndDestroy( path ); +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoRenamePlaylistL( QString newName, int index) +{ + CMPXMediaArray *mediaArray; + const CMPXMedia& container = iCollectionData->containerMedia(); + mediaArray = const_cast(container.Value( KMPXMediaArrayContents ) ); + CMPXMedia* currentPlaylistMedia( mediaArray->AtL( index ) ); + TMPXItemId id( currentPlaylistMedia->ValueTObjectL( KMPXMediaGeneralId ) ); + DoRenamePlaylistL( id, newName ); +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoRenamePlaylistL( QString newName ) +{ + const CMPXMedia& container = iCollectionData->containerMedia(); + TMPXItemId id( container.ValueTObjectL( KMPXMediaGeneralId ) ); + DoRenamePlaylistL( id, newName ); +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoRenamePlaylistL( TMPXItemId id, QString newName ) + { + CMPXMedia* media = CMPXMedia::NewL(); + CleanupStack::PushL( media ); + media->SetTObjectValueL( + KMPXMediaGeneralType, EMPXItem ); + media->SetTObjectValueL( + KMPXMediaGeneralCategory, EMPXPlaylist ); + media->SetTObjectValueL( KMPXMediaGeneralId, id ); + TPtrC ptr(reinterpret_cast(newName.constData())); + media->SetTextValueL( KMPXMediaGeneralTitle, ptr ); + iCollectionUiHelper->RenameL( *media, this ); + CleanupStack::PopAndDestroy( media ); + } + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoSetShuffleL( bool active ) +{ + TX_ENTRY + + if ( iPlaybackUtility ) { + iPlaybackUtility->SetL( EPbPropertyRandomMode, active ); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoScanL() +{ + TX_ENTRY + iNumItemsAdded = 0; + iHarvesterUtility->ScanL(); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoCancelScanL() +{ + TX_ENTRY + // If harvester crashes, restart it. + TRAPD( err, iHarvesterUtility->CancelScanL() ); + if ( err != KErrNone ) { + iHarvesterUtility->Close(); + iHarvesterUtility = NULL; + iHarvesterUtility = CMPXHarvesterFactory::NewL(); + iHarvesterUtility->CheckForSystemEventsL(); + } + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoPreviewItemL( int index ) +{ + TX_ENTRY + if ( !iPlaybackUtility ) { + iPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid(MpCommon::KMusicPlayerUid) ); + } + + // Get the current path + CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL(); + CleanupStack::PushL( cpath ); + MPX_DEBUG_PATH(*cpath); + cpath->Back(); + + CMPXMediaArray *mediaArray; + const CMPXMedia& container = iCollectionData->containerMedia(); + mediaArray = const_cast(container.Value( KMPXMediaArrayContents ) ); + CMPXMedia* currentMedia( mediaArray->AtL( index ) ); + TMPXItemId id( currentMedia->ValueTObjectL( KMPXMediaGeneralId ) ); + + cpath->AppendL(id); // Top level items of songs + cpath->Set(0); // Select 1st song + + CMPXCollectionPlaylist* playList = CMPXCollectionPlaylist::NewL( *cpath ); + CleanupStack::PushL( playList ); + playList->SetToFirst(); + + iPlaybackUtility->InitL( *playList, ETrue ); + emit q_ptr->collectionPlaylistOpened(); + + CleanupStack::PopAndDestroy( playList ); + CleanupStack::PopAndDestroy( cpath ); + TX_EXIT +} + +/*! + \internal + */ +void MpMpxFrameworkWrapperPrivate::DoHandleCollectionMessageL( + const CMPXMessage& aMsg ) +{ + TX_ENTRY + TMPXMessageId id( aMsg.ValueTObjectL( KMPXMessageGeneralId ) ); + if ( KMPXMessageGeneral == id ) { + TInt event( aMsg.ValueTObjectL( KMPXMessageGeneralEvent ) ); + TInt type( aMsg.ValueTObjectL( KMPXMessageGeneralType ) ); + TInt data( aMsg.ValueTObjectL( KMPXMessageGeneralData ) ); + TX_LOG_ARGS("event=" << event << ", type=" << type << ", data=" << data); + + if ( event == TMPXCollectionMessage::EPathChanged && + type == EMcPathChangedByOpen && + data == EMcContainerOpened ) { + // Incremental Open when browsing to the next level + DoIncrementalOpenL(); + } + else if ( event == TMPXCollectionMessage::EPathChanged && + type == EMcPathChangedByOpen && + data == EMcItemOpened ) { + // Opened a song + // This will result in HandleOpenL with CMPXCollectionPlaylist + iCollectionUtility->Collection().OpenL(); + } + + if ( event == TMPXCollectionMessage::EBroadcastEvent ) { + switch (type) { + case EMcMsgRefreshStart: + emit q_ptr->scanStarted(); + break; + case EMcMsgRefreshEnd: + case EMcMsgDiskInserted: + emit q_ptr->scanEnded(); + break; + default: + break; + } + } + } + else if( KMPXMessageIdItemChanged == id ) { + if ( aMsg.IsSupported(KMPXMessageArrayContents) ) { + // Loop through messages for arrays + const CMPXMessageArray* messageArray = + aMsg.Value(KMPXMessageArrayContents); + User::LeaveIfNull(const_cast(messageArray)); + + for ( TInt i=0; iCount(); ++i ) { + HandleCollectionMessage( messageArray->AtL( i ), KErrNone ); + } + emit q_ptr->scanCountChanged(iNumItemsAdded); + } + else { + // Single item + TMPXChangeEventType changeType( aMsg.ValueTObjectL( KMPXMessageChangeEventType ) ); + TMPXGeneralCategory cat(aMsg.ValueTObjectL(KMPXMessageMediaGeneralCategory)); + if( changeType == EMPXItemInserted && + (cat == EMPXSong || cat == EMPXPlaylist || cat == EMPXPodcast) ) { + iNumItemsAdded++; + } + } + } + TX_EXIT +} + +void MpMpxFrameworkWrapperPrivate::PreparePlaylistMediaL( + CMPXMedia& aMedia, + QList selection ) +{ + int count = selection.count(); + TX_ENTRY_ARGS("selection count=" << count); + + const CMPXMedia& container = iCollectionData->containerMedia(); + const CMPXMediaArray* containerArray = container.Value( KMPXMediaArrayContents ); + User::LeaveIfNull( const_cast( containerArray )); + CMPXMediaArray* tracksArray( CMPXMediaArray::NewL() ); + CleanupStack::PushL( tracksArray ); + + CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() ); + CleanupStack::PushL( path ); + TMPXItemId collectionId( path->Id( 0 ) ); + CleanupStack::PopAndDestroy( path ); + + if ( iCollectionData->context() == ECollectionContextArtistAlbums ) { + for ( TInt i = 0; i < count; i++ ) { + CMPXMedia* results; + CMPXMedia* album( containerArray->AtL( selection[i] ) ); + // Fetch the songs for the selected album + TMPXItemId albumId = album->ValueTObjectL(KMPXMediaGeneralId); + CMPXMedia* findCriteria = CMPXMedia::NewL(); + CleanupStack::PushL( findCriteria ); + findCriteria->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); + findCriteria->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); + findCriteria->SetTObjectValueL( KMPXMediaGeneralId, albumId ); + RArray attrs; + CleanupClosePushL( attrs ); + attrs.Append( TMPXAttribute( KMPXMediaIdGeneral, + EMPXMediaGeneralTitle | + EMPXMediaGeneralId ) ); + attrs.Append( KMPXMediaMusicAlbumTrack ); + results = iCollectionUtility->Collection().FindAllL( *findCriteria, attrs.Array()); + CleanupStack::PopAndDestroy( &attrs ); + CleanupStack::PopAndDestroy( findCriteria ); + CleanupStack::PushL( results ); + + const CMPXMediaArray* resultsArray = results->Value( KMPXMediaArrayContents ); + User::LeaveIfNull( resultsArray ); + for (int j = 0 ; j < resultsArray->Count();j++) { + CMPXMedia* media( resultsArray->AtL(j) ); + CMPXMedia* entry = CMPXMedia::NewL(); + CleanupStack::PushL( entry ); + entry->SetTextValueL( KMPXMediaGeneralTitle, + media->ValueText( KMPXMediaGeneralTitle ) ); + entry->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem); + entry->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); + entry->SetTObjectValueL( KMPXMediaGeneralId, + media->ValueTObjectL( KMPXMediaGeneralId ) ); + entry->SetTObjectValueL( KMPXMediaGeneralCollectionId, collectionId ); + tracksArray->AppendL( entry ); + CleanupStack::Pop( entry ); + } + CleanupStack::PopAndDestroy( results ); + } + + } + else { + for ( TInt i = 0; i < count; i++ ) { + CMPXMedia* media( containerArray->AtL(selection.at(i)) ); + CMPXMedia* entry = CMPXMedia::NewL(); + CleanupStack::PushL( entry ); + entry->SetTextValueL( KMPXMediaGeneralTitle, + media->ValueText( KMPXMediaGeneralTitle ) ); + entry->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem); + entry->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); + entry->SetTObjectValueL( KMPXMediaGeneralId, + media->ValueTObjectL( KMPXMediaGeneralId ) ); + entry->SetTObjectValueL( KMPXMediaGeneralCollectionId, collectionId ); + tracksArray->AppendL( entry ); + CleanupStack::Pop( entry ); + } + } + aMedia.SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + aMedia.SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); + aMedia.SetCObjectValueL( KMPXMediaArrayContents, tracksArray ); + aMedia.SetTObjectValueL( KMPXMediaArrayCount, tracksArray->Count() ); + + CleanupStack::PopAndDestroy( tracksArray ); + TX_EXIT +}