Revision: 201017 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 11 May 2010 16:40:32 +0300
branchRCL_3
changeset 28 f56ec6ce2732
parent 23 4740b34b83ce
child 29 d3550a9452ab
child 30 6f9f6e99a23e
Revision: 201017 Kit: 201019
mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp
mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp
mmappcomponents/harvester/server/src/mpxharvesterserver.cpp
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h
mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl
mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderdescriptionutility.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderenumerator.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderenumerator.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csendobject.h
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp
mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp
mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp
mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp
mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp
mmappcomponents/playlistengine/group/bld.inf
mmappcomponents/playlistengine/inc/mpxplaylistrecognizer.h
mmappcomponents/playlistengine/src/mpxplaylistengine.cpp
mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h
mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h
mpx/collectionframework/collectionutility/src/mpxcollectionplaylist.cpp
mpx/commonframework/common/src/mpxpluginmonitor.cpp
--- a/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp	Tue May 11 16:40:32 2010 +0300
@@ -211,6 +211,7 @@
     TInt index = FindDatabaseIndex ( aDrive );
     if ( index == KErrNotFound )
         {
+        index = iDatabases.Count();
         db = CMPXHarvesterDB::NewL( aDrive, iFs );
         CleanupStack::PushL( db );
         iDatabases.AppendL( db );
@@ -407,8 +408,7 @@
 void CMPXHarvesterDatabaseManager::RecreateDatabases()
     {
     MPX_DEBUG1("CMPXHarvesterDatabaseManager::RecreateDatabases <--");
-    TInt count( iDatabases.Count() );
-    for( TInt i=0; i<count; )
+    for( TInt i=0; i < iDatabases.Count(); )
         {
         // Close db, delete and recreate
         //
--- a/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp	Tue May 11 16:40:32 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  Extracts metadata from a file
-*  Version     : %version: da1mmcf#38.1.4.2.6.1.10 % << Don't touch! Updated by Synergy at check-out.
+*  Version     : %version: da1mmcf#38.1.4.2.6.1.12 % << Don't touch! Updated by Synergy at check-out.
 *
 */
 
@@ -190,7 +190,7 @@
     while ( iArrayTasks.Count() )
         {
         // execute task at index 0
-        TRAPD( error, ExecuteTaskL() );
+        MPX_TRAPD( error, ExecuteTaskL() );
         if ( error || iCancelled )
             {
             // cleanup
@@ -264,12 +264,19 @@
     mimeType8->Des().Append( mimeType );
     
     // Continue to extract metadata even if fail.
-    TRAPD( metadataerror, iMetadataUtility->OpenFileL( iFile, *mimeType8 ) );
-    MPX_DEBUG2("CMPXMetadataExtractor::CreateMediaL, error %d parsing metadata", 
-        metadataerror );
+    MPX_TRAPD( metadataerror, iMetadataUtility->OpenFileL( iFile, *mimeType8 ) );
     CleanupStack::PopAndDestroy( mimeType8 );
     
+    // Get MetadataUtility Container
     const CMetaDataFieldContainer& metaCont = iMetadataUtility->MetaDataFieldsL();
+
+    // Get DRM data
+    // Need the protected flag from metadataUtility Container
+    MPX_TRAPD( drmerror, SetDrmMediaPropertiesL( metaCont ) );
+    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, result=%d getting drm data", 
+            drmerror );
+        
+    // Get metadata fields
     TInt count( metaCont.Count() );
     for( TInt i=0; i<count; ++i )
         {
@@ -281,7 +288,7 @@
         // get the value, except for album art
         if ( fieldType != EMetaDataJpeg )
            {
-           TRAPD( err, value = metaCont.At( i, fieldType ).AllocL() );
+            MPX_TRAPD( err, value = metaCont.At( i, fieldType ).AllocL() );
            if ( KErrNone != err )
                {
                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL - error = %i", err);           
@@ -400,7 +407,7 @@
             case EMetaDataDuration:     
                 {                  
                 const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
-                MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, mimeType = %S", &mimeType);   
+                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);   
                 
                 // Verify if WMA, get the duration
                 if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
@@ -450,68 +457,6 @@
     {
     MPX_FUNC("CMPXMetadataExtractor::SetExtMediaPropertiesL()");
 
-    // DB Flags to set
-    //
-    TUint dbFlags(KMPXMediaGeneralFlagsSetOrUnsetBit);
-
-    // File Path
-    //
-    TParsePtrC parse( iFileName );
-    iMedia->SetTextValueL( KMPXMediaGeneralUri, iFileName );
-    iMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
-
-    // DRM Rights
-    //
-    CMPXMedia* drm = NULL;
-    TRAPD( drmError, iDrmMediaUtility->InitL( iFileName );
-           drm = CMPXMedia::NewL( *iDrmMediaUtility->GetMediaL( KMPXMediaDrmProtected.iAttributeId |
-                                                                KMPXMediaDrmRightsStatus.iAttributeId ) );
-         );
-
-    TBool prot(EFalse);
-    if( drm )
-        {
-        CleanupStack::PushL( drm );
-        MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL -- is a drm file");
-        if( drm->IsSupported( KMPXMediaDrmProtected ) )
-            {
-            prot = drm->ValueTObjectL<TBool>( KMPXMediaDrmProtected );
-            MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL protected %i", prot);
-            }
-
-        TMPXMediaDrmRightsStatus status(EMPXDrmRightsFull);
-        if( drm->IsSupported( KMPXMediaDrmRightsStatus ) )
-            {
-            status = drm->ValueTObjectL<TMPXMediaDrmRightsStatus>(KMPXMediaDrmRightsStatus);
-            iMedia->SetTObjectValueL<TInt>(KMPXMediaDrmRightsStatus, status );
-            MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL -- status %i", status);
-            }
-
-        // Set DB flags
-        dbFlags |= KMPXMediaGeneralFlagsIsDrmProtected;
-        if( status != EMPXDrmRightsFull && status != EMPXDrmRightsRestricted && status != EMPXDrmRightsPreview )
-            {
-            dbFlags |= KMPXMediaGeneralFlagsIsDrmLicenceInvalid;
-            }
-        CleanupStack::PopAndDestroy( drm );
-        }
-
-    // Trapped PV DRM error. If -46, we know the file has no rights
-    //
-    if( drmError == KErrPermissionDenied )
-        {
-        dbFlags |= KMPXMediaGeneralFlagsIsDrmLicenceInvalid;
-        }
-    else
-        {
-        User::LeaveIfError( drmError );
-        }
-
-    iMedia->SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
-    iMedia->SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
-    
-    iDrmMediaUtility->Close();
-    
     //
     // File Size --- The following needs MMF support
     //
@@ -520,6 +465,8 @@
         {
         const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
         MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, mimeType = %S", &mimeType);   
+        iFile.Size( size );
+        iMedia->SetTObjectValueL<TInt>( KMPXMediaGeneralSize, size );
         
         // Verify if WMA, skip getting info from MMF
         if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
@@ -530,14 +477,11 @@
         else
             {
             MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, get MMF controller");   
-            iFile.Size( size );
-            iMedia->SetTObjectValueL<TInt>( KMPXMediaGeneralSize, size );
-
             // Duration, bitrate, samplerate, etc
             //
             if( !iMetadataOnly )
             {
-                TRAPD(err2, iFileInfoUtil->OpenFileL(
+                MPX_TRAPD(err2, iFileInfoUtil->OpenFileL(
                           iFile, 
                           iMedia->ValueText(KMPXMediaGeneralMimeType)));
                 MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, file info util error %i", err2);
@@ -558,14 +502,6 @@
                 }
             }
         }
-    else if( iFileOpenError == KErrNotFound || iFileOpenError == KErrPathNotFound )
-        {
-        dbFlags |= KMPXMediaGeneralFlagsIsInvalid;
-        }
-    // Finally set the db flag
-    //
-    iMedia->SetTObjectValueL( KMPXMediaGeneralFlags,
-                            dbFlags );
     }
 
 // ---------------------------------------------------------------------------
@@ -697,15 +633,37 @@
     TPtrC ext( parse.Ext() );
     if (ext.CompareF(KNonEmbeddedArtExt)== 0)
         {
-		#ifdef RD_MPX_TNM_INTEGRATION
+#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  );
-        TThumbnailRequestId tnId = iTNManager->CreateThumbnails( *source );
-        iArrayTNRequestId.Append( tnId );
-        CleanupStack::PopAndDestroy( source );
-        #endif // RD_MPX_TNM_INTEGRATION
+
+        CThumbnailObjectSource* source( NULL );
+        if (aMedia->IsSupported(KMPXMediaMTPSampleData))
+            {
+            TBuf<20> mimeType(KImageFileType);
+            TInt sampleData = aMedia->ValueTObjectL<TInt>(KMPXMediaMTPSampleData);
+            HBufC8* value8 = ((HBufC8*)sampleData)->Des().AllocLC();   // make a local copy of sampleData
+            source = CThumbnailObjectSource::NewLC(
+                value8, mimeType, path );    // give up ownership of value8
+            
+            MPX_DEBUG1("CMPXMetadataExtractor::ExtractAlbumArtL source created from buffer");
+            TThumbnailRequestId tnId = iTNManager->CreateThumbnails( *source );
+            iArrayTNRequestId.Append( tnId );
+            CleanupStack::PopAndDestroy( source );
+            CleanupStack::Pop( value8 );
+            }
+        else
+            {
+            source = CThumbnailObjectSource::NewLC(
+                path, KImageFileType  );
+            
+            MPX_DEBUG1("CMPXMetadataExtractor::ExtractAlbumArtL source created from path");
+            TThumbnailRequestId tnId = iTNManager->CreateThumbnails( *source );
+            iArrayTNRequestId.Append( tnId );
+            CleanupStack::PopAndDestroy( source );
+            }
+#endif // RD_MPX_TNM_INTEGRATION
         }
     else
         {
@@ -722,12 +680,12 @@
         MPX_DEBUG2("CMPXMetadataExtractor::ExtractAlbumArtL MimeType:%S ", &mimeType );
         HBufC8* mimeType8 = HBufC8::NewLC( mimeType.Length() );
         mimeType8->Des().Append( mimeType );
-        TRAP( err, iMetadataUtility->OpenFileL( path, wantedFields, *mimeType8 ) );
+        MPX_TRAP( err, iMetadataUtility->OpenFileL( path, wantedFields, *mimeType8 ) );
         CleanupStack::PopAndDestroy( mimeType8 );
         }
     else
         {
-        TRAP( err, iMetadataUtility->OpenFileL( path, wantedFields ) );
+        MPX_TRAP( err, iMetadataUtility->OpenFileL( path, wantedFields ) );
         }
     CleanupStack::PopAndDestroy( &wantedFields );
     
@@ -735,7 +693,7 @@
         {
         //check if can send TN request, If thumbnail creation is ongoing, wait til it is done
         CheckBeforeSendRequest();
-        TRAP( err, AddMediaAlbumArtL( *aMedia, path ));
+        MPX_TRAP( err, AddMediaAlbumArtL( *aMedia, path ));
         }
 
     // Reset the utility
@@ -763,7 +721,7 @@
         MPX_DEBUG1("CMPXMetadataExtractor::GetMediaAlbumArtL(): Album art exist.");
 #ifdef RD_MPX_TNM_INTEGRATION
         HBufC8* value8 = NULL; 
-        TRAPD( err, value8 = data8.AllocL() );
+        MPX_TRAPD( err, value8 = data8.AllocL() );
         if ( KErrNone != err )
             {
             MPX_DEBUG2("CMPXMetadataExtractor::GetMediaAlbumArtL - error jpeg = %i", err);
@@ -1019,11 +977,14 @@
     iArrayTasks.Reset();
     if ( iFileOpenError == KErrNone )
         {
+        // to avoid resources contention (i.e. accessing sql, file system, etc)
+        // Ordering the tasks - so no multiple tasks run at the same time
+        // put the longest running task at the last (i.e. thumbnailing)
         iArrayTasks.AppendL(ETaskCreateMedia);
-        iArrayTasks.AppendL(ETaskAddMetadata);
+        iArrayTasks.AppendL(ETaskAddExtMetadata);   // Get the MMF first
+        iArrayTasks.AppendL(ETaskAddMetadata);      // Get metadata & maybe drm data
         iArrayTasks.AppendL(ETaskCheckBeforeSend);
-        iArrayTasks.AppendL(ETaskAddAlbumArt);
-        iArrayTasks.AppendL(ETaskAddExtMetadata);
+        iArrayTasks.AppendL(ETaskAddAlbumArt);      // Get album art / thumbnail last
         }
     else
         {
@@ -1055,7 +1016,7 @@
     
     iTaskTimer->Cancel();
     // execute task at index 0
-    TRAPD( error, ExecuteTaskL() );
+    MPX_TRAPD( error, ExecuteTaskL() );
     if ( error || iCancelled )
         {
         // cleanup
@@ -1102,3 +1063,106 @@
     iFile.Close();
     }
 
+
+// ---------------------------------------------------------------------------
+// Sets DRRM media properties not returned by metadata utilities
+// ---------------------------------------------------------------------------
+//
+void CMPXMetadataExtractor::SetDrmMediaPropertiesL(const CMetaDataFieldContainer& aMetaCont)
+    {
+    MPX_FUNC("CMPXMetadataExtractor::SetDrmMediaPropertiesL()");
+
+    TBool prot(EFalse);
+    // DB Flags to set
+    TUint dbFlags(KMPXMediaGeneralFlagsSetOrUnsetBit);
+    // Validate the objects to be used
+    MPX_ASSERT(iMedia);
+    MPX_ASSERT(iDrmMediaUtility);
+    
+    // File Path
+    TParsePtrC parse( iFileName );
+    iMedia->SetTextValueL( KMPXMediaGeneralUri, iFileName );
+    iMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
+    MPX_DEBUG2("CMPXMetadataExtractor::SetDrmMediaPropertiesL - Filename=%S", &iFileName);
+
+    // get the protected flag from MetadataUtility Container
+    TPtrC ptr = aMetaCont.Field( EMetaDataProtected );  
+    MPX_DEBUG2("CMPXMetadataExtractor::SetDrmMediaPropertiesL -- status=%S", &ptr);
+    _LIT( KNonProtected, "0" );
+    if ( ptr.Compare( KNonProtected ) == 0 )
+        {
+        // this is non-protected file
+        // prot = EFalse
+        MPX_DEBUG1("CMPXMetadataExtractor::SetDrmMediaPropertiesL - non protected");
+        iMedia->SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
+        iMedia->SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
+        }
+    else  
+        {  // DRM file
+
+        // DRM Rights
+        //
+        CMPXMedia* drm = NULL;
+        MPX_TRAPD( drmError, iDrmMediaUtility->InitL( iFileName );
+        drm = CMPXMedia::NewL( *iDrmMediaUtility->GetMediaL( KMPXMediaDrmProtected.iAttributeId |
+                                                                KMPXMediaDrmRightsStatus.iAttributeId ) );
+             );
+
+        TBool prot(EFalse);
+        if( drm )
+            {
+            CleanupStack::PushL( drm );
+            MPX_DEBUG1("CMPXMetadataExtractor::SetDrmMediaPropertiesL -- is a drm file");
+            if( drm->IsSupported( KMPXMediaDrmProtected ) )
+                {
+                prot = drm->ValueTObjectL<TBool>( KMPXMediaDrmProtected );
+                MPX_DEBUG2("CMPXMetadataExtractor::SetDrmMediaPropertiesL protected %i", prot);
+                }
+
+            TMPXMediaDrmRightsStatus status(EMPXDrmRightsFull);
+            if( drm->IsSupported( KMPXMediaDrmRightsStatus ) )
+                {
+                status = drm->ValueTObjectL<TMPXMediaDrmRightsStatus>(KMPXMediaDrmRightsStatus);
+                iMedia->SetTObjectValueL<TInt>(KMPXMediaDrmRightsStatus, status );
+                MPX_DEBUG2("CMPXMetadataExtractor::SetDrmMediaPropertiesL -- status %i", status);
+                }
+
+            // Set DB flags
+            dbFlags |= KMPXMediaGeneralFlagsIsDrmProtected;
+            if( status != EMPXDrmRightsFull && status != EMPXDrmRightsRestricted && status != EMPXDrmRightsPreview )
+                {
+                dbFlags |= KMPXMediaGeneralFlagsIsDrmLicenceInvalid;
+                }
+            CleanupStack::PopAndDestroy( drm );
+            }
+
+        // Trapped PV DRM error. If -46, we know the file has no rights
+        //
+        if( drmError == KErrPermissionDenied )
+            {
+            dbFlags |= KMPXMediaGeneralFlagsIsDrmLicenceInvalid;
+            }
+        else
+            {
+            User::LeaveIfError( drmError );
+            }
+
+        iMedia->SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
+        iMedia->SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
+    
+        iDrmMediaUtility->Close();
+    
+        }  // DRM file
+
+    
+    // verify the file open status
+    if( iFileOpenError == KErrNotFound || iFileOpenError == KErrPathNotFound )
+        {
+        dbFlags |= KMPXMediaGeneralFlagsIsInvalid;
+        }
+    
+    // Finally set the db flag
+    //
+    iMedia->SetTObjectValueL( KMPXMediaGeneralFlags, dbFlags );
+   
+    }
--- a/mmappcomponents/harvester/server/src/mpxharvesterserver.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/harvester/server/src/mpxharvesterserver.cpp	Tue May 11 16:40:32 2010 +0300
@@ -119,7 +119,7 @@
     {
     iEngine = CMPXHarvesterEngine::NewL();
     StartL(KMPXHarvesterServerName);
-    RProcess().SetPriority(::EPriorityLow);
+    RProcess().SetPriority(::EPriorityBackground);
     }
     
 // ----------------------------------------------------------------------------
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h	Tue May 11 16:40:32 2010 +0300
@@ -165,9 +165,10 @@
 
     /**
     * Updated Music DB
+    * @param aStorageRoot, the root path of storage
     * @return void
     */
-    IMPORT_C void UpdateMusicCollectionL();
+    IMPORT_C void UpdateMusicCollectionL( const TDesC& aStorageRoot );
 
     /*
     * Called when the MTP session is initialised
@@ -229,7 +230,7 @@
     MMTPDataProviderFramework& iFramework;
     RFs& iFs;    // should not remove this member data!!!
 
-    TInt iOpenCount;	// introduce to fix CollectionHelper Flush problem
+    TInt iOpenCount;    // introduce to fix CollectionHelper Flush problem
 
     CDesCArray* iAbstractMediaArray;
 
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h	Tue May 11 16:40:32 2010 +0300
@@ -213,6 +213,7 @@
     TBuf<KStorageRootMaxLength> iStoreRoot;
 
     MMPXCollectionHelper* iCollectionHelper;
+    HBufC8* iSampleData;
 
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
     CMmMtpDpPerfLog* iPerfLog;
--- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl	Tue May 11 16:40:32 2010 +0300
@@ -72,7 +72,7 @@
     VA_START( list, aFmt );
 
     HBufC* buf = HBufC::New( KMtpLogBufferSize );
-    if ( buf )
+    if ( buf != NULL )
         {
         buf->Des().AppendFormatList( aFmt, list, &iOverflowHandler );
         Write( *buf );
--- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h	Tue May 11 16:40:32 2010 +0300
@@ -47,29 +47,29 @@
 _LIT( KTxtExtensionPLA, ".pla" );
 _LIT( KTxtExtensionVIR, ".vir" ); // virtual playlist from MPX
 
-_LIT(KFormatExtensionMP3, "0x3009:mp3");
-_LIT(KFormatExtensionWMA, "0xb901:wma");
-_LIT(KFormatExtensionMP4, "0xb982:mp4");
-_LIT(KFormatExtension3GP, "0xb984:3gp");
-_LIT(KFormatExtension3G2, "0xb984:3g2");
-_LIT(KFormatExtensionAAC, "0xb903:aac");
-_LIT(KFormatExtensionWAV, "0x3008:wav");
-_LIT(KFormatExtensionWMV, "0xb981:wmv");
-_LIT(KFormatExtensionASF, "0x300c:asf");
+_LIT(KFormatExtensionMP3, "0x3009:mp3::3");
+_LIT(KFormatExtensionWMA, "0xb901:wma::3");
+_LIT(KFormatExtensionMP4, "0xb982:mp4::3");
+_LIT(KFormatExtension3GP, "0xb984:3gp::3");
+_LIT(KFormatExtension3G2, "0xb984:3g2::3");
+_LIT(KFormatExtensionAAC, "0xb903:aac::3");
+_LIT(KFormatExtensionWAV, "0x3008:wav::3");
+_LIT(KFormatExtensionWMV, "0xb981:wmv::3");
+_LIT(KFormatExtensionASF, "0x300c:asf::3");
 
 //ODF container
-_LIT(KFormatExtensionODFAudio3GPP, "0xB984:ODF:audio/3gpp");
-_LIT(KFormatExtensionODFVideo3GPP, "0xB984:ODF:video/3gpp");
+_LIT(KFormatExtensionODFAudio3GPP, "0xB984:ODF:audio/3gpp:3");
+_LIT(KFormatExtensionODFVideo3GPP, "0xB984:ODF:video/3gpp:3");
 
-_LIT(KFormatExtensionM4A, "0xB982:m4a");
-_LIT(KFormatExtensionO4A, "0xB984:o4a");
-_LIT(KFormatExtensionO4V, "0xB984:o4v");
+_LIT(KFormatExtensionM4A, "0xB982:m4a::3");
+_LIT(KFormatExtensionO4A, "0xB984:o4a::3");
+_LIT(KFormatExtensionO4V, "0xB984:o4v::3");
 
 //Abstract Album
-_LIT(KFormatExtensionALB, "0xBA03:alb");
+_LIT(KFormatExtensionALB, "0xBA03:alb::3");
 
 //Playlists
-_LIT(KFormatExtensionM3U, "0xba11:m3u");
+_LIT(KFormatExtensionM3U, "0xba11:m3u::3");
 _LIT(KFormatExtensionPLA, "0xBA05:pla");
 _LIT(KFormatExtensionVIR, "0xBA05:vir"); //abstract audio & video playlist 0xBA05
 //--------------------------------------------------------------------------------------------
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h	Tue May 11 16:40:32 2010 +0300
@@ -20,7 +20,6 @@
 #define CABSTRACTMEDIAMTPDATAPROVIDERENUMERATOR_H
 
 #include <e32base.h>
-#include <d32dbms.h>
 
 #include "mmmtpenumerationcallback.h"
 #include "cmmmtpdpperflog.h"
@@ -29,8 +28,6 @@
 class MMTPDataProviderFramework;
 class MMTPObjectMgr;
 class CAbstractMediaMtpDataProvider;
-class CMTPObjectMetaData;
-class CMmMtpDpMetadataAccessWrapper;
 class CMPXMediaArray;
 
 /**
@@ -77,6 +74,7 @@
 
     enum TEnumState
     {
+        EEnumNone,
         EEnumPlaylist,
         EEnumAbstractAlbum,
         EEnumCount
@@ -128,12 +126,8 @@
     /** Provides Callback mechanism for completion of enumeration*/
     CAbstractMediaMtpDataProvider& iDataProvider;
 
-    TParse iPath;
-    TEntryArray iEntries;
-    TInt iFirstUnprocessed;
     RArray<TUint> iStorages;
     TUint32 iStorageId;
-    TUint32 iParentHandle;
 
     CMPXMediaArray* iAbstractMedias;
     TInt iCount;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp	Tue May 11 16:40:32 2010 +0300
@@ -25,13 +25,11 @@
 #include <mpxmediaarray.h>
 #include <mpxmedia.h>
 
-#include "abstractmediamtpdataproviderconst.h"
 #include "cabstractmediamtpdataproviderenumerator.h"
 #include "cabstractmediamtpdataprovider.h"
 #include "mmmtpdplogger.h"
 #include "mmmtpdputility.h"
 #include "cmmmtpdpmetadataaccesswrapper.h"
-#include "cmmmtpdpmetadatampxaccess.h"
 
 
 const TInt KMTPDriveGranularity = 5;
@@ -82,7 +80,7 @@
     iAbstractMedias( NULL ),
     iCount( 0 ),
     iCurrentIndex( 0 ),
-    iEnumState ( EEnumPlaylist )
+    iEnumState ( EEnumNone )
     {
     PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::CAbstractMediaMtpDataProviderEnumerator, iDataProviderId = %d" ), iDataProviderId );
     }
@@ -150,9 +148,9 @@
             }
         CleanupStack::PopAndDestroy( &storages );   // - storages
         }
-    else if ( aStorageId != KMTPNotSpecified32 )
+    else if ( aStorageId != KMTPNotSpecified32
+            && storageMgr.ValidStorageId( aStorageId ) )
         {
-        __ASSERT_DEBUG( storageMgr.ValidStorageId( aStorageId ), User::Invariant() );
         const CMTPStorageMetaData& storage(
              storageMgr.StorageL( aStorageId ) );
         if ( storage.Uint( CMTPStorageMetaData::EStorageSystemType ) ==
@@ -181,11 +179,7 @@
 
     // keep in mind for notification when enumeration complete
     iStorageId = aStorageId;
-    iEnumState = EEnumPlaylist;
-    if ( iStorages.Count() > 0 )
-        {
-        InitStorageL();
-        }
+    iEnumState = EEnumNone;
     ScanNextL();
 
     PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::StartL" ) );
@@ -269,42 +263,41 @@
 //
 void CAbstractMediaMtpDataProviderEnumerator::ScanNextL()
     {
-    while ( iStorages.Count() > 0 )
+    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::ScanNextL" ) );
+
+    if ( iCurrentIndex >= iCount )
         {
-        while ( iEnumState < EEnumCount )
+        iEnumState++;
+        }
+
+    if ( iEnumState >= EEnumCount )
+        {
+        iEnumState = EEnumPlaylist;
+        iStorages.Remove( 0 );
+        }
+
+    if ( iStorages.Count() > 0 )
+        {
+        if( iCurrentIndex >= iCount )
             {
-            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();
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, iStatus.Int() );
+        SetActive();
         }
-    // We are done
-    PRINT( _L( "MM MTP <> Objects enumeration completed" ) );
-    delete iAbstractMedias;
-    iAbstractMedias = NULL;
-    iStorages.Reset();
-    SignalCompleteL( iDataProvider );
+    else
+        {
+        // We are done
+        PRINT( _L( "MM MTP <> Objects enumeration completed" ) );
+        delete iAbstractMedias;
+        iAbstractMedias = NULL;
+        iStorages.Reset();
+        SignalCompleteL( iDataProvider );
+        }
+
+    PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::ScanNextL" ) );   
     }
 
 // -----------------------------------------------------------------------------
@@ -314,43 +307,56 @@
 //
 void CAbstractMediaMtpDataProviderEnumerator::RunL()
     {
-    // insert all abstract medias into handle db of framework
-    CMPXMedia* media = ( *iAbstractMedias )[iCurrentIndex];
-    
-    // Increase the index first in case of leave
-    iCurrentIndex++;
-    TMPXGeneralCategory category = ( iEnumState == EEnumPlaylist ) ? EMPXPlaylist : EMPXAbstractAlbum;
-    HBufC* abstractMedia = iDataProvider.GetWrapperL().GetAbstractMediaNameL( media, category );
-    CleanupStack::PushL( abstractMedia ); // + abstractMedia
-    TBool ret = ETrue;
-    if ( iEnumState == EEnumAbstractAlbum )
+    PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::RunL" ) );
+    if ( iCurrentIndex < iCount )
         {
-        //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 );
+        PRINT2( _L( "MM MTP <> Current storage is still being scanned, current index = %d, total AbstractMedia count = %d" ),
+            iCurrentIndex,
+            iCount );
+        // insert all abstract medias into handle db of framework
+        CMPXMedia* media = ( *iAbstractMedias )[iCurrentIndex];
+
+        // Increase the index first in case of leave
+        iCurrentIndex++;
+        TMPXGeneralCategory category = ( iEnumState == EEnumPlaylist ) ? EMPXPlaylist : EMPXAbstractAlbum;
+        HBufC* abstractMedia = iDataProvider.GetWrapperL().GetAbstractMediaNameL( media, category );
+        CleanupStack::PushL( abstractMedia ); // + abstractMedia
+
+        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 );
+            }
+        else // EEnumPlaylist
+            {
+            // Add an object to the object store for DB based playlist
+            AddEntryL( *abstractMedia );
+            }
+
+        if ( ret )
+            {
+            PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::RunL abstractMedia=%S" ), abstractMedia );
+
+            // 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
         }
 
-    if ( ret )
-        {
-        PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::RunL abstractMedia=%S" ), abstractMedia );
-        AddEntryL( *abstractMedia );
-
-        // 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();
+    PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::RunL" ) );
     }
 
 // -----------------------------------------------------------------------------
@@ -363,6 +369,7 @@
     if ( aError != KErrNone )
         PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::RunError with error %d" ), aError );
 
+    TRAP_IGNORE( SignalCompleteL( iDataProvider ) );
     return KErrNone;
     }
 
@@ -427,24 +434,34 @@
 
     if ( parentHandle != KMTPHandleNone )
         {
-        object->SetUint( CMTPObjectMetaData::EParentHandle, parentHandle );
-
-        PERFLOGSTART( KObjectManagerInsert );
-        iObjectMgr.InsertObjectL( *object );
-        PERFLOGSTOP( KObjectManagerInsert );
+        // Handle .m3u playlist like abstract playlist in two situations:
+        // 1. The .m3u file is not on the file system.
+        // 2. The .m3u file is hidden and 0 size
+        TBool add = ETrue;
+        if ( format == EMTPFormatCodeM3UPlaylist )
+            {
+            TEntry entry;
+            TInt err = iFramework.Fs().Entry( aSuid, entry );
+            add = ( err != KErrNone) || ( entry.iSize == 0 && entry.IsHidden() );
+            }
 
-        CleanupStack::PopAndDestroy( object );// - object
+        if ( add )
+            {
+            object->SetUint( CMTPObjectMetaData::EParentHandle, parentHandle );
 
-        //Only remember the playlist file for clean up
-        if( iEnumState == EEnumPlaylist )
-            {
+            PERFLOGSTART( KObjectManagerInsert );
+            iObjectMgr.InsertObjectL( *object );
+            PERFLOGSTOP( KObjectManagerInsert );
+
+            //Create the dummy file on file system
             iDataProvider.GetWrapperL().CreateDummyFile( aSuid );
-
             // remember the abstract media file for clean up
             iDataProvider.GetWrapperL().AddDummyFileL( aSuid );
             }
         }
 
+    CleanupStack::PopAndDestroy( object );// - object
+
     PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::AddEntryL" ) );
     }
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderdescriptionutility.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderdescriptionutility.h	Tue May 11 16:40:32 2010 +0300
@@ -51,6 +51,13 @@
     CMTPTypeObjectPropDesc* NewSpecificPropDescL( TUint aFormatCode, TUint16 aPropCode );
 
 private:
+
+    /**
+     * Append WM Audio specific to interdpendent property description.
+     * @return None
+     */
+    void AppendWMAudioInterdepentPropDescL(CMTPTypeInterdependentPropDesc* aInterdependentPropDesc);
+
     /**
      * Construct audio wave codec property description.
      * @param aFormatCode
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderenumerator.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataproviderenumerator.h	Tue May 11 16:40:32 2010 +0300
@@ -20,15 +20,11 @@
 #define CMEDIAMTPDATAPROVIDERENUMERATOR_H
 
 #include <e32base.h>
-#include <d32dbms.h>
-
 #include "mmmtpenumerationcallback.h"
 #include "cmmmtpdpperflog.h"
 
 // Forward declarations
 class MMTPDataProviderFramework;
-class MMTPObjectMgr;
-class CMTPObjectMetaData;
 class CMediaMtpDataProvider;
 
 /**
@@ -68,6 +64,9 @@
     */
     void DoCancel();
 
+    /**
+    * Update the mpx db flag for round trip
+    */
     void RunL();
 
     /**
@@ -92,85 +91,6 @@
     void SignalCompleteL( MMTPEnumerationCallback& aCallback,
         TInt aError = KErrNone );
 
-    void ScanStorageL( TUint32 aStorageId );
-
-    /**
-    * Scan next storage
-    */
-    void ScanNextStorageL();
-
-    /**
-    * Scans directory at aPath recursing into subdirectories on a depth
-    * first basis.
-    *
-    * Directory entries are kept in iDirStack - which is a LIFO stack.
-    * The current path, needed since TEntries don't keep track of it,
-    * is kept in iPath.
-    *
-    * The algorithm works as follows:
-    *
-    * 1. Read directory entries.
-    * 2. ProcessEntriesL is called if no error occurs and >= 1 entries are
-    *    read.
-    * 3. ProcessEntriesL adds entries to database, if entry is directory
-    *    add to iDirStack.
-    * 4. When all entries are processed pop entry off the dirstack,
-    *    if entry is empty TEntry remove one directory from iPath.
-    * 5. Append entry name onto iPath - to update path with new depth
-    *    (parent/subdir).
-    * 6. Push an empty TEntry onto iDirStack - this tells us we have
-    *    recursed one, think of it as pushing the '\' separator onto
-    *    iDirStack.
-    * 7. Repeat 1-7 until iDirStack is empty.
-    */
-    void ScanDirL();
-
-    /**
-    * Recurse into the next directory on the stack
-    * and scan it for entries.
-    */
-    void ScanNextDirL();
-
-    /**
-    * Scan next sub dir
-    */
-    void ScanNextSubdirL();
-
-    /**
-    * Iterates iEntries adding entries as needed to object manager and
-    *  iDirStack.
-    */
-    void ProcessEntriesL();
-
-    /**
-    * Add a file entry to the object store
-    * @param aFullFileName current scanned file path
-    */
-    void AddEntryL( const TDesC& aFullFileName );
-
-    /**
-    * Returns a TMTPFormatCode for the requested object
-    */
-    TMTPFormatCode GetObjectFormatCode( const TDesC& aFullFileName );
-
-    /**
-    * @param aFullFileName the object file name
-    * @return the file if needed to be enumeratored?
-    */
-    TBool IsFileAccepted( const TDesC& aFullFileName );
-
-    /**
-    * start count system tick
-    */
-    void StartEnumerationCount();
-
-    /**
-    * check if the system tick more than predefined value
-    * @retuan if more than the predefined value, return true
-    *         else return false
-    */
-    TBool IsOverThreshold();
-
     /**
     * Get modified content and report to Symbian MTP Framework
     */
@@ -181,27 +101,9 @@
     /** MMTPDataProviderFramework used to access MTP components*/
     MMTPDataProviderFramework& iFramework;
 
-    /** MTP Object Manager */
-    MMTPObjectMgr& iObjectMgr;
-
-    /** MTP Data Provider ID */
-    TUint iDataProviderId;
-
     CMediaMtpDataProvider& iDataProvider;
-    TParse iPath;
-    RDir iDir;
-    TEntryArray iEntries;
-    TInt iFirstUnprocessed;
-    RPointerArray<TEntry> iDirStack;
     RArray<TUint> iStorages;
     TUint32 iStorageId;
-    TUint32 iParentHandle;
-    TMTPFormatCode iFormatCode;
-    TBool iScanningDir;
-
-    // record the system tick
-    TUint iTickCountBegin;
-    TInt iTickPeriod;
 
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
     CMmMtpDpPerfLog* iPerfLog;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h	Tue May 11 16:40:32 2010 +0300
@@ -46,10 +46,11 @@
 // WAVECodec value
 enum TMmMtpWAVECodecValue
     {
-    EMTPAudioWAVECodecMP3 = 0x00000055,
-    EMTPAudioWAVECodecWMA = 0x00000161,
-    EMTPAudioWAVECodecAAC = 0x0000A106,
-    EMTPAudioWAVECodecPCM = 0x00000001
+    EMTPAudioWAVECodecMP3       = 0x00000055,
+    EMTPAudioWAVECodecWMA       = 0x00000161,
+    EMTPAudioWAVECodecWMAPro    = 0x00000162,
+    EMTPAudioWAVECodecAAC       = 0x0000A106,
+    EMTPAudioWAVECodecPCM       = 0x00000001
     };
 
 // Bitrate value scope
@@ -58,7 +59,9 @@
     EMTPMP3MinBitrate = 0x00001F40,         //8 kbps
     EMTPMP3MaxBitrate = 0x0004E200,         //320 kbps
     EMTPWMAMinBitrate = 0x00001388,         //5 kbps
-    EMTPWMAMaxBitrate = 0x0004E200,         //320 kbps
+    EMTPWMAMaxBitrate = 0x0005DC00,         //384 kbps
+    EMTPWMAProMinBitrate = 0x00001388,      //5 kbps
+    EMTPWMAProMaxBitrate = 0x000BB800,      //768 kbps
     EMTPAACMinBitrate = 0x00001F40,         //8 kbps
     EMTPAACMaxBitrate = 0x0004E200,         //320 kbps
     EMTPPCMMinBitrate = 0x00003E80,         //16 kbps
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp	Tue May 11 16:40:32 2010 +0300
@@ -84,28 +84,125 @@
         }
 
     CMTPTypeInterdependentPropDesc* interdependentPropDesc = CMTPTypeInterdependentPropDesc::NewL();
+    CleanupStack::PushL( interdependentPropDesc );  // + interdependentPropDesc
 
     if ( audioWaveCodecSupported && audioBitRateSupported )
         {
-        CMTPTypeInterdependentProperties* properties = CMTPTypeInterdependentProperties::NewL();
-        properties->AppendL( NewAudioWaveCodecPropDescL( aFormatCode ) );
-        properties->AppendL( NewAudioBitratePropDescL( aFormatCode ) );
-        interdependentPropDesc->AppendL( properties );
+        if ( ( aFormatCode == EMTPFormatCodeWMA )
+            || ( aFormatCode == EMTPFormatCodeWMV )
+            || ( aFormatCode == EMTPFormatCodeASF ) )
+            {
+            AppendWMAudioInterdepentPropDescL( interdependentPropDesc );
+            }
+        else
+            {
+            CMTPTypeInterdependentProperties* properties = CMTPTypeInterdependentProperties::NewL();
+            CleanupStack::PushL( properties );
+
+            CMTPTypeObjectPropDesc* propertyDesc1 = NewAudioWaveCodecPropDescL( aFormatCode );
+            CleanupStack::PushL( propertyDesc1 );   // + propertyDesc1
+            properties->AppendL( propertyDesc1 );
+            CleanupStack::Pop( propertyDesc1 ); // - propertyDesc1
+
+            CMTPTypeObjectPropDesc* propertyDesc2 = NewAudioBitratePropDescL( aFormatCode );
+            CleanupStack::PushL( propertyDesc2 );   // + propertyDesc2
+            properties->AppendL( propertyDesc2 );
+            CleanupStack::Pop( propertyDesc2 ); // - propertyDesc2
+
+            interdependentPropDesc->AppendL( properties );
+            CleanupStack::Pop( properties );
+            }
         }
 
     if ( videoFourCcCodecSupported && videoBitRateSupported )
         {
         CMTPTypeInterdependentProperties* properties = CMTPTypeInterdependentProperties::NewL();
-        properties->AppendL( NewVideoFourCCCodecPropDescL( aFormatCode ) );
-        properties->AppendL( NewVideoBitratePropDescL( aFormatCode ) );
+        CleanupStack::PushL( properties );  // + properties
+
+        CMTPTypeObjectPropDesc* propertyDesc1 = NewVideoFourCCCodecPropDescL( aFormatCode );
+        CleanupStack::PushL( propertyDesc1 );   // + propertyDesc1
+        properties->AppendL( propertyDesc1 );
+        CleanupStack::Pop( propertyDesc1 ); // - propertyDesc1
+
+        CMTPTypeObjectPropDesc* propertyDesc2 = NewVideoBitratePropDescL( aFormatCode );
+        CleanupStack::PushL( propertyDesc2 );   // + propertyDesc2
+        properties->AppendL( propertyDesc2 );
+        CleanupStack::Pop( propertyDesc2 ); // - propertyDesc2
+
         interdependentPropDesc->AppendL( properties );
+        CleanupStack::Pop( properties );    // - properties
         }
 
     PRINT( _L( "MM MTP <= CMediaMtpDataProviderDescriptionUtility::NewInterdepentPropDescL" ) );
+    CleanupStack::Pop( interdependentPropDesc );  // - interdependentPropDesc
     return interdependentPropDesc;
     }
 
 // -----------------------------------------------------------------------------
+// CMediaMtpDataProviderDescriptionUtility::NewWMAudioInterdepentPropDescL
+// Append WM Audio specific to interdpendent property description.
+// -----------------------------------------------------------------------------
+//
+void CMediaMtpDataProviderDescriptionUtility::AppendWMAudioInterdepentPropDescL(CMTPTypeInterdependentPropDesc* aInterdependentPropDesc)
+    {
+    PRINT( _L( "MM MTP => CMediaMtpDataProviderDescriptionUtility::AppendWMAudioInterdepentPropDescL" ) );
+
+    CMTPTypeInterdependentProperties* properties1 = CMTPTypeInterdependentProperties::NewL();
+    CleanupStack::PushL( properties1 ); // + properties1
+
+    CMTPTypeObjectPropDescEnumerationForm* form = CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT32 );
+    CleanupStack::PushL( form ); // + form
+    form->AppendSupportedValueL( TMTPTypeUint32( EMTPAudioWAVECodecWMA ) );
+
+    CMTPTypeObjectPropDesc* propertyDesc1 = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeAudioWAVECodec, *form );
+
+    CleanupStack::PopAndDestroy( form ); // - form
+    CleanupStack::PushL( propertyDesc1 ); // + propertyDesc1
+    properties1->AppendL( propertyDesc1 );
+    CleanupStack::Pop( propertyDesc1 ); // - propertyDesc1
+
+    CMTPTypeObjectPropDesc* propertyDesc2 = NewRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                                                        EMTPWMAMinBitrate,
+                                                        EMTPWMAMaxBitrate,
+                                                        EMTPAudioBitrateStep );
+
+    CleanupStack::PushL( propertyDesc2 ); // + propertyDesc2
+    properties1->AppendL( propertyDesc2 );
+    CleanupStack::Pop( propertyDesc2 ); // - propertyDesc2
+
+    aInterdependentPropDesc->AppendL( properties1 );
+    CleanupStack::Pop( properties1 ); // - properties1
+
+    CMTPTypeInterdependentProperties* properties2 = CMTPTypeInterdependentProperties::NewL();
+    CleanupStack::PushL( properties2 ); // + properties2
+
+    form = CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT32 );
+    CleanupStack::PushL( form ); // + form
+    form->AppendSupportedValueL( TMTPTypeUint32( EMTPAudioWAVECodecWMAPro ) );
+
+    CMTPTypeObjectPropDesc* propertyDesc3 = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeAudioWAVECodec, *form );
+
+    CleanupStack::PopAndDestroy( form ); // - form
+    CleanupStack::PushL( propertyDesc3 ); // + propertyDesc3
+    properties2->AppendL( propertyDesc3 );
+    CleanupStack::Pop( propertyDesc3 ); // - propertyDesc3
+
+    CMTPTypeObjectPropDesc* propertyDesc4 = NewRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
+                                                        EMTPWMAProMinBitrate,
+                                                        EMTPWMAProMaxBitrate,
+                                                        EMTPAudioBitrateStep );
+
+    CleanupStack::PushL( propertyDesc4 ); // + propertyDesc4
+    properties2->AppendL( propertyDesc4 );
+    CleanupStack::Pop( propertyDesc4 ); // - propertyDesc4
+
+    aInterdependentPropDesc->AppendL( properties2 );
+    CleanupStack::Pop( properties2 ); // - properties2
+
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderDescriptionUtility::AppendWMAudioInterdepentPropDescL" ) );
+    }
+
+// -----------------------------------------------------------------------------
 // CMediaMtpDataProviderDescriptionUtility::NewSpecificPropDescL
 // Construct media dp specific property description.
 // -----------------------------------------------------------------------------
@@ -236,6 +333,7 @@
         case EMTPFormatCodeWMV:
         case EMTPFormatCodeASF:
             form->AppendSupportedValueL( TMTPTypeUint32( EMTPAudioWAVECodecWMA ) );
+            form->AppendSupportedValueL( TMTPTypeUint32( EMTPAudioWAVECodecWMAPro ) );
             break;
 
         case EMTPFormatCodeMP3:
@@ -281,7 +379,7 @@
         case EMTPFormatCodeASF:
             propertyDesc = NewRangeFormDescriptionL( EMTPObjectPropCodeAudioBitRate,
                 EMTPWMAMinBitrate,
-                EMTPWMAMaxBitrate,
+                EMTPWMAProMaxBitrate,
                 EMTPAudioBitrateStep );
             break;
 
@@ -383,7 +481,7 @@
             ETrue );
         }
 
