omads/omadsextensions/adapters/mediads/src/mediamanager.cpp
branchRCL_3
changeset 25 4f0867e42d62
parent 24 8e7494275d3a
child 26 3e6957da2ff8
--- a/omads/omadsextensions/adapters/mediads/src/mediamanager.cpp	Tue Aug 31 15:05:37 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1254 +0,0 @@
-/*
-* Copyright (c) 2009-2010 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:  CMediaManager class implementation
-*
-*/
-
-
-
-#include "mediamanager.h"
-
-#include <mpxmedia.h>
-#include <mpxmediageneraldefs.h>
-#include <mpxcollectionhelper.h>
-#include <mpxmediacontainerdefs.h>
-#include <mpxmediaarray.h>
-#include <mpxcollectionhelperfactory.h>
-#include <mpxcollectionhelper.h>
-#include <utf.h>
-#include <mpxplaylistenginedefs.h> // for EMPXPlaylistTypeM3U
-#include <mpxcollectiontype.h>
-#include <mpxmediamusicdefs.h>
-#include <mpxcollectionplugin.hrh>
-#include <PathInfo.h>
-#include <mpxmediaaudiodefs.h>
-#include <mpxmediamtpdefs.h>
-#include <driveinfo.h>
-
-#include "mediadsproviderdefs.h"
-#include "playlistitem.h"
-#include "logger.h"
-
-
-const TUid KMpxLocalCollectionUid = { 0x101FFC3A };
-
-_LIT( KPlaylistPath, "playlists\\" );
-_LIT( KMPXVirtualPlaylistExt, ".vir" );
-
-// Maximum amount of song items to be enumerated on one RunL.
-const TInt iMaxSongItemsToEnumerate(100);
-// Maximum amount of playlist items to be enumerated on one RunL.
-const TInt iMaxPlaylistItemsToEnumerate(15);
-
-
-CMediaManager::CMediaManager( RFs& aFs, MMediaManagerObserver* aObserver,
-        TKeyArrayFix aKey, CMD5& aHasher  )
-: CActive( EPriorityStandard ),
-iObserver( aObserver ),
-iKey( aKey ),
-iHasher( aHasher ),
-iFs( aFs )
-    {
-    TRACE_FUNC;
-    CActiveScheduler::Add(this);
-    }
-
-
-void CMediaManager::ConstructL()
-    {
-    TRACE_FUNC_ENTRY;
-    iHarvester = CMPXHarvesterFactory::NewL();
-    LOGGER_WRITE("1");
-    iCollection = MMPXCollectionUtility::NewL( iObserver );
-    LOGGER_WRITE("2");
-    iMediator = CMPXCollectionMediator::NewL( iCollection->Collection() );
-    LOGGER_WRITE("3");
-    iCollectionHelper = CMPXCollectionHelperFactory::NewCollectionCachedHelperL();   
-    
-    TRACE_FUNC_EXIT;
-    }
-
-
-CMediaManager* CMediaManager::NewL( RFs& aFs, MMediaManagerObserver* aObserver, TKeyArrayFix aKey, CMD5& aHasher )
-    {
-    CMediaManager* self = new( ELeave ) CMediaManager( aFs, aObserver, aKey, aHasher );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-
-// ---------------------------------------------------------------------------
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CMediaManager::~CMediaManager()
-    {
-    TRACE_FUNC_ENTRY;
-    Cancel();
-    delete iFoundedMedia;
-    if ( iCollectionHelper )
-        {
-        iCollectionHelper->Close();
-        iCollectionHelper = NULL;
-        }
-    
-    delete iMediator;
-    
-    if ( iCollection )
-        {
-        iCollection->Close();
-        iCollection = NULL;
-        }
-    
-    if ( iHarvester )
-        {
-        // For some unknown reason this may sometimes leave with error code -38
-        TRAP_IGNORE( iHarvester->Close() );
-        iHarvester = NULL;
-        }
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::ScanL()
-    {
-    TRACE_FUNC_ENTRY;
-    iHarvester->ScanL();
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::CancelScanL()
-    {
-    TRACE_FUNC_ENTRY;
-    iHarvester->CancelScanL();
-    TRACE_FUNC_EXIT;
-    }
-
-// --------------------------------------------------------------------------
-// Starts registering all playlists. Calls RegisterAllPlayListsCompleted when ready
-// --------------------------------------------------------------------------
-// 
-TInt CMediaManager::RegisterAllPlayLists()
-    {
-    TRACE_FUNC_ENTRY;
-    if ( iCurrentState != EIdle || !iSnapshotArray)
-        {
-        LOGGER_WRITE("Not Idle or iSnapshotArray is NULL");
-        return KErrNotReady;
-        }
-    iCurrentState = EReadingPlaylistCount;
-    SetActive();
-    TRequestStatus* status = &iStatus;
-    User::RequestComplete( status, KErrNone );
-    TRACE_FUNC_EXIT;
-    return KErrNone;
-    }
-
-// --------------------------------------------------------------------------
-// Starts registering all song items. Calls RegisterAllSongsCompleted when ready
-// --------------------------------------------------------------------------
-// 
-TInt CMediaManager::RegisterAllSongs()
-    {
-    TRACE_FUNC_ENTRY;
-    if ( iCurrentState != EIdle || !iSnapshotArray)
-        {
-        LOGGER_WRITE("Not Idle or iSnapshotArray is NULL");
-        return KErrNotReady;
-        }
-    iCurrentState = EReadingSongCount;
-    SetActive();
-    TRequestStatus* status = &iStatus;
-    User::RequestComplete( status, KErrNone );
-    TRACE_FUNC_EXIT;
-    return KErrNone;
-    }
-
-// --------------------------------------------------------------------------
-// Registers playlist.
-// --------------------------------------------------------------------------
-// 
-void CMediaManager::RegisterPlaylistL( const CMPXMedia& aMedia )
-    {
-    TRACE_FUNC_ENTRY;
-    if ( !iSnapshotArray )
-        {
-        User::Leave( KErrGeneral );
-        }
-    
-    if ( !aMedia.IsSupported(KMPXMediaGeneralId) )
-        {
-        LOGGER_WRITE("KMPXMediaGeneralId not supported");
-        User::Leave(KErrNotSupported);
-        }
-     
-     // Extract the playlist id from the found object
-     TUint32 playlistId = *aMedia.Value<TMPXItemId>(KMPXMediaGeneralId);
-     LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId);
-     
-     if ( !aMedia.IsSupported( KMPXMediaGeneralTitle ) )
-          {
-          LOGGER_WRITE("KMPXMediaGeneralTitle not supported");
-          User::Leave(KErrNotSupported);
-          }
-     
-     CPlaylistItem* playlist = CPlaylistItem::NewLC();
-     // find the media object that contains a list of songs in the playlist
-     
-     RArray<TInt> contentIDs;
-     CleanupClosePushL( contentIDs );
-     contentIDs.AppendL(KMPXMediaIdGeneral);
-     
-     CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array());
-     CleanupStack::PopAndDestroy( &contentIDs );
-     CleanupStack::PushL(searchMedia);
-     
-     searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup);    
-     searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong);
-     searchMedia->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, playlistId);
-     
-     RArray<TMPXAttribute> songAttributes;
-     CleanupClosePushL(songAttributes);
-     songAttributes.AppendL(KMPXMediaGeneralId);
-     songAttributes.AppendL(KMPXMediaGeneralUri);
-     
-     CMPXMedia* foundMedia = iCollectionHelper->FindAllL(*searchMedia, 
-                                                         songAttributes.Array());
-     CleanupStack::PopAndDestroy(&songAttributes);
-     CleanupStack::PopAndDestroy(searchMedia);
-     
-     CleanupStack::PushL(foundMedia);
-     
-     
-     if ( !foundMedia->IsSupported(KMPXMediaArrayCount) )
-         {
-         User::Leave(KErrNotSupported);
-         }
-     
-     // Number of references
-     TInt numOfRefs = *foundMedia->Value<TInt>(KMPXMediaArrayCount);
-     if ( numOfRefs )
-         {
-         if (!foundMedia->IsSupported(KMPXMediaArrayContents))
-             {
-             User::Leave(KErrNotSupported);
-             }
-         
-         const CMPXMediaArray* refArray =
-             foundMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
-         
-         // Import the references
-         for (TInt i=0;i<numOfRefs;i++)
-             {
-             const CMPXMedia* refMedia = (*refArray)[i];
-             
-             if ( refMedia->IsSupported(KMPXMediaGeneralUri) )
-                 {
-                 const TDesC& uri = refMedia->ValueText(KMPXMediaGeneralUri);
-                 playlist->AddItemL( uri );
-                 }
-             
-             }
-         }
-    
-    TSnapshotItem playlistItem(playlistId);
-    
-    const TDesC& title = aMedia.ValueText( KMPXMediaGeneralTitle );
-    playlist->SetTitleL( title );
-    
-    const TDesC& uri = aMedia.ValueText( KMPXMediaGeneralUri );
-    playlist->SetUrlL( uri );
-    
-    playlistItem.SetItemHash( *playlist, iHasher );
-    
-    playlistItem.SetParentId( KPlaylistsFolderId );
-    TKeyArrayFix key( iKey );
-    iSnapshotArray->InsertIsqL( playlistItem, key );
-    
-    CleanupStack::PopAndDestroy( foundMedia );
-    CleanupStack::PopAndDestroy( playlist );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// --------------------------------------------------------------------------
-// Populates CPlaylistItem
-// --------------------------------------------------------------------------
-// 
-void CMediaManager::GetPlayListL( TInt aPlaylistId, CPlaylistItem& aList )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    LOGGER_WRITE_1("aPlaylistId: %d", aPlaylistId);
-    
-    CMPXMedia* playlistItem = FindPlaylistL( aPlaylistId );
-    CleanupStack::PushL( playlistItem );
-    if ( !playlistItem->IsSupported(KMPXMediaGeneralId) )
-        {
-        LOGGER_WRITE("KMPXMediaGeneralId not supported");
-        User::Leave(KErrNotSupported);
-        }
-    
-    // Extract the playlist id from the found object
-    TUint32 playlistId = *playlistItem->Value<TMPXItemId>(KMPXMediaGeneralId);
-    LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId);
-    aList.SetId( playlistId );
-    
-    if ( !playlistItem->IsSupported(KMPXMediaGeneralTitle) )
-        {
-        LOGGER_WRITE("KMPXMediaGeneralTitle not supported");
-        User::Leave( KErrNotSupported );
-        }
-    else
-        {
-        const TDesC& title = playlistItem->ValueText(KMPXMediaGeneralTitle);
-        LOGGER_WRITE_1("KMPXMediaGeneralTitle: %S", &title);
-        aList.SetTitleL( title );
-        }
-    
-    if ( playlistItem->IsSupported( KMPXMediaGeneralUri ) )
-        {
-        const TDesC& uri = playlistItem->ValueText( KMPXMediaGeneralUri );
-        aList.SetUrlL( uri );
-        }
-    
-    CleanupStack::PopAndDestroy( playlistItem );
-    
-    CMPXMedia* playlist = FetchPlaylistContentL( aPlaylistId );
-    CleanupStack::PushL( playlist );
-    
-    if ( !playlist->IsSupported(KMPXMediaArrayCount) )
-         {
-         User::Leave(KErrNotSupported);
-         }
-     
-    // Number of references
-    TInt numOfRefs = *playlist->Value<TInt>(KMPXMediaArrayCount);
-    LOGGER_WRITE_1("numOfRefs: %d", numOfRefs);
-    if ( numOfRefs )
-        {
-        if (!playlist->IsSupported(KMPXMediaArrayContents))
-            {
-            User::Leave(KErrNotSupported);
-            }
-        
-        const CMPXMediaArray* refArray =
-        playlist->Value<CMPXMediaArray>(KMPXMediaArrayContents);
-        
-        // Import the references
-        for (TInt i=0;i<numOfRefs;i++)
-            {
-            const CMPXMedia* refMedia = (*refArray)[i];
-            
-            if ( refMedia->IsSupported(KMPXMediaGeneralUri) )
-                {
-                aList.AddItemL( refMedia->ValueText(KMPXMediaGeneralUri) );
-                }
-            }
-        }
- 
-    CleanupStack::PopAndDestroy( playlist );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-// --------------------------------------------------------------------------
-// Fetch a playlist content
-// --------------------------------------------------------------------------
-// 
-CMPXMedia* CMediaManager::FetchPlaylistContentL( TInt aId )
-    {
-    TRACE_FUNC_ENTRY;
-    TMPXItemId id(aId);
-
-    CMPXMedia* criteria = CMPXMedia::NewL();
-    CleanupStack::PushL( criteria );
-    criteria->SetTObjectValueL<TUid>(
-            KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
-    criteria->SetTObjectValueL<TMPXGeneralType>(
-            KMPXMediaGeneralType, EMPXGroup );
-    
-    // set search keys
-    criteria->SetTObjectValueL<TMPXGeneralCategory>(
-            KMPXMediaGeneralCategory, EMPXSong );    
-    criteria->SetTObjectValueL<TMPXItemId>(
-            KMPXMediaGeneralId, id );
-    
-    // define attributes fetched
-    RArray<TMPXAttribute> songAttributes;
-    CleanupClosePushL(songAttributes);
-    songAttributes.AppendL(KMPXMediaGeneralId);
-    songAttributes.AppendL(KMPXMediaGeneralUri);
-    
-    // now find
-    CMPXMedia* result = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() );
-    CleanupStack::PopAndDestroy( &songAttributes );
-    CleanupStack::PopAndDestroy( criteria );
-    
-    TRACE_FUNC_EXIT;
-    return result;
-    }
-
-
- // --------------------------------------------------------------------------
- // Find a playlist
- // --------------------------------------------------------------------------
- //
- CMPXMedia* CMediaManager::FindPlaylistL( TInt aUid )
-     {
-     TRACE_FUNC_ENTRY;
-     CMPXMedia* criteria = CMPXMedia::NewL();
-     CleanupStack::PushL( criteria );
-     
-     criteria->SetTObjectValueL<TMPXGeneralType>(
-                 KMPXMediaGeneralType, EMPXItem );
-     criteria->SetTObjectValueL<TMPXGeneralCategory>(
-                 KMPXMediaGeneralCategory, EMPXPlaylist );
-     criteria->SetTObjectValueL<TMPXItemId>(
-                 KMPXMediaGeneralId, aUid );
-         
-     // define attributes fetched
-     RArray<TMPXAttribute> playlistAttributes;
-     CleanupClosePushL(playlistAttributes);
-     playlistAttributes.AppendL(KMPXMediaGeneralId);
-     playlistAttributes.AppendL(KMPXMediaGeneralCollectionId); //test
-     playlistAttributes.AppendL(KMPXMediaGeneralTitle);
-     playlistAttributes.AppendL(KMPXMediaGeneralUri);
-     
-     // now find
-     CMPXMedia* foundList = 0;
-     foundList = iCollectionHelper->FindAllL( *criteria , playlistAttributes.Array() );
-     CleanupStack::PopAndDestroy( &playlistAttributes );
-     CleanupStack::PopAndDestroy( criteria );
-     
-     CleanupStack::PushL( foundList );
-     
-     if ( !foundList->IsSupported(KMPXMediaArrayCount) )
-         {
-         LOGGER_WRITE("KMPXMediaArrayCount not supported");
-         User::Leave( KErrNotSupported );
-         }
-     
-     TInt foundItemCount = *foundList->Value<TInt>(KMPXMediaArrayCount);
-     
-     CMPXMedia* playlist(NULL);
-     if ( foundItemCount )
-         {
-         if ( !foundList->IsSupported(KMPXMediaArrayContents) )
-             {
-             LOGGER_WRITE("KMPXMediaArrayContents not supported");
-             User::Leave(KErrNotSupported);
-             }
-             
-         const CMPXMediaArray* foundArray = foundList->Value<CMPXMediaArray>(KMPXMediaArrayContents);
-         
-         // get the first founded item
-         playlist = CMPXMedia::NewL(*(*foundArray)[0]);
-         }
-     else
-         {
-         User::Leave( KErrGeneral );
-         }
-     
-     CleanupStack::PopAndDestroy( foundList );
-     
-     TRACE_FUNC_EXIT;
-     return playlist;
-     }
-
-void CMediaManager::GetSongL( TInt aSongId, CSongItem& aSongItem )
-    {
-    TRACE_FUNC_ENTRY;
-    TMPXItemId id(aSongId);
-
-    RArray<TInt> contentIDs;
-    CleanupClosePushL( contentIDs );
-    contentIDs.AppendL( KMPXMediaIdMusic );
-    contentIDs.AppendL( KMPXMediaIdGeneral );
-    
-    CMPXMedia* criteria = CMPXMedia::NewL(contentIDs.Array());
-    CleanupStack::PopAndDestroy( &contentIDs );
-    CleanupStack::PushL(criteria);
-    
-    // set search keys
-    criteria->SetTObjectValueL<TMPXGeneralType>(
-            KMPXMediaGeneralType, EMPXItem );
-    criteria->SetTObjectValueL<TMPXGeneralCategory>(
-            KMPXMediaGeneralCategory, EMPXSong );   
-    criteria->SetTObjectValueL<TMPXItemId>(
-            KMPXMediaGeneralId, id );
-    
-    // define attributes fetched
-    RArray<TMPXAttribute> songAttributes;
-    CleanupClosePushL(songAttributes);
-    
-    songAttributes.AppendL( KMPXMediaGeneralType );
-    songAttributes.AppendL( KMPXMediaGeneralCategory );
-    songAttributes.AppendL( KMPXMediaGeneralUri );
-    songAttributes.AppendL( KMPXMediaGeneralId );
-    songAttributes.AppendL( KMPXMediaGeneralTitle );
-    songAttributes.AppendL( KMPXMediaGeneralMimeType );
-    songAttributes.AppendL( KMPXMediaGeneralDuration );
-    songAttributes.AppendL( KMPXMediaGeneralComment );
-    
-    songAttributes.AppendL( KMPXMediaMusicArtist );
-    songAttributes.AppendL( KMPXMediaMusicAlbum );
-    songAttributes.AppendL( KMPXMediaMusicYear );
-    songAttributes.AppendL( KMPXMediaMusicAlbumTrack );
-    songAttributes.AppendL( KMPXMediaMusicGenre );
-    songAttributes.AppendL( KMPXMediaMusicComposer );
-    
-    // now find
-    CMPXMedia* result = 0;
-    TRAPD(err, result = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() ));
-    CleanupStack::PopAndDestroy( &songAttributes );
-    CleanupStack::PopAndDestroy( criteria );
-    
-    if ( err )
-        {
-        LOGGER_WRITE_1("FindAllL err: %d", err);
-        User::Leave( err );
-        }
-    
-    CleanupStack::PushL( result );
-
-    if ( !result->IsSupported(KMPXMediaArrayCount) )
-         {
-         LOGGER_WRITE("KMPXMediaArrayCount not supported");
-         User::Leave(KErrNotSupported);
-         }
-    
-    if ( !result->IsSupported( KMPXMediaArrayContents ) )
-        {
-        User::Leave(KErrNotSupported);
-        }
-    
-    const CMPXMediaArray* songsArray =
-    result->Value<CMPXMediaArray>(KMPXMediaArrayContents);
-    if ( songsArray->Count() == 0 )
-        {
-        User::Leave( KErrNotFound );
-        }
-    const CMPXMedia* songMedia = (*songsArray)[0];
-    
-    ReadSongAttributesL( *songMedia, aSongItem, ETrue );
-    
-    CleanupStack::PopAndDestroy( result );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-CMPXMedia* CMediaManager::CreatePlaylistMediaL( const CPlaylistItem& aPlaylist )
-    {
-    TRACE_FUNC_ENTRY;
-    RArray<TInt> contentIDs;
-    contentIDs.AppendL(KMPXMediaIdGeneral);
-    
-    CMPXMedia* playlist = CMPXMedia::NewL( contentIDs.Array() );
-    CleanupStack::PushL( playlist );
-    contentIDs.Close();
-    // add playlist info into the playlist media
-    playlist->SetTObjectValueL<TUid>(
-        KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
-    
-    // set playlist title
-    playlist->SetTextValueL( KMPXMediaGeneralTitle, aPlaylist.Title() );
-    
-    // set type
-    playlist->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
-     
-    // set category
-    playlist->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); 
-    
-    
-    TFileName playlistfile;
-    
-    TInt drive;
-    User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive) );
-    TUint driveStatus( 0 );
-    TInt err = DriveInfo::GetDriveStatus( iFs, drive, driveStatus );
-    if ( !err && (driveStatus & DriveInfo::EDrivePresent) )
-        {
-        User::LeaveIfError( PathInfo::GetRootPath( playlistfile, drive ) );
-        LOGGER_WRITE_1("mmc playlistfile: %S", &playlistfile);
-        }
-    else
-        {
-        playlistfile = PathInfo::PhoneMemoryRootPath();
-        LOGGER_WRITE_1("phone playlistfile: %S", &playlistfile);
-        }
-    
-    playlistfile.Append( KPlaylistPath );
-    
-    // set location drive
-    TDriveUnit driveUnit( playlistfile );
-    TPtrC driveName = driveUnit.Name();
-    playlist->SetTextValueL( KMPXMediaGeneralDrive, driveName );
-    
-    
-    TTime time;
-    time.HomeTime();
-    playlistfile.AppendNum(time.Int64());
-    playlistfile.Append(KMPXVirtualPlaylistExt);
-    
-    LOGGER_WRITE_1("playlistfile: %S", &playlistfile);
-    playlist->SetTextValueL(
-             KMPXMediaGeneralUri, playlistfile );
-    
-    // set DbFlags to indicate that this is a virtual playlist
-    playlist->SetTObjectValueL<TUint>(KMPXMediaGeneralFlags,
-       KMPXMediaGeneralFlagsSetOrUnsetBit | KMPXMediaGeneralFlagsIsVirtual);
-
-    // create songs
-    CMPXMediaArray* medias = CreateMediaArrayLC( aPlaylist );
-    // set medias
-    playlist->SetCObjectValueL( KMPXMediaArrayContents, medias );
-    /// set media count        
-    playlist->SetTObjectValueL( KMPXMediaArrayCount, medias->Count() );
-    
-    CleanupStack::PopAndDestroy(medias);
-    CleanupStack::Pop(playlist);
-    
-    
-    TRACE_FUNC_EXIT;
-    return playlist;
-    }
-
-CMPXMediaArray* CMediaManager::CreateMediaArrayLC( const CPlaylistItem& aList )
-    {
-    CMPXMediaArray* medias = CMPXMediaArray::NewL();
-    CleanupStack::PushL( medias );
-    //
-    // create entries
-    //
-    TInt itemCount = aList.ItemCount();
-    for ( TInt i=0; i<itemCount; i++)
-        {
-        TPtrC16 ptrUri = aList.ItemAt(i);
-        LOGGER_WRITE_1("add uri: %S", &ptrUri);
-        iCollectionHelper->AddL( ptrUri, this );
-        iWaitOngoing = ETrue;
-        LOGGER_WRITE("iWait.Start");
-        iWait.Start();
-        LOGGER_WRITE("continue..");
-    
-        RArray<TInt> contentIDs;
-        contentIDs.AppendL(KMPXMediaIdGeneral);
-        contentIDs.AppendL(KMPXMediaIdAudio);
-        contentIDs.AppendL(KMPXMediaIdMusic);
-        contentIDs.AppendL(KMPXMediaIdMTP); 
-        
-        CMPXMedia* entry = CMPXMedia::NewL( contentIDs.Array() );
-        CleanupStack::PushL( entry );
-        contentIDs.Close();
-        
-        entry->SetTObjectValueL<TUid>(
-                KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
-        
-        entry->SetTObjectValueL<TMPXGeneralType>(
-                     KMPXMediaGeneralType, EMPXItem );
-        
-        entry->SetTObjectValueL<TMPXGeneralCategory>(
-                     KMPXMediaGeneralCategory, EMPXSong );
-        
-        
-        entry->SetTextValueL( KMPXMediaGeneralUri, ptrUri );
-        
-        // set location drive
-        TDriveUnit driveUnit( ptrUri );
-        TPtrC driveName = driveUnit.Name();
-        entry->SetTextValueL( KMPXMediaGeneralDrive, driveName );
-        
-        medias->AppendL(entry);
-        CleanupStack::Pop(entry);
-        }
-    return medias;
-    }
-
-void CMediaManager::CreateNewPlaylistL( TInt& aNewUid, CPlaylistItem& aList )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    CMPXMedia* playlist = CreatePlaylistMediaL( aList );
-    CleanupStack::PushL( playlist );
-    iMediator->AddItemL( playlist );
-    
-    if ( !playlist->IsSupported(KMPXMediaGeneralId) )
-        {
-        LOGGER_WRITE("KMPXMediaGeneralId not supported");
-        User::Leave( KErrNotSupported );
-        }
-    else
-        {
-        // Extract the playlist id from the found object
-        TUint32 playlistId = *playlist->Value<TMPXItemId>(KMPXMediaGeneralId);
-        LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId);
-        aNewUid = playlistId;
-        
-        if ( !playlist->IsSupported( KMPXMediaGeneralUri ) )
-            {
-            // get url
-            const TDesC& uri = playlist->ValueText( KMPXMediaGeneralUri );
-            aList.SetUrlL( uri );
-            }
-        }
-    
-    CleanupStack::PopAndDestroy(playlist);
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::ReplacePlaylistL( TInt aPlaylistId, CPlaylistItem& aPlaylist )
-    {
-    TRACE_FUNC_ENTRY;
-    CMPXMedia* playlist = CMPXMedia::NewL();
-    CleanupStack::PushL( playlist );
-    
-    // add playlist info into the playlist media
-    playlist->SetTObjectValueL<TUid>(
-        KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
-    
-    // set type
-    playlist->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
-     
-    // set category
-    playlist->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); 
-    
-    
-    
-    // find playlist uri
-    CMPXMedia* oldPlaylist = FindPlaylistL( aPlaylistId );
-    CleanupStack::PushL( oldPlaylist );
-    if ( !oldPlaylist->IsSupported(KMPXMediaGeneralUri) )
-        {
-        User::Leave( KErrNotSupported );
-        }
-    const TDesC& uri = oldPlaylist->ValueText( KMPXMediaGeneralUri );
-    LOGGER_WRITE_1("uri: %S", &uri);
-    
-    playlist->SetTextValueL(
-            KMPXMediaGeneralUri, uri );
-    
-	aPlaylist.SetUrlL( uri );
-    
-    const TDesC& title = oldPlaylist->ValueText( KMPXMediaGeneralTitle );
-    if ( title.Compare( aPlaylist.Title() ) != 0 )
-        {
-        LOGGER_WRITE_1("title changed old: %S", &title);
-        LOGGER_WRITE_1("new title: %S", &aPlaylist.Title());
-        // set playlist title
-        playlist->SetTextValueL( KMPXMediaGeneralTitle, aPlaylist.Title() );
-        
-        // update title first
-        iMediator->SetItemL( playlist );
-        }
-    
-    
-    CleanupStack::PopAndDestroy( oldPlaylist );
-    
-    // update songs
-    CMPXMediaArray* songArray = CreateMediaArrayLC( aPlaylist );
-    // set medias
-    playlist->SetCObjectValueL( KMPXMediaArrayContents, songArray );
-    /// set media count        
-    playlist->SetTObjectValueL( KMPXMediaArrayCount, songArray->Count() );
-    
-    iMediator->SetItemL( playlist );
-    
-    CleanupStack::PopAndDestroy( songArray );
-    CleanupStack::PopAndDestroy( playlist );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-
-void CMediaManager::DeletePlaylistL( TInt aPlaylistId )
-    {
-    TRACE_FUNC_ENTRY;
-    
-    CMPXMedia* playlist = FindPlaylistL( aPlaylistId );
-    CleanupStack::PushL( playlist );
-    iCollection->Collection().RemoveL( *playlist );
-    CleanupStack::PopAndDestroy( playlist );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::HandleAddFileCompleteL( TInt aErr )
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1("aErr: %d", aErr);
-    if ( iWaitOngoing )
-        {
-        LOGGER_WRITE("AsyncStop");
-        iWaitOngoing = EFalse;
-        iWait.AsyncStop();
-        }
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::ReadSongAttributesL( const CMPXMedia& aMedia, CSongItem& aSongItem,
-        TBool aReadFileDetails )
-    {
-    if ( !aMedia.IsSupported(KMPXMediaGeneralUri) )
-        {
-        LOGGER_WRITE("KMPXMediaGeneralUri not supported");
-        User::Leave(KErrNotSupported);
-        }    
-    
-    if ( !aMedia.IsSupported(KMPXMediaGeneralId) )
-        {
-        LOGGER_WRITE("KMPXMediaGeneralId not supported");
-        User::Leave(KErrNotSupported);
-        }
-    
-    aSongItem.SetId( *aMedia.Value<TMPXItemId>(KMPXMediaGeneralId) );
-    
-    const TDesC& uri = aMedia.ValueText(KMPXMediaGeneralUri);
-    aSongItem.SetUriL( uri );
-    
-    if ( aMedia.IsSupported(KMPXMediaGeneralTitle) )
-        {
-        aSongItem.SetTitleL( aMedia.ValueText(KMPXMediaGeneralTitle) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaGeneralMimeType) )
-        {
-        aSongItem.SetMimeTypeL( aMedia.ValueText(KMPXMediaGeneralMimeType) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaGeneralDuration) )
-        {
-        aSongItem.SetDuration( aMedia.ValueTObjectL<TInt>(KMPXMediaGeneralDuration) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaMusicArtist) )
-        {
-        aSongItem.SetArtistL( aMedia.ValueText(KMPXMediaMusicArtist) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaMusicAlbum) )
-        {
-        aSongItem.SetAlbumL( aMedia.ValueText(KMPXMediaMusicAlbum) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaMusicYear) )
-        {
-        TInt64 year = aMedia.ValueTObjectL<TInt64>( KMPXMediaMusicYear );
-        TTime yearTime( year);
-        aSongItem.SetYear( yearTime.DateTime().Year() );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaMusicAlbumTrack) )
-        {
-        aSongItem.SetAlbumTrack( *aMedia.Value<TInt>(KMPXMediaMusicAlbumTrack) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaMusicGenre) )
-        {
-        const TDesC& genre = aMedia.ValueText(KMPXMediaMusicGenre);
-        aSongItem.SetGenreL( genre );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaMusicComposer) )
-        {
-        aSongItem.SetComposerL( aMedia.ValueText(KMPXMediaMusicComposer) );
-        }
-    
-    if ( aMedia.IsSupported(KMPXMediaGeneralComment) )
-        {
-        aSongItem.SetCommentL( aMedia.ValueText(KMPXMediaGeneralComment) );
-        }
-    
-    // Reading file timestamp and size is slow, read only if needed
-    if ( aReadFileDetails )
-        {
-        TEntry fileEntry;
-        TInt err = iFs.Entry(uri,fileEntry);
-        if ( !err )
-            {
-            aSongItem.SetModifiedTime( fileEntry.iModified );
-            aSongItem.SetFileSize( fileEntry.iSize );
-            }
-        }
-    
-    }
-
-
-void CMediaManager::DoCancel()
-    {
-    TRACE_FUNC_ENTRY;
-    
-    delete iFoundedMedia;
-    iFoundedMedia = NULL;
-    iReadedItems = 0;
-    iItemsFound = 0;      
-    TState state = iCurrentState;
-    iCurrentState = EIdle;
-    
-    switch (state)
-        {
-        case EReadingPlaylistCount:
-        case EEnumeratingPlaylists:
-            iObserver->RegisterAllPlayListsCompleted( KErrCancel );
-            break;
-            
-        case EReadingSongCount:
-        case EEnumeratingSongs:
-            iObserver->RegisterAllSongsCompleted( KErrCancel );
-            break;
-        default:
-            break;
-        }
-    
-    LOGGER_WRITE("signal cancel");
-    TRequestStatus* status = &iStatus;
-    User::RequestComplete( status, KErrCancel );
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::RunL()
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1("iStatus.Int(): %d", iStatus.Int())
-    TRequestStatus* status = &iStatus;
-    switch (iCurrentState)
-        {
-        case EReadingPlaylistCount:
-            //if ( !iCancel )
-            //    {
-                ReadPlaylistCountL();
-                iReadedItems=0;
-                // next state
-                iCurrentState = EEnumeratingPlaylists;
-                SetActive();
-                User::RequestComplete( status, KErrNone );
-            /*    }
-            else
-                {
-                LOGGER_WRITE("cancel");
-                iCancel = EFalse;
-                delete iFoundedMedia; iFoundedMedia = NULL;
-                iReadedItems = 0;
-                iItemsFound = 0;
-                iCurrentState = EIdle;
-                iObserver->RegisterAllPlayListsCompleted( KErrCancel );
-                }*/
-            break;
-            
-        case EEnumeratingPlaylists:
-            //if ( !iCancel )
-            //    {
-                ReadPlaylistItemsL();
-                if ( iReadedItems == iItemsFound )
-                    {
-                    // all items readed
-                    delete iFoundedMedia;
-                    iFoundedMedia = NULL;
-                    // next state
-                    iCurrentState = EIdle;
-                    iObserver->RegisterAllPlayListsCompleted( KErrNone );
-                    }
-                else
-                    {
-                    // not ready yet, continue same operation
-                    SetActive();
-                    User::RequestComplete( status, KErrNone );
-                    }
-             /*   }
-            else
-                {
-                // cancel
-                LOGGER_WRITE("cancel");
-                iCancel = EFalse;
-                delete iFoundedMedia; iFoundedMedia = NULL;
-                iReadedItems = 0;
-                iItemsFound = 0;
-                iCurrentState = EIdle;
-                iObserver->RegisterAllPlayListsCompleted( KErrCancel );
-                }*/
-            break;
-            
-        case EReadingSongCount:
-            //if ( !iCancel )
-            //    {
-                ReadSongCountL();
-                iReadedItems=0;
-                // next state
-                iCurrentState = EEnumeratingSongs;
-                SetActive();
-                User::RequestComplete( status, KErrNone );
-            /*    }
-            else
-                {
-                LOGGER_WRITE("cancel");
-                iCancel = EFalse;
-                delete iFoundedMedia; iFoundedMedia = NULL;
-                iReadedItems = 0;
-                iItemsFound = 0;
-                iCurrentState = EIdle;
-                iObserver->RegisterAllSongsCompleted( KErrCancel );
-                }*/
-            break;
-            
-        case EEnumeratingSongs:
-//            if ( !iCancel )
-              //  {
-                ReadSongItemsL();
-                if ( iReadedItems == iItemsFound )
-                    {
-                    // all items readed
-                    delete iFoundedMedia;
-                    iFoundedMedia = NULL;
-                    // next state
-                    iCurrentState = EIdle;
-                    iObserver->RegisterAllSongsCompleted( KErrNone );
-                    }
-                else
-                    {
-                    // not ready yet, continue same operation
-                    SetActive();
-                    User::RequestComplete( status, KErrNone );
-                    }
-              /*  }
-            else
-                {
-                LOGGER_WRITE("cancel");
-                iCancel = EFalse;
-                delete iFoundedMedia; iFoundedMedia = NULL;
-                iReadedItems = 0;
-                iItemsFound = 0;
-                iCurrentState = EIdle;
-                iObserver->RegisterAllSongsCompleted( KErrCancel );
-                }*/
-            break;
-        default:
-            break;
-        }
-    TRACE_FUNC_EXIT;
-    }
-
-
-TInt CMediaManager::RunError( TInt aError )
-    {
-    TRACE_FUNC_ENTRY;
-    LOGGER_WRITE_1("aError: %d", aError)
-    switch (iCurrentState)
-        {
-        case EReadingPlaylistCount:
-        case EEnumeratingPlaylists:
-            iObserver->RegisterAllPlayListsCompleted( aError );
-            break;
-        case EReadingSongCount:
-        case EEnumeratingSongs:
-            iObserver->RegisterAllSongsCompleted( aError );
-            break;
-        default:
-            LOGGER_WRITE("Unknown state!");
-            break;
-        }
-    
-    TRACE_FUNC_EXIT;
-    return KErrNone;
-    }
-
-void CMediaManager::ReadPlaylistCountL()
-    {
-    TRACE_FUNC_ENTRY;
-    // Find all playlist files in the playlist DB
-    RArray<TInt> contentIDs;
-    CleanupClosePushL( contentIDs );
-    contentIDs.AppendL(KMPXMediaIdGeneral);
-    
-    CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array());
-    CleanupStack::PopAndDestroy( &contentIDs );
-    CleanupStack::PushL(searchMedia);
-    
-    searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem);    
-    searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXPlaylist);
-    
-    RArray<TMPXAttribute> playlistAttributes;
-    CleanupClosePushL(playlistAttributes);
-    playlistAttributes.AppendL( KMPXMediaGeneralId );
-    playlistAttributes.AppendL( KMPXMediaGeneralTitle );
-    playlistAttributes.AppendL( KMPXMediaGeneralUri );
-    
-    LOGGER_WRITE("find all");
-    delete iFoundedMedia; iFoundedMedia=NULL;
-    iFoundedMedia = iCollectionHelper->FindAllL(*searchMedia, playlistAttributes.Array());
-    CleanupStack::PopAndDestroy(&playlistAttributes);
-    CleanupStack::PopAndDestroy(searchMedia);
-
-    if ( !iFoundedMedia->IsSupported(KMPXMediaArrayCount) )
-        {
-        delete iFoundedMedia; iFoundedMedia=NULL;
-        User::Leave( KErrNotSupported );
-        }
-    
-    iItemsFound = *iFoundedMedia->Value<TInt>(KMPXMediaArrayCount);
-    
-    LOGGER_WRITE_1("playlists: %d", iItemsFound);
-
-    if ( iItemsFound )
-        {
-        if ( !iFoundedMedia->IsSupported(KMPXMediaArrayContents) )
-            {
-            delete iFoundedMedia; iFoundedMedia=NULL;
-            iItemsFound = 0;
-            User::Leave(KErrNotSupported);
-            }
-        }
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::ReadPlaylistItemsL()
-    {
-    TRACE_FUNC_ENTRY;
-    TInt start = iReadedItems;
-    TInt end = start+iMaxPlaylistItemsToEnumerate;
-    if ( end >iItemsFound )
-        {
-        end = iItemsFound;
-        }
-    
-    const CMPXMediaArray* foundArray = iFoundedMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
-            
-    for (TInt i = start; i < end; i++)
-        {
-        LOGGER_WRITE_1("read playlistItem: %d", i);
-        CMPXMedia* playlistMedia = CMPXMedia::NewL(*(*foundArray)[i]);
-        CleanupStack::PushL( playlistMedia );
-        
-        // Append playlist to item array
-        RegisterPlaylistL( *playlistMedia );
-               
-        CleanupStack::PopAndDestroy( playlistMedia );
-        iReadedItems++;
-        }
-    
-    TRACE_FUNC_EXIT;
-    }
-
-    
-
-void CMediaManager::ReadSongCountL()
-    {
-    TRACE_FUNC_ENTRY;
-
-    RArray<TInt> contentIDs;
-    CleanupClosePushL( contentIDs );
-    contentIDs.AppendL( KMPXMediaIdGeneral );
-    contentIDs.AppendL( KMPXMediaIdMusic );
-    
-    CMPXMedia* criteria = CMPXMedia::NewL(contentIDs.Array());
-    CleanupStack::PopAndDestroy( &contentIDs );
-    CleanupStack::PushL(criteria);
-    
-    criteria->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
-    criteria->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
-    
-    // define attributes fetched
-    RArray<TMPXAttribute> songAttributes;
-    CleanupClosePushL(songAttributes);
-    
-    songAttributes.AppendL( KMPXMediaGeneralType );
-    songAttributes.AppendL( KMPXMediaGeneralCategory );
-    songAttributes.AppendL( KMPXMediaGeneralUri );
-    songAttributes.AppendL( KMPXMediaGeneralId );
-    songAttributes.AppendL( KMPXMediaGeneralTitle );
-    songAttributes.AppendL( KMPXMediaGeneralMimeType );
-    songAttributes.AppendL( KMPXMediaGeneralDuration );
-    songAttributes.AppendL( KMPXMediaGeneralComment );
-    
-    songAttributes.AppendL( KMPXMediaMusicArtist );
-    songAttributes.AppendL( KMPXMediaMusicAlbum );
-    songAttributes.AppendL( KMPXMediaMusicYear );
-    songAttributes.AppendL( KMPXMediaMusicAlbumTrack );
-    songAttributes.AppendL( KMPXMediaMusicGenre );
-    songAttributes.AppendL( KMPXMediaMusicComposer );
-    
-    delete iFoundedMedia;
-    iFoundedMedia = NULL;
-    // now find
-    LOGGER_WRITE("FindAllL");
-    iFoundedMedia = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() );
-        
-    LOGGER_WRITE("FindAllL ok");
-    CleanupStack::PopAndDestroy( &songAttributes );
-    CleanupStack::PopAndDestroy( criteria );
-    
-
-    if ( !iFoundedMedia->IsSupported(KMPXMediaArrayCount) )
-         {
-         LOGGER_WRITE("KMPXMediaArrayCount not supported");
-         delete iFoundedMedia;
-         iFoundedMedia = NULL;
-         iItemsFound = 0;
-         User::Leave(KErrNotSupported);
-         }
-     
-    // Number of references
-    iItemsFound = *iFoundedMedia->Value<TInt>(KMPXMediaArrayCount);
-    LOGGER_WRITE_1("songs: %d", iItemsFound);
-    if ( iItemsFound )
-        {
-        if (!iFoundedMedia->IsSupported(KMPXMediaArrayContents))
-            {
-            delete iFoundedMedia;
-            iFoundedMedia = NULL;
-            iItemsFound = 0;
-            User::Leave(KErrNotSupported);
-            }
-        }
-    
-    TRACE_FUNC_EXIT;
-    }
-
-void CMediaManager::ReadSongItemsL()
-    {
-    TRACE_FUNC_ENTRY;
-    
-    TInt start = iReadedItems;
-    TInt end = start+iMaxSongItemsToEnumerate;
-    if ( end >iItemsFound )
-        {
-        end = iItemsFound;
-        }
-    
-    const CMPXMediaArray* foundArray = iFoundedMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
-    
-    TKeyArrayFix key( iKey );
-    // Import the references
-    for (TInt i = start; i < end; i++)
-        {
-        //LOGGER_WRITE_1("read songitem: %d",i);
-        const CMPXMedia* refMedia = (*foundArray)[i];
-        
-        CSongItem* song = CSongItem::NewLC();
-        
-        ReadSongAttributesL( *refMedia, *song, EFalse );
-        TSnapshotItem snapshotItem( song->Id(), KAllSongsFolderId );
-        snapshotItem.SetItemHash( *song, iHasher );
-        
-        iSnapshotArray->InsertIsqL( snapshotItem, key );
-        
-        CleanupStack::PopAndDestroy( song );
-        iReadedItems++;
-        }
-    TRACE_FUNC_EXIT;
-    }