mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp
changeset 25 d881023c13eb
parent 0 a2952bb97e68
child 27 cbb1bfb7ebfb
--- 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 <mtp/tmtptypeuint128.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/mmtpdataproviderframework.h>
-#include <mtp/mmtpreferencemgr.h>
 #include <mtp/mtpprotocolconstants.h>
 // from MPX
 #include <mpxmedia.h>
@@ -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<TInt64> ( attrib ) );
-            TBuf<KMtpDateTimeStringLength> timeStr;
+            TBuf<KMtpMaxDateTimeStringLength> timeStr;
             time.FormatL( timeStr, KMtpDateTimeFormat );
 
             if ( EMTPTypeString == aNewData.Type() )
@@ -245,7 +244,7 @@
         case EMTPObjectPropCodeOriginalReleaseDate:
             {
             // Compose DateTime string in format YYYYMMDDTHHMMSS
-            TBuf<KMtpDateTimeStringLength> dateTime;
+            TBuf<KMtpMaxDateTimeStringLength> 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<TBool>( aWMPMediaID, aFlag );
-
     searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot );
 
     RArray<TMPXAttribute> 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<TInt> 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<TMPXGeneralCategory>(
-        KMPXMediaGeneralCategory,
-        EMPXSong );
+    media->SetTObjectValueL<TMPXGeneralCategory>( KMPXMediaGeneralCategory, aCategory );
 
     // MPXMedia default types
     media->SetTObjectValueL<TMPXGeneralType>( 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<TInt> 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<TMPXGeneralCategory>(
-            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<TMPXGeneralCategory>(
-            KMPXMediaGeneralCategory,
-            EMPXSong );
-        }
-
-    // MPXMedia default types
-    media->SetTObjectValueL<TMPXGeneralType>( 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<KMtpMaxStringLength> 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<KMtpMaxDescriptionLength> 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<const CMTPTypeArray&>( 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<TBool>( 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<TMPXAttribute> 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<TMPXGeneralType>(
-            KMPXMediaGeneralType,
+        media->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType,
             EMPXItem );
-        media->SetTObjectValueL<TMPXGeneralCategory>(
-            KMPXMediaGeneralCategory,
+        media->SetTObjectValueL<TMPXGeneralCategory>( 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<TInt> 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<TMPXAttribute> playlistAttributes;
-    CleanupClosePushL( playlistAttributes ); // + playlistAttributes
-    playlistAttributes.AppendL( KMPXMediaGeneralId );
-    playlistAttributes.AppendL( KMPXMediaGeneralTitle );
-    playlistAttributes.AppendL( KMPXMediaGeneralUri );
+    RArray<TMPXAttribute> 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<TInt> 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<TMPXGeneralType>( KMPXMediaGeneralType,
             EMPXItem );
         media->SetTObjectValueL<TMPXGeneralCategory>( 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<TBool>( 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<TInt> contentIDs;
         CleanupClosePushL( contentIDs ); // + contentIDs
@@ -1204,14 +1131,14 @@
             EMPXItem );
         media->SetTObjectValueL<TMPXGeneralCategory>( 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<TBool>( KMPXMediaGeneralSynchronized,
+    abstractMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
+    abstractMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory );
+    abstractMedia->SetTextValueL( KMPXMediaGeneralUri, aRefOwnerName );
+    TParsePtrC parse( aRefOwnerName );
+    abstractMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
+    abstractMedia->SetTObjectValueL<TBool>( 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<TUint32>( KMPXMediaAudioSamplerate, 0 );
+    // AudioBitrate
+    aMediaProp.SetTObjectValueL<TUint32>( KMPXMediaAudioBitrate, 0 );
+    // Duration
+    aMediaProp.SetTObjectValueL<TInt>( KMPXMediaGeneralDuration, 0 );
+    // DrmStatus
+    aMediaProp.SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, 0 );
+    // NumberOfChannels
+    aMediaProp.SetTObjectValueL<TUint32>( KMPXMediaAudioNumberOfChannels, 0 );
+    // AudioCodec
+    aMediaProp.SetTObjectValueL<TUint32>( 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<TMPXAttribute> playlistAttributes;
-    CleanupClosePushL( playlistAttributes ); // + playlistAttributes
-    playlistAttributes.AppendL( KMPXMediaGeneralId );
-    playlistAttributes.AppendL( KMPXMediaGeneralTitle );
-    playlistAttributes.AppendL( KMPXMediaGeneralUri );
+    RArray<TMPXAttribute> 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<TInt> ( KMPXMediaArrayCount );
+    TInt count = *foundMedia->Value<TInt>( 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<CMPXMediaArray> (
-                KMPXMediaArrayContents ) ) );
+        *aAbstractMedias =
+            CMPXMediaArray::NewL( *( foundMedia->Value<CMPXMediaArray> ( 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<TMPXItemId> ( KMPXMediaGeneralId );
+    TUint32 abstractMediaId = *( *aAbstractMedia ).Value<TMPXItemId>( KMPXMediaGeneralId );
 
     // find the media object that contains a list of songs in the playlist
     RArray<TInt> contentIDs;
@@ -1438,17 +1382,17 @@
 
     searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup );
     searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
-    searchMedia->SetTObjectValueL<TMPXItemId> ( KMPXMediaGeneralId, playlistId );
+    searchMedia->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, abstractMediaId );
 
     RArray<TMPXAttribute> 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<TMPXAttribute> playlistAttributes;
     CleanupClosePushL( playlistAttributes ); // + playlistAttributes