-    PRINT( _L( "MM MTP <= MmMtpDpDescriptionUtiliNewviceVideoBitratePropDescL" ) );
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderDescriptionUtility::NewVideoBitratePropDescL" ) );
 
     return propertyDesc;
     }
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderenumerator.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderenumerator.cpp	Tue May 11 16:40:32 2010 +0300
@@ -20,27 +20,12 @@
 #include <mtp/mmtpobjectmgr.h>
 #include <mtp/mmtpstoragemgr.h>
 #include <mtp/cmtpobjectmetadata.h>
-#include <hal.h>
 
-#include "mediamtpdataproviderconst.h"
 #include "cmediamtpdataproviderenumerator.h"
 #include "cmediamtpdataprovider.h"
 #include "mmmtpdplogger.h"
-#include "mmmtpdputility.h"
-#include "cmmmtpdpaccesssingleton.h"
 #include "cmmmtpdpmetadataaccesswrapper.h"
 
-
-#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
-_LIT( KDirectoryScan, "DirectoryScan" );
-_LIT( KFormatFilter, "FormatFilter" );
-_LIT( KObjectManagerObjectUid, "ObjectManagerObjectUid" );
-_LIT( KObjectManagerInsert, "ObjectManagerInsert" );
-#endif
-
-// Unit: microsecond
-const TInt KThresholdOfEnumerationLoopDuration = 1000 * 1000; // microsecond
-
 const TInt KMTPDriveGranularity = 5;
 const TInt KMediaDpArrayGranularity = 2;
 
