mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp
changeset 0 a2952bb97e68
child 9 bee149131e4b
child 25 d881023c13eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,587 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Meta data access wrapper
+*
+*/
+
+
+#include <bautils.h>
+#include <e32math.h>
+#include <mtp/mmtpdataproviderframework.h>
+#include <e32property.h>
+#include <MtpPrivatePSKeys.h>
+
+#include "cmmmtpdpmetadataaccesswrapper.h"
+#include "cmmmtpdpmetadatampxaccess.h"
+#include "cmmmtpdpmetadatavideoaccess.h"
+#include "mmmtpdputility.h"
+#include "mmmtpdplogger.h"
+
+const TInt KMMMTPDummyFileArrayGranularity = 5;
+
+CMmMtpDpMetadataAccessWrapper* CMmMtpDpMetadataAccessWrapper::NewL( RFs& aRfs, 
+    MMTPDataProviderFramework& aFramework )
+    {
+    CMmMtpDpMetadataAccessWrapper* me = new (ELeave) CMmMtpDpMetadataAccessWrapper( aRfs, aFramework );
+    CleanupStack::PushL( me );
+    me->ConstructL();
+    CleanupStack::Pop( me );
+    
+    return me;
+    }
+
+CMmMtpDpMetadataAccessWrapper::CMmMtpDpMetadataAccessWrapper( RFs& aRfs, 
+    MMTPDataProviderFramework& aFramework ) :
+    iRfs( aRfs ),
+    iFramework( aFramework )
+    {
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::ConstructL
+// Second-phase
+// ---------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::ConstructL()
+    {
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::ConstructL" ) );
+
+    iMmMtpDpMetadataMpxAccess = CMmMtpDpMetadataMpxAccess::NewL( iRfs, iFramework );
+
+    iMmMtpDpMetadataVideoAccess = CMmMtpDpMetadataVideoAccess::NewL( iRfs );
+    
+    iPlaylistArray = new ( ELeave ) CDesCArrayFlat( KMMMTPDummyFileArrayGranularity );
+    
+    // Create the PS key to notify subscribers that MTP mode is activated
+    _LIT_SECURITY_POLICY_C1(KKeyReadPolicy, ECapabilityReadUserData);
+    _LIT_SECURITY_POLICY_C1(KKeyWritePolicy, ECapabilityWriteUserData);
+    RProperty::Define( KMtpPSUid, 
+                       KMtpPSStatus, 
+                       RProperty::EInt, 
+                       KKeyReadPolicy, 
+                       KKeyWritePolicy);
+
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::ConstructL" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::~CMmMtpDpMetadataAccessWrapper
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMmMtpDpMetadataAccessWrapper::~CMmMtpDpMetadataAccessWrapper()
+    {
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::~CMmMtpDpMetadataAccessWrapper" ) );
+    RemoveDummyFiles();
+
+    delete iPlaylistArray;
+
+    delete iMmMtpDpMetadataVideoAccess;
+    delete iMmMtpDpMetadataMpxAccess;
+    
+    // unblock MPX
+    RProperty::Set( KMtpPSUid, 
+                    KMtpPSStatus, 
+                    EMtpPSStatusUninitialized);
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::~CMmMtpDpMetadataAccessWrapper" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::SetPlaylist
+// Set playlist to DB
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::SetPlaylistL( const TDesC& aPlaylistFileName, CDesCArray& aRefFileArray )
+    {
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetPlaylistL aPlaylistFileName = %S" ), &aPlaylistFileName );
+
+    if ( !MmMtpDpUtility::IsVideoL( aPlaylistFileName, iFramework ) )
+        {
+        iMmMtpDpMetadataMpxAccess->SetPlaylistL( aPlaylistFileName, aRefFileArray );
+        }
+
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetPlaylistL" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::AddMediaL
+// Gets a piece of metadata from the collection
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL( const TUint16 aPropCode,
+    MMTPType& aNewData,
+    const CMTPObjectMetaData& aObjectMetaData )
+    {
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL" ) );
+
+    TPtrC fullFileName( aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ) );
+    if ( !MmMtpDpUtility::IsVideoL( fullFileName, iFramework ) )
+        {
+        iMmMtpDpMetadataMpxAccess->GetObjectMetadataValueL( aPropCode,
+            aNewData,
+            aObjectMetaData );
+        }
+    else
+        {
+        iMmMtpDpMetadataVideoAccess->GetObjectMetadataValueL( aPropCode,
+            aNewData,
+            aObjectMetaData );
+        }
+
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL
+// Sets a piece of metadata in the collection
+// ---------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL( const TUint16 aPropCode,
+    const MMTPType& aNewData,
+    const CMTPObjectMetaData& aObjectMetaData )
+    {
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL" ) );
+
+    TPtrC fullFileName( aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ) );
+    if ( MmMtpDpUtility::IsVideoL( fullFileName, iFramework ) )
+        {
+        iMmMtpDpMetadataVideoAccess->SetObjectMetadataValueL( aPropCode,
+            aNewData,
+            aObjectMetaData );
+        }
+    else
+        {
+        iMmMtpDpMetadataMpxAccess->SetObjectMetadataValueL( aPropCode,
+            aNewData,
+            aObjectMetaData );
+        }
+
+
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL
+// Renames the file part of a record in the collection database
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::RenameObjectL( const TDesC& aOldFileName,
+    const TDesC& aNewFileName )
+    {
+    PRINT2( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RenameObjectL old = %S, new = %S" ),
+        &aOldFileName,
+        &aNewFileName );
+    
+   TMTPFormatCode formatCode = MmMtpDpUtility::FormatFromFilename( aOldFileName );
+    if ( formatCode == EMTPFormatCodeWMV )
+        {
+        iMmMtpDpMetadataVideoAccess->RenameRecordL( aOldFileName, aNewFileName );
+        }
+    else
+        {
+        if ( !MmMtpDpUtility::IsVideoL( aNewFileName , iFramework ) )
+            {
+            iMmMtpDpMetadataMpxAccess->RenameObjectL( aOldFileName, aNewFileName, formatCode );
+            }
+        else
+            {
+            iMmMtpDpMetadataVideoAccess->RenameRecordL( aOldFileName, aNewFileName );
+            }
+        }
+
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RenameObjectL" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL
+// Deletes metadata information associated with the object
+// ---------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::DeleteObjectL( const TDesC& aFullFileName,
+    const TUint aFormatCode )
+    {
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::DeleteObjectL" ) );
+
+    TMPXGeneralCategory category = Category( aFormatCode );
+    
+    // Have to do this.  File might not be in file system anymore, have to 
+    // reply on ObjectManager
+    if ( ( aFormatCode == EMTPFormatCodeMP4Container )
+        || ( aFormatCode == EMTPFormatCode3GPContainer )
+        || ( aFormatCode == EMTPFormatCodeASF ) )
+        {
+        if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) )
+            {
+            category = EMPXVideo;
+            }
+        else
+            {
+            category = EMPXSong;
+            }
+        }
+    
+    switch ( category )
+        {
+        case EMPXPlaylist:
+        case EMPXSong:
+            {
+            iMmMtpDpMetadataMpxAccess->DeleteObjectL( aFullFileName, category );
+            }
+            break;
+
+        case EMPXVideo:
+            {
+            iMmMtpDpMetadataVideoAccess->DeleteRecordL( aFullFileName );
+            }
+            break;
+
+        default:
+            PRINT( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::DeleteObjectL default" ) );
+            break;
+        }
+
+    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
+// -----------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::SetImageObjPropL( const TDesC& aFullFileName,
+    const TUint32 aWidth,
+    const TUint32 aHeight )
+    {
+    if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) )
+        {
+        iMmMtpDpMetadataVideoAccess->SetStorageRootL( aFullFileName );
+        iMmMtpDpMetadataVideoAccess->SetImageObjPropL( aFullFileName, aWidth, aHeight );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmMtpDpMetadataMpxAccess::GetImageObjPropL
+// get image specific properties specific to videos
+// -----------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::GetImageObjPropL( const TDesC& aFullFileName,
+    TUint32& aWidth,
+    TUint32& aHeight )
+    {
+    if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) )
+        {
+        iMmMtpDpMetadataVideoAccess->SetStorageRootL( aFullFileName );
+        iMmMtpDpMetadataVideoAccess->GetImageObjPropL( aFullFileName, aWidth, aHeight );
+        }
+    }
+// ----------------------------------------------------------------------------- 
+// CMmMtpDpMetadataAccessWrapper::OpenSessionL
+// Called when the MTP session is initialised
+// -----------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::OpenSessionL()
+    {
+    iOpenSession = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::CloseSessionL
+//
+// -----------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::CloseSessionL()
+    {
+    if ( iOpenSession )
+        {
+        PRINT( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CloseSessionL close" ) );
+        iMmMtpDpMetadataVideoAccess->CloseSessionL();
+        iOpenSession = EFalse;
+        }
+    else
+        {
+        PRINT( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CloseSessionL alreay close" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::Category
+// Get category according format code
+// ---------------------------------------------------------------------------
+//
+TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::Category( const TUint aFormatCode )
+    {
+    TMPXGeneralCategory category = EMPXNoCategory;
+    switch ( aFormatCode )
+        {
+        case EMTPFormatCodeMP3:
+        case EMTPFormatCodeWAV:
+        case EMTPFormatCodeWMA:
+        case EMTPFormatCodeAAC:
+        case EMTPFormatCodeASF:
+        case EMTPFormatCodeMP4Container:
+        case EMTPFormatCode3GPContainer:
+            {
+            category = EMPXSong;
+            }
+            break;
+
+        case EMTPFormatCodeAbstractAudioVideoPlaylist:
+            {
+            category = EMPXPlaylist;
+            }
+            break;
+
+        case EMTPFormatCodeWMV:
+            {
+            category = EMPXVideo;
+            }
+            break;
+
+        default:
+            break;
+        }
+    return category;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::GetAllPlaylistL
+// 
+// ---------------------------------------------------------------------------
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::GetAllPlaylistL( const TDesC& aStoreRoot, CMPXMediaArray** aPlaylists )
+    {
+    iMmMtpDpMetadataMpxAccess->GetAllPlaylistL( aStoreRoot, aPlaylists );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::GetAllReferenceL
+// 
+// ---------------------------------------------------------------------------
+//s
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::GetAllReferenceL( CMPXMedia* aPlaylist, CDesCArray& aReferences )
+    {
+    iMmMtpDpMetadataMpxAccess->GetAllReferenceL( aPlaylist, aReferences );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::GetPlaylistNameL
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::GetPlaylistNameL( CMPXMedia* aPlaylist, TDes& aPlaylistName )
+    {
+    iMmMtpDpMetadataMpxAccess->GetPlaylistNameL( aPlaylist, aPlaylistName );
+    }
+
+// ----------------------------------------------------------------------------- 
+// CMmMtpDpMetadataAccessWrapper::AddObjectL
+// Add object (music, video and playlist) info to DB
+// -----------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::AddObjectL( const TDesC& aFullFileName, TBool aIsVideo /*= EFalse */ )
+    {
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL aFullFileName = %S" ), &aFullFileName );
+
+    if ( aFullFileName.Length() <= 0)
+        {
+        User::Leave( KErrArgument );
+        }
+    if ( aIsVideo )
+        {
+        PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL Addvideo" ) );
+        iMmMtpDpMetadataVideoAccess->AddVideoL( aFullFileName );
+        }
+    else
+        {
+        if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) )
+            {
+            PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL Addvideo" ) );
+            iMmMtpDpMetadataVideoAccess->AddVideoL( aFullFileName );
+            }
+        else
+            {
+            TMTPFormatCode formatCode = MmMtpDpUtility::FormatFromFilename( aFullFileName );
+
+            if ( formatCode == EMTPFormatCodeM3UPlaylist
+                || formatCode == EMTPFormatCodeMPLPlaylist
+                || formatCode == EMTPFormatCodeAbstractAudioVideoPlaylist
+                || formatCode == EMTPFormatCodeAbstractAudioPlaylist
+                || formatCode == EMTPFormatCodeAbstractVideoPlaylist
+                || formatCode == EMTPFormatCodeASXPlaylist
+                || formatCode == EMTPFormatCodePLSPlaylist )
+                {
+                PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddPlaylist" ) );
+                iMmMtpDpMetadataMpxAccess->AddPlaylistL( aFullFileName );
+                }
+            else
+                {
+                PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddSong" ) );
+                iMmMtpDpMetadataMpxAccess->AddSongL( aFullFileName );
+                }
+            }
+        }
+
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::AddObjectL" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::GetModifiedContentL
+// Get Modified content
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::GetModifiedContentL( const TDesC& aStorageRoot, 
+    TInt& arrayCount, 
+    CDesCArray& aModifiedcontent )
+    {
+    iMmMtpDpMetadataMpxAccess->SetStorageRootL( aStorageRoot );
+    iMmMtpDpMetadataMpxAccess->GetModifiedContentL( arrayCount, aModifiedcontent );
+    }
+
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::CleanupDatabaseL()
+    {
+    iMmMtpDpMetadataVideoAccess->CleanupDatabaseL();
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::IsExistL
+// if the playlsit exist in the MPX DB
+// ---------------------------------------------------------------------------
+//
+TBool CMmMtpDpMetadataAccessWrapper::IsExistL( const TDesC& aSuid )
+    {
+    TParsePtrC parse( aSuid );
+    iMmMtpDpMetadataMpxAccess->SetStorageRootL( parse.Drive() );
+    return iMmMtpDpMetadataMpxAccess->IsExistL( aSuid );
+    }
+
+// ----------------------------------------------------------------------------- 
+// CMmMtpDpMetadataAccessWrapper::AddDummyFile
+// Add one dummy file to dummy files array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::AddDummyFileL( const TDesC& aDummyFileName )
+    {
+    PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::AddDummyFile aDummyFileName(%S)" ), &aDummyFileName );
+    iPlaylistArray->AppendL( aDummyFileName );
+    }
+
+// ----------------------------------------------------------------------------- 
+// CMmMtpDpMetadataAccessWrapper::DeleteDummyFile
+// Delete one dummy file from dummy files array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::DeleteDummyFile( const TDesC& aDummyFileName )
+    {
+    PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::DeleteDummyFile aDummyFileName(%S)" ), &aDummyFileName );
+    TInt pos = 0;
+    if ( iPlaylistArray->Count() > 0 )
+        {
+        if ( 0 == iPlaylistArray->Find( aDummyFileName, pos ) )
+            {
+            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::DeleteDummyFile pos = %d" ), pos );
+            iPlaylistArray->Delete( pos );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::CreateDummyFile
+// Create a Dummy File from the virtual playlist URI
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::CreateDummyFile( const TDesC& aPlaylistName )
+    {
+    PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::CreateDummyFile, filename = %S" ), &aPlaylistName );
+
+    if ( MmMtpDpUtility::FormatFromFilename( aPlaylistName ) ==
+        EMTPFormatCodeAbstractAudioVideoPlaylist )
+        {
+        RFile newfile;
+        TInt err = newfile.Replace( iFramework.Fs(), aPlaylistName, EFileWrite );
+
+        if ( err != KErrNone )
+            {
+            newfile.Close();
+            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile err =  %d" ), err );
+            }
+        else // File created OK
+            {
+            err = newfile.Flush();
+            newfile.Close();
+            err = iFramework.Fs().SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden,
+                KEntryAttReadOnly | KEntryAttNormal );
+            if ( err != KErrNone )
+                PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile Dummy Playlist file created. err = %d" ), err );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles
+// Remove all dummy file of which format is "pla", and leave the "m3u"
+// -----------------------------------------------------------------------------
+//
+void CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles()
+    {
+    PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) );
+    
+    TInt count = iPlaylistArray->Count();
+    // Check if playlist file is a dummy file or an imported file
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( MmMtpDpUtility::FormatFromFilename( (*iPlaylistArray)[i] ) !=
+            EMTPFormatCodeM3UPlaylist )
+            {
+            // delete the virtual playlist
+            // iFramework has release don't use iFramework.FS()
+            TInt err = iRfs.Delete( (*iPlaylistArray)[i] );
+
+            PRINT2( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile filename = %S, err %d" ),
+                &( (*iPlaylistArray)[i] ),
+                err );
+            }
+        else
+            {
+            // leave the Imported playlist in the file system
+            PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile, Don't delete m3u file [%S]" ), &( (*iPlaylistArray)[i] ) );
+            }
+        }
+    PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL
+// Update Music collection
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL() 
+    {
+    iMmMtpDpMetadataMpxAccess->UpdateMusicCollectionL( );
+    }
+
+// end of file