diff -r a05c44bc3c61 -r d881023c13eb mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp --- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp Fri Apr 16 15:28:14 2010 +0300 +++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp Mon May 03 12:58:40 2010 +0300 @@ -24,9 +24,7 @@ #include #include #include -#include #include -#include #include // from MPX #include @@ -44,26 +42,36 @@ #include "mmmtpdplogger.h" #include "mmmtpdputility.h" #include "tmmmtpdppanic.h" +#include "tobjectdescription.h" static const TInt KMtpInvalidSongID = 0x1FFFFFFF; static const TInt KMtpChannelMono = 1; static const TInt KMtpChannelStereo = 2; -static const TInt KMtpDateTimeStringLength = 15; -static const TInt KMtpMaxStringLength = 255; -static const TInt KMtpMaxDescriptionLength = 0x200; -_LIT( KMtpDateTimeFormat, "%F%Y%M%DT%H%T%S" ); + _LIT( KMtpDateTimeConnector, "T" ); _LIT( KEmptyText, "" ); +#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) +_LIT( KMpxCollectionNewL, "MpxCollectionNewL" ); +_LIT( KMpxCollectionAddL, "MpxCollectionAddL" ); +_LIT( KMpxCollectionGetL, "MpxCollectionGetL" ); +_LIT( KMpxCollectionSetL, "MpxCollectionSetL" ); +_LIT( KMpxCollectionSetReferenceL, "MpxCollectionSetReferenceL" ); +_LIT( KMpxCollectionGetAbstractMedia, "MpxCollectionGetAbstractMedia" ); +_LIT( KMpxCollectionGetReference, "MpxCollectionGetReference" ); +_LIT( KMpxCollectionFindAllLValidate, "MpxCollectionValidate" ); +_LIT( KMpxCollectionFindAllLBeforeAdd, "MpxCollectionFindAllLBeforeAdd" ); +_LIT( KSetMetadataValue, "SetMetadataValueL" ); +#endif + #ifdef _DEBUG _LIT( KMtpMpxPanic, "CMmMtpDpMetadataMpxAccess" ); #endif -CMmMtpDpMetadataMpxAccess* CMmMtpDpMetadataMpxAccess::NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) +CMmMtpDpMetadataMpxAccess* CMmMtpDpMetadataMpxAccess::NewL( RFs& aRfs ) { - CMmMtpDpMetadataMpxAccess* self = new(ELeave) CMmMtpDpMetadataMpxAccess( aRfs, aFramework ); + CMmMtpDpMetadataMpxAccess* self = new( ELeave ) CMmMtpDpMetadataMpxAccess( aRfs ); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); @@ -71,12 +79,10 @@ return self; } -CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs, - MMTPDataProviderFramework& aFramework ): - iRfs( aRfs ), - iFramework( aFramework ) +CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs ): + iRfs( aRfs ) { - + // Do nothing } // --------------------------------------------------------------------------- @@ -118,25 +124,18 @@ // void CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL( const TUint16 aPropCode, MMTPType& aNewData, - const CMTPObjectMetaData& aObjectMetaData ) + const TDesC& aFullFileName, + TMPXGeneralCategory aCategory ) { PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL aPropCode = 0x%x" ), aPropCode ); - // File Path - HBufC* suid = aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ).AllocLC(); // + suid - TUint format = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ); - TMPXGeneralCategory category = ( format == EMTPFormatCodeAbstractAudioVideoPlaylist ) || - ( format == EMTPFormatCodeM3UPlaylist ) ? EMPXPlaylist : EMPXSong; - PERFLOGSTART( KMpxCollectionGetL ); - const CMPXMedia& media = CollectionHelperL()->GetL( *suid, category ); + const CMPXMedia& media = CollectionHelperL()->GetL( aFullFileName, aCategory ); PERFLOGSTOP( KMpxCollectionGetL ); - CleanupStack::PopAndDestroy( suid ); // - suid - - TMPXAttributeData attrib( MpxAttribFromPropL( media, aPropCode ) ); + TMPXAttributeData attrib( MpxAttribFromPropL( aPropCode ) ); TBool isSupported = media.IsSupported( attrib ); - PRINT1(_L( "MM MTP <> CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL isSupported = %d" ), isSupported); + PRINT1(_L( "MM MTP <> CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL isSupported = %d" ), isSupported ); if ( aPropCode != EMTPObjectPropCodeOriginalReleaseDate && aPropCode != EMTPObjectPropCodeDRMStatus @@ -193,7 +192,7 @@ case EMTPObjectPropCodeDateCreated: { TTime time( *media.Value ( attrib ) ); - TBuf timeStr; + TBuf timeStr; time.FormatL( timeStr, KMtpDateTimeFormat ); if ( EMTPTypeString == aNewData.Type() ) @@ -245,7 +244,7 @@ case EMTPObjectPropCodeOriginalReleaseDate: { // Compose DateTime string in format YYYYMMDDTHHMMSS - TBuf dateTime; + TBuf dateTime; dateTime.Zero(); // NOTE: Handled specially, shouldn't leave like other property, following S60 @@ -346,9 +345,9 @@ // as a General Error if ( iCollectionHelper == NULL ) { - PERFLOGSTART(KMpxCollectionNewL); + PERFLOGSTART( KMpxCollectionNewL ); iCollectionHelper = CMPXCollectionHelperFactory::NewCollectionCachedHelperL(); - PERFLOGSTOP(KMpxCollectionNewL); + PERFLOGSTOP( KMpxCollectionNewL ); // Do a search for a song ID that does not exist // This is to validate the presence of the media database. @@ -418,7 +417,6 @@ searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); searchMedia->SetTObjectValueL( aWMPMediaID, aFlag ); - searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); RArray songAttributes; @@ -427,8 +425,7 @@ PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::FindWMPMediaLC searchMedia setup with no problems" ) ); - CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( - *searchMedia, + CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia, songAttributes.Array() ); PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::FindWMPMediaLC foundMedia assigned from FindAllL" ) ); @@ -543,9 +540,9 @@ KMPXMediaGeneralModified, EFalse ); // Update the song's metadata with the media object - PERFLOGSTART(KMpxCollectionSetL); + PERFLOGSTART( KMpxCollectionSetL ); CollectionHelperL()->SetL( media ); - PERFLOGSTOP(KMpxCollectionSetL); + PERFLOGSTOP( KMpxCollectionSetL ); CleanupStack::PopAndDestroy( media ); // - media } @@ -593,27 +590,14 @@ // void CMmMtpDpMetadataMpxAccess::RenameObjectL( const TDesC& aOldFileName, const TDesC& aNewFileName, - TUint aFormatCode ) + TMPXGeneralCategory aCategory ) { PRINT2( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::RenameObjectL aOldFileName = %S, aNewFileName = %S" ), - &aOldFileName, &aNewFileName ); + &aOldFileName, + &aNewFileName ); TInt err = KErrNone; - - if ( ( aFormatCode == EMTPFormatCodeAbstractAudioVideoPlaylist ) - || ( aFormatCode == EMTPFormatCodeM3UPlaylist ) ) - { - PRINT( _L( "MM MTP <> Playlist" ) ); - TRAP( err, CollectionHelperL()->RenameL( - aOldFileName, - aNewFileName, - EMPXPlaylist ) ); - } - else // Not a playlist - { - PRINT( _L( "MM MTP <> Non-Playlist" ) ); - TRAP( err, CollectionHelperL()->RenameL( aOldFileName, aNewFileName, EMPXSong ) ); - } + TRAP( err, CollectionHelperL()->RenameL( aOldFileName, aNewFileName, aCategory ) ); if ( KErrNotFound == err ) { @@ -632,119 +616,43 @@ // ----------------------------------------------------------------------------- void CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL( const TUint16 aPropCode, const MMTPType& aNewData, - const TDesC& aSuid ) + const TDesC& aFullFileName, + TMPXGeneralCategory aCategory ) { - PRINT2( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL aPropCode = 0x%x aSuid = %S" ), - aPropCode, - &aSuid ); - CMPXMedia* media = NULL; + PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL aPropCode = 0x%x" ), aPropCode ); - // Creat media properties for the song RArray contentIDs; CleanupClosePushL( contentIDs ); // + contentIDs + contentIDs.AppendL( KMPXMediaIdGeneral ); - contentIDs.AppendL( KMPXMediaIdAudio ); - contentIDs.AppendL( KMPXMediaIdMusic ); - contentIDs.AppendL( KMPXMediaIdMTP ); - media = CMPXMedia::NewL( contentIDs.Array() ); - CleanupStack::PopAndDestroy( &contentIDs ); // - contentIDs + if ( aCategory == EMPXSong ) + { + contentIDs.AppendL( KMPXMediaIdAudio ); + contentIDs.AppendL( KMPXMediaIdMusic ); + contentIDs.AppendL( KMPXMediaIdMTP ); + } + + CMPXMedia* media = CMPXMedia::NewL( contentIDs.Array() ); CleanupStack::PushL( media ); // + media - media->SetTObjectValueL( - KMPXMediaGeneralCategory, - EMPXSong ); + media->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); // MPXMedia default types media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - // Get file path - TParsePtrC parse( aSuid ); - media->SetTextValueL( KMPXMediaGeneralUri, aSuid ); + TParsePtrC parse( aFullFileName ); + media->SetTextValueL( KMPXMediaGeneralUri, aFullFileName ); media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - TRAPD( err, SetMetadataValueL( aPropCode, aNewData, *media ) ); - - if ( err == KErrNone ) - { - SetStorageRootL( parse.Drive() ); - - // Update the song's metadata with the media object - PERFLOGSTART( KMpxCollectionSetL ); - CollectionHelperL()->SetL( media ); - PERFLOGSTOP( KMpxCollectionSetL ); - } - else - { - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL ERROR = %d" ), err ); - - User::Leave( err ); - } - - CleanupStack::PopAndDestroy( media ); // - media - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL" ) ); - } - -// ----------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL -// Updated object metadata in MPX database -// ----------------------------------------------------------------------------- -void CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL( const TUint16 aPropCode, - const MMTPType& aNewData, - const CMTPObjectMetaData& aObjectMetaData ) - { - PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL aPropCode = 0x%x" ), aPropCode ); - CMPXMedia* media = NULL; - - RArray contentIDs; - CleanupClosePushL( contentIDs ); // + contentIDs - - TUint format = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ); - if ( ( format == EMTPFormatCodeAbstractAudioVideoPlaylist ) - || ( format == EMTPFormatCodeM3UPlaylist ) ) - { - PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL format is playlist" ) ); - contentIDs.AppendL( KMPXMediaIdGeneral ); - - media = CMPXMedia::NewL( contentIDs.Array() ); - CleanupStack::PushL( media ); // + media - - media->SetTObjectValueL( - KMPXMediaGeneralCategory, - EMPXPlaylist ); - } - else - { - // Creat media properties for the song - contentIDs.AppendL( KMPXMediaIdGeneral ); - contentIDs.AppendL( KMPXMediaIdAudio ); - contentIDs.AppendL( KMPXMediaIdMusic ); - contentIDs.AppendL( KMPXMediaIdMTP ); - - media = CMPXMedia::NewL( contentIDs.Array() ); - CleanupStack::PushL( media ); // + media - - media->SetTObjectValueL( - KMPXMediaGeneralCategory, - EMPXSong ); - } - - // MPXMedia default types - media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - - // Get file path - HBufC* suid = aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ).AllocLC(); // + suid - TParsePtrC parse( *suid ); - media->SetTextValueL( KMPXMediaGeneralUri, *suid ); - media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - CleanupStack::PopAndDestroy( suid ); // - suid - + PERFLOGSTART( KSetMetadataValue ); SetMetadataValueL( aPropCode, aNewData, *media ); + PERFLOGSTOP( KSetMetadataValue ); // Update the song's metadata with the media object - PERFLOGSTART(KMpxCollectionSetL); + PERFLOGSTART( KMpxCollectionSetL ); CollectionHelperL()->SetL( media ); - PERFLOGSTOP(KMpxCollectionSetL); + PERFLOGSTOP( KMpxCollectionSetL ); CleanupStack::PopAndDestroy( 2, &contentIDs ); // - media, contentIDs @@ -765,7 +673,7 @@ TMTPTypeUint16 uint16Data; TMTPTypeUint32 uint32Data; - TMPXAttributeData attrib( MpxAttribFromPropL( aMediaProp, aPropCode ) ); + TMPXAttributeData attrib( MpxAttribFromPropL( aPropCode ) ); switch ( aPropCode ) { @@ -778,12 +686,11 @@ { PRINT1( _L( "MM MTP <> SetMetadataValueL Before Copy, string length = %d" ), aNewData.Size() ); MMTPType::CopyL( aNewData, *textData ); - PRINT1( _L( "MM MTP <> SetMetadataValueL string length = %d" ), textData->StringChars().Length() ); - aMediaProp.SetTextValueL( attrib, textData->StringChars() ); - HBufC* log = textData->StringChars().AllocL(); - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL string = %S" ), log ); - delete log; - log = NULL; + HBufC* string = textData->StringChars().AllocLC(); + PRINT1( _L( "MM MTP <> SetMetadataValueL string length = %d" ), string->Des().Length() ); + aMediaProp.SetTextValueL( attrib, string->Des() ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL string = %S" ), string ); + CleanupStack::PopAndDestroy(string); } break; @@ -830,10 +737,10 @@ MMTPType::CopyL( aNewData, *textData ); TBuf data; - data.Copy( textData->StringChars().Left( KMtpDateTimeStringLength ) ); + data.Copy( textData->StringChars().Left( KMtpMaxDateTimeStringLength ) ); PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL 0xDC99 date = %S" ), &data ); - if ( data.Length() < KMtpDateTimeStringLength ) + if ( data.Length() < KMtpMaxDateTimeStringLength ) { PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL 0xDC99 date string is too short" ) ); break; @@ -906,27 +813,25 @@ case EMTPObjectPropCodeDescription: { #ifdef __MUSIC_ID_SUPPORT - //WriteMusicIdsL(*longString); + // WriteMusicIdsL(*longString); #else desData = CMTPTypeArray::NewLC( EMTPTypeAUINT16 ); // + desData MMTPType::CopyL( aNewData, *desData ); TUint length = desData->NumElements(); PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL length = %d" ), length ); - if ( length != 0 ) - { - TBuf text; - text.Zero(); - for ( TUint i = 0; i < length; i++ ) - text.Append( desData->ElementUint( i ) ); - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL text = %S" ), - &text ); - aMediaProp.SetTextValueL( KMPXMediaGeneralComment, text ); - } - else - { - aMediaProp.SetTextValueL( KMPXMediaGeneralComment, KEmptyText ); - } + + length = ( length < KMTPMaxDescriptionLen ) ? length : KMTPMaxDescriptionLen; + HBufC* text = HBufC::NewLC( length ); // + text + TPtr ptr = text->Des(); + + for ( TUint i = 0; i < length; i++ ) + ptr.Append( desData->ElementUint( i ) ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL text = %S" ), + text ); + aMediaProp.SetTextValueL( KMPXMediaGeneralComment, text->Des() ); + CleanupStack::PopAndDestroy( text ); // - text + CleanupStack::PopAndDestroy( desData ); // - desData #endif //__MUSIC_ID_SUPPORT } @@ -940,6 +845,27 @@ } break; + case EMTPObjectPropCodeRepresentativeSampleData: + { + const CMTPTypeArray& mtpTypeArray = static_cast( aNewData ); + TUint32 numElements = mtpTypeArray.NumElements(); + const TDesC& suid = aMediaProp.ValueText( KMPXMediaGeneralUri ); + PRINT2( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL SampleData numElements = %d, suid = %S" ), numElements, &suid ); + + HBufC8* sampleData = HBufC8::NewLC( numElements * sizeof( TUint8 ) ); + TPtr8 samplePtr = sampleData->Des(); + mtpTypeArray.ToDes( samplePtr ); + RFile sampleFile; + CleanupClosePushL( sampleFile ); + User::LeaveIfError( sampleFile.Replace( iRfs, suid, EFileWrite ) ); + User::LeaveIfError( sampleFile.Write( samplePtr ) ); + CleanupStack::PopAndDestroy( &sampleFile ); + CleanupStack::PopAndDestroy( sampleData ); + aMediaProp.SetTObjectValueL( attrib, ETrue ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL SampleData is ready = %u" ), 1 ); + } + break; + default: { User::Leave( KErrNotSupported ); @@ -970,10 +896,9 @@ CleanupStack::PushL( searchMedia ); // + searchMedia searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); - searchMedia->SetTextValueL( KMPXMediaGeneralUri, aFullFileName ); + searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); RArray songAttributes; CleanupClosePushL( songAttributes ); // + songAttributes @@ -981,11 +906,10 @@ PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::AddSongL searchMedia setup with no problems" ) ); - PERFLOGSTART(KMpxCollectionFindAllLBeforeAdd); - CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( - *searchMedia, + PERFLOGSTART( KMpxCollectionFindAllLBeforeAdd ); + CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia, songAttributes.Array() ); - PERFLOGSTOP(KMpxCollectionFindAllLBeforeAdd); + PERFLOGSTOP( KMpxCollectionFindAllLBeforeAdd ); CleanupStack::PopAndDestroy( &songAttributes ); // - songAttributes CleanupStack::PopAndDestroy( searchMedia ); // - searchMedia @@ -1022,11 +946,9 @@ CleanupStack::PushL( media ); // + media // MPXMedia default types - media->SetTObjectValueL( - KMPXMediaGeneralType, + media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - media->SetTObjectValueL( - KMPXMediaGeneralCategory, + media->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); // File Path // @@ -1050,17 +972,17 @@ if ( foundItemCount == 0 ) { - PERFLOGSTART(KMpxCollectionAddL); + PERFLOGSTART( KMpxCollectionAddL ); CollectionHelperL()->AddL( media ); - PERFLOGSTOP(KMpxCollectionAddL); + PERFLOGSTOP( KMpxCollectionAddL ); PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::AddSongL Media added into collection" ) ); } else { - PERFLOGSTART(KMpxCollectionSetL); + PERFLOGSTART( KMpxCollectionSetL ); CollectionHelperL()->SetL( media ); - PERFLOGSTOP(KMpxCollectionSetL); + PERFLOGSTOP( KMpxCollectionSetL ); PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::AddSongL Media metadata updated in collection" ) ); } @@ -1074,15 +996,15 @@ } // ----------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::AddPlaylistL -// Adds Playlist to Mpx DB +// CMmMtpDpMetadataMpxAccess::AddAbstractMediaL +// Adds abstract media to Mpx DB // ----------------------------------------------------------------------------- // -void CMmMtpDpMetadataMpxAccess::AddPlaylistL( const TDesC& aFullFileName ) +void CMmMtpDpMetadataMpxAccess::AddAbstractMediaL( const TDesC& aFullFileName, TMPXGeneralCategory aCategory ) { - PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::AddPlaylistL aFullFileName = %S" ), &aFullFileName ); + PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::AddAbstractMediaL aFullFileName = %S" ), &aFullFileName ); - // Does a record already exist for this playlist? + // Does a record already exist for this AbstractMedia? RArray contentIDs; CleanupClosePushL( contentIDs ); // + contentIDs contentIDs.AppendL( KMPXMediaIdGeneral ); @@ -1092,21 +1014,24 @@ CleanupStack::PushL( searchMedia ); // + searchMedia searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); + searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); searchMedia->SetTextValueL( KMPXMediaGeneralUri, aFullFileName ); - RArray playlistAttributes; - CleanupClosePushL( playlistAttributes ); // + playlistAttributes - playlistAttributes.AppendL( KMPXMediaGeneralId ); - playlistAttributes.AppendL( KMPXMediaGeneralTitle ); - playlistAttributes.AppendL( KMPXMediaGeneralUri ); + RArray abstractMediaAttributes; + CleanupClosePushL( abstractMediaAttributes ); // + abstractMediaAttributes + abstractMediaAttributes.AppendL( KMPXMediaGeneralId ); + abstractMediaAttributes.AppendL( KMPXMediaGeneralTitle ); + if ( aCategory == EMPXPlaylist ) + { + abstractMediaAttributes.AppendL( KMPXMediaGeneralUri ); + } - PERFLOGSTART(KMpxCollectionFindAllLBeforeAdd); + PERFLOGSTART( KMpxCollectionFindAllLBeforeAdd ); CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia, - playlistAttributes.Array() ); - PERFLOGSTOP(KMpxCollectionFindAllLBeforeAdd); + abstractMediaAttributes.Array() ); + PERFLOGSTOP( KMpxCollectionFindAllLBeforeAdd ); - CleanupStack::PopAndDestroy( &playlistAttributes ); // - playlistAttributes + CleanupStack::PopAndDestroy( &abstractMediaAttributes ); // - abstractMediaAttributes CleanupStack::PopAndDestroy( searchMedia ); // - searchMedia CleanupStack::PushL( foundMedia ); // + foundMedia @@ -1117,12 +1042,12 @@ if ( foundItemCount != 0 ) { - PRINT( _L( "MM MTP <> Playlist Media already exists in the collection" ) ); + PRINT( _L( "MM MTP <> Abstract Media already exists in the collection" ) ); } else { - // Creat media properties for the playlist - PRINT( _L( "MM MTP <> Create playlist media properties" ) ); + // Creat media properties for the abstractMedia + PRINT( _L( "MM MTP <> Create abstract media properties" ) ); RArray contentIDs; CleanupClosePushL( contentIDs ); // + contentIDs contentIDs.AppendL( KMPXMediaIdGeneral ); @@ -1131,14 +1056,14 @@ CleanupStack::PopAndDestroy( &contentIDs ); // - contentIDs CleanupStack::PushL( media ); // + media - CMPXMediaArray* playlistArray = CMPXMediaArray::NewL(); - CleanupStack::PushL( playlistArray ); // + playlistArray; + CMPXMediaArray* abstractMediaArray = CMPXMediaArray::NewL(); + CleanupStack::PushL( abstractMediaArray ); // + abstractMediaArray; // MPXMedia default types media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); media->SetTObjectValueL( KMPXMediaGeneralCategory, - EMPXPlaylist ); + aCategory ); // File Path // media->SetTextValueL( KMPXMediaGeneralUri, aFullFileName ); @@ -1146,47 +1071,49 @@ TParsePtrC parse( aFullFileName ); media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - media->SetTextValueL( KMPXMediaGeneralTitle, parse.Name() ); + if ( ( aCategory == EMPXPlaylist ) || ( aCategory == EMPXAbstractAlbum ) ) + { + media->SetTextValueL( KMPXMediaGeneralTitle, parse.Name() ); + } media->SetTObjectValueL( KMPXMediaGeneralSynchronized, ETrue ); - media->SetCObjectValueL( KMPXMediaArrayContents, playlistArray ); - media->SetTObjectValueL( KMPXMediaArrayCount, playlistArray->Count() ); + media->SetCObjectValueL( KMPXMediaArrayContents, abstractMediaArray ); + media->SetTObjectValueL( KMPXMediaArrayCount, abstractMediaArray->Count() ); + if ( aCategory == EMPXAbstractAlbum ) + { + media->SetTObjectValueL( KMPXMediaMTPSampleDataFlag, EFalse ); + } - PERFLOGSTART(KMpxCollectionAddL); + PERFLOGSTART( KMpxCollectionAddL ); CollectionHelperL()->AddL( media ); - PERFLOGSTOP(KMpxCollectionAddL); + PERFLOGSTOP( KMpxCollectionAddL ); // Clear the array - CleanupStack::PopAndDestroy( playlistArray ); // - playlistArray + CleanupStack::PopAndDestroy( abstractMediaArray ); // - abstractMediaArray CleanupStack::PopAndDestroy( media ); // - media } CleanupStack::PopAndDestroy( foundMedia ); // - foundMedia - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::AddPlaylistL" ) ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::AddAbstractMediaL" ) ); } // ----------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::SetPlaylistL -// Set playlist to DB +// CMmMtpDpMetadataMpxAccess::SetReferenceL +// Set abstract media to DB // ----------------------------------------------------------------------------- // -void CMmMtpDpMetadataMpxAccess::SetPlaylistL( const TDesC& aPlaylistFileName, - CDesCArray& aRefFileArray ) +void CMmMtpDpMetadataMpxAccess::SetReferenceL( const TDesC& aRefOwnerName, + CDesCArray& aRefFileArray, + TMPXGeneralCategory aCategory ) { - PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetPlaylistL" ) ); - CMPXMediaArray* playlistArray = CMPXMediaArray::NewL(); - CleanupStack::PushL( playlistArray ); // + playlistArray + PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetReferenceL" ) ); + CMPXMediaArray* abstractMediaArray = CMPXMediaArray::NewL(); + CleanupStack::PushL( abstractMediaArray ); // + abstractMediaArray TUint count = aRefFileArray.Count(); for ( TUint j = 0; j < count; j++ ) { - // if the file is video, skip it and continue - if ( MmMtpDpUtility::IsVideoL( aRefFileArray[j], iFramework ) ) - { - continue; - } - // Creat media properties for the song RArray contentIDs; CleanupClosePushL( contentIDs ); // + contentIDs @@ -1204,14 +1131,14 @@ EMPXItem ); media->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); - // File Path - // + + media->SetTextValueL( KMPXMediaGeneralUri, aRefFileArray[j] ); + // TODO: need to confirm that should set drive letter or storage root path. TParsePtrC parse( aRefFileArray[j] ); - media->SetTextValueL( KMPXMediaGeneralUri, aRefFileArray[j] ); media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); // Add media into array contents - playlistArray->AppendL( media ); + abstractMediaArray->AppendL( media ); CleanupStack::Pop( media ); // - media } @@ -1220,35 +1147,30 @@ CleanupClosePushL( contentIDs ); // + contentIDs contentIDs.AppendL( KMPXMediaIdGeneral ); - CMPXMedia* playlistMedia = CMPXMedia::NewL( contentIDs.Array() ); + CMPXMedia* abstractMedia = CMPXMedia::NewL( contentIDs.Array() ); CleanupStack::PopAndDestroy( &contentIDs ); // - contentIDs - CleanupStack::PushL( playlistMedia ); // + playlistMedia - - playlistMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + CleanupStack::PushL( abstractMedia ); // + abstractMedia - playlistMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); - - playlistMedia->SetTextValueL( KMPXMediaGeneralUri, aPlaylistFileName ); - - TParsePtrC parse( aPlaylistFileName ); - playlistMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - playlistMedia->SetTObjectValueL( KMPXMediaGeneralSynchronized, + abstractMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + abstractMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); + abstractMedia->SetTextValueL( KMPXMediaGeneralUri, aRefOwnerName ); + TParsePtrC parse( aRefOwnerName ); + abstractMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); + abstractMedia->SetTObjectValueL( KMPXMediaGeneralSynchronized, ETrue ); - playlistMedia->SetCObjectValueL( KMPXMediaArrayContents, playlistArray ); - playlistMedia->SetTObjectValueL( KMPXMediaArrayCount, - playlistArray->Count() ); + abstractMedia->SetCObjectValueL( KMPXMediaArrayContents, abstractMediaArray ); + abstractMedia->SetTObjectValueL( KMPXMediaArrayCount, + abstractMediaArray->Count() ); - // Update the duplicate playlist(s) with the new playlist array - PERFLOGSTART(KMpxCollectionSetL); - CollectionHelperL()->SetL( playlistMedia ); - PERFLOGSTOP(KMpxCollectionSetL); + // Update the duplicate abstractMedia(s) with the new abstractMedia array + PERFLOGSTART( KMpxCollectionSetReferenceL ); + CollectionHelperL()->SetL( abstractMedia ); + PERFLOGSTOP( KMpxCollectionSetReferenceL ); - CleanupStack::PopAndDestroy( playlistMedia ); // - playlistMedia + CleanupStack::PopAndDestroy( abstractMedia ); // - abstractMedia + CleanupStack::PopAndDestroy( abstractMediaArray ); // - abstractMediaArray - // Clear the array - CleanupStack::PopAndDestroy( playlistArray ); // - playlistArray - - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetPlaylistL" ) ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetReferenceL" ) ); } // --------------------------------------------------------------------------- @@ -1261,8 +1183,7 @@ PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetStorageRoot aStoreRoot = %S" ), &aStorageRoot ); // get the drive number - TParse pathParser; - User::LeaveIfError( pathParser.Set( aStorageRoot, NULL, NULL ) ); + TParsePtrC pathParser( aStorageRoot ); TChar driveChar( pathParser.Drive()[0] ); TInt driveNumber; @@ -1299,36 +1220,55 @@ aMediaProp.SetTextValueL( KMPXMediaMusicGenre, KNullDesC ); // Composer aMediaProp.SetTextValueL( KMPXMediaMusicComposer, KNullDesC ); - // Album artFilename - aMediaProp.SetTextValueL( KMPXMediaMusicAlbumArtFileName, KNullDesC ); + // Album Artist + aMediaProp.SetTextValueL( KMPXMediaMusicAlbumArtist, KNullDesC ); // URL aMediaProp.SetTextValueL( KMPXMediaMusicURL, KNullDesC ); + + // add below for P4S failed case, that get metadata from cached CMPXMedia object + // DateAdded + TTime time; + time.HomeTime(); + aMediaProp.SetTObjectValueL( KMPXMediaGeneralDate, time.Int64() ); + // SampleRate + aMediaProp.SetTObjectValueL( KMPXMediaAudioSamplerate, 0 ); + // AudioBitrate + aMediaProp.SetTObjectValueL( KMPXMediaAudioBitrate, 0 ); + // Duration + aMediaProp.SetTObjectValueL( KMPXMediaGeneralDuration, 0 ); + // DrmStatus + aMediaProp.SetTObjectValueL( KMPXMediaMTPDrmStatus, 0 ); + // NumberOfChannels + aMediaProp.SetTObjectValueL( KMPXMediaAudioNumberOfChannels, 0 ); + // AudioCodec + aMediaProp.SetTObjectValueL( KMPXMediaAudioAudioCodec, 0 ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetDefaultL" ) ); } -TMPXAttributeData CMmMtpDpMetadataMpxAccess::MpxAttribFromPropL( const CMPXMedia& aMedia, - const TUint16 aPropCode ) +TMPXAttributeData CMmMtpDpMetadataMpxAccess::MpxAttribFromPropL( const TUint16 aPropCode ) { const TMetadataTable KMetadataTable[] = - { - { EMTPObjectPropCodeName, KMPXMediaGeneralTitle }, - { EMTPObjectPropCodeArtist, KMPXMediaMusicArtist }, - { EMTPObjectPropCodeAlbumName, KMPXMediaMusicAlbum }, - { EMTPObjectPropCodeDateModified, KMPXMediaGeneralDate }, - { EMTPObjectPropCodeDateAdded, KMPXMediaGeneralDate }, - { EMTPObjectPropCodeDuration, KMPXMediaGeneralDuration }, - { EMTPObjectPropCodeTrack, KMPXMediaMusicAlbumTrack }, - { EMTPObjectPropCodeComposer, KMPXMediaMusicComposer }, - { EMTPObjectPropCodeOriginalReleaseDate, KMPXMediaMusicYear }, - { EMTPObjectPropCodeGenre, KMPXMediaMusicGenre }, - { EMTPObjectPropCodeDRMStatus, KMPXMediaMTPDrmStatus }, - { EMTPObjectPropCodeDescription, KMPXMediaGeneralComment }, - { EMTPObjectPropCodeNumberOfChannels, KMPXMediaAudioNumberOfChannels }, - { EMTPObjectPropCodeAudioBitRate, KMPXMediaAudioBitrate }, - { EMTPObjectPropCodeSampleRate, KMPXMediaAudioSamplerate }, - { EMTPObjectPropCodeAudioWAVECodec, KMPXMediaAudioAudioCodec }, - { EMTPObjectPropCodeAlbumArtist, KMPXMediaMusicArtist } - }; + { + { EMTPObjectPropCodeName, KMPXMediaGeneralTitle }, + { EMTPObjectPropCodeArtist, KMPXMediaMusicArtist }, + { EMTPObjectPropCodeAlbumName, KMPXMediaMusicAlbum }, + { EMTPObjectPropCodeDateModified, KMPXMediaGeneralDate }, + { EMTPObjectPropCodeDateAdded, KMPXMediaGeneralDate }, + { EMTPObjectPropCodeDuration, KMPXMediaGeneralDuration }, + { EMTPObjectPropCodeTrack, KMPXMediaMusicAlbumTrack }, + { EMTPObjectPropCodeComposer, KMPXMediaMusicComposer }, + { EMTPObjectPropCodeOriginalReleaseDate, KMPXMediaMusicYear }, + { EMTPObjectPropCodeGenre, KMPXMediaMusicGenre }, + { EMTPObjectPropCodeDRMStatus, KMPXMediaMTPDrmStatus }, + { EMTPObjectPropCodeDescription, KMPXMediaGeneralComment }, + { EMTPObjectPropCodeNumberOfChannels, KMPXMediaAudioNumberOfChannels }, + { EMTPObjectPropCodeAudioBitRate, KMPXMediaAudioBitrate }, + { EMTPObjectPropCodeSampleRate, KMPXMediaAudioSamplerate }, + { EMTPObjectPropCodeAudioWAVECodec, KMPXMediaAudioAudioCodec }, + { EMTPObjectPropCodeAlbumArtist, KMPXMediaMusicAlbumArtist }, + { EMTPObjectPropCodeRepresentativeSampleData,KMPXMediaMTPSampleDataFlag } + }; TInt i = 0; TInt count = sizeof( KMetadataTable ) / sizeof( KMetadataTable[0] ); @@ -1349,14 +1289,15 @@ } // --------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::GetAllPlaylistL -// Get all playlists from MPX database in the assigned store +// CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL +// Get all abstract medias from MPX database in the assigned store // --------------------------------------------------------------------------- // -void CMmMtpDpMetadataMpxAccess::GetAllPlaylistL( const TDesC& aStoreRoot, - CMPXMediaArray** aPlaylists ) +void CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL( const TDesC& aStoreRoot, + CMPXMediaArray** aAbstractMedias, + TMPXGeneralCategory aCategory ) { - PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetAllPlaylistL" ) ); + PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL" ) ); SetStorageRootL( aStoreRoot ); @@ -1369,21 +1310,24 @@ CleanupStack::PushL( searchMedia ); // + searchMedia searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); + searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); - RArray playlistAttributes; - CleanupClosePushL( playlistAttributes ); // + playlistAttributes - playlistAttributes.AppendL( KMPXMediaGeneralId ); - playlistAttributes.AppendL( KMPXMediaGeneralTitle ); - playlistAttributes.AppendL( KMPXMediaGeneralUri ); + RArray abstractMediaAttributes; + CleanupClosePushL( abstractMediaAttributes ); // + abstractMediaAttributes + abstractMediaAttributes.AppendL( KMPXMediaGeneralId ); + abstractMediaAttributes.AppendL( KMPXMediaGeneralTitle ); + if ( aCategory == EMPXPlaylist ) + { + abstractMediaAttributes.AppendL( KMPXMediaGeneralUri ); + } - PERFLOGSTART(KMpxCollectionGetPlaylist); + PERFLOGSTART( KMpxCollectionGetAbstractMedia ); CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia, - playlistAttributes.Array() ); - PERFLOGSTOP(KMpxCollectionGetPlaylist); + abstractMediaAttributes.Array() ); + PERFLOGSTOP( KMpxCollectionGetAbstractMedia ); - CleanupStack::PopAndDestroy( &playlistAttributes ); // - playlistAttributes + CleanupStack::PopAndDestroy( &abstractMediaAttributes ); // - abstractMediaAttributes CleanupStack::PopAndDestroy( searchMedia ); // - searchMedia CleanupStack::PushL( foundMedia ); // + foundMedia @@ -1392,9 +1336,9 @@ User::Leave( KErrNotSupported ); } - TInt count = *foundMedia->Value ( KMPXMediaArrayCount ); + TInt count = *foundMedia->Value( KMPXMediaArrayCount ); - PRINT1( _L("MM MTP <> CMmMtpDpMetadataMpxAccess::GetAllPlaylistL [%d] playlists found in Playlist Database"), count ); + PRINT1( _L("MM MTP <> CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL [%d] abstractMedias found in Database"), count ); if ( count > 0 ) { @@ -1403,13 +1347,13 @@ User::Leave( KErrNotSupported ); } - *aPlaylists = CMPXMediaArray::NewL( *( foundMedia->Value ( - KMPXMediaArrayContents ) ) ); + *aAbstractMedias = + CMPXMediaArray::NewL( *( foundMedia->Value ( KMPXMediaArrayContents ) ) ); } CleanupStack::PopAndDestroy( foundMedia ); // - foundMedia - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::GetAllPlaylistL" ) ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL" ) ); } // --------------------------------------------------------------------------- @@ -1417,15 +1361,15 @@ // Get all references of specified playlist // --------------------------------------------------------------------------- // -void CMmMtpDpMetadataMpxAccess::GetAllReferenceL( CMPXMedia* aPlaylist, - CDesCArray& aReferences ) +void CMmMtpDpMetadataMpxAccess::GetAllReferenceL( CMPXMedia* aAbstractMedia, + CDesCArray& aReferences ) { PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetAllReferenceL" ) ); - __ASSERT_DEBUG( aPlaylist, User::Panic( KMtpMpxPanic, KErrArgument ) ); + __ASSERT_DEBUG( aAbstractMedia, User::Panic( KMtpMpxPanic, KErrArgument ) ); // Extract the playlist id from the found object - TUint32 playlistId = *(*aPlaylist).Value ( KMPXMediaGeneralId ); + TUint32 abstractMediaId = *( *aAbstractMedia ).Value( KMPXMediaGeneralId ); // find the media object that contains a list of songs in the playlist RArray contentIDs; @@ -1438,17 +1382,17 @@ searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); - searchMedia->SetTObjectValueL ( KMPXMediaGeneralId, playlistId ); + searchMedia->SetTObjectValueL( KMPXMediaGeneralId, abstractMediaId ); RArray songAttributes; CleanupClosePushL( songAttributes ); // + songAttributes songAttributes.AppendL( KMPXMediaGeneralId ); songAttributes.AppendL( KMPXMediaGeneralUri ); - PERFLOGSTART(KMpxCollectionGetReference); + PERFLOGSTART( KMpxCollectionGetReference ); CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia, songAttributes.Array() ); - PERFLOGSTOP(KMpxCollectionGetReference); + PERFLOGSTOP( KMpxCollectionGetReference ); CleanupStack::PopAndDestroy( &songAttributes ); // - songAttributes CleanupStack::PopAndDestroy( searchMedia ); // - searchMedia @@ -1498,23 +1442,38 @@ } // --------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::GetPlaylistNameL +// CMmMtpDpMetadataMpxAccess::GetAbstractMediaNameL // // --------------------------------------------------------------------------- // -void CMmMtpDpMetadataMpxAccess::GetPlaylistNameL( CMPXMedia* aPlaylist, - TDes& aPlaylistName ) +HBufC* CMmMtpDpMetadataMpxAccess::GetAbstractMediaNameL( CMPXMedia* aAbstractMedia, + TMPXGeneralCategory aCategory ) { - PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetPlaylistNameL" ) ); - - if ( !aPlaylist->IsSupported( KMPXMediaGeneralUri ) ) + PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetAbstractMediaNameL" ) ); + HBufC* name = NULL; + if ( aCategory == EMPXPlaylist ) + { + if( !aAbstractMedia->IsSupported( KMPXMediaGeneralUri ) ) + { + User::Leave( KErrNotSupported ); + } + name = aAbstractMedia->ValueText( KMPXMediaGeneralUri ).AllocL(); + } + else if ( aCategory == EMPXAbstractAlbum ) + { + if ( !aAbstractMedia->IsSupported( KMPXMediaGeneralTitle ) ) + { + User::Leave( KErrNotSupported ); + } + name = aAbstractMedia->ValueText( KMPXMediaGeneralTitle ).AllocL(); + } + else { User::Leave( KErrNotSupported ); } - aPlaylistName.Copy( aPlaylist->ValueText( KMPXMediaGeneralUri ) ); - - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::GetPlaylistNameL" ) ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::GetAbstractMediaNameL" ) ); + return name; } // --------------------------------------------------------------------------- @@ -1523,7 +1482,7 @@ // --------------------------------------------------------------------------- // void CMmMtpDpMetadataMpxAccess::GetModifiedContentL( TInt& arrayCount, - CDesCArray& aModifiedcontent ) + CDesCArray& aModifiedcontent ) { PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetModifiedContentL" ) ); CMPXMedia* foundMedia; @@ -1597,6 +1556,7 @@ searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); searchMedia->SetTextValueL( KMPXMediaGeneralUri, aSuid ); + searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); RArray playlistAttributes; CleanupClosePushL( playlistAttributes ); // + playlistAttributes