@@ -73,14 +58,10 @@
     CMediaMtpDataProvider& aDataProvider ) :
         CActive( EPriorityLow ), // EPriorityStandard ? sure?
         iFramework( aFramework ),
-        iObjectMgr( aFramework.ObjectMgr() ),
-        iDataProviderId( aFramework.DataProviderId() ),
         iDataProvider( aDataProvider ),
-        iDirStack( KMediaDpArrayGranularity ),
-        iStorages( KMediaDpArrayGranularity ),
-        iScanningDir( EFalse )
+        iStorages( KMediaDpArrayGranularity )
     {
-    PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::CMediaMtpDataProviderEnumerator, iDataProviderId = %d" ), iDataProviderId );
+    PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::CMediaMtpDataProviderEnumerator, DataProviderId = %d" ), iFramework.DataProviderId() );
     }
 
 // -----------------------------------------------------------------------------
@@ -92,8 +73,6 @@
     {
     PRINT( _L( "MM MTP => CMediaMtpDataProviderEnumerator::~CMediaMtpDataProviderEnumerator" ) );
     Cancel();
-    iDir.Close();
-    iDirStack.Close();
     iStorages.Close();
 
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
@@ -129,10 +108,9 @@
             }
         CleanupStack::PopAndDestroy( &storages ); // - storages
         }
