Revision: 201011 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 31 Mar 2010 22:26:09 +0300
branchRCL_3
changeset 17 780c925249c1
parent 15 d240f0a77280
child 18 37df1c05d427
child 19 51035f0751c2
Revision: 201011 Kit: 201013
mmappcomponents/collectionhelper/group/mpxcollectionhelper.mmp
mmappcomponents/collectionhelper/src/mpxcollectioncachedhelper.cpp
mmappcomponents/collectionhelper/src/mpxcollectionhelperimp.cpp
mmappcomponents/harvester/filehandler/group/mpxfilehandler.mmp
mmappcomponents/harvester/filehandler/inc/mpxdbcommon.h
mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp
mmappcomponents/harvester/metadataextractor/group/mpxmetadataextractor.mmp
mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpaccesssingleton.h
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl
mmappcomponents/mmmtpdataprovider/inc/mmmtpdp_variant.hrh
mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h
mmappcomponents/mmmtpdataprovider/inc/mmmtpdputility.h
mmappcomponents/mmmtpdataprovider/inc/mmmtpvideodbdefs.h
mmappcomponents/mmmtpdataprovider/inc/tobjectdescription.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/group/abstractmediamtpdataprovider.mmp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderconst.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderprocessor.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovider.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderdescriptionutility.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovidersetobjectreferences.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/abstractmediamtpdataproviderprocessor.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovider.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderdescriptionutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectproplist.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderpropertysettingutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderrenameobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectreferences.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderprocessor.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovider.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidercopyobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectproplist.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidermoveobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderpropertysettingutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidersetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/ccopyobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cdeleteobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetformatcapabilities.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectinfo.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectpropvalue.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetpartialobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cmoveobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crenameobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestprocessor.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csetobjectreferences.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/ccopyobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdescriptionutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectinfo.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetpartialobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cpropertysettingutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crenameobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestchecker.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp
mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp
mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp
mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp
mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatavideoaccess.cpp
mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp
mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/inc/CollectionHelperTestClass.h
mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/src/CollectionHelperTestClassBlocks.cpp
mmappfw_plat/collection_helper_api/tsrc/conf/CollectionHelperTestClass.cfg
mmappfw_plat/collection_helper_api/tsrc/init/TestFramework.ini
mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h
mmappfw_plat/mpx_albumart_utility_api/inc/mpxalbumartutility.h
mmappfw_plat/mpx_common_api/inc/mpxmediageneraldefs.h
mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h
mmappfw_plat/mpx_common_api/inc/mpxmediamusicdefs.h
mmappfw_plat/mpx_playback_utility_api/tsrc/conf/mpxplaybackutilitytest.cfg
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/20k_H263_WB_176x144_15fps.3gp
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/80k_H264_AAC16M22_176x144_15fps.3gp
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/DivX_MP3_256x112_30fps_300Kbps.avi
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/MPEG4_VBR_176x144_15fps.3gp
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/XVID_176x144_15fps_261Kbps.avi
mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/honey_im_home_horror_ad.avi
mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.mmp
mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.pkg
mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytest.h
mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytestdefs.h
mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytest.cpp
mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytestBlocks.cpp
mmappfw_plat/mtp_keys_api/group/bld.inf
mpx/playbackframework/playbackengine/inc/mpxautoresumehandler.h
mpx/playbackframework/playbackengine/src/mpxautoresumehandler.cpp
mpx/playbackframework/playbackengine/src/mpxplaybackengine.cpp
package_definition.xml
--- a/mmappcomponents/collectionhelper/group/mpxcollectionhelper.mmp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/collectionhelper/group/mpxcollectionhelper.mmp	Wed Mar 31 22:26:09 2010 +0300
@@ -29,6 +29,8 @@
 MACRO RD_MPX_TNM_INTEGRATION
 #define RD_MPX_TNM_INTEGRATION
 
+MACRO ABSTRACTAUDIOALBUM_INCLUDED
+#define ABSTRACTAUDIOALBUM_INCLUDED
 //MACRO RD_MPX_COLLECTION_CACHE
 SOURCEPATH              ../src
 SOURCE                  mpxcollectionhelperfactory.cpp
--- a/mmappcomponents/collectionhelper/src/mpxcollectioncachedhelper.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/collectionhelper/src/mpxcollectioncachedhelper.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  Extended collection helper with an internal caching array
-*  Version     : %version: da1mmcf#27.1.12 % 
+*  Version     : %version: da1mmcf#27.1.12.1.1 % 
 *
 */
 
@@ -157,9 +157,24 @@
         {
         Commit();
         }
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+    TBool extract = ETrue;
+    if( aMedia->IsSupported( KMPXMediaMTPSampleDataFlag ) )
+        {
+        
+        extract = aMedia->ValueTObjectL<TBool>( KMPXMediaMTPSampleDataFlag );
+        MPX_DEBUG2("CMPXCollectionCachedHelper::AddL KMPXMediaMTPSampleDataFlag is set. extract=%d", extract );
+        }
     
+    if( extract )
+        {
+        // Extract album art from the file
+        iMetadataExtractor->ExtractAlbumArtL( aMedia );
+        }
+#else
     // Extract album art from the file
     iMetadataExtractor->ExtractAlbumArtL( aMedia );
+#endif
     
     CMPXMedia* copy = CMPXMedia::NewL( *aMedia );
     CleanupStack::PushL( copy );
@@ -332,7 +347,20 @@
 void CMPXCollectionCachedHelper::SetL( CMPXMedia*& aMedia )
     {
     MPX_DEBUG1("CMPXCollectionCachedHelper::::SetL <--");     
-    
+
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED    
+    if( aMedia->IsSupported( KMPXMediaMTPSampleDataFlag ) )
+        {
+        TBool flag = aMedia->ValueTObjectL<TBool>( KMPXMediaMTPSampleDataFlag );            
+        MPX_DEBUG2("CMPXCollectionCachedHelper::SetL KMPXMediaMTPSampleDataFlag is set. flag=%d", flag );
+        if( flag )
+            {        
+            iMetadataExtractor->ExtractAlbumArtL( aMedia );
+            }
+        return;
+        }
+#endif
+            
     const TDesC& newUri = aMedia->ValueText( KMPXMediaGeneralUri );
     TInt count( iCache->Count() );
     
@@ -719,7 +747,11 @@
 
     MPX_DEBUG1("CMPXCollectionCachedHelper::GetL <--");
 
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+    if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist && aItemCat != EMPXAbstractAlbum)
+#else
     if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist)
+#endif
         {
         User::Leave(KErrArgument);
         }
@@ -751,11 +783,20 @@
                           EMPXMediaGeneralTitle | EMPXMediaGeneralDate |
                           EMPXMediaGeneralDuration | EMPXMediaGeneralComment |
                           EMPXMediaGeneralUri ));
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
         attributes.AppendL(
             TMPXAttribute(KMPXMediaIdMusic,
                           EMPXMediaMusicArtist | EMPXMediaMusicAlbum |
                           EMPXMediaMusicAlbumTrack | EMPXMediaMusicComposer |
-                          EMPXMediaMusicYear | EMPXMediaMusicGenre));
+                          EMPXMediaMusicYear | EMPXMediaMusicGenre | 
+                          EMPXMediaMusicAlbumArtist));
+#else
+	    attributes.AppendL(
+            TMPXAttribute(KMPXMediaIdMusic,
+	                      EMPXMediaMusicArtist | EMPXMediaMusicAlbum |
+	                      EMPXMediaMusicAlbumTrack | EMPXMediaMusicComposer |
+	                      EMPXMediaMusicYear | EMPXMediaMusicGenre));
+#endif
         attributes.AppendL(KMPXMediaAudioAudioAll);
         attributes.AppendL(KMPXMediaMTPAll);
 
@@ -997,6 +1038,14 @@
              aSrc.ValueTObjectL<TInt>( KMPXMediaMusicRating ) 
                                      );   
         }
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED 
+    if( atts&EMPXMediaMusicAlbumArtist ) // Text
+        {
+        aDestination.SetTextValueL( KMPXMediaMusicAlbumArtist,
+                     aSrc.ValueText(KMPXMediaMusicAlbumArtist ) 
+                                  );
+        }
+#endif
     MPX_DEBUG1("CMPXCollectionCachedHelper::DoAppendMusicL -->");     
     }
 
--- a/mmappcomponents/collectionhelper/src/mpxcollectionhelperimp.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/collectionhelper/src/mpxcollectionhelperimp.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -168,8 +168,14 @@
     // generic way of resolving collections aside from using file extension
     // or UID.
     //
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+    if ( aMedia->ValueTObjectL<TMPXGeneralType>(KMPXMediaGeneralType) == EMPXItem &&
+         (aMedia->ValueTObjectL<TMPXGeneralCategory>(KMPXMediaGeneralCategory) == EMPXPlaylist ||
+         aMedia->ValueTObjectL<TMPXGeneralCategory>(KMPXMediaGeneralCategory) == EMPXAbstractAlbum))
+#else
     if ( aMedia->ValueTObjectL<TMPXGeneralType>(KMPXMediaGeneralType) == EMPXItem &&
          aMedia->ValueTObjectL<TMPXGeneralCategory>(KMPXMediaGeneralCategory) == EMPXPlaylist )
+#endif
         {
         aMedia->SetTObjectValueL<TUid>( KMPXMediaGeneralCollectionId,
                                         iMusicCollectionId );
@@ -348,9 +354,13 @@
     //
     TMPXGeneralCategory category =
         aMedia->ValueTObjectL<TMPXGeneralCategory>(KMPXMediaGeneralCategory);
-
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+    if ((aMedia->ValueTObjectL<TMPXGeneralType>(KMPXMediaGeneralType) != EMPXItem) ||
+        (category != EMPXSong && category != EMPXPlaylist && category != EMPXAbstractAlbum))
+#else
     if ((aMedia->ValueTObjectL<TMPXGeneralType>(KMPXMediaGeneralType) != EMPXItem) ||
         (category != EMPXSong && category != EMPXPlaylist))
+#endif
         {
         User::Leave( KErrArgument );
         }
@@ -466,8 +476,11 @@
     {
     MPX_FUNC("CMPXCollectionHelperImp::GetL");
     MPX_DEBUG2("aFile %S", &aFile);
-
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+    if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist && aItemCat != EMPXAbstractAlbum)
+#else
     if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist)
+#endif
         {
         User::Leave(KErrArgument);
         }
--- a/mmappcomponents/harvester/filehandler/group/mpxfilehandler.mmp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/harvester/filehandler/group/mpxfilehandler.mmp	Wed Mar 31 22:26:09 2010 +0300
@@ -31,6 +31,8 @@
 MACRO __RAMDISK_PERF_ENABLE
 #define __RAMDISK_PERF_ENABLE
 
+MACRO ABSTRACTAUDIOALBUM_INCLUDED
+#define ABSTRACTAUDIOALBUM_INCLUDED
 SOURCEPATH              ../src
 SOURCE                  mpxharvesterfilehandler.cpp
 SOURCE                  mpxharvesterfilehandlerimp.cpp
--- a/mmappcomponents/harvester/filehandler/inc/mpxdbcommon.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/harvester/filehandler/inc/mpxdbcommon.h	Wed Mar 31 22:26:09 2010 +0300
@@ -23,7 +23,11 @@
 // Harvester db increment 9 v1
 // Please update the increment number for each increment 
 // Please update the version number for each schema change
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+_LIT( KHarvesterDBName, "harvesterdbv9_6.dat" );
+#else
 _LIT( KHarvesterDBName, "harvesterdbv9_5.dat" );
+#endif 
 _LIT( KHarvesterDBPattern, "harvesterdbv*.dat" );
 
 const TInt KDbMaxTableCreationSQLLength = 1024;
--- a/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -24,7 +24,7 @@
 
 #ifdef __RAMDISK_PERF_ENABLE
 #include <centralrepository.h>
-#include <BAUTILS.H>  
+#include <bautils.h>  
 #include <mpxharvestercrkeys.h>
 #include "mpxdbcommon.h"
 #endif //__RAMDISK_PERF_ENABLE
--- a/mmappcomponents/harvester/metadataextractor/group/mpxmetadataextractor.mmp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/harvester/metadataextractor/group/mpxmetadataextractor.mmp	Wed Mar 31 22:26:09 2010 +0300
@@ -30,6 +30,8 @@
 MACRO RD_MPX_TNM_INTEGRATION
 #define RD_MPX_TNM_INTEGRATION
 
+MACRO ABSTRACTAUDIOALBUM_INCLUDED
+#define ABSTRACTAUDIOALBUM_INCLUDED
 SOURCEPATH              ../src
 SOURCE                  mpxmetadataextractor.cpp
 SOURCE                  mpxfileinfoutility.cpp
--- a/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  Extracts metadata from a file
-*  Version     : %version: da1mmcf#38.1.4.2.6.1.5 % << Don't touch! Updated by Synergy at check-out.
+*  Version     : %version: da1mmcf#38.1.4.2.6.1.7 % << Don't touch! Updated by Synergy at check-out.
 *
 */
 
@@ -51,6 +51,9 @@
 const TInt KMPXMaxThumbnailRequest = 5; 
 #endif //RD_MPX_TNM_INTEGRATION
 
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+_LIT( KNonEmbeddedArtExt, ".alb" );
+#endif
 //Helper functions
 static void FindAndReplaceForbiddenChars(TDes& aString, TInt aLen)
     {
@@ -734,7 +737,31 @@
     // Get full file name.
     const TDesC& path = aMedia->ValueText(KMPXMediaGeneralUri);
     MPX_DEBUG2("CMPXMetadataExtractor::ExtractAlbumArtL Filename:%S ", &path );
-    
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+    TParsePtrC parse( path );
+    TPtrC ext( parse.Ext() );
+    if (ext.CompareF(KNonEmbeddedArtExt)== 0)
+        {
+		#ifdef RD_MPX_TNM_INTEGRATION
+
+        //check if can send TN request, If thumbnail creation is ongoing, wait til it is done
+        CheckBeforeSendRequest();
+
+        CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC(
+           path, KImageFileType  );
+          
+       
+
+        iTNManager->CreateThumbnails( *source );
+        
+        iOutstandingThumbnailRequest++;
+        CleanupStack::PopAndDestroy( source );
+
+        #endif
+        }
+    else
+        {
+#endif
     // create wanted fields array
     RArray<TMetaDataFieldId> wantedFields;
     CleanupClosePushL( wantedFields );
@@ -763,7 +790,9 @@
 
     // Reset the utility
     iMetadataUtility->ResetL();
-    
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+      }
+#endif
     return err;
     }
 
@@ -817,26 +846,9 @@
     MPX_FUNC("CMPXMetadataExtractor::AddMediaAlbumArtL()");
 #ifdef RD_MPX_TNM_INTEGRATION
     
-    // If thumbnail creation is ongoing, wait til it is done
-    if ( iOutstandingThumbnailRequest > KMPXMaxThumbnailRequest )
-        {
-        MPX_DEBUG1("CMPXMetadataExtractor::AddMediaAlbumArtL(): Thumbnail creation ongoing!");
-        iTNMBlockCount++;
-        // Cancel timer.
-        CancelTimeoutTimer();
-        // Start timer in case there is no callback from ThumbNail Manager. 
-        iTimer->Start(
-            KMPXTimeoutTimer,
-            KMPXTimeoutTimer,
-            TCallBack(TimeoutTimerCallback, this ));
-        
-        // Start wait loop until we get a callback from ThumbNail Manager.
-        if ( !iTNSyncWait->IsStarted() )
-            {
-            iTNSyncWait->Start();
-            }
-        }
-    
+    //check if can send TN request, If thumbnail creation is ongoing, wait til it is done
+    CheckBeforeSendRequest();
+
     aMedia.SetTextValueL( KMPXMediaMusicAlbumArtFileName, aFile );
     
     TBuf<256> mimeType;
@@ -850,3 +862,29 @@
     
 #endif // RD_MPX_TNM_INTEGRATION          
     }
+
+void CMPXMetadataExtractor::CheckBeforeSendRequest()
+     {
+     MPX_FUNC("CMPXMetadataExtractor::CheckBeforeSendRequest()");
+#ifdef RD_MPX_TNM_INTEGRATION
+	// If thumbnail creation is ongoing, wait til it is done
+    if ( iOutstandingThumbnailRequest > KMPXMaxThumbnailRequest )
+        {
+        MPX_DEBUG1("CMPXMetadataExtractor::CheckBeforeSendRequest(): Thumbnail creation ongoing!");
+        iTNMBlockCount++;
+        // Cancel timer.
+        CancelTimeoutTimer();
+        // Start timer in case there is no callback from ThumbNail Manager.
+        iTimer->Start(
+            KMPXTimeoutTimer,
+            KMPXTimeoutTimer,
+            TCallBack(TimeoutTimerCallback, this ));
+
+        // Start wait loop until we get a callback from ThumbNail Manager.
+        if ( !iTNSyncWait->IsStarted() )
+            {
+            iTNSyncWait->Start();
+            }
+        }
+#endif // RD_MPX_TNM_INTEGRATION
+     }
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpaccesssingleton.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpaccesssingleton.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,11 +19,6 @@
 #ifndef CMMMTPDPACCESSSINGLETON_H
 #define CMMMTPDPACCESSSINGLETON_H
 
-/**
-* Implements the MM MTP Data Priovider access singletons reference manager.
-*/
-
-class RFs;
 class CMmMtpDpMetadataAccessWrapper;
 class MMTPDataProviderFramework;
 
@@ -36,8 +31,7 @@
      * @param aRFs RFs reference
      * @param aFramework framework reference
      */
-    IMPORT_C static void CreateL( RFs& aRfs, 
-        MMTPDataProviderFramework& aFramework );
+    IMPORT_C static void CreateL( MMTPDataProviderFramework& aFramework );
     
     /**
      * release singleton instance
@@ -68,14 +62,12 @@
     /*
      * 2-phase construction
      */
-    static CMmMtpDpAccessSingleton* NewL( RFs& aRfs, 
-        MMTPDataProviderFramework& aFramework );
+    static CMmMtpDpAccessSingleton* NewL( MMTPDataProviderFramework& aFramework );
     
     /*
      * 2-phase construction
      */
-    void ConstructL( RFs& aRfs, 
-        MMTPDataProviderFramework& aFramework );
+    void ConstructL( MMTPDataProviderFramework& aFramework );
     /*
      * destruction
      */
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,10 +19,8 @@
 #ifndef CMMMTPDPMETADATAACCESSWRAPPER_H
 #define CMMMTPDPMETADATAACCESSWRAPPER_H
 
-#include <mtp/cmtpobjectmetadata.h>
-#include <mtp/mtpprotocolconstants.h>
 #include <mpxmediageneraldefs.h>
-#include <mtp/mmtpdataproviderframework.h>
+#include <badesca.h>
 
 // forward declacration
 class CMmMtpDpMetadataMpxAccess;
@@ -30,16 +28,15 @@
 
 class RFs;
 class MMTPType;
-class CMTPTypeObjectPropList;
 class CMPXMediaArray;
 class CMPXMedia;
 class MMTPDataProviderFramework;
+class CMTPObjectMetaData;
 
 class CMmMtpDpMetadataAccessWrapper : public CBase
     {
 public:
-    static CMmMtpDpMetadataAccessWrapper* NewL( RFs& aRfs,
-        MMTPDataProviderFramework& aFramework );
+    static CMmMtpDpMetadataAccessWrapper* NewL( MMTPDataProviderFramework& aFramework );
 
     /**
     * Destructor
@@ -78,18 +75,16 @@
     * @param aFullFileName, full file name of file
     * @return void
     */
-    void AddObjectL( const TDesC& aFullFileName, TUint aFormatCode, TUint aSubFormatCode );
+    void AddObjectL( const CMTPObjectMetaData& aObject );
 
     /**
     * Set abstract media to DB
-    * @param aAbstractMediaFileName, full file name of abstract media file
+    * @param aObject,
     * @param aRefFileArray, a array to store the full file name of media files
-    * @param aCategory, the category of abstract media
     * @return void
     */
-    IMPORT_C void SetAbstractMediaL( const TDesC& aAbstractMediaFileName,
-        CDesCArray& aRefFileArray,
-        TMPXGeneralCategory aCategory );
+    IMPORT_C void SetReferenceL( const CMTPObjectMetaData& aObject,
+        CDesCArray& aRefFileArray );
 
     /**
     * Gets a piece of metadata from the collection
@@ -119,18 +114,17 @@
 
     /**
     * Renames the file part of a record in the collection database
-    * @param aFile, old full file name of Media file
+    * @param aOldObject, object need to be renamed
     * @param aNewFileName, new file name need update
     * @return void
     */
-    IMPORT_C void RenameObjectL( const TDesC& aOldFileName, const TDesC& aNewFileName );
+    IMPORT_C void RenameObjectL( const CMTPObjectMetaData& aOldObject, const TDesC& aNewFileName );
 
     /**
     * Deletes metadata information associated with the object
-    * @param aFullFileName, full file name of Media file
-    * @param aFormatCode, format code
+    * @param aObject, the object need to be deleted
     */
-    void DeleteObjectL( const TDesC& aFullFileName, const TUint aFormatCode );
+    void DeleteObjectL( const CMTPObjectMetaData& aObject );
 
     /**
     * Set current  drive info
@@ -144,7 +138,7 @@
     * @param aWidth,  the width of an object in pixels to set
     * @parem aHeight,  the height of an object in pixels to set
     */
-    void SetImageObjPropL( const TDesC& aFullFileName,
+    void SetImageObjPropL( const CMTPObjectMetaData& aObject,
         const TUint32 aWidth,
         const TUint32 aHeight );
 
@@ -154,7 +148,7 @@
     * @param aWidth,  the width of an object in pixels to get
     * @parem aHeight,  the height of an object in pixels to get
     */
-    void GetImageObjPropL( const TDesC& aFullFileName,
+    void GetImageObjPropL( const CMTPObjectMetaData& aObject,
         TUint32& aWidth,
         TUint32& aHeight );
 
@@ -213,13 +207,15 @@
     */
     IMPORT_C void CreateDummyFile( const TDesC& aPlaylistName );
 
+    TMPXGeneralCategory Category( const CMTPObjectMetaData& aObject );
+
 private:
 
-    CMmMtpDpMetadataAccessWrapper( RFs& aRfs, MMTPDataProviderFramework& aFramework );
+    CMmMtpDpMetadataAccessWrapper( MMTPDataProviderFramework& aFramework );
 
     void ConstructL();
 
-    TMPXGeneralCategory Category( const TUint aFormatCode );
+    TMPXGeneralCategory ContainerCategory( const TDesC& aFullFileName );
 
     /**
     * Remove all dummy file of which format is "pla", and leave the "m3u"
@@ -227,13 +223,12 @@
     void RemoveDummyFiles();
 
 private:
-    // Data
-    RFs& iRfs;
     CMmMtpDpMetadataMpxAccess* iMmMtpDpMetadataMpxAccess;
     CMmMtpDpMetadataVideoAccess* iMmMtpDpMetadataVideoAccess;
     TBool iOpenSession;
 
     MMTPDataProviderFramework& iFramework;
+    RFs& iFs;	// should not remove this member data!!!
 
     CDesCArray* iAbstractMediaArray;
 
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h	Wed Mar 31 22:26:09 2010 +0300
@@ -47,8 +47,7 @@
     {
 public:
 
-    static CMmMtpDpMetadataMpxAccess* NewL( RFs& aRfs,
-        MMTPDataProviderFramework& aFramework );
+    static CMmMtpDpMetadataMpxAccess* NewL( RFs& aRfs );
 
     /**
      * Destructor
@@ -99,17 +98,18 @@
 
     /**
      * Set abstract media to DB
-     * @param aAbstractMediaFileName, full file name of abstract media file
+     * @param aRefOwnerName, full file name of abstract media file
      * @param aRefFileArray, a array to store the full file name of media files
      * @param aCategory, indicate the category of abstract media
      */
-    void SetAbstractMediaL( const TDesC& aAbstractMediaFileName,
+    void SetReferenceL( const TDesC& aRefOwnerName,
         CDesCArray& aRefFileArray,
         TMPXGeneralCategory aCategory );
 
     void GetObjectMetadataValueL( const TUint16 aPropCode,
         MMTPType& aNewData,
-        const CMTPObjectMetaData& aObjectMetaData );
+        const TDesC& aFullFileName,
+        TMPXGeneralCategory aCategory );
 
     /**
      * Set object property and updated object in DB according property code,
@@ -122,19 +122,8 @@
      */
     void SetObjectMetadataValueL( const TUint16 aPropCode,
         const MMTPType& aNewData,
-        const CMTPObjectMetaData& aObjectMetaData );
-
-    /**
-     * Set object property and updated object in DB according property code,
-     * only for update, not for creation
-     * @param aPropCode, property code of aObjectMetaData
-     * @param aNewData, object property value which will be set into
-     *     aObjectMetaData
-     * @param aSuid, full file name of object of which properties need to set
-     */
-    void SetObjectMetadataValueL( const TUint16 aPropCode,
-        const MMTPType& aNewData,
-        const TDesC& aSuid );
+        const TDesC& aFullFileName,
+        TMPXGeneralCategory aCategory );
 
     CMPXMedia* FindWMPMediaLC( TMPXAttributeData aWMPMediaID,
         TBool aFlag );
@@ -158,11 +147,11 @@
      * Rename the filename onto MPX DB
      * @param aOldFileName, the old file to rename
      * @param aNewFileName, the new file name
-     * @param aFormatCode, the format of object
+     * @param aCategory, the category of object
      */
     void RenameObjectL( const TDesC& aOldFileName,
         const TDesC& aNewFileName,
-        TUint aFormatCode );
+        TMPXGeneralCategory aCategory );
 
     /**
      * Set current  drive info
@@ -185,8 +174,7 @@
     TBool IsExistL( const TDesC& aSuid );
 
 private:
-    CMmMtpDpMetadataMpxAccess( RFs& aFs,
-        MMTPDataProviderFramework& aFramework );
+    CMmMtpDpMetadataMpxAccess( RFs& aFs );
 
     void ConstructL();
 
@@ -210,15 +198,12 @@
     MMPXCollectionHelper* CollectionHelperL();
 
 private:
-    // File server to allow file access
     RFs& iRfs;
 
     TBuf<KStorageRootMaxLength> iStoreRoot;
 
     MMPXCollectionHelper* iCollectionHelper;
 
-    MMTPDataProviderFramework& iFramework;
-
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
     CMmMtpDpPerfLog* iPerfLog;
 #endif
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl	Wed Mar 31 22:26:09 2010 +0300
@@ -71,10 +71,13 @@
     VA_LIST list;
     VA_START( list, aFmt );
 
-    TBuf<KMtpLogBufferSize> buf;
-    
-    buf.AppendFormatList( aFmt, list, &iOverflowHandler );
-    Write( buf );
+    HBufC* buf = HBufC::New( KMtpLogBufferSize );
+    if ( buf )
+        {
+        buf->Des().AppendFormatList( aFmt, list, &iOverflowHandler );
+        Write( *buf );
+        delete buf;
+        }
     }
 
 void CMmMtpDpPerfLog::Start( const TDesC& aDescription )
--- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdp_variant.hrh	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdp_variant.hrh	Wed Mar 31 22:26:09 2010 +0300
@@ -25,4 +25,7 @@
 // flag to enable replace the exist object
 #undef MMMTPDP_REPLACE_EXIST_FILE
 
+// flag to enable support for non embedded album art, should be ON by default
+#define MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+
 #endif // MMMTPDP_VARIANT_HRH
--- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h	Wed Mar 31 22:26:09 2010 +0300
@@ -42,6 +42,7 @@
 _LIT( KTxtExtensionO4V, ".o4v" );
 _LIT( KTxtExtensionODF, ".odf" );
 
+_LIT( KTxtExtensionALB, ".alb" );
 _LIT( KTxtExtensionM3U, ".m3u" );
 _LIT( KTxtExtensionPLA, ".pla" );
 _LIT( KTxtExtensionVIR, ".vir" ); // virtual playlist from MPX
@@ -66,6 +67,9 @@
 _LIT(KFormatExtensionO4A, "0xB984:o4a");
 _LIT(KFormatExtensionO4V, "0xB984:o4v");
 
+//Abstract Album
+_LIT(KFormatExtensionALB, "0xBA03:alb");
+
 //Playlists
 _LIT(KFormatExtensionM3U, "0xba11:m3u");
 _LIT(KFormatExtensionPLA, "0xBA05:pla");
@@ -95,7 +99,8 @@
     {
     EMTPSubFormatCodeUnknown,
     EMTPSubFormatCodeAudio,
-    EMTPSubFormatCodeVideo
+    EMTPSubFormatCodeVideo,
+    EMTPSubFormatCodeUndefine
     };
 
 #endif // MMMTPDPFILEDEFS_H
--- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdputility.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdputility.h	Wed Mar 31 22:26:09 2010 +0300
@@ -24,8 +24,7 @@
 #include "mmmtpdpfiledefs.h"
 
 // forward declacration
-class CMTPObjectMetaData;
-class MMTPDataProviderFramework;
+class RFs;
 
 class MmMtpDpUtility
     {
@@ -52,31 +51,6 @@
     static TBool HasReference( TUint16 aObjFormatCode );
 
     /**
-    * Utility function to decide if the file is video.
-    * @param aFullFileName, the full file name
-    * @return TBool for decide if the file is video
-    */
-    IMPORT_C static TBool IsVideo( const TDesC& aFullFileName );
-
-    /**
-    * Utility function to decide if the file is video.
-    * For internal use, this is fast version by querying framework DB
-    * @param aFullFileName, the full file name
-    * @param aFramework, the mtp framework instance pointer, default is null
-    * @return TBool for decide if the file is video
-    */
-    static TBool IsVideoL( const TDesC& aFullFileName, const MMTPDataProviderFramework& aFramework );
-
-    /**
-    * Utility function to decide if the file is video.
-    * For internal use, this is fast version by querying framework DB
-    * @param aFormatCode,
-    * @param aSubFormatCode,
-    * @return TBool for decide if the file is video
-    */
-    static TBool IsVideoL( TUint aFormatCode, TUint aSubFormatCode );
-
-    /**
     * Check the filename length to see if it exceeds Symbian 256 limit.
     * @param aPathName, the path name of the file
     * @param aFileName, the file to be check
@@ -99,7 +73,7 @@
     * @param aFullFileName, fine name
     * @return TTime for specified file
     */
-    static TTime GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName );
+    static void GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName, TDes& aDateModified );
 
     /**
     * Check if file is read-only, if file doesn't exist, leave
@@ -161,7 +135,7 @@
     * @param aSubFormatCode, output the sub format code
     * @return if success, return KErrNone, otherwise, error code
     */
-    static TInt SubFormatCodeFromMime( const TDesC8& aMimeType, TMmMtpSubFormatCode& aSubFormatCode );
+    static TMmMtpSubFormatCode SubFormatCodeFromMime( const TDesC8& aMimeType );
 
     /**
     * Get DRM status
--- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpvideodbdefs.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpvideodbdefs.h	Wed Mar 31 22:26:09 2010 +0300
@@ -53,7 +53,6 @@
 _LIT( KMtpVideoEncodingProfile,      "EncodingProfile" );
 
 _LIT( KMtpVideoParentalRating,       "ParentalRating" );
-_LIT( KMtpVideoUseCount      ,       "UseCount" );
 _LIT( KMtpVideoDRM,                  "DRM" );
 
 _LIT( KMtpVideoDeleted,              "Deleted" );
@@ -86,7 +85,6 @@
 _LIT( KMtpVideoEncodingProfileType,  " LONG VARCHAR" );
 
 _LIT( KMtpVideoParentalRatingType,   " LONG VARCHAR" );
-_LIT( KMtpVideoUseCountType,         " UNSIGNED INTEGER" );
 _LIT( KMtpVideoDRMType,              " UNSIGNED SMALLINT" );
 
 _LIT( KMtpVideoDeletedType,          " BIT" );
--- a/mmappcomponents/mmmtpdataprovider/inc/tobjectdescription.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/inc/tobjectdescription.h	Wed Mar 31 22:26:09 2010 +0300
@@ -38,6 +38,7 @@
 enum TGroupCodeType
     {
     EGroupCodeGeneral    = 0x00000001,
+    EGroupCodeSample     = 0x00000100,
     EGroupCodeMediaDB    = 0x00FF0000,
     EGroupCodeNotDefined = 0xFFFFFFFF   // TODO: need to reconsider
     };
@@ -45,6 +46,7 @@
 static const TGroupCodeType KSupportedGroupCode[] =
     {
     EGroupCodeGeneral,
+    EGroupCodeSample,
     EGroupCodeMediaDB
     };
 
@@ -62,14 +64,25 @@
         { EMTPObjectPropCodeNonConsumable,    EGroupCodeGeneral },
 
         // The first group, addtional for all
+        { EMTPObjectPropCodeName,             EGroupCodeGeneral },  // only for winlogo
         { EMTPObjectPropCodeDateCreated,      EGroupCodeGeneral },
         { EMTPObjectPropCodeDateModified,     EGroupCodeGeneral },
 
-        // The second group, additional for all
-        { EMTPObjectPropCodeName,             EGroupCodeMediaDB },
+        // The first group, mandatory for video
+        { EMTPObjectPropCodeWidth,            EGroupCodeGeneral },  // only for winlogo
+        { EMTPObjectPropCodeHeight,           EGroupCodeGeneral },  // only for winlogo
+
+        // The second group, for non-embedded album art
+        { EMTPObjectPropCodeRepresentativeSampleFormat, EGroupCodeGeneral }, // changed for winlogo
+        { EMTPObjectPropCodeRepresentativeSampleSize,   EGroupCodeGeneral }, // changed for winlogo
+        { EMTPObjectPropCodeRepresentativeSampleHeight, EGroupCodeGeneral }, // changed for winlogo
+        { EMTPObjectPropCodeRepresentativeSampleWidth,  EGroupCodeGeneral }, // changed for winlogo
+        { EMTPObjectPropCodeRepresentativeSampleData,   EGroupCodeGeneral }, // changed for winlogo
+
+        // The third group, additional for all
         { EMTPObjectPropCodeDateAdded,        EGroupCodeMediaDB },
 
-        // The second group, mandatory for audio
+        // The third group, mandatory for audio
         { EMTPObjectPropCodeArtist,           EGroupCodeMediaDB },
         { EMTPObjectPropCodeTrack,            EGroupCodeMediaDB },
         { EMTPObjectPropCodeGenre,            EGroupCodeMediaDB },
@@ -82,11 +95,9 @@
         { EMTPObjectPropCodeOriginalReleaseDate, EGroupCodeMediaDB },
         { EMTPObjectPropCodeDescription,      EGroupCodeMediaDB },
         { EMTPObjectPropCodeComposer,         EGroupCodeMediaDB },
+        { EMTPObjectPropCodeAlbumArtist,      EGroupCodeMediaDB },
 
-        // The second group, mandatory for video
-        { EMTPObjectPropCodeWidth,            EGroupCodeMediaDB },
-        { EMTPObjectPropCodeHeight,           EGroupCodeMediaDB },
-        { EMTPObjectPropCodeUseCount,         EGroupCodeMediaDB },
+        // The third group, mandatory for video
         { EMTPObjectPropCodeScanType,         EGroupCodeMediaDB },
         { EMTPObjectPropCodeVideoFourCCCodec, EGroupCodeMediaDB },
         { EMTPObjectPropCodeVideoBitRate,     EGroupCodeMediaDB },
@@ -94,7 +105,7 @@
         { EMTPObjectPropCodeKeyFrameDistance, EGroupCodeMediaDB },
         { EMTPObjectPropCodeEncodingProfile,  EGroupCodeMediaDB },
 
-        // The second group, additional for video
+        // The third group, additional for video
         { EMTPObjectPropCodeParentalRating,   EGroupCodeMediaDB },
         { EMTPObjectPropCodeDRMStatus,        EGroupCodeMediaDB },
         { EMTPExtObjectPropCodeOmaDrmStatus,  EGroupCodeMediaDB }
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/group/abstractmediamtpdataprovider.mmp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/group/abstractmediamtpdataprovider.mmp	Wed Mar 31 22:26:09 2010 +0300
@@ -43,7 +43,6 @@
 SOURCE    cabstractmediamtpdataprovidergetobjectpropvalue.cpp
 SOURCE    cabstractmediamtpdataprovidergetobjectproplist.cpp
 SOURCE    cabstractmediamtpdataprovidersetobjectpropvalue.cpp
-SOURCE    cabstractmediamtpdataprovidersetobjectreferences.cpp
 SOURCE    cabstractmediamtpdataproviderabstractmediapreference.cpp
 SOURCE    cabstractmediamtpdataprovidercopyobject.cpp
 SOURCE    cabstractmediamtpdataprovidermoveobject.cpp
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderconst.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderconst.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,6 +19,34 @@
 #define ABSTRACTMEDIAMTPDATAPROVIDERCONST_H
 
 #include <mtp/mtpprotocolconstants.h>
+#include "mmmtpdp_variant.hrh"
+
+enum TMmMtpSampleSizeRange
+    {
+    EMTPMinSampleSize  = 0x00000001,  // 1 bytes
+    EMTPMaxSampleSize  = 0x00010000,  // 64 kb
+    EMTPStepSampleSize = 0x00000001   // 1 byte
+    };
+
+enum TMmMtpSampleHeightRange
+    {
+    EMTPSampleMinHeight  = 0x00000001,  // 1 pixel
+    EMTPSampleMaxHeight  = 0x00000168,  // 360 pixel
+    EMTPSampleStepHeight = 0x00000001   // 1 pixel
+    };
+
+enum TMmMtpSampleWidthRange
+    {
+    EMTPSampleMinWidth  = 0x00000001,  // 1 pixel
+    EMTPSampleMaxWidth  = 0x00000168,  // 360 pixel
+    EMTPSampleStepWidth = 0x00000001   // 1 pixel
+    };
+
+// Supported sample format
+static const TUint16 TMmMtpSupportedSampleFormat[] =
+    {
+    EMTPFormatCodeEXIFJPEG
+    };
 
 const TUint16 EMTPExtOpCodeAbstractMediaPreference = 0x9203;
 
@@ -27,6 +55,9 @@
 */
 static const TUint16 KAbstractMediaMtpDataProviderSupportedFormats[] =
     {
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT        
+    EMTPFormatCodeAbstractAudioAlbum,
+#endif    
     EMTPFormatCodeM3UPlaylist,
     EMTPFormatCodeAbstractAudioVideoPlaylist
     };
@@ -64,4 +95,15 @@
     EMTPOpCodeGetFormatCapabilities
     };
 
+// Mandatory properties for ALB
+static const TUint16 KMmMtpDpSupportedPropMandatoryALB[] =
+    {
+    EMTPObjectPropCodeRepresentativeSampleFormat,
+    EMTPObjectPropCodeRepresentativeSampleSize,
+    EMTPObjectPropCodeRepresentativeSampleHeight,
+    EMTPObjectPropCodeRepresentativeSampleWidth,
+    EMTPObjectPropCodeRepresentativeSampleData,
+    EMTPObjectPropCodeAlbumArtist
+    };
+
 #endif // ABSTRACTMEDIAMTPDATAPROVIDERCONST_H
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderprocessor.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderprocessor.h	Wed Mar 31 22:26:09 2010 +0300
@@ -22,7 +22,6 @@
 // class forward
 class MMTPConnection;
 class TMTPTypeRequest;
-class MMTPDataProviderFramework;
 class MMmRequestProcessor;
 class MMmMtpDpConfig;
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovider.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovider.h	Wed Mar 31 22:26:09 2010 +0300
@@ -24,6 +24,7 @@
 #include "abstractmediamtpdataproviderprocessor.h"
 #include "mmmtpenumerationcallback.h"
 #include "mmmtpdpconfig.h"
+#include "mmmtpdp_variant.hrh"
 
 // Forward declaration
 class MMmRequestProcessor;
@@ -178,6 +179,8 @@
 
     void GetSupportedPropertiesL();
 
+    void GetAllSupportedPropL();
+
 private:
     // data
     RPointerArray<MMmRequestProcessor> iActiveProcessors;
@@ -192,7 +195,11 @@
 
     RArray<TUint> iSupportedFormat;
 
-    RArray<TUint> iSupportedProperties;
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+    RArray<TUint> iSupportedPropAbstractAlbum;
+#endif
+    RArray<TUint> iSupportedPropPlaylist;
+    RArray<TUint> iSupportedPropAll;
 
     CPropertySettingUtility* iPropSettingUtility;
     CDescriptionUtility* iDescriptionUtility;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderdescriptionutility.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderdescriptionutility.h	Wed Mar 31 22:26:09 2010 +0300
@@ -53,14 +53,35 @@
     CMTPTypeObjectPropDesc* NewSpecificPropDescL( TUint aFormatCode, TUint16 aPropCode );
 
 private:
-    // Example for further extension
+    /**
+     * Construct property description of SampleFormat.
+     * @return Property description dataset of sample format.
+     */
+    CMTPTypeObjectPropDesc* NewRepresentativeSampleFormatL();                   
+
+    /**
+     * Construct property description of SampleSize.
+     * @return Property description dataset of sample size.
+     */
+    CMTPTypeObjectPropDesc* NewRepresentativeSampleSizeL();
+    
     /**
-     * Construct audio wave codec property description.
-     * @param aFormatCode
-     * @return Property description dataset of audio wave codec.
+     * Construct property description of SampleHeight.
+     * @return Property description dataset of sample height.
      */
-    // CMTPTypeObjectPropDesc* NewAudioWaveCodecPropDescL( TUint aFormatCode );
-
+    CMTPTypeObjectPropDesc* NewRepresentativeSampleHeightL();
+    
+    /**
+     * Construct property description of SampleWidth.
+     * @return Property description dataset of sample width.
+     */
+    CMTPTypeObjectPropDesc* NewRepresentativeSampleWidthL();
+    
+    /**
+     * Construct property description of SampleData.
+     * @return Property description dataset of sample data.
+     */
+    CMTPTypeObjectPropDesc* NewRepresentativeSampleDataL();
     };
 
 #endif // CABSTRACTMEDIAMTPDATAPROVIDERDESCRIPTIONUTILITY_H
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h	Wed Mar 31 22:26:09 2010 +0300
@@ -74,6 +74,14 @@
     TInt RunError( TInt aError );
 
 private:
+
+    enum TEnumState
+    {
+        EEnumPlaylist,
+        EEnumAbstractAlbum,
+        EEnumCount
+    };
+
     /**
     * Standard C++ Constructor
     * @param aFramework Reference to MMTPDataProviderFramework
@@ -90,7 +98,7 @@
     void SignalCompleteL( MMTPEnumerationCallback& aCallback,
         TInt aError = KErrNone );
 
-    void ScanStorageL( TUint32 aStorageId );
+    void InitStorageL( );
 
     /**
     * Scan next storage
@@ -134,6 +142,7 @@
     CMPXMediaArray* iAbstractMedias;
     TInt iCount;
     TInt iCurrentIndex;
+    TInt iEnumState;
 
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
     CMmMtpDpPerfLog* iPerfLog;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovidersetobjectreferences.h	Mon Mar 15 12:42:31 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*
-* 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:  Set object references operation.
-*
-*/
-
-
-#ifndef CABSTRACTMEDIAMTPDATAPROVIDERSETOBJECTREFERENCES_H
-#define CABSTRACTMEDIAMTPDATAPROVIDERSETOBJECTREFERENCES_H
-
-#include "csetobjectreferences.h"
-
-/**
-* Defines abstract media data provider SetObjectReferences request processor
-*/
-class CAbstractMediaMtpDataProviderSetObjectReferences : public CSetObjectReferences
-    {
-public:
-    /**
-    * Two-phase construction method
-    * @param aFramework    The data provider framework
-    * @param aConnection    The connection from which the request comes
-    * @param aWrapper    medadata access interface
-    * @return a pointer to the created request processor object
-    */
-    static MMmRequestProcessor* NewL( MMTPDataProviderFramework& aFramework,
-        MMTPConnection& aConnection,
-        MMmMtpDpConfig& aDpConfig );
-
-    /**
-    * Destructor
-    */
-    ~CAbstractMediaMtpDataProviderSetObjectReferences();
-
-private:
-    /**
-    * Standard c++ constructor
-    * @param aFramework    The data provider framework
-    * @param aConnection    The connection from which the request comes
-    * @param aWrapper    medadata access interface
-    */
-    CAbstractMediaMtpDataProviderSetObjectReferences( MMTPDataProviderFramework& aFramework,
-        MMTPConnection& aConnection,
-        MMmMtpDpConfig& aDpConfig );
-
-    /**
-    * two-phase construction
-    */
-    void ConstructL();
-
-protected:
-    // from CSetObjectPropValue
-    /**
-    * set references to DB
-    * @param aWrapper          medadata access interface
-    * @param aObjectFormat     the format of the file
-    * @param aSrcFileName      file name, from
-    * @param aRefFileArray     the array of file names, to
-    */
-    void DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper,
-        TUint16 aObjectFormat,
-        const TDesC& aSrcFileName,
-        CDesCArray& aRefFileArray );
-
-    };
-
-#endif // CABSTRACTMEDIAMTPDATAPROVIDERSETOBJECTREFERENCES_H
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/abstractmediamtpdataproviderprocessor.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/abstractmediamtpdataproviderprocessor.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -38,7 +38,7 @@
 #include "cabstractmediamtpdataprovidersetobjectpropvalue.h"
 #include "csetobjectproplist.h"
 #include "cgetobjectreferences.h"
-#include "cabstractmediamtpdataprovidersetobjectreferences.h"
+#include "csetobjectreferences.h"
 #include "cdeleteobject.h"
 #include "cabstractmediamtpdataprovidercopyobject.h"
 #include "cabstractmediamtpdataprovidermoveobject.h"
@@ -63,7 +63,7 @@
         { EMTPOpCodeSetObjectPropValue, CAbstractMediaMtpDataProviderSetObjectPropValue::NewL },
         { EMTPOpCodeSetObjectPropList, CSetObjectPropList::NewL }, //SetObjectPropList
         { EMTPOpCodeGetObjectReferences, CGetObjectReferences::NewL }, //Get Object References
-        { EMTPOpCodeSetObjectReferences, CAbstractMediaMtpDataProviderSetObjectReferences::NewL }, //Set Object References
+        { EMTPOpCodeSetObjectReferences, CSetObjectReferences::NewL }, //Set Object References
         { EMTPOpCodeDeleteObject, CDeleteObject::NewL }, //DeleteObject
         { EMTPOpCodeCopyObject, CAbstractMediaMtpDataProviderCopyObject::NewL }, // Copy Object
         { EMTPOpCodeMoveObject, CAbstractMediaMtpDataProviderMoveObject::NewL }, // Move Object
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovider.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovider.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -76,7 +76,11 @@
     iActiveProcessor( -1 ),
     iRenameObject( NULL ),
     iSupportedFormat( KAbstractMediaMtpDpArrayGranularity ),
-    iSupportedProperties( KAbstractMediaMtpDpArrayGranularity )
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+    iSupportedPropAbstractAlbum( KAbstractMediaMtpDpArrayGranularity ),
+#endif
+    iSupportedPropPlaylist( KAbstractMediaMtpDpArrayGranularity ),
+    iSupportedPropAll( KAbstractMediaMtpDpArrayGranularity )
     {
     // Do nothing
     }
@@ -108,7 +112,11 @@
         delete iRenameObject;
 
     iSupportedFormat.Close();
-    iSupportedProperties.Close();
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+    iSupportedPropAbstractAlbum.Close();
+#endif
+    iSupportedPropPlaylist.Close();
+    iSupportedPropAll.Close();
 
     PRINT( _L( "MM MTP => CAbstractMediaMtpDataProvider::~CAbstractMediaMtpDataProvider" ) );
     }
@@ -129,10 +137,11 @@
 
     iAbstractMediaEnumerator = CAbstractMediaMtpDataProviderEnumerator::NewL( Framework(), *this );
 
-    CMmMtpDpAccessSingleton::CreateL( Framework().Fs(), Framework() );
+    CMmMtpDpAccessSingleton::CreateL( Framework() );
 
     GetSupportedFormatL();
     GetSupportedPropertiesL();
+    GetAllSupportedPropL();
 
     iPropSettingUtility = CAbstractMediaMtpDataProviderPropertySettingUtility::NewL();
     iDescriptionUtility = CAbstractMediaMtpDataProviderDescriptionUtility::NewL();
@@ -360,11 +369,11 @@
 
         case EObjectProperties:
             {
-            TInt count = iSupportedProperties.Count();
+            TInt count = iSupportedPropAll.Count();
 
             for ( TInt i = 0; i < count; i++ )
                 {
-                aArray.Append( iSupportedProperties[i] );
+                aArray.Append( iSupportedPropAll[i] );
                 }
             PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProvider::Supported properties count = %d" ), aArray.Count() );
             }
@@ -392,7 +401,9 @@
     {
     if( aCategory == EFormatExtensionSets )
         {
-        //EMTPFormatCodeM3U,
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+        aStrings.AppendL(KFormatExtensionALB);
+#endif
         aStrings.AppendL(KFormatExtensionM3U);
         aStrings.AppendL(KFormatExtensionPLA);
         aStrings.AppendL(KFormatExtensionVIR);
@@ -527,10 +538,24 @@
         }
     }
 
-const RArray<TUint>* CAbstractMediaMtpDataProvider::GetSupportedPropertiesL( TUint32 /*aFormatCode*/ ) const
+const RArray<TUint>* CAbstractMediaMtpDataProvider::GetSupportedPropertiesL( TUint32 aFormatCode ) const
     {
-    // May need add more implementation here for further extension.
-    return &iSupportedProperties;
+    if ( ( aFormatCode == EMTPFormatCodeM3UPlaylist ) || ( aFormatCode == EMTPFormatCodeAbstractAudioVideoPlaylist ) )
+        {
+        return &iSupportedPropPlaylist;
+        }
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+    else if ( aFormatCode == EMTPFormatCodeAbstractAudioAlbum )
+        {
+        return &iSupportedPropAbstractAlbum;
+        }
+#endif
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+    // should never run to this line, just for avoiding warning.
+    return NULL;
     }
 
 // ---------------------------------------------------------------------------
@@ -540,20 +565,37 @@
 //
 void CAbstractMediaMtpDataProvider::GetSupportedPropertiesL()
     {
-    iSupportedProperties.Reset();
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+    iSupportedPropAbstractAlbum.Reset();
+#endif
+    iSupportedPropPlaylist.Reset();
 
     TInt count = 0, i = 0;
     count = sizeof( KMmMtpDpSupportedPropMandatoryAll ) / sizeof( TUint16 );
     for ( i = 0; i < count; i++ )
         {
-        InsertL( iSupportedProperties, KMmMtpDpSupportedPropMandatoryAll[i] );
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+        InsertL( iSupportedPropAbstractAlbum, KMmMtpDpSupportedPropMandatoryAll[i] );
+#endif
+        InsertL( iSupportedPropPlaylist, KMmMtpDpSupportedPropMandatoryAll[i] );
         }
 
     count = sizeof( KMmMtpDpSupportedPropAdditionalAll ) / sizeof( TUint16 );
     for ( i = 0; i < count; i++ )
         {
-        InsertL( iSupportedProperties, KMmMtpDpSupportedPropAdditionalAll[i] );
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT            
+        InsertL( iSupportedPropAbstractAlbum, KMmMtpDpSupportedPropAdditionalAll[i] );
+#endif
+        InsertL( iSupportedPropPlaylist, KMmMtpDpSupportedPropAdditionalAll[i] );
         }
+
+#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT
+    count = sizeof( KMmMtpDpSupportedPropMandatoryALB ) / sizeof( TUint16 );
+    for ( i = 0; i < count; i++ )
+        {
+        InsertL( iSupportedPropAbstractAlbum, KMmMtpDpSupportedPropMandatoryALB[i] );
+        }
+#endif        
     }
 
 // ---------------------------------------------------------------------------
@@ -563,7 +605,31 @@
 //
 const RArray<TUint>* CAbstractMediaMtpDataProvider::GetAllSupportedProperties() const
     {
-    return &iSupportedProperties;
+    return &iSupportedPropAll;
+    }
+
+void CAbstractMediaMtpDataProvider::GetAllSupportedPropL()
+    {
+    iSupportedPropAll.Reset();
+
+    TInt count = 0, i = 0;
+    count = sizeof( KMmMtpDpSupportedPropMandatoryAll ) / sizeof( TUint16 );
+    for ( i = 0; i < count; i++ )
+        {
+        InsertL( iSupportedPropAll, KMmMtpDpSupportedPropMandatoryAll[i] );
+        }
+
+    count = sizeof( KMmMtpDpSupportedPropAdditionalAll ) / sizeof( TUint16 );
+    for ( i = 0; i < count; i++ )
+        {
+        InsertL( iSupportedPropAll, KMmMtpDpSupportedPropAdditionalAll[i] );
+        }
+
+    count = sizeof( KMmMtpDpSupportedPropMandatoryALB ) / sizeof( TUint16 );
+    for ( i = 0; i < count; i++ )
+        {
+        InsertL( iSupportedPropAll, KMmMtpDpSupportedPropMandatoryALB[i] );
+        }
     }
 
 // ---------------------------------------------------------------------------
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderdescriptionutility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderdescriptionutility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,10 +16,12 @@
 *
 */
 
+#include <mtp/mtpprotocolconstants.h>
 #include <mtp/cmtptypeobjectpropdesc.h>
 #include <mtp/cmtptypestring.h>
 
 #include "cabstractmediamtpdataproviderdescriptionutility.h"
+#include "abstractmediamtpdataproviderconst.h"
 #include "mmmtpdpconfig.h"
 #include "mmmtpdplogger.h"
 
@@ -67,20 +69,156 @@
 // Construct media dp specific property description.
 // -----------------------------------------------------------------------------
 //
-CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewSpecificPropDescL( TUint /*aFormatCode*/,
+CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewSpecificPropDescL( TUint aFormatCode,
     TUint16 aPropCode )
     {
     CMTPTypeObjectPropDesc* propertyDesc = NULL;
-
-    switch ( aPropCode )
+    if( aFormatCode == EMTPFormatCodeAbstractAudioAlbum )
         {
-        // format specific
-        // May need add implementation here for further extension.
-        default:
-            // Do nothing now.
-            break;
+        switch ( aPropCode )
+            {
+            case EMTPObjectPropCodeRepresentativeSampleFormat:
+                propertyDesc = NewRepresentativeSampleFormatL();                   
+                break;
+    
+            case EMTPObjectPropCodeRepresentativeSampleSize:
+                propertyDesc = NewRepresentativeSampleSizeL();
+                break;
+    
+            case EMTPObjectPropCodeRepresentativeSampleHeight:
+                propertyDesc = NewRepresentativeSampleHeightL();
+                break;
+    
+            case EMTPObjectPropCodeRepresentativeSampleWidth:
+                propertyDesc = NewRepresentativeSampleWidthL();
+                break;
+    
+            case EMTPObjectPropCodeRepresentativeSampleData:
+                propertyDesc = NewRepresentativeSampleDataL();
+                break;
+            default:
+                // do nothing
+                break;
+            }
         }
     return propertyDesc;
     }
 
+// -----------------------------------------------------------------------------
+// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleFormatL
+// 
+// -----------------------------------------------------------------------------
+//
+CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleFormatL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* form =
+        CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT16 );
+    CleanupStack::PushL( form ); // + form
+
+    TInt numValues = sizeof ( TMmMtpSupportedSampleFormat ) / sizeof ( TMmMtpSupportedSampleFormat[0] );
+    for ( TInt i = 0; i < numValues; i++ )
+        {
+        TMTPTypeUint16 data( TMmMtpSupportedSampleFormat[i] );
+        form->AppendSupportedValueL( data );
+        }
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeUINT16;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::EEnumerationForm;
+    propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly;
+    CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleFormat,
+        propertyInfo,
+        form );
+    CleanupStack::PopAndDestroy( form ); // - form
+    return propertyDesc;
+    }
+
+// -----------------------------------------------------------------------------
+// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleSizeL
+// 
+// -----------------------------------------------------------------------------
+//
+CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleSizeL()
+    {
+    CMTPTypeObjectPropDescRangeForm* form =
+        CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form
+
+    // Set expected values
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPMinSampleSize );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPMaxSampleSize );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPStepSampleSize );
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeUINT32;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm;
+    propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly;
+    CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleSize,
+        propertyInfo,
+        form );
+    CleanupStack::PopAndDestroy( form ); // - form
+    return propertyDesc;
+    }
+
+// -----------------------------------------------------------------------------
+// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleHeightL
+// 
+// -----------------------------------------------------------------------------
+//
+CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleHeightL()
+    {
+    CMTPTypeObjectPropDescRangeForm* form =
+        CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form
+
+    // Set expected values
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPSampleMinHeight );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPSampleMaxHeight );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPSampleStepHeight );
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeUINT32;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm;
+    propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly;
+    CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleHeight,
+        propertyInfo,
+        form );
+    CleanupStack::PopAndDestroy( form ); // - form
+    return propertyDesc;
+    }
+
+// -----------------------------------------------------------------------------
+// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleWidthL
+// 
+// -----------------------------------------------------------------------------
+//
+CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleWidthL()
+    {
+    CMTPTypeObjectPropDescRangeForm* form =
+        CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form
+
+    // Set expected values
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPSampleMinWidth );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPSampleMaxWidth );
+    form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPSampleStepWidth );
+
+    CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
+    propertyInfo.iDataType = EMTPTypeUINT32;
+    propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm;
+    propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly;
+    CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleWidth,
+        propertyInfo,
+        form );
+    CleanupStack::PopAndDestroy( form ); // - form
+    return propertyDesc;
+    }
+
+// -----------------------------------------------------------------------------
+// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleDataL
+// 
+// -----------------------------------------------------------------------------
+//
+CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleDataL() 
+    {
+    return CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleData );
+    }
+
 // end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -81,7 +81,8 @@
     iStorages( KAbstractMediaDpArrayGranularity ),
     iAbstractMedias( NULL ),
     iCount( 0 ),
-    iCurrentIndex( 0 )
+    iCurrentIndex( 0 ),
+    iEnumState ( EEnumPlaylist )
     {
     PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::CAbstractMediaMtpDataProviderEnumerator, iDataProviderId = %d" ), iDataProviderId );
     }
@@ -180,124 +181,129 @@
 
     // keep in mind for notification when enumeration complete
     iStorageId = aStorageId;
-
+    iEnumState = EEnumPlaylist;
     if ( iStorages.Count() > 0 )
         {
-        ScanStorageL( iStorages[0] );
+        InitStorageL();
         }
-    else
-        {
-        iStorages.Reset();
-        SignalCompleteL( iDataProvider );
-        }
+    ScanNextL();
 
     PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::StartL" ) );
     }
 
 // -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderEnumerator::ScanStorageL
-// Find out all AbstractMedia file according to storage id
+// CAbstractMediaMtpDataProviderEnumerator::InitStorageL
+// Initialize iAbstractMedia, iCount and iCurrentIndex according to iStorages and iEnumState
 // -----------------------------------------------------------------------------
 //
-void CAbstractMediaMtpDataProviderEnumerator::ScanStorageL( TUint32 aStorageId )
+void CAbstractMediaMtpDataProviderEnumerator::InitStorageL()
     {
-    PRINT1( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::ScanStorageL aStorageId = 0x%x" ), aStorageId );
+    __ASSERT_DEBUG(iStorages.Count() > 0 && iEnumState < EEnumCount, User::Invariant() );
+    PRINT2( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::InitStorageL storageId = 0x%x, state=%d" ), iStorages[0], iEnumState );
     const CMTPStorageMetaData& storage(
-        iFramework.StorageMgr().StorageL( aStorageId ) );
+        iFramework.StorageMgr().StorageL( iStorages[0] ) );
 
     __ASSERT_DEBUG( ( storage.Uint( CMTPStorageMetaData::EStorageSystemType ) ==
         CMTPStorageMetaData::ESystemTypeDefaultFileSystem ), User::Invariant() );
 
     TFileName root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) );
-    PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::ScanStorageL StorageSuid = %S" ), &root );
+    PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::InitStorageL StorageSuid = %S" ), &root );
 
-    // created by windows media player, or else return responsecode is Access denied
-    // Create playlist directory if it does not exist
-    // NOTE: Only playlist need to create directory here, for the dummy files
-    HBufC* tempBuf = HBufC::NewLC( KMaxFileName );  // + tempBuf
-    TPtr folder = tempBuf->Des();
-    folder.Zero();
-    folder.Append( root );
-    folder.Append( KPlaylistFilePath );
-    TBool ret = BaflUtils::FileExists( iFramework.Fs(), folder );
-    PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::ScanStorageL ret = %d, folder = %S" ), ret, &folder );
-    if( !ret )
+    if ( iEnumState == EEnumPlaylist )
         {
-        TInt err = iFramework.Fs().MkDirAll( folder );
-        PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::ScanStorageL Creating folder (%S) returned error %d" ), tempBuf, err );
+        // created by windows media player, or else return responsecode is Access denied
+        // Create playlist directory if it does not exist
+        // NOTE: Only playlist need to create directory here, for the dummy files
+        HBufC* tempBuf = HBufC::NewLC( KMaxFileName );  // + tempBuf
+        TPtr folder = tempBuf->Des();
+        folder.Zero();
+        folder.Append( root );
+        folder.Append( KPlaylistFilePath );
+        TBool ret = BaflUtils::FileExists( iFramework.Fs(), folder );
+        PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::InitStorageL ret = %d, folder = %S" ), ret, &folder );
+        if( !ret )
+            {
+            TInt err = iFramework.Fs().MkDirAll( folder );
+            PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::InitStorageL Creating folder (%S) returned error %d" ), tempBuf, err );
 
-        // add this new folder to framework metadata DB
-        CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC( 0, // Dev Dp hard code
-                EMTPFormatCodeAssociation,
-                aStorageId,
-                folder );  // + object
-        object->SetUint( CMTPObjectMetaData::EParentHandle, KMTPHandleNoParent );
-        object->SetUint( CMTPObjectMetaData::EFormatSubCode, EMTPAssociationTypeGenericFolder );
-        PERFLOGSTART( KObjectManagerInsert );
-        iObjectMgr.InsertObjectL( *object );
-        PERFLOGSTOP( KObjectManagerInsert );
-        CleanupStack::PopAndDestroy( object ); // - object
+            // add this new folder to framework metadata DB
+            CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC( 0, // Dev Dp hard code
+                    EMTPFormatCodeAssociation,
+                    iStorages[0],
+                    folder );  // + object
+            object->SetUint( CMTPObjectMetaData::EParentHandle, KMTPHandleNoParent );
+            object->SetUint( CMTPObjectMetaData::EFormatSubCode, EMTPAssociationTypeGenericFolder );
+            PERFLOGSTART( KObjectManagerInsert );
+            iObjectMgr.InsertObjectL( *object );
+            PERFLOGSTOP( KObjectManagerInsert );
+            CleanupStack::PopAndDestroy( object ); // - object
+            }
+        CleanupStack::PopAndDestroy( tempBuf ); // - tempBuf
         }
-    CleanupStack::PopAndDestroy( tempBuf ); // - tempBuf
 
     // find all abstract medias stored in MPX
     delete iAbstractMedias;
     iAbstractMedias = NULL;
+    TMPXGeneralCategory category = ( iEnumState == EEnumPlaylist ) ? EMPXPlaylist : EMPXAbstractAlbum;
     PERFLOGSTART( KMpxGetAllAbstractMedia );
-    TRAPD( err, iDataProvider.GetWrapperL().GetAllAbstractMediaL( root, &iAbstractMedias, EMPXPlaylist  ) );
+    TRAPD( err, iDataProvider.GetWrapperL().GetAllAbstractMediaL( root, &iAbstractMedias, category  ) );
     PERFLOGSTOP( KMpxGetAllAbstractMedia );
 
     if ( iAbstractMedias != NULL && err == KErrNone )
         {
         iCount = iAbstractMedias->Count();
-        iCurrentIndex = 0;
-
-        TRequestStatus* status = &iStatus;
-        User::RequestComplete( status, iStatus.Int() );
-        SetActive();
         }
     else
         {
         iCount = 0;
-        iCurrentIndex = 0;
-        ScanNextL();
         }
+    iCurrentIndex = 0;
 
-    PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::ScanStorageL" ) );
+    PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::InitStorageL" ) );
     }
 
 // -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderEnumerator::ScanNextStorageL
-//
+// CAbstractMediaMtpDataProviderEnumerator::ScanNextL
+// Proceed to next abstract media item
 // -----------------------------------------------------------------------------
 //
 void CAbstractMediaMtpDataProviderEnumerator::ScanNextL()
     {
-    PRINT1( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::ScanNextL iStorages.Count = %d" ), iStorages.Count() );
-    if ( iCurrentIndex < iCount )
+    while (iStorages.Count() > 0)
         {
-        TRequestStatus* status = &iStatus;
-        User::RequestComplete( status, iStatus.Int() );
-        SetActive();
-
-        PRINT2( _L( "MM MTP <> Current storage is still being scanned, current index = %d, total AbstractMedia count = %d" ),
-            iCurrentIndex,
-            iCount );
+        while ( iEnumState < EEnumCount )
+            {
+            if ( iCurrentIndex < iCount )
+                {
+                TRequestStatus* status = &iStatus;
+                User::RequestComplete( status, iStatus.Int() );
+                SetActive();
+                PRINT2( _L( "MM MTP <> Current storage is still being scanned, current index = %d, total AbstractMedia count = %d" ),
+                    iCurrentIndex,
+                    iCount );
+                return;
+                }
+            ++iEnumState;
+            if (iEnumState == EEnumCount)
+                {
+                break;
+                }
+            InitStorageL();
+            }
+        iStorages.Remove( 0 );
+        if (iStorages.Count() == 0)
+            {
+            break;
+            }
+        iEnumState = EEnumPlaylist;
+        InitStorageL();
         }
-    // If there are one or more unscanned storages left
-    // (the currently scanned one is still on the list)
-    else if ( iStorages.Count() > 1 )
-        {
-        iStorages.Remove( 0 );
-        ScanStorageL( iStorages[0] );
-        }
-    else
-        {
-        // We are done
-        PRINT( _L( "MM MTP <> Objects enumeration completed 2" ) );
-        iStorages.Reset();
-        SignalCompleteL( iDataProvider );
-        }
+    // We are done
+    PRINT( _L( "MM MTP <> Objects enumeration completed" ) );
+    delete iAbstractMedias;
+    iAbstractMedias = NULL;
+    iStorages.Reset();
+    SignalCompleteL( iDataProvider );
     }
 
 // -----------------------------------------------------------------------------
@@ -314,23 +320,35 @@
     
     // Increase the index first in case of leave
     iCurrentIndex++;
-
-    HBufC* abstractMedia = iDataProvider.GetWrapperL().GetAbstractMediaNameL( media, EMPXPlaylist );
+    TMPXGeneralCategory category = ( iEnumState == EEnumPlaylist ) ? EMPXPlaylist : EMPXAbstractAlbum;
+    HBufC* abstractMedia = iDataProvider.GetWrapperL().GetAbstractMediaNameL( media, category );
     CleanupStack::PushL( abstractMedia ); // + abstractMedia
-    AddEntryL( *abstractMedia );
-
-    // find all reference of each abstract media
-    CDesCArray* references = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity );
-    CleanupStack::PushL( references ); // + references
+    TBool ret = ETrue;
+    if ( iEnumState == EEnumAbstractAlbum )
+        {
+        //The abstract album may be removed, check it first
+        ret = BaflUtils::FileExists( iFramework.Fs(), *abstractMedia );
+        PRINT2( _L( "MM MTP <> BaflUtils::FileExists( RFs,%S ) ret = %d" ), abstractMedia, ret );
+        }
 
-    PERFLOGSTART( KMpxQueryAbstractMediaReference );
-    iDataProvider.GetWrapperL().GetAllReferenceL( media, *references );
-    PERFLOGSTOP( KMpxQueryAbstractMediaReference );
+    if ( ret )
+        {
+        PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::RunL abstractMedia=%S" ), abstractMedia );
+        AddEntryL( *abstractMedia );
 
-    // insert references into reference db
-    AddReferencesL( *abstractMedia, *references );
-
-    CleanupStack::PopAndDestroy( references ); // - references
+        // find all reference of each abstract media
+        CDesCArray* references = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity );
+        CleanupStack::PushL( references ); // + references
+    
+        PERFLOGSTART( KMpxQueryAbstractMediaReference );
+        iDataProvider.GetWrapperL().GetAllReferenceL( media, *references );
+        PERFLOGSTOP( KMpxQueryAbstractMediaReference );
+    
+        // insert references into reference db
+        AddReferencesL( *abstractMedia, *references );
+    
+        CleanupStack::PopAndDestroy( references ); // - references
+        }     
     CleanupStack::PopAndDestroy( abstractMedia ); // - abstractMedia
 
     ScanNextL();
@@ -392,6 +410,7 @@
     PERFLOGSTART( KObjectManagerObjectUid );
     TUint32 parentHandle = iFramework.ObjectMgr().HandleL( parser.DriveAndPath() );
     PERFLOGSTOP( KObjectManagerObjectUid );
+
     object->SetUint( CMTPObjectMetaData::EParentHandle, parentHandle );
 
     PERFLOGSTART( KObjectManagerInsert );
@@ -400,10 +419,14 @@
 
     CleanupStack::PopAndDestroy( object );// - object
 
-    iDataProvider.GetWrapperL().CreateDummyFile( aSuid );
+    //Only remember the playlist file for clean up
+    if( iEnumState == EEnumPlaylist )
+        {
+        iDataProvider.GetWrapperL().CreateDummyFile( aSuid );
 
-    // remember the abstract media file for clean up
-    iDataProvider.GetWrapperL().AddDummyFileL( aSuid );
+        // remember the abstract media file for clean up
+        iDataProvider.GetWrapperL().AddDummyFileL( aSuid );
+        }
 
     PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::AddEntryL" ) );
     }
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectproplist.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectproplist.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,6 +16,10 @@
 */
 
 
+#include <mtp/cmtptypeobjectproplist.h>
+#include <mtp/cmtptypearray.h>
+#include <f32file.h>
+
 #include "cabstractmediamtpdataprovidergetobjectproplist.h"
 #include "abstractmediamtpdataproviderconst.h"
 #include "mmmtpdplogger.h"
@@ -81,15 +85,70 @@
 // do nothing here, just leave, as this should never be invoked or invalid propcode
 // -----------------------------------------------------------------------------
 //
-TInt CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL( TUint16 /*aPropCode*/,
-    TUint32 /*aHandle*/ )
+TInt CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL( TUint16 aPropCode,
+    TUint32 aHandle )
     {
-    PRINT( _L( "MM MTP <> CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL, leave with KErrNotSupported" ) );
+    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL" ) );
+    TInt err = KErrNone;
+    switch ( aPropCode )
+        {
+        case EMTPObjectPropCodeRepresentativeSampleFormat:
+            {
+            iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) );
+            iPropertyElement->SetUint16L( CMTPTypeObjectPropListElement::EValue, 0 );
+            }
+            break;
+        case EMTPObjectPropCodeRepresentativeSampleSize:
+        case EMTPObjectPropCodeRepresentativeSampleHeight:
+        case EMTPObjectPropCodeRepresentativeSampleWidth:
+            {
+            iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) );
+            iPropertyElement->SetUint32L( CMTPTypeObjectPropListElement::EValue, 0 );
+            }
+            break;
+        case EMTPObjectPropCodeRepresentativeSampleData:
+            {
+            const TDesC& suid( iObject->DesC( CMTPObjectMetaData::ESuid ) );
+            CMTPTypeArray* desData = CMTPTypeArray::NewLC( EMTPTypeAUINT8 );    // + desData
+
+            RFile sampleFile;
+            TInt err = sampleFile.Open( iFramework.Fs(), suid, EFileShareReadersOnly );
+            PRINT2( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData open filename=%S, err=%d" ), &suid, err );
 
-    // Do nothing now.
-    // May need add implementation here for further extension.
+            CleanupClosePushL( sampleFile );    // + sampleFile
+            TInt size = 0;
+            if( err == KErrNone )
+                {
+                err = sampleFile.Size( size );
+                }
+            PRINT2( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData sampleFile.Size size=%d, err=%d" ), size, err );
+            if( err == KErrNone && size > 0 )
+                {
+                HBufC8* sampleData = HBufC8::NewLC( size * sizeof( TUint8 ) );    // + sampleData
+                TPtr8 samplePtr = sampleData->Des();
+                err = sampleFile.Read( samplePtr );
+                PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData sampleFile.Read err=%d" ), err );
+                PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData samplePtr.Size=%d" ), samplePtr.Size() );
+                if( err == KErrNone )
+                    {
+                    desData->SetByDesL( samplePtr );
+                    }
+                CleanupStack::PopAndDestroy( sampleData );    // - sampleData
+                }
+            iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode));
+            iPropertyElement->SetArrayL( CMTPTypeObjectPropListElement::EValue, *desData );
 
-    return KErrNotSupported;
+            CleanupStack::PopAndDestroy( &sampleFile );    // - sampleFile
+            CleanupStack::PopAndDestroy( desData );        // - desData
+            }
+            break;
+
+        default:
+            err = KErrNotSupported;
+        }
+
+    PRINT1( _L( "MM MTP <= CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL, err = %d" ), err );
+    return err;
     }
 
 // end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectpropvalue.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectpropvalue.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,6 +16,9 @@
 */
 
 
+#include <mtp/cmtptypearray.h>
+#include <f32file.h>
+
 #include "cabstractmediamtpdataprovidergetobjectpropvalue.h"
 #include "abstractmediamtpdataproviderconst.h"
 #include "mmmtpdplogger.h"
@@ -81,13 +84,64 @@
 // invoked or invalid propcode
 // -----------------------------------------------------------------------------
 //
-void CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 /*aPropCode*/ )
+void CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 aPropCode )
     {
-    PRINT( _L( "MM MTP <> CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL, leave with KErrNotSupported"));
+    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL" ) );
+    switch ( aPropCode )
+        {
+        case EMTPObjectPropCodeRepresentativeSampleFormat:
+            {
+            iMTPTypeUint16.Set( 0 );
+            SendDataL( iMTPTypeUint16 );
+            }
+            break;
+
+        case EMTPObjectPropCodeRepresentativeSampleSize: // fall through
+        case EMTPObjectPropCodeRepresentativeSampleHeight: // fall through
+        case EMTPObjectPropCodeRepresentativeSampleWidth:
+            {
+            iMTPTypeUint32.Set( 0 );
+            SendDataL( iMTPTypeUint32 );
+            }
+            break;
 
-    // May need add implementation here for further extension.
+        case EMTPObjectPropCodeRepresentativeSampleData:
+            {
+            if ( iMTPTypeArray != NULL )
+                {
+                delete iMTPTypeArray;
+                iMTPTypeArray = NULL;
+                }
+            iMTPTypeArray = CMTPTypeArray::NewL( EMTPTypeAUINT8 );
+
+            const TDesC& suid = iObjectInfo->DesC( CMTPObjectMetaData::ESuid );
+            PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData file suid=%S" ), &suid );
+            RFile sampleFile;
+            User::LeaveIfError( sampleFile.Open( iFramework.Fs(), suid, EFileShareReadersOnly ) );
+            CleanupClosePushL( sampleFile );    // + sampleFile
+
+            TInt size = 0;
+            User::LeaveIfError( sampleFile.Size( size ) );
+            PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData sampleFile.Size() size=%d" ), size );
 
-    User::Leave( KErrNotSupported );
+            if( size > 0 )
+                {
+                HBufC8* sampleData = HBufC8::NewLC( size * sizeof(TUint8) );    // + sampleData
+                TPtr8 samplePtr = sampleData->Des();
+                User::LeaveIfError( sampleFile.Read( samplePtr ) );
+                iMTPTypeArray->SetByDesL( samplePtr );
+                CleanupStack::PopAndDestroy( sampleData );    // - sampleData
+                }
+            CleanupStack::PopAndDestroy( &sampleFile );    // - sampleFile
+
+            SendDataL( *iMTPTypeArray );
+            }
+            break;
+
+        default:
+            PRINT( _L( "MM MTP <> CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL, leave with KErrNotSupported"));
+            User::Leave( KErrNotSupported );
+        }
     }
 
 // end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderpropertysettingutility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderpropertysettingutility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -17,6 +17,8 @@
 
 #include <mtp/cmtptypeobjectproplist.h>
 #include <mtp/mtpprotocolconstants.h>
+#include <mtp/mtpdatatypeconstants.h>
+#include <mtp/cmtptypearray.h>
 
 #include "cabstractmediamtpdataproviderpropertysettingutility.h"
 #include "mmmtpdplogger.h"
@@ -54,17 +56,40 @@
     // Do nothing
     }
 
-TMTPResponseCode CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL( MMmMtpDpConfig& /*aDpConfig*/,
-    TUint16 /*aPropCode*/,
-    const CMTPObjectMetaData& /*aObject*/,
-    const CMTPTypeObjectPropListElement& /*aElement*/ )
+TMTPResponseCode CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL( MMmMtpDpConfig& aDpConfig,
+    TUint16 aPropCode,
+    const CMTPObjectMetaData& aObject,
+    const CMTPTypeObjectPropListElement& aElement )
     {
     PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL" ) );
 
-    // Do nothing now.
-    // May need add implementation here for further extension.
+    TMTPResponseCode responseCode = EMTPRespCodeOK;
+
+    switch ( aPropCode )
+        {
+        case EMTPObjectPropCodeRepresentativeSampleData:
+            {
+            CMTPTypeArray*  desData = CMTPTypeArray::NewLC( EMTPTypeAUINT8 );
+            desData->SetByDesL( aElement.ArrayL( CMTPTypeObjectPropListElement::EValue ) );
+            responseCode = SetMetaDataToWrapper( aDpConfig, aPropCode, *desData, aObject );
+            CleanupStack::PopAndDestroy( desData );
+            }
+            break;
 
-    return EMTPRespCodeOK;
+        case EMTPObjectPropCodeRepresentativeSampleFormat:
+        case EMTPObjectPropCodeRepresentativeSampleSize: 
+        case EMTPObjectPropCodeRepresentativeSampleHeight:
+        case EMTPObjectPropCodeRepresentativeSampleWidth:
+            // no place to store, do nothing. reserve here for future usage
+            break;
+
+        default:
+            // Should not happen, property code should have been checked before set to store.
+            User::Leave( KErrNotSupported );
+        }
+
+    PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL" ) );
+    return responseCode;
     }
 
 // end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderrenameobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderrenameobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -17,10 +17,9 @@
 
 
 #include <badesca.h>
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
+#include <mtp/tmtptypeuint32.h>
 #include <mtp/cmtpobjectmetadata.h>
-#include <mtp/tmtptypeuint32.h>
 
 #include "cabstractmediamtpdataproviderrenameobject.h"
 #include "mmmtpdplogger.h"
@@ -92,7 +91,7 @@
         }
     else
         {
-        TRAPD( err, iWrapper.RenameObjectL( iOldFileName, iFileName ) );
+        TRAPD( err, iWrapper.RenameObjectL( *iObjectInfo, iFileName ) );
 
          // should not fail for 1 file, keep it going, as folder already renamed
          if ( err != KErrNone )
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectpropvalue.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectpropvalue.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,6 +16,8 @@
 */
 
 
+#include <mtp/cmtptypearray.h>
+
 #include "cabstractmediamtpdataprovidersetobjectpropvalue.h"
 #include "abstractmediamtpdataproviderconst.h"
 #include "mmmtpdplogger.h"
@@ -81,9 +83,22 @@
 // invalid propcode
 // -----------------------------------------------------------------------------
 //
-TBool CAbstractMediaMtpDataProviderSetObjectPropValue::IsSpecificPropCodeReadOnly( TUint16 /*aPropCode*/ ) const
+TBool CAbstractMediaMtpDataProviderSetObjectPropValue::IsSpecificPropCodeReadOnly( TUint16 aPropCode ) const
     {
-    return EFalse;
+    TBool ret = EFalse;
+    switch ( aPropCode )
+        {
+        case EMTPObjectPropCodeRepresentativeSampleFormat:
+        case EMTPObjectPropCodeRepresentativeSampleSize:
+        case EMTPObjectPropCodeRepresentativeSampleHeight:
+        case EMTPObjectPropCodeRepresentativeSampleWidth:
+            ret = ETrue;
+            break;
+        default:
+            ret = EFalse;
+            break;
+        }
+    return ret;
     }
 
 // -----------------------------------------------------------------------------
@@ -92,14 +107,24 @@
 // invalid propcode
 // -----------------------------------------------------------------------------
 //
-void CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL( TUint16 /*aPropCode*/ )
+void CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL( TUint16 aPropCode )
     {
-    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL leave with KErrNotSupported" ) );
+    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL" ) );
+    if ( aPropCode == EMTPObjectPropCodeRepresentativeSampleData )
+        {
+        delete iMTPTypeArray;
+        iMTPTypeArray = NULL;
 
-    // Do nothing now.
-    // May need add implementation here for further extension.
-
-    User::Leave( KErrNotSupported );
+        iMTPTypeArray = CMTPTypeArray::NewL( EMTPTypeAUINT8 );
+        ReceiveDataL( *iMTPTypeArray );
+        }
+    else
+        {
+        PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL leave with KErrNotSupported" ) );
+        // Do nothing now.
+        // May need add implementation here for further extension.
+        User::Leave( KErrNotSupported );
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -108,15 +133,26 @@
 // invalid propcode
 // -----------------------------------------------------------------------------
 //
-TMTPResponseCode CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 /*aPropCode*/ )
+TMTPResponseCode CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 aPropCode )
     {
-    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL leave with KErrNotSupported" ) );
+    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL" ) );
+    TMTPResponseCode responseCode = EMTPRespCodeOK;
 
-    // Do nothing now.
-    // May need add implementation here for further extension.
-    User::Leave( KErrNotSupported );
-
-    return EMTPRespCodeOK;
+    if ( aPropCode == EMTPObjectPropCodeRepresentativeSampleData )
+        {
+        responseCode = ServiceMetaDataToWrapperL( aPropCode,
+            *iMTPTypeArray,
+            *iObjectInfo );
+        }
+    else
+        {
+        PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL leave with KErrNotSupported" ) );
+        // Do nothing now.
+        // May need add implementation here for further extension.
+        User::Leave( KErrNotSupported );
+        }
+    PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL" ) );
+    return responseCode;
     }
 
 // end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectreferences.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
-* 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:  Implement the operation: SetObjectReferences
-*
-*/
-
-
-#include "cabstractmediamtpdataprovidersetobjectreferences.h"
-#include "abstractmediamtpdataproviderconst.h"
-#include "cmmmtpdpmetadataaccesswrapper.h"
-#include "mmmtpdplogger.h"
-
-// -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderSetObjectReferences::NewL
-// Two-phase construction method
-// -----------------------------------------------------------------------------
-//
-MMmRequestProcessor* CAbstractMediaMtpDataProviderSetObjectReferences::NewL( MMTPDataProviderFramework& aFramework,
-    MMTPConnection& aConnection,
-    MMmMtpDpConfig& aDpConfig )
-    {
-    CAbstractMediaMtpDataProviderSetObjectReferences* self =
-        new ( ELeave ) CAbstractMediaMtpDataProviderSetObjectReferences( aFramework,
-            aConnection,
-            aDpConfig );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderSetObjectReferences::ConstructL
-// Two-phase construction method
-// -----------------------------------------------------------------------------
-//
-void CAbstractMediaMtpDataProviderSetObjectReferences::ConstructL()
-    {
-    // Do nothing
-    }
-
-// -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderSetObjectReferences::~CAbstractMediaMtpDataProviderSetObjectReferences
-// Destructor
-// -----------------------------------------------------------------------------
-//
-CAbstractMediaMtpDataProviderSetObjectReferences::~CAbstractMediaMtpDataProviderSetObjectReferences()
-    {
-    // Do nothing
-    }
-
-// -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderSetObjectReferences::CAbstractMediaMtpDataProviderSetObjectReferences
-// Standard c++ constructor
-// -----------------------------------------------------------------------------
-//
-CAbstractMediaMtpDataProviderSetObjectReferences::CAbstractMediaMtpDataProviderSetObjectReferences( MMTPDataProviderFramework& aFramework,
-    MMTPConnection& aConnection,
-    MMmMtpDpConfig& aDpConfig ) :
-        CSetObjectReferences( aFramework, aConnection, aDpConfig )
-    {
-    // Do nothing
-    }
-
-// -----------------------------------------------------------------------------
-// CAbstractMediaMtpDataProviderSetObjectReferences::DoSetObjectReferencesL
-// set references to DB
-// -----------------------------------------------------------------------------
-//
-void CAbstractMediaMtpDataProviderSetObjectReferences::DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper,
-    TUint16 aObjectFormat,
-    const TDesC& aSrcFileName,
-    CDesCArray& aRefFileArray )
-    {
-    TInt count = sizeof( KAbstractMediaMtpDataProviderSupportedFormats ) / sizeof (TUint16);
-    TBool supported = EFalse;
-
-    for ( TInt i = 0; i < count; i++ )
-        {
-        if( KAbstractMediaMtpDataProviderSupportedFormats[i] == aObjectFormat )
-            {
-            supported = ETrue;
-            break;
-            }
-        }
-
-    if ( supported )
-        {
-        aWrapper.SetAbstractMediaL( aSrcFileName, aRefFileArray, EMPXPlaylist );
-        }
-    }
-
-// end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h	Wed Mar 31 22:26:09 2010 +0300
@@ -78,21 +78,21 @@
 enum TMmMtpWidthRange
     {
     EMTPMinWidth  = 0x000000b0,  // 176 pixels
-    EMTPMaxWidth  = 0x00000500,  // 1280 pixels
+    EMTPMaxWidth  = 0x00000500,  // 1280 pixels, standard for 720p content
     EMTPStepWidth = 0x00000001,
     };
 
 enum TMmMtpHeightRange
     {
     EMTPMinHeight  = 0x00000090,  // 144 pixels
-    EMTPMaxHeight  = 0x000002D0,  // 720 pixels
+    EMTPMaxHeight  = 0x000002D0,  // 720 pixels, standard for 720p content
     EMTPStepHeight = 0x00000001,
     };
 
 enum TMmMtpVideoBitRateRange
     {
     EMTPWMVMinBitrate  = 0x00000000,
-    EMTPWMVMaxBitrate  = 0x01312D00,        // 20 Mbps
+    EMTPWMVMaxBitrate  = 0x01312D00,        // 20 Mbps, recommanded by Helix team
     EMTPVideoBitrateStep = 0x00000001
     };
 
@@ -111,7 +111,7 @@
 enum TMmMtpFramesPerThousandSecondsRange
     {
     EMTPMinFramesPerThousandSeconds  = 0x00000000,
-    EMTPMaxFramesPerThousandSeconds  = 0x00007530,  // 30000 frame per thousand seconds (30 frame/s)
+    EMTPMaxFramesPerThousandSeconds  = 0x00007530,  // 30000 frame per ms (30 frame/s), standard for progressive content
     EMTPStepFramesPerThousandSeconds = 0x00000001
     };
 
@@ -195,6 +195,7 @@
     EMTPObjectPropCodeNumberOfChannels,
     EMTPObjectPropCodeAudioWAVECodec,
     EMTPObjectPropCodeAudioBitRate,
+    EMTPObjectPropCodeAlbumArtist
     };
 
 // Additional for audio formats
@@ -215,7 +216,6 @@
     EMTPObjectPropCodeHeight,
     EMTPObjectPropCodeDuration,
     EMTPObjectPropCodeGenre,
-    EMTPObjectPropCodeUseCount,
     EMTPObjectPropCodeSampleRate,
     EMTPObjectPropCodeNumberOfChannels,
     EMTPObjectPropCodeScanType,
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderprocessor.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderprocessor.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,16 +19,14 @@
 #ifndef MEDIAMTPDATAPROVIDERPROCESSOR_H
 #define MEDIAMTPDATAPROVIDERPROCESSOR_H
 
-#include "crequestprocessor.h"
-
 // class forward
 class MMTPConnection;
 class TMTPTypeRequest;
 class CMTPDataProviderPlugin;
-class MMTPDataProviderFramework;
 class MMTPRequestProcessor;
 class CMediaMtpDataProvider;
 class MMmMtpDpConfig;
+class MMmRequestProcessor;
 
 typedef MMmRequestProcessor* ( *TMediaMtpDataProviderRequestProcessorCreateFunc )(
     MMTPDataProviderFramework& aFramework,
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovider.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovider.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -25,6 +25,7 @@
 #include <driveinfo.h>
 
 #include "cmediamtpdataprovider.h"
+#include "crequestprocessor.h"
 #include "mediamtpdataproviderconst.h"
 #include "cmediamtpdataproviderenumerator.h"
 #include "mmmtpdplogger.h"
@@ -130,7 +131,7 @@
 
     iMediaEnumerator = CMediaMtpDataProviderEnumerator::NewL( Framework(), *this );
 
-    CMmMtpDpAccessSingleton::CreateL( Framework().Fs(), Framework() );
+    CMmMtpDpAccessSingleton::CreateL( Framework() );
 
     GetSupportedFormatL();
     GetSupportedPropL();
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidercopyobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidercopyobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypeobjectproplist.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
@@ -172,7 +171,6 @@
         case EMTPObjectPropCodeWidth:
         case EMTPObjectPropCodeHeight:
         case EMTPObjectPropCodeDuration:
-        case EMTPObjectPropCodeUseCount:
         case EMTPObjectPropCodeSampleRate:
         case EMTPObjectPropCodeAudioWAVECodec:
         case EMTPObjectPropCodeAudioBitRate:
@@ -217,6 +215,7 @@
             break;
         }
 
+    // centralize logic to handle error, doing so, that's on need to trap the
     // Ignore all errors came from mpx db.
     // It's enough that only file copied successfully no matter metadata got whatever failure.
     if ( err != KErrNone )
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -120,7 +120,6 @@
         case EMTPObjectPropCodeArtist: // Artist
         case EMTPObjectPropCodeTrack: // Track
         case EMTPObjectPropCodeGenre: // Genre
-        case EMTPObjectPropCodeUseCount: // Use Count
         case EMTPObjectPropCodeAlbumName: // Album Name
         case EMTPObjectPropCodeAlbumArtist: // Album Artist
         case EMTPObjectPropCodeOriginalReleaseDate: // Original Release Date
@@ -531,16 +530,17 @@
     CMTPTypeObjectPropDescEnumerationForm* expectedForm =
         CMTPTypeObjectPropDescEnumerationForm::NewLC( EMTPTypeString ); // + expectedForm
 
-    CMTPTypeString* string = CMTPTypeString::NewLC( _L("SP@LL") );    // + string
+    CMTPTypeString* string = CMTPTypeString::NewLC( _L( "SP@LL" ) );    // + string
     expectedForm->AppendSupportedValueL( *string );
-    string->SetL( _L("SP@ML") );
+    string->SetL( _L("SP@ML"));
     expectedForm->AppendSupportedValueL( *string );
-    string->SetL( _L("MP@LL") );
+    string->SetL( _L("MP@LL"));
     expectedForm->AppendSupportedValueL( *string );
 
-    string->SetL( _L("MP@ML") );
+    // newly added to support 720p content as suggested by Helix team
+    string->SetL( _L("MP@ML"));
     expectedForm->AppendSupportedValueL( *string );
-    string->SetL( _L("MP@HL") );
+    string->SetL( _L("MP@HL"));
     expectedForm->AppendSupportedValueL( *string );
 
     CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectproplist.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectproplist.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypeobjectproplist.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
@@ -156,7 +155,6 @@
         case EMTPObjectPropCodeWidth:
         case EMTPObjectPropCodeHeight:
         case EMTPObjectPropCodeDuration:
-        case EMTPObjectPropCodeUseCount:
         case EMTPObjectPropCodeSampleRate:
         case EMTPObjectPropCodeAudioWAVECodec:
         case EMTPObjectPropCodeAudioBitRate:
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropvalue.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropvalue.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
 
@@ -120,7 +119,6 @@
         case EMTPObjectPropCodeWidth: // 0xDC87
         case EMTPObjectPropCodeHeight: // 0xDC88
         case EMTPObjectPropCodeDuration: // 0xDC89
-        case EMTPObjectPropCodeUseCount: // 0xDC91
         case EMTPObjectPropCodeSampleRate: // 0xDE93
         case EMTPObjectPropCodeAudioWAVECodec: // 0xDE99
         case EMTPObjectPropCodeAudioBitRate: // 0xDE9A
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidermoveobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidermoveobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -15,7 +15,7 @@
  *
  */
 
-#include <mtp/mmtpdataproviderframework.h>
+
 #include <mtp/cmtptypeobjectproplist.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
@@ -184,7 +184,6 @@
         case EMTPObjectPropCodeWidth:
         case EMTPObjectPropCodeHeight:
         case EMTPObjectPropCodeDuration:
-        case EMTPObjectPropCodeUseCount:
         case EMTPObjectPropCodeSampleRate:
         case EMTPObjectPropCodeAudioWAVECodec:
         case EMTPObjectPropCodeAudioBitRate:
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderpropertysettingutility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderpropertysettingutility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -22,6 +22,7 @@
 #include <mtp/tmtptypeuint16.h>
 #include <mtp/tmtptypeuint32.h>
 #include <mtp/mtpdatatypeconstants.h>
+#include <mtp/cmtpobjectmetadata.h>
 
 #include "tobjectdescription.h"
 #include "cmmmtpdpmetadataaccesswrapper.h"
@@ -118,7 +119,6 @@
         case EMTPObjectPropCodeWidth:
         case EMTPObjectPropCodeHeight:
         case EMTPObjectPropCodeDuration:
-        case EMTPObjectPropCodeUseCount:
         case EMTPObjectPropCodeSampleRate:
         case EMTPObjectPropCodeAudioWAVECodec:
         case EMTPObjectPropCodeAudioBitRate:
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidersetobjectpropvalue.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidersetobjectpropvalue.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
 #include <mtp/mmtpobjectmgr.h>
@@ -132,7 +131,6 @@
         case EMTPObjectPropCodeWidth: // 0xDC87
         case EMTPObjectPropCodeHeight: // 0xDC88
         case EMTPObjectPropCodeDuration: // 0xDC89
-        case EMTPObjectPropCodeUseCount: // 0xDC91
         case EMTPObjectPropCodeSampleRate: // 0xDE93
         case EMTPObjectPropCodeAudioWAVECodec: // 0xDE99
         case EMTPObjectPropCodeAudioBitRate: // 0xDE9A
@@ -185,7 +183,6 @@
         case EMTPObjectPropCodeWidth: //0xDC87
         case EMTPObjectPropCodeHeight: //0xDC88
         case EMTPObjectPropCodeDuration: //0xDC89
-        case EMTPObjectPropCodeUseCount: //0xDC91
         case EMTPObjectPropCodeSampleRate: //0xDE93
         case EMTPObjectPropCodeAudioWAVECodec: //0xDE99
         case EMTPObjectPropCodeAudioBitRate: //0xDE9A
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def	Wed Mar 31 22:26:09 2010 +0300
@@ -22,18 +22,18 @@
 	?NewL@CSetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 21 NONAME ; class MMmRequestProcessor * CSetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
 	?Release@CMmMtpDpAccessSingleton@@SAXXZ @ 22 NONAME ; void CMmMtpDpAccessSingleton::Release(void)
 	?UsbDisconnect@CSendObject@@MAEXXZ @ 23 NONAME ; void CSendObject::UsbDisconnect(void)
-	?DoSetObjectReferencesL@CSetObjectReferences@@MAEXAAVCMmMtpDpMetadataAccessWrapper@@GABVTDesC16@@AAVCDesC16Array@@@Z @ 24 NONAME ; void CSetObjectReferences::DoSetObjectReferencesL(class CMmMtpDpMetadataAccessWrapper &, unsigned short, class TDesC16 const &, class CDesC16Array &)
-	?ServiceL@CGetFormatCapabilities@@MAEXXZ @ 25 NONAME ; void CGetFormatCapabilities::ServiceL(void)
-	?GetAllReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXPAVCMPXMedia@@AAVCDesC16Array@@@Z @ 26 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllReferenceL(class CMPXMedia *, class CDesC16Array &)
-	??1CSetObjectPropList@@UAE@XZ @ 27 NONAME ; CSetObjectPropList::~CSetObjectPropList(void)
-	?ServiceL@CSetObjectPropList@@MAEXXZ @ 28 NONAME ; void CSetObjectPropList::ServiceL(void)
-	??0CMoveObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 29 NONAME ; CMoveObject::CMoveObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??0CRequestUnknown@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 30 NONAME ; CRequestUnknown::CRequestUnknown(class MMTPDataProviderFramework &, class MMTPConnection &)
-	?ConstructL@CGetObjectPropList@@IAEXXZ @ 31 NONAME ; void CGetObjectPropList::ConstructL(void)
-	??1CSendObject@@UAE@XZ @ 32 NONAME ; CSendObject::~CSendObject(void)
-	?ServiceMetaDataFromWrapperL@CGetObjectPropValue@@IAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 33 NONAME ; void CGetObjectPropValue::ServiceMetaDataFromWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
-	?NewL@CGetObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 34 NONAME ; class MMmRequestProcessor * CGetObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??1CGetObjectPropValue@@UAE@XZ @ 35 NONAME ; CGetObjectPropValue::~CGetObjectPropValue(void)
+	?ServiceL@CGetFormatCapabilities@@MAEXXZ @ 24 NONAME ; void CGetFormatCapabilities::ServiceL(void)
+	?GetAllReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXPAVCMPXMedia@@AAVCDesC16Array@@@Z @ 25 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllReferenceL(class CMPXMedia *, class CDesC16Array &)
+	??1CSetObjectPropList@@UAE@XZ @ 26 NONAME ; CSetObjectPropList::~CSetObjectPropList(void)
+	?ServiceL@CSetObjectPropList@@MAEXXZ @ 27 NONAME ; void CSetObjectPropList::ServiceL(void)
+	??0CMoveObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 28 NONAME ; CMoveObject::CMoveObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??0CRequestUnknown@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 29 NONAME ; CRequestUnknown::CRequestUnknown(class MMTPDataProviderFramework &, class MMTPConnection &)
+	?ConstructL@CGetObjectPropList@@IAEXXZ @ 30 NONAME ; void CGetObjectPropList::ConstructL(void)
+	??1CSendObject@@UAE@XZ @ 31 NONAME ; CSendObject::~CSendObject(void)
+	?ServiceMetaDataFromWrapperL@CGetObjectPropValue@@IAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 32 NONAME ; void CGetObjectPropValue::ServiceMetaDataFromWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
+	?NewL@CGetObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 33 NONAME ; class MMmRequestProcessor * CGetObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??1CGetObjectPropValue@@UAE@XZ @ 34 NONAME ; CGetObjectPropValue::~CGetObjectPropValue(void)
+	?CreateL@CMmMtpDpAccessSingleton@@SAXAAVMMTPDataProviderFramework@@@Z @ 35 NONAME ; void CMmMtpDpAccessSingleton::CreateL(class MMTPDataProviderFramework &)
 	??1CGetFormatCapabilities@@UAE@XZ @ 36 NONAME ; CGetFormatCapabilities::~CGetFormatCapabilities(void)
 	?ServiceL@CSetObjectReferences@@EAEXXZ @ 37 NONAME ; void CSetObjectReferences::ServiceL(void)
 	?DoHandleDataIToRPhaseL@CRequestProcessor@@MAEHXZ @ 38 NONAME ; int CRequestProcessor::DoHandleDataIToRPhaseL(void)
@@ -43,118 +43,117 @@
 	?ServiceL@CGetObjectPropValue@@MAEXXZ @ 42 NONAME ; void CGetObjectPropValue::ServiceL(void)
 	??1CRenameObject@@UAE@XZ @ 43 NONAME ; CRenameObject::~CRenameObject(void)
 	?Match@CRequestProcessor@@MBEHABVTMTPTypeEvent@@AAVMMTPConnection@@@Z @ 44 NONAME ; int CRequestProcessor::Match(class TMTPTypeEvent const &, class MMTPConnection &) const
-	?IsVideo@MmMtpDpUtility@@SAHABVTDesC16@@@Z @ 45 NONAME ; int MmMtpDpUtility::IsVideo(class TDesC16 const &)
-	?DoHandleCompletingPhaseL@CSendObject@@MAEHXZ @ 46 NONAME ; int CSendObject::DoHandleCompletingPhaseL(void)
-	?GetDrmStatus@MmMtpDpUtility@@SAHABVTDesC16@@@Z @ 47 NONAME ; int MmMtpDpUtility::GetDrmStatus(class TDesC16 const &)
-	?RunL@CRenameObject@@MAEXXZ @ 48 NONAME ; void CRenameObject::RunL(void)
-	??0CSetObjectReferences@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 49 NONAME ; CSetObjectReferences::CSetObjectReferences(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??0CRequestProcessor@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@HPBUTMTPRequestElementInfo@@@Z @ 50 NONAME ; CRequestProcessor::CRequestProcessor(class MMTPDataProviderFramework &, class MMTPConnection &, int, struct TMTPRequestElementInfo const *)
-	?ServiceL@CSendObject@@MAEXXZ @ 51 NONAME ; void CSendObject::ServiceL(void)
-	?Request@CRequestProcessor@@MBEABVTMTPTypeRequest@@XZ @ 52 NONAME ; class TMTPTypeRequest const & CRequestProcessor::Request(void) const
-	?CreateL@CMmMtpDpAccessSingleton@@SAXAAVRFs@@AAVMMTPDataProviderFramework@@@Z @ 53 NONAME ; void CMmMtpDpAccessSingleton::CreateL(class RFs &, class MMTPDataProviderFramework &)
-	?DoCancel@CRequestProcessor@@MAEXXZ @ 54 NONAME ; void CRequestProcessor::DoCancel(void)
-	?CheckRequestL@CGetPartialObject@@MAE?AW4TMTPResponseCode@@XZ @ 55 NONAME ; enum TMTPResponseCode CGetPartialObject::CheckRequestL(void)
-	?NewL@CRequestUnknown@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 56 NONAME ; class MMmRequestProcessor * CRequestUnknown::NewL(class MMTPDataProviderFramework &, class MMTPConnection &)
-	??0CGetFormatCapabilities@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 57 NONAME ; CGetFormatCapabilities::CGetFormatCapabilities(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?ConstructL@CGetObjectInfo@@AAEXXZ @ 58 NONAME ; void CGetObjectInfo::ConstructL(void)
-	?UsbDisconnect@CRequestProcessor@@MAEXXZ @ 59 NONAME ; void CRequestProcessor::UsbDisconnect(void)
-	?UpdateMusicCollectionL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 60 NONAME ; void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL(void)
-	??1CMoveObject@@UAE@XZ @ 61 NONAME ; CMoveObject::~CMoveObject(void)
-	?CheckRequestL@CSendObject@@MAE?AW4TMTPResponseCode@@XZ @ 62 NONAME ; enum TMTPResponseCode CSendObject::CheckRequestL(void)
-	??1CRequestProcessor@@MAE@XZ @ 63 NONAME ; CRequestProcessor::~CRequestProcessor(void)
-	?SetAbstractMediaL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@AAVCDesC16Array@@W4TMPXGeneralCategory@@@Z @ 64 NONAME ; void CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL(class TDesC16 const &, class CDesC16Array &, enum TMPXGeneralCategory)
-	?DoCancel@CDeleteObject@@MAEXXZ @ 65 NONAME ; void CDeleteObject::DoCancel(void)
-	??1CGetObject@@UAE@XZ @ 66 NONAME ; CGetObject::~CGetObject(void)
-	?NewL@CGetInterdependentPropDesc@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 67 NONAME ; class MMmRequestProcessor * CGetInterdependentPropDesc::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?DoHandleResponsePhaseL@CSetObjectReferences@@EAEHXZ @ 68 NONAME ; int CSetObjectReferences::DoHandleResponsePhaseL(void)
-	?GetAccessWrapperL@CMmMtpDpAccessSingleton@@SAAAVCMmMtpDpMetadataAccessWrapper@@XZ @ 69 NONAME ; class CMmMtpDpMetadataAccessWrapper & CMmMtpDpAccessSingleton::GetAccessWrapperL(void)
-	??1CGetObjectPropsSupported@@UAE@XZ @ 70 NONAME ; CGetObjectPropsSupported::~CGetObjectPropsSupported(void)
-	?CheckRequestL@CGetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 71 NONAME ; enum TMTPResponseCode CGetObjectPropList::CheckRequestL(void)
-	?HasDataphase@CRequestProcessor@@MBEHXZ @ 72 NONAME ; int CRequestProcessor::HasDataphase(void) const
-	?NewL@CGetObjectPropsSupported@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 73 NONAME ; class MMmRequestProcessor * CGetObjectPropsSupported::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?Connection@CRequestProcessor@@MBEAAVMMTPConnection@@XZ @ 74 NONAME ; class MMTPConnection & CRequestProcessor::Connection(void) const
-	?ConstructL@CGetFormatCapabilities@@AAEXXZ @ 75 NONAME ; void CGetFormatCapabilities::ConstructL(void)
-	??1CPropertySettingUtility@@UAE@XZ @ 76 NONAME ; CPropertySettingUtility::~CPropertySettingUtility(void)
-	??1CGetPartialObject@@UAE@XZ @ 77 NONAME ; CGetPartialObject::~CGetPartialObject(void)
-	?NewL@CGetObjectInfo@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 78 NONAME ; class MMmRequestProcessor * CGetObjectInfo::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?RunError@CSetObjectPropList@@MAEHH@Z @ 79 NONAME ; int CSetObjectPropList::RunError(int)
-	?CheckRequestL@CGetInterdependentPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 80 NONAME ; enum TMTPResponseCode CGetInterdependentPropDesc::CheckRequestL(void)
-	?Match@CRequestUnknown@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 81 NONAME ; int CRequestUnknown::Match(class TMTPTypeRequest const &, class MMTPConnection &) const
-	?ServiceL@CMoveObject@@MAEXXZ @ 82 NONAME ; void CMoveObject::ServiceL(void)
-	?CreateDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 83 NONAME ; void CMmMtpDpMetadataAccessWrapper::CreateDummyFile(class TDesC16 const &)
-	?CheckRequestL@CGetObjectPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 84 NONAME ; enum TMTPResponseCode CGetObjectPropDesc::CheckRequestL(void)
-	?DoHandleRToIPhaseL@CRequestProcessor@@MAEHXZ @ 85 NONAME ; int CRequestProcessor::DoHandleRToIPhaseL(void)
-	?ServiceMetaDataToWrapperL@CSetObjectPropValue@@IAE?AW4TMTPResponseCode@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 86 NONAME ; enum TMTPResponseCode CSetObjectPropValue::ServiceMetaDataToWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
-	?NewCommonObjectPropertyL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@G@Z @ 87 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewCommonObjectPropertyL(unsigned short)
-	?FormatFromFilename@MmMtpDpUtility@@SA?AW4TMTPFormatCode@@ABVTDesC16@@@Z @ 88 NONAME ; enum TMTPFormatCode MmMtpDpUtility::FormatFromFilename(class TDesC16 const &)
-	?CheckRequestL@CSetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 89 NONAME ; enum TMTPResponseCode CSetObjectPropValue::CheckRequestL(void)
-	??0CPropertySettingUtility@@IAE@XZ @ 90 NONAME ; CPropertySettingUtility::CPropertySettingUtility(void)
-	?Match@CRequestProcessor@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 91 NONAME ; int CRequestProcessor::Match(class TMTPTypeRequest const &, class MMTPConnection &) const
-	??0CCopyObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 92 NONAME ; CCopyObject::CCopyObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?CheckRequestL@CRequestProcessor@@MAE?AW4TMTPResponseCode@@XZ @ 93 NONAME ; enum TMTPResponseCode CRequestProcessor::CheckRequestL(void)
-	?SendResponseL@CRequestProcessor@@IAEXW4TMTPResponseCode@@HPAK@Z @ 94 NONAME ; void CRequestProcessor::SendResponseL(enum TMTPResponseCode, int, unsigned long *)
-	??0CGetPartialObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 95 NONAME ; CGetPartialObject::CGetPartialObject(class MMTPDataProviderFramework &, class MMTPConnection &)
-	?DoHandleCompletingPhaseL@CRequestProcessor@@MAEHXZ @ 96 NONAME ; int CRequestProcessor::DoHandleCompletingPhaseL(void)
-	?DeleteDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 97 NONAME ; void CMmMtpDpMetadataAccessWrapper::DeleteDummyFile(class TDesC16 const &)
-	??1CGetObjectInfo@@UAE@XZ @ 98 NONAME ; CGetObjectInfo::~CGetObjectInfo(void)
-	?ServiceL@CRequestUnknown@@MAEXXZ @ 99 NONAME ; void CRequestUnknown::ServiceL(void)
-	?HasDataphase@CSetObjectPropList@@MBEHXZ @ 100 NONAME ; int CSetObjectPropList::HasDataphase(void) const
-	?NewL@CGetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 101 NONAME ; class MMmRequestProcessor * CGetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?DoCancel@CRenameObject@@MAEXXZ @ 102 NONAME ; void CRenameObject::DoCancel(void)
-	??1CSetObjectReferences@@UAE@XZ @ 103 NONAME ; CSetObjectReferences::~CSetObjectReferences(void)
-	?Match@CSendObject@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 104 NONAME ; int CSendObject::Match(class TMTPTypeRequest const &, class MMTPConnection &) const
-	?NewL@CSetObjectPropList@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 105 NONAME ; class MMmRequestProcessor * CSetObjectPropList::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?GetAllAbstractMediaL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@PAPAVCMPXMediaArray@@W4TMPXGeneralCategory@@@Z @ 106 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllAbstractMediaL(class TDesC16 const &, class CMPXMediaArray * *, enum TMPXGeneralCategory)
-	??1CCopyObject@@UAE@XZ @ 107 NONAME ; CCopyObject::~CCopyObject(void)
-	?RunL@CGetObjectPropList@@MAEXXZ @ 108 NONAME ; void CGetObjectPropList::RunL(void)
-	?GetModifiedContentL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@AAHAAVCDesC16Array@@@Z @ 109 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetModifiedContentL(class TDesC16 const &, int &, class CDesC16Array &)
-	?NewRangeFormDescriptionL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@GKKKH@Z @ 110 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewRangeFormDescriptionL(unsigned short, unsigned long, unsigned long, unsigned long, int)
-	?RunError@CRequestProcessor@@MAEHH@Z @ 111 NONAME ; int CRequestProcessor::RunError(int)
-	?SessionId@CRequestProcessor@@MAEKXZ @ 112 NONAME ; unsigned long CRequestProcessor::SessionId(void)
-	??0CDescriptionUtility@@IAE@XZ @ 113 NONAME ; CDescriptionUtility::CDescriptionUtility(void)
-	?HandleEventL@CRequestProcessor@@MAEXABVTMTPTypeEvent@@@Z @ 114 NONAME ; void CRequestProcessor::HandleEventL(class TMTPTypeEvent const &)
-	?NewL@CGetPartialObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 115 NONAME ; class MMmRequestProcessor * CGetPartialObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?HasDataphase@CSetObjectReferences@@EBEHXZ @ 116 NONAME ; int CSetObjectReferences::HasDataphase(void) const
-	?ConstructL@CGetInterdependentPropDesc@@IAEXXZ @ 117 NONAME ; void CGetInterdependentPropDesc::ConstructL(void)
-	?RenameObjectL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@0@Z @ 118 NONAME ; void CMmMtpDpMetadataAccessWrapper::RenameObjectL(class TDesC16 const &, class TDesC16 const &)
-	?RunError@CGetObjectPropList@@MAEHH@Z @ 119 NONAME ; int CGetObjectPropList::RunError(int)
-	?DoHandleResponsePhaseL@CSetObjectPropList@@MAEHXZ @ 120 NONAME ; int CSetObjectPropList::DoHandleResponsePhaseL(void)
-	??0CDeleteObject@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 121 NONAME ; CDeleteObject::CDeleteObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?NewL@CRenameObject@@SAPAV1@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 122 NONAME ; class CRenameObject * CRenameObject::NewL(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &)
-	?GetObjectMetadataValueL@CMmMtpDpMetadataAccessWrapper@@QAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 123 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
-	?AddDummyFileL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 124 NONAME ; void CMmMtpDpMetadataAccessWrapper::AddDummyFileL(class TDesC16 const &)
-	??0CGetObjectPropDesc@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 125 NONAME ; CGetObjectPropDesc::CGetObjectPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?ConstructL@CGetObjectPropDesc@@AAEXXZ @ 126 NONAME ; void CGetObjectPropDesc::ConstructL(void)
-	??0CGetInterdependentPropDesc@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 127 NONAME ; CGetInterdependentPropDesc::CGetInterdependentPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??1CGetObjectPropDesc@@UAE@XZ @ 128 NONAME ; CGetObjectPropDesc::~CGetObjectPropDesc(void)
-	?ServiceL@CGetObjectPropDesc@@MAEXXZ @ 129 NONAME ; void CGetObjectPropDesc::ServiceL(void)
-	?HasDataphase@CSetObjectPropValue@@MBEHXZ @ 130 NONAME ; int CSetObjectPropValue::HasDataphase(void) const
-	?ServiceL@CCopyObject@@MAEXXZ @ 131 NONAME ; void CCopyObject::ServiceL(void)
-	?CheckRequestL@CGetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 132 NONAME ; enum TMTPResponseCode CGetObjectPropValue::CheckRequestL(void)
-	?CloseSessionL@CMmMtpDpAccessSingleton@@SAXXZ @ 133 NONAME ; void CMmMtpDpAccessSingleton::CloseSessionL(void)
-	?NewL@CGetFormatCapabilities@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 134 NONAME ; class MMmRequestProcessor * CGetFormatCapabilities::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?ReceiveDataL@CRequestProcessor@@IAEXAAVMMTPType@@@Z @ 135 NONAME ; void CRequestProcessor::ReceiveDataL(class MMTPType &)
-	??1CDescriptionUtility@@UAE@XZ @ 136 NONAME ; CDescriptionUtility::~CDescriptionUtility(void)
-	?RunL@CSetObjectPropList@@MAEXXZ @ 137 NONAME ; void CSetObjectPropList::RunL(void)
-	?ConstructL@CMoveObject@@IAEXXZ @ 138 NONAME ; void CMoveObject::ConstructL(void)
-	?NewL@CSendObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 139 NONAME ; class MMmRequestProcessor * CSendObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??1CGetObjectReferences@@UAE@XZ @ 140 NONAME ; CGetObjectReferences::~CGetObjectReferences(void)
-	?HasDataphase@CSendObject@@MBEHXZ @ 141 NONAME ; int CSendObject::HasDataphase(void) const
-	??1CSetObjectPropValue@@UAE@XZ @ 142 NONAME ; CSetObjectPropValue::~CSetObjectPropValue(void)
-	?ConstructL@CRenameObject@@IAEXXZ @ 143 NONAME ; void CRenameObject::ConstructL(void)
-	?SendDataL@CRequestProcessor@@IAEXABVMMTPType@@@Z @ 144 NONAME ; void CRequestProcessor::SendDataL(class MMTPType const &)
-	?DoHandleResponsePhaseL@CSendObject@@MAEHXZ @ 145 NONAME ; int CSendObject::DoHandleResponsePhaseL(void)
-	?DoCancel@CGetObjectPropList@@MAEXXZ @ 146 NONAME ; void CGetObjectPropList::DoCancel(void)
-	?ServiceL@CGetInterdependentPropDesc@@MAEXXZ @ 147 NONAME ; void CGetInterdependentPropDesc::ServiceL(void)
-	?DoHandleRequestPhaseL@CRequestProcessor@@MAEHXZ @ 148 NONAME ; int CRequestProcessor::DoHandleRequestPhaseL(void)
-	?GetAbstractMediaNameL@CMmMtpDpMetadataAccessWrapper@@QAEPAVHBufC16@@PAVCMPXMedia@@W4TMPXGeneralCategory@@@Z @ 149 NONAME ; class HBufC16 * CMmMtpDpMetadataAccessWrapper::GetAbstractMediaNameL(class CMPXMedia *, enum TMPXGeneralCategory)
-	?ServiceL@CSetObjectPropValue@@MAEXXZ @ 150 NONAME ; void CSetObjectPropValue::ServiceL(void)
-	?RunError@CRenameObject@@MAEHH@Z @ 151 NONAME ; int CRenameObject::RunError(int)
-	??1CDeleteObject@@UAE@XZ @ 152 NONAME ; CDeleteObject::~CDeleteObject(void)
-	?DoHandleResponsePhaseL@CGetPartialObject@@MAEHXZ @ 153 NONAME ; int CGetPartialObject::DoHandleResponsePhaseL(void)
-	?CheckRequestL@CGetFormatCapabilities@@MAE?AW4TMTPResponseCode@@XZ @ 154 NONAME ; enum TMTPResponseCode CGetFormatCapabilities::CheckRequestL(void)
-	??0CSetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 155 NONAME ; CSetObjectPropValue::CSetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??1CGetObjectPropList@@UAE@XZ @ 156 NONAME ; CGetObjectPropList::~CGetObjectPropList(void)
-	?ServiceL@CGetObjectPropList@@MAEXXZ @ 157 NONAME ; void CGetObjectPropList::ServiceL(void)
-	??0CRenameObject@@IAE@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 158 NONAME ; CRenameObject::CRenameObject(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &)
+	?DoHandleCompletingPhaseL@CSendObject@@MAEHXZ @ 45 NONAME ; int CSendObject::DoHandleCompletingPhaseL(void)
+	?GetDrmStatus@MmMtpDpUtility@@SAHABVTDesC16@@@Z @ 46 NONAME ; int MmMtpDpUtility::GetDrmStatus(class TDesC16 const &)
+	?RunL@CRenameObject@@MAEXXZ @ 47 NONAME ; void CRenameObject::RunL(void)
+	??0CSetObjectReferences@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 48 NONAME ; CSetObjectReferences::CSetObjectReferences(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??0CRequestProcessor@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@HPBUTMTPRequestElementInfo@@@Z @ 49 NONAME ; CRequestProcessor::CRequestProcessor(class MMTPDataProviderFramework &, class MMTPConnection &, int, struct TMTPRequestElementInfo const *)
+	?ServiceL@CSendObject@@MAEXXZ @ 50 NONAME ; void CSendObject::ServiceL(void)
+	?Request@CRequestProcessor@@MBEABVTMTPTypeRequest@@XZ @ 51 NONAME ; class TMTPTypeRequest const & CRequestProcessor::Request(void) const
+	?DoCancel@CRequestProcessor@@MAEXXZ @ 52 NONAME ; void CRequestProcessor::DoCancel(void)
+	?CheckRequestL@CGetPartialObject@@MAE?AW4TMTPResponseCode@@XZ @ 53 NONAME ; enum TMTPResponseCode CGetPartialObject::CheckRequestL(void)
+	?NewL@CRequestUnknown@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 54 NONAME ; class MMmRequestProcessor * CRequestUnknown::NewL(class MMTPDataProviderFramework &, class MMTPConnection &)
+	??0CGetFormatCapabilities@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 55 NONAME ; CGetFormatCapabilities::CGetFormatCapabilities(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?ConstructL@CGetObjectInfo@@AAEXXZ @ 56 NONAME ; void CGetObjectInfo::ConstructL(void)
+	?UsbDisconnect@CRequestProcessor@@MAEXXZ @ 57 NONAME ; void CRequestProcessor::UsbDisconnect(void)
+	?UpdateMusicCollectionL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 58 NONAME ; void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL(void)
+	??1CMoveObject@@UAE@XZ @ 59 NONAME ; CMoveObject::~CMoveObject(void)
+	?CheckRequestL@CSendObject@@MAE?AW4TMTPResponseCode@@XZ @ 60 NONAME ; enum TMTPResponseCode CSendObject::CheckRequestL(void)
+	??1CRequestProcessor@@MAE@XZ @ 61 NONAME ; CRequestProcessor::~CRequestProcessor(void)
+	?DoCancel@CDeleteObject@@MAEXXZ @ 62 NONAME ; void CDeleteObject::DoCancel(void)
+	??1CGetObject@@UAE@XZ @ 63 NONAME ; CGetObject::~CGetObject(void)
+	?NewL@CGetInterdependentPropDesc@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 64 NONAME ; class MMmRequestProcessor * CGetInterdependentPropDesc::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?DoHandleResponsePhaseL@CSetObjectReferences@@EAEHXZ @ 65 NONAME ; int CSetObjectReferences::DoHandleResponsePhaseL(void)
+	?GetAccessWrapperL@CMmMtpDpAccessSingleton@@SAAAVCMmMtpDpMetadataAccessWrapper@@XZ @ 66 NONAME ; class CMmMtpDpMetadataAccessWrapper & CMmMtpDpAccessSingleton::GetAccessWrapperL(void)
+	??1CGetObjectPropsSupported@@UAE@XZ @ 67 NONAME ; CGetObjectPropsSupported::~CGetObjectPropsSupported(void)
+	?CheckRequestL@CGetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 68 NONAME ; enum TMTPResponseCode CGetObjectPropList::CheckRequestL(void)
+	?HasDataphase@CRequestProcessor@@MBEHXZ @ 69 NONAME ; int CRequestProcessor::HasDataphase(void) const
+	?NewL@CGetObjectPropsSupported@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 70 NONAME ; class MMmRequestProcessor * CGetObjectPropsSupported::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?Connection@CRequestProcessor@@MBEAAVMMTPConnection@@XZ @ 71 NONAME ; class MMTPConnection & CRequestProcessor::Connection(void) const
+	?ConstructL@CGetFormatCapabilities@@AAEXXZ @ 72 NONAME ; void CGetFormatCapabilities::ConstructL(void)
+	??1CPropertySettingUtility@@UAE@XZ @ 73 NONAME ; CPropertySettingUtility::~CPropertySettingUtility(void)
+	??1CGetPartialObject@@UAE@XZ @ 74 NONAME ; CGetPartialObject::~CGetPartialObject(void)
+	?NewL@CGetObjectInfo@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 75 NONAME ; class MMmRequestProcessor * CGetObjectInfo::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?RunError@CSetObjectPropList@@MAEHH@Z @ 76 NONAME ; int CSetObjectPropList::RunError(int)
+	?CheckRequestL@CGetInterdependentPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 77 NONAME ; enum TMTPResponseCode CGetInterdependentPropDesc::CheckRequestL(void)
+	?Match@CRequestUnknown@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 78 NONAME ; int CRequestUnknown::Match(class TMTPTypeRequest const &, class MMTPConnection &) const
+	?ServiceL@CMoveObject@@MAEXXZ @ 79 NONAME ; void CMoveObject::ServiceL(void)
+	?CreateDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 80 NONAME ; void CMmMtpDpMetadataAccessWrapper::CreateDummyFile(class TDesC16 const &)
+	?CheckRequestL@CGetObjectPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 81 NONAME ; enum TMTPResponseCode CGetObjectPropDesc::CheckRequestL(void)
+	?DoHandleRToIPhaseL@CRequestProcessor@@MAEHXZ @ 82 NONAME ; int CRequestProcessor::DoHandleRToIPhaseL(void)
+	?ServiceMetaDataToWrapperL@CSetObjectPropValue@@IAE?AW4TMTPResponseCode@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 83 NONAME ; enum TMTPResponseCode CSetObjectPropValue::ServiceMetaDataToWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
+	?NewCommonObjectPropertyL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@G@Z @ 84 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewCommonObjectPropertyL(unsigned short)
+	?FormatFromFilename@MmMtpDpUtility@@SA?AW4TMTPFormatCode@@ABVTDesC16@@@Z @ 85 NONAME ; enum TMTPFormatCode MmMtpDpUtility::FormatFromFilename(class TDesC16 const &)
+	?CheckRequestL@CSetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 86 NONAME ; enum TMTPResponseCode CSetObjectPropValue::CheckRequestL(void)
+	??0CPropertySettingUtility@@IAE@XZ @ 87 NONAME ; CPropertySettingUtility::CPropertySettingUtility(void)
+	?Match@CRequestProcessor@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 88 NONAME ; int CRequestProcessor::Match(class TMTPTypeRequest const &, class MMTPConnection &) const
+	??0CCopyObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 89 NONAME ; CCopyObject::CCopyObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?CheckRequestL@CRequestProcessor@@MAE?AW4TMTPResponseCode@@XZ @ 90 NONAME ; enum TMTPResponseCode CRequestProcessor::CheckRequestL(void)
+	?SendResponseL@CRequestProcessor@@IAEXW4TMTPResponseCode@@HPAK@Z @ 91 NONAME ; void CRequestProcessor::SendResponseL(enum TMTPResponseCode, int, unsigned long *)
+	??0CGetPartialObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 92 NONAME ; CGetPartialObject::CGetPartialObject(class MMTPDataProviderFramework &, class MMTPConnection &)
+	?DoHandleCompletingPhaseL@CRequestProcessor@@MAEHXZ @ 93 NONAME ; int CRequestProcessor::DoHandleCompletingPhaseL(void)
+	?DeleteDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 94 NONAME ; void CMmMtpDpMetadataAccessWrapper::DeleteDummyFile(class TDesC16 const &)
+	?DoSetObjectReferencesL@CSetObjectReferences@@IAEXABVCMTPObjectMetaData@@@Z @ 95 NONAME ; void CSetObjectReferences::DoSetObjectReferencesL(class CMTPObjectMetaData const &)
+	??1CGetObjectInfo@@UAE@XZ @ 96 NONAME ; CGetObjectInfo::~CGetObjectInfo(void)
+	?ServiceL@CRequestUnknown@@MAEXXZ @ 97 NONAME ; void CRequestUnknown::ServiceL(void)
+	?HasDataphase@CSetObjectPropList@@MBEHXZ @ 98 NONAME ; int CSetObjectPropList::HasDataphase(void) const
+	?NewL@CGetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 99 NONAME ; class MMmRequestProcessor * CGetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?DoCancel@CRenameObject@@MAEXXZ @ 100 NONAME ; void CRenameObject::DoCancel(void)
+	??1CSetObjectReferences@@UAE@XZ @ 101 NONAME ; CSetObjectReferences::~CSetObjectReferences(void)
+	?Match@CSendObject@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 102 NONAME ; int CSendObject::Match(class TMTPTypeRequest const &, class MMTPConnection &) const
+	?NewL@CSetObjectPropList@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 103 NONAME ; class MMmRequestProcessor * CSetObjectPropList::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?GetAllAbstractMediaL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@PAPAVCMPXMediaArray@@W4TMPXGeneralCategory@@@Z @ 104 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllAbstractMediaL(class TDesC16 const &, class CMPXMediaArray * *, enum TMPXGeneralCategory)
+	??1CCopyObject@@UAE@XZ @ 105 NONAME ; CCopyObject::~CCopyObject(void)
+	?GetModifiedContentL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@AAHAAVCDesC16Array@@@Z @ 106 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetModifiedContentL(class TDesC16 const &, int &, class CDesC16Array &)
+	?RunL@CGetObjectPropList@@MAEXXZ @ 107 NONAME ; void CGetObjectPropList::RunL(void)
+	?NewRangeFormDescriptionL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@GKKKH@Z @ 108 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewRangeFormDescriptionL(unsigned short, unsigned long, unsigned long, unsigned long, int)
+	?RunError@CRequestProcessor@@MAEHH@Z @ 109 NONAME ; int CRequestProcessor::RunError(int)
+	?SessionId@CRequestProcessor@@MAEKXZ @ 110 NONAME ; unsigned long CRequestProcessor::SessionId(void)
+	??0CDescriptionUtility@@IAE@XZ @ 111 NONAME ; CDescriptionUtility::CDescriptionUtility(void)
+	?HandleEventL@CRequestProcessor@@MAEXABVTMTPTypeEvent@@@Z @ 112 NONAME ; void CRequestProcessor::HandleEventL(class TMTPTypeEvent const &)
+	?NewL@CGetPartialObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 113 NONAME ; class MMmRequestProcessor * CGetPartialObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?HasDataphase@CSetObjectReferences@@EBEHXZ @ 114 NONAME ; int CSetObjectReferences::HasDataphase(void) const
+	?ConstructL@CGetInterdependentPropDesc@@IAEXXZ @ 115 NONAME ; void CGetInterdependentPropDesc::ConstructL(void)
+	?RunError@CGetObjectPropList@@MAEHH@Z @ 116 NONAME ; int CGetObjectPropList::RunError(int)
+	?DoHandleResponsePhaseL@CSetObjectPropList@@MAEHXZ @ 117 NONAME ; int CSetObjectPropList::DoHandleResponsePhaseL(void)
+	??0CDeleteObject@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 118 NONAME ; CDeleteObject::CDeleteObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?NewL@CRenameObject@@SAPAV1@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 119 NONAME ; class CRenameObject * CRenameObject::NewL(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &)
+	?RenameObjectL@CMmMtpDpMetadataAccessWrapper@@QAEXABVCMTPObjectMetaData@@ABVTDesC16@@@Z @ 120 NONAME ; void CMmMtpDpMetadataAccessWrapper::RenameObjectL(class CMTPObjectMetaData const &, class TDesC16 const &)
+	?GetObjectMetadataValueL@CMmMtpDpMetadataAccessWrapper@@QAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 121 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
+	?AddDummyFileL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 122 NONAME ; void CMmMtpDpMetadataAccessWrapper::AddDummyFileL(class TDesC16 const &)
+	??0CGetObjectPropDesc@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 123 NONAME ; CGetObjectPropDesc::CGetObjectPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?ConstructL@CGetObjectPropDesc@@AAEXXZ @ 124 NONAME ; void CGetObjectPropDesc::ConstructL(void)
+	??0CGetInterdependentPropDesc@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 125 NONAME ; CGetInterdependentPropDesc::CGetInterdependentPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??1CGetObjectPropDesc@@UAE@XZ @ 126 NONAME ; CGetObjectPropDesc::~CGetObjectPropDesc(void)
+	?ServiceL@CGetObjectPropDesc@@MAEXXZ @ 127 NONAME ; void CGetObjectPropDesc::ServiceL(void)
+	?HasDataphase@CSetObjectPropValue@@MBEHXZ @ 128 NONAME ; int CSetObjectPropValue::HasDataphase(void) const
+	?ServiceL@CCopyObject@@MAEXXZ @ 129 NONAME ; void CCopyObject::ServiceL(void)
+	?CheckRequestL@CGetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 130 NONAME ; enum TMTPResponseCode CGetObjectPropValue::CheckRequestL(void)
+	?CloseSessionL@CMmMtpDpAccessSingleton@@SAXXZ @ 131 NONAME ; void CMmMtpDpAccessSingleton::CloseSessionL(void)
+	?NewL@CGetFormatCapabilities@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 132 NONAME ; class MMmRequestProcessor * CGetFormatCapabilities::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?ReceiveDataL@CRequestProcessor@@IAEXAAVMMTPType@@@Z @ 133 NONAME ; void CRequestProcessor::ReceiveDataL(class MMTPType &)
+	??1CDescriptionUtility@@UAE@XZ @ 134 NONAME ; CDescriptionUtility::~CDescriptionUtility(void)
+	?RunL@CSetObjectPropList@@MAEXXZ @ 135 NONAME ; void CSetObjectPropList::RunL(void)
+	?ConstructL@CMoveObject@@IAEXXZ @ 136 NONAME ; void CMoveObject::ConstructL(void)
+	?NewL@CSendObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 137 NONAME ; class MMmRequestProcessor * CSendObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??1CGetObjectReferences@@UAE@XZ @ 138 NONAME ; CGetObjectReferences::~CGetObjectReferences(void)
+	?HasDataphase@CSendObject@@MBEHXZ @ 139 NONAME ; int CSendObject::HasDataphase(void) const
+	??1CSetObjectPropValue@@UAE@XZ @ 140 NONAME ; CSetObjectPropValue::~CSetObjectPropValue(void)
+	?ConstructL@CRenameObject@@IAEXXZ @ 141 NONAME ; void CRenameObject::ConstructL(void)
+	?SendDataL@CRequestProcessor@@IAEXABVMMTPType@@@Z @ 142 NONAME ; void CRequestProcessor::SendDataL(class MMTPType const &)
+	?DoHandleResponsePhaseL@CSendObject@@MAEHXZ @ 143 NONAME ; int CSendObject::DoHandleResponsePhaseL(void)
+	?SetReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXABVCMTPObjectMetaData@@AAVCDesC16Array@@@Z @ 144 NONAME ; void CMmMtpDpMetadataAccessWrapper::SetReferenceL(class CMTPObjectMetaData const &, class CDesC16Array &)
+	?DoCancel@CGetObjectPropList@@MAEXXZ @ 145 NONAME ; void CGetObjectPropList::DoCancel(void)
+	?ServiceL@CGetInterdependentPropDesc@@MAEXXZ @ 146 NONAME ; void CGetInterdependentPropDesc::ServiceL(void)
+	?DoHandleRequestPhaseL@CRequestProcessor@@MAEHXZ @ 147 NONAME ; int CRequestProcessor::DoHandleRequestPhaseL(void)
+	?GetAbstractMediaNameL@CMmMtpDpMetadataAccessWrapper@@QAEPAVHBufC16@@PAVCMPXMedia@@W4TMPXGeneralCategory@@@Z @ 148 NONAME ; class HBufC16 * CMmMtpDpMetadataAccessWrapper::GetAbstractMediaNameL(class CMPXMedia *, enum TMPXGeneralCategory)
+	?ServiceL@CSetObjectPropValue@@MAEXXZ @ 149 NONAME ; void CSetObjectPropValue::ServiceL(void)
+	?RunError@CRenameObject@@MAEHH@Z @ 150 NONAME ; int CRenameObject::RunError(int)
+	??1CDeleteObject@@UAE@XZ @ 151 NONAME ; CDeleteObject::~CDeleteObject(void)
+	?DoHandleResponsePhaseL@CGetPartialObject@@MAEHXZ @ 152 NONAME ; int CGetPartialObject::DoHandleResponsePhaseL(void)
+	?CheckRequestL@CGetFormatCapabilities@@MAE?AW4TMTPResponseCode@@XZ @ 153 NONAME ; enum TMTPResponseCode CGetFormatCapabilities::CheckRequestL(void)
+	??0CSetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 154 NONAME ; CSetObjectPropValue::CSetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??1CGetObjectPropList@@UAE@XZ @ 155 NONAME ; CGetObjectPropList::~CGetObjectPropList(void)
+	?ServiceL@CGetObjectPropList@@MAEXXZ @ 156 NONAME ; void CGetObjectPropList::ServiceL(void)
+	??0CRenameObject@@IAE@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 157 NONAME ; CRenameObject::CRenameObject(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &)
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def	Wed Mar 31 22:26:09 2010 +0300
@@ -49,231 +49,230 @@
 	_ZN14CGetObjectInfoD2Ev @ 48 NONAME
 	_ZN14MmMtpDpUtility12GetDrmStatusERK7TDesC16 @ 49 NONAME
 	_ZN14MmMtpDpUtility18FormatFromFilenameERK7TDesC16 @ 50 NONAME
-	_ZN14MmMtpDpUtility7IsVideoERK7TDesC16 @ 51 NONAME
-	_ZN15CRequestUnknown4NewLER25MMTPDataProviderFrameworkR14MMTPConnection @ 52 NONAME
-	_ZN15CRequestUnknown8ServiceLEv @ 53 NONAME
-	_ZN15CRequestUnknownC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 54 NONAME
-	_ZN15CRequestUnknownC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 55 NONAME
-	_ZN15CRequestUnknownD0Ev @ 56 NONAME
-	_ZN15CRequestUnknownD1Ev @ 57 NONAME
-	_ZN15CRequestUnknownD2Ev @ 58 NONAME
-	_ZN17CGetPartialObject13CheckRequestLEv @ 59 NONAME
-	_ZN17CGetPartialObject22DoHandleResponsePhaseLEv @ 60 NONAME
-	_ZN17CGetPartialObject4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 61 NONAME
-	_ZN17CGetPartialObject8ServiceLEv @ 62 NONAME
-	_ZN17CGetPartialObjectC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 63 NONAME
-	_ZN17CGetPartialObjectC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 64 NONAME
-	_ZN17CGetPartialObjectD0Ev @ 65 NONAME
-	_ZN17CGetPartialObjectD1Ev @ 66 NONAME
-	_ZN17CGetPartialObjectD2Ev @ 67 NONAME
-	_ZN17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 68 NONAME
-	_ZN17CRequestProcessor12ReceiveDataLER8MMTPType @ 69 NONAME
-	_ZN17CRequestProcessor13CheckRequestLEv @ 70 NONAME
-	_ZN17CRequestProcessor13SendResponseLE16TMTPResponseCodeiPm @ 71 NONAME
-	_ZN17CRequestProcessor13UsbDisconnectEv @ 72 NONAME
-	_ZN17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 73 NONAME
-	_ZN17CRequestProcessor18DoHandleRToIPhaseLEv @ 74 NONAME
-	_ZN17CRequestProcessor21DoHandleRequestPhaseLEv @ 75 NONAME
-	_ZN17CRequestProcessor22DoHandleDataIToRPhaseLEv @ 76 NONAME
-	_ZN17CRequestProcessor22DoHandleResponsePhaseLEv @ 77 NONAME
-	_ZN17CRequestProcessor24DoHandleCompletingPhaseLEv @ 78 NONAME
-	_ZN17CRequestProcessor4RunLEv @ 79 NONAME
-	_ZN17CRequestProcessor7ReleaseEv @ 80 NONAME
-	_ZN17CRequestProcessor8DoCancelEv @ 81 NONAME
-	_ZN17CRequestProcessor8RunErrorEi @ 82 NONAME
-	_ZN17CRequestProcessor9SendDataLERK8MMTPType @ 83 NONAME
-	_ZN17CRequestProcessor9SessionIdEv @ 84 NONAME
-	_ZN17CRequestProcessorC2ER25MMTPDataProviderFrameworkR14MMTPConnectioniPK22TMTPRequestElementInfo @ 85 NONAME
-	_ZN17CRequestProcessorD0Ev @ 86 NONAME
-	_ZN17CRequestProcessorD1Ev @ 87 NONAME
-	_ZN17CRequestProcessorD2Ev @ 88 NONAME
-	_ZN18CGetObjectPropDesc10ConstructLEv @ 89 NONAME
-	_ZN18CGetObjectPropDesc13CheckRequestLEv @ 90 NONAME
-	_ZN18CGetObjectPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 91 NONAME
-	_ZN18CGetObjectPropDesc8ServiceLEv @ 92 NONAME
-	_ZN18CGetObjectPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 93 NONAME
-	_ZN18CGetObjectPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 94 NONAME
-	_ZN18CGetObjectPropDescD0Ev @ 95 NONAME
-	_ZN18CGetObjectPropDescD1Ev @ 96 NONAME
-	_ZN18CGetObjectPropDescD2Ev @ 97 NONAME
-	_ZN18CGetObjectPropList10ConstructLEv @ 98 NONAME
-	_ZN18CGetObjectPropList13CheckRequestLEv @ 99 NONAME
-	_ZN18CGetObjectPropList4RunLEv @ 100 NONAME
-	_ZN18CGetObjectPropList8DoCancelEv @ 101 NONAME
-	_ZN18CGetObjectPropList8RunErrorEi @ 102 NONAME
-	_ZN18CGetObjectPropList8ServiceLEv @ 103 NONAME
-	_ZN18CGetObjectPropListC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 104 NONAME
-	_ZN18CGetObjectPropListD0Ev @ 105 NONAME
-	_ZN18CGetObjectPropListD1Ev @ 106 NONAME
-	_ZN18CGetObjectPropListD2Ev @ 107 NONAME
-	_ZN18CSetObjectPropList13CheckRequestLEv @ 108 NONAME
-	_ZN18CSetObjectPropList22DoHandleResponsePhaseLEv @ 109 NONAME
-	_ZN18CSetObjectPropList4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 110 NONAME
-	_ZN18CSetObjectPropList4RunLEv @ 111 NONAME
-	_ZN18CSetObjectPropList8DoCancelEv @ 112 NONAME
-	_ZN18CSetObjectPropList8RunErrorEi @ 113 NONAME
-	_ZN18CSetObjectPropList8ServiceLEv @ 114 NONAME
-	_ZN18CSetObjectPropListD0Ev @ 115 NONAME
-	_ZN18CSetObjectPropListD1Ev @ 116 NONAME
-	_ZN18CSetObjectPropListD2Ev @ 117 NONAME
-	_ZN19CDescriptionUtility24NewCommonObjectPropertyLEt @ 118 NONAME
-	_ZN19CDescriptionUtility24NewRangeFormDescriptionLEtmmmi @ 119 NONAME
-	_ZN19CDescriptionUtilityC2Ev @ 120 NONAME
-	_ZN19CDescriptionUtilityD0Ev @ 121 NONAME
-	_ZN19CDescriptionUtilityD1Ev @ 122 NONAME
-	_ZN19CDescriptionUtilityD2Ev @ 123 NONAME
-	_ZN19CGetObjectPropValue13CheckRequestLEv @ 124 NONAME
-	_ZN19CGetObjectPropValue27ServiceMetaDataFromWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 125 NONAME
-	_ZN19CGetObjectPropValue8ServiceLEv @ 126 NONAME
-	_ZN19CGetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 127 NONAME
-	_ZN19CGetObjectPropValueD0Ev @ 128 NONAME
-	_ZN19CGetObjectPropValueD1Ev @ 129 NONAME
-	_ZN19CGetObjectPropValueD2Ev @ 130 NONAME
-	_ZN19CSetObjectPropValue13CheckRequestLEv @ 131 NONAME
-	_ZN19CSetObjectPropValue22DoHandleResponsePhaseLEv @ 132 NONAME
-	_ZN19CSetObjectPropValue25ServiceMetaDataToWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 133 NONAME
-	_ZN19CSetObjectPropValue8ServiceLEv @ 134 NONAME
-	_ZN19CSetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 135 NONAME
-	_ZN19CSetObjectPropValueD0Ev @ 136 NONAME
-	_ZN19CSetObjectPropValueD1Ev @ 137 NONAME
-	_ZN19CSetObjectPropValueD2Ev @ 138 NONAME
-	_ZN20CGetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 139 NONAME
-	_ZN20CGetObjectReferencesD0Ev @ 140 NONAME
-	_ZN20CGetObjectReferencesD1Ev @ 141 NONAME
-	_ZN20CGetObjectReferencesD2Ev @ 142 NONAME
-	_ZN20CSetObjectReferences22DoHandleResponsePhaseLEv @ 143 NONAME
-	_ZN20CSetObjectReferences22DoSetObjectReferencesLER29CMmMtpDpMetadataAccessWrappertRK7TDesC16R12CDesC16Array @ 144 NONAME
-	_ZN20CSetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 145 NONAME
-	_ZN20CSetObjectReferences8ServiceLEv @ 146 NONAME
-	_ZN20CSetObjectReferencesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 147 NONAME
-	_ZN20CSetObjectReferencesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 148 NONAME
-	_ZN20CSetObjectReferencesD0Ev @ 149 NONAME
-	_ZN20CSetObjectReferencesD1Ev @ 150 NONAME
-	_ZN20CSetObjectReferencesD2Ev @ 151 NONAME
-	_ZN22CGetFormatCapabilities10ConstructLEv @ 152 NONAME
-	_ZN22CGetFormatCapabilities13CheckRequestLEv @ 153 NONAME
-	_ZN22CGetFormatCapabilities4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 154 NONAME
-	_ZN22CGetFormatCapabilities8ServiceLEv @ 155 NONAME
-	_ZN22CGetFormatCapabilitiesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 156 NONAME
-	_ZN22CGetFormatCapabilitiesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 157 NONAME
-	_ZN22CGetFormatCapabilitiesD0Ev @ 158 NONAME
-	_ZN22CGetFormatCapabilitiesD1Ev @ 159 NONAME
-	_ZN22CGetFormatCapabilitiesD2Ev @ 160 NONAME
-	_ZN23CMmMtpDpAccessSingleton12OpenSessionLEv @ 161 NONAME
-	_ZN23CMmMtpDpAccessSingleton13CloseSessionLEv @ 162 NONAME
-	_ZN23CMmMtpDpAccessSingleton17GetAccessWrapperLEv @ 163 NONAME
-	_ZN23CMmMtpDpAccessSingleton7CreateLER3RFsR25MMTPDataProviderFramework @ 164 NONAME
-	_ZN23CMmMtpDpAccessSingleton7ReleaseEv @ 165 NONAME
-	_ZN23CPropertySettingUtility20SetMetaDataToWrapperER14MMmMtpDpConfigtR8MMTPTypeRK18CMTPObjectMetaData @ 166 NONAME
-	_ZN23CPropertySettingUtilityC2Ev @ 167 NONAME
-	_ZN23CPropertySettingUtilityD0Ev @ 168 NONAME
-	_ZN23CPropertySettingUtilityD1Ev @ 169 NONAME
-	_ZN23CPropertySettingUtilityD2Ev @ 170 NONAME
-	_ZN24CGetObjectPropsSupported4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 171 NONAME
-	_ZN24CGetObjectPropsSupported8ServiceLEv @ 172 NONAME
-	_ZN24CGetObjectPropsSupportedD0Ev @ 173 NONAME
-	_ZN24CGetObjectPropsSupportedD1Ev @ 174 NONAME
-	_ZN24CGetObjectPropsSupportedD2Ev @ 175 NONAME
-	_ZN26CGetInterdependentPropDesc10ConstructLEv @ 176 NONAME
-	_ZN26CGetInterdependentPropDesc13CheckRequestLEv @ 177 NONAME
-	_ZN26CGetInterdependentPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 178 NONAME
-	_ZN26CGetInterdependentPropDesc8ServiceLEv @ 179 NONAME
-	_ZN26CGetInterdependentPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 180 NONAME
-	_ZN26CGetInterdependentPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 181 NONAME
-	_ZN26CGetInterdependentPropDescD0Ev @ 182 NONAME
-	_ZN26CGetInterdependentPropDescD1Ev @ 183 NONAME
-	_ZN26CGetInterdependentPropDescD2Ev @ 184 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper13AddDummyFileLERK7TDesC16 @ 185 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper13RenameObjectLERK7TDesC16S2_ @ 186 NONAME
+	_ZN15CRequestUnknown4NewLER25MMTPDataProviderFrameworkR14MMTPConnection @ 51 NONAME
+	_ZN15CRequestUnknown8ServiceLEv @ 52 NONAME
+	_ZN15CRequestUnknownC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 53 NONAME
+	_ZN15CRequestUnknownC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 54 NONAME
+	_ZN15CRequestUnknownD0Ev @ 55 NONAME
+	_ZN15CRequestUnknownD1Ev @ 56 NONAME
+	_ZN15CRequestUnknownD2Ev @ 57 NONAME
+	_ZN17CGetPartialObject13CheckRequestLEv @ 58 NONAME
+	_ZN17CGetPartialObject22DoHandleResponsePhaseLEv @ 59 NONAME
+	_ZN17CGetPartialObject4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 60 NONAME
+	_ZN17CGetPartialObject8ServiceLEv @ 61 NONAME
+	_ZN17CGetPartialObjectC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 62 NONAME
+	_ZN17CGetPartialObjectC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 63 NONAME
+	_ZN17CGetPartialObjectD0Ev @ 64 NONAME
+	_ZN17CGetPartialObjectD1Ev @ 65 NONAME
+	_ZN17CGetPartialObjectD2Ev @ 66 NONAME
+	_ZN17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 67 NONAME
+	_ZN17CRequestProcessor12ReceiveDataLER8MMTPType @ 68 NONAME
+	_ZN17CRequestProcessor13CheckRequestLEv @ 69 NONAME
+	_ZN17CRequestProcessor13SendResponseLE16TMTPResponseCodeiPm @ 70 NONAME
+	_ZN17CRequestProcessor13UsbDisconnectEv @ 71 NONAME
+	_ZN17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 72 NONAME
+	_ZN17CRequestProcessor18DoHandleRToIPhaseLEv @ 73 NONAME
+	_ZN17CRequestProcessor21DoHandleRequestPhaseLEv @ 74 NONAME
+	_ZN17CRequestProcessor22DoHandleDataIToRPhaseLEv @ 75 NONAME
+	_ZN17CRequestProcessor22DoHandleResponsePhaseLEv @ 76 NONAME
+	_ZN17CRequestProcessor24DoHandleCompletingPhaseLEv @ 77 NONAME
+	_ZN17CRequestProcessor4RunLEv @ 78 NONAME
+	_ZN17CRequestProcessor7ReleaseEv @ 79 NONAME
+	_ZN17CRequestProcessor8DoCancelEv @ 80 NONAME
+	_ZN17CRequestProcessor8RunErrorEi @ 81 NONAME
+	_ZN17CRequestProcessor9SendDataLERK8MMTPType @ 82 NONAME
+	_ZN17CRequestProcessor9SessionIdEv @ 83 NONAME
+	_ZN17CRequestProcessorC2ER25MMTPDataProviderFrameworkR14MMTPConnectioniPK22TMTPRequestElementInfo @ 84 NONAME
+	_ZN17CRequestProcessorD0Ev @ 85 NONAME
+	_ZN17CRequestProcessorD1Ev @ 86 NONAME
+	_ZN17CRequestProcessorD2Ev @ 87 NONAME
+	_ZN18CGetObjectPropDesc10ConstructLEv @ 88 NONAME
+	_ZN18CGetObjectPropDesc13CheckRequestLEv @ 89 NONAME
+	_ZN18CGetObjectPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 90 NONAME
+	_ZN18CGetObjectPropDesc8ServiceLEv @ 91 NONAME
+	_ZN18CGetObjectPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 92 NONAME
+	_ZN18CGetObjectPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 93 NONAME
+	_ZN18CGetObjectPropDescD0Ev @ 94 NONAME
+	_ZN18CGetObjectPropDescD1Ev @ 95 NONAME
+	_ZN18CGetObjectPropDescD2Ev @ 96 NONAME
+	_ZN18CGetObjectPropList10ConstructLEv @ 97 NONAME
+	_ZN18CGetObjectPropList13CheckRequestLEv @ 98 NONAME
+	_ZN18CGetObjectPropList4RunLEv @ 99 NONAME
+	_ZN18CGetObjectPropList8DoCancelEv @ 100 NONAME
+	_ZN18CGetObjectPropList8RunErrorEi @ 101 NONAME
+	_ZN18CGetObjectPropList8ServiceLEv @ 102 NONAME
+	_ZN18CGetObjectPropListC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 103 NONAME
+	_ZN18CGetObjectPropListD0Ev @ 104 NONAME
+	_ZN18CGetObjectPropListD1Ev @ 105 NONAME
+	_ZN18CGetObjectPropListD2Ev @ 106 NONAME
+	_ZN18CSetObjectPropList13CheckRequestLEv @ 107 NONAME
+	_ZN18CSetObjectPropList22DoHandleResponsePhaseLEv @ 108 NONAME
+	_ZN18CSetObjectPropList4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 109 NONAME
+	_ZN18CSetObjectPropList4RunLEv @ 110 NONAME
+	_ZN18CSetObjectPropList8DoCancelEv @ 111 NONAME
+	_ZN18CSetObjectPropList8RunErrorEi @ 112 NONAME
+	_ZN18CSetObjectPropList8ServiceLEv @ 113 NONAME
+	_ZN18CSetObjectPropListD0Ev @ 114 NONAME
+	_ZN18CSetObjectPropListD1Ev @ 115 NONAME
+	_ZN18CSetObjectPropListD2Ev @ 116 NONAME
+	_ZN19CDescriptionUtility24NewCommonObjectPropertyLEt @ 117 NONAME
+	_ZN19CDescriptionUtility24NewRangeFormDescriptionLEtmmmi @ 118 NONAME
+	_ZN19CDescriptionUtilityC2Ev @ 119 NONAME
+	_ZN19CDescriptionUtilityD0Ev @ 120 NONAME
+	_ZN19CDescriptionUtilityD1Ev @ 121 NONAME
+	_ZN19CDescriptionUtilityD2Ev @ 122 NONAME
+	_ZN19CGetObjectPropValue13CheckRequestLEv @ 123 NONAME
+	_ZN19CGetObjectPropValue27ServiceMetaDataFromWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 124 NONAME
+	_ZN19CGetObjectPropValue8ServiceLEv @ 125 NONAME
+	_ZN19CGetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 126 NONAME
+	_ZN19CGetObjectPropValueD0Ev @ 127 NONAME
+	_ZN19CGetObjectPropValueD1Ev @ 128 NONAME
+	_ZN19CGetObjectPropValueD2Ev @ 129 NONAME
+	_ZN19CSetObjectPropValue13CheckRequestLEv @ 130 NONAME
+	_ZN19CSetObjectPropValue22DoHandleResponsePhaseLEv @ 131 NONAME
+	_ZN19CSetObjectPropValue25ServiceMetaDataToWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 132 NONAME
+	_ZN19CSetObjectPropValue8ServiceLEv @ 133 NONAME
+	_ZN19CSetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 134 NONAME
+	_ZN19CSetObjectPropValueD0Ev @ 135 NONAME
+	_ZN19CSetObjectPropValueD1Ev @ 136 NONAME
+	_ZN19CSetObjectPropValueD2Ev @ 137 NONAME
+	_ZN20CGetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 138 NONAME
+	_ZN20CGetObjectReferencesD0Ev @ 139 NONAME
+	_ZN20CGetObjectReferencesD1Ev @ 140 NONAME
+	_ZN20CGetObjectReferencesD2Ev @ 141 NONAME
+	_ZN20CSetObjectReferences22DoHandleResponsePhaseLEv @ 142 NONAME
+	_ZN20CSetObjectReferences22DoSetObjectReferencesLERK18CMTPObjectMetaData @ 143 NONAME
+	_ZN20CSetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 144 NONAME
+	_ZN20CSetObjectReferences8ServiceLEv @ 145 NONAME
+	_ZN20CSetObjectReferencesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 146 NONAME
+	_ZN20CSetObjectReferencesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 147 NONAME
+	_ZN20CSetObjectReferencesD0Ev @ 148 NONAME
+	_ZN20CSetObjectReferencesD1Ev @ 149 NONAME
+	_ZN20CSetObjectReferencesD2Ev @ 150 NONAME
+	_ZN22CGetFormatCapabilities10ConstructLEv @ 151 NONAME
+	_ZN22CGetFormatCapabilities13CheckRequestLEv @ 152 NONAME
+	_ZN22CGetFormatCapabilities4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 153 NONAME
+	_ZN22CGetFormatCapabilities8ServiceLEv @ 154 NONAME
+	_ZN22CGetFormatCapabilitiesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 155 NONAME
+	_ZN22CGetFormatCapabilitiesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 156 NONAME
+	_ZN22CGetFormatCapabilitiesD0Ev @ 157 NONAME
+	_ZN22CGetFormatCapabilitiesD1Ev @ 158 NONAME
+	_ZN22CGetFormatCapabilitiesD2Ev @ 159 NONAME
+	_ZN23CMmMtpDpAccessSingleton12OpenSessionLEv @ 160 NONAME
+	_ZN23CMmMtpDpAccessSingleton13CloseSessionLEv @ 161 NONAME
+	_ZN23CMmMtpDpAccessSingleton17GetAccessWrapperLEv @ 162 NONAME
+	_ZN23CMmMtpDpAccessSingleton7CreateLER25MMTPDataProviderFramework @ 163 NONAME
+	_ZN23CMmMtpDpAccessSingleton7ReleaseEv @ 164 NONAME
+	_ZN23CPropertySettingUtility20SetMetaDataToWrapperER14MMmMtpDpConfigtR8MMTPTypeRK18CMTPObjectMetaData @ 165 NONAME
+	_ZN23CPropertySettingUtilityC2Ev @ 166 NONAME
+	_ZN23CPropertySettingUtilityD0Ev @ 167 NONAME
+	_ZN23CPropertySettingUtilityD1Ev @ 168 NONAME
+	_ZN23CPropertySettingUtilityD2Ev @ 169 NONAME
+	_ZN24CGetObjectPropsSupported4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 170 NONAME
+	_ZN24CGetObjectPropsSupported8ServiceLEv @ 171 NONAME
+	_ZN24CGetObjectPropsSupportedD0Ev @ 172 NONAME
+	_ZN24CGetObjectPropsSupportedD1Ev @ 173 NONAME
+	_ZN24CGetObjectPropsSupportedD2Ev @ 174 NONAME
+	_ZN26CGetInterdependentPropDesc10ConstructLEv @ 175 NONAME
+	_ZN26CGetInterdependentPropDesc13CheckRequestLEv @ 176 NONAME
+	_ZN26CGetInterdependentPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 177 NONAME
+	_ZN26CGetInterdependentPropDesc8ServiceLEv @ 178 NONAME
+	_ZN26CGetInterdependentPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 179 NONAME
+	_ZN26CGetInterdependentPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 180 NONAME
+	_ZN26CGetInterdependentPropDescD0Ev @ 181 NONAME
+	_ZN26CGetInterdependentPropDescD1Ev @ 182 NONAME
+	_ZN26CGetInterdependentPropDescD2Ev @ 183 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper13AddDummyFileLERK7TDesC16 @ 184 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper13RenameObjectLERK18CMTPObjectMetaDataRK7TDesC16 @ 185 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper13SetReferenceLERK18CMTPObjectMetaDataR12CDesC16Array @ 186 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper15CreateDummyFileERK7TDesC16 @ 187 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper15DeleteDummyFileERK7TDesC16 @ 188 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper16CleanupDatabaseLEv @ 189 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper16GetAllReferenceLEP9CMPXMediaR12CDesC16Array @ 190 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper17SetAbstractMediaLERK7TDesC16R12CDesC16Array19TMPXGeneralCategory @ 191 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper19GetModifiedContentLERK7TDesC16RiR12CDesC16Array @ 192 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper20GetAllAbstractMediaLERK7TDesC16PP14CMPXMediaArray19TMPXGeneralCategory @ 193 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper21GetAbstractMediaNameLEP9CMPXMedia19TMPXGeneralCategory @ 194 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper22UpdateMusicCollectionLEv @ 195 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper23GetObjectMetadataValueLEtR8MMTPTypeRK18CMTPObjectMetaData @ 196 NONAME
-	_ZNK11CSendObject12HasDataphaseEv @ 197 NONAME
-	_ZNK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 198 NONAME
-	_ZNK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 199 NONAME
-	_ZNK17CRequestProcessor10ConnectionEv @ 200 NONAME
-	_ZNK17CRequestProcessor12HasDataphaseEv @ 201 NONAME
-	_ZNK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 202 NONAME
-	_ZNK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 203 NONAME
-	_ZNK17CRequestProcessor7RequestEv @ 204 NONAME
-	_ZNK18CSetObjectPropList12HasDataphaseEv @ 205 NONAME
-	_ZNK19CSetObjectPropValue12HasDataphaseEv @ 206 NONAME
-	_ZNK20CSetObjectReferences12HasDataphaseEv @ 207 NONAME
-	_ZTI10CGetObject @ 208 NONAME
-	_ZTI11CCopyObject @ 209 NONAME
-	_ZTI11CMoveObject @ 210 NONAME
-	_ZTI11CSendObject @ 211 NONAME
-	_ZTI13CDeleteObject @ 212 NONAME
-	_ZTI13CRenameObject @ 213 NONAME
-	_ZTI14CGetObjectInfo @ 214 NONAME
-	_ZTI15CRequestChecker @ 215 NONAME
-	_ZTI15CRequestUnknown @ 216 NONAME
-	_ZTI15TMTPTypeFlatBuf @ 217 NONAME
-	_ZTI17CGetPartialObject @ 218 NONAME
-	_ZTI17CRequestProcessor @ 219 NONAME
-	_ZTI18CGetObjectPropDesc @ 220 NONAME
-	_ZTI18CGetObjectPropList @ 221 NONAME
-	_ZTI18CHXMetaDataUtility @ 222 NONAME
-	_ZTI18CSetObjectPropList @ 223 NONAME
-	_ZTI19CDescriptionUtility @ 224 NONAME
-	_ZTI19CGetObjectPropValue @ 225 NONAME
-	_ZTI19CSetObjectPropValue @ 226 NONAME
-	_ZTI20CGetObjectReferences @ 227 NONAME
-	_ZTI20CSetObjectReferences @ 228 NONAME
-	_ZTI22CGetFormatCapabilities @ 229 NONAME
-	_ZTI23CMmMtpDpAccessSingleton @ 230 NONAME
-	_ZTI23CPropertySettingUtility @ 231 NONAME
-	_ZTI24CGetObjectPropsSupported @ 232 NONAME
-	_ZTI25CMmMtpDpMetadataMpxAccess @ 233 NONAME
-	_ZTI26CGetInterdependentPropDesc @ 234 NONAME
-	_ZTI27CMmMtpDpMetadataVideoAccess @ 235 NONAME
-	_ZTI29CMmMtpDpMetadataAccessWrapper @ 236 NONAME
-	_ZTV10CGetObject @ 237 NONAME
-	_ZTV11CCopyObject @ 238 NONAME
-	_ZTV11CMoveObject @ 239 NONAME
-	_ZTV11CSendObject @ 240 NONAME
-	_ZTV13CDeleteObject @ 241 NONAME
-	_ZTV13CRenameObject @ 242 NONAME
-	_ZTV14CGetObjectInfo @ 243 NONAME
-	_ZTV15CRequestChecker @ 244 NONAME
-	_ZTV15CRequestUnknown @ 245 NONAME
-	_ZTV15TMTPTypeFlatBuf @ 246 NONAME
-	_ZTV17CGetPartialObject @ 247 NONAME
-	_ZTV17CRequestProcessor @ 248 NONAME
-	_ZTV18CGetObjectPropDesc @ 249 NONAME
-	_ZTV18CGetObjectPropList @ 250 NONAME
-	_ZTV18CHXMetaDataUtility @ 251 NONAME
-	_ZTV18CSetObjectPropList @ 252 NONAME
-	_ZTV19CDescriptionUtility @ 253 NONAME
-	_ZTV19CGetObjectPropValue @ 254 NONAME
-	_ZTV19CSetObjectPropValue @ 255 NONAME
-	_ZTV20CGetObjectReferences @ 256 NONAME
-	_ZTV20CSetObjectReferences @ 257 NONAME
-	_ZTV22CGetFormatCapabilities @ 258 NONAME
-	_ZTV23CMmMtpDpAccessSingleton @ 259 NONAME
-	_ZTV23CPropertySettingUtility @ 260 NONAME
-	_ZTV24CGetObjectPropsSupported @ 261 NONAME
-	_ZTV25CMmMtpDpMetadataMpxAccess @ 262 NONAME
-	_ZTV26CGetInterdependentPropDesc @ 263 NONAME
-	_ZTV27CMmMtpDpMetadataVideoAccess @ 264 NONAME
-	_ZTV29CMmMtpDpMetadataAccessWrapper @ 265 NONAME
-	_ZThn28_N11CSendObject13UsbDisconnectEv @ 266 NONAME
-	_ZThn28_N17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 267 NONAME
-	_ZThn28_N17CRequestProcessor13UsbDisconnectEv @ 268 NONAME
-	_ZThn28_N17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 269 NONAME
-	_ZThn28_N17CRequestProcessor7ReleaseEv @ 270 NONAME
-	_ZThn28_N17CRequestProcessor9SessionIdEv @ 271 NONAME
-	_ZThn28_NK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 272 NONAME
-	_ZThn28_NK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 273 NONAME
-	_ZThn28_NK17CRequestProcessor10ConnectionEv @ 274 NONAME
-	_ZThn28_NK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 275 NONAME
-	_ZThn28_NK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 276 NONAME
-	_ZThn28_NK17CRequestProcessor7RequestEv @ 277 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper19GetModifiedContentLERK7TDesC16RiR12CDesC16Array @ 191 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper20GetAllAbstractMediaLERK7TDesC16PP14CMPXMediaArray19TMPXGeneralCategory @ 192 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper21GetAbstractMediaNameLEP9CMPXMedia19TMPXGeneralCategory @ 193 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper22UpdateMusicCollectionLEv @ 194 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper23GetObjectMetadataValueLEtR8MMTPTypeRK18CMTPObjectMetaData @ 195 NONAME
+	_ZNK11CSendObject12HasDataphaseEv @ 196 NONAME
+	_ZNK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 197 NONAME
+	_ZNK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 198 NONAME
+	_ZNK17CRequestProcessor10ConnectionEv @ 199 NONAME
+	_ZNK17CRequestProcessor12HasDataphaseEv @ 200 NONAME
+	_ZNK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 201 NONAME
+	_ZNK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 202 NONAME
+	_ZNK17CRequestProcessor7RequestEv @ 203 NONAME
+	_ZNK18CSetObjectPropList12HasDataphaseEv @ 204 NONAME
+	_ZNK19CSetObjectPropValue12HasDataphaseEv @ 205 NONAME
+	_ZNK20CSetObjectReferences12HasDataphaseEv @ 206 NONAME
+	_ZTI10CGetObject @ 207 NONAME
+	_ZTI11CCopyObject @ 208 NONAME
+	_ZTI11CMoveObject @ 209 NONAME
+	_ZTI11CSendObject @ 210 NONAME
+	_ZTI13CDeleteObject @ 211 NONAME
+	_ZTI13CRenameObject @ 212 NONAME
+	_ZTI14CGetObjectInfo @ 213 NONAME
+	_ZTI15CRequestChecker @ 214 NONAME
+	_ZTI15CRequestUnknown @ 215 NONAME
+	_ZTI15TMTPTypeFlatBuf @ 216 NONAME
+	_ZTI17CGetPartialObject @ 217 NONAME
+	_ZTI17CRequestProcessor @ 218 NONAME
+	_ZTI18CGetObjectPropDesc @ 219 NONAME
+	_ZTI18CGetObjectPropList @ 220 NONAME
+	_ZTI18CHXMetaDataUtility @ 221 NONAME
+	_ZTI18CSetObjectPropList @ 222 NONAME
+	_ZTI19CDescriptionUtility @ 223 NONAME
+	_ZTI19CGetObjectPropValue @ 224 NONAME
+	_ZTI19CSetObjectPropValue @ 225 NONAME
+	_ZTI20CGetObjectReferences @ 226 NONAME
+	_ZTI20CSetObjectReferences @ 227 NONAME
+	_ZTI22CGetFormatCapabilities @ 228 NONAME
+	_ZTI23CMmMtpDpAccessSingleton @ 229 NONAME
+	_ZTI23CPropertySettingUtility @ 230 NONAME
+	_ZTI24CGetObjectPropsSupported @ 231 NONAME
+	_ZTI25CMmMtpDpMetadataMpxAccess @ 232 NONAME
+	_ZTI26CGetInterdependentPropDesc @ 233 NONAME
+	_ZTI27CMmMtpDpMetadataVideoAccess @ 234 NONAME
+	_ZTI29CMmMtpDpMetadataAccessWrapper @ 235 NONAME
+	_ZTV10CGetObject @ 236 NONAME
+	_ZTV11CCopyObject @ 237 NONAME
+	_ZTV11CMoveObject @ 238 NONAME
+	_ZTV11CSendObject @ 239 NONAME
+	_ZTV13CDeleteObject @ 240 NONAME
+	_ZTV13CRenameObject @ 241 NONAME
+	_ZTV14CGetObjectInfo @ 242 NONAME
+	_ZTV15CRequestChecker @ 243 NONAME
+	_ZTV15CRequestUnknown @ 244 NONAME
+	_ZTV15TMTPTypeFlatBuf @ 245 NONAME
+	_ZTV17CGetPartialObject @ 246 NONAME
+	_ZTV17CRequestProcessor @ 247 NONAME
+	_ZTV18CGetObjectPropDesc @ 248 NONAME
+	_ZTV18CGetObjectPropList @ 249 NONAME
+	_ZTV18CHXMetaDataUtility @ 250 NONAME
+	_ZTV18CSetObjectPropList @ 251 NONAME
+	_ZTV19CDescriptionUtility @ 252 NONAME
+	_ZTV19CGetObjectPropValue @ 253 NONAME
+	_ZTV19CSetObjectPropValue @ 254 NONAME
+	_ZTV20CGetObjectReferences @ 255 NONAME
+	_ZTV20CSetObjectReferences @ 256 NONAME
+	_ZTV22CGetFormatCapabilities @ 257 NONAME
+	_ZTV23CMmMtpDpAccessSingleton @ 258 NONAME
+	_ZTV23CPropertySettingUtility @ 259 NONAME
+	_ZTV24CGetObjectPropsSupported @ 260 NONAME
+	_ZTV25CMmMtpDpMetadataMpxAccess @ 261 NONAME
+	_ZTV26CGetInterdependentPropDesc @ 262 NONAME
+	_ZTV27CMmMtpDpMetadataVideoAccess @ 263 NONAME
+	_ZTV29CMmMtpDpMetadataAccessWrapper @ 264 NONAME
+	_ZThn28_N11CSendObject13UsbDisconnectEv @ 265 NONAME
+	_ZThn28_N17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 266 NONAME
+	_ZThn28_N17CRequestProcessor13UsbDisconnectEv @ 267 NONAME
+	_ZThn28_N17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 268 NONAME
+	_ZThn28_N17CRequestProcessor7ReleaseEv @ 269 NONAME
+	_ZThn28_N17CRequestProcessor9SessionIdEv @ 270 NONAME
+	_ZThn28_NK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 271 NONAME
+	_ZThn28_NK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 272 NONAME
+	_ZThn28_NK17CRequestProcessor10ConnectionEv @ 273 NONAME
+	_ZThn28_NK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 274 NONAME
+	_ZThn28_NK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 275 NONAME
+	_ZThn28_NK17CRequestProcessor7RequestEv @ 276 NONAME
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/ccopyobject.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/ccopyobject.h	Wed Mar 31 22:26:09 2010 +0300
@@ -21,7 +21,6 @@
 
 #include "crequestprocessor.h"
 
-class RFs;
 class CMTPObjectMetaData;
 class CMTPTypeObjectPropList;
 class CMTPTypeObjectPropListElement;
@@ -34,17 +33,6 @@
     {
 public:
     /**
-    * Two-phase construction method
-    * @param aFramework    The data provider framework
-    * @param aConnection    The connection from which the request comes
-    * @param aWrapper    medadata access interface
-    * @return a pointer to the created request processor object
-    */
-    //IMPORT_C static MMmRequestProcessor* NewL( MMTPDataProviderFramework& aFramework,
-    //        MMTPConnection& aConnection,
-    //        CMmMtpDpMetadataAccessWrapper& aWrapper );
-
-    /**
     * Destructor
     */
     IMPORT_C virtual ~CCopyObject();
@@ -54,8 +42,8 @@
     * Standard c++ constructor
     */
     IMPORT_C CCopyObject( MMTPDataProviderFramework& aFramework,
-            MMTPConnection& aConnection,
-            MMmMtpDpConfig& aDpConfig );
+        MMTPConnection& aConnection,
+        MMmMtpDpConfig& aDpConfig );
 
     /**
     * Second phase constructor
@@ -79,15 +67,22 @@
     */
     void GetParametersL();
 
+    /**
+     * Set a default destination if it is not specified
+     */
     void SetDefaultParentObjectL();
 
     /**
-    * Copy object operation
+    * Copy file and metadata and send response to pc
+    * If everything was right, the handle of newly created file
+    * should be sent back
     */
     void CopyObjectL();
 
     /**
-    * Check if we can copy the file to the new location
+    * Check if the file can be copied
+    * @param aOldName used to get file size
+    * @param aNewName the full path name of newly copied file
     */
     TMTPResponseCode CanCopyObjectL( const TDesC& aOldName,
         const TDesC& aNewName ) const;
@@ -95,22 +90,26 @@
     /**
     * Save the object properties before doing the copy
     */
-    void GetPreviousPropertiesL( const CMTPObjectMetaData& aObject );
+    void GetPreviousPropertiesL();
 
     /**
     * Set the object properties after doing the copy
     */
-    void SetPreviousPropertiesL( const CMTPObjectMetaData& aObject );
+    void SetPreviousPropertiesL();
 
     /**
     * A helper function of CopyObjectL.
     * @param aNewFileName the new full filename after copy.
-    * @return objectHandle of new copy of object.
+    * @return handle of the newly copied object.
     */
     TUint32 CopyFileL( const TDesC& aNewFileName );
 
     /**
-    * Update object info in the database.
+    * Add metadata of the newly created file into database and
+    * update related references
+    * @param aOldObjectName old reference owner
+    * @param aNewObjectName new reference owner
+    * @return handle of the newly copied object
     */
     TUint32 AddObjectToStoreL( const TDesC& aOldObjectName,
         const TDesC& aNewObjectName );
@@ -122,7 +121,8 @@
 
 private:
     TUint32 iStorageId;
-    CMTPObjectMetaData* iObjectInfo; // Not owned
+    CMTPObjectMetaData* iSourceObject;
+    CMTPObjectMetaData* iTargetObject;
     HBufC* iDest;
     TUint32 iNewParentHandle;
     TTime iPreviousModifiedTime;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cdeleteobject.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cdeleteobject.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,16 +19,11 @@
 #ifndef CDELETEOBJECT_H
 #define CDELETEOBJECT_H
 
-#include <f32file.h>
 #include <d32dbms.h>
-#include <badesca.h>
 
 #include "crequestprocessor.h"
 
 //forward declaration
-class RFs;
-class CMTPTypeArray;
-class MMTPObjectMgr;
 class MMmMtpDpConfig;
 
 /**
@@ -110,12 +105,6 @@
     void DeleteObjectL( const CMTPObjectMetaData& aObjectInfo );
 
 private:
-    // MTP Object Manager
-    MMTPObjectMgr& iObjectMgr;
-
-    // File server used to open the database
-    RFs& iFs;
-
     //  Array of all the objects to delete
     RArray<TUint> iObjectsToDelete;
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetformatcapabilities.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetformatcapabilities.h	Wed Mar 31 22:26:09 2010 +0300
@@ -24,7 +24,6 @@
 // forward declaration
 class MMmMtpDpConfig;
 class CMTPTypeObjectPropDesc;
-class CMTPTypeInterdependentPropDesc;
 
 /**
 Implements the file data provider CMTPGetFormatCapabilities request processor.
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobject.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobject.h	Wed Mar 31 22:26:09 2010 +0300
@@ -22,7 +22,6 @@
 #include "crequestprocessor.h"
 
 // forward declaration
-class RFs;
 class CMTPTypeFile;
 class MMmMtpDpConfig;
 
@@ -78,9 +77,6 @@
     void GetObjectL( const TDesC& aFileName );
 
 private:
-    // File server used to open the database
-    RFs& iFs;
-
     // File Object to encapsulate the object to send back
     CMTPTypeFile* iFileObject;
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectinfo.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectinfo.h	Wed Mar 31 22:26:09 2010 +0300
@@ -22,7 +22,6 @@
 #include "crequestprocessor.h"
 
 // forward declacration
-class CMmMtpDpMetadataAccessWrapper;
 class CMTPTypeObjectInfo;
 class MMmMtpDpConfig;
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectpropvalue.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectpropvalue.h	Wed Mar 31 22:26:09 2010 +0300
@@ -29,7 +29,6 @@
 class TMTPTypeUint128;
 class CMTPTypeString;
 class CMTPTypeArray;
-class TMTPObjectInfo;
 class MMmMtpDpConfig;
 
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetpartialobject.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetpartialobject.h	Wed Mar 31 22:26:09 2010 +0300
@@ -21,7 +21,6 @@
 
 #include "crequestprocessor.h"
 
-class MMTPDataProviderFramework;
 class CMTPTypeFile;
 class CMmMtpDpMetadataAccessWrapper;
 class MMmMtpDpConfig;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cmoveobject.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cmoveobject.h	Wed Mar 31 22:26:09 2010 +0300
@@ -22,7 +22,6 @@
 #include "crequestprocessor.h"
 
 class CMTPObjectMetaData;
-class CMmMtpDpMetadataAccessWrapper;
 class CMTPTypeObjectPropList;
 class CMTPTypeObjectPropListElement;
 class MMmMtpDpConfig;
@@ -112,8 +111,7 @@
     /**
     * Set the object properties in the object property store.
     */
-    void SetPropertiesL( const TDesC& aOldFileName,
-        const TDesC& aNewFileName );
+    void SetPropertiesL( const TDesC& aNewFileName );
 
     /*
     * Move a single object and update the database
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crenameobject.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crenameobject.h	Wed Mar 31 22:26:09 2010 +0300
@@ -22,7 +22,6 @@
 // Forward declarations
 class MMTPDataProviderFramework;
 class CMmMtpDpMetadataAccessWrapper;
-class MMTPObjectMgr;
 class CMTPObjectMetaData;
 
 class CRenameObject: public CActive
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,11 +19,9 @@
 #ifndef CREQUESTCHECKER_H
 #define CREQUESTCHECKER_H
 
-#include <e32base.h>
-#include <mtp/mtpprotocolconstants.h>
 #include <mtp/tmtptyperequest.h>
+#include <mtp/cmtpobjectmetadata.h>
 
-class CMTPObjectMetaData;
 class MMTPDataProviderFramework;
 class MMTPConnection;
 
@@ -121,7 +119,7 @@
     * @return a pointer to the created request checker object
     */
     static CRequestChecker* NewL( MMTPDataProviderFramework& aFramework,
-            MMTPConnection& aConnection );
+        MMTPConnection& aConnection );
 
     /**
     * Destructor
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestprocessor.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestprocessor.h	Wed Mar 31 22:26:09 2010 +0300
@@ -19,22 +19,24 @@
 #ifndef CREQUESTPROCESSOR_H
 #define CREQUESTPROCESSOR_H
 
-#include <e32base.h>
+
+#include <mtp/tmtptypenull.h>
 #include <mtp/mtpdataproviderapitypes.h>
 #include <mtp/mtpprotocolconstants.h>
 #include <mtp/tmtptyperesponse.h>
-#include <mtp/tmtptypenull.h>
+
+// for derived processors
+#include <mtp/mmtpdataproviderframework.h>
 
 #include "crequestchecker.h"
 
 class MMTPConnection;
 class TMTPTypeRequest;
-class CMTPDataProviderPlugin;
 class MMTPDataProviderFramework;
 class TMTPTypeEvent;
 class CMTPObjectInfo;
 
-static const TInt KMmMtpRArrayGranularity = 2;
+const TInt KMmMtpRArrayGranularity = 2;
 
 /**
 * Defines a request processor interface
@@ -111,9 +113,8 @@
 /**
 * Defines a processor factory function pointer
 */
-typedef MMmRequestProcessor
-    * (*TMTPRequestProcessorCreateFunc)( MMTPDataProviderFramework& aFramework,
-        MMTPConnection& aConnection );
+typedef MMmRequestProcessor* (*TMTPRequestProcessorCreateFunc)( MMTPDataProviderFramework& aFramework,
+    MMTPConnection& aConnection );
 
 /**
 * Defines an entry which maps from operation code to the request processor
@@ -243,6 +244,7 @@
     * @return session id
     */
     IMPORT_C TUint32 SessionId();
+
 protected:
     // from CActive
     /**
@@ -261,7 +263,7 @@
     IMPORT_C TInt RunError( TInt aError );
 
 protected:
-    //new virtuals
+    // new virtuals
     /**
     * Handle the request phase of the current request
     * @return EFalse
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csetobjectreferences.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csetobjectreferences.h	Wed Mar 31 22:26:09 2010 +0300
@@ -64,16 +64,9 @@
 protected:
     /**
     * set references to DB
-    * @param aWrapper          medadata access interface
-    * @param aObjectFormat     the format of the file
-    * @param aSrcFileName      file name, from
-    * @param aRefFileArray     the array of file names, to
+    * @param aObject, the reference owner
     */
-    IMPORT_C virtual void
-        DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper,
-            TUint16 aObjectFormat,
-            const TDesC& aSrcFileName,
-            CDesCArray& aRefFileArray );
+    void DoSetObjectReferencesL( const CMTPObjectMetaData& aObject );
 
 private:
     //from CRequestProcessor
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/ccopyobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/ccopyobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -17,11 +17,9 @@
 
 #include <bautils.h>
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/mmtpreferencemgr.h>
 #include <mtp/mmtpstoragemgr.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
 #include <mtp/cmtptypeobjectproplist.h>
@@ -74,6 +72,7 @@
     {
     Cancel();
 
+    delete iTargetObject;
     delete iDest;
 
     if ( iPropertyElement )
@@ -93,7 +92,9 @@
             aConnection, 
             sizeof( KMTPCopyObjectPolicy ) / sizeof( TMTPRequestElementInfo ),
             KMTPCopyObjectPolicy ),
-        iDpConfig( aDpConfig )
+        iDpConfig( aDpConfig ),
+        iSourceObject( NULL ),
+        iTargetObject( NULL )
     {
     PRINT( _L( "Operation: CopyObject(0x101A)" ) );
     }
@@ -144,7 +145,7 @@
     newObjectName.CleanupClosePushL(); // + newObjectName
     newObjectName = *iDest;
 
-    const TDesC& suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) );
+    const TDesC& suid( iSourceObject->DesC( CMTPObjectMetaData::ESuid ) );
     TParsePtrC fileNameParser( suid );
     if ( ( newObjectName.Length() + fileNameParser.NameAndExt().Length() )
         <= newObjectName.MaxLength() )
@@ -191,8 +192,8 @@
         iNewParentHandle );
 
     // not taking owernship
-    iObjectInfo = iRequestChecker->GetObjectInfo( objectHandle );
-    __ASSERT_DEBUG( iObjectInfo, Panic( EMmMTPDpObjectNull ) );
+    iSourceObject = iRequestChecker->GetObjectInfo( objectHandle );
+    __ASSERT_DEBUG( iSourceObject, Panic( EMmMTPDpObjectNull ) );
 
     if ( iNewParentHandle == KMTPHandleNone )
         {
@@ -213,7 +214,7 @@
 
 // -----------------------------------------------------------------------------
 // CCopyObject::SetDefaultParentObjectL
-// Get a default parent object, ff the request does not specify a parent object,
+// Set a default destination, if the request does not specify a parent object,
 // -----------------------------------------------------------------------------
 //
 void CCopyObject::SetDefaultParentObjectL()
@@ -280,7 +281,7 @@
 #endif
         }
     // This is used to keep the same behavior in mass storage and device file manager.
-    else if ( iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode )
+    else if ( iSourceObject->Uint( CMTPObjectMetaData::EFormatCode )
         == EMTPFormatCodeAbstractAudioVideoPlaylist )
         {
         PRINT( _L( "MM MTP <> CCopyObject::CanCopyObjectL playlist file can't copy" ) );
@@ -298,31 +299,25 @@
 //
 TUint32 CCopyObject::CopyFileL( const TDesC& aNewFileName )
     {
-    const TDesC& suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) );
-    PRINT2( _L( "MM MTP => CCopyObject::CopyFileL old name = %S, aNewFileName = %S" ),
-        &suid,
-        &aNewFileName );
+    PRINT( _L( "MM MTP => CCopyObject::CopyFileL" ) );
 
-    GetPreviousPropertiesL( *iObjectInfo );
+    GetPreviousPropertiesL();
 
     // TODO: Need rollback mechanism for consistant with image dp in fw.
     // Not sure if it should be trap if something wrong with MPX db.
-    TUint32 handle = AddObjectToStoreL( suid, aNewFileName );
+    TPtrC oldFileName( iSourceObject->DesC( CMTPObjectMetaData::ESuid ) );
+    TUint32 handle = AddObjectToStoreL( oldFileName, aNewFileName );
 
     // Only leave when getting proplist element from data received by fw.
     // It should not happen after ReceiveDataL in which construction of proplist already succeed.
-    SetPreviousPropertiesL( *iObjectInfo );
+    SetPreviousPropertiesL();
 
     CFileMan* fileMan = CFileMan::NewL( iFramework.Fs() );
-    User::LeaveIfError( fileMan->Copy( suid, aNewFileName ) );
+    User::LeaveIfError( fileMan->Copy( oldFileName, aNewFileName ) );
     delete fileMan;
     fileMan = NULL;
 
-    User::LeaveIfError( iFramework.Fs().SetModified( aNewFileName,
-        iPreviousModifiedTime ) );
-
-    PRINT1( _L( "MM MTP <= CCopyObject::CopyFileL handle = 0x%x" ), handle );
-
+    PRINT( _L( "MM MTP <= CCopyObject::CopyFileL" ) );
     return handle;
     }
 
@@ -331,20 +326,17 @@
 // Save the object properties before doing the copy
 // -----------------------------------------------------------------------------
 //
-void CCopyObject::GetPreviousPropertiesL( const CMTPObjectMetaData& aObject )
+void CCopyObject::GetPreviousPropertiesL()
     {
     PRINT( _L( "MM MTP => CCopyObject::GetPreviousPropertiesL" ) );
 
-    const TDesC& suid( aObject.DesC( CMTPObjectMetaData::ESuid ) );
-    User::LeaveIfError( iFramework.Fs().Modified( suid, iPreviousModifiedTime ) );
-
-    TUint formatCode = aObject.Uint( CMTPObjectMetaData::EFormatCode );
+    TUint formatCode = iSourceObject->Uint( CMTPObjectMetaData::EFormatCode );
     const RArray<TUint>* properties = iDpConfig.GetSupportedPropertiesL( formatCode );
     TInt count = properties->Count();
 
     TInt err = KErrNone;
     TUint16 propCode;
-    TUint32 handle = aObject.Uint( CMTPObjectMetaData::EHandle );
+    TUint32 handle = iSourceObject->Uint( CMTPObjectMetaData::EHandle );
 
     if ( iPropertyElement != NULL )
         {
@@ -372,41 +364,39 @@
             case EMTPObjectPropCodeNonConsumable:
                 iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) );
                 iPropertyElement->SetUint8L( CMTPTypeObjectPropListElement::EValue,
-                    aObject.Uint( CMTPObjectMetaData::ENonConsumable ) );
+                    iSourceObject->Uint( CMTPObjectMetaData::ENonConsumable ) );
                 break;
 
             case EMTPObjectPropCodeName:
             case EMTPObjectPropCodeDateAdded:
-                if ( ( propCode == EMTPObjectPropCodeName )
-                    || ( !MmMtpDpUtility::IsVideoL( aObject.DesC( CMTPObjectMetaData::ESuid ), iFramework )
-                        && ( propCode == EMTPObjectPropCodeDateAdded ) ) )
-                    {
-                    CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData
+            case EMTPObjectPropCodeAlbumArtist:
+                {
+                CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData
 
-                    TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode,
-                        *textData,
-                        aObject ) );
+                TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode,
+                    *textData,
+                    *iSourceObject ) );
 
-                    PRINT1( _L( "MM MTP <> CCopyObject::GetPreviousPropertiesL err = %d" ), err );
+                PRINT1( _L( "MM MTP <> CCopyObject::GetPreviousPropertiesL err = %d" ), err );
 
-                    if ( err == KErrNone )
-                        {
-                        iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) );
-                        iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue,
-                            textData->StringChars() );
-                        }
-                    else
-                        {
-                        iPropertyElement = NULL;
-                        }
+                if ( err == KErrNone )
+                    {
+                    iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) );
+                    iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue,
+                        textData->StringChars() );
+                    }
+                else
+                    {
+                    iPropertyElement = NULL;
+                    }
 
-                    CleanupStack::PopAndDestroy( textData ); // - textData
-                    }
+                CleanupStack::PopAndDestroy( textData ); // - textData
+                }
                 break;
 
             default:
                 {
-                ServiceGetSpecificObjectPropertyL( propCode, handle, aObject );
+                ServiceGetSpecificObjectPropertyL( propCode, handle, *iSourceObject );
                 }
                 break;
             }
@@ -426,7 +416,7 @@
 // Set the object properties after doing the copy
 // -----------------------------------------------------------------------------
 //
-void CCopyObject::SetPreviousPropertiesL( const CMTPObjectMetaData& aObject )
+void CCopyObject::SetPreviousPropertiesL()
     {
     PRINT( _L( "MM MTP => CCopyObject::SetPreviousPropertiesL" ) );
 
@@ -461,22 +451,23 @@
                 break;
 
             case EMTPObjectPropCodeNonConsumable:
-                iObjectInfo->SetUint( CMTPObjectMetaData::ENonConsumable,
+                iTargetObject->SetUint( CMTPObjectMetaData::ENonConsumable,
                     element.Uint8L( CMTPTypeObjectPropListElement::EValue ) );
                 // TODO: need to reconsider,
                 // should wait all property setting finished then insert object, or not?
                 // need to investigate if it will affect performance result
-                iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
+                iFramework.ObjectMgr().ModifyObjectL( *iTargetObject );
                 break;
 
             case EMTPObjectPropCodeName:
+            case EMTPObjectPropCodeAlbumArtist:
                 {
                 CMTPTypeString *stringData = CMTPTypeString::NewLC( element.StringL( CMTPTypeObjectPropListElement::EValue ) ); // + stringData
 
                 respcode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig,
                     propertyCode,
                     *stringData,
-                    aObject );
+                    *iTargetObject );
 
                 CleanupStack::PopAndDestroy( stringData ); // - stringData
                 }
@@ -486,7 +477,7 @@
                 {
                 respcode = iDpConfig.PropSettingUtility()->SetSpecificObjectPropertyL( iDpConfig,
                     propertyCode,
-                    aObject,
+                    *iTargetObject,
                     element );
                 }
                 break;
@@ -514,21 +505,21 @@
         &aOldObjectName,
         &aNewObjectName );
 
-    CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo
+    iTargetObject = CMTPObjectMetaData::NewL();
 
     // 1. Add new object into objectMgr db
-    objectInfo->SetUint( CMTPObjectMetaData::EDataProviderId, iObjectInfo->Uint( CMTPObjectMetaData::EDataProviderId ) );
-    TUint formatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode );
-    objectInfo->SetUint( CMTPObjectMetaData::EFormatCode, formatCode );
-    TUint subFormatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatSubCode );
-    objectInfo->SetUint( CMTPObjectMetaData::EFormatSubCode, subFormatCode );
-    objectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle );
-    objectInfo->SetUint( CMTPObjectMetaData::EStorageId, iStorageId );
-    objectInfo->SetDesCL( CMTPObjectMetaData::ESuid, aNewObjectName );
-    iFramework.ObjectMgr().InsertObjectL( *objectInfo );
+    iTargetObject->SetUint( CMTPObjectMetaData::EDataProviderId, iSourceObject->Uint( CMTPObjectMetaData::EDataProviderId ) );
+    TUint formatCode = iSourceObject->Uint( CMTPObjectMetaData::EFormatCode );
+    iTargetObject->SetUint( CMTPObjectMetaData::EFormatCode, formatCode );
+    TUint subFormatCode = iSourceObject->Uint( CMTPObjectMetaData::EFormatSubCode );
+    iTargetObject->SetUint( CMTPObjectMetaData::EFormatSubCode, subFormatCode );
+    iTargetObject->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle );
+    iTargetObject->SetUint( CMTPObjectMetaData::EStorageId, iStorageId );
+    iTargetObject->SetDesCL( CMTPObjectMetaData::ESuid, aNewObjectName );
+    iFramework.ObjectMgr().InsertObjectL( *iTargetObject );
 
     // 2. Add new object into MPX db
-    iDpConfig.GetWrapperL().AddObjectL( aNewObjectName, formatCode, subFormatCode );
+    iDpConfig.GetWrapperL().AddObjectL( *iTargetObject );
 
     // 3. Set references into references db
     if ( formatCode == EMTPFormatCodeM3UPlaylist )
@@ -539,8 +530,7 @@
         CleanupStack::PopAndDestroy( references ); // - references
         }
 
-    TUint32 handle = objectInfo->Uint( CMTPObjectMetaData::EHandle );
-    CleanupStack::PopAndDestroy( objectInfo ); // - objectInfo
+    TUint32 handle = iTargetObject->Uint( CMTPObjectMetaData::EHandle );
 
     PRINT1( _L( "MM MTP <= CCopyObject::AddObjectToStoreL handle = 0x%x" ), handle );
     return handle;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,10 +16,8 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/mmtpreferencemgr.h>
-#include <mtp/cmtpobjectmetadata.h>
 
 #include "cdeleteobject.h"
 #include "mmmtpdplogger.h"
@@ -27,7 +25,7 @@
 #include "cmmmtpdpmetadataaccesswrapper.h"
 #include "mmmtpdputility.h"
 
-static const TInt KMaxDeletionTimes = 10;
+const TInt KMaxDeletionTimes = 10;
 const TInt KDeletionThreshold = 100 * 1000; // (100 millisec)
 
 // -----------------------------------------------------------------------------
@@ -92,8 +90,6 @@
         aConnection,
         sizeof( KMTPDeleteObjectPolicy ) / sizeof( TMTPRequestElementInfo ),
         KMTPDeleteObjectPolicy ),
-    iObjectMgr( aFramework.ObjectMgr() ),
-    iFs( aFramework.Fs() ),
     iObjectsToDelete( KMmMtpRArrayGranularity ),
     iDeleteError( KErrNone ),
     iDpConfig( aDpConfig )
@@ -194,7 +190,7 @@
         CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo
 
         TUint32 handle = iObjectsToDelete[0];
-        iObjectMgr.ObjectL( handle, *objectInfo );
+        iFramework.ObjectMgr().ObjectL( handle, *objectInfo );
         TFileName fileName( objectInfo->DesC( CMTPObjectMetaData::ESuid ) );
         PRINT2( _L( "MM MTP <> CDeleteObject::RunL delete object handle is 0x%x, fileName is %S" ), handle, &fileName );
 
@@ -234,7 +230,7 @@
     // record in MPX is not inlined with framework db, playlist should not be deleted
     // until next session.
     // This is used to keep the same behavior in mass storage and device file manager.
-    if ( aObjectInfo.Uint(CMTPObjectMetaData::EFormatCode )
+    if ( aObjectInfo.Uint( CMTPObjectMetaData::EFormatCode )
         == EMTPFormatCodeAbstractAudioVideoPlaylist
         && !iDpConfig.GetWrapperL().IsExistL( fileName ) )
         {
@@ -245,7 +241,7 @@
 
     // 1. Delete object from file system
     TEntry fileInfo;
-    iFs.Entry( fileName, fileInfo );
+    iFramework.Fs().Entry( fileName, fileInfo );
     if ( fileInfo.IsReadOnly() )
         {
         iDeleteError = KErrAccessDenied;
@@ -257,7 +253,7 @@
     TInt count = KMaxDeletionTimes;
     while ( count > 0 )
         {
-        iDeleteError = iFs.Delete( fileName );
+        iDeleteError = iFramework.Fs().Delete( fileName );
         if ( iDeleteError == KErrNone || iDeleteError == KErrNotFound )
             {
             break;
@@ -275,11 +271,11 @@
         }
 
     // 2. Delete object from metadata db
-    TRAP( iDeleteError, iDpConfig.GetWrapperL().DeleteObjectL( fileName, aObjectInfo.Uint( CMTPObjectMetaData::EFormatCode ) ));
+    TRAP( iDeleteError, iDpConfig.GetWrapperL().DeleteObjectL( aObjectInfo ) );
     PRINT1( _L( "MM MTP <> CDeleteObject::DeleteObjectL, Delete from Media DB, err = %d" ), iDeleteError );
 
     // 3. Delete object from framework db
-    iObjectMgr.RemoveObjectL( aObjectInfo.Uint( CMTPObjectMetaData::EHandle ) );
+    iFramework.ObjectMgr().RemoveObjectL( aObjectInfo.Uint( CMTPObjectMetaData::EHandle ) );
 
     // 4. If the object has references, Delete references from reference manager
     if ( MmMtpDpUtility::HasReference( aObjectInfo.Uint( CMTPObjectMetaData::EFormatCode ) ) )
@@ -363,7 +359,7 @@
             else
                 {
                 CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo
-                iObjectMgr.ObjectL( handles[i], *objectInfo );
+                iFramework.ObjectMgr().ObjectL( handles[i], *objectInfo );
                 if ( EMTPFormatCodeAssociation == objectInfo->Uint( CMTPObjectMetaData::EFormatCode ) )
                     {
                     GetObjectHandlesL( KMTPStorageAll, handles[i] );
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdescriptionutility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdescriptionutility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -52,6 +52,7 @@
         case EMTPObjectPropCodePersistentUniqueObjectIdentifier:
         case EMTPObjectPropCodeName:
         case EMTPObjectPropCodeDateAdded:
+        case EMTPObjectPropCodeAlbumArtist:
             propertyDesc = CMTPTypeObjectPropDesc::NewL( aPropCode );
             break;
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,8 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/cmtptypefile.h>
 
 #include "cgetobject.h"
@@ -88,7 +86,6 @@
             aConnection,
             sizeof( KMTPGetObjectPolicy ) / sizeof( TMTPRequestElementInfo ),
             KMTPGetObjectPolicy ),
-        iFs( iFramework.Fs() ),
         iError( EMTPRespCodeOK )
     {
     PRINT( _L( "Operation: GetObject(0x1009)" ) );
@@ -141,7 +138,7 @@
     // Create the file object
     delete iFileObject;
     iFileObject = NULL;
-    iFileObject = CMTPTypeFile::NewL( iFs, aFileName, EFileRead  );
+    iFileObject = CMTPTypeFile::NewL( iFramework.Fs(), aFileName, EFileRead  );
 
     PRINT( _L( "MM MTP <= CGetObject::GetObjectL" ) );
     }
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectinfo.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectinfo.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypeobjectinfo.h>
 #include <f32file.h>
 
@@ -163,7 +162,7 @@
     TUint32 width(0);
     TUint32 height(0);
     TInt err = KErrNone;
-    TRAP( err, iDpConfig.GetWrapperL().GetImageObjPropL( suid, width, height ) );
+    TRAP( err, iDpConfig.GetWrapperL().GetImageObjPropL( *object, width, height ) );
     if( err != KErrNone )
         PRINT1( _L( "MM MTP <> CGetObjectInfo::BuildObjectInfoL TRAP iWrapper.GetImageObjPropL err = %d" ), err );
 
@@ -187,11 +186,9 @@
     TParsePtrC parse( suid );
     iObjectInfo->SetStringL( CMTPTypeObjectInfo::EFilename, parse.NameAndExt() );
 
-    TTime dataModified;
-    dataModified = MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), suid );
+    TBuf<KMtpMaxDateTimeStringLength> date;
+    MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), suid, date );
 
-    TBuf<KMtpMaxDateTimeStringLength> date;
-    dataModified.FormatL( date, KMtpDateTimeFormat );
     PRINT1( _L( "MM MTP <> CGetObjectInfo::BuildObjectInfo date is %S" ), &date );
 
     // Date Created
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -18,12 +18,11 @@
 
 #include <bautils.h>
 #include <e32std.h>
-#include <mtp/mmtpdataproviderframework.h>
+
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/cmtptypeobjectproplist.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
-#include <mtp/cmtpobjectmetadata.h>
 
 #include "tobjectdescription.h"
 #include "cgetobjectproplist.h"
@@ -552,23 +551,15 @@
     const TInt count = iPropertyArray.Count();
 
     TInt err = KErrNone;
-    TBool successQuery = EFalse;
     for ( TInt i = 0; i < count; i++ )
         {
         err = ServiceOneObjectPropertyL( aHandle, iPropertyArray[i] );
-        if ( err == KErrNone )
-            successQuery = ETrue;
         if ( err == KErrNotSupported || err == KErrNotFound )  // Skip
             err = KErrNone;
         if ( err != KErrNone )
             break;
         }
 
-    // In PC Suite combined mode, a file that was found at the beginning could be deleted by PC Suite protocol
-    // Need to fail it here.
-    if ( successQuery == EFalse )
-        err = KErrNotFound;
-
     PRINT1( _L( "MM MTP <= CGetObjectPropList::ServiceGroupPropertiesL err = %d" ), err );
 
     return err;
@@ -670,44 +661,35 @@
 
         case EMTPObjectPropCodeName:
         case EMTPObjectPropCodeDateAdded:
+        case EMTPObjectPropCodeAlbumArtist:
             {
-            if ( ( aPropCode == EMTPObjectPropCodeName )
-                || ( ( !MmMtpDpUtility::IsVideoL( iObject->DesC( CMTPObjectMetaData::ESuid ), iFramework ) )
-                && ( aPropCode == EMTPObjectPropCodeDateAdded ) ) )
-                {
-                textData = CMTPTypeString::NewLC();   // + textData
+            textData = CMTPTypeString::NewLC(); // + textData
 
-                TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( aPropCode,
-                    *textData,
-                    *iObject ) );
+            TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( aPropCode,
+                *textData,
+                *iObject ) );
 
-                PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL err = %d" ), err );
-
-                iPropertyElement = &(iPropertyList->ReservePropElemL( aHandle, aPropCode ) );
-                iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars() );
+            PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL err = %d" ), err );
 
-                CleanupStack::PopAndDestroy( textData );  // - textData
-                break;
-                }
-            // Else, video DB does not support DateAdded field, use the file system date!
-            // It's the same behavior with DateCreated and DateModified.
-            // Fall through intentional.
+            iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) );
+            iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars() );
+
+            CleanupStack::PopAndDestroy( textData ); // - textData
             }
+            break;
 
         case EMTPObjectPropCodeDateCreated:
         case EMTPObjectPropCodeDateModified:
             {
-            TTime dataModified;
-            dataModified = MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(),
-                iObject->DesC( CMTPObjectMetaData::ESuid ) );
+            TBuf<KMtpMaxDateTimeStringLength> timeStr;
+            MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(),
+                iObject->DesC( CMTPObjectMetaData::ESuid ),
+                timeStr );
+            PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr );
 
-            TBuf<KMtpMaxDateTimeStringLength> timeStr;
-            dataModified.FormatL( timeStr, KMtpDateTimeFormat );
-            PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr );
             CMTPTypeString* datastring = CMTPTypeString::NewLC( timeStr );  // + datastring
-
-            iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode));
-            iPropertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, datastring->StringChars());
+            iPropertyElement = &(iPropertyList->ReservePropElemL( aHandle, aPropCode ) );
+            iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, datastring->StringChars() );
             CleanupStack::PopAndDestroy( datastring );  // - datastring
             }
             break;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectpropvalue.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectpropvalue.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -18,9 +18,7 @@
 
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <f32file.h>
 
 #include "cgetobjectpropvalue.h"
@@ -228,29 +226,21 @@
         // Name and DataAdded (audio only) fall under the same branch while dateadded(video)/modified/created fall under another
         case EMTPObjectPropCodeName: // 0xDC44
         case EMTPObjectPropCodeDateAdded: // 0xDC4E
+        case EMTPObjectPropCodeAlbumArtist:
             {
-            if ( ( propCode == EMTPObjectPropCodeName )
-                || ( ( !MmMtpDpUtility::IsVideoL(iObjectInfo->DesC( CMTPObjectMetaData::ESuid ), iFramework ) )
-                    && ( propCode == EMTPObjectPropCodeDateAdded ) ) )
-                {
-                iMTPTypeString = CMTPTypeString::NewL();
-                ServiceMetaDataFromWrapperL( propCode, *iMTPTypeString, *iObjectInfo );
-                break;
-                }
-            // Else, video DB does not support DateAdded field, use the file system date!
-            // It's the same behavior with DateCreated and DateModified.
-            // Fall through intentional.
+            iMTPTypeString = CMTPTypeString::NewL();
+            ServiceMetaDataFromWrapperL( propCode, *iMTPTypeString, *iObjectInfo );
             }
+            break;
         //lint -fallthrough
         case EMTPObjectPropCodeDateCreated:
         case EMTPObjectPropCodeDateModified:
             {
-            TTime dataModified;
-            dataModified = MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(),
-                iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) );
+            TBuf<KMtpMaxDateTimeStringLength> timeStr;
+            MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(),
+                iObjectInfo->DesC( CMTPObjectMetaData::ESuid ),
+                timeStr );
 
-            TBuf<KMtpMaxDateTimeStringLength> timeStr;
-            dataModified.FormatL( timeStr, KMtpDateTimeFormat );
             PRINT1( _L( "MM MTP <> CGetObjectPropValue::ServiceL Date time %S" ), &timeStr );
             iMTPTypeString = CMTPTypeString::NewL( timeStr );
             SendDataL( *iMTPTypeString );
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -17,10 +17,8 @@
 
 
 #include <mtp/cmtptypearray.h>
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpreferencemgr.h>
 #ifdef _DEBUG
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/tmtptypeuint128.h>
 #endif
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetpartialobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetpartialobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -17,8 +17,6 @@
 
 
 #include <mtp/cmtptypefile.h>
-#include <mtp/mmtpdataproviderframework.h>
-#include <mtp/cmtpobjectmetadata.h>
 
 #include "cgetpartialobject.h"
 #include "mmmtpdplogger.h"
@@ -154,6 +152,7 @@
     CMTPObjectMetaData* objectInfo = iRequestChecker->GetObjectInfo( iObjectHandle );
     __ASSERT_DEBUG( objectInfo, Panic( EMmMTPDpObjectNull ) );
 
+    // NOTE: Change all TBuf<KMaxFileName> into TFileName for easily change when fs change the limitation of filename
     TFileName fileSuid;
     fileSuid.Append( objectInfo->DesC( CMTPObjectMetaData::ESuid ) );
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -17,10 +17,8 @@
 
 
 #include <bautils.h>
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/mmtpstoragemgr.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/cmtptypearray.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypeobjectproplist.h>
@@ -296,7 +294,7 @@
     // Move the file first no matter if it will fail in Get/SetPreviousPropertiesL
     // Already trapped inside
     GetPreviousPropertiesL( *iObjectInfo );
-    TRAPD( err, SetPropertiesL( oldFileName, aNewFileName ) );
+    TRAPD( err, SetPropertiesL( aNewFileName ) );
 
     CFileMan* fileMan = CFileMan::NewL( iFramework.Fs() );
     err = fileMan->Move( oldFileName, aNewFileName );
@@ -360,31 +358,28 @@
 
             case EMTPObjectPropCodeName:
             case EMTPObjectPropCodeDateAdded:
-                if ( ( propCode == EMTPObjectPropCodeName )
-                    || ( !MmMtpDpUtility::IsVideoL( aObject.DesC( CMTPObjectMetaData::ESuid ), iFramework )
-                        && ( propCode == EMTPObjectPropCodeDateAdded ) ) )
-                    {
-                    CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData
+            case EMTPObjectPropCodeAlbumArtist:
+                {
+                CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData
 
-                    TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode,
-                        *textData,
-                        aObject ) );
-
-                    PRINT1( _L( "MM MTP <> CMoveObject::GetPreviousPropertiesL err = %d" ), err );
+                TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode,
+                    *textData,
+                    aObject ) );
+                PRINT1( _L( "MM MTP <> CMoveObject::GetPreviousPropertiesL err = %d" ), err );
 
-                    if ( err == KErrNone )
-                        {
-                        iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) );
-                        iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue,
-                            textData->StringChars() );
-                        }
-                    else
-                        {
-                        iPropertyElement = NULL;
-                        }
+                if ( err == KErrNone )
+                    {
+                    iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) );
+                    iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue,
+                        textData->StringChars() );
+                    }
+                else
+                    {
+                    iPropertyElement = NULL;
+                    }
 
-                    CleanupStack::PopAndDestroy( textData ); // - textData
-                    }
+                CleanupStack::PopAndDestroy( textData ); // - textData
+                }
                 break;
 
             default:
@@ -450,6 +445,7 @@
                 break;
 
             case EMTPObjectPropCodeName:
+            case EMTPObjectPropCodeAlbumArtist:
                 {
                 CMTPTypeString *stringData = CMTPTypeString::NewLC( element.StringL( CMTPTypeObjectPropListElement::EValue ) ); // + stringData
 
@@ -474,7 +470,7 @@
         } // end of for loop
 
     // ignore errors
-    if (respcode == EMTPRespCodeOK)
+    if ( respcode == EMTPRespCodeOK )
         {
         // do nothing, just to get rid of build warning
         }
@@ -487,17 +483,9 @@
 // Set the object properties in the object property store.
 // -----------------------------------------------------------------------------
 //
-void CMoveObject::SetPropertiesL( const TDesC& aOldFileName,
-    const TDesC& aNewFileName )
+void CMoveObject::SetPropertiesL( const TDesC& aNewFileName )
     {
-    PRINT2( _L( "MM MTP => CMoveObject::SetPropertiesL aOldFileName = %S, aNewFileName = %S" ),
-        &aOldFileName, 
-        &aNewFileName );
-
-    iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, aNewFileName );
-    iObjectInfo->SetUint( CMTPObjectMetaData::EStorageId, iStorageId );
-    iObjectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle );
-    iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
+    PRINT1( _L( "MM MTP => CMoveObject::SetPropertiesL, aNewFileName = %S" ), &aNewFileName );
 
     TUint32 formatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode );
     if ( formatCode == EMTPFormatCodeAbstractAudioVideoPlaylist )
@@ -511,16 +499,12 @@
         {
         if ( iSameStorage )
             {
-            iDpConfig.GetWrapperL().RenameObjectL( aOldFileName, aNewFileName );
+            iDpConfig.GetWrapperL().RenameObjectL( *iObjectInfo, aNewFileName );
             }
         else    // if the two object in different storage, we should delete the old one and insert new one
             {
-            iDpConfig.GetWrapperL().DeleteObjectL( aOldFileName, formatCode );
-
-            TUint32 subFormatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatSubCode );
-            iDpConfig.GetWrapperL().AddObjectL( aNewFileName,
-                formatCode,
-                subFormatCode );
+            iDpConfig.GetWrapperL().DeleteObjectL( *iObjectInfo );
+            iDpConfig.GetWrapperL().AddObjectL( *iObjectInfo );
 
             // Only leave when getting proplist element from data received by fw.       
             // It should not happen after ReceiveDataL in which construction of proplist already succeed.
@@ -528,6 +512,11 @@
             }
         }
 
+    iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, aNewFileName );
+    iObjectInfo->SetUint( CMTPObjectMetaData::EStorageId, iStorageId );
+    iObjectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle );
+    iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
+
     // It's not necessary to change references of playlists since Reference DB is used PUID
 
     PRINT( _L( "MM MTP <= CMoveObject::SetPropertiesL" ) );
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cpropertysettingutility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cpropertysettingutility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -51,8 +51,8 @@
     {
     TMTPResponseCode responseCode = EMTPRespCodeOK;
     TRAPD( err, aDpConfig.GetWrapperL().SetObjectMetadataValueL( aPropCode,
-            aNewData,
-            aObjectMetaData ) );
+        aNewData,
+        aObjectMetaData ) );
 
     PRINT1( _L("MM MTP <> CPropertySettingUtility::SetMetaDataToWrapper err = %d"), err);
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crenameobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crenameobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -18,9 +18,7 @@
 
 #include <f32file.h>
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/tmtptypeuint32.h>
 
 #include "crenameobject.h"
@@ -147,6 +145,8 @@
 
             if ( iNewFolderName.Length() + iRightPartName.Length() <= KMaxFileName )
                 {
+                PerformAdditionalActionL();
+
                 iFileName.Zero();
                 iFileName.Append( iNewFolderName );
                 iFileName.Append( iRightPartName );
@@ -155,8 +155,6 @@
                 iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, iFileName );
                 iObjectInfo->SetUint( CMTPObjectMetaData::EObjectMetaDataUpdate, 1 );
                 iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
-
-                PerformAdditionalActionL();
                 }
             }
 
@@ -287,7 +285,7 @@
     PRINT( _L( "MM MTP => CRenameObject::PerformAdditionalActionL" ) );
 
     // update MPX DB
-    TRAPD( err, iWrapper.RenameObjectL( iOldFileName, iFileName ) );
+    TRAPD( err, iWrapper.RenameObjectL( *iObjectInfo, iFileName ) );
 
     // should not fail for 1 file, keep it going, as folder already renamed
     if ( err != KErrNone )
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestchecker.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestchecker.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/cmtpobjectmetadata.h>
 #include <mtp/mmtpconnection.h>
 #include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
@@ -211,7 +210,7 @@
 // -----------------------------------------------------------------------------
 //
 TMTPResponseCode CRequestChecker::VerifySessionId( TUint32 aSessionId,
-        const TMTPRequestElementInfo& /*aElementInfo*/ ) const
+    const TMTPRequestElementInfo& /*aElementInfo*/ ) const
     {
     TMTPResponseCode ret = EMTPRespCodeOK;
 
@@ -237,7 +236,7 @@
 // -----------------------------------------------------------------------------
 //
 TMTPResponseCode CRequestChecker::VerifyObjectHandleL( TUint32 aHandle,
-        const TMTPRequestElementInfo& aElementInfo )
+    const TMTPRequestElementInfo& aElementInfo )
     {
     PRINT1( _L("MM MTP => CRequestChecker::VerifyObjectHandleL aHandle = 0x%x"), aHandle );
     TMTPResponseCode ret = EMTPRespCodeOK;
@@ -255,58 +254,32 @@
         TEntry entry;
         TInt err = iFramework.Fs().Entry( suid, entry );
 
-        if ( object->Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCodeAssociation )
-//            && ( object->Uint( CMTPObjectMetaData::EFormatSubCode ) == EMTPAssociationTypeGenericFolder ) )
+        if ( err == KErrNotFound )
             {
-            // Special association type .. not always present on the filesystem.
-            return ret;
+            iFramework.ObjectMgr().RemoveObjectL( suid );
+            // TODO: workaround for abstractalbumart
+            // ret = EMTPRespCodeInvalidObjectHandle;
             }
-        else
+        else if ( err != KErrNone )
+            ret = EMTPRespCodeGeneralError;
+        else if ( object->Uint( CMTPObjectMetaData::EFormatCode ) != EMTPFormatCodeAssociation )
             {
-            User::LeaveIfError( err );
-
             if ( iFramework.ObjectMgr().ObjectOwnerId( aHandle ) != iFramework.DataProviderId() )
-                {
-                PRINT( _L(" ewrwe ret = EMTPRespCodeInvalidObjectHandle;"));
                 ret = EMTPRespCodeInvalidObjectHandle;
-                }
-            }
 
-        if ( aElementInfo.iElementAttr & EMTPElementAttrWrite )
-            {
-            if ( entry.IsReadOnly() )
-                {
+            if ( ( aElementInfo.iElementAttr & EMTPElementAttrWrite ) && entry.IsReadOnly() )
                 ret = EMTPRespCodeObjectWriteProtected;
-                }
-            }
-
-        //((EMTPRespCodeOK == ret) && (aElementInfo.iElementAttr & EMTPElementAttrFileOrDir)) is
-        // covered implicitly here, EMTPRespCodeOK will be returned. It is a valid case for an object to be either a folder or file
-        // for certain operation's request parameter, for instance the first parameter of copyObject or
-        // moveObject can be either a file or a directory.
 
-        // Other cases.
-        if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrFile ) )
-            {
-            if ( entry.IsDir() )
-                {
+            if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrFile ) && entry.IsDir() )
                 ret = EMTPRespCodeInvalidObjectHandle;
-                }
-            }
 
-        if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrDir ) )
-            {
-            if (!entry.IsDir())
-                {
+            if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrDir ) && !entry.IsDir() )
                 ret = EMTPRespCodeInvalidParentObject;
-                }
             }
         }
     else
-        {
-        PRINT( _L( "MM MTP <> CRequestChecker::VerifyObjectHandleL, Object does not exist." ) );
         ret = EMTPRespCodeInvalidObjectHandle;
-        }
+
     PRINT1( _L( "MM MTP <= CRequestChecker::VerifyObjectHandleL ret = 0x%x" ), ret );
 
     return ret;
@@ -318,7 +291,7 @@
 // -----------------------------------------------------------------------------
 //
 TMTPResponseCode CRequestChecker::VerifyStorageIdL( TUint32 aStorageId,
-        const TMTPRequestElementInfo& aElementInfo ) const
+    const TMTPRequestElementInfo& aElementInfo ) const
     {
     MMTPStorageMgr& mgr( iFramework.StorageMgr() );
     TMTPResponseCode ret( EMTPRespCodeOK );
@@ -369,7 +342,7 @@
 // -----------------------------------------------------------------------------
 //
 TMTPResponseCode CRequestChecker::VerifyFormatCode( TUint32 aFormatCode,
-        const TMTPRequestElementInfo& aElementInfo ) const
+    const TMTPRequestElementInfo& aElementInfo ) const
     {
     PRINT1( _L( "MM MTP => CRequestChecker::VerifyFormatCode aFormatCode = 0x%x" ), aFormatCode );
     TMTPResponseCode ret = EMTPRespCodeInvalidObjectFormatCode;
@@ -407,7 +380,7 @@
 // -----------------------------------------------------------------------------
 //
 TBool CRequestChecker::IsSpecialValue( TUint32 aParameter,
-        const TMTPRequestElementInfo& aElementInfo ) const
+    const TMTPRequestElementInfo& aElementInfo ) const
     {
     TBool result = EFalse;
     switch ( aElementInfo.iCount )
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -18,7 +18,6 @@
 
 #include <mtp/mtpprotocolconstants.h>
 #include <mtp/tmtptyperequest.h>
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/tmtptypeevent.h>
 #include <mtp/mmtpconnection.h>
 #include <mtp/mmtpobjectmgr.h>
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,13 +16,11 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypeobjectinfo.h>
 #include <mtp/cmtptypefile.h>
 #include <mtp/mmtpstoragemgr.h>
-#include <mtp/cmtpobjectmetadata.h>
 #include <bautils.h>
 #include <mtp/cmtptypeobjectproplist.h>
 
@@ -81,10 +79,7 @@
 //
 EXPORT_C CSendObject::~CSendObject()
     {
-    if ( ( iProgress == EObjectInfoSucceed
-            || iProgress == EObjectInfoFail
-            || iProgress == EObjectInfoInProgress )
-        && !iNoRollback )
+    if ( !iNoRollback )
         {
         // Not finished SendObjectInfo \ SendObject pair detected.
         Rollback();
@@ -581,54 +576,60 @@
 
     TBool result = ETrue;
 
-    TEntry fileEntry;
-    User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) );
-    if ( fileEntry.FileSize() != iObjectSize )
+    // SendObject is cancelled or connection is dropped.
+    if ( iCancelled )
         {
-        iFs.Delete( iFullPath );
-        iObjectMgr.UnreserveObjectHandleL( *iReceivedObjectInfo );
-        TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge;
-        if ( fileEntry.FileSize() < iObjectSize )
-            {
-            responseCode = EMTPRespCodeIncompleteTransfer;
-            }
-        SendResponseL( responseCode );
-        result = EFalse;
-        }
-
-    // SendObject is cancelled or connection is dropped.
-    if ( result && iCancelled )
-        {
+        // In SendObject response phase, unregister is not necessary.
+        // But there's no harm, still keep it here.
         iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest,
             iConnection );
+
         Rollback();
         SendResponseL( EMTPRespCodeTransactionCancelled );
         }
-    else if ( result && !iCancelled )
+    else
         {
-        if ( iObjectSize > 0 ) // media file
-            {
-            TRAPD( err, AddMediaToStoreL() );
-            PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseObjectL err = %d" ), err );
+        TEntry fileEntry;
+        User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) );
 
-            if ( ( iPreviousOperation == EMTPOpCodeSendObjectPropList )
-                && ( err == KErrNone ) )
+        if ( fileEntry.FileSize() != iObjectSize )
+            {
+            Rollback();
+            TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge;
+            if ( fileEntry.FileSize() < iObjectSize )
+                {
+                responseCode = EMTPRespCodeIncompleteTransfer;
+                }
+            SendResponseL( responseCode );
+            result = EFalse;
+            }
+        else
+            {
+            if ( iObjectSize > 0 ) // media file
                 {
-                // Only leave when getting proplist element from data received by fw.
-                // It should not happen after ReceiveDataL in which construction of proplist already succeed.
-                SetObjectPropListL();
+                TRAPD( err, AddMediaToStoreL() );
+                PRINT1( _L( "MM MTP <> CSendObject::DoHandleResponsePhaseObjectL err = %d" ), err );
+
+                if ( ( iPreviousOperation == EMTPOpCodeSendObjectPropList )
+                    && ( err == KErrNone ) )
+                    {
+                    // Only leave when getting proplist element from data received by fw.
+                    // It should not happen after ReceiveDataL in which construction of proplist already succeed.
+                    SetObjectPropListL();
+                    }
+
+                // Commits into MTP data object enumeration store the object handle and
+                // storage space previously reserved for the specified object.
+                iFramework.ObjectMgr().CommitReservedObjectHandleL( *iReceivedObjectInfo );
                 }
 
-            // Commits into MTP data object enumeration store the object handle and
-            // storage space previously reserved for the specified object.
-            iFramework.ObjectMgr().CommitReservedObjectHandleL( *iReceivedObjectInfo );
-            }
+            // In SendObject response phase, unregister is not necessary.
+            // But there's no harm, still keep it here.
+            iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest,
+                iConnection );
 
-        // Commit object to MTP data store
-        iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest,
-            iConnection );
-
-        SendResponseL( EMTPRespCodeOK );
+            SendResponseL( EMTPRespCodeOK );
+            }
         }
 
     PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseObjectL result = %d" ), result );
@@ -940,6 +941,7 @@
                 break;
 
             case EMTPObjectPropCodeName:
+            case EMTPObjectPropCodeAlbumArtist:
                 {
                 CMTPTypeString* stringData = CMTPTypeString::NewLC( element.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData
 
@@ -1078,17 +1080,32 @@
     PRINT1( _L("MM MTP => CSendObject::GetFullPathNameL aFileName = %S"), &aFileName );
 
     TBool result( EFalse );
+
     if ( aFileName.Length() > 0 )
         {
         iFullPath.Zero();
         iFullPath.Append( *iParentSuid );
-        if ( ( iFullPath.Length() + aFileName.Length() ) < KMaxFileName )
+
+        // TODO: need to be done in derived class
+        // Only add extension for alb to pass winlogo test cases
+        TInt length = iFullPath.Length() + aFileName.Length();
+
+        TParsePtrC parser( aFileName );
+        TBool isAlbWithoutExt =
+            ( ( iObjectFormat == EMTPFormatCodeAbstractAudioAlbum ) && ( !parser.ExtPresent() ) );
+        if ( isAlbWithoutExt )
+            length += KTxtExtensionALB().Length();
+
+        if ( length < KMaxFileName )
             {
             iFullPath.Append( aFileName );
+            if ( isAlbWithoutExt )
+                iFullPath.Append( KTxtExtensionALB );
             PRINT1( _L( "MM MTP <> CSendObject::GetFullPathNameL iFullPath = %S" ), &iFullPath );
             result = iFramework.Fs().IsValidName( iFullPath );
             }
         }
+
     if ( result && ( iObjectFormat != MmMtpDpUtility::FormatFromFilename( iFullPath ) ) )
         {
         PRINT2( _L( "MM MTP <> %S does not match 0x%x" ), &iFullPath, iObjectFormat );
@@ -1276,50 +1293,11 @@
     // Might need to set dateadded and datemodify for further extension.
     SetProtectionStatus();
 
-    TBool isVideo = EFalse;
-    TMmMtpSubFormatCode subFormatCode = EMTPSubFormatCodeUnknown;
-    switch ( iObjectFormat )
-        {
-        case EMTPFormatCode3GPContainer:
-        case EMTPFormatCodeMP4Container:
-        case EMTPFormatCodeASF:
-            {
-            if ( MmMtpDpUtility::IsVideo( iFullPath ) )
-                {
-                subFormatCode = EMTPSubFormatCodeVideo;
-                isVideo = ETrue;
-                }
-            else
-                {
-                subFormatCode = EMTPSubFormatCodeAudio;
-                isVideo = EFalse;
-                }
-
-            iReceivedObjectInfo->SetUint( CMTPObjectMetaData::EFormatSubCode,
-                ( TUint ) subFormatCode );
-            }
-            break;
-
-            // put all just video format codes here
-        case EMTPFormatCodeWMV:
-            {
-            isVideo = ETrue;
-            }
-            break;
-
-        default:
-            PRINT( _L( "MM MTP <> CSendObject::DoHandleResponsePhaseObjectL default" ) );
-            break;
-        }
-
     iDpConfig.GetWrapperL().SetStorageRootL( iFullPath );
     PRINT1( _L( "MM MTP <> CSendObject::AddMediaToStoreL iFullPath = %S" ), &iFullPath );
-    iDpConfig.GetWrapperL().AddObjectL( iFullPath, iObjectFormat, subFormatCode );
+    iDpConfig.GetWrapperL().AddObjectL( *iReceivedObjectInfo );
 
-    if ( isVideo )
-        {
-        iDpConfig.GetWrapperL().SetImageObjPropL( iFullPath, iWidth, iHeight );
-        }
+    iDpConfig.GetWrapperL().SetImageObjPropL( *iReceivedObjectInfo, iWidth, iHeight );
 
     PRINT( _L( "MM MTP <= CSendObject::AddMediaToStoreL" ) );
     }
@@ -1344,7 +1322,9 @@
 void CSendObject::Rollback()
     {
     // Delete this object from file system.
-    if ( iProgress == ESendObjectInProgress )
+    if ( iProgress == ESendObjectInProgress 
+            || iProgress == EObjectInfoSucceed 
+            ||iProgress == EObjectInfoFail )
         {
         PRINT1( _L( "MM MTP <> CSendObject::Rollback ROLLBACK_FILE %S" ), &iFullPath );
         // Close the interrupted transfer file by delete iFileReceived object
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypeobjectproplist.h>
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/cmtptypestring.h>
@@ -231,34 +230,31 @@
                         {
                         responseCode = EMTPRespCodeInvalidDataset;
                         }
-                    else if ( ( KErrNone == err ) || ( KErrAlreadyExists == err ) )
+                    else if ( KErrNone == err )    // TODO: ( KErrAlreadyExists == err )
                         {
-                        TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( suid, newSuid ) ); //Update MPX DB
-                        PRINT1( _L( "MM MTP <> Rename Object err = %d" ), err );
+                        TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *object, newSuid ) ); //Update MPX DB
+
+                        PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err );
                         // it is ok if file is not found in DB, following S60 solution
                         if ( KErrNotFound == err )
                             {
-                            TUint formatCode = object->Uint( CMTPObjectMetaData::EFormatCode );
-                            TUint subFormatCode = object->Uint( CMTPObjectMetaData::EFormatSubCode );
-                            TRAP( err, iDpConfig.GetWrapperL().AddObjectL( newSuid, formatCode, subFormatCode ) );
-                            PRINT1( _L( "MM MTP <> Add Object err = %d" ), err );
+                            TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *object ) );
+                            PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err );
                             }
 
-                        if ( KErrNone == err )
-                            {
-                            object->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
-                            iFramework.ObjectMgr().ModifyObjectL( *object );
-                            }
-                        else
-                            {
-                            responseCode = EMTPRespCodeGeneralError;
-                            }
+                        object->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
+                        iFramework.ObjectMgr().ModifyObjectL( *object );
+                        }
+                    else
+                        {
+                        responseCode = EMTPRespCodeGeneralError;
                         }
                     }
                 }
                 break;
 
             case EMTPObjectPropCodeName:
+            case EMTPObjectPropCodeAlbumArtist:
                 {
                 CMTPTypeString* stringData = CMTPTypeString::NewLC(
                     aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/cmtptypestring.h>
 #include <mtp/cmtptypearray.h>
 #include <mtp/mmtpobjectmgr.h>
@@ -231,6 +230,7 @@
         // Get Data for String objects
         case EMTPObjectPropCodeObjectFileName:  // 0xDC07
         case EMTPObjectPropCodeName: // 0xDC44
+        case EMTPObjectPropCodeAlbumArtist:
             {
             delete iMTPTypeString;
             iMTPTypeString = NULL;
@@ -280,38 +280,36 @@
                 err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(),
                     suid,
                     newSuid );
+                // TODO: if the new name is the same with old name
                 PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err );
                 if ( KErrOverflow == err ) // full path name is too long
                     {
                     responseCode = EMTPRespCodeInvalidDataset;
                     }
-                else if ( ( KErrNone == err ) || ( KErrAlreadyExists == err ) )
+                else if ( KErrNone == err )
                     {
-                    TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( suid, newSuid ) ); //Update MPX DB
+                    TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *iObjectInfo, newSuid ) ); //Update MPX DB
                     PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err );
                     // it is ok if file is not found in DB, following S60 solution
                     if ( KErrNotFound == err )
                         {
-                        TUint formatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode );
-                        TUint subFormatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatSubCode );
-                        TRAP( err, iDpConfig.GetWrapperL().AddObjectL( newSuid, formatCode, subFormatCode ) );
+                        TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *iObjectInfo ) );
                         PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err );
                         }
-                    if ( KErrNone == err )
-                        {
-                        iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
-                        iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
-                        }
-                    else
-                        {
-                        responseCode = EMTPRespCodeGeneralError;
-                        }
+
+                    iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
+                    iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
+                    }
+                else
+                    {
+                    responseCode = EMTPRespCodeGeneralError;
                     }
                 }
             }
             break;
 
         case EMTPObjectPropCodeName: // 0xDC44
+        case EMTPObjectPropCodeAlbumArtist:
             {
             responseCode = ServiceMetaDataToWrapperL( iPropCode,
                 *iMTPTypeString,
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -18,7 +18,6 @@
 
 #include <mtp/cmtptypearray.h>
 #include <mtp/mmtpobjectmgr.h>
-#include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpreferencemgr.h>
 
 #include "csetobjectreferences.h"
@@ -28,6 +27,8 @@
 #include "mmmtpdputility.h"
 #include "mmmtpdpconfig.h"
 
+const TInt KMmMtpRefArrayGranularity = 3;
+
 // -----------------------------------------------------------------------------
 // Verification data for the SetReferences request
 // -----------------------------------------------------------------------------
@@ -88,16 +89,14 @@
 // Standard c++ constructor
 // -----------------------------------------------------------------------------
 //
-EXPORT_C CSetObjectReferences::CSetObjectReferences(
-    MMTPDataProviderFramework& aFramework,
+EXPORT_C CSetObjectReferences::CSetObjectReferences( MMTPDataProviderFramework& aFramework,
     MMTPConnection& aConnection,
     MMmMtpDpConfig& aDpConfig ) :
-    CRequestProcessor(
-        aFramework,
-        aConnection,
-        sizeof( KMTPSetObjectReferencesPolicy )/sizeof( TMTPRequestElementInfo ),
-        KMTPSetObjectReferencesPolicy ),
-    iDpConfig( aDpConfig )
+        CRequestProcessor( aFramework,
+            aConnection,
+            sizeof( KMTPSetObjectReferencesPolicy ) / sizeof( TMTPRequestElementInfo ),
+            KMTPSetObjectReferencesPolicy ),
+        iDpConfig( aDpConfig )
     {
     PRINT( _L( "Operation: SetObjectReferences(0x9811)" ) );
     }
@@ -107,12 +106,15 @@
 // set references to DB
 // -----------------------------------------------------------------------------
 //
-EXPORT_C void CSetObjectReferences::DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& /*aWrapper*/,
-    TUint16 /*aObjectFormat*/,
-    const TDesC& /*aSrcFileName*/,
-    CDesCArray& /*aRefFileArray*/ )
+EXPORT_C void CSetObjectReferences::DoSetObjectReferencesL( const CMTPObjectMetaData& aObject )
     {
-    // do nothing, do special thing by inheriting
+    TUint formatCode = aObject.Uint( CMTPObjectMetaData::EFormatCode );
+    TBool hasReference = MmMtpDpUtility::HasReference( formatCode );
+
+    if ( hasReference )
+        {
+        iDpConfig.GetWrapperL().SetReferenceL( aObject, *iReferenceSuids );
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -142,7 +144,7 @@
 
     delete iReferenceSuids;
     iReferenceSuids = NULL;
-    iReferenceSuids = new ( ELeave ) CDesCArrayFlat( 3 );
+    iReferenceSuids = new ( ELeave ) CDesCArrayFlat( KMmMtpRefArrayGranularity );
 
     if ( !VerifyReferenceHandlesL() )
         {
@@ -159,10 +161,7 @@
         CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC(); // + object
         iFramework.ObjectMgr().ObjectL( objectHandle, *object );
         PRINT1( _L( "MM MTP <> object file name is %S" ), &(object->DesC( CMTPObjectMetaData::ESuid ) ) );
-        DoSetObjectReferencesL( iDpConfig.GetWrapperL(),
-            object->Uint( CMTPObjectMetaData::EFormatCode ),
-            object->DesC( CMTPObjectMetaData::ESuid ),
-            *iReferenceSuids );
+        DoSetObjectReferencesL( *object );
 
         CleanupStack::PopAndDestroy( object ); // - object
 
@@ -196,8 +195,9 @@
             result = EFalse;
             break;
             }
-
-        iReferenceSuids->AppendL( object->DesC( CMTPObjectMetaData::ESuid ) );
+        // Only audio in playlist is supported
+        if ( iDpConfig.GetWrapperL().Category( *object ) == EMPXSong )
+            iReferenceSuids->AppendL( object->DesC( CMTPObjectMetaData::ESuid ) );
         }
     CleanupStack::PopAndDestroy( object ); // - object
     PRINT( _L( "MM MTP <= CSetObjectReferences::VerifyReferenceHandlesL" ) );
--- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -50,14 +50,13 @@
 // create singleton instance
 // -----------------------------------------------------------------------------
 //
-EXPORT_C void CMmMtpDpAccessSingleton::CreateL( RFs& aRfs,
-    MMTPDataProviderFramework& aFramework )
+EXPORT_C void CMmMtpDpAccessSingleton::CreateL( MMTPDataProviderFramework& aFramework )
     {
     CMmMtpDpAccessSingleton* self = reinterpret_cast<CMmMtpDpAccessSingleton*>( Dll::Tls() );
 
     if ( self == NULL )
         {
-        self = CMmMtpDpAccessSingleton::NewL( aRfs, aFramework );
+        self = CMmMtpDpAccessSingleton::NewL( aFramework );
         Dll::SetTls( reinterpret_cast<TAny*>( self ) );
         }
     else
@@ -135,12 +134,11 @@
 // two-phase construction
 // -----------------------------------------------------------------------------
 //
-CMmMtpDpAccessSingleton* CMmMtpDpAccessSingleton::NewL( RFs& aRfs,
-    MMTPDataProviderFramework& aFramework )
+CMmMtpDpAccessSingleton* CMmMtpDpAccessSingleton::NewL( MMTPDataProviderFramework& aFramework )
     {
     CMmMtpDpAccessSingleton* self = new(ELeave) CMmMtpDpAccessSingleton;
     CleanupStack::PushL( self );
-    self->ConstructL(aRfs, aFramework);
+    self->ConstructL( aFramework );
     CleanupStack::Pop( self );
     return self;
     }
@@ -150,10 +148,9 @@
 // two-phase construction
 // -----------------------------------------------------------------------------
 //
-void CMmMtpDpAccessSingleton::ConstructL( RFs& aRfs,
-    MMTPDataProviderFramework& aFramework )
+void CMmMtpDpAccessSingleton::ConstructL( MMTPDataProviderFramework& aFramework )
     {
-    iWrapper = CMmMtpDpMetadataAccessWrapper::NewL( aRfs, aFramework );
+    iWrapper = CMmMtpDpMetadataAccessWrapper::NewL( aFramework );
     }
 
 
--- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -18,6 +18,8 @@
 
 #include <mtp/mmtpdataproviderframework.h>
 #include <mtp/mmtpobjectmgr.h>
+#include <mtp/cmtptypestring.h>
+#include <mtp/cmtpobjectmetadata.h>
 #include <bautils.h>
 #include <e32math.h>
 #include <e32property.h>
@@ -27,14 +29,14 @@
 #include "cmmmtpdpmetadatampxaccess.h"
 #include "cmmmtpdpmetadatavideoaccess.h"
 #include "mmmtpdputility.h"
+#include "tobjectdescription.h"
 #include "mmmtpdplogger.h"
 
-const TInt KMMMTPDummyFileArrayGranularity = 5;
+const TInt KMmMtpDummyFileArrayGranularity = 5;
 
-CMmMtpDpMetadataAccessWrapper* CMmMtpDpMetadataAccessWrapper::NewL( RFs& aRfs,
-    MMTPDataProviderFramework& aFramework )
+CMmMtpDpMetadataAccessWrapper* CMmMtpDpMetadataAccessWrapper::NewL( MMTPDataProviderFramework& aFramework )
     {
-    CMmMtpDpMetadataAccessWrapper* me = new (ELeave) CMmMtpDpMetadataAccessWrapper( aRfs, aFramework );
+    CMmMtpDpMetadataAccessWrapper* me = new (ELeave) CMmMtpDpMetadataAccessWrapper( aFramework );
     CleanupStack::PushL( me );
     me->ConstructL();
     CleanupStack::Pop( me );
@@ -42,10 +44,9 @@
     return me;
     }
 
-CMmMtpDpMetadataAccessWrapper::CMmMtpDpMetadataAccessWrapper( RFs& aRfs,
-    MMTPDataProviderFramework& aFramework ) :
-    iRfs( aRfs ),
-    iFramework( aFramework )
+CMmMtpDpMetadataAccessWrapper::CMmMtpDpMetadataAccessWrapper( MMTPDataProviderFramework& aFramework ) :
+    iFramework( aFramework ),
+    iFs( aFramework.Fs() )
     {
     // Do nothing
     }
@@ -59,11 +60,11 @@
     {
     PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::ConstructL" ) );
 
-    iMmMtpDpMetadataMpxAccess = CMmMtpDpMetadataMpxAccess::NewL( iRfs, iFramework );
+    iMmMtpDpMetadataMpxAccess = CMmMtpDpMetadataMpxAccess::NewL( iFs );
 
-    iMmMtpDpMetadataVideoAccess = CMmMtpDpMetadataVideoAccess::NewL( iRfs );
+    iMmMtpDpMetadataVideoAccess = CMmMtpDpMetadataVideoAccess::NewL( iFs );
 
-    iAbstractMediaArray = new ( ELeave ) CDesCArrayFlat( KMMMTPDummyFileArrayGranularity );
+    iAbstractMediaArray = new ( ELeave ) CDesCArrayFlat( KMmMtpDummyFileArrayGranularity );
 
     // Create the PS key to notify subscribers that MTP mode is activated
     _LIT_SECURITY_POLICY_C1(KKeyReadPolicy, ECapabilityReadUserData);
@@ -100,22 +101,24 @@
     }
 
 // -----------------------------------------------------------------------------
-// CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL
+// CMmMtpDpMetadataAccessWrapper::SetReferenceL
 // Set abstract media to DB
 // -----------------------------------------------------------------------------
 //
-EXPORT_C void CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL( const TDesC& aAbstractMediaFileName, 
-    CDesCArray& aRefFileArray, 
-    TMPXGeneralCategory aCategory )
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::SetReferenceL( const CMTPObjectMetaData& aObject,
+    CDesCArray& aRefFileArray )
     {
-    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL aAbstractMediaFileName = %S" ), &aAbstractMediaFileName );
+    TPtrC refOwner( aObject.DesC( CMTPObjectMetaData::ESuid ) );
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetReferenceL reference owner = %S" ),
+        &refOwner );
 
-    if ( !MmMtpDpUtility::IsVideoL( aAbstractMediaFileName, iFramework ) )
+    TMPXGeneralCategory category = Category( aObject );
+    if ( category == EMPXPlaylist || category == EMPXAbstractAlbum )
         {
-        iMmMtpDpMetadataMpxAccess->SetAbstractMediaL( aAbstractMediaFileName, aRefFileArray, aCategory );
+        iMmMtpDpMetadataMpxAccess->SetReferenceL( refOwner, aRefFileArray, category );
         }
 
-    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL" ) );
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetReferenceL" ) );
     }
 
 // ---------------------------------------------------------------------------
@@ -129,18 +132,53 @@
     {
     PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL" ) );
 
-    TPtrC fullFileName( aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ) );
-    if ( !MmMtpDpUtility::IsVideoL( fullFileName, iFramework ) )
+    TMPXGeneralCategory category = Category( aObjectMetaData );
+    switch ( category )
         {
-        iMmMtpDpMetadataMpxAccess->GetObjectMetadataValueL( aPropCode,
-            aNewData,
-            aObjectMetaData );
-        }
-    else
-        {
-        iMmMtpDpMetadataVideoAccess->GetObjectMetadataValueL( aPropCode,
-            aNewData,
-            aObjectMetaData );
+        case EMPXAbstractAlbum:
+            if ( aPropCode == EMTPObjectPropCodeDateAdded && EMTPTypeString == aNewData.Type() )
+                {
+                TBuf<KMtpMaxDateTimeStringLength> timeStr;
+                MmMtpDpUtility::GetObjectDateModifiedL( iFs,
+                    aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ),
+                    timeStr );
+                PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr );
+
+                ( ( CMTPTypeString & ) aNewData ).SetL( timeStr );
+                break;
+                }
+            // else
+            // get from mpx
+        case EMPXPlaylist:
+        case EMPXSong:
+            {
+            iMmMtpDpMetadataMpxAccess->GetObjectMetadataValueL( aPropCode,
+                aNewData,
+                aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ),
+                category );
+            }
+            break;
+        case EMPXVideo:
+            if ( aPropCode == EMTPObjectPropCodeDateAdded && EMTPTypeString == aNewData.Type() )
+                {
+                TBuf<KMtpMaxDateTimeStringLength> timeStr;
+                MmMtpDpUtility::GetObjectDateModifiedL( iFs,
+                    aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ),
+                    timeStr );
+                PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr );
+
+                ( ( CMTPTypeString & ) aNewData ).SetL( timeStr );
+                }
+            else
+                {
+                iMmMtpDpMetadataVideoAccess->GetObjectMetadataValueL( aPropCode,
+                    aNewData,
+                    aObjectMetaData );
+                }
+            break;
+        default:
+            // do nothing
+            break;
         }
 
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL" ) );
@@ -157,99 +195,90 @@
     {
     PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL" ) );
 
-    // In SendObjectPropList, formatCode has already know, but object handle has not been committed into db
-    // In that case, format couldn't be get from object manager
-    TUint formatCode = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode );
-    TUint formatSubCode = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatSubCode );
-
-    TBool isVideo = EFalse;
-    isVideo = MmMtpDpUtility::IsVideoL( formatCode, formatSubCode );
-
-    if ( isVideo )
+    TMPXGeneralCategory category = Category( aObjectMetaData );
+    switch ( category )
         {
-        iMmMtpDpMetadataVideoAccess->SetObjectMetadataValueL( aPropCode,
-            aNewData,
-            aObjectMetaData );
-        }
-    else
-        {
-        iMmMtpDpMetadataMpxAccess->SetObjectMetadataValueL( aPropCode,
-            aNewData,
-            aObjectMetaData );
+        case EMPXAbstractAlbum:
+        case EMPXSong:
+        case EMPXPlaylist:
+            iMmMtpDpMetadataMpxAccess->SetObjectMetadataValueL( aPropCode,
+                aNewData,
+                aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ),
+                category );
+            break;
+        case EMPXVideo:
+            iMmMtpDpMetadataVideoAccess->SetObjectMetadataValueL( aPropCode,
+                aNewData,
+                aObjectMetaData );
+            break;
+        default:
+            break;
         }
 
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL" ) );
     }
 
 // ---------------------------------------------------------------------------
-// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL
+// CMmMtpDpMetadataAccessWrapper::RenameObjectL
 // Renames the file part of a record in the collection database
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void CMmMtpDpMetadataAccessWrapper::RenameObjectL( const TDesC& aOldFileName,
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::RenameObjectL( const CMTPObjectMetaData& aOldObject,
     const TDesC& aNewFileName )
     {
+    TPtrC oldFileName( aOldObject.DesC( CMTPObjectMetaData::ESuid ) );
     PRINT2( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RenameObjectL old = %S, new = %S" ),
-        &aOldFileName,
+        &oldFileName,
         &aNewFileName );
 
-    if ( MmMtpDpUtility::IsVideoL( aOldFileName, iFramework ) )
-        {
-        iMmMtpDpMetadataVideoAccess->RenameRecordL( aOldFileName, aNewFileName );
-        }
-    else
+    TMPXGeneralCategory category = Category( aOldObject );
+    switch ( category )
         {
-        CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC();
-        iFramework.ObjectMgr().ObjectL( aOldFileName, *object );
-        iMmMtpDpMetadataMpxAccess->RenameObjectL( aOldFileName,
-            aNewFileName,
-            object->Uint( CMTPObjectMetaData::EFormatCode ) );
-        CleanupStack::PopAndDestroy( object );
+        case EMPXSong:
+        case EMPXAbstractAlbum:
+        case EMPXPlaylist:
+            {
+            iMmMtpDpMetadataMpxAccess->RenameObjectL( oldFileName,
+                aNewFileName,
+                category );
+            }
+            break;
+        case EMPXVideo:
+            iMmMtpDpMetadataVideoAccess->RenameRecordL( oldFileName, aNewFileName );
+            break;
+        default:
+            break;
         }
 
+
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RenameObjectL" ) );
     }
 
 // ---------------------------------------------------------------------------
-// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL
+// CMmMtpDpMetadataAccessWrapper::DeleteObjectL
 // Deletes metadata information associated with the object
 // ---------------------------------------------------------------------------
 //
-void CMmMtpDpMetadataAccessWrapper::DeleteObjectL( const TDesC& aFullFileName,
-    const TUint aFormatCode )
+void CMmMtpDpMetadataAccessWrapper::DeleteObjectL( const CMTPObjectMetaData& aObject )
     {
-    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::DeleteObjectL" ) );
-
-    TMPXGeneralCategory category = Category( aFormatCode );
+    TPtrC fileName( aObject.DesC( CMTPObjectMetaData::ESuid ) );
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::DeleteObjectL name = %S" ), &fileName );
 
-    // Have to do this.  File might not be in file system anymore, have to
-    // reply on ObjectManager
-    if ( ( aFormatCode == EMTPFormatCodeMP4Container )
-        || ( aFormatCode == EMTPFormatCode3GPContainer )
-        || ( aFormatCode == EMTPFormatCodeASF ) )
-        {
-        if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) )
-            {
-            category = EMPXVideo;
-            }
-        else
-            {
-            category = EMPXSong;
-            }
-        }
+    TMPXGeneralCategory category = Category( aObject );
 
     switch ( category )
         {
+        case EMPXSong:
+        case EMPXAbstractAlbum:
         case EMPXPlaylist:
-        case EMPXSong:
             {
-            iMmMtpDpMetadataMpxAccess->DeleteObjectL( aFullFileName, category );
+            iMmMtpDpMetadataMpxAccess->DeleteObjectL( fileName, category );
             }
             break;
 
         case EMPXVideo:
             {
-            iMmMtpDpMetadataVideoAccess->DeleteRecordL( aFullFileName );
+            iMmMtpDpMetadataVideoAccess->DeleteRecordL( fileName );
             }
             break;
 
@@ -275,19 +304,25 @@
 
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetStorageRootL" ) );
     }
+
 // -----------------------------------------------------------------------------
 // CMmMtpDpMetadataMpxAccess::SetImageObjPropL
 // set image specific properties specific to videos
 // -----------------------------------------------------------------------------
 //
-void CMmMtpDpMetadataAccessWrapper::SetImageObjPropL( const TDesC& aFullFileName,
+void CMmMtpDpMetadataAccessWrapper::SetImageObjPropL( const CMTPObjectMetaData& aObject,
     const TUint32 aWidth,
     const TUint32 aHeight )
     {
-    iMmMtpDpMetadataVideoAccess->SetStorageRootL( aFullFileName );
-    iMmMtpDpMetadataVideoAccess->SetImageObjPropL( aFullFileName,
-        aWidth,
-        aHeight );
+    TMPXGeneralCategory category = Category( aObject );
+    if ( category == EMPXVideo )
+        {
+        TPtrC fullFileName( aObject.DesC( CMTPObjectMetaData::ESuid ) );
+        iMmMtpDpMetadataVideoAccess->SetStorageRootL( fullFileName );
+        iMmMtpDpMetadataVideoAccess->SetImageObjPropL( fullFileName,
+            aWidth,
+            aHeight );
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -295,16 +330,19 @@
 // get image specific properties specific to videos
 // -----------------------------------------------------------------------------
 //
-void CMmMtpDpMetadataAccessWrapper::GetImageObjPropL( const TDesC& aFullFileName,
+void CMmMtpDpMetadataAccessWrapper::GetImageObjPropL( const CMTPObjectMetaData& aObject,
     TUint32& aWidth,
     TUint32& aHeight )
     {
-    if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) )
+    TMPXGeneralCategory category = Category( aObject );
+    if ( category == EMPXVideo )
         {
-        iMmMtpDpMetadataVideoAccess->SetStorageRootL( aFullFileName );
-        iMmMtpDpMetadataVideoAccess->GetImageObjPropL( aFullFileName, aWidth, aHeight );
+        TPtrC fullFileName( aObject.DesC( CMTPObjectMetaData::ESuid ) );
+        iMmMtpDpMetadataVideoAccess->SetStorageRootL( fullFileName );
+        iMmMtpDpMetadataVideoAccess->GetImageObjPropL( fullFileName, aWidth, aHeight );
         }
     }
+
 // -----------------------------------------------------------------------------
 // CMmMtpDpMetadataAccessWrapper::OpenSessionL
 // Called when the MTP session is initialised
@@ -339,29 +377,61 @@
 // Get category according format code
 // ---------------------------------------------------------------------------
 //
-TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::Category( const TUint aFormatCode )
+TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::Category( const CMTPObjectMetaData& aObject )
     {
     TMPXGeneralCategory category = EMPXNoCategory;
-    switch ( aFormatCode )
+    TUint formatCode = aObject.Uint( CMTPObjectMetaData::EFormatCode );
+    switch ( formatCode )
         {
+        case EMTPFormatCodeASF:
+        case EMTPFormatCodeMP4Container:
+        case EMTPFormatCode3GPContainer:
+            {
+            TUint aSubFormatCode = aObject.Uint( CMTPObjectMetaData::EFormatSubCode );
+            if ( aSubFormatCode == EMTPSubFormatCodeUnknown )
+                {
+                category = ContainerCategory( aObject.DesC( CMTPObjectMetaData::ESuid ) );
+                if ( category == EMPXSong )
+                    aSubFormatCode = EMTPSubFormatCodeAudio;
+                else if ( category == EMPXVideo )
+                    aSubFormatCode = EMTPSubFormatCodeVideo;
+                else
+                    aSubFormatCode = EMTPSubFormatCodeUndefine;
+                const_cast<CMTPObjectMetaData&>(aObject).SetUint( CMTPObjectMetaData::EFormatSubCode, aSubFormatCode );
+                // If object doesn't exist, do nothing
+                TRAP_IGNORE( iFramework.ObjectMgr().ModifyObjectL( aObject ) );
+                }
+            else if ( aSubFormatCode == EMTPSubFormatCodeAudio )
+                category = EMPXSong;
+            else if ( aSubFormatCode == EMTPSubFormatCodeVideo )
+                category = EMPXVideo;
+            else if( aSubFormatCode == EMTPSubFormatCodeUndefine )
+                category = EMPXOther;
+            }
+            break;
+
         case EMTPFormatCodeMP3:
         case EMTPFormatCodeWAV:
         case EMTPFormatCodeWMA:
         case EMTPFormatCodeAAC:
-        case EMTPFormatCodeASF:
-        case EMTPFormatCodeMP4Container:
-        case EMTPFormatCode3GPContainer:
             {
             category = EMPXSong;
             }
             break;
 
+        case EMTPFormatCodeM3UPlaylist:
         case EMTPFormatCodeAbstractAudioVideoPlaylist:
             {
             category = EMPXPlaylist;
             }
             break;
 
+        case EMTPFormatCodeAbstractAudioAlbum:
+            {
+            category = EMPXAbstractAlbum;
+            }
+            break;
+
         case EMTPFormatCodeWMV:
             {
             category = EMPXVideo;
@@ -371,6 +441,46 @@
         default:
             break;
         }
+    PRINT1( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::Category category = %d" ), category );
+    return category;
+    }
+
+TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::ContainerCategory( const TDesC& aFullFileName )
+    {
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::ContainerCategory aFullFileName = %S" ), &aFullFileName );
+
+    TMPXGeneralCategory category = EMPXNoCategory;
+    TParsePtrC pathParser( aFullFileName );
+    TPtrC ext( pathParser.Ext() );
+
+    if ( ext.Length() <= 0 )
+        category = EMPXOther;
+
+    if ( ext.CompareF( KTxtExtensionMP4 ) == 0
+        || ext.CompareF( KTxtExtension3GP ) == 0
+        || ext.CompareF( KTxtExtension3G2 ) == 0
+        || ext.CompareF( KTxtExtensionODF ) == 0
+        || ext.CompareF( KTxtExtensionASF ) == 0 )
+        {
+        HBufC8* mimetype = MmMtpDpUtility::ContainerMimeType( aFullFileName );
+        if ( mimetype != NULL )
+            {
+            TMmMtpSubFormatCode subFormatCode = MmMtpDpUtility::SubFormatCodeFromMime( *mimetype );
+
+            if ( subFormatCode == EMTPSubFormatCodeVideo )
+                category = EMPXVideo;
+            else if( subFormatCode == EMTPSubFormatCodeAudio )
+                category = EMPXSong;
+            else
+                category = EMPXOther;
+            }
+        }
+    else if ( ext.CompareF( KTxtExtensionO4V ) == 0 )
+        category = EMPXVideo;
+    else
+        category = EMPXOther;
+
+    PRINT1( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::ContainerCategory, category = %d" ), category );
     return category;
     }
 
@@ -408,38 +518,27 @@
 // Add object (music, video, playlist and abstract media) info to DB
 // -----------------------------------------------------------------------------
 //
-void CMmMtpDpMetadataAccessWrapper::AddObjectL( const TDesC& aFullFileName, TUint aFormatCode, TUint aSubFormatCode )
+void CMmMtpDpMetadataAccessWrapper::AddObjectL( const CMTPObjectMetaData& aObject )
     {
-    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL aFullFileName = %S" ), &aFullFileName );
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL" ) );
+    TMPXGeneralCategory category = Category( aObject );
 
-    if ( aFullFileName.Length() <= 0 )
-        {
-        User::Leave( KErrArgument );
-        }
-    if ( MmMtpDpUtility::IsVideoL( aFormatCode, aSubFormatCode ) )
+    TPtrC fullFileName( aObject.DesC( CMTPObjectMetaData::ESuid ) );
+    if ( category == EMPXVideo )
         {
         PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL Addvideo" ) );
-        iMmMtpDpMetadataVideoAccess->AddVideoL( aFullFileName );
+        iMmMtpDpMetadataVideoAccess->AddVideoL( fullFileName );
         }
-    else
+    else if ( category == EMPXPlaylist || category == EMPXAbstractAlbum )
         {
-        if ( aFormatCode == EMTPFormatCodeM3UPlaylist
-            || aFormatCode == EMTPFormatCodeMPLPlaylist
-            || aFormatCode == EMTPFormatCodeAbstractAudioVideoPlaylist
-            || aFormatCode == EMTPFormatCodeAbstractAudioPlaylist
-            || aFormatCode == EMTPFormatCodeAbstractVideoPlaylist
-            || aFormatCode == EMTPFormatCodeASXPlaylist
-            || aFormatCode == EMTPFormatCodePLSPlaylist )
-            {
-            PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddPlaylist" ) );
-            iMmMtpDpMetadataMpxAccess->AddAbstractMediaL( aFullFileName,
-                EMPXPlaylist );
-            }
-        else
-            {
-            PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddSong" ) );
-            iMmMtpDpMetadataMpxAccess->AddSongL( aFullFileName );
-            }
+        PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddPlaylist" ) );
+        iMmMtpDpMetadataMpxAccess->AddAbstractMediaL( fullFileName,
+            category );
+        }
+    else if ( category == EMPXSong )
+        {
+        PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddSong" ) );
+        iMmMtpDpMetadataMpxAccess->AddSongL( fullFileName );
         }
 
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::AddObjectL" ) );
@@ -518,7 +617,7 @@
         EMTPFormatCodeAbstractAudioVideoPlaylist )
         {
         RFile newfile;
-        TInt err = newfile.Replace( iFramework.Fs(), aPlaylistName, EFileWrite );
+        TInt err = newfile.Replace( iFs, aPlaylistName, EFileWrite );
 
         if ( err != KErrNone )
             {
@@ -529,7 +628,7 @@
             {
             err = newfile.Flush();
             newfile.Close();
-            err = iFramework.Fs().SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden,
+            err = iFs.SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden,
                 KEntryAttReadOnly | KEntryAttNormal );
             if ( err != KErrNone )
                 PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile Dummy Playlist file created. err = %d" ), err );
@@ -539,7 +638,7 @@
 
 // -----------------------------------------------------------------------------
 // CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles
-// Remove all dummy file of which format is "pla", and leave the "m3u"
+// Remove all dummy file of which format is "pla" and "alb", and leave the "m3u"
 // -----------------------------------------------------------------------------
 //
 void CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles()
@@ -547,25 +646,43 @@
     PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) );
 
     TInt count = iAbstractMediaArray->Count();
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles, count = %d" ), count );
     // Check if playlist file is a dummy file or an imported file
     for ( TInt i = 0; i < count; i++ )
         {
-        TPtrC dummyFileName( (*iAbstractMediaArray)[i] );
-        if ( MmMtpDpUtility::FormatFromFilename( dummyFileName ) !=
-            EMTPFormatCodeM3UPlaylist )
+        TPtrC fileName( (*iAbstractMediaArray)[i] );
+        PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles, fileName = %S" ), &fileName );
+        
+        TMTPFormatCode format = MmMtpDpUtility::FormatFromFilename( fileName );
+        PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles, format = 0x%x" ), format );
+        if ( format == EMTPFormatCodeAbstractAudioAlbum )
             {
-            // delete the virtual playlist
-            // iFramework has release don't use iFramework.FS()
-            TInt err = iRfs.Delete( ( *iAbstractMediaArray )[i] );
+            // delete the abstract album if its size is zero
+            TEntry entry;
+            TInt err = iFs.Entry( fileName, entry );
+            if ( err == KErrNone && entry.iSize == 0 )
+                {
+                TRAP( err, iMmMtpDpMetadataMpxAccess->DeleteObjectL( fileName, EMPXAbstractAlbum ) );
+                if( err == KErrNone )
+                    {
+                    err = iFs.Delete( fileName );
+                    }
+                }
+            PRINT3( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile filename = %S, err %d, entry.iSize = %d" ),
+                &fileName, err, entry.iSize );
+            }
+        else if ( format != EMTPFormatCodeM3UPlaylist )
+            {
+            TInt err = iFs.Delete( fileName );
 
             PRINT2( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile filename = %S, err %d" ),
-                &dummyFileName,
+                &fileName,
                 err );
             }
         else
             {
             // leave the Imported playlist in the file system
-            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile, Don't delete m3u file [%S]" ), &dummyFileName );
+            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile, Don't delete m3u file [%S]" ), &fileName );
             }
         }
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) );
--- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp	Wed Mar 31 22:26:09 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>
@@ -71,10 +69,9 @@
 _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 );
@@ -82,10 +79,8 @@
     return self;
     }
 
-CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs,
-    MMTPDataProviderFramework& aFramework ):
-    iRfs( aRfs ),
-    iFramework( aFramework )
+CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs ):
+    iRfs( aRfs )
     {
     // Do nothing
     }
@@ -129,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( 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
@@ -602,25 +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 );
 
     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 )
         {
@@ -639,112 +616,35 @@
 // -----------------------------------------------------------------------------
 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 abstract media" ) );
-        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 );
@@ -951,6 +851,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 );
@@ -1156,13 +1077,17 @@
         TParsePtrC parse( aFullFileName );
 
         media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
-        if ( aCategory == EMPXPlaylist )
+        if ( ( aCategory == EMPXPlaylist ) || ( aCategory == EMPXAbstractAlbum ) )
             {
             media->SetTextValueL( KMPXMediaGeneralTitle, parse.Name() );
             }
         media->SetTObjectValueL<TBool>( KMPXMediaGeneralSynchronized, ETrue );
         media->SetCObjectValueL( KMPXMediaArrayContents, abstractMediaArray );
         media->SetTObjectValueL( KMPXMediaArrayCount, abstractMediaArray->Count() );
+        if ( aCategory == EMPXAbstractAlbum )
+            {
+            media->SetTObjectValueL( KMPXMediaMTPSampleDataFlag, EFalse );
+            }
 
         PERFLOGSTART( KMpxCollectionAddL );
         CollectionHelperL()->AddL( media );
@@ -1180,26 +1105,21 @@
     }
 
 // -----------------------------------------------------------------------------
-// CMmMtpDpMetadataMpxAccess::SetAbstractMediaL
+// CMmMtpDpMetadataMpxAccess::SetReferenceL
 // Set abstract media to DB
 // -----------------------------------------------------------------------------
 //
-void CMmMtpDpMetadataMpxAccess::SetAbstractMediaL( const TDesC& aAbstractMediaFileName,
-    CDesCArray& aRefFileArray, TMPXGeneralCategory aCategory )
+void CMmMtpDpMetadataMpxAccess::SetReferenceL( const TDesC& aRefOwnerName,
+    CDesCArray& aRefFileArray,
+    TMPXGeneralCategory aCategory )
     {
-    PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetAbstractMediaL" ) );
+    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
@@ -1217,10 +1137,10 @@
             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
@@ -1238,12 +1158,9 @@
     CleanupStack::PushL( abstractMedia ); // + abstractMedia
 
     abstractMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
-
     abstractMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory );
-
-    abstractMedia->SetTextValueL( KMPXMediaGeneralUri, aAbstractMediaFileName );
-
-    TParsePtrC parse( aAbstractMediaFileName );
+    abstractMedia->SetTextValueL( KMPXMediaGeneralUri, aRefOwnerName );
+    TParsePtrC parse( aRefOwnerName );
     abstractMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
     abstractMedia->SetTObjectValueL<TBool>( KMPXMediaGeneralSynchronized,
         ETrue );
@@ -1257,11 +1174,9 @@
     PERFLOGSTOP( KMpxCollectionSetReferenceL );
 
     CleanupStack::PopAndDestroy( abstractMedia ); // - abstractMedia
-
-    // Clear the array
     CleanupStack::PopAndDestroy( abstractMediaArray ); // - abstractMediaArray
 
-    PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetAbstractMediaL" ) );
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetReferenceL" ) );
     }
 
 // ---------------------------------------------------------------------------
@@ -1311,8 +1226,8 @@
     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 );
 
@@ -1357,7 +1272,8 @@
             { EMTPObjectPropCodeAudioBitRate,            KMPXMediaAudioBitrate },
             { EMTPObjectPropCodeSampleRate,              KMPXMediaAudioSamplerate },
             { EMTPObjectPropCodeAudioWAVECodec,          KMPXMediaAudioAudioCodec },
-            { EMTPObjectPropCodeAlbumArtist,             KMPXMediaMusicArtist }
+            { EMTPObjectPropCodeAlbumArtist,             KMPXMediaMusicAlbumArtist },
+            { EMTPObjectPropCodeRepresentativeSampleData,KMPXMediaMTPSampleDataFlag }
         };
 
     TInt i = 0;
@@ -1384,7 +1300,8 @@
 // ---------------------------------------------------------------------------
 //
 void CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL( const TDesC& aStoreRoot,
-        CMPXMediaArray** aAbstractMedias, TMPXGeneralCategory aCategory )
+    CMPXMediaArray** aAbstractMedias,
+    TMPXGeneralCategory aCategory )
     {
     PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL" ) );
 
@@ -1548,6 +1465,14 @@
             }
         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 );
--- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatavideoaccess.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatavideoaccess.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -303,10 +303,6 @@
     formatBuf.Append( KMtpVideoParentalRatingType );
     formatBuf.Append( KMtpVideoCommaSign );
 
-    formatBuf.Append( KMtpVideoUseCount );
-    formatBuf.Append( KMtpVideoUseCountType );
-    formatBuf.Append( KMtpVideoCommaSign );
-
     formatBuf.Append( KMtpVideoDRM );
     formatBuf.Append( KMtpVideoDRMType );
     formatBuf.Append( KMtpVideoCommaSign );
@@ -662,9 +658,6 @@
         num = iColSet->ColNo( KMtpVideoParentalRating );
         iRecordSet.SetColL( num, KNullDesC );
 
-        num = iColSet->ColNo( KMtpVideoUseCount );
-        iRecordSet.SetColL( num, 0 );
-
         num = iColSet->ColNo( KMtpVideoDRM );
         iRecordSet.SetColL( num, 0 );
         }
@@ -1006,22 +999,6 @@
             }
             break;
 
-        case EMTPObjectPropCodeUseCount:
-            {
-            PRINT( _L( "MM MTP <> EMTPObjectPropCodeUseCount-MD" ) );
-            num = iColSet->ColNo( KMtpVideoUseCount );
-            uInt32 = iRecordSet.ColUint32( num );
-            if ( EMTPTypeUINT32 == aNewData.Type() )
-                {
-                ( ( TMTPTypeUint32 & ) aNewData ).Set( uInt32 );
-                }
-            else
-                {
-                User::Leave( KErrArgument );
-                }
-            }
-            break;
-
         case EMTPObjectPropCodeDRMStatus:
             {
             PRINT( _L( "MM MTP <> EMTPObjectPropCodeDRMStatus-MD" ) );
@@ -1174,7 +1151,6 @@
         case EMTPObjectPropCodeVideoBitRate:
         case EMTPObjectPropCodeFramesPerThousandSeconds:
         case EMTPObjectPropCodeKeyFrameDistance:
-        case EMTPObjectPropCodeUseCount:
             {
             if ( EMTPTypeUINT32 != aNewData.Type() )
                 {
@@ -1499,7 +1475,6 @@
             { EMTPObjectPropCodeScanType,                KMtpVideoScanType },
             { EMTPObjectPropCodeEncodingProfile,         KMtpVideoEncodingProfile },
             { EMTPObjectPropCodeParentalRating,          KMtpVideoParentalRating },
-            { EMTPObjectPropCodeUseCount,                KMtpVideoUseCount },
             { EMTPObjectPropCodeAudioWAVECodec,          KMtpVideoAudioCodec },
             { EMTPObjectPropCodeDRMStatus,               KMtpVideoDRM },
         };
--- a/mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -45,6 +45,9 @@
 _LIT( KHxMimeTypeWma, "audio/x-hx-wma" );
 _LIT( KHxMimeTypeWmv, "video/x-hx-wmv" );
 
+const TInt KMaxRenameTimes = 10;
+const TInt KRenameThreshold = 100 * 1000; // (100 millisec)
+
 // -----------------------------------------------------------------------------
 // MmMtpDpUtility::FormatFromFilename
 // Utility function to get the type of an object from the filename
@@ -61,6 +64,9 @@
 
     TParsePtrC file( aFullFileName );
 
+    if ( !file.ExtPresent() )
+        return EMTPFormatCodeUndefined;
+
     // need to do it in popularity of format, to optmize performance
     if ( file.Ext().CompareF( KTxtExtensionMP3 ) == 0 )
             return EMTPFormatCodeMP3;
@@ -117,6 +123,9 @@
             }
         }
 
+    if ( file.Ext().CompareF( KTxtExtensionALB ) == 0 )
+        return EMTPFormatCodeAbstractAudioAlbum;
+
     if (( file.Ext().CompareF( KTxtExtensionPLA ) == 0 ) || ( file.Ext().CompareF( KTxtExtensionVIR ) == 0 ) )
         return EMTPFormatCodeAbstractAudioVideoPlaylist;
 
@@ -164,130 +173,6 @@
     }
 
 // -----------------------------------------------------------------------------
-// MmMtpDpUtility::IsVideo (Slow Version)
-// Utility function to determine whether a format is Video or not
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TBool MmMtpDpUtility::IsVideo( const TDesC& aFullFileName )
-    {
-    PRINT1( _L( "MM MTP => MmMtpDpUtility::IsVideoL (Slow Version) aFullFileName = %S" ), &aFullFileName );
-
-    TParsePtrC pathParser( aFullFileName );
-    TPtrC ext( pathParser.Ext() );
-
-    if ( ext.Length() <= 0 )
-        {
-        PRINT( _L( "MM MTP <> MmMtpDpUtility::IsVideoL ext len <= 0, return false" ) );
-        return EFalse;
-        }
-
-    // move WMV early to optmize comparison
-    if ( ext.CompareF( KTxtExtensionWMV ) == 0 )
-        {
-        return ETrue;
-        }
-    else if ( ext.CompareF( KTxtExtensionMP4 ) == 0
-        || ext.CompareF( KTxtExtension3GP ) == 0
-        || ext.CompareF( KTxtExtension3G2 ) == 0
-        || ext.CompareF( KTxtExtensionODF ) == 0
-        || ext.CompareF( KTxtExtensionASF ) == 0 )
-        {
-        HBufC8* mimetype = ContainerMimeType( aFullFileName );
-        if ( mimetype != NULL )
-            {
-            TMmMtpSubFormatCode subFormatCode;
-
-            TInt err = SubFormatCodeFromMime(*mimetype, subFormatCode);
-            PRINT1( _L( "MM MTP <> MmMtpDpUtility::IsVideoL SubFormatCodeFromMime err = %d" ), err );
-            
-            if ( subFormatCode == EMTPSubFormatCodeVideo )
-                {
-                return ETrue;
-                }
-            }
-        }
-    else if ( ext.CompareF( KTxtExtensionO4V ) == 0 )
-        return ETrue;
-
-    // NOTE: Treate all non-video files as audio files even it's not audio
-    // since the entry is not going to be find out in MPX
-    // we can handle that situation gracefully.
-    return EFalse;
-    }
-
-// -----------------------------------------------------------------------------
-// MmMtpDpUtility::IsVideoL (Fast Version)
-// Utility function to determine whether a format is Video or not
-// -----------------------------------------------------------------------------
-//
-TBool MmMtpDpUtility::IsVideoL( const TDesC& aFullFileName,
-    const MMTPDataProviderFramework& aFramework )
-    {
-    PRINT1( _L( "MM MTP => MmMtpDpUtility::IsVideoL (Fast Version) aFullFileName = %S" ), &aFullFileName );
-
-    CMTPObjectMetaData* info = CMTPObjectMetaData::NewLC(); // + info
-    aFramework.ObjectMgr().ObjectL( aFullFileName, *info );
-
-    TUint formatCode = info->Uint( CMTPObjectMetaData::EFormatCode );
-    TUint subFormatCode = info->Uint( CMTPObjectMetaData::EFormatSubCode );
-    TBool ifNeedParse = ( ( formatCode == EMTPFormatCodeMP4Container )
-        || ( formatCode == EMTPFormatCode3GPContainer )
-        || ( formatCode== EMTPFormatCodeASF ) )
-        && ( subFormatCode == EMTPSubFormatCodeUnknown );
-    TBool isVideo = EFalse;
-    if ( ifNeedParse )
-        {
-        isVideo = MmMtpDpUtility::IsVideo( aFullFileName );
-        subFormatCode = isVideo ? EMTPSubFormatCodeVideo : EMTPSubFormatCodeAudio;
-
-        // Once we got the subformat code, set it into fw db
-        aFramework.ObjectMgr().ModifyObjectL( *info );
-        }
-    else
-        {
-        isVideo = MmMtpDpUtility::IsVideoL( formatCode, subFormatCode );
-        }
-        
-    CleanupStack::PopAndDestroy( info ); // - info
-
-    return isVideo;
-    }
-
-// -----------------------------------------------------------------------------
-// MmMtpDpUtility::IsVideoL (Fast Version)
-// Utility function to determine whether a format is Video or not
-// -----------------------------------------------------------------------------
-//
-TBool MmMtpDpUtility::IsVideoL( TUint aFormatCode, TUint aSubFormatCode )
-    {
-    if ( aFormatCode == KMTPFormatsAll )
-        User::Leave( KErrArgument );
-
-    if ( aFormatCode == EMTPFormatCodeWMV )
-        {
-        return ETrue;
-        }
-    else if ( ( aFormatCode == EMTPFormatCodeMP4Container )
-        || ( aFormatCode == EMTPFormatCode3GPContainer )
-        || ( aFormatCode == EMTPFormatCodeASF ) )
-        {
-        if ( aSubFormatCode == EMTPSubFormatCodeAudio )
-            {
-            return EFalse;
-            }
-        else if ( aSubFormatCode == EMTPSubFormatCodeVideo )
-            {
-            return ETrue;
-            }
-        }
-
-    PRINT( _L( "MM MTP <= MmMtpDpUtility::IsVideoL (Fast Version)" ) );
-
-    // other format, as audio
-    return EFalse;
-    }
-
-// -----------------------------------------------------------------------------
 // MmMtpDpUtility::ValidateFilename
 // Check the filename to see if it exceeds Symbian 256 limit.
 // -----------------------------------------------------------------------------
@@ -323,16 +208,14 @@
 // Get the file date modified.
 // -----------------------------------------------------------------------------
 //
-TTime MmMtpDpUtility::GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName )
+void MmMtpDpUtility::GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName, TDes& aDateModified )
     {
-    TTime dataModified;
+    TTime date;
     TEntry fileInfo;
     // Shouldn't leave
     User::LeaveIfError( aFs.Entry( aFullFileName, fileInfo ) );
-
-    dataModified = fileInfo.iModified;
-
-    return dataModified;
+    date = fileInfo.iModified;
+    date.FormatL( aDateModified, KMtpDateTimeFormat );
     }
 
 // -----------------------------------------------------------------------------
@@ -364,7 +247,7 @@
 // Check if property type match datatype.
 // -----------------------------------------------------------------------------
 //
-TMTPResponseCode MmMtpDpUtility::CheckPropType(TUint16 aPropertyCode, TUint16 aDataType)
+TMTPResponseCode MmMtpDpUtility::CheckPropType( TUint16 aPropertyCode, TUint16 aDataType )
     {
     PRINT2( _L( "MM MTP => MmMtpDpUtility::CheckPropCode aPropertyCode = 0x%x, aDataType = 0x%x" ),
         aPropertyCode,
@@ -384,6 +267,10 @@
         case EMTPObjectPropCodeDateModified:
         case EMTPObjectPropCodeDateAdded:
         case EMTPObjectPropCodeVideoBitRate:
+        case EMTPObjectPropCodeRepresentativeSampleFormat:
+        case EMTPObjectPropCodeRepresentativeSampleSize:
+        case EMTPObjectPropCodeRepresentativeSampleHeight:
+        case EMTPObjectPropCodeRepresentativeSampleWidth:
             {
             responseCode = EMTPRespCodeAccessDenied;
             }
@@ -399,6 +286,7 @@
         case EMTPObjectPropCodeOriginalReleaseDate: // 0xDC99
         case EMTPObjectPropCodeAlbumName: // 0xDC9A
         case EMTPObjectPropCodeEncodingProfile: // 0xDEA1
+        case EMTPObjectPropCodeAlbumArtist: // 0xDC9B
             {
             if ( aDataType != EMTPTypeString )
                 {
@@ -420,7 +308,6 @@
         case EMTPObjectPropCodeWidth: // 0xDC87
         case EMTPObjectPropCodeHeight: // 0xDC88
         case EMTPObjectPropCodeDuration: // 0xDC89
-        case EMTPObjectPropCodeUseCount: // 0xDC91
         case EMTPObjectPropCodeSampleRate: // 0xDE93
         case EMTPObjectPropCodeAudioWAVECodec: // 0xDE99
         case EMTPObjectPropCodeAudioBitRate: // 0xDE9A
@@ -459,6 +346,15 @@
             }
             break;
 
+        case EMTPObjectPropCodeRepresentativeSampleData:
+            {
+            if ( aDataType != EMTPTypeAUINT8 )
+                {
+                responseCode = EMTPRespCodeInvalidObjectPropFormat;
+                }
+            }
+            break;
+
         default:
             {
             responseCode = EMTPRespCodeInvalidObjectPropCode;
@@ -493,7 +389,27 @@
         aNewName.Insert( 0, ptr );
         }
 
-    return aFs.Rename( aFullFileName, aNewName );
+    TInt ret = KErrNone;
+    // Some other component might be holding on to the file (MDS background harvesting),
+    // try again after 100 millisec, up to 10 times, before give up
+    TInt count = KMaxRenameTimes;
+    while ( count > 0 )
+        {
+        ret = aFs.Rename( aFullFileName, aNewName );
+        if ( ( ret == KErrInUse ) && ( count > 1 ) )
+            {
+            User::After( KRenameThreshold );
+            count--;
+            }
+        else
+            {
+            break;
+            }
+        }
+
+    PRINT1( _L( "MM MTP <> MmMtpDpUtility::UpdateObjectFileName, ret = %d" ), ret );
+
+    return ret;
     }
 
 // -----------------------------------------------------------------------------
@@ -774,11 +690,12 @@
 // Get subformat code from mime string
 // -----------------------------------------------------------------------------
 //
-TInt MmMtpDpUtility::SubFormatCodeFromMime( const TDesC8& aMimeType,
-    TMmMtpSubFormatCode& aSubFormatCode )
+TMmMtpSubFormatCode MmMtpDpUtility::SubFormatCodeFromMime( const TDesC8& aMimeType )
     {
     PRINT( _L( "MM MTP => MmMtpDpUtility::SubFormatCodeFromMime" ) );
 
+    TMmMtpSubFormatCode subFormatCode = EMTPSubFormatCodeUnknown;
+
     if ( aMimeType.CompareF( KMimeTypeVideoMp4 ) == 0
         || aMimeType.CompareF( KMimeTypeVideo3gpp ) == 0
 #ifdef __WINDOWS_MEDIA
@@ -786,7 +703,7 @@
 #endif
         )
         {
-        aSubFormatCode = EMTPSubFormatCodeVideo;
+        subFormatCode = EMTPSubFormatCodeVideo;
         }
     else if ( aMimeType.CompareF( KMimeTypeAudioMp4 ) == 0
         || aMimeType.CompareF( KMimeTypeAudio3gpp ) == 0
@@ -795,16 +712,17 @@
 #endif
         )
         {
-        aSubFormatCode = EMTPSubFormatCodeAudio;
+        subFormatCode = EMTPSubFormatCodeAudio;
         }
     else
         {
         PRINT( _L( "MM MTP <= MmMtpDpUtility::SubFormatCodeFromMime format not supported" ) );
-        return KErrNotFound;
+        subFormatCode = EMTPSubFormatCodeUndefine;
         }
 
-    PRINT( _L( "MM MTP <= MmMtpDpUtility::SubFormatCodeFromMime" ) );
-    return KErrNone;
+    PRINT1( _L( "MM MTP <= MmMtpDpUtility::SubFormatCodeFromMime SubFormatCode = %d" ), subFormatCode );
+
+    return subFormatCode;
     }
 
 // -----------------------------------------------------------------------------
--- a/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/inc/CollectionHelperTestClass.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/inc/CollectionHelperTestClass.h	Wed Mar 31 22:26:09 2010 +0300
@@ -73,6 +73,28 @@
 _LIT( KRenameOldUri, "c:\\Blackbird.aac");
 _LIT( KRenameNewUri, "c:\\data\\Blackbird.aac");
 
+_LIT( KFileWmaSong, "f:\\1.wma");
+
+_LIT( KFile1, "e:\\data\\sounds\\digital\\1.mp3");    //ok
+_LIT( KOldAbstractAlbumName, "1.wma");    //ok
+_LIT( KNewAbstractAlbumName, "The 99 Most Essential Beethoven MasterpiecesVarious Artists");    //ok
+_LIT( KFile3, "e:\\data\\sounds\\digital\\(01) Amber - Yes.mp3");    //ok
+_LIT( KFilet, "e:\\data\\sounds\\digital\\02 What A Wonderful World.mp3");    //ok
+
+
+_LIT( KTestFile3, "e:\\data\\sounds\\digital\\Atomic Kitten - It's Ok.mp3");    //ok
+_LIT( KSongtest, "e:\\data\\sounds\\digital\\02 What A Wonderful World.mp3"); //ok
+
+_LIT( KAbstractalbum1, "f:\\1.alb");
+_LIT( KAbstractalbum2, "f:\\2.alb");
+_LIT( KAbstractalbum3, "f:\\3.alb");
+_LIT( KStoreRoot, "f:\\");
+
+_LIT( KAbstractAlbumName, "The 99 Most Essential Beethoven MasterpiecesVarious Artists");
+
+_LIT( KAlbumArtistShort, "testAlbumArtist");
+
+
 
 // FORWARD DECLARATIONS	
 class CCollectionHelperTestClass;
@@ -300,7 +322,6 @@
 	    TInt SetAllowedPanic( CStifItemParser& aItem );
 	    
 	    void CreateTestMediaL( CMPXMedia*& aNewProperty );
-	    
 	    /**
 	    * Connect to the default client to the server
 	    * @since S60 3.2
@@ -316,8 +337,21 @@
 		virtual TInt CloseUiHelperL(CStifItemParser& aItem);
 		virtual TInt CloseHelperL(CStifItemParser& aItem);
 		virtual TInt CloseCachedHelperL(CStifItemParser& aItem);      
-        
 
+        virtual TInt AddSongL(CStifItemParser& aItem);
+        TInt FindMediaL(const TDesC& aPath, TMPXGeneralCategory aCategory);
+		virtual TInt RemoveSongL(CStifItemParser& aItem );
+	    virtual TInt AddAbstractAlbumL(CStifItemParser& aItem);
+	    virtual TInt RemoveAbstractAlbumL(CStifItemParser& aItem);
+	    virtual TInt SetAbstractAlbumL(CStifItemParser& aItem);
+	    virtual TInt SetSongAlbumArtistL(CStifItemParser& aItem);
+	    virtual TInt GetSongAlbumArtistL(CStifItemParser& aItem);
+	    virtual TInt SetAbstractAlbumArtistL(CStifItemParser& aItem);
+	    virtual TInt GetAbstractAlbumArtistL(CStifItemParser& aItem);
+	    virtual TInt UpdateAbstractAlbumNameL(CStifItemParser& aItem);
+	    virtual TInt GetAbstractAlbumAndSongsL(CStifItemParser& aItem);
+	    virtual TInt RenameAbstractAlbumL(CStifItemParser& aItem);
+        void AttachSongsL(CMPXMediaArray* aAbstractalbumArray, const TDesC& aPath);
     	/**
     	*  From MMPXCollectionRemoveObserver
     	*  Handles removing a collection path
@@ -339,7 +373,8 @@
     	*  @param aError error code   
     	*/
     	void HandleFindAllL(const CMPXMedia& aResults, TBool aComplete,TInt aError);
-    	
+    
+	
     public:     // Data
 
     protected:  // Data
--- a/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/src/CollectionHelperTestClassBlocks.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/src/CollectionHelperTestClassBlocks.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -30,6 +30,7 @@
 #include <mpxmediacontainerdefs.h>
 #include <mpxattribute.h>
 #include "debug.h"
+#include <mpxmediamtpdefs.h>
 
 // EXTERNAL DATA STRUCTURES
 //extern  ?external_data;
@@ -134,10 +135,22 @@
         ENTRY( "NewUiHelper", CCollectionHelperTestClass::NewUiHelperL ),
         ENTRY( "NewHelper", CCollectionHelperTestClass::NewHelperL ),
         ENTRY( "NewCachedHelper", CCollectionHelperTestClass::NewCachedHelperL ),
+        ENTRY( "AddSong", CCollectionHelperTestClass::AddSongL ),
+        ENTRY( "RemoveSong", CCollectionHelperTestClass::RemoveSongL ),
+        ENTRY( "AddAbstractAlbum", CCollectionHelperTestClass::AddAbstractAlbumL ),
+       ENTRY( "RemoveAbstractAlbum", CCollectionHelperTestClass::RemoveAbstractAlbumL ),
+        ENTRY( "SetAbstractAlbum", CCollectionHelperTestClass::SetAbstractAlbumL ),
+        ENTRY( "SetSongAlbumArtist", CCollectionHelperTestClass::SetSongAlbumArtistL ),
+        ENTRY( "GetSongAlbumArtist", CCollectionHelperTestClass::GetSongAlbumArtistL ),
+ENTRY( "SetAbstractAlbumArtist", CCollectionHelperTestClass::SetAbstractAlbumArtistL ),
+ENTRY( "GetAbstractAlbumArtist", CCollectionHelperTestClass::GetAbstractAlbumArtistL ),
+ENTRY( "UpdateAbstractAlbumName", CCollectionHelperTestClass::UpdateAbstractAlbumNameL ),
+  ENTRY("GetAbstractAlbumAndSongs",CCollectionHelperTestClass::GetAbstractAlbumAndSongsL),
+        ENTRY( "RenameAbstractAlbum", CCollectionHelperTestClass::RenameAbstractAlbumL ),
         ENTRY( "CloseUiHelper", CCollectionHelperTestClass::CloseUiHelperL ),
         ENTRY( "CloseHelper", CCollectionHelperTestClass::CloseHelperL ),
         ENTRY( "CloseCachedHelper", CCollectionHelperTestClass::CloseCachedHelperL ),        
-        };
+		};
 
     const TInt count = sizeof( KFunctions ) / 
                         sizeof( TStifFunctionInfo );
@@ -511,6 +524,640 @@
 
 	return result;
 	}
+
+
+//Removing song from collection
+//By calling CMPXCollectionCachedHelper API RemoveL
+TInt CCollectionHelperTestClass::RemoveSongL(CStifItemParser& /*aItem*/)
+    {
+	FTRACE(FPrint(_L("CCollectionHelperTest::RemoveSongL")));
+	TRAPD(result, iCachedHelper->RemoveL(KFileWmaSong, EMPXSong));
+	iLog->Log(_L("CCollectionHelperTestClass::RemoveSong done with result=[%d]"), result);
+	return result;
+	}
+
+//Removing AbstractAlbum from collection
+//By calling CMPXCollectionCachedHelper API RemoveL
+//precondition:  e:\\data\\sounds\\digital\\1.alb  on test HW
+//output: 1.alb is delete from MPX DB
+TInt CCollectionHelperTestClass::RemoveAbstractAlbumL(CStifItemParser& /*aItem*/)
+  {
+	FTRACE(FPrint(_L("CCollectionHelperTest::RemoveAbstractAlbumL")));
+	TRAPD(result, iCachedHelper->RemoveL(KAbstractalbum1, EMPXAbstractAlbum));
+	iLog->Log(_L("CCollectionHelperTestClass::RemoveAbstractAlbumL done with result=[%d]"), result);
+	return result;
+	}
+//Adds song to the database
+//WMP to MTP step1
+//By calling CMPXCollectionCachedHelper API AddL
+//precondition:  c:\\data\\sounds\\digital\\1.wma  on test emulator
+//precondition:  e:\\data\\sounds\\digital\\1.wma  on test HW
+//output: 1.wma is added into MPX DB
+TInt CCollectionHelperTestClass::AddSongL(CStifItemParser& /*aItem*/ )
+    {
+    FTRACE(FPrint(_L("CCollectionHelperTest::AddSongL")));
+    //Does a record already exist for this abstractalbum?
+    //this is the part to check if the song already exist in db?
+    TInt result;
+    TPtrC name(KFileWmaSong);
+    TInt mediafound = FindMediaL(name, EMPXSong);
+    
+    //media already in collection DB, no need to add
+    if (mediafound == 1)
+        {
+        return 0;
+        }
+
+    else if (mediafound == 0)  //media not in collection DB, continue to add*/
+        {
+        // Create media properties for the song will added
+        iLog->Log(_L("Create media properties"));
+        RArray<TInt> contentIDs;
+        contentIDs.AppendL(KMPXMediaIdGeneral);
+        contentIDs.AppendL(KMPXMediaIdAudio);
+        contentIDs.AppendL(KMPXMediaIdMusic);
+        contentIDs.AppendL(KMPXMediaIdMTP);
+
+        CMPXMedia* media = CMPXMedia::NewL(contentIDs.Array());
+        CleanupStack::PushL(media);
+        contentIDs.Close();
+
+        // MPXMedia default types
+        media->SetTObjectValueL<TMPXGeneralType>(KMPXMediaGeneralType, EMPXItem);
+        media->SetTObjectValueL<TMPXGeneralCategory>(KMPXMediaGeneralCategory, EMPXSong);
+
+        // File Path
+        TParsePtrC parse(name);
+
+        media->SetTextValueL(KMPXMediaGeneralUri, name);
+        media->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive());
+
+        // Title
+		media->SetTextValueL(KMPXMediaGeneralTitle, parse.NameAndExt());
+		// Comment
+		media->SetTextValueL(KMPXMediaGeneralComment, KNullDesC);
+		// Artist
+		media->SetTextValueL(KMPXMediaMusicArtist, KNullDesC);
+		// Album
+		media->SetTextValueL(KMPXMediaMusicAlbum, KNullDesC);
+		//AlbumArtist
+		media->SetTextValueL(KMPXMediaMusicAlbumArtist, KAlbumArtistShort);
+		// Track
+		media->SetTextValueL(KMPXMediaMusicAlbumTrack, KNullDesC);
+		// Genre
+		media->SetTextValueL(KMPXMediaMusicGenre, KNullDesC);
+		// Composer
+		media->SetTextValueL(KMPXMediaMusicComposer, KNullDesC);
+		// URL
+		media->SetTextValueL(KMPXMediaMusicURL, KNullDesC);
+		iLog->Log(_L("Default values set to Media"));
+
+        // Update MPX WMP Roundtrip Metadata of the media object
+        media->SetTObjectValueL<TBool>(KMPXMediaGeneralDeleted, EFalse);
+        media->SetTObjectValueL<TBool>(KMPXMediaGeneralModified, EFalse);
+        media->SetTObjectValueL<TBool>(KMPXMediaGeneralSynchronized, ETrue);
+
+        media->SetTObjectValueL<TUint>(KMPXMediaGeneralFlags, KMPXMediaGeneralFlagsIsInvalid|KMPXMediaGeneralFlagsIsCorrupted);
+
+        // Add new media to collection
+        TRAP(result, iCachedHelper->AddL(media));
+        FTRACE(FPrint(_L("CCollectionHelperTestClass::AddSongL, Media added into collection")));
+
+        CleanupStack::PopAndDestroy(media);
+        }
+	iLog->Log(_L("CCollectionHelperTestClass::AddSongL done with result=[%d]"), result);
+	
+	return result;
+    }
+
+//Adds abstractalbum to the database, *.alb file
+//WMP to MTP step2
+//By calling CMPXCollectionCachedHelper API AddL
+//precondition:  c:\\data\\sounds\\digital\\1.alb  on test emulator
+//precondition:  e:\\data\\sounds\\digital\\1.alb  on test HW
+//output: 1.alb is added into MPX DB
+TInt  CCollectionHelperTestClass::AddAbstractAlbumL(CStifItemParser& /*aItem*/)
+   {
+	FTRACE(FPrint(_L("CCollectionHelperTestClass::AddAbstractAlbumL")));
+    TInt result;
+	TPtrC name(KAbstractalbum1);
+    TInt mediafound = FindMediaL(name, EMPXAbstractAlbum);
+    
+    //media already in collection DB, no need to add
+    if (mediafound == 1)
+        {
+        return 0;
+        }
+
+    else if(mediafound == 0)  // media not in collection DB, continue to add*/
+        {
+        RArray<TInt> contentIDs;
+        contentIDs.AppendL(KMPXMediaIdGeneral);
+
+        CMPXMediaArray* abstractalbumArray = CMPXMediaArray::NewL();
+        CleanupStack::PushL(abstractalbumArray);
+
+        CMPXMedia* media = CMPXMedia::NewL(contentIDs.Array());
+        CleanupStack::PushL(media);
+        contentIDs.Close();
+
+        // MPXMedia default types
+        media->SetTObjectValueL<TMPXGeneralType>(KMPXMediaGeneralType, EMPXItem);
+        //EMPXAbstractAlbum is the new category added for non-embedded art
+        media->SetTObjectValueL<TMPXGeneralCategory>(KMPXMediaGeneralCategory, EMPXAbstractAlbum);
+
+        // File Path
+        media->SetTextValueL(KMPXMediaGeneralUri, name);
+        TParsePtrC parse(name);
+        media->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive());
+        media->SetTextValueL(KMPXMediaGeneralTitle, parse.Name());
+
+        //AlbumArtist
+        media->SetTextValueL(KMPXMediaMusicAlbumArtist, KAlbumArtistShort);
+        media->SetTObjectValueL<TBool>(KMPXMediaGeneralSynchronized, ETrue);
+        media->SetTObjectValueL( KMPXMediaMTPSampleDataFlag, EFalse );
+        media->SetCObjectValueL(KMPXMediaArrayContents, abstractalbumArray);
+        media->SetTObjectValueL(KMPXMediaArrayCount, abstractalbumArray->Count());
+
+        // Add new media to collection
+        TRAP( result, iCachedHelper->AddL(media));
+        CleanupStack::PopAndDestroy(media);
+
+        // Clear the array
+        CleanupStack::PopAndDestroy(abstractalbumArray);
+        }
+    iLog->Log(_L("CCollectionHelperTestClass::AddAbstractAlbumL done with result=[%d]"), result);
+	return result;
+   }
+ 
+//Associate abstractalbum with songs
+//WMP to MTP step3
+//By calling CMPXCollectionCachedHelper API SetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.wma
+//                           c:\\data\\sounds\\digital\\1.alb
+//precondition on HW      :  f:\\1.wma
+//                           f:\\1.alb
+//output: 1.wma and 1.alb is associated
+TInt CCollectionHelperTestClass::SetAbstractAlbumL(CStifItemParser& /*aItem*/)
+ {
+    FTRACE(FPrint(_L("CCollectionHelperTest::SetAbstractAlbumL")));
+
+    CMPXMediaArray* mediaArray = CMPXMediaArray::NewL();
+    CleanupStack::PushL(mediaArray);
+    //add songs to media array
+    AttachSongsL(mediaArray, KFileWmaSong());
+    iLog->Log(_L("song added to abstractalbumArray, mediaArray->Count()=%d"), mediaArray->Count() );
+    RArray<TInt> contentIDs;
+    contentIDs.AppendL(KMPXMediaIdGeneral);
+
+    CMPXMedia* abstractalbumMedia = CMPXMedia::NewL(contentIDs.Array());
+    CleanupStack::PushL(abstractalbumMedia);
+    contentIDs.Close();
+
+    abstractalbumMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem);
+    abstractalbumMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAbstractAlbum);
+
+    abstractalbumMedia->SetTextValueL(KMPXMediaGeneralUri, KAbstractalbum1());
+
+    TParsePtrC parse(KAbstractalbum1());
+    abstractalbumMedia->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive());
+    abstractalbumMedia->SetTObjectValueL<TBool>(KMPXMediaGeneralSynchronized, ETrue);
+
+    abstractalbumMedia->SetCObjectValueL(KMPXMediaArrayContents, mediaArray);
+    abstractalbumMedia->SetTObjectValueL(KMPXMediaArrayCount, mediaArray->Count());
+
+    TRAPD( result, iCachedHelper->SetL(abstractalbumMedia));
+    CleanupStack::PopAndDestroy(abstractalbumMedia);
+
+    // Clear the array
+    CleanupStack::PopAndDestroy(mediaArray);
+    iLog->Log(_L("CCollectionHelperTestClass::SetAbstractAlbumL done with result=[%d]"), result);
+	
+    return result;
+}
+
+//Update AlbumArtist field in Music table
+//By calling CMPXCollectionCachedHelper API SetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.wma
+//precondition on HW:  f:\\1.wma
+//output: MUSIC.AlbumArtist field of song 1.wma is changed
+TInt CCollectionHelperTestClass::SetSongAlbumArtistL(CStifItemParser& /*aItem*/)
+ {
+    FTRACE(FPrint(_L("CCollectionHelperTest::SetSongAlbumArtistL")));
+
+    CMPXMedia* media = NULL;
+
+    // Creat media properties for the song
+    RArray<TInt> contentIDs;
+    contentIDs.AppendL( KMPXMediaIdGeneral );
+    contentIDs.AppendL( KMPXMediaIdAudio );
+    contentIDs.AppendL( KMPXMediaIdMusic );
+    contentIDs.AppendL( KMPXMediaIdMTP );
+
+    media = CMPXMedia::NewL( contentIDs.Array() );
+    CleanupStack::PushL( media ); // + media
+    contentIDs.Close();
+
+    media->SetTObjectValueL<TMPXGeneralCategory>(
+        KMPXMediaGeneralCategory,
+        EMPXSong );
+
+    // MPXMedia default types
+    media->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXItem );
+
+    // Get file path
+    media->SetTextValueL( KMPXMediaGeneralUri, KFileWmaSong() );   //wma test file
+
+    media->SetTextValueL( KMPXMediaGeneralDrive, KStoreRoot() );
+    media->SetTextValueL( KMPXMediaMusicAlbumArtist, KAlbumArtistShort());
+
+    TRAPD( result, iCachedHelper->SetL(media));
+
+   CleanupStack::PopAndDestroy( media ); // - media
+    iLog->Log(_L("CCollectionHelperTestClass::SetSongAlbumArtistL done with result=[%d]"), result);
+	
+   return result;
+}
+//Retrive MUSIC.AlbumArtist field
+//By calling CMPXCollectionCachedHelper GetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.wma
+//precondition on HW:  f:\\1.wma
+//output: song 1.wma is returned and MUSIC.AlbumArtist field of song 1.wma is retrived.
+TInt CCollectionHelperTestClass::GetSongAlbumArtistL(CStifItemParser& /*aItem*/)
+{
+    FTRACE(FPrint(_L("CCollectionHelperTest::GetSongAlbumArtistL")));
+    TMPXGeneralCategory category = EMPXSong;
+   // CMPXMedia* foundMedia= NULL;
+
+   const CMPXMedia& foundMedia = iCachedHelper->GetL( KFileWmaSong(), category );
+
+    if (foundMedia.IsSupported(KMPXMediaMusicAlbumArtist))
+        {
+        const TDesC& albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist );
+	    }
+   iLog->Log(_L("CCollectionHelperTestClass::GetSongAlbumArtistL done "));
+
+   return 1;
+}
+
+
+
+//Update ABSTRACTALBUM.AlbumArtist
+//Update AlbumArtist field in Abstractalbum table
+//By calling CMPXCollectionCachedHelper API SetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.alb
+//precondition on HW:  f:\\1.alb
+//output: ABSTRACTALBUM.AlbumArtist field of abstractalbum 1.alb is changed
+TInt CCollectionHelperTestClass::SetAbstractAlbumArtistL(CStifItemParser& /*aItem*/)
+ {
+    FTRACE(FPrint(_L("CCollectionHelperTest::SetAbstractAlbumArtistL")));
+
+    CMPXMedia* media = NULL;
+
+    RArray<TInt> contentIDs;
+    contentIDs.AppendL( KMPXMediaIdGeneral );
+
+    media = CMPXMedia::NewL( contentIDs.Array() );
+    CleanupStack::PushL( media ); // + media
+    contentIDs.Close();
+    media->SetTObjectValueL<TMPXGeneralCategory>( KMPXMediaGeneralCategory,
+           EMPXAbstractAlbum );
+    media->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXItem );
+
+    media->SetTextValueL( KMPXMediaGeneralUri, KAbstractalbum1() );
+    media->SetTextValueL( KMPXMediaGeneralDrive, KStoreRoot() );
+
+    media->SetTextValueL( KMPXMediaMusicAlbumArtist, KAlbumArtistShort() );
+
+    TRAPD( result, iCachedHelper->SetL(media));
+
+    CleanupStack::PopAndDestroy(media);
+    iLog->Log(_L("CCollectionHelperTestClass::SetAbstractAlbumArtistL done with result=[%d]"), result);
+
+
+    return result;
+}
+
+//Retrieve ABSTRACTALBUM.AlbumArtist
+//By calling CMPXCollectionCachedHelper API GetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.alb
+//precondition on HW:  f:\\1.alb
+//output: abstractalbum 1.alb is returned and ABSTRACTALBUM.AlbumArtist field of 1.alb is retrived.
+TInt CCollectionHelperTestClass::GetAbstractAlbumArtistL(CStifItemParser& /*aItem*/)
+    {
+	FTRACE(FPrint(_L("CCollectionHelperTest::GetAbstractAlbumArtistL")));
+    TMPXGeneralCategory category = EMPXAbstractAlbum;
+    const CMPXMedia& foundMedia = iCachedHelper->GetL( KAbstractalbum1(), category );   //wma test file
+
+
+    //print out foundMedia attributes
+    if (foundMedia.IsSupported(KMPXMediaMusicAlbumArtist))
+        {
+		iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL, ABSTRACTALBUM.AlbumArtist retrived"));
+
+
+        
+
+         const TDesC& albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist );
+
+        }
+
+		if (foundMedia.IsSupported(KMPXMediaGeneralTitle))
+		 {
+
+		  
+			  //  HBufC* albumartist;
+			   //     albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist ).AllocLC(); // + data
+				 const TDesC& name = foundMedia.ValueText( KMPXMediaGeneralTitle );
+				 iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL, ABSTRACTALBUM.name retrived"));
+				 
+	
+
+		}
+		if (foundMedia.IsSupported(KMPXMediaGeneralUri))
+			 {
+
+			  
+				  //  HBufC* albumartist;
+				   //     albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist ).AllocLC(); // + data
+		     const TDesC& uri = foundMedia.ValueText( KMPXMediaGeneralUri );
+			 iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL, ABSTRACTALBUM.uri retrived"));
+					  
+			}
+	iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL done"));
+	return 1;
+	}
+
+
+//Update ABSTRACTALBUM.Name
+//Update Name field in Abstractalbum table
+//By calling CMPXCollectionCachedHelper API SetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.alb
+//precondition on HW:  f:\\1.alb
+//output: ABSTRACTALBUM.name field of 1.alb is changed.
+TInt CCollectionHelperTestClass::UpdateAbstractAlbumNameL(CStifItemParser& /*aItem*/)
+ {
+	FTRACE(FPrint(_L("CCollectionHelperTest::UpdateAbstractAlbumNameL")));
+    CMPXMedia* media = NULL;
+
+    // Creat media properties for the song
+    RArray<TInt> contentIDs;
+    contentIDs.AppendL( KMPXMediaIdGeneral );
+
+	media = CMPXMedia::NewL( contentIDs.Array() );
+	
+	CleanupStack::PushL( media ); // + media
+	contentIDs.Close();           //- contentIDs
+
+    media->SetTObjectValueL<TMPXGeneralCategory>(
+        KMPXMediaGeneralCategory,
+        EMPXAbstractAlbum );
+
+    media->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXItem );
+
+	media->SetTextValueL( KMPXMediaGeneralUri, KAbstractalbum1() );
+	media->SetTextValueL( KMPXMediaGeneralDrive, KStoreRoot() );
+
+	//media->SetTextValueL( KMPXMediaMusicAlbumArtist, KAbstractAlbumName() );
+    media->SetTextValueL( KMPXMediaGeneralTitle, KAbstractAlbumName() );
+   // media->SetTextValueL( KMPXMediaMusicAlbumArtFileName, KNewAbstractAlbumName() );
+
+	TRAPD( result, iCachedHelper->SetL(media));
+    CleanupStack::PopAndDestroy(media);  // - media
+
+    iLog->Log(_L("CCollectionHelperTestClass::UpdateAbstractAlbumNameL, done with result[%d]"), result);
+    return result;
+}
+
+
+//Find all abstractalbums on KStoreRoot
+//Find all songs associated with the found Abstractalbums
+//By calling CMPXCollectionCachedHelper API GetL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.wma
+//                           c:\\data\\sounds\\digital\\1.alb
+//1.wma and 1.alb are associated
+//precondition on HW      :  f:\\1.wma
+//                           f:\\1.alb
+//1.wma and 1.alb are associated
+//all AbstractAlbum on drive c: (e:) is returned, all songs associated with the returned AbstractAlbum are returned.
+TInt CCollectionHelperTestClass::GetAbstractAlbumAndSongsL(CStifItemParser& /*aItem*/)
+    {
+ 	FTRACE(FPrint(_L("CCollectionHelperTest::GetAlbumAndSongsL")));
+ 	TUint32 abstractalbumId(0);
+    RArray<TInt> contentIDs;
+    contentIDs.AppendL(KMPXMediaIdGeneral);
+
+    CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array());
+    CleanupStack::PushL(searchMedia);
+    contentIDs.Close();
+
+    searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem);
+    searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAbstractAlbum);
+    searchMedia->SetTextValueL(KMPXMediaGeneralDrive, KStoreRoot());
+
+    RArray<TMPXAttribute> abstractalbumAttributes;
+    CleanupClosePushL(abstractalbumAttributes);
+    abstractalbumAttributes.AppendL(KMPXMediaGeneralId);
+    abstractalbumAttributes.AppendL(KMPXMediaGeneralTitle);
+    abstractalbumAttributes.AppendL(KMPXMediaGeneralUri);
+
+   //foundMedia will hold all .alb on KStoreRoot()
+   CMPXMedia* foundMedia = NULL;
+   TRAPD( err, foundMedia = iCachedHelper->FindAllL(
+            *searchMedia, abstractalbumAttributes.Array()));
+
+   iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, foundMedia assigned from FindAllL"));
+
+   CleanupStack::PopAndDestroy(&abstractalbumAttributes);
+   CleanupStack::PopAndDestroy(searchMedia);
+   CleanupStack::PushL(foundMedia);  //+ foundMedia
+
+   if ( err != KErrNone )
+       {
+       iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, err = [%d]"), err );
+       iCachedHelper->Close();
+       iCachedHelper = NULL;
+       User::Leave( KErrGeneral );
+       }
+
+   if (!foundMedia->IsSupported(KMPXMediaArrayCount))
+       {
+       User::Leave(KErrNotSupported);
+       }
+
+   TInt foundItemCount = *foundMedia->Value<TInt>(KMPXMediaArrayCount);
+   iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, foundItemCount=%d"), foundItemCount );
+
+   CMPXMediaArray* foundArray =
+       foundMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
+   CleanupStack::PopAndDestroy(foundMedia);
+
+   for (TInt j = 0; j < foundItemCount; ++j)
+        {
+        CMPXMedia* abstractalbumMedia = CMPXMedia::NewL(*(*foundArray)[j]);
+        CleanupStack::PushL(abstractalbumMedia);
+
+        //to print out founded media attributes
+        if (abstractalbumMedia->IsSupported(KMPXMediaGeneralTitle))
+            {
+	        const TDesC& name = abstractalbumMedia->ValueText( KMPXMediaGeneralTitle );
+            iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, found abstractalbumName = [%s]"), name );
+	        }
+
+        if (abstractalbumMedia->IsSupported(KMPXMediaGeneralId))
+            {
+            abstractalbumId = abstractalbumMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
+            abstractalbumMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
+            }
+
+        // find the media object that contains a list of songs in the abstractalbum
+        RArray<TInt> contentIDs;
+        contentIDs.AppendL(KMPXMediaIdGeneral);
+
+        CMPXMedia* searchMediaSong = CMPXMedia::NewL(contentIDs.Array());
+        CleanupStack::PushL(searchMediaSong);
+        contentIDs.Close();
+
+        searchMediaSong->SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup);
+
+        searchMediaSong->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong);
+        searchMediaSong->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, abstractalbumId);
+
+        RArray<TMPXAttribute> songAttributes;
+        CleanupClosePushL(songAttributes);
+        songAttributes.AppendL(KMPXMediaGeneralId);
+        songAttributes.AppendL(KMPXMediaGeneralUri);
+
+        //search from MPX collection to get all songs associated with .alb
+        CMPXMedia* foundSongs = NULL;
+        TRAPD( err, foundSongs = iCachedHelper->FindAllL(
+            *searchMediaSong, songAttributes.Array()));
+
+        CleanupStack::PopAndDestroy(&songAttributes);
+        CleanupStack::PopAndDestroy(searchMediaSong);
+        CleanupStack::PopAndDestroy(abstractalbumMedia);
+
+        CleanupStack::PushL( foundSongs ); // + foundSongs
+        if ( err != KErrNone )
+            {
+            iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, err = [%d]"), err );
+            iCachedHelper->Close();
+            iCachedHelper = NULL;
+            User::Leave( KErrGeneral );
+            }
+
+        if (!foundSongs->IsSupported(KMPXMediaArrayCount))
+            {
+            User::Leave(KErrNotSupported);
+            }
+
+        // Number of references
+        TInt numOfSongsRefs = *foundSongs->Value<TInt>(KMPXMediaArrayCount);
+        iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, numOfSongsRefs=%d"), numOfSongsRefs );
+        CleanupStack::PopAndDestroy( foundSongs ); // - foundSong
+    }
+   return 1;
+ }
+
+
+//By calling CMPXCollectionCachedHelper API RenameL
+//precondition on emulator:  c:\\data\\sounds\\digital\\1.wma
+//                           c:\\data\\sounds\\digital\\1.alb
+//1.wma and 1.alb are associated
+//precondition on HW      :  f:\\1.wma
+//                           f:\\1.alb
+//output: 1.alb is renamed to 2.alb and all songs associated with 1.alb are updated in MUSIC table
+TInt CCollectionHelperTestClass::RenameAbstractAlbumL(CStifItemParser& /*aItem*/)
+   {
+	TRAPD( result, iCachedHelper->RenameL( KAbstractalbum1, KAbstractalbum2, EMPXAbstractAlbum ) );
+	iLog->Log(_L("CCollectionHelperTestClass::RenameAbstractAlbumL, done with result=[%d]"));
+	
+	return result;
+	}
+
+//Helper function for Finding in the MPX DB
+//By calling CMPXCollectionCachedHelper API FindAllL
+//output: all media with filename: aPath and aCategory is returned
+TInt CCollectionHelperTestClass::FindMediaL(const TDesC& aPath, TMPXGeneralCategory aCategory)
+{
+    FTRACE(FPrint(_L("CCollectionHelperTestClass::FindL")));
+	// Check does a record already exist for this aPath(URI)?
+	RArray<TInt> contentIDs;
+    contentIDs.AppendL( KMPXMediaIdGeneral );
+
+    CMPXMedia* searchMedia = CMPXMedia::NewL( contentIDs.Array() );
+    CleanupStack::PushL( searchMedia ); // + searchMedia
+    contentIDs.Close();
+    searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
+    searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory );
+    searchMedia->SetTextValueL( KMPXMediaGeneralUri, aPath );
+    
+//note: some of the attributes are not needed
+    RArray<TMPXAttribute> mediaAttributes;
+    CleanupClosePushL( mediaAttributes ); // + mediaAttributes
+    mediaAttributes.AppendL( KMPXMediaGeneralId );
+    mediaAttributes.AppendL( KMPXMediaGeneralTitle );
+    mediaAttributes.AppendL( KMPXMediaGeneralUri );
+
+    CMPXMedia* foundMedia = iCachedHelper->FindAllL( *searchMedia,
+        mediaAttributes.Array() );
+
+    CleanupStack::PopAndDestroy( &mediaAttributes ); // - mediaAttributes
+    CleanupStack::PopAndDestroy( searchMedia ); // - searchMedia
+    CleanupStack::PushL( foundMedia ); // + foundMedia
+
+    if ( !foundMedia->IsSupported( KMPXMediaArrayCount ) )
+        {
+        CleanupStack::PopAndDestroy( foundMedia ); // - foundMedia
+        return KErrNotSupported;
+        }
+    TInt foundItemCount = *foundMedia->Value<TInt>( KMPXMediaArrayCount );
+    CleanupStack::PopAndDestroy( foundMedia ); // - foundMedia
+    
+    iLog->Log(_L("CCollectionHelperTestClass::FindMediaL, foundItemCount=[%d]"), foundItemCount);
+    if ( foundItemCount >1) //more than 1 same item in collection
+        {
+	    iLog->Log(_L("CCollectionHelperTestClass::FindMediaL, error, find more than 1 same media in collection"));
+        return  KErrGeneral;
+	    }
+
+    else if ( foundItemCount ==0 || foundItemCount ==1 ) //no such item in collection
+        {
+        iLog->Log(_L("CCollectionHelperTestClass::FindMediaL, error, no this item in collection"));
+        return  foundItemCount;
+        }
+
+    return KErrNone;
+    }
+
+
+
+//Helper function for appending songs for SetAbstractAlbumL()
+void CCollectionHelperTestClass::AttachSongsL(CMPXMediaArray* aAbstractAlbumArray, const TDesC& aPath)
+{
+	FTRACE(FPrint(_L("CCollectionHelperTestClass::AttachSongsL")));
+    RArray<TInt> contentIDs;
+    contentIDs.AppendL(KMPXMediaIdGeneral);
+    contentIDs.AppendL(KMPXMediaIdAudio);
+    contentIDs.AppendL(KMPXMediaIdMusic);
+    contentIDs.AppendL(KMPXMediaIdMTP);
+    CMPXMedia* media = CMPXMedia::NewL(contentIDs.Array());
+    CleanupStack::PushL(media);
+    contentIDs.Close();
+
+    // MPXMedia default types
+    media->SetTObjectValueL<TMPXGeneralType>(KMPXMediaGeneralType, EMPXItem);
+    media->SetTObjectValueL<TMPXGeneralCategory>(KMPXMediaGeneralCategory, EMPXSong);
+    // File Path
+    TParsePtrC parse(aPath);
+    media->SetTextValueL(KMPXMediaGeneralUri, aPath);
+    media->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive());
+
+    // Add media into array contents
+    aAbstractAlbumArray->AppendL(media);
+    CleanupStack::Pop(media);
+}
+
 // -----------------------------------------------------------------------------
 // CCollectionHelperTestClass::CloseUiHelperL()
 // Returns: Symbian OS errors.
--- a/mmappfw_plat/collection_helper_api/tsrc/conf/CollectionHelperTestClass.cfg	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/collection_helper_api/tsrc/conf/CollectionHelperTestClass.cfg	Wed Mar 31 22:26:09 2010 +0300
@@ -66,4 +66,165 @@
 [Endtest]
 
 
+[Test]
+title 4. Add Song
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test AddSong
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
 
+[Test]
+title 5. Remove Song
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test RemoveSong
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+
+[Test]
+title 6. AddAbstractAlbum
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test AddAbstractAlbum
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+
+[Test]
+title 7. Remove AbstractAlbum
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test RemoveAbstractAlbum
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+RemoveAbstractAlbumL
+
+
+[Test]
+title 8. Associate Song with AbstractAlbum
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test SetAbstractAlbum
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+[Test]
+
+
+[Test]
+title 9. Set SongAlbumArtist
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test SetSongAlbumArtist
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+[Test]
+
+
+[Test]
+title 10. Get SongAlbumArtist
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test GetSongAlbumArtist
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+
+[Test]
+title 11. set AbstractAlbumArtist
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test SetAbstractAlbumArtist
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+[Test]
+
+[Test]
+title 12. Get AbstractAlbumArtist
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test GetAbstractAlbumArtist
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+[Test]
+
+
+[Test]
+title 13. Update AbstractAlbumName
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test UpdateAbstractAlbumName
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+
+
+title 14. Get AbstractAlbum and Songs
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test GetAbstractAlbumAndSongs
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+[Test]
+
+title 15. Rename AbstractAlbum
+create CollectionHelperTestClass test
+test OpenCollectionUtility
+waittestclass test
+test NewCachedHelper
+test RenameAbstractAlbum
+test CloseCachedHelper
+delete test
+pause 1000
+[Endtest]
+[Test]
+
+
+       
+       
+       
+       
+        
+       
+  
\ No newline at end of file
--- a/mmappfw_plat/collection_helper_api/tsrc/init/TestFramework.ini	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/collection_helper_api/tsrc/init/TestFramework.ini	Wed Mar 31 22:26:09 2010 +0300
@@ -1,5 +1,5 @@
 #
-# This is STIF initialization file
+# This is STIFTestFramework initialization file
 # Comment lines start with '#'-character.
 # See STIF TestFramework users guide.doc for instructions
 
@@ -29,15 +29,12 @@
 #
 # 	- File Creation Mode indicates test report overwriting if file exist.
 #		+ OVERWRITE, Overwrites if the Test report file exist.
-#		+ APPEND, Continue logging after the old Test report information if
+#		+ APPEND, Continue logging after the old Test report information if 
 #                 report exist.
 # 	- Sets a device reset module's dll name(Reboot).
 #		+ If Nokia specific reset module is not available or it is not correct one
 #		  StifHWResetStub module may use as a template for user specific reset
-#		  module.
-# 	- Sets STIF test measurement disable options. e.g. pluging1 and pluging2 disablation
-#		DisableMeasurement= stifmeasurementplugin01 stifmeasurementplugin02
-#
+#		  module. 
 
 [Engine_Defaults]
 
@@ -46,8 +43,9 @@
 
 CreateTestReport= YES			# Possible values: YES or NO
 
-TestReportFilePath= C:\LOGS\TestFramework\
-TestReportFileName= TestReport_CollectionHelperTestClass
+#TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFilePath= c:\testing\log\
+TestReportFileName= TestReport
 
 TestReportFormat= TXT			# Possible values: TXT or HTML
 TestReportOutput= FILE			# Possible values: FILE or RDEBUG
@@ -55,14 +53,6 @@
 
 DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting
 
-DisableMeasurement= stifmeasurementdisablenone	# Possible values are:
-						# 'stifmeasurementdisablenone', 'stifmeasurementdisableall'
-					  	# 'stifmeasurementplugin01', 'stifmeasurementplugin02',
-					  	# 'stifmeasurementplugin03', 'stifmeasurementplugin04',
-					  	# 'stifmeasurementplugin05' or 'stifbappeaprofiler'
-
-Timeout= 0                              # Default timeout value for each test case. In milliseconds
-UITestingSupport= YES
 [End_Defaults]
 # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 
@@ -88,29 +78,28 @@
 # In the simplest case it is enough to specify only the
 # name of the test module when adding new test module
 
-[New_Module]
-ModuleName= testscripter
-TestCaseFile= c:\testframework\CollectionHelperTestClass.cfg
-[End_Module]
+#[New_Module]
+#ModuleName= demomodule
+#[End_Module]
 
 
 # Load testmoduleXXX, optionally with initialization file and/or test case files
-#[New_Module]
-#ModuleName= testmodulexxx
+[New_Module]
+ModuleName= testscripter
 
 #TestModuleXXX used initialization file
 #IniFile= c:\testframework\init.txt
 
 #TestModuleXXX used configuration file(s)
-#TestCaseFile= c:\testframework\testcases1.cfg
-#TestCaseFile= c:\testframework\testcases2.cfg
-#TestCaseFile= c:\testframework\manualtestcases.cfg
-
-#[End_Module]
+#TestCaseFile= c:\testframework\epos_omasuplpostestercfg.cfg
+TestCaseFile= c:\testframework\CollectionHelperTestClass.cfg
+[End_Module]
 # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 
+
+
 # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-# Set STIF logging overwrite parameters for Logger.
+# Set STIFTestFramework logging overwrite parameters for Logger.
 # 	Hardware and emulator environment logging path and styles can
 # 	be configured from here to overwrite the Logger's implemented values.
 #	
@@ -155,41 +144,34 @@
 #		+ NO, No line break(s).
 #
 #	- Will event ranking include to the log file.
-#		+ YES, Event ranking number added to each line in log file(s). Ranking number
+#		+ YES, Event ranking number added to each line in log file(s). Ranking number 
 #                 depends on environment's tics, for example(includes time stamp also)
 #                 '012   12.Nov.2003 115958    LOGGING INFO'
 #		+ NO, No event ranking.
 #
-#	- Will write log file in unicode format.
-#		+ YES, Log file will be written in unicode format
-#		+ NO, Log will be written as normal, not unicode, file.
-#
 
 [Logger_Defaults]
 
-#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#'
-#NOTE: TestEngine and TestServer logging settings cannot change here
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#' 
 
-#CreateLogDirectories= YES    # Possible values: YES or NO
+#CreateLogDirectories= YES		# Possible values: YES or NO
 
 #EmulatorBasePath= C:\LOGS\TestFramework\
-#EmulatorFormat= HTML         # Possible values: TXT or HTML
-#EmulatorOutput= FILE         # Possible values: FILE or RDEBUG
+#EmulatorFormat= HTML			# Possible values: TXT or HTML
+#EmulatorOutput= FILE			# Possible values: FILE or RDEBUG
 
 #HardwareBasePath= D:\LOGS\TestFramework\
-#HardwareFormat= HTML         # Possible values: TXT or HTML
-#HardwareOutput= FILE         # Possible values: FILE or RDEBUG
+#HardwareFormat= HTML			# Possible values: TXT or HTML
+#HardwareOutput= FILE			# Possible values: FILE or RDEBUG
 
-#FileCreationMode= OVERWRITE  # Possible values: OVERWRITE or APPEND
+#FileCreationMode= OVERWRITE		# Possible values: OVERWRITE or APPEND
 
-#ThreadIdToLogFile= YES       # Possible values: YES or NO
-#WithTimeStamp= YES           # Possible values: YES or NO
-#WithLineBreak= YES           # Possible values: YES or NO
-#WithEventRanking= YES        # Possible values: YES or NO
+#ThreadIdToLogFile= YES			# Possible values: YES or NO
+#WithTimeStamp= YES			# Possible values: YES or NO
+#WithLineBreak= YES			# Possible values: YES or NO
+#WithEventRanking= YES			# Possible values: YES or NO
 
-#FileUnicode= YES             # Possible values: YES or NO
-#AddTestCaseTitle= YES        # Possible values: YES or NO
 [End_Logger_Defaults]
 # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 
-# End of file
+# End of file
\ No newline at end of file
--- a/mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h	Wed Mar 31 22:26:09 2010 +0300
@@ -168,6 +168,13 @@
                             const TDesC& aFile,
                             TDesC8& aValue);
     
+    /**
+     * Check if can send request to TNM or not.
+     * @since 5.0
+     * 
+     */                     
+    void CheckBeforeSendRequest();
+    
 private:
 
     /**
--- a/mmappfw_plat/mpx_albumart_utility_api/inc/mpxalbumartutility.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_albumart_utility_api/inc/mpxalbumartutility.h	Wed Mar 31 22:26:09 2010 +0300
@@ -21,7 +21,7 @@
 
 #include <e32def.h>
 #include <gdi.h>
-#include <metadatafield.hrh>
+#include <MetaDataField.hrh>
 
 class CMPXMedia;
 class CMPXImageUtil;
--- a/mmappfw_plat/mpx_common_api/inc/mpxmediageneraldefs.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_common_api/inc/mpxmediageneraldefs.h	Wed Mar 31 22:26:09 2010 +0300
@@ -451,7 +451,7 @@
     EMPXFile,
     EMPXImage,
     EMPXVideo,
-    EMPXRadio,
+    EMPXAbstractAlbum,
     EMPXMessage,
     EMPXTag,
     EMPXCommand,
--- a/mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h	Wed Mar 31 22:26:09 2010 +0300
@@ -34,6 +34,7 @@
 *  Attributes supported for KMPXMediaIdMTP
 */    
 const TMPXAttributeData KMPXMediaMTPDrmStatus = {KMPXMediaIdMTP, 0x0001}; // TUint16
+const TMPXAttributeData KMPXMediaMTPSampleDataFlag = {KMPXMediaIdMTP, 0x0002}; // TBool
 const TMPXAttributeData KMPXMediaMTPAll = {KMPXMediaIdMTP, 0xffffffff};
 
 #endif // MPXMEDIAMTPDEFS_H
--- a/mmappfw_plat/mpx_common_api/inc/mpxmediamusicdefs.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_common_api/inc/mpxmediamusicdefs.h	Wed Mar 31 22:26:09 2010 +0300
@@ -45,6 +45,7 @@
 const TMPXAttributeData KMPXMediaMusicAlbumArtThumbnail={KMPXMediaIdMusic,0x400}; // CFbsImage
 const TMPXAttributeData KMPXMediaMusicAlbumArtThumbnailSize={KMPXMediaIdMusic,0x800}; // TSint
 const TMPXAttributeData KMPXMediaMusicAlbumArtChanged={KMPXMediaIdMusic,0x1000}; // TInt
+const TMPXAttributeData KMPXMediaMusicAlbumArtist={KMPXMediaIdMusic,0x2000}; // Text
 const TMPXAttributeData KMPXMediaMusicAll={KMPXMediaIdMusic,0xffffffff}; // Text
 
 /** 
@@ -66,6 +67,7 @@
     EMPXMediaMusicOriginalAlbumArtFileName=0x200,    // Text
     EMPXMediaMusicAlbumArtThumbnail=0x400,
     EMPXMediaMusicAlbumArtThumbnailSize=0x800,
+    EMPXMediaMusicAlbumArtist=0x2000,
     EMPXMediaMusicAll=0xffffffff
     };
 
--- a/mmappfw_plat/mpx_playback_utility_api/tsrc/conf/mpxplaybackutilitytest.cfg	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/conf/mpxplaybackutilitytest.cfg	Wed Mar 31 22:26:09 2010 +0300
@@ -1,40 +1,253 @@
+
+[Define]
+KErrNotFound -1
+KErrNotSupported -5
+KErrArgument -6
+KErrNotReady -18
+KErrAccessDenied -21
+
+KTrue 1
+KFalse 0
+
+// UID definition for playback mode
+KPbModeDefault 271067440       // 0x10282930  Uses same player as any other player running in same.
+KPbModeActivePlayer 271067441  // 0x10282931  Currently active player or any player if no active player.
+KPbModeNewPlayer 271067442     // 0x10282932  New player
+KPbModeAppUID 111              // Application UID
+
+// Category for playback utility creation.
+KMPXCategoryUndefined  0
+KMPXCategoryMusic 1
+KMPXCategoryVideo 2
+
+// UID for Helix Plugin
+KVideoHelixPlaybackPluginUid 271066449   // 0x10282551
+
+// Timers
+KTimerEndTest 5000             // 5 sec
+
+[Enddefine]
+
 
 [Test]
+//
+//  Test NewL
+//  - Mode NewPlayer
+//  - Category Default(Music)
+//
 title 1  MMPXPlaybackUtilityNewL
-create mpxplaybackutilitytest foobar
-foobar MMPXPlaybackUtilityNewL
-delete foobar
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityNewL KPbModeNewPlayer
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test NewL
+//  - Mode ActivePlayer
+//  - Category Video
+//
+title 2  MMPXPlaybackUtilityNewL with category video
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityNewWithCatL KMPXCategoryVideo KPbModeActivePlayer
+pbutil EndTest
+delete pbutil
 [Endtest] 
 
 [Test]
-title 2  MMPXPlaybackUtilityUtilityL
-create mpxplaybackutilitytest foobar
-foobar MMPXPlaybackUtilityUtilityL
-delete foobar
+//
+//  Test UtilityL
+//  - Mode UID
+//  - Category Default(Music)
+//
+title 3  MMPXPlaybackUtilityUtilityL
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityL KPbModeAppUID
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test UtilityL
+//  - Mode Default
+//  - Category Video
+//
+title 4  MMPXPlaybackUtilityUtilityL with category video
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeDefault
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test InitL with Playlist
+//  - Mode NewPlayer
+//  - Category Default (Music)
+//
+title 5  MMPXPlaybackUtilityInitL(playlist)
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityL KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityInitWithPlaylistL
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test InitL with URI
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - InitL with URI, File Battle_160x100_30kbps.rm
+//
+title 6  MMPXPlaybackUtilityInitL(uri)
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInitWithUriL Battle_160x100_30kbps.rm
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
 [Endtest] 
 
 [Test]
-title 3  MMPXPlaybackUtilityInit64L
-create mpxplaybackutilitytest foobar
-foobar MMPXPlaybackUtilityNewL
-foobar MMPXPlaybackUtilityInit64L Battle_160x100_30kbps.rm
-delete foobar
+//
+//  Test InitL with URI
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - InitL with URI, File XVID_176x144_15fps_261Kbps.avi
+//
+title 7  MMPXPlaybackUtilityInitL(uri)
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInitWithUriL XVID_176x144_15fps_261Kbps.avi
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test InitL with RFile
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - InitL with RFile, File 20k_H263_WB_176x144_15fps.3gp
+//
+title 8  MMPXPlaybackUtilityInitL(rfile)
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInitWithRFileL 20k_H263_WB_176x144_15fps.3gp
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test InitStreamingL with URI
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - InitStreamingL with URI, File 30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4
+//
+title 9  MMPXPlaybackUtilityInitStreamingL(uri)
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInitStreamingWithUriL 30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
 [Endtest] 
 
 [Test]
-title 4  MMPXPlaybackUtilityInitStreaming64L
-create mpxplaybackutilitytest foobar
-foobar MMPXPlaybackUtilityNewL
-foobar MMPXPlaybackUtilityInitStreaming64L Battle_160x100_30kbps.rm
-delete foobar
+//
+//  Test InitStreamingL with RFile
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - InitStreamingL with RFile, File 80k_H264_AAC16M22_176x144_15fps.3gp
+//
+title 10  MMPXPlaybackUtilityInitStreamingL(rfile)
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInitStreamingWithRFileL 80k_H264_AAC16M22_176x144_15fps.3gp
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
+[Test]
+//
+//  Test Init64L
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - Init64L with RFile64, File DivX_MP3_256x112_30fps_300Kbps.avi
+//
+title 11  MMPXPlaybackUtilityInit64L
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInit64L DivX_MP3_256x112_30fps_300Kbps.avi
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
 [Endtest] 
 
 [Test]
-title 5  MMPXPlaybackUtilityFile64L
-create mpxplaybackutilitytest foobar
-foobar MMPXPlaybackUtilityNewL
-foobar MMPXPlaybackUtilityInit64L Battle_160x100_30kbps.rm
-foobar MMPXPlaybackUtilityFile64L
-delete foobar
+//
+//  Test InitStreaming64L
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - InitStreaming64L with RFile64, File honey_im_home_horror_ad.avi
+//
+title 12  MMPXPlaybackUtilityInitStreaming64L
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInitStreaming64L honey_im_home_horror_ad.avi
+pause KTimerEndTest
+pbutil EndTest
+delete pbutil
 [Endtest] 
 
+[Test]
+//
+//  Test File64L
+//  - UtilityL with Mode NewPlayer, Category Video
+//  - Add Observer
+//  - SelectPlayerL with HelixPlugin UID
+//  - Init64L with RFile64, File MPEG4_VBR_176x144_15fps.3gp
+//  - File64L to get RFile64 file handler
+//
+title 13  MMPXPlaybackUtilityFile64L
+create mpxplaybackutilitytest pbutil
+pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer
+pbutil MMPXPlaybackUtilityAddObserverL
+pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid
+pbutil MMPXPlaybackUtilityInit64L MPEG4_VBR_176x144_15fps.3gp
+pause KTimerEndTest
+pbutil MMPXPlaybackUtilityFile64L
+pbutil EndTest
+delete pbutil
+[Endtest] 
+
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/20k_H263_WB_176x144_15fps.3gp has changed
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4 has changed
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/80k_H264_AAC16M22_176x144_15fps.3gp has changed
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/DivX_MP3_256x112_30fps_300Kbps.avi has changed
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/MPEG4_VBR_176x144_15fps.3gp has changed
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/XVID_176x144_15fps_261Kbps.avi has changed
Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/honey_im_home_horror_ad.avi has changed
--- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.mmp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.mmp	Wed Mar 31 22:26:09 2010 +0300
@@ -54,6 +54,7 @@
 LIBRARY         stiftestengine.lib 
 LIBRARY         mpxplaybackutility.lib 
 LIBRARY         mpxcommon.lib
+LIBRARY         mpxcollectionutility.lib
 
 LANG            SC
 
--- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.pkg	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.pkg	Wed Mar 31 22:26:09 2010 +0300
@@ -21,7 +21,7 @@
 &EN
 
 ; Provide value for uid
-#{"STIF mpxplaybackutilitytest Application"},(0x10005942),1,1,0,TYPE=SA
+#{"MPX PlaybackUtility STIF"}, (0x101FB3E3), 1, 0, 1, TYPE=SA, RU
 
 ; Series60 product id for S60 3.0
 [0x101F7961], 0, 0, 0, {"Series60ProductID"}
@@ -32,35 +32,16 @@
 ; Unique Vendor name
 :"Nokia"
 
-; Logo
-; None
-
-; Package signature - Optional
-; None
-
-; Start of Package body
-
-; Condition blocks
-; None
-
-; Options list
-; None
+; Install files
+"\epoc32\release\armv5\udeb\mpxplaybackutilitytest.dll" - "!:\Sys\Bin\mpxplaybackutilitytest.dll"
+"..\..\init\TestFramework.ini" - "c:\testframework\TestFramework.ini" 
+"..\..\conf\mpxplaybackutilitytest.cfg" - "c:\testframework\mpxplaybackutilitytest.cfg"
 
-; Install files
-"..\..\data\mmc\Battle_160x100_30kbps.rm"   -   "e:\testing\data\Battle_160x100_30kbps.rm"
-
-"..\..\init\TestFramework.ini"   -   "c:\testframework\TestFramework.ini" 
-"..\..\conf\mpxplaybackutilitytest.cfg"   -   "c:\testframework\mpxplaybackutilitytest.cfg"
-
-"\epoc32\release\armv5\udeb\mpxplaybackutilitytest.dll"   -   "c:\Sys\Bin\mpxplaybackutilitytest.dll"
-  
-; Embedded SIS 
-; None
-
-; End of Package body
-
-; PKG dependencies
-; None
-
-; PKG capabilities
-; None
+"..\..\data\mmc\Battle_160x100_30kbps.rm"   -   "f:\testing\data\Battle_160x100_30kbps.rm"
+"..\..\data\mmc\20k_H263_WB_176x144_15fps.3gp"   -   "f:\testing\data\20k_H263_WB_176x144_15fps.3gp"
+"..\..\data\mmc\30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4"   -   "f:\testing\data\30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4"
+"..\..\data\mmc\80k_H264_AAC16M22_176x144_15fps.3gp"   -   "f:\testing\data\80k_H264_AAC16M22_176x144_15fps.3gp"
+"..\..\data\mmc\DivX_MP3_256x112_30fps_300Kbps.avi"   -   "f:\testing\data\DivX_MP3_256x112_30fps_300Kbps.avi"
+"..\..\data\mmc\honey_im_home_horror_ad.avi"   -   "f:\testing\data\honey_im_home_horror_ad.avi"
+"..\..\data\mmc\MPEG4_VBR_176x144_15fps.3gp"   -   "f:\testing\data\MPEG4_VBR_176x144_15fps.3gp"
+"..\..\data\mmc\XVID_176x144_15fps_261Kbps.avi"   -   "f:\testing\data\XVID_176x144_15fps_261Kbps.avi"
--- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytest.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytest.h	Wed Mar 31 22:26:09 2010 +0300
@@ -27,11 +27,8 @@
 #include <TestclassAssert.h>
 #include <mpxplaybackutility.h>
 #include <mpxplaybackobserver.h>
-// CONSTANTS
-//const ?type ?constant_var = ?constant;
 
 // MACROS
-//#define ?macro ?macro_def
 #define TEST_CLASS_VERSION_MAJOR 0
 #define TEST_CLASS_VERSION_MINOR 0
 #define TEST_CLASS_VERSION_BUILD 0
@@ -45,26 +42,29 @@
 // data file
 _LIT( KmpxplaybackutilityTestFilePath, "C:\\testing\\data\\" );
 #else
-_LIT( KmpxplaybackutilitytestLogPath, "\\logs\\testframework\\mpxplaybackutilitytest\\" ); 
+_LIT( KmpxplaybackutilitytestLogPath, "f:\\logs\\testframework\\mpxplaybackutilitytest\\" ); 
 // Log file
 _LIT( KmpxplaybackutilitytestLogFile, "mpxplaybackutilitytest.txt" ); 
 _LIT( KmpxplaybackutilitytestLogFileWithTitle, "mpxplaybackutilitytest_[%S].txt" );
 // data file
-_LIT( KmpxplaybackutilityTestFilePath, "e:\\testing\\data\\" );
+_LIT( KmpxplaybackutilityTestFilePath, "f:\\testing\\data\\" );
 #endif
+
 // FUNCTION PROTOTYPES
 //?type ?function_name(?arg_list);
 
 // FORWARD DECLARATIONS
 //class ?FORWARD_CLASSNAME;
-class Cmpxplaybackutilitytest;
 
-class MMPXPlaybackUtility;
-class MMPXPlaybackObserver;
 // DATA TYPES
-//enum ?declaration
-//typedef ?declaration
-//extern ?data_type;
+typedef struct
+{
+    TInt               iEvent;
+    TInt               iType;
+    TInt               iData;
+} TMpxPlaybackTestEvent;
+
+typedef CArrayPtrFlat<TMpxPlaybackTestEvent> CMpxPlaybackTestEventArray;
 
 // CLASS DECLARATION
 
@@ -76,82 +76,151 @@
 *  @since ?Series60_version
 */
 NONSHARABLE_CLASS(Cmpxplaybackutilitytest) : public CScriptBase,
-                                             public MMPXPlaybackObserver   
+                                             public MMPXPlaybackObserver,
+                                             public MMPXPlaybackCallback
                                             
     {
-    public:  // Constructors and destructor
+public:  // Constructors and destructor
 
-        /**
-        * Two-phased constructor.
-        */
-        static Cmpxplaybackutilitytest* NewL( CTestModuleIf& aTestModuleIf );
+    /**
+    * Two-phased constructor.
+    */
+    static Cmpxplaybackutilitytest* NewL( CTestModuleIf& aTestModuleIf );
 
-        /**
-        * Destructor.
-        */
-        virtual ~Cmpxplaybackutilitytest();
+    /**
+    * Destructor.
+    */
+    virtual ~Cmpxplaybackutilitytest();
 
-
-    public: // Functions from base classes
+public: // Functions from base classes
 
-        /**
-        * From CScriptBase Runs a script line.
-        * @since ?Series60_version
-        * @param aItem Script line containing method name and parameters
-        * @return Symbian OS error code
-        */
-        virtual TInt RunMethodL( CStifItemParser& aItem );
-      
-        // From base class MMPXPlaybackObserver
-        /**
-         * Handle playback message
-         *
-         * @since 3.1
-         * @param aMessage playback message
-         * @param aErr system error code.
-         */
-        void HandlePlaybackMessage(
-            CMPXMessage* aMessage, TInt aError );
-    private:
+    /**
+    * From CScriptBase Runs a script line.
+    * @since ?Series60_version
+    * @param aItem Script line containing method name and parameters
+    * @return Symbian OS error code
+    */
+    virtual TInt RunMethodL( CStifItemParser& aItem );
+  
+    // From base class MMPXPlaybackObserver
+    /**
+     * Handle playback message
+     *
+     * @since 3.1
+     * @param aMessage playback message
+     * @param aErr system error code.
+     */
+    void HandlePlaybackMessage( CMPXMessage* aMessage, TInt aError );
+    
+    /**
+    *  Handle playback property.
+    *
+    *  @since S60 3.2.3
+    *  @param aProperty the property
+    *  @param aValue the value of the property
+    *  @param aError error code
+    */
+    void HandlePropertyL(TMPXPlaybackProperty aProperty, TInt aValue, TInt aError);
 
-        /**
-        * C++ default constructor.
-        */
-        Cmpxplaybackutilitytest( CTestModuleIf& aTestModuleIf );
-        /**
-        * By default Symbian 2nd phase constructor is private.
-        */
-        void ConstructL();
-        // Prohibit copy constructor if not deriving from CBase.
-        // ?classname( const ?classname& );
-        // Prohibit assigment operator if not deriving from CBase.
-        // ?classname& operator=( const ?classname& );
-        /**
-        * Frees all resources allocated from test methods.
-        * @since ?Series60_version
-        */
-        void Delete();
-        /**
-        * Test methods are listed below. 
-        */
-        TInt MMPXPlaybackUtilityNewL(CStifItemParser& /*aItem*/);
-        TInt MMPXPlaybackUtilityUtilityL(CStifItemParser& /*aItem*/);
-        TInt MMPXPlaybackUtilityInit64L(CStifItemParser& /*aItem*/);
-        TInt MMPXPlaybackUtilityInitStreaming64L(CStifItemParser& /*aItem*/);
-        TInt MMPXPlaybackUtilityFile64L(CStifItemParser& /*aItem*/);
-       
-        /**
-         * Method used to log version of test class
-         */
-        void SendTestClassVersion();
-        //ADD NEW METHOD DEC HERE
-        //[TestMethods] - Do not remove 
-    private:    // Friend classes
-        //From  mpxplaybackutility.h
-    	MMPXPlaybackUtility* iMPXPlaybackUtility;
-        RFs iFs;
+    /**
+    *  Method is called continously until aComplete=ETrue, signifying that 
+    *  it is done and there will be no more callbacks.
+    *  Only new items are passed each time.
+    *
+    *  @since S60 3.2.3
+    *  @param aPlayer UID of the subplayer
+    *  @param aSubPlayers a list of sub players
+    *  @param aComplete ETrue no more sub players. EFalse more subplayer
+    *                   expected
+    *  @param aError error code
+    */
+    void HandleSubPlayerNamesL(TUid aPlayer, 
+                               const MDesCArray* aSubPlayers,
+                               TBool aComplete,
+                               TInt aError);
+    
+    /**
+    *  Call back of media request.
+    *
+    *  @since S60 3.2.3
+    *  @param aMedia media 
+    *  @param aError error code    
+    */
+    void HandleMediaL(const CMPXMedia& aProperties, TInt aError);
+    
+    /**
+     *  Handle completion of a asynchronous command.
+     *  Note: All clients should implement this callback.
+     *
+     *  @since S60 3.2.3
+     *  @param aCommandResult result of the command, NULL if error
+     *  @param aError error code    
+     */
+    void HandlePlaybackCommandComplete(CMPXCommand* aCommandResult, TInt aError);
+
+private: // functions
+    
+    /**
+    * C++ default constructor.
+    */
+    Cmpxplaybackutilitytest( CTestModuleIf& aTestModuleIf );
+    /**
+    * By default Symbian 2nd phase constructor is private.
+    */
+    void ConstructL();
+    // Prohibit copy constructor if not deriving from CBase.
+    // ?classname( const ?classname& );
+    // Prohibit assigment operator if not deriving from CBase.
+    // ?classname& operator=( const ?classname& );
+    /**
+    * Frees all resources allocated from test methods.
+    * @since ?Series60_version
+    */
+    void Delete();
+    
+    /*
+     * Create resources 
+     */
+    void CreateL();
+    
+    void AddExpectedEventL(TInt aEvent, TInt aType, TInt aData);
+    void RemoveExpectedEventL(TInt aEvent, TInt aType, TInt aData);
+    
+    /**
+    * Test methods are listed below. 
+    */
+    TInt MMPXPlaybackUtilityNewL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityNewWithCatL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityUtilityL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityUtilityWithCatL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInitWithPlaylistL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInitWithUriL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInitWithRFileL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInitStreamingWithUriL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInitStreamingWithRFileL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInit64L(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityInitStreaming64L(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityFile64L(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityAddObserverL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityRemoveObserverL(CStifItemParser& /*aItem*/);
+    TInt MMPXPlaybackUtilityPlayerManagerSelectPlayerL(CStifItemParser& /*aItem*/);
+    TInt EndTest(CStifItemParser& /*aItem*/);
+   
+    /**
+     * Method used to log version of test class
+     */
+    void SendTestClassVersion();
+    //ADD NEW METHOD DEC HERE
+    //[TestMethods] - Do not remove 
+
+private: // data
+    MMPXPlaybackUtility* iMPXPlaybackUtility;
+    CMpxPlaybackTestEventArray* iExpectedEventArray;
+    RFs iFs;
+    TInt iCallbackError;
+    RFile iFile;
 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
-        RFile64 iFile64;
+    RFile64 iFile64;
 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytestdefs.h	Wed Mar 31 22:26:09 2010 +0300
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2002 - 2007 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:  mpxplaybackutilitytestdefs header for STIF Test Framework TestScripter.
+*
+*/
+
+#ifndef MPXPLAYBACKUTILITYTESTDEFS_H
+#define MPXPLAYBACKUTILITYTESTDEFS_H
+
+const TInt KGeneralPlaybackMsgOffset = 0;
+const TInt KVideoPlaybackMsgOffset = 100;
+const TInt KStifPlaybackMsgOffset = 200;
+const TInt KMPXMessageStif = 0x20011397;
+
+
+#endif      // MPXPLAYBACKUTILITYTESTDEFS_H
+
+// End of File
--- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytest.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytest.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -131,10 +131,8 @@
                           EFalse );
     
     SendTestClassVersion();
-    
-   
-    iFs.Connect();
-    iFs.ShareProtected();
+
+    CreateL();
     }
 
 // -----------------------------------------------------------------------------
--- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytestBlocks.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytestBlocks.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -21,18 +21,105 @@
 #include <e32svr.h>
 #include <StifParser.h>
 #include <Stiftestinterface.h>
+#include <mpxvideoplaybackdefs.h>
+#include <mpxplaybackcommanddefs.h>
+#include <mpxcommandgeneraldefs.h>
+#include <mpxcommand.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxplaybackmessage.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxlog.h>
+#include <mpxcollectionplaylist.h>
 #include "mpxplaybackutilitytest.h"
+#include "mpxplaybackutilitytestdefs.h"
+
 // ============================ MEMBER FUNCTIONS ===============================
 // ---------------------------------------------------------------------------
 // From MMPXPlaybackObserver
 // Handle playback message.
 // ---------------------------------------------------------------------------
 //
-void Cmpxplaybackutilitytest::HandlePlaybackMessage( 
-    CMPXMessage* /*aMessage*/, TInt aError )
+void Cmpxplaybackutilitytest::HandlePlaybackMessage( CMPXMessage* aMessage, TInt aError )
     {
-    iLog->Log(_L("Cmpxharvestertest::HandlePlaybackMessage: %d"), aError);   
+    iLog->Log(_L("Cmpxharvestertest::HandlePlaybackMessage: Error %d"), aError);
+    if ( !aError )
+        {
+        TMPXMessageId id( *(aMessage->Value<TMPXMessageId>(KMPXMessageGeneralId)) );
+        TInt event( *aMessage->Value<TInt>( KMPXMessageGeneralEvent ) );
+        TInt type( *aMessage->Value<TInt>( KMPXMessageGeneralType ) );
+        TInt data( *aMessage->Value<TInt>( KMPXMessageGeneralData ) );
+
+        if ( KMPXMessageGeneral == id )
+            {
+            iLog->Log(_L("Cmpxplaybackutilitytest::HandlePlaybackMessage() General event = %d type = %d  value = %d"),
+                         event, type, data );
+            RemoveExpectedEventL( KGeneralPlaybackMsgOffset + event, type, data );
+            }
+        else if ( KMPXMediaIdVideoPlayback == id )
+            {
+            iLog->Log(_L("Cmpxplaybackutilitytest::HandlePlaybackMessage() Video event = %d type = %d  value = %d"),
+                         event, type, data );
+            RemoveExpectedEventL( KVideoPlaybackMsgOffset + event, type, data );
+            }
+        else if ( KMPXMessageStif )
+            {
+            iLog->Log(_L("Cmpxplaybackutilitytest::HandlePlaybackMessage() STIF event = %d type = %d  value = %d"),
+                         event, type, data );
+            RemoveExpectedEventL( KStifPlaybackMsgOffset + event, type, data );
+            }
+        }
+    else
+        {
+        if ( !iCallbackError )
+            {
+            iCallbackError = aError;
+            }
+        }
     }
+
+// ---------------------------------------------------------------------------
+//  Handle playback property.
+// ---------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::HandlePropertyL( TMPXPlaybackProperty aProperty, TInt aValue, TInt aError )
+    {
+    iLog->Log(_L("Cmpxharvestertest::HandlePropertyL: Property %d, Value %d, Error %d"), 
+            aProperty, aValue, aError);   
+    }
+
+// ---------------------------------------------------------------------------
+//  Method is called continously until aComplete=ETrue, signifying that 
+//  it is done and there will be no more callbacks.
+//  Only new items are passed each time.
+// ---------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::HandleSubPlayerNamesL( TUid aPlayer, 
+                                                     const MDesCArray* aSubPlayers,
+                                                     TBool aComplete,
+                                                     TInt aError )
+    {
+    iLog->Log(_L("Cmpxharvestertest::HandleSubPlayerNamesL: Complete %d, Error %d"), aComplete, aError);   
+    }
+
+// ---------------------------------------------------------------------------
+//  Call back of media request.
+// ---------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::HandleMediaL( const CMPXMedia& aProperties, TInt aError )
+    {
+    iLog->Log(_L("Cmpxharvestertest::HandleMediaL: Error %d"), aError);   
+    }
+
+// ---------------------------------------------------------------------------
+//  Handle completion of a asynchronous command.
+//  Note: All clients should implement this callback.
+// ---------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::HandlePlaybackCommandComplete( CMPXCommand* aCommandResult, TInt aError )
+    {
+    iLog->Log(_L("Cmpxharvestertest::HandlePlaybackCommandComplete: Error %d"), aError);   
+    }
+
 // -----------------------------------------------------------------------------
 // Cmpxplaybackutilitytest::Delete
 // Delete here all resources allocated and opened from test methods. 
@@ -45,7 +132,58 @@
 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     iFile64.Close();
 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+    iFile.Close();
     iFs.Close();
+    iExpectedEventArray->ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::CreateL
+// Create here all resources needed for test methods. 
+// Called from ConstructL(). 
+// -----------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::CreateL()
+    {
+    iFs.Connect();
+    iFs.ShareProtected();
+
+    iExpectedEventArray = new (ELeave) CArrayPtrFlat<TMpxPlaybackTestEvent>( 1 );
+    iCallbackError = KErrNone;
+    iMPXPlaybackUtility = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::AddExpectedEventL
+// -----------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::AddExpectedEventL( TInt aEvent, TInt aType, TInt aData )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::AddExpectedEventL() event = %d type = %d  value = %d"),
+                 aEvent, aType, aData );
+    
+    TMpxPlaybackTestEvent* event = new (ELeave) TMpxPlaybackTestEvent;
+    event->iEvent = aEvent;
+    event->iType = aType;
+    event->iData = aData;
+    iExpectedEventArray->AppendL( event );
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::RemoveExpectedEventL
+// -----------------------------------------------------------------------------
+//
+void Cmpxplaybackutilitytest::RemoveExpectedEventL( TInt aEvent, TInt aType, TInt aData )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::RemoveExpectedEventL() event = %d type = %d  value = %d"),
+                 aEvent, aType, aData );
+    
+    if ( (iExpectedEventArray->Count() > 0) &&
+         ((*iExpectedEventArray)[0]->iEvent == aEvent) )
+        {
+        iLog->Log(_L("Cmpxplaybackutilitytest::RemoveExpectedEventL() event = %d removed."), aEvent);
+        iExpectedEventArray->Delete( 0 );
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -53,32 +191,38 @@
 // Run specified method. Contains also table of test mothods and their names.
 // -----------------------------------------------------------------------------
 //
-TInt Cmpxplaybackutilitytest::RunMethodL( 
-    CStifItemParser& aItem ) 
+TInt Cmpxplaybackutilitytest::RunMethodL( CStifItemParser& aItem ) 
     {
-
     static TStifFunctionInfo const KFunctions[] =
         {  
         // Copy this line for every implemented function.
         // First string is the function name used in TestScripter script file.
         // Second is the actual implementation member function. 
-        		
+
+        //ADD NEW ENTRY HERE
+        // [test cases entries] - Do not remove
         ENTRY( "MMPXPlaybackUtilityNewL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL ),
+        ENTRY( "MMPXPlaybackUtilityNewWithCatL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL ),
         ENTRY( "MMPXPlaybackUtilityUtilityL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL ),
+        ENTRY( "MMPXPlaybackUtilityUtilityWithCatL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL ),
+        ENTRY( "MMPXPlaybackUtilityInitWithPlaylistL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL ),
+        ENTRY( "MMPXPlaybackUtilityInitWithUriL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL ),
+        ENTRY( "MMPXPlaybackUtilityInitWithRFileL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL ),
+        ENTRY( "MMPXPlaybackUtilityInitStreamingWithUriL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL ),
+        ENTRY( "MMPXPlaybackUtilityInitStreamingWithRFileL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL ),
         ENTRY( "MMPXPlaybackUtilityInit64L", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L ),
         ENTRY( "MMPXPlaybackUtilityInitStreaming64L", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L ),
         ENTRY( "MMPXPlaybackUtilityFile64L", Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L ),
-       
-        //ADD NEW ENTRY HERE
-        // [test cases entries] - Do not remove
-
+        ENTRY( "MMPXPlaybackUtilityAddObserverL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL ),
+        ENTRY( "MMPXPlaybackUtilityRemoveObserverL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL ),
+        ENTRY( "MMPXPlaybackUtilityPlayerManagerSelectPlayerL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL ),
+        ENTRY( "EndTest", Cmpxplaybackutilitytest::EndTest ),
         };
 
     const TInt count = sizeof( KFunctions ) / 
                         sizeof( TStifFunctionInfo );
    
     return RunInternalL( KFunctions, count, aItem );
-
     }
 
 // -----------------------------------------------------------------------------
@@ -87,49 +231,325 @@
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------
 //
-TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL(CStifItemParser& /*aItem*/)
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL( CStifItemParser& aItem )
 	{
+	iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL"));
 	TInt err = KErrNone;
-	
-	TRAP( err,iMPXPlaybackUtility = MMPXPlaybackUtility::NewL(KPbModeDefault,this ));
+    TInt mode;
+   
+    if ( aItem.GetNextInt(mode) != KErrNone )
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityNewL - Missing playback mode."));
+        err = KErrArgument;
+        return err;
+        }
+
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewL: mode %d"), mode);
+	TRAP( err,iMPXPlaybackUtility = MMPXPlaybackUtility::NewL(TUid::Uid(mode), this ));
     
 	if (err!= KErrNone)
 		{
-		iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewL: %d"), err);
+		iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewL: error %d"), err);
 		}
 	
 	return err;
 	}
 
 // -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL
+// NewL test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL( CStifItemParser& aItem )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL"));
+    TInt err = KErrNone;
+    TInt mode;
+    TInt category;
+    if ( aItem.GetNextInt(category) != KErrNone )
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityNewWithCatL - Missing category."));
+        err = KErrArgument;
+        return err;
+        }
+
+    if ( aItem.GetNextInt(mode) != KErrNone )
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityNewWithCatL - Missing playback mode."));
+        err = KErrArgument;
+        return err;
+        }
+
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewWithCatL: category %d"), category);
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewWithCatL: mode %d"), mode);
+    TRAP( err,iMPXPlaybackUtility = MMPXPlaybackUtility::NewL((TMPXCategory)category, TUid::Uid(mode), this ));
+    
+    if (err!= KErrNone)
+        {
+        iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewWithCatL: error %d"), err);
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
 // Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL
 // UtilityL test method function.
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------
 //
-TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL(CStifItemParser& /*aItem*/)
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL( CStifItemParser& aItem )
 	{
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL"));
 	TInt err = KErrNone;
+	TInt mode = 0;
 	
-	TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL());
+	aItem.GetNextInt(mode);
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityL: mode %d"), mode);
+	if ( mode )
+	    {
+	    TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL(TUid::Uid(mode)));
+	    }
+	else
+	    {
+        TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL());
+	    }
     
-	if (err!= KErrNone)
-		{
-		iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityL: %d"), err);
-		}
+	iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityL: error %d"), err);
 	
 	return err;
 	}
 
 // -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL
+// UtilityL test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL( CStifItemParser& aItem )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL"));
+    TInt err = KErrNone;
+    TInt category;
+    TInt mode = 0;
+    
+    if ( aItem.GetNextInt(category) != KErrNone )
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityNewWithCatL - Missing category."));
+        err = KErrArgument;
+        return err;
+        }
+
+    aItem.GetNextInt(mode);
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityWithCatL: category %d"), category);
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityWithCatL: mode %d"), mode);
+    if ( mode )
+        {
+        TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL((TMPXCategory)category, TUid::Uid(mode)));
+        }
+    else
+        {
+        TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL((TMPXCategory)category));
+        }
+    
+    iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityWithCatL: error %d"), err);
+    
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL
+// InitL(CMPXCollectionPlaylist) test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL( CStifItemParser& /*aItem*/ )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL"));
+    TInt err = KErrNone;
+    CMPXCollectionPlaylist* playlist = CMPXCollectionPlaylist::NewL();
+    CleanupStack::PushL(playlist);
+    TRAP(err,iMPXPlaybackUtility->InitL(*playlist));
+    CleanupStack::PopAndDestroy(playlist);
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL - error=%d"),err);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL
+// InitL(Uri) test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL( CStifItemParser& aItem )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL"));
+    TInt err = KErrNone;
+    TPtrC string;
+   
+    if( aItem.GetNextString( string ) == KErrNone )
+        {
+        TBuf<120> uri;
+        uri.Append(KmpxplaybackutilityTestFilePath);
+        uri.Append(string);
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL - uri = %S."), &uri);
+        TRAP(err,iMPXPlaybackUtility->InitL(uri));
+        
+        if ( !err )
+            {
+            TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged;
+            AddExpectedEventL(event, 0, 0);
+            event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete;
+            AddExpectedEventL(event, 0, 0);
+            }
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL - error=%d"),err);
+        }
+    else
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityInitWithUriL - Missing file name."));
+        err = KErrArgument;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL
+// Init64L test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL( CStifItemParser& aItem )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL"));
+    TInt err = KErrNone;
+    TPtrC string;
+   
+    if( aItem.GetNextString( string ) == KErrNone )
+        {
+        TBuf<120> KFrom;
+        KFrom.Append(KmpxplaybackutilityTestFilePath);
+        KFrom.Append(string);
+        if ( iFile.SubSessionHandle() )
+            {
+            iFile.Close();
+            }
+        err = iFile.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters);
+        if ( err == KErrNone )
+            {
+            iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL - Open passed."));
+            TRAP(err,iMPXPlaybackUtility->InitL(iFile));
+            
+            if ( !err )
+                {
+                TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged;
+                AddExpectedEventL(event, 0, 0);
+                event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete;
+                AddExpectedEventL(event, 0, 0);
+                }
+            }
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL - error=%d"),err);
+        }
+    else
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityInitWithRFileL - Missing file name."));
+        err = KErrArgument;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL
+// InitStreamingL(Uri) test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL( CStifItemParser& aItem )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL"));
+    TInt err = KErrNone;
+    TPtrC string;
+    TInt accessPoint = 1;
+   
+    if( aItem.GetNextString( string ) == KErrNone )
+        {
+        TBuf<120> uri;
+        uri.Append(KmpxplaybackutilityTestFilePath);
+        uri.Append(string);
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL - uri = %S."), &uri);
+        TRAP(err,iMPXPlaybackUtility->InitStreamingL(uri, NULL, accessPoint));
+        
+        if ( !err )
+            {
+            TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged;
+            AddExpectedEventL(event, 0, 0);
+            event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete;
+            AddExpectedEventL(event, 0, 0);
+            }
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL - error=%d"),err);
+        }
+    else
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityInitStreamingWithUriL - Missing file name."));
+        err = KErrArgument;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL
+// InitStreamingL(RFile) test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL( CStifItemParser& aItem )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL"));
+    TInt err = KErrNone;
+    TPtrC string;
+    TInt accessPoint = 1;
+    
+    if( aItem.GetNextString( string ) == KErrNone )
+        {
+        TBuf<120> KFrom;
+        KFrom.Append(KmpxplaybackutilityTestFilePath);
+        KFrom.Append(string);
+        if ( iFile.SubSessionHandle() )
+            {
+            iFile.Close();
+            }
+        err = iFile.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters);
+        if ( err == KErrNone )
+            {
+            iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL - Open passed."));
+            TRAP(err,iMPXPlaybackUtility->InitStreamingL(iFile, accessPoint));
+
+            if ( !err )
+                {
+                TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged;
+                AddExpectedEventL(event, 0, 0);
+                event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete;
+                AddExpectedEventL(event, 0, 0);
+                }
+            }
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL - error=%d"),err);
+        }
+    else
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityInitStreamingWithRFileL - Missing file name."));
+        err = KErrArgument;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
 // Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L
 // Init64L test method function.
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------
 //
-TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L(CStifItemParser& aItem)
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L( CStifItemParser& aItem )
     {
-    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L testing Init64L() begin"));
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L"));
     TInt err = KErrNone;
 #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     err = KErrNotSupported;
@@ -149,10 +569,18 @@
         err = iFile64.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters);
         if ( err == KErrNone )
             {
-            iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L testing Init64L() Open passed."));
+            iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L - Open passed."));
             TRAP(err,iMPXPlaybackUtility->Init64L(iFile64));
+            
+            if ( !err )
+                {
+                TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged;
+                AddExpectedEventL(event, 0, 0);
+                event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete;
+                AddExpectedEventL(event, 0, 0);
+                }
             }
-        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L testing Init64L() error=%d"),err);
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L - error=%d"),err);
         }
     else
         {
@@ -169,13 +597,13 @@
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------
 //
-TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L(CStifItemParser& aItem)
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L( CStifItemParser& aItem )
     {
-    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() begin"));
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L"));
     TInt err = KErrNone;
 #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     err = KErrNotSupported;
-    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() error=%d"),err);
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L - error=%d"),err);
 #else // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     TPtrC string;
     TInt accessPoint = 1;
@@ -192,10 +620,18 @@
         err = iFile64.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters);
         if ( err == KErrNone )
             {
-            iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() Open passed."));
+            iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L - Open passed."));
             TRAP(err,iMPXPlaybackUtility->InitStreaming64L(iFile64, accessPoint));
+
+            if ( !err )
+                {
+                TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged;
+                AddExpectedEventL(event, 0, 0);
+                event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete;
+                AddExpectedEventL(event, 0, 0);
+                }
             }
-        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() error=%d"),err);
+        iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L - error=%d"),err);
         }
     else
         {
@@ -212,22 +648,106 @@
 // (other items were commented in a header).
 // -----------------------------------------------------------------------------
 //
-TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L(CStifItemParser& /*aItem*/)
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L( CStifItemParser& /*aItem*/ )
     {
-    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L testing File64L() begin"));
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L"));
     TInt err = KErrNone;
 #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     err = KErrNotSupported;
-    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L testing File64L() error=%d"),err);
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L - error=%d"),err);
 #else // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
-    RFile64* file64Ptr;
+    RFile64* file64Ptr=NULL;
     TRAP(err, file64Ptr=iMPXPlaybackUtility->Source()->File64L());
     if ( !file64Ptr->SubSessionHandle() )
         {
         iLog->Log(_L("MMPXPlaybackUtilityFile64L - file64 = NULL."));
         }
-    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L testing File64L() error=%d"),err);
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L - error=%d"),err);
 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
     return err;
     }
 
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL
+// AddObserverL test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL( CStifItemParser& /*aItem*/ )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL"));
+    TInt err = KErrNone;
+    TRAP(err, iMPXPlaybackUtility->AddObserverL(*this));
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL - error=%d"),err);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL
+// RemoveObserverL test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL( CStifItemParser& /*aItem*/ )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL"));
+    TInt err = KErrNone;
+    TRAP(err, iMPXPlaybackUtility->RemoveObserverL(*this));
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL - error=%d"),err);
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL
+// RemoveObserverL test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL(CStifItemParser& aItem)
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL"));
+    TInt uidInt;
+    TInt err = KErrNone;
+    
+    // read in UID
+    if ( aItem.GetNextInt(uidInt) != KErrNone )
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - Missing UID."));
+        err = KErrArgument;
+        return err;
+        }
+
+    iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - UID = 0x%x."), uidInt);
+    if ( iMPXPlaybackUtility )
+        {
+        MMPXPlayerManager& manager = iMPXPlaybackUtility->PlayerManager();
+        TRAP( err, manager.SelectPlayerL( TUid::Uid(uidInt) ) );
+        iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - SelectPlayer err = %d."), err);
+        }
+    else
+        {
+        iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - MPX Playback Utility not created."));
+        err = KErrGeneral;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Cmpxplaybackutilitytest::EndTest
+// -----------------------------------------------------------------------------
+//
+TInt Cmpxplaybackutilitytest::EndTest( CStifItemParser& /*aItem*/ )
+    {
+    iLog->Log(_L("Cmpxplaybackutilitytest::EndTest"));
+    TInt err = iCallbackError;
+    
+    // check if event queue is empty
+    if ( !err && (iExpectedEventArray->Count() > 0 ) ) 
+        {
+        iLog->Log(_L("Cmpxplaybackutilitytest::EndTest error = KErrTimedOut"));
+        err = KErrTimedOut;
+        }
+    return err;
+    }
+
+// end of file
--- a/mmappfw_plat/mtp_keys_api/group/bld.inf	Mon Mar 15 12:42:31 2010 +0200
+++ b/mmappfw_plat/mtp_keys_api/group/bld.inf	Wed Mar 31 22:26:09 2010 +0300
@@ -23,4 +23,4 @@
 DEFAULT
 
 PRJ_EXPORTS
-../inc/MtpPrivatePSKeys.h     MW_LAYER_PLATFORM_EXPORT_PATH(MtpPrivatePSKeys.h)
+../inc/mtpprivatepskeys.h     MW_LAYER_PLATFORM_EXPORT_PATH(mtpprivatepskeys.h)
--- a/mpx/playbackframework/playbackengine/inc/mpxautoresumehandler.h	Mon Mar 15 12:42:31 2010 +0200
+++ b/mpx/playbackframework/playbackengine/inc/mpxautoresumehandler.h	Wed Mar 31 22:26:09 2010 +0300
@@ -136,6 +136,11 @@
     * in that case
     */
     TBool IsPlaybackRemote();
+    
+    /**
+    * Handle change in voice command state. 
+    */
+    void DoHandleVoiceCmdChange();
 
 private: // data
     CMPXPlaybackEngine&  iEngine;
@@ -148,6 +153,10 @@
 
     // Timer for resume operation. Owned.
     CPeriodic* iResumeTimer;
+    
+    CMPXPSKeyWatcher* iVoiceCmdObserver;  // owned
+    TBool iPausedForVoiceCmd;
+    TBool iVoiceCmdResumeOngoing;
     };
 
 #endif      // CMPXAUTORESUMEHANDLER_H   
--- a/mpx/playbackframework/playbackengine/src/mpxautoresumehandler.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mpx/playbackframework/playbackengine/src/mpxautoresumehandler.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -25,10 +25,23 @@
 
 // CONSTANTS
 const TInt KMPXErrDiedTimeout = 2000000;
-
 // Time to wait before resume after call has ended.
 const TInt KMPXResumeWaitTime = 3000000; // 3.0s
 
+// TODO: the following constants and definitions are copied from nssvascoreconstant.h, which is not
+// included directly because it is an App layer API. Way to fix this is to ask Speechsrv to move the header file to MW layer.
+const TUid KSINDUID = {KUidSystemCategoryValue};
+const TInt ERecognitionState=0;
+
+// Recognition state values for the P&S key ERecognitionState
+enum TRecognitionStateValues
+    {
+    ERecognitionStarted = 0, 
+    ERecognitionSpeechEnd, 
+    ERecognitionSuccess, 
+    ERecognitionFail
+    };
+// End TODO
 
 
 // ================= MEMBER FUNCTIONS =======================
@@ -60,6 +73,9 @@
     // Listen to call type changes
     iTypeObserver = CMPXPSKeyWatcher::NewL(KPSUidCtsyCallInformation,
                                            KCTsyCallType,this);
+    
+    iVoiceCmdObserver = CMPXPSKeyWatcher::NewL( KSINDUID, ERecognitionState, this );
+    
     iResumeTimer = CPeriodic::NewL(CActive::EPriorityStandard);
     }
 
@@ -88,6 +104,7 @@
 //
 CMPXAutoResumeHandler::~CMPXAutoResumeHandler()
     {
+    delete iVoiceCmdObserver;
     delete iStateObserver;
     delete iTypeObserver;
     if ( iResumeTimer )
@@ -135,13 +152,15 @@
     MPX_DEBUG2("CMPXAutoResumeHandler::HandlePlaybackComplete(%d) entering", aError);
     iPausedForCall = EFalse;
     if ( KErrDied == aError ||
-         KErrAccessDenied == aError )
+         KErrAccessDenied == aError || 
+         KErrInUse == aError )
         {
         iKErrDiedTime.HomeTime();
 
         TInt callType = EPSCTsyCallTypeNone;
         TInt callState = EPSCTsyCallStateNone;
-
+        TInt voiceCmdState(0);
+        
         if (!iTypeObserver->GetValue(callType) &&
             !iStateObserver->GetValue(callState))
             {
@@ -155,8 +174,16 @@
                 iPausedForCall = ETrue;
                 }
             }
+        
+        if ( !iPausedForCall && !iVoiceCmdObserver->GetValue( voiceCmdState ) ) // key exist if voice commanding is in progress
+            {
+            // Paused due voice command activity
+            iPausedForVoiceCmd = ETrue;
+            }
         }
-    MPX_DEBUG1("CMPXAutoResumeHandler::HandlePlaybackComplete() exiting");
+    
+    MPX_DEBUG3("CMPXAutoResumeHandler::HandlePlaybackComplete() exiting: iPausedForCall=%d, iPausedForVoiceCmd=%d",
+               iPausedForCall, iPausedForVoiceCmd);
     }
 
 // -----------------------------------------------------------------------------
@@ -175,10 +202,18 @@
 // CMPXAutoResumeHandler::HandlePSEvent
 // -----------------------------------------------------------------------------
 //
-void CMPXAutoResumeHandler::HandlePSEvent(TUid /*aUid*/, TInt /*aKey*/)
+void CMPXAutoResumeHandler::HandlePSEvent(TUid aUid, TInt /*aKey*/)
     {
     MPX_FUNC("CMPXAutoResumeHandler::HandlePSEvent()");
-    TRAP_IGNORE(DoHandleStateChangeL());
+    
+    if ( aUid == KSINDUID )
+        {
+        DoHandleVoiceCmdChange();
+        }
+    else
+        {
+        TRAP_IGNORE(DoHandleStateChangeL());
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -246,6 +281,19 @@
             iPausedForCall = ETrue;
             }
         }
+    
+    if ( shouldPause && iVoiceCmdResumeOngoing )
+        {
+        // Resume timer has been started after a voice command, cancel it now
+        // so that playback is not resumed while calling
+        if ( iResumeTimer->IsActive() )
+            {
+            iResumeTimer->Cancel();
+            }
+        iVoiceCmdResumeOngoing = EFalse;
+        iPausedForCall = ETrue; // resume playback once call has been ended
+        }
+    
     MPX_DEBUG2("CMPXAutoResumeHandler::DoHandleStateChangeL(): iPausedForCall = %d", iPausedForCall);
     }
 
@@ -317,6 +365,8 @@
     {
     MPX_FUNC("CMPXAutoResumeHandler::HandleResumeTimerCallback() entering");
 
+    iVoiceCmdResumeOngoing = EFalse;
+    
     CancelResumeTimer();
     TRAP_IGNORE( iEngine.HandleCommandL( EPbCmdPlayWithFadeIn ));
     }
@@ -374,4 +424,39 @@
     iAutoResume = aAutoResume;
     }
 
+// -----------------------------------------------------------------------------
+// CMPXAutoResumeHandler::DoHandleVoiceCmdChange
+// -----------------------------------------------------------------------------
+//
+void CMPXAutoResumeHandler::DoHandleVoiceCmdChange()
+    {
+    MPX_FUNC("CMPXAutoResumeHandler::DoHandleVoiceCmdChange()");
+    
+    TInt voiceCmdState( 0 );
+    TInt err( iVoiceCmdObserver->GetValue( voiceCmdState ) );
+    
+    MPX_DEBUG4("CMPXAutoResumeHandler::DoHandleVoiceCmdChange(): iPausedForVoiceCmd = %d, err=%d, state=%d", 
+                    iPausedForVoiceCmd, err, voiceCmdState);
+    
+    if ( iPausedForVoiceCmd && !iPausedForCall )
+        {
+        if ( err == KErrNotFound ) // voice command has been finished once the P&S key is deleted 
+            {
+            if ( iResumeTimer->IsActive() )
+                  iResumeTimer->Cancel();
+            
+            iResumeTimer->Start( KMPXResumeWaitTime, KMPXResumeWaitTime, TCallBack(ResumeTimerCallback, this) );
+            
+            iPausedForVoiceCmd = EFalse;
+            
+            iVoiceCmdResumeOngoing = ETrue; // flag for cancelling resume timer due to a call
+            }
+        }
+    
+    if ( iPausedForCall ) // ensure that not interfering with call handling in any circumstances
+        {
+        iPausedForVoiceCmd = EFalse;
+        }
+    }
+
 //  End of File
--- a/mpx/playbackframework/playbackengine/src/mpxplaybackengine.cpp	Mon Mar 15 12:42:31 2010 +0200
+++ b/mpx/playbackframework/playbackengine/src/mpxplaybackengine.cpp	Wed Mar 31 22:26:09 2010 +0300
@@ -984,7 +984,8 @@
                         TMPXPlaybackMessage(
                             TMPXPlaybackMessage::EStateChanged, iState, aError ));
                     if ( KErrDied == aError ||
-                         KErrAccessDenied == aError )
+                         KErrAccessDenied == aError ||
+                         KErrInUse == aError )
                         {
                         iPluginState = EPbStateNotInitialised;
                         // fixed 
--- a/package_definition.xml	Mon Mar 15 12:42:31 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<SystemDefinition schema="3.0.0">
-  <package id="mmappfw" name="Multimedia App Framework" levels="fw utils if">
-    <collection id="mmappcomponents" name="Multimedia App Components" level="utils">
-      <component id="collectionhelper" filter="s60" name="Media Player Collection Helper" introduced="^1">
-        <unit bldFile="mmappcomponents/collectionhelper/group"/>
-      </component>
-      <component id="playlistengine" filter="s60" name="Playlist Engine" introduced="^1">
-        <unit bldFile="mmappcomponents/playlistengine/group"/>
-      </component>
-      <component id="mpxharvester" filter="s60" name="Media Player Harvester" introduced="^1">
-        <unit bldFile="mmappcomponents/harvester/group"/>
-      </component>
-      <component id="mmappcommonui" filter="s60" name="Multimedia App Common UI" introduced="^1">
-        <unit bldFile="mmappcomponents/mmappcommonui/group"/>
-      </component>
-      <component id="mediaplayersettingsengine" filter="s60" name="Media Player Settings Engine" introduced="^1">
-        <unit bldFile="mmappcomponents/mediaplayersettingsengine/group"/>
-      </component>
-      <component id="audiofetcher" filter="s60" name="Audio Fetcher" class="plugin" introduced="^1">
-        <unit bldFile="mmappcomponents/audiofetcher/group"/>
-      </component>
-      <component id="asxparser" filter="s60" name="ASX Parser" introduced="^1">
-        <unit bldFile="mmappcomponents/asxparser/group"/>
-        <!-- does the test bld.inf need to be #included? -->
-        <!-- <unit bldFile="mmappcomponents/asxparser/test"/> -->
-      </component>
-    </collection>
-    <collection id="mpx" name="Multimedia Player" level="fw">
-      <component id="commonframework" filter="s60" name="MPX Common Framework" introduced="^1">
-        <unit bldFile="mpx/commonframework/group"/>
-      </component>
-      <component id="playbackframework" filter="s60" name="MPX Playback Framework" introduced="^1">
-        <unit bldFile="mpx/playbackframework/group"/>
-      </component>
-      <component id="mpxcollectionfw" filter="s60" name="MPX Collection Framework" introduced="^1">
-        <unit bldFile="mpx/collectionframework/group"/>
-      </component>
-      <component id="mpxviewfw" filter="s60" name="MPX View Framework" introduced="^1">
-        <unit bldFile="mpx/viewframework/group"/>
-      </component>
-      <component id="mpx_build" filter="s60" name="MPX Build" introduced="^1">
-      	<!--  can the exports from here be distribtued to the above bld.infs? -->
-        <unit bldFile="mpx/group"/>
-      </component>
-    </collection>
-    <collection id="mmappfw_info" name="Multimedia App Framework Info" level="if">
-      <component id="mmappfw_build" filter="s60" name="Multimedia App Framework Build" introduced="^1">
-      <!--  does the export from ehre really belong in one of the other components? -->
-        <unit bldFile="group"/>
-      </component>
-      <component id="mmappfw_test" filter="s60" name="Multimedia App Framework Test" purpose="development" introduced="^1">
-      	<!--  should this component exist? -->
-        <!-- <unit bldFile="tsrc/group"/> -->
-      </component>
-      <component id="mmappfw_plat" filter="s60" name="Multimedia App Framework Platform Interfaces" class="api" introduced="^1">
-      	<!-- there can only be a single unit, these should be #included from a main bld.inf -->
-        <unit bldFile="mmappfw_plat/group"/>
-        <unit bldFile="mmappfw_plat/asx_parser_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/collection_helper_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/harvester_collection_mediator_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/harvester_metadata_extractor_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/harvester_utility_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/media_player_settings_engine_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/mpx_albumart_utility_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/mpx_base_view_plugins_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/mpx_collection_utility_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/mpx_common_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/mpx_playback_utility_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/mpx_view_utility_api/tsrc/group"/>
-        <unit bldFile="mmappfw_plat/playlist_engine_api/tsrc/group"/>
-      </component>
-    </collection>
-  </package>
-</SystemDefinition>