-    else if ( aStorageId != KMTPNotSpecified32 )
+    else if ( aStorageId != KMTPNotSpecified32 
+            && storageMgr.ValidStorageId( aStorageId ) )
         {
-        __ASSERT_DEBUG( storageMgr.ValidStorageId( aStorageId ), User::Invariant() );
-
         const CMTPStorageMetaData& storage( storageMgr.StorageL( aStorageId ) );
 
         if ( storage.Uint( CMTPStorageMetaData::EStorageSystemType )
@@ -157,15 +135,9 @@
         }
 
     iStorageId = aStorageId;
-
-    if ( iStorages.Count() > 0 )
-        {
-        ScanStorageL( iStorages[0] );
-        }
-    else
-        {
-        SignalCompleteL( iDataProvider );
-        }
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, iStatus.Int() );
+    SetActive();
 
     PRINT( _L( "MM MTP <= CMediaMtpDataProviderEnumerator::StartL" ) );
     }
@@ -177,243 +149,38 @@
 //
 void CMediaMtpDataProviderEnumerator::DoCancel()
     {
-    iDir.Close();
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::ScanStorageL
-//
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::ScanStorageL( TUint32 aStorageId )
-    {
-    const CMTPStorageMetaData& storage( iFramework.StorageMgr().StorageL( aStorageId ) );
-
-    __ASSERT_DEBUG( ( storage.Uint( CMTPStorageMetaData::EStorageSystemType ) == CMTPStorageMetaData::ESystemTypeDefaultFileSystem ),
-        User::Invariant() );
-
-    TFileName root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) );
-    PRINT2( _L("MM MTP <> CMediaMtpDataProviderEnumerator::ScanStorageL aStorageId = 0x%x, StorageSuid = %S"), aStorageId, &root );
-
-    iParentHandle = KMTPHandleNoParent;
-    iPath.Set( root, NULL, NULL);
-    iDir.Close();
-    User::LeaveIfError( iDir.Open( iFramework.Fs(),
-        iPath.DriveAndPath(),
-        KEntryAttNormal | KEntryAttDir ) );
-    ScanDirL();
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::ScanNextStorageL
-//
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::ScanNextStorageL()
-    {
-    // If there are one or more unscanned storages left
-    // (the currently scanned one is still on the list)
-    if ( iStorages.Count() > 1 )
-        {
-        // Round trip suppport
-        const CMTPStorageMetaData& storage( iFramework.StorageMgr().StorageL( iStorages[0] ) );
-        TFileName root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) );
-        GetModifiedContentL( root );
-        TRAPD( err, iDataProvider.GetWrapperL().UpdateMusicCollectionL() );
-        if ( err != KErrNone )
-            {
-            PRINT1( _L("MM MTP <> ScanNextStorageL, UpdateMusicCollectionL err =%d "), err );            
-            }
-
-        iStorages.Remove( 0 );
-        ScanStorageL( iStorages[0] );
-        }
-    else
-        {
-        // Round trip suppport
-        const CMTPStorageMetaData& storage( iFramework.StorageMgr().StorageL( iStorages[0] ) );
-        TFileName root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) );
-        GetModifiedContentL( root );
-
-        // We are done
-        iStorages.Reset();
-
-        SignalCompleteL( iDataProvider );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::ScanDirL
-//
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::ScanDirL()
-    {
-    PRINT( _L( "MM MTP => CMediaMtpDataProviderEnumerator::ScanDirL" ) );
-
-    StartEnumerationCount();
-
-    iFirstUnprocessed = 0;
-
-    iScanningDir = ETrue;
-    PERFLOGSTART( KDirectoryScan );
-    iDir.Read( iEntries, iStatus );
-    SetActive();
-
-    PRINT( _L( "MM MTP <= CMediaMtpDataProviderEnumerator::ScanDirL" ) );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::ScanNextDirL
-// Recurse into the next directory on the stack
-// and scan it for entries.
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::ScanNextDirL()
-    {
-    TInt count = iDirStack.Count();
-
-    if ( count == 0 )
-        {
-        // No more directories on the stack, try the next storage
-        ScanNextStorageL();
-        }
-    else
-        {
-        TEntry* entry = iDirStack[count - 1];
-        if ( entry != NULL )
-            {
-
-            // Empty TEntry, no more subdirectories in
-            // the current path
-            if ( entry->iName == KNullDesC )
-                {
-                // Remove current dir from path
-                iPath.PopDir();
-                iDirStack.Remove( count - 1 );
-                delete entry;
-                entry = NULL;
-                iDir.Close();
-
-                // Scan the next directory of the parent
-                ScanNextDirL();
-                }
-            // Going into a subdirectory of current
-            else
-                {
-                // Add directory to path
-                iPath.AddDir( entry->iName );
-                // Remove directory so we don't think it's a subdirectory
-                iDirStack.Remove( count - 1 );
-                delete entry;
-                entry = NULL;
-                ScanNextSubdirL();
-                }
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::ScanNextSubdirL
-// Scan next sub dir
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::ScanNextSubdirL()
-    {
-    PRINT( _L( "MM MTP => CMediaMtpDataProviderEnumerator::ScanNextSubdirL" ) );
-
-    // A empty (non-constructed) TEntry is our marker telling us to pop a directory
-    // from iPath when we see this
-    TEntry* entry = new TEntry( TEntry() );
-
-    User::LeaveIfNull( entry );
-
-    iDirStack.AppendL( entry );
-
-    // Leave with KErrNotFound if we don't find the object handle since it shouldn't be on the
-    // dirstack if the entry wasn't added
-    TPtrC suid = iPath.DriveAndPath().Left( iPath.DriveAndPath().Length() );
-    // Update the current parenthandle with object of the directory
-    PERFLOGSTART( KObjectManagerObjectUid );
-    iParentHandle = iFramework.ObjectMgr().HandleL( suid );
-    PERFLOGSTOP( KObjectManagerObjectUid );
-    PRINT1( _L( "MM MTP <> iParentHandle = 0x%x" ), iParentHandle );
-
-    // Kick-off a scan of the next directory
-    iDir.Close();
-
-    TInt err = iDir.Open( iFramework.Fs(),
-        iPath.DriveAndPath(),
-        KEntryAttNormal | KEntryAttDir );
-
-    PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::ScanNextSubdirL, RDir::Open err = %d" ), err );
-
-    if ( err == KErrNone )
-        ScanDirL();
-    else
-        {
-        iEntries = TEntryArray();
-
-        TRequestStatus* status = &iStatus;
-        User::RequestComplete( status, iStatus.Int() );
-        SetActive();
-        }
-
-
-    PRINT( _L( "MM MTP <= CMediaMtpDataProviderEnumerator::ScanNextSubdirL" ) );
     }
 
 // -----------------------------------------------------------------------------
 // CMediaMtpDataProviderEnumerator::RunL
-//
+// Update the mpx db flag for round trip
 // -----------------------------------------------------------------------------
 //
 void CMediaMtpDataProviderEnumerator::RunL()
     {
-    if ( iScanningDir )
-        {
-        PERFLOGSTOP( KDirectoryScan );
-        }
+    PRINT1( _L( "MM MTP => CMediaMtpDataProviderEnumerator::RunL iStorages.Count() = %d" ), iStorages.Count() );
 
-    iScanningDir = EFalse;
-    if ( iEntries.Count() == 0 )
+    if ( iStorages.Count() > 0 )
         {
-        // No entries to process, scan next dir or storage
-        ScanNextDirL();
-        }
-    else if ( iFirstUnprocessed < iEntries.Count() )
-        {
-        PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::RunL iFirstUnprocessed = %d" ), iFirstUnprocessed);
-        TRAPD( err, ProcessEntriesL(););
+        const CMTPStorageMetaData& storage( iFramework.StorageMgr().StorageL( iStorages[0] ) );
+        const TDesC& root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) );
+        GetModifiedContentL( root );
+        TRAPD( err, iDataProvider.GetWrapperL().UpdateMusicCollectionL( root ) );
         if ( err != KErrNone )
             {
-            iFirstUnprocessed++;
+            PRINT1( _L("MM MTP <> CMediaMtpDataProviderEnumerator::RunL, UpdateMusicCollectionL err =%d "), err );            
             }
-
-        // Complete ourselves with current TRequestStatus
-        // since we need to run again to either scan a new dir or drive
-        // or process more entries
+        iStorages.Remove( 0 );
         TRequestStatus* status = &iStatus;
         User::RequestComplete( status, iStatus.Int() );
         SetActive();
         }
     else
         {
-        switch ( iStatus.Int() )
-            {
-            case KErrNone:
-                // There are still entries left to be read
-                ScanDirL();
-                break;
-
-            case KErrEof:
-                // There are no more entries
-            default:
-                // Error, ignore and continue with next dir
-                ScanNextDirL();
-                break;
-            }
+        iStorages.Reset();
+        SignalCompleteL( iDataProvider );
         }
+    PRINT( _L( "MM MTP <= CMediaMtpDataProviderEnumerator::RunL" ) );
     }
 
 // -----------------------------------------------------------------------------
@@ -440,13 +207,6 @@
     {
     CActiveScheduler::Add( this );
 
-    TTimeIntervalMicroSeconds32 tickPeriod = 0;
-    TInt err = UserHal::TickPeriod(tickPeriod);
-
-    PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::ConstructL, UserHal::TickPeriod err = %d" ), err);
-    User::LeaveIfError( err );
-    iTickPeriod = tickPeriod.Int();
-
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
     iPerfLog = CMmMtpDpPerfLog::NewL( _L( "MediaMtpDataProviderEnumerator" ) );
 #endif
@@ -465,159 +225,6 @@
     }
 
 // -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::ProcessEntriesL
-// Iterates iEntries adding entries as needed to object manager and iDirStack.
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::ProcessEntriesL()
-    {
-    PRINT( _L( "MM MTP => CMediaMtpDataProviderEnumerator::ProcessEntriesL" ) );
-
-    TFileName path = iPath.DriveAndPath();
-
-    while ( !IsOverThreshold() && iFirstUnprocessed < iEntries.Count() )
-        {
-        const TEntry& entry = iEntries[iFirstUnprocessed];
-
-        TInt len = entry.iName.Length();
-
-        // Skip object with too long name
-        if ( KMaxFileName >= path.Length() + len )
-            {
-            path.Append( entry.iName );
-            PRINT1( _L( "MM MTP <> path = %S" ), &path );
-
-            if ( entry.IsDir() )
-                {
-                path.Append( '\\' );
-                ++len;
-
-                // we don't need to process folder, just remember
-                // the folder
-                TEntry* dirEntry = new TEntry( entry );
-                User::LeaveIfNull( dirEntry );
-                iDirStack.AppendL( dirEntry );
-                }
-            else if ( IsFileAccepted( path ) )
-                {
-                AddEntryL( path );
-                }
-
-            // Remove filename part
-            path.SetLength( path.Length() - len );
-            }
-
-        iFirstUnprocessed++;
-        }
-
-    StartEnumerationCount();
-    PRINT( _L( "MM MTP <= CMediaMtpDataProviderEnumerator::ProcessEntriesL" ) );
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::AddEntryL
-// Add a file entry to the object store
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::AddEntryL( const TDesC& aFullFileName )
-    {
-    PRINT1( _L( "MM MTP => CMediaDataProviderEnumerator::AddEntryL aFullFileName = %S" ), &aFullFileName );
-
-    CMTPObjectMetaData* object( CMTPObjectMetaData::NewLC( iDataProviderId,
-        iFormatCode,
-        iStorages[0],
-        aFullFileName ) );    // + object
-
-    object->SetUint( CMTPObjectMetaData::EParentHandle, iParentHandle );
-
-    if ( ( iFormatCode == EMTPFormatCodeMP4Container )
-        || ( iFormatCode == EMTPFormatCode3GPContainer )
-        || ( iFormatCode == EMTPFormatCodeASF ) )
-        {
-        TMmMtpSubFormatCode subFormatCode;
-
-        // Note: Delay the file parsing until external enumeration phase to avoid time-out
-        subFormatCode = EMTPSubFormatCodeUnknown;
-
-        object->SetUint( CMTPObjectMetaData::EFormatSubCode, (TUint)subFormatCode );
-        }
-
-    PERFLOGSTART( KObjectManagerInsert );
-    iObjectMgr.InsertObjectL( *object );
-    PERFLOGSTOP( KObjectManagerInsert );
-
-    CleanupStack::PopAndDestroy( object );  // - object
-
-    PRINT1( _L( "MM MTP <= CMediaMtpDataProviderEnumerator::AddEntryL, entry inserted, iFormatCode = 0x%x" ), iFormatCode);
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::GetObjectFormatCode
-// Returns a TMTPFormatCode for the requested object
-// -----------------------------------------------------------------------------
-//
-TMTPFormatCode CMediaMtpDataProviderEnumerator::GetObjectFormatCode( const TDesC& aFullFileName )
-    {
-    PRINT1( _L("MM MTP <> CMediaMtpDataProviderEnumerator::GetObjectFormatCodeL aFullFileName = %S"), &aFullFileName );
-    TMTPFormatCode formatCode = MmMtpDpUtility::FormatFromFilename( aFullFileName );
-    return formatCode;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaMtpDataProviderEnumerator::IsFileAccepted
-// Is the file format is supported by this Dp
-// -----------------------------------------------------------------------------
-//
-TBool CMediaMtpDataProviderEnumerator::IsFileAccepted( const TDesC& aFullFileName )
-    {
-    PERFLOGSTART( KFormatFilter );
-    iFormatCode = GetObjectFormatCode( aFullFileName );
-    PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::IsFileAcceptedL formatCode = 0x%x" ), iFormatCode );
-    TBool accepted = EFalse;
-    TInt count = sizeof( KMediaMtpDataProviderSupportedFormats ) / sizeof( TUint16 );
-    for ( TInt i = 0; i < count; i++ )
-        {
-        if ( iFormatCode == KMediaMtpDataProviderSupportedFormats[i] )
-            {
-            accepted = ETrue;
-            break;
-            }
-        }
-
-    PERFLOGSTOP( KFormatFilter );
-    return accepted;
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDpMtpEnumerator::StartEnumerationCount
-// start record system tick
-// -----------------------------------------------------------------------------
-//
-void CMediaMtpDataProviderEnumerator::StartEnumerationCount()
-    {
-    iTickCountBegin = User::TickCount();
-    }
-
-// -----------------------------------------------------------------------------
-// CMediaDpMtpEnumerator::IsOverThreshold
-// Is system tick more than the predefined value?
-// -----------------------------------------------------------------------------
-//
-TBool CMediaMtpDataProviderEnumerator::IsOverThreshold()
-    {
-    TUint tcNow = User::TickCount();
-
-    if ( ( tcNow - iTickCountBegin ) * iTickPeriod >= KThresholdOfEnumerationLoopDuration )
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-
-// -----------------------------------------------------------------------------
 // CMediaDpMtpEnumerator::GetModifiedContentL()
 // Get Modified Content and report to Framework
 // -----------------------------------------------------------------------------
@@ -638,7 +245,6 @@
         CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC();   // + object
         for ( TInt i = 0; i < arrayCount; i++ )
             {
-
             if ( iFramework.ObjectMgr().ObjectL( ( *modifiedContents )[i], *object ) )
                 {
                 object->SetUint( CMTPObjectMetaData::EObjectMetaDataUpdate , 1 );
@@ -661,7 +267,6 @@
 //
 void CMediaMtpDataProviderEnumerator::SessionClosedL()
     {
-    iDataProvider.GetWrapperL().UpdateMusicCollectionL();
     iDataProvider.GetWrapperL().CleanupDatabaseL();
     }
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def	Tue May 11 16:40:32 2010 +0300
@@ -5,59 +5,59 @@
 	?StartL@CRenameObject@@QAEXKABVTDesC16@@@Z @ 4 NONAME ; void CRenameObject::StartL(unsigned long, class TDesC16 const &)
 	??1CRequestUnknown@@UAE@XZ @ 5 NONAME ; CRequestUnknown::~CRequestUnknown(void)
 	?DeleteObjectL@CMmMtpDpMetadataAccessWrapper@@QAEXABVCMTPObjectMetaData@@@Z @ 6 NONAME ; void CMmMtpDpMetadataAccessWrapper::DeleteObjectL(class CMTPObjectMetaData const &)
-	?Release@CRequestProcessor@@MAEXXZ @ 7 NONAME ; void CRequestProcessor::Release(void)
-	?HandleRequestL@CRequestProcessor@@MAEHABVTMTPTypeRequest@@W4TMTPTransactionPhase@@@Z @ 8 NONAME ; int CRequestProcessor::HandleRequestL(class TMTPTypeRequest const &, enum TMTPTransactionPhase)
-	??1CGetInterdependentPropDesc@@UAE@XZ @ 9 NONAME ; CGetInterdependentPropDesc::~CGetInterdependentPropDesc(void)
-	?OpenSessionL@CMmMtpDpAccessSingleton@@SAXXZ @ 10 NONAME ; void CMmMtpDpAccessSingleton::OpenSessionL(void)
-	?ServiceL@CGetPartialObject@@MAEXXZ @ 11 NONAME ; void CGetPartialObject::ServiceL(void)
-	??0CGetObjectInfo@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 12 NONAME ; CGetObjectInfo::CGetObjectInfo(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?DoHandleResponsePhaseL@CRequestProcessor@@MAEHXZ @ 13 NONAME ; int CRequestProcessor::DoHandleResponsePhaseL(void)
-	?NewL@CGetObjectPropDesc@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 14 NONAME ; class MMmRequestProcessor * CGetObjectPropDesc::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	??0CGetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 15 NONAME ; CGetObjectPropValue::CGetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?CheckRequestL@CSetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 16 NONAME ; enum TMTPResponseCode CSetObjectPropList::CheckRequestL(void)
-	?RunL@CRequestProcessor@@MAEXXZ @ 17 NONAME ; void CRequestProcessor::RunL(void)
-	?ServiceL@CDeleteObject@@MAEXXZ @ 18 NONAME ; void CDeleteObject::ServiceL(void)
-	?DoCancel@CSetObjectPropList@@MAEXXZ @ 19 NONAME ; void CSetObjectPropList::DoCancel(void)
-	?CleanupDatabaseL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 20 NONAME ; void CMmMtpDpMetadataAccessWrapper::CleanupDatabaseL(void)
-	?ServiceL@CGetObjectPropsSupported@@MAEXXZ @ 21 NONAME ; void CGetObjectPropsSupported::ServiceL(void)
-	?NewL@CSetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 22 NONAME ; class MMmRequestProcessor * CSetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?Release@CMmMtpDpAccessSingleton@@SAXXZ @ 23 NONAME ; void CMmMtpDpAccessSingleton::Release(void)
-	?UsbDisconnect@CSendObject@@MAEXXZ @ 24 NONAME ; void CSendObject::UsbDisconnect(void)
-	?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)
-	?CreateL@CMmMtpDpAccessSingleton@@SAXAAVMMTPDataProviderFramework@@@Z @ 36 NONAME ; void CMmMtpDpAccessSingleton::CreateL(class MMTPDataProviderFramework &)
-	??1CGetFormatCapabilities@@UAE@XZ @ 37 NONAME ; CGetFormatCapabilities::~CGetFormatCapabilities(void)
-	?ServiceL@CSetObjectReferences@@EAEXXZ @ 38 NONAME ; void CSetObjectReferences::ServiceL(void)
-	?DoHandleDataIToRPhaseL@CRequestProcessor@@MAEHXZ @ 39 NONAME ; int CRequestProcessor::DoHandleDataIToRPhaseL(void)
-	??0CGetObjectPropList@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 40 NONAME ; CGetObjectPropList::CGetObjectPropList(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?ConstructL@CCopyObject@@IAEXXZ @ 41 NONAME ; void CCopyObject::ConstructL(void)
-	?SetMetaDataToWrapper@CPropertySettingUtility@@QAE?AW4TMTPResponseCode@@AAVMMmMtpDpConfig@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 42 NONAME ; enum TMTPResponseCode CPropertySettingUtility::SetMetaDataToWrapper(class MMmMtpDpConfig &, unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
-	?ServiceL@CGetObjectPropValue@@MAEXXZ @ 43 NONAME ; void CGetObjectPropValue::ServiceL(void)
-	??1CRenameObject@@UAE@XZ @ 44 NONAME ; CRenameObject::~CRenameObject(void)
-	?Match@CRequestProcessor@@MBEHABVTMTPTypeEvent@@AAVMMTPConnection@@@Z @ 45 NONAME ; int CRequestProcessor::Match(class TMTPTypeEvent const &, class MMTPConnection &) 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
-	?DoCancel@CRequestProcessor@@MAEXXZ @ 53 NONAME ; void CRequestProcessor::DoCancel(void)
-	?CheckRequestL@CGetPartialObject@@MAE?AW4TMTPResponseCode@@XZ @ 54 NONAME ; enum TMTPResponseCode CGetPartialObject::CheckRequestL(void)
-	?NewL@CRequestUnknown@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 55 NONAME ; class MMmRequestProcessor * CRequestUnknown::NewL(class MMTPDataProviderFramework &, class MMTPConnection &)
-	??0CGetFormatCapabilities@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 56 NONAME ; CGetFormatCapabilities::CGetFormatCapabilities(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
-	?ConstructL@CGetObjectInfo@@AAEXXZ @ 57 NONAME ; void CGetObjectInfo::ConstructL(void)
-	?UsbDisconnect@CRequestProcessor@@MAEXXZ @ 58 NONAME ; void CRequestProcessor::UsbDisconnect(void)
-	?UpdateMusicCollectionL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 59 NONAME ; void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL(void)
+	?UpdateMusicCollectionL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 7 NONAME ; void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL(class TDesC16 const &)
+	?Release@CRequestProcessor@@MAEXXZ @ 8 NONAME ; void CRequestProcessor::Release(void)
+	?HandleRequestL@CRequestProcessor@@MAEHABVTMTPTypeRequest@@W4TMTPTransactionPhase@@@Z @ 9 NONAME ; int CRequestProcessor::HandleRequestL(class TMTPTypeRequest const &, enum TMTPTransactionPhase)
+	??1CGetInterdependentPropDesc@@UAE@XZ @ 10 NONAME ; CGetInterdependentPropDesc::~CGetInterdependentPropDesc(void)
+	?OpenSessionL@CMmMtpDpAccessSingleton@@SAXXZ @ 11 NONAME ; void CMmMtpDpAccessSingleton::OpenSessionL(void)
+	?ServiceL@CGetPartialObject@@MAEXXZ @ 12 NONAME ; void CGetPartialObject::ServiceL(void)
+	??0CGetObjectInfo@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 13 NONAME ; CGetObjectInfo::CGetObjectInfo(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?DoHandleResponsePhaseL@CRequestProcessor@@MAEHXZ @ 14 NONAME ; int CRequestProcessor::DoHandleResponsePhaseL(void)
+	?NewL@CGetObjectPropDesc@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 15 NONAME ; class MMmRequestProcessor * CGetObjectPropDesc::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??0CGetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 16 NONAME ; CGetObjectPropValue::CGetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?CheckRequestL@CSetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 17 NONAME ; enum TMTPResponseCode CSetObjectPropList::CheckRequestL(void)
+	?RunL@CRequestProcessor@@MAEXXZ @ 18 NONAME ; void CRequestProcessor::RunL(void)
+	?ServiceL@CDeleteObject@@MAEXXZ @ 19 NONAME ; void CDeleteObject::ServiceL(void)
+	?DoCancel@CSetObjectPropList@@MAEXXZ @ 20 NONAME ; void CSetObjectPropList::DoCancel(void)
+	?CleanupDatabaseL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 21 NONAME ; void CMmMtpDpMetadataAccessWrapper::CleanupDatabaseL(void)
+	?ServiceL@CGetObjectPropsSupported@@MAEXXZ @ 22 NONAME ; void CGetObjectPropsSupported::ServiceL(void)
+	?NewL@CSetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 23 NONAME ; class MMmRequestProcessor * CSetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?Release@CMmMtpDpAccessSingleton@@SAXXZ @ 24 NONAME ; void CMmMtpDpAccessSingleton::Release(void)
+	?UsbDisconnect@CSendObject@@MAEXXZ @ 25 NONAME ; void CSendObject::UsbDisconnect(void)
+	?ServiceL@CGetFormatCapabilities@@MAEXXZ @ 26 NONAME ; void CGetFormatCapabilities::ServiceL(void)
+	?GetAllReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXPAVCMPXMedia@@AAVCDesC16Array@@@Z @ 27 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllReferenceL(class CMPXMedia *, class CDesC16Array &)
+	??1CSetObjectPropList@@UAE@XZ @ 28 NONAME ; CSetObjectPropList::~CSetObjectPropList(void)
+	?ServiceL@CSetObjectPropList@@MAEXXZ @ 29 NONAME ; void CSetObjectPropList::ServiceL(void)
+	??0CMoveObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 30 NONAME ; CMoveObject::CMoveObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??0CRequestUnknown@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 31 NONAME ; CRequestUnknown::CRequestUnknown(class MMTPDataProviderFramework &, class MMTPConnection &)
+	?ConstructL@CGetObjectPropList@@IAEXXZ @ 32 NONAME ; void CGetObjectPropList::ConstructL(void)
+	??1CSendObject@@UAE@XZ @ 33 NONAME ; CSendObject::~CSendObject(void)
+	?ServiceMetaDataFromWrapperL@CGetObjectPropValue@@IAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 34 NONAME ; void CGetObjectPropValue::ServiceMetaDataFromWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
+	?NewL@CGetObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 35 NONAME ; class MMmRequestProcessor * CGetObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??1CGetObjectPropValue@@UAE@XZ @ 36 NONAME ; CGetObjectPropValue::~CGetObjectPropValue(void)
+	?CreateL@CMmMtpDpAccessSingleton@@SAXAAVMMTPDataProviderFramework@@@Z @ 37 NONAME ; void CMmMtpDpAccessSingleton::CreateL(class MMTPDataProviderFramework &)
+	??1CGetFormatCapabilities@@UAE@XZ @ 38 NONAME ; CGetFormatCapabilities::~CGetFormatCapabilities(void)
+	?ServiceL@CSetObjectReferences@@EAEXXZ @ 39 NONAME ; void CSetObjectReferences::ServiceL(void)
+	?DoHandleDataIToRPhaseL@CRequestProcessor@@MAEHXZ @ 40 NONAME ; int CRequestProcessor::DoHandleDataIToRPhaseL(void)
+	??0CGetObjectPropList@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 41 NONAME ; CGetObjectPropList::CGetObjectPropList(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	?ConstructL@CCopyObject@@IAEXXZ @ 42 NONAME ; void CCopyObject::ConstructL(void)
+	?SetMetaDataToWrapper@CPropertySettingUtility@@QAE?AW4TMTPResponseCode@@AAVMMmMtpDpConfig@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 43 NONAME ; enum TMTPResponseCode CPropertySettingUtility::SetMetaDataToWrapper(class MMmMtpDpConfig &, unsigned short, class MMTPType &, class CMTPObjectMetaData const &)
+	?ServiceL@CGetObjectPropValue@@MAEXXZ @ 44 NONAME ; void CGetObjectPropValue::ServiceL(void)
+	??1CRenameObject@@UAE@XZ @ 45 NONAME ; CRenameObject::~CRenameObject(void)
+	?Match@CRequestProcessor@@MBEHABVTMTPTypeEvent@@AAVMMTPConnection@@@Z @ 46 NONAME ; int CRequestProcessor::Match(class TMTPTypeEvent const &, class MMTPConnection &) const
+	?DoHandleCompletingPhaseL@CSendObject@@MAEHXZ @ 47 NONAME ; int CSendObject::DoHandleCompletingPhaseL(void)
+	?GetDrmStatus@MmMtpDpUtility@@SAHABVTDesC16@@@Z @ 48 NONAME ; int MmMtpDpUtility::GetDrmStatus(class TDesC16 const &)
+	?RunL@CRenameObject@@MAEXXZ @ 49 NONAME ; void CRenameObject::RunL(void)
+	??0CSetObjectReferences@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 50 NONAME ; CSetObjectReferences::CSetObjectReferences(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &)
+	??0CRequestProcessor@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@HPBUTMTPRequestElementInfo@@@Z @ 51 NONAME ; CRequestProcessor::CRequestProcessor(class MMTPDataProviderFramework &, class MMTPConnection &, int, struct TMTPRequestElementInfo const *)
+	?ServiceL@CSendObject@@MAEXXZ @ 52 NONAME ; void CSendObject::ServiceL(void)
+	?Request@CRequestProcessor@@MBEABVTMTPTypeRequest@@XZ @ 53 NONAME ; class TMTPTypeRequest const & CRequestProcessor::Request(void) const
+	?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)
 	??1CMoveObject@@UAE@XZ @ 60 NONAME ; CMoveObject::~CMoveObject(void)
 	?CheckRequestL@CSendObject@@MAE?AW4TMTPResponseCode@@XZ @ 61 NONAME ; enum TMTPResponseCode CSendObject::CheckRequestL(void)
 	??1CRequestProcessor@@MAE@XZ @ 62 NONAME ; CRequestProcessor::~CRequestProcessor(void)
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def	Tue May 11 16:40:32 2010 +0300
@@ -193,7 +193,7 @@
 	_ZN29CMmMtpDpMetadataAccessWrapper19GetModifiedContentLERK7TDesC16RiR12CDesC16Array @ 192 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper20GetAllAbstractMediaLERK7TDesC16PP14CMPXMediaArray19TMPXGeneralCategory @ 193 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper21GetAbstractMediaNameLEP9CMPXMedia19TMPXGeneralCategory @ 194 NONAME
-	_ZN29CMmMtpDpMetadataAccessWrapper22UpdateMusicCollectionLEv @ 195 NONAME
+	_ZN29CMmMtpDpMetadataAccessWrapper22UpdateMusicCollectionLERK7TDesC16 @ 195 NONAME
 	_ZN29CMmMtpDpMetadataAccessWrapper23GetObjectMetadataValueLEtR8MMTPTypeRK18CMTPObjectMetaData @ 196 NONAME
 	_ZNK11CSendObject12HasDataphaseEv @ 197 NONAME
 	_ZNK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 198 NONAME
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csendobject.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csendobject.h	Tue May 11 16:40:32 2010 +0300
@@ -187,12 +187,6 @@
     TBool IsTooLarge( TUint64 aObjectSize ) const;
 
     /**
-    * Check if we can store the file on the storage
-    * @return ETrue if yes, otherwise EFalse
-    */
-    TBool CanStoreFileL( TUint32 aStorageId, TInt64 aObjectSize ) const;
-
-    /**
     * Get the full path name of the object to be saved
     * @param aFileName, on entry, contains the file name of the object,
     * on return, contains the full path name of the object to be saved
@@ -208,7 +202,7 @@
     /**
     * Reserve object information before SendObject
     */
-    void ReserveObjectL();
+    TInt ReserveObjectL();
 
     /**
     * Set protection status of object which could be read/write-only
@@ -227,10 +221,13 @@
     void AddMediaToStoreL();
 
     /**
-    * delete the file, which transfer incompletely
+    * Rollback functions
     */
     void Rollback();
 
+    void UnreserveObjectL();
+    void RemoveObjectFromDbL();
+    void RemoveObjectFromFs();
 
 private:
     enum TMTPSendingObjectState
@@ -244,6 +241,8 @@
         ESendObjectFail
         };
 
+    typedef void ( CSendObject::*TMmMtpRollbackAction )();
+
 private:
     RFs& iFs;
     MMTPObjectMgr& iObjectMgr;
@@ -282,7 +281,7 @@
     // params which is needed for reserve handle
     TMTPTypeRequest iExpectedSendObjectRequest;
 
-    TBool iNoRollback;
+    RArray<TMmMtpRollbackAction> iRollbackList;
 
     TUint32 iPreviousTransactionID;
     TUint32 iPreviousOperation;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp	Tue May 11 16:40:32 2010 +0300
@@ -224,8 +224,6 @@
     TFileName fileName( aObjectInfo.DesC( CMTPObjectMetaData::ESuid ) );
     PRINT1( _L( "MM MTP <> CDeleteObject::DeleteObjectL fileName = %S" ), &fileName );
 
-    iDpConfig.GetWrapperL().SetStorageRootL( fileName );
-
     // To capture special situation: After copy, move, rename playlist folder name,
     // record in MPX is not inlined with framework db, playlist should not be deleted
     // until next session.
@@ -315,10 +313,14 @@
         {
         SendResponseL( EMTPRespCodePartialDeletion );
         }
-    else if( !iIsMultiDelete && iDeleteError == KErrAccessDenied )
+    else if ( !iIsMultiDelete && iDeleteError == KErrAccessDenied )
         {
         SendResponseL( EMTPRespCodeObjectWriteProtected );
         }
+    else if ( iDeleteError == KErrInUse )
+        {
+        SendResponseL( EMTPRespCodeDeviceBusy );
+        }
     else
         {
         SendResponseL( EMTPRespCodeAccessDenied );
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp	Tue May 11 16:40:32 2010 +0300
@@ -354,8 +354,6 @@
     else
         {
         CMTPObjectMetaData* meta( iRequestChecker->GetObjectInfo( iHandle ) );
-        TPtrC suid( meta->DesC( CMTPObjectMetaData::ESuid ) );
-        iDpConfig.GetWrapperL().SetStorageRootL( suid );
 
         __ASSERT_DEBUG( meta, Panic( EMmMTPDpObjectNull ) );
 
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp	Tue May 11 16:40:32 2010 +0300
@@ -515,7 +515,6 @@
         iObjectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle );
         iFramework.ObjectMgr().ModifyObjectL(*iObjectInfo);
 
-        iDpConfig.GetWrapperL().SetStorageRootL( aNewFileName );
         iDpConfig.GetWrapperL().AddObjectL( *iObjectInfo );
 
         if ( formatCode == EMTPFormatCodeAbstractAudioVideoPlaylist
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp	Tue May 11 16:40:32 2010 +0300
@@ -32,6 +32,8 @@
 #include "cpropertysettingutility.h"
 #include "cmmmtpdpmetadataaccesswrapper.h"
 
+const TInt KMtpRollbackFuncCnt = 3;
+
 // Verification data for the SendObjectInfo request
 const TMTPRequestElementInfo KMTPSendObjectInfoPolicy[] =
     {
@@ -79,12 +81,8 @@
 //
 EXPORT_C CSendObject::~CSendObject()
     {
-    if ( !iNoRollback )
-        {
-        // Not finished SendObjectInfo \ SendObject pair detected.
-        Rollback();
-        PRINT( _L( "MM MTP <> CSendObject::~CSendObject, Rollback" ) );
-        }
+    Rollback();
+    iRollbackList.Close();
 
     delete iFileReceived;
     delete iParentSuid;
@@ -107,7 +105,8 @@
         CRequestProcessor( aFramework, aConnection, 0, NULL ),
         iFs( iFramework.Fs() ),
         iObjectMgr( iFramework.ObjectMgr() ),
-        iDpConfig( aDpConfig )
+        iDpConfig( aDpConfig ),
+        iRollbackList( KMtpRollbackFuncCnt )
     {
     PRINT( _L( "Operation: SendObjectInfo/SendObject/SendObjectPropList(0x100C/0x100D/0x9808)" ) );
     }
@@ -130,8 +129,6 @@
 
     PRINT1( _L( "MM MTP <> CSendObject::ConstructL DataProviderId = 0x%x" ), iFramework.DataProviderId());
 
-    iNoRollback = EFalse;
-
     SetPSStatus();
     PRINT( _L( "MM MTP <= CSendObject::ConstructL" ) );
     }
@@ -300,11 +297,6 @@
                 {
                 responseCode = EMTPRespCodeObjectTooLarge;
                 }
-
-            if ( ( responseCode != EMTPRespCodeOK ) && !CanStoreFileL( iStorageId, iObjectSize ) )
-                {
-                responseCode = EMTPRespCodeStoreFull;
-                }
             }
         }
 
@@ -392,22 +384,7 @@
 void CSendObject::ServiceObjectL()
     {
     PRINT( _L( "MM MTP => CSendObject::ServiceObjectL" ) );
-
-    delete iFileReceived;
-    iFileReceived = NULL;
-
-    PRINT2( _L( "MM MTP <> CSendObject::ServiceObjectL, iFullPath is %S, iObjectSize: %Lu" ), &iFullPath, iObjectSize );
-    TRAPD( err, iFileReceived = CMTPTypeFile::NewL( iFs,
-        iFullPath,
-        EFileWrite ) );
-
-    PRINT1( _L("MM MTP <> CSendObject::ServiceObjectL, Leave Code is: %d"), err );
-    User::LeaveIfError( err );
-
-    iFileReceived->SetSizeL( iObjectSize );
-
     ReceiveDataL( *iFileReceived );
-
     iProgress = ESendObjectInProgress;
 
     PRINT( _L( "MM MTP <= CSendObject::ServiceObjectL" ) );
@@ -479,12 +456,7 @@
     if ( IsTooLarge( iObjectSize ) )
         {
         SendResponseL( EMTPRespCodeObjectTooLarge );
-        result = EFalse;
-        }
-
-    if ( result && !CanStoreFileL( iStorageId, iObjectSize ) )
-        {
-        SendResponseL( EMTPRespCodeStoreFull );
+        Rollback();
         result = EFalse;
         }
 
@@ -496,6 +468,7 @@
             && iProtectionStatus != EMTPProtectionReadOnly )
             {
             SendResponseL( EMTPRespCodeParameterNotSupported );
+            Rollback();
             result = EFalse;
             }
         }
@@ -507,6 +480,7 @@
             {
             // File and/or parent pathname invalid.
             SendResponseL( EMTPRespCodeInvalidDataset );
+            Rollback();
             }
         }
 
@@ -514,16 +488,19 @@
         {
         if ( ExistsL( iFullPath ) )
             {
-            // Object with the same name already exists.
-            iNoRollback = ETrue;
             SendResponseL( EMTPRespCodeAccessDenied );
+            Rollback();
             result = EFalse;
             }
         }
 
     if ( result )
-        ReserveObjectL();
-
+        {
+        if ( KErrNone != ReserveObjectL() )
+            {
+            result = EFalse;
+            }
+        }
     PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseInfoL result = %d" ), result );
 
     return result;
@@ -542,6 +519,7 @@
 
     TInt invalidParameterIndex = KErrNotFound;
     responseCode = VerifyObjectPropListL( invalidParameterIndex );
+    TInt err = KErrNone;
 
     if ( responseCode != EMTPRespCodeOK )
         {
@@ -551,18 +529,18 @@
         parameters[2] = 0;
         parameters[3] = invalidParameterIndex;
         SendResponseL( responseCode, 4, parameters );
+        Rollback();
         }
     else if ( ExistsL( iFullPath ) )
         {
-        // Object with the same name already exists.
-        iNoRollback = ETrue;
         SendResponseL( EMTPRespCodeAccessDenied );
+        Rollback();
         }
     else
-        ReserveObjectL();
+        err = ReserveObjectL();
 
     PRINT( _L( "MM MTP <= CSendObject::DoHandleResponsePhasePropListL" ) );
-    return ( responseCode == EMTPRespCodeOK );
+    return ( responseCode == EMTPRespCodeOK && err == KErrNone);
     }
 
 // -----------------------------------------------------------------------------
@@ -576,60 +554,56 @@
 
     TBool result = ETrue;
 
+    TEntry fileEntry;
+    User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) );
+    if ( fileEntry.FileSize() != iObjectSize )
+        {
+        iFs.Delete( iFullPath );
+        iObjectMgr.UnreserveObjectHandleL( *iReceivedObjectInfo );
+        TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge;
+        if ( fileEntry.FileSize() < iObjectSize )
+            {
+            responseCode = EMTPRespCodeIncompleteTransfer;
+            }
+        SendResponseL( responseCode );
+        Rollback();
+        result = EFalse;
+        }
+
     // SendObject is cancelled or connection is dropped.
-    if ( iCancelled )
+    if ( result && iCancelled )
         {
-        // In SendObject response phase, unregister is not necessary.
-        // But there's no harm, still keep it here.
+        iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest,
+            iConnection );
+        SendResponseL( EMTPRespCodeTransactionCancelled );
+        Rollback();
+        }
+    else if ( result && !iCancelled )
+        {
+        if ( iObjectSize > 0 ) // media file
+            {
+            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 );
+            iRollbackList.Append( RemoveObjectFromDbL );
+            }
+
+        // Commit object to MTP data store
         iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest,
             iConnection );
 
-        Rollback();
-        SendResponseL( EMTPRespCodeTransactionCancelled );
-        }
-    else
-        {
-        TEntry fileEntry;
-        User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) );
-
-        if ( fileEntry.FileSize() != iObjectSize )
-            {
-            Rollback();
-            TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge;
-            if ( fileEntry.FileSize() < iObjectSize )
-                {
-                responseCode = EMTPRespCodeIncompleteTransfer;
-                }
-            SendResponseL( responseCode );
-            result = EFalse;
-            }
-        else
-            {
-            if ( iObjectSize > 0 ) // media file
-                {
-                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 );
-                }
-
-            // In SendObject response phase, unregister is not necessary.
-            // But there's no harm, still keep it here.
-            iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest,
-                iConnection );
-
-            SendResponseL( EMTPRespCodeOK );
-            }
+        SendResponseL( EMTPRespCodeOK );
         }
 
     PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseObjectL result = %d" ), result );
@@ -661,6 +635,9 @@
         result = EFalse;
         }
 
+    if ( result )
+        iRollbackList.Reset();
+
     PRINT2( _L( "MM MTP <= CSendObject::DoHandleCompletingPhaseL iProgress= %d, result = %d" ),
         iProgress,
         result );
@@ -1042,31 +1019,6 @@
     return ret;
     }
 
-// -----------------------------------------------------------------------------
-// CSendObject::CanStoreFileL
-// Check if we can store the file on the storage
-// @return ETrue if yes, otherwise EFalse
-// -----------------------------------------------------------------------------
-//
-TBool CSendObject::CanStoreFileL( TUint32 aStorageId,
-    TInt64 aObjectSize ) const
-    {
-    PRINT( _L( "MM MTP => CSendObject::CanStoreFileL" ) );
-
-    TBool result = ETrue;
-    TVolumeInfo volumeInfo;
-    TInt driveNo = iFramework.StorageMgr().DriveNumber( aStorageId );
-    User::LeaveIfError( iFs.Volume( volumeInfo, driveNo ) );
-
-    if ( volumeInfo.iFree < aObjectSize )
-        {
-        result = EFalse;
-        }
-
-    PRINT1( _L( "MM MTP <= CSendObject::CanStoreFileL , result = %d" ), result );
-
-    return result;
-    }
 
 // -----------------------------------------------------------------------------
 // CSendObject::GetFullPathNameL
@@ -1171,7 +1123,7 @@
 // CSendObject::ReserveObjectL
 // -----------------------------------------------------------------------------
 //
-void CSendObject::ReserveObjectL()
+TInt CSendObject::ReserveObjectL()
     {
     PRINT( _L( "MM MTP => CSendObject::ReserveObjectL" ) );
     TInt err = KErrNone;
@@ -1187,15 +1139,42 @@
     // by the specified object information record.
     TRAP( err, iObjectMgr.ReserveObjectHandleL( *iReceivedObjectInfo,
         iObjectSize ) );
+    iRollbackList.Append( UnreserveObjectL );
 
     PRINT2( _L( "MM MTP => CSendObject::ReserveObjectL iObjectsize = %Lu, Operation: 0x%x" ), iObjectSize, iOperationCode );
     if ( err != KErrNone )
-        PRINT1( _L( "MM MTP <> CSendObject::ReserveObjectL err = %d" ), err );
-    if ( iObjectSize == 0 )
+        {
+        PRINT1( _L( "MM MTP <> ReserveObjectHandleL err = %d" ), err );
+        }
+
+    if ( err == KErrNone )
+        {
+        delete iFileReceived;
+        iFileReceived = NULL;
+        PRINT2( _L( "MM MTP <> CSendObject::ServiceObjectL, iFullPath is %S, iObjectSize: %Lu" ), &iFullPath, iObjectSize );
+        iRollbackList.Append( RemoveObjectFromFs );
+        TRAP( err, iFileReceived = CMTPTypeFile::NewL( iFs, iFullPath, EFileWrite ) );
+
+        PRINT1( _L("MM MTP <> CMTPTypeFile::NewL Leave Code is: %d"), err );
+        }
+
+    if ( err == KErrNone )
+        {
+        TRAP( err, iFileReceived->SetSizeL( iObjectSize ) );
+        PRINT1( _L( "MM MTP <> SetSizeL leave code:%d" ), err );
+        if ( err == KErrDiskFull )
+            {
+            SendResponseL( EMTPRespCodeStoreFull );
+            Rollback();
+            return err;
+            }
+        }
+
+    if ( err == KErrNone && iObjectSize == 0 )
         {
         // Already trapped inside SaveEmptyFileL.
         SaveEmptyFileL();
-        if( iOperationCode == EMTPOpCodeSendObjectPropList )
+        if ( iOperationCode == EMTPOpCodeSendObjectPropList )
             {
             // Only leave when getting proplist element from data received by fw.
             // It should not happen after ReceiveDataL in which construction of proplist already succeed.
@@ -1203,19 +1182,28 @@
             }
 
         iObjectMgr.CommitReservedObjectHandleL( *iReceivedObjectInfo );
+        iRollbackList.Reset();
         }
 
-    iExpectedSendObjectRequest.SetUint32( TMTPTypeRequest::ERequestSessionID,
-        iSessionId );
-    iFramework.RouteRequestRegisterL( iExpectedSendObjectRequest, iConnection );
+    if ( err == KErrNone )
+        {
+        iExpectedSendObjectRequest.SetUint32( TMTPTypeRequest::ERequestSessionID, iSessionId );
+        iFramework.RouteRequestRegisterL( iExpectedSendObjectRequest, iConnection );
 
-    TUint32 parameters[3];
-    parameters[0] = iStorageId;
-    parameters[1] = iParentHandle;
-    parameters[2] = iReceivedObjectInfo->Uint( CMTPObjectMetaData::EHandle );
-    SendResponseL( EMTPRespCodeOK, 3, parameters );
+        TUint32 parameters[3];
+        parameters[0] = iStorageId;
+        parameters[1] = iParentHandle;
+        parameters[2] = iReceivedObjectInfo->Uint( CMTPObjectMetaData::EHandle );
+        SendResponseL( EMTPRespCodeOK, 3, parameters );
+        }
+    else
+        {
+        SendResponseL( EMTPRespCodeGeneralError );
+        Rollback();
+        }
 
     PRINT( _L( "MM MTP <= CSendObject::ReserveObjectL" ) );
+    return err;
     }
 
 // -----------------------------------------------------------------------------
@@ -1248,8 +1236,13 @@
             }
         // Close the file after SetProtectionStatus to make sure other process won't open
         // the file successfully right at the time calling RFile::SetAtt.
-        delete iFileReceived;
-        iFileReceived = NULL;
+        if ( iObjectSize > 0 )
+            {
+            delete iFileReceived;
+            iFileReceived = NULL;
+            }
+        else
+            iFileReceived->File().Close();
         }
 
     PRINT( _L( "MM MTP <= CSendObject::SetProtectionStatus" ) );
@@ -1263,30 +1256,24 @@
     {
     PRINT( _L( "MM MTP => CSendObject::SaveEmptyFileL" ) );
 
-    RFile file;
-    User::LeaveIfError( file.Create( iFs, iFullPath, EFileWrite ) );
-    CleanupClosePushL( file );  // + file
-
     if ( EMTPFormatCodeAbstractAudioVideoPlaylist == iObjectFormat )
         {
-        TInt err = KErrNone;
-        err = file.SetAtt( KEntryAttSystem | KEntryAttHidden,
+        TInt err = iFileReceived->File().SetAtt( KEntryAttSystem | KEntryAttHidden,
             KEntryAttReadOnly | KEntryAttNormal );
         if ( err != KErrNone )
             PRINT1( _L( "MM MTP <> CSendObject::SaveEmptyFileL err = %d" ), err );
         iDpConfig.GetWrapperL().AddDummyFileL( iFullPath );
         }
-    CleanupStack::PopAndDestroy( &file );   // - file
 
     // add playlist to MPX DB
     TRAPD( err, AddMediaToStoreL() );
 
     if ( err != KErrNone )
-        {
-        // Ignore err even add into MPX get failed.
-        }
+        iRollbackList.Append( RemoveObjectFromDbL );
+    else
+        iRollbackList.Reset();
 
-    PRINT1( _L( "MM MTP <= CSendObject::SaveEmptyFileLerr = %d" ), err );
+    PRINT1( _L( "MM MTP <= CSendObject::SaveEmptyFileL err = %d" ), err );
     }
 
 // -----------------------------------------------------------------------------
@@ -1303,7 +1290,6 @@
     // Might need to set dateadded and datemodify for further extension.
     SetProtectionStatus();
 
-    iDpConfig.GetWrapperL().SetStorageRootL( iFullPath );
     PRINT1( _L( "MM MTP <> CSendObject::AddMediaToStoreL iFullPath = %S" ), &iFullPath );
     iDpConfig.GetWrapperL().AddObjectL( *iReceivedObjectInfo );
 
@@ -1331,20 +1317,49 @@
 //
 void CSendObject::Rollback()
     {
-    // Delete this object from file system.
-    if ( iProgress == ESendObjectInProgress )
-            // || iProgress == EObjectInfoSucceed   // this line is to be commented out until SetSize is done in SendObjectInfo/SendObjectPropList
-            //||iProgress == EObjectInfoFail )
+    PRINT( _L("MM MTP => CSendObject::Rollback") );
+
+    TInt count = iRollbackList.Count();
+    PRINT1( _L("MM MTP => CSendObject::Rollback, iRollbackList.Count() = %d"), iRollbackList.Count() );
+
+    for ( TInt i = 0; i < count; i++ )
         {
-        PRINT1( _L( "MM MTP <> CSendObject::Rollback ROLLBACK_FILE %S" ), &iFullPath );
-        // Close the interrupted transfer file by delete iFileReceived object
-        delete iFileReceived;
-        iFileReceived = NULL;
+        TMmMtpRollbackAction tmp = iRollbackList[i];
+        ( this->*((TMmMtpRollbackAction)(iRollbackList[i])))();
+        }
+    iRollbackList.Reset();
+
+    PRINT( _L("MM MTP <= CSendObject::Rollback") );
+    }
+
+void CSendObject::UnreserveObjectL()
+    {
+    PRINT( _L("MM MTP => CSendObject::UnreserveObjectL") );
+    iFramework.ObjectMgr().UnreserveObjectHandleL( *iReceivedObjectInfo );
+    PRINT( _L("MM MTP <= CSendObject::UnreserveObjectL") );
+    }
 
-        iFramework.Fs().Delete( iFullPath );
-        TRAP_IGNORE( iFramework.ObjectMgr().UnreserveObjectHandleL( *iReceivedObjectInfo ) );
-        iProgress = EObjectNone;
+void CSendObject::RemoveObjectFromDbL()
+    {
+    PRINT( _L("MM MTP => CSendObject::RemoveObjectFromDbL") );
+    iFramework.ObjectMgr().RemoveObjectL( iReceivedObjectInfo->DesC( CMTPObjectMetaData::ESuid ) );
+    iDpConfig.GetWrapperL().DeleteObjectL( *iReceivedObjectInfo );
+    PRINT( _L("MM MTP <= CSendObject::RemoveObjectFromDbL") );
+    }
+
+void CSendObject::RemoveObjectFromFs()
+    {
+    PRINT( _L("MM MTP => CSendObject::RemoveObjectFromFs") );
+
+    delete iFileReceived;
+    iFileReceived = NULL;
+
+    TInt err = iFramework.Fs().Delete( iFullPath );
+    if ( err != KErrNone )
+        {
+        PRINT1( _L("MM MTP <> CSendObject::RemoveObjectFromFs err = %d"), err );
         }
+    PRINT( _L("MM MTP <= CSendObject::RemoveObjectFromFs") );
     }
 
 // end of file
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp	Tue May 11 16:40:32 2010 +0300
@@ -245,6 +245,10 @@
                         object->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
                         iFramework.ObjectMgr().ModifyObjectL( *object );
                         }
+                    else if ( KErrInUse == err ) // object file is being used by other program
+                        {
+                        responseCode = EMTPRespCodeDeviceBusy;
+                        }
                     else
                         {
                         responseCode = EMTPRespCodeGeneralError;
--- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp	Tue May 11 16:40:32 2010 +0300
@@ -300,6 +300,10 @@
                     iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
                     iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
                     }
+                else if ( KErrInUse == err ) // object file is being used by other program
+                    {
+                    responseCode = EMTPRespCodeDeviceBusy;
+                    }
                 else
                     {
                     responseCode = EMTPRespCodeGeneralError;
--- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp	Tue May 11 16:40:32 2010 +0300
@@ -291,21 +291,6 @@
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::DeleteObjectL" ) );
     }
 
-// ---------------------------------------------------------------------------
-// CMmMtpDpMetadataAccessWrapper::SetStorageRootL
-// Sets current Drive info
-// ---------------------------------------------------------------------------
-//
-void CMmMtpDpMetadataAccessWrapper::SetStorageRootL( const TDesC& aStorageRoot )
-    {
-    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetStorageRootL" ) );
-
-    iMmMtpDpMetadataVideoAccess->SetStorageRootL( aStorageRoot );
-    iMmMtpDpMetadataMpxAccess->SetStorageRootL( aStorageRoot );
-
-    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetStorageRootL" ) );
-    }
-
 // -----------------------------------------------------------------------------
 // CMmMtpDpMetadataMpxAccess::SetImageObjPropL
 // set image specific properties specific to videos
@@ -583,8 +568,6 @@
 //
 TBool CMmMtpDpMetadataAccessWrapper::IsExistL( const TDesC& aSuid )
     {
-    TParsePtrC parse( aSuid );
-    iMmMtpDpMetadataMpxAccess->SetStorageRootL( parse.Drive() );
     return iMmMtpDpMetadataMpxAccess->IsExistL( aSuid );
     }
 
@@ -627,26 +610,22 @@
     {
     PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::CreateDummyFile, filename = %S" ), &aPlaylistName );
 
-    if ( MmMtpDpUtility::FormatFromFilename( aPlaylistName ) ==
-        EMTPFormatCodeAbstractAudioVideoPlaylist )
+    RFile newfile;
+    TInt err = newfile.Replace( iFs, aPlaylistName, EFileWrite );
+
+    if ( err != KErrNone )
         {
-        RFile newfile;
-        TInt err = newfile.Replace( iFs, aPlaylistName, EFileWrite );
-
+        newfile.Close();
+        PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile err =  %d" ), err );
+        }
+    else // File created OK
+        {
+        err = newfile.Flush();
+        newfile.Close();
+        err = iFs.SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden,
+            KEntryAttReadOnly | KEntryAttNormal );
         if ( err != KErrNone )
-            {
-            newfile.Close();
-            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile err =  %d" ), err );
-            }
-        else // File created OK
-            {
-            err = newfile.Flush();
-            newfile.Close();
-            err = iFs.SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden,
-                KEntryAttReadOnly | KEntryAttNormal );
-            if ( err != KErrNone )
-                PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile Dummy Playlist file created. err = %d" ), err );
-            }
+            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile Dummy Playlist file created. err = %d" ), err );
         }
     }
 
@@ -685,7 +664,7 @@
             PRINT3( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile filename = %S, err %d, entry.iSize = %d" ),
                 &fileName, err, entry.iSize );
             }
-        else if ( format != EMTPFormatCodeM3UPlaylist )
+        else
             {
             TInt err = iFs.Delete( fileName );
 
@@ -693,11 +672,6 @@
                 &fileName,
                 err );
             }
-        else
-            {
-            // leave the Imported playlist in the file system
-            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile, Don't delete m3u file [%S]" ), &fileName );
-            }
         }
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) );
     }
@@ -707,8 +681,9 @@
 // Update Music collection
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL()
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL( const TDesC& aStorageRoot )
     {
+    iMmMtpDpMetadataMpxAccess->SetStorageRootL( aStorageRoot );
     iMmMtpDpMetadataMpxAccess->UpdateMusicCollectionL( );
     }
 
--- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp	Tue May 11 16:40:32 2010 +0300
@@ -62,6 +62,8 @@
 _LIT( KMpxCollectionGetReference, "MpxCollectionGetReference" );
 _LIT( KMpxCollectionFindAllLValidate, "MpxCollectionValidate" );
 _LIT( KMpxCollectionFindAllLBeforeAdd, "MpxCollectionFindAllLBeforeAdd" );
+_LIT( KMpxCollectionFindAllLModified, "MpxCollectionFindAllLModified" );
+_LIT( KMpxCollectionCleanupDeletedMediasL, "KMpxCollectionCleanupDeletedMediasL" );
 _LIT( KSetMetadataValue, "SetMetadataValueL" );
 #endif
 
@@ -80,7 +82,8 @@
     }
 
 CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs ):
-    iRfs( aRfs )
+    iRfs( aRfs ),
+    iSampleData( NULL )
     {
     // Do nothing
     }
@@ -111,6 +114,8 @@
         iCollectionHelper = NULL;
         }
 
+    delete iSampleData;
+
     // for performance measurement purpose
 #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG)
     delete iPerfLog;
@@ -393,7 +398,10 @@
         searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
         searchMedia->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId,
             KMtpInvalidSongID );
-        searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot );
+        if ( iStoreRoot.Length() > 0 )
+            {
+            searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot );
+            }
 
         RArray<TMPXAttribute> songAttributes;
         CleanupClosePushL( songAttributes ); // + songAttributes
@@ -455,8 +463,10 @@
 
     PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::FindWMPMediaLC searchMedia setup with no problems" ) );
 
+    PERFLOGSTART(KMpxCollectionFindAllLModified);
     CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia,
         songAttributes.Array() );
+    PERFLOGSTOP(KMpxCollectionFindAllLModified);
     PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::FindWMPMediaLC foundMedia assigned from FindAllL" ) );
 
     CleanupStack::PopAndDestroy( &songAttributes ); // - songAttributes
@@ -587,7 +597,9 @@
     // as there is NOT a separate database for deleted files.
     PRINT( _L( "MM MTP <> Deleting metadata for deleted files" ) );
 
+    PERFLOGSTART( KMpxCollectionCleanupDeletedMediasL );
     CollectionHelperL()->CleanupDeletedMediasL();
+    PERFLOGSTOP( KMpxCollectionCleanupDeletedMediasL );
 
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::UpdateMusicCollectionL" ) );
     }
@@ -685,6 +697,9 @@
     CollectionHelperL()->SetL( media );
     PERFLOGSTOP( KMpxCollectionSetL );
 
+    delete iSampleData;
+    iSampleData = NULL;
+
     CleanupStack::PopAndDestroy( 2, &contentIDs ); // - media, contentIDs
 
     PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL" ) );
@@ -881,16 +896,19 @@
             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();
+            delete iSampleData;
+            iSampleData = NULL;
+
+            iSampleData = HBufC8::NewL( numElements * sizeof( TUint8 ) );
+            TPtr8 samplePtr = iSampleData->Des();
             mtpTypeArray.ToDes( samplePtr );
             RFile sampleFile;
             CleanupClosePushL( sampleFile );
             User::LeaveIfError( sampleFile.Replace( iRfs, suid, EFileWrite ) );
             User::LeaveIfError( sampleFile.Write( samplePtr ) );
+            aMediaProp.SetTObjectValueL<TInt>( KMPXMediaMTPSampleData, (TInt)iSampleData );
+            aMediaProp.SetTObjectValueL<TBool>( attrib, ETrue );
             CleanupStack::PopAndDestroy( &sampleFile );
-            CleanupStack::PopAndDestroy( sampleData );
-            aMediaProp.SetTObjectValueL<TBool>( attrib, ETrue );
             PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL SampleData is ready = %u" ), 1 );
             }
             break;
@@ -926,7 +944,9 @@
     searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
     searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
     searchMedia->SetTextValueL( KMPXMediaGeneralUri, aFullFileName );
-    searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot );
+
+    TParsePtrC parse( aFullFileName );
+    searchMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
 
     RArray<TMPXAttribute> songAttributes;
     CleanupClosePushL( songAttributes ); // + songAttributes
@@ -1158,7 +1178,7 @@
         TParsePtrC parse( aRefFileArray[j] );
         media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
         media->SetTObjectValueL( KMPXMediaGeneralModified, EFalse );
-  
+
         // Add media into array contents
         abstractMediaArray->AppendL( media );
 
@@ -1568,7 +1588,9 @@
     searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
     searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist );
     searchMedia->SetTextValueL( KMPXMediaGeneralUri, aSuid );
-    searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot );
+
+    TParsePtrC parse( aSuid );
+    searchMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() );
 
     RArray<TMPXAttribute> playlistAttributes;
     CleanupClosePushL( playlistAttributes ); // + playlistAttributes
--- a/mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp	Tue May 11 16:40:32 2010 +0300
@@ -100,7 +100,8 @@
 #endif // __WINDOWS_MEDIA
             else if ( file.Ext().CompareF( KTxtExtensionODF ) == 0 )
                 {
-                HBufC8* mime = MmMtpDpUtility::OdfMimeTypeL( file.FullName() );
+                HBufC8* mime(NULL);
+                TRAP_IGNORE( mime = MmMtpDpUtility::OdfMimeTypeL( file.FullName() ) );
                 if ( mime != NULL )
                     {
                     // 3GP
--- a/mmappcomponents/playlistengine/group/bld.inf	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/playlistengine/group/bld.inf	Tue May 11 16:40:32 2010 +0300
@@ -23,9 +23,12 @@
 
 PRJ_EXPORTS
 ../rom/mpxplaylistengine.iby            CORE_MW_LAYER_IBY_EXPORT_PATH(mpxplaylistengine.iby)
-../rom/mpxplaylistrecognizerplugin.iby  CORE_MW_LAYER_IBY_EXPORT_PATH(mpxplaylistrecognizerplugin.iby)
+
+//MMMW has a generic recognizer that takes care of m3u files
+//../rom/mpxplaylistrecognizerplugin.iby  CORE_MW_LAYER_IBY_EXPORT_PATH(mpxplaylistrecognizerplugin.iby)
 
 PRJ_MMPFILES
-mpxplaylistrecognizer.mmp
+//MMMW has a generic recognizer that takes care of m3u files
+//mpxplaylistrecognizer.mmp
 mpxplaylistengine.mmp
 
--- a/mmappcomponents/playlistengine/inc/mpxplaylistrecognizer.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/playlistengine/inc/mpxplaylistrecognizer.h	Tue May 11 16:40:32 2010 +0300
@@ -29,6 +29,8 @@
 class CMPXPluginHandlerBase;
 
 /**
+*  Deprecated. replaced by playlist recognizer in mw/mmmw.
+*
 *  Concrete implementation of the recognizer API used to recognize playlist files.
 *
 *  This is used by the application framework, as well as CMPXPlaylistEngine to
--- a/mmappcomponents/playlistengine/src/mpxplaylistengine.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappcomponents/playlistengine/src/mpxplaylistengine.cpp	Tue May 11 16:40:32 2010 +0300
@@ -59,7 +59,6 @@
 #include "mpxplaylistenginedefs.hrh"
 #include "mpxplaylistplugin.h"
 #include "mpxplaylistengine.h"
-#include "mpxplaylistrecognizer.h"
 
 // ============================ CONSTANTS =====================================
 const TInt KMPXBufExpandSize = 0x40;
--- a/mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h	Tue May 11 16:40:32 2010 +0300
@@ -19,14 +19,17 @@
 #ifndef CMPXMETADATAEXTRACTOR_H
 #define CMPXMETADATAEXTRACTOR_H
 
+#include <thumbnailmanager.h>
+#include <thumbnailmanagerobserver.h>
+
+// FORWARD DECLARATION
 class CMPXMedia;
 class CMPXCollectionPath;
-class CMetaDataUtility;
 class CMPXFileInfoUtility;
 class CMPXDrmMediaUtility;
 class MMPXMetadataExtractorObserver;
-#include <thumbnailmanager.h>
-#include <thumbnailmanagerobserver.h>
+class CMetaDataUtility;
+class CMetaDataFieldContainer;
 
 /**
  *  Extracts metadata from a file.
@@ -230,6 +233,13 @@
      * @since 9.2 
      */
     void CleanUp();
+        
+    /**
+     * Sets drm media properties
+     * @since 9.2 
+     */
+    void SetDrmMediaPropertiesL(const CMetaDataFieldContainer& aMetaCont);
+
     
 private:
 
--- a/mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h	Tue Apr 27 17:09:22 2010 +0300
+++ b/mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h	Tue May 11 16:40:32 2010 +0300
@@ -35,6 +35,7 @@
 */    
 const TMPXAttributeData KMPXMediaMTPDrmStatus = {KMPXMediaIdMTP, 0x0001}; // TUint16
 const TMPXAttributeData KMPXMediaMTPSampleDataFlag = {KMPXMediaIdMTP, 0x0002}; // TBool
+const TMPXAttributeData KMPXMediaMTPSampleData = {KMPXMediaIdMTP, 0x0004}; // HBufC8*
 const TMPXAttributeData KMPXMediaMTPAll = {KMPXMediaIdMTP, 0xffffffff};
 
 #endif // MPXMEDIAMTPDEFS_H
--- a/mpx/collectionframework/collectionutility/src/mpxcollectionplaylist.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mpx/collectionframework/collectionutility/src/mpxcollectionplaylist.cpp	Tue May 11 16:40:32 2010 +0300
@@ -1256,6 +1256,19 @@
         if( changeType == EMPXItemDeleted )
             {
             refresh = ETrue;
+            MPX_DEBUG1("CMPXCollectionPlaylist::DoHandleCollectionChangeMessageL -- current item deleted");
+            
+            TBool lastItemDeleted( iItemIndex == 0 && iItemIndexes.Count() == 1 );
+            
+            if ( lastItemDeleted ) // playlist is now empty, notify observer immediately
+                {
+                MPX_DEBUG1("CMPXCollectionPlaylist::DoHandleCollectionChangeMessageL -- last playlist item deleted");
+                Invalidate();
+                if ( iPlObs )
+                    {
+                    iPlObs->HandleCollectionPlaylistChange(KErrEof);
+                    }
+                }
             }
         // Modified
         else if( changeType == EMPXItemModified )
@@ -1333,7 +1346,8 @@
             }
         }
 
-    if (iAutoPlaylist && refresh)
+    // update playlist immediately when item is deleted in order to detect deletion of the last item in the playlist
+    if ( refresh && iItemIndexes.Count() > 0 )
         {
         // For autoplaylist, affected by the event.
         // Path clip will never happen for autoplaylist
--- a/mpx/commonframework/common/src/mpxpluginmonitor.cpp	Tue Apr 27 17:09:22 2010 +0300
+++ b/mpx/commonframework/common/src/mpxpluginmonitor.cpp	Tue May 11 16:40:32 2010 +0300
@@ -145,8 +145,11 @@
     MPX_DEBUG3("CMPXPluginMonitor::RunError interface id 0x%08x, error",
                iInterfaceUid.iUid, aError);
     // Restart observer
-    iECs.NotifyOnChange(iStatus);
-    SetActive();
+    if ( !IsActive() )
+        {
+        iECs.NotifyOnChange(iStatus);
+        SetActive();
+        }
     return KErrNone;
     }