omads/omadsextensions/adapters/mediads/src/mediamanager.cpp
author hgs
Tue, 13 Jul 2010 03:39:25 +0530
changeset 40 b63e67867dcd
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  CMediaManager class implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include "mediamanager.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <mpxmedia.h>
hgs
parents:
diff changeset
    23
#include <mpxmediageneraldefs.h>
hgs
parents:
diff changeset
    24
#include <mpxcollectionhelper.h>
hgs
parents:
diff changeset
    25
#include <mpxmediacontainerdefs.h>
hgs
parents:
diff changeset
    26
#include <mpxmediaarray.h>
hgs
parents:
diff changeset
    27
#include <mpxcollectionhelperfactory.h>
hgs
parents:
diff changeset
    28
#include <mpxcollectionhelper.h>
hgs
parents:
diff changeset
    29
#include <utf.h>
hgs
parents:
diff changeset
    30
#include <mpxplaylistenginedefs.h> // for EMPXPlaylistTypeM3U
hgs
parents:
diff changeset
    31
#include <mpxcollectiontype.h>
hgs
parents:
diff changeset
    32
#include <mpxmediamusicdefs.h>
hgs
parents:
diff changeset
    33
#include <mpxcollectionplugin.hrh>
hgs
parents:
diff changeset
    34
#include <PathInfo.h>
hgs
parents:
diff changeset
    35
#include <mpxmediaaudiodefs.h>
hgs
parents:
diff changeset
    36
#include <mpxmediamtpdefs.h>
hgs
parents:
diff changeset
    37
#include <driveinfo.h>
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
#include "mediadsproviderdefs.h"
hgs
parents:
diff changeset
    40
#include "playlistitem.h"
hgs
parents:
diff changeset
    41
#include "logger.h"
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
const TUid KMpxLocalCollectionUid = { 0x101FFC3A };
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
_LIT( KPlaylistPath, "playlists\\" );
hgs
parents:
diff changeset
    47
_LIT( KMPXVirtualPlaylistExt, ".vir" );
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// Maximum amount of song items to be enumerated on one RunL.
hgs
parents:
diff changeset
    50
const TInt iMaxSongItemsToEnumerate(100);
hgs
parents:
diff changeset
    51
// Maximum amount of playlist items to be enumerated on one RunL.
hgs
parents:
diff changeset
    52
const TInt iMaxPlaylistItemsToEnumerate(15);
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
CMediaManager::CMediaManager( RFs& aFs, MMediaManagerObserver* aObserver,
hgs
parents:
diff changeset
    56
        TKeyArrayFix aKey, CMD5& aHasher  )
hgs
parents:
diff changeset
    57
: CActive( EPriorityStandard ),
hgs
parents:
diff changeset
    58
iObserver( aObserver ),
hgs
parents:
diff changeset
    59
iKey( aKey ),
hgs
parents:
diff changeset
    60
iHasher( aHasher ),
hgs
parents:
diff changeset
    61
iFs( aFs )
hgs
parents:
diff changeset
    62
    {
hgs
parents:
diff changeset
    63
    TRACE_FUNC;
hgs
parents:
diff changeset
    64
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
void CMediaManager::ConstructL()
hgs
parents:
diff changeset
    69
    {
hgs
parents:
diff changeset
    70
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
    71
    iHarvester = CMPXHarvesterFactory::NewL();
hgs
parents:
diff changeset
    72
    LOGGER_WRITE("1");
hgs
parents:
diff changeset
    73
    iCollection = MMPXCollectionUtility::NewL( iObserver );
hgs
parents:
diff changeset
    74
    LOGGER_WRITE("2");
hgs
parents:
diff changeset
    75
    iMediator = CMPXCollectionMediator::NewL( iCollection->Collection() );
hgs
parents:
diff changeset
    76
    LOGGER_WRITE("3");
hgs
parents:
diff changeset
    77
    iCollectionHelper = CMPXCollectionHelperFactory::NewCollectionCachedHelperL();   
hgs
parents:
diff changeset
    78
    
hgs
parents:
diff changeset
    79
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
    80
    }
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
CMediaManager* CMediaManager::NewL( RFs& aFs, MMediaManagerObserver* aObserver, TKeyArrayFix aKey, CMD5& aHasher )
hgs
parents:
diff changeset
    84
    {
hgs
parents:
diff changeset
    85
    CMediaManager* self = new( ELeave ) CMediaManager( aFs, aObserver, aKey, aHasher );
hgs
parents:
diff changeset
    86
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    87
    self->ConstructL();
hgs
parents:
diff changeset
    88
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    89
    return self;
hgs
parents:
diff changeset
    90
    }
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    94
// Destructor
hgs
parents:
diff changeset
    95
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    96
//
hgs
parents:
diff changeset
    97
CMediaManager::~CMediaManager()
hgs
parents:
diff changeset
    98
    {
hgs
parents:
diff changeset
    99
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   100
    Cancel();
hgs
parents:
diff changeset
   101
    delete iFoundedMedia;
hgs
parents:
diff changeset
   102
    if ( iCollectionHelper )
hgs
parents:
diff changeset
   103
        {
hgs
parents:
diff changeset
   104
        iCollectionHelper->Close();
hgs
parents:
diff changeset
   105
        iCollectionHelper = NULL;
hgs
parents:
diff changeset
   106
        }
hgs
parents:
diff changeset
   107
    
hgs
parents:
diff changeset
   108
    delete iMediator;
hgs
parents:
diff changeset
   109
    
hgs
parents:
diff changeset
   110
    if ( iCollection )
hgs
parents:
diff changeset
   111
        {
hgs
parents:
diff changeset
   112
        iCollection->Close();
hgs
parents:
diff changeset
   113
        iCollection = NULL;
hgs
parents:
diff changeset
   114
        }
hgs
parents:
diff changeset
   115
    
hgs
parents:
diff changeset
   116
    if ( iHarvester )
hgs
parents:
diff changeset
   117
        {
hgs
parents:
diff changeset
   118
        // For some unknown reason this may sometimes leave with error code -38
hgs
parents:
diff changeset
   119
        TRAP_IGNORE( iHarvester->Close() );
hgs
parents:
diff changeset
   120
        iHarvester = NULL;
hgs
parents:
diff changeset
   121
        }
hgs
parents:
diff changeset
   122
    
hgs
parents:
diff changeset
   123
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
void CMediaManager::ScanL()
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   129
    iHarvester->ScanL();
hgs
parents:
diff changeset
   130
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
void CMediaManager::CancelScanL()
hgs
parents:
diff changeset
   134
    {
hgs
parents:
diff changeset
   135
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   136
    iHarvester->CancelScanL();
hgs
parents:
diff changeset
   137
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   141
// Starts registering all playlists. Calls RegisterAllPlayListsCompleted when ready
hgs
parents:
diff changeset
   142
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   143
// 
hgs
parents:
diff changeset
   144
TInt CMediaManager::RegisterAllPlayLists()
hgs
parents:
diff changeset
   145
    {
hgs
parents:
diff changeset
   146
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   147
    if ( iCurrentState != EIdle || !iSnapshotArray)
hgs
parents:
diff changeset
   148
        {
hgs
parents:
diff changeset
   149
        LOGGER_WRITE("Not Idle or iSnapshotArray is NULL");
hgs
parents:
diff changeset
   150
        return KErrNotReady;
hgs
parents:
diff changeset
   151
        }
hgs
parents:
diff changeset
   152
    iCurrentState = EReadingPlaylistCount;
hgs
parents:
diff changeset
   153
    SetActive();
hgs
parents:
diff changeset
   154
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   155
    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
   156
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   157
    return KErrNone;
hgs
parents:
diff changeset
   158
    }
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   161
// Starts registering all song items. Calls RegisterAllSongsCompleted when ready
hgs
parents:
diff changeset
   162
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   163
// 
hgs
parents:
diff changeset
   164
TInt CMediaManager::RegisterAllSongs()
hgs
parents:
diff changeset
   165
    {
hgs
parents:
diff changeset
   166
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   167
    if ( iCurrentState != EIdle || !iSnapshotArray)
hgs
parents:
diff changeset
   168
        {
hgs
parents:
diff changeset
   169
        LOGGER_WRITE("Not Idle or iSnapshotArray is NULL");
hgs
parents:
diff changeset
   170
        return KErrNotReady;
hgs
parents:
diff changeset
   171
        }
hgs
parents:
diff changeset
   172
    iCurrentState = EReadingSongCount;
hgs
parents:
diff changeset
   173
    SetActive();
hgs
parents:
diff changeset
   174
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   175
    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
   176
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   177
    return KErrNone;
hgs
parents:
diff changeset
   178
    }
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
// Registers playlist.
hgs
parents:
diff changeset
   182
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   183
// 
hgs
parents:
diff changeset
   184
void CMediaManager::RegisterPlaylistL( const CMPXMedia& aMedia )
hgs
parents:
diff changeset
   185
    {
hgs
parents:
diff changeset
   186
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   187
    if ( !iSnapshotArray )
hgs
parents:
diff changeset
   188
        {
hgs
parents:
diff changeset
   189
        User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   190
        }
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    if ( !aMedia.IsSupported(KMPXMediaGeneralId) )
hgs
parents:
diff changeset
   193
        {
hgs
parents:
diff changeset
   194
        LOGGER_WRITE("KMPXMediaGeneralId not supported");
hgs
parents:
diff changeset
   195
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   196
        }
hgs
parents:
diff changeset
   197
     
hgs
parents:
diff changeset
   198
     // Extract the playlist id from the found object
hgs
parents:
diff changeset
   199
     TUint32 playlistId = *aMedia.Value<TMPXItemId>(KMPXMediaGeneralId);
hgs
parents:
diff changeset
   200
     LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId);
hgs
parents:
diff changeset
   201
     
hgs
parents:
diff changeset
   202
     if ( !aMedia.IsSupported( KMPXMediaGeneralTitle ) )
hgs
parents:
diff changeset
   203
          {
hgs
parents:
diff changeset
   204
          LOGGER_WRITE("KMPXMediaGeneralTitle not supported");
hgs
parents:
diff changeset
   205
          User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   206
          }
hgs
parents:
diff changeset
   207
     
hgs
parents:
diff changeset
   208
     CPlaylistItem* playlist = CPlaylistItem::NewLC();
hgs
parents:
diff changeset
   209
     // find the media object that contains a list of songs in the playlist
hgs
parents:
diff changeset
   210
     
hgs
parents:
diff changeset
   211
     RArray<TInt> contentIDs;
hgs
parents:
diff changeset
   212
     CleanupClosePushL( contentIDs );
hgs
parents:
diff changeset
   213
     contentIDs.AppendL(KMPXMediaIdGeneral);
hgs
parents:
diff changeset
   214
     
hgs
parents:
diff changeset
   215
     CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array());
hgs
parents:
diff changeset
   216
     CleanupStack::PopAndDestroy( &contentIDs );
hgs
parents:
diff changeset
   217
     CleanupStack::PushL(searchMedia);
hgs
parents:
diff changeset
   218
     
hgs
parents:
diff changeset
   219
     searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup);    
hgs
parents:
diff changeset
   220
     searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong);
hgs
parents:
diff changeset
   221
     searchMedia->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, playlistId);
hgs
parents:
diff changeset
   222
     
hgs
parents:
diff changeset
   223
     RArray<TMPXAttribute> songAttributes;
hgs
parents:
diff changeset
   224
     CleanupClosePushL(songAttributes);
hgs
parents:
diff changeset
   225
     songAttributes.AppendL(KMPXMediaGeneralId);
hgs
parents:
diff changeset
   226
     songAttributes.AppendL(KMPXMediaGeneralUri);
hgs
parents:
diff changeset
   227
     
hgs
parents:
diff changeset
   228
     CMPXMedia* foundMedia = iCollectionHelper->FindAllL(*searchMedia, 
hgs
parents:
diff changeset
   229
                                                         songAttributes.Array());
hgs
parents:
diff changeset
   230
     CleanupStack::PopAndDestroy(&songAttributes);
hgs
parents:
diff changeset
   231
     CleanupStack::PopAndDestroy(searchMedia);
hgs
parents:
diff changeset
   232
     
hgs
parents:
diff changeset
   233
     CleanupStack::PushL(foundMedia);
hgs
parents:
diff changeset
   234
     
hgs
parents:
diff changeset
   235
     
hgs
parents:
diff changeset
   236
     if ( !foundMedia->IsSupported(KMPXMediaArrayCount) )
hgs
parents:
diff changeset
   237
         {
hgs
parents:
diff changeset
   238
         User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   239
         }
hgs
parents:
diff changeset
   240
     
hgs
parents:
diff changeset
   241
     // Number of references
hgs
parents:
diff changeset
   242
     TInt numOfRefs = *foundMedia->Value<TInt>(KMPXMediaArrayCount);
hgs
parents:
diff changeset
   243
     if ( numOfRefs )
hgs
parents:
diff changeset
   244
         {
hgs
parents:
diff changeset
   245
         if (!foundMedia->IsSupported(KMPXMediaArrayContents))
hgs
parents:
diff changeset
   246
             {
hgs
parents:
diff changeset
   247
             User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   248
             }
hgs
parents:
diff changeset
   249
         
hgs
parents:
diff changeset
   250
         const CMPXMediaArray* refArray =
hgs
parents:
diff changeset
   251
             foundMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
hgs
parents:
diff changeset
   252
         
hgs
parents:
diff changeset
   253
         // Import the references
hgs
parents:
diff changeset
   254
         for (TInt i=0;i<numOfRefs;i++)
hgs
parents:
diff changeset
   255
             {
hgs
parents:
diff changeset
   256
             const CMPXMedia* refMedia = (*refArray)[i];
hgs
parents:
diff changeset
   257
             
hgs
parents:
diff changeset
   258
             if ( refMedia->IsSupported(KMPXMediaGeneralUri) )
hgs
parents:
diff changeset
   259
                 {
hgs
parents:
diff changeset
   260
                 const TDesC& uri = refMedia->ValueText(KMPXMediaGeneralUri);
hgs
parents:
diff changeset
   261
                 playlist->AddItemL( uri );
hgs
parents:
diff changeset
   262
                 }
hgs
parents:
diff changeset
   263
             
hgs
parents:
diff changeset
   264
             }
hgs
parents:
diff changeset
   265
         }
hgs
parents:
diff changeset
   266
    
hgs
parents:
diff changeset
   267
    TSnapshotItem playlistItem(playlistId);
hgs
parents:
diff changeset
   268
    
hgs
parents:
diff changeset
   269
    const TDesC& title = aMedia.ValueText( KMPXMediaGeneralTitle );
hgs
parents:
diff changeset
   270
    playlist->SetTitleL( title );
hgs
parents:
diff changeset
   271
    
hgs
parents:
diff changeset
   272
    const TDesC& uri = aMedia.ValueText( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
   273
    playlist->SetUrlL( uri );
hgs
parents:
diff changeset
   274
    
hgs
parents:
diff changeset
   275
    playlistItem.SetItemHash( *playlist, iHasher );
hgs
parents:
diff changeset
   276
    
hgs
parents:
diff changeset
   277
    playlistItem.SetParentId( KPlaylistsFolderId );
hgs
parents:
diff changeset
   278
    TKeyArrayFix key( iKey );
hgs
parents:
diff changeset
   279
    iSnapshotArray->InsertIsqL( playlistItem, key );
hgs
parents:
diff changeset
   280
    
hgs
parents:
diff changeset
   281
    CleanupStack::PopAndDestroy( foundMedia );
hgs
parents:
diff changeset
   282
    CleanupStack::PopAndDestroy( playlist );
hgs
parents:
diff changeset
   283
    
hgs
parents:
diff changeset
   284
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   285
    }
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   288
// Populates CPlaylistItem
hgs
parents:
diff changeset
   289
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   290
// 
hgs
parents:
diff changeset
   291
void CMediaManager::GetPlayListL( TInt aPlaylistId, CPlaylistItem& aList )
hgs
parents:
diff changeset
   292
    {
hgs
parents:
diff changeset
   293
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   294
    
hgs
parents:
diff changeset
   295
    LOGGER_WRITE_1("aPlaylistId: %d", aPlaylistId);
hgs
parents:
diff changeset
   296
    
hgs
parents:
diff changeset
   297
    CMPXMedia* playlistItem = FindPlaylistL( aPlaylistId );
hgs
parents:
diff changeset
   298
    CleanupStack::PushL( playlistItem );
hgs
parents:
diff changeset
   299
    if ( !playlistItem->IsSupported(KMPXMediaGeneralId) )
hgs
parents:
diff changeset
   300
        {
hgs
parents:
diff changeset
   301
        LOGGER_WRITE("KMPXMediaGeneralId not supported");
hgs
parents:
diff changeset
   302
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   303
        }
hgs
parents:
diff changeset
   304
    
hgs
parents:
diff changeset
   305
    // Extract the playlist id from the found object
hgs
parents:
diff changeset
   306
    TUint32 playlistId = *playlistItem->Value<TMPXItemId>(KMPXMediaGeneralId);
hgs
parents:
diff changeset
   307
    LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId);
hgs
parents:
diff changeset
   308
    aList.SetId( playlistId );
hgs
parents:
diff changeset
   309
    
hgs
parents:
diff changeset
   310
    if ( !playlistItem->IsSupported(KMPXMediaGeneralTitle) )
hgs
parents:
diff changeset
   311
        {
hgs
parents:
diff changeset
   312
        LOGGER_WRITE("KMPXMediaGeneralTitle not supported");
hgs
parents:
diff changeset
   313
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   314
        }
hgs
parents:
diff changeset
   315
    else
hgs
parents:
diff changeset
   316
        {
hgs
parents:
diff changeset
   317
        const TDesC& title = playlistItem->ValueText(KMPXMediaGeneralTitle);
hgs
parents:
diff changeset
   318
        LOGGER_WRITE_1("KMPXMediaGeneralTitle: %S", &title);
hgs
parents:
diff changeset
   319
        aList.SetTitleL( title );
hgs
parents:
diff changeset
   320
        }
hgs
parents:
diff changeset
   321
    
hgs
parents:
diff changeset
   322
    if ( playlistItem->IsSupported( KMPXMediaGeneralUri ) )
hgs
parents:
diff changeset
   323
        {
hgs
parents:
diff changeset
   324
        const TDesC& uri = playlistItem->ValueText( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
   325
        aList.SetUrlL( uri );
hgs
parents:
diff changeset
   326
        }
hgs
parents:
diff changeset
   327
    
hgs
parents:
diff changeset
   328
    CleanupStack::PopAndDestroy( playlistItem );
hgs
parents:
diff changeset
   329
    
hgs
parents:
diff changeset
   330
    CMPXMedia* playlist = FetchPlaylistContentL( aPlaylistId );
hgs
parents:
diff changeset
   331
    CleanupStack::PushL( playlist );
hgs
parents:
diff changeset
   332
    
hgs
parents:
diff changeset
   333
    if ( !playlist->IsSupported(KMPXMediaArrayCount) )
hgs
parents:
diff changeset
   334
         {
hgs
parents:
diff changeset
   335
         User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   336
         }
hgs
parents:
diff changeset
   337
     
hgs
parents:
diff changeset
   338
    // Number of references
hgs
parents:
diff changeset
   339
    TInt numOfRefs = *playlist->Value<TInt>(KMPXMediaArrayCount);
hgs
parents:
diff changeset
   340
    LOGGER_WRITE_1("numOfRefs: %d", numOfRefs);
hgs
parents:
diff changeset
   341
    if ( numOfRefs )
hgs
parents:
diff changeset
   342
        {
hgs
parents:
diff changeset
   343
        if (!playlist->IsSupported(KMPXMediaArrayContents))
hgs
parents:
diff changeset
   344
            {
hgs
parents:
diff changeset
   345
            User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   346
            }
hgs
parents:
diff changeset
   347
        
hgs
parents:
diff changeset
   348
        const CMPXMediaArray* refArray =
hgs
parents:
diff changeset
   349
        playlist->Value<CMPXMediaArray>(KMPXMediaArrayContents);
hgs
parents:
diff changeset
   350
        
hgs
parents:
diff changeset
   351
        // Import the references
hgs
parents:
diff changeset
   352
        for (TInt i=0;i<numOfRefs;i++)
hgs
parents:
diff changeset
   353
            {
hgs
parents:
diff changeset
   354
            const CMPXMedia* refMedia = (*refArray)[i];
hgs
parents:
diff changeset
   355
            
hgs
parents:
diff changeset
   356
            if ( refMedia->IsSupported(KMPXMediaGeneralUri) )
hgs
parents:
diff changeset
   357
                {
hgs
parents:
diff changeset
   358
                aList.AddItemL( refMedia->ValueText(KMPXMediaGeneralUri) );
hgs
parents:
diff changeset
   359
                }
hgs
parents:
diff changeset
   360
            }
hgs
parents:
diff changeset
   361
        }
hgs
parents:
diff changeset
   362
 
hgs
parents:
diff changeset
   363
    CleanupStack::PopAndDestroy( playlist );
hgs
parents:
diff changeset
   364
    
hgs
parents:
diff changeset
   365
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   366
    }
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   369
// Fetch a playlist content
hgs
parents:
diff changeset
   370
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   371
// 
hgs
parents:
diff changeset
   372
CMPXMedia* CMediaManager::FetchPlaylistContentL( TInt aId )
hgs
parents:
diff changeset
   373
    {
hgs
parents:
diff changeset
   374
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   375
    TMPXItemId id(aId);
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
    CMPXMedia* criteria = CMPXMedia::NewL();
hgs
parents:
diff changeset
   378
    CleanupStack::PushL( criteria );
hgs
parents:
diff changeset
   379
    criteria->SetTObjectValueL<TUid>(
hgs
parents:
diff changeset
   380
            KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
hgs
parents:
diff changeset
   381
    criteria->SetTObjectValueL<TMPXGeneralType>(
hgs
parents:
diff changeset
   382
            KMPXMediaGeneralType, EMPXGroup );
hgs
parents:
diff changeset
   383
    
hgs
parents:
diff changeset
   384
    // set search keys
hgs
parents:
diff changeset
   385
    criteria->SetTObjectValueL<TMPXGeneralCategory>(
hgs
parents:
diff changeset
   386
            KMPXMediaGeneralCategory, EMPXSong );    
hgs
parents:
diff changeset
   387
    criteria->SetTObjectValueL<TMPXItemId>(
hgs
parents:
diff changeset
   388
            KMPXMediaGeneralId, id );
hgs
parents:
diff changeset
   389
    
hgs
parents:
diff changeset
   390
    // define attributes fetched
hgs
parents:
diff changeset
   391
    RArray<TMPXAttribute> songAttributes;
hgs
parents:
diff changeset
   392
    CleanupClosePushL(songAttributes);
hgs
parents:
diff changeset
   393
    songAttributes.AppendL(KMPXMediaGeneralId);
hgs
parents:
diff changeset
   394
    songAttributes.AppendL(KMPXMediaGeneralUri);
hgs
parents:
diff changeset
   395
    
hgs
parents:
diff changeset
   396
    // now find
hgs
parents:
diff changeset
   397
    CMPXMedia* result = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() );
hgs
parents:
diff changeset
   398
    CleanupStack::PopAndDestroy( &songAttributes );
hgs
parents:
diff changeset
   399
    CleanupStack::PopAndDestroy( criteria );
hgs
parents:
diff changeset
   400
    
hgs
parents:
diff changeset
   401
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   402
    return result;
hgs
parents:
diff changeset
   403
    }
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
 // --------------------------------------------------------------------------
hgs
parents:
diff changeset
   407
 // Find a playlist
hgs
parents:
diff changeset
   408
 // --------------------------------------------------------------------------
hgs
parents:
diff changeset
   409
 //
hgs
parents:
diff changeset
   410
 CMPXMedia* CMediaManager::FindPlaylistL( TInt aUid )
hgs
parents:
diff changeset
   411
     {
hgs
parents:
diff changeset
   412
     TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   413
     CMPXMedia* criteria = CMPXMedia::NewL();
hgs
parents:
diff changeset
   414
     CleanupStack::PushL( criteria );
hgs
parents:
diff changeset
   415
     
hgs
parents:
diff changeset
   416
     criteria->SetTObjectValueL<TMPXGeneralType>(
hgs
parents:
diff changeset
   417
                 KMPXMediaGeneralType, EMPXItem );
hgs
parents:
diff changeset
   418
     criteria->SetTObjectValueL<TMPXGeneralCategory>(
hgs
parents:
diff changeset
   419
                 KMPXMediaGeneralCategory, EMPXPlaylist );
hgs
parents:
diff changeset
   420
     criteria->SetTObjectValueL<TMPXItemId>(
hgs
parents:
diff changeset
   421
                 KMPXMediaGeneralId, aUid );
hgs
parents:
diff changeset
   422
         
hgs
parents:
diff changeset
   423
     // define attributes fetched
hgs
parents:
diff changeset
   424
     RArray<TMPXAttribute> playlistAttributes;
hgs
parents:
diff changeset
   425
     CleanupClosePushL(playlistAttributes);
hgs
parents:
diff changeset
   426
     playlistAttributes.AppendL(KMPXMediaGeneralId);
hgs
parents:
diff changeset
   427
     playlistAttributes.AppendL(KMPXMediaGeneralCollectionId); //test
hgs
parents:
diff changeset
   428
     playlistAttributes.AppendL(KMPXMediaGeneralTitle);
hgs
parents:
diff changeset
   429
     playlistAttributes.AppendL(KMPXMediaGeneralUri);
hgs
parents:
diff changeset
   430
     
hgs
parents:
diff changeset
   431
     // now find
hgs
parents:
diff changeset
   432
     CMPXMedia* foundList = 0;
hgs
parents:
diff changeset
   433
     foundList = iCollectionHelper->FindAllL( *criteria , playlistAttributes.Array() );
hgs
parents:
diff changeset
   434
     CleanupStack::PopAndDestroy( &playlistAttributes );
hgs
parents:
diff changeset
   435
     CleanupStack::PopAndDestroy( criteria );
hgs
parents:
diff changeset
   436
     
hgs
parents:
diff changeset
   437
     CleanupStack::PushL( foundList );
hgs
parents:
diff changeset
   438
     
hgs
parents:
diff changeset
   439
     if ( !foundList->IsSupported(KMPXMediaArrayCount) )
hgs
parents:
diff changeset
   440
         {
hgs
parents:
diff changeset
   441
         LOGGER_WRITE("KMPXMediaArrayCount not supported");
hgs
parents:
diff changeset
   442
         User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   443
         }
hgs
parents:
diff changeset
   444
     
hgs
parents:
diff changeset
   445
     TInt foundItemCount = *foundList->Value<TInt>(KMPXMediaArrayCount);
hgs
parents:
diff changeset
   446
     
hgs
parents:
diff changeset
   447
     CMPXMedia* playlist(NULL);
hgs
parents:
diff changeset
   448
     if ( foundItemCount )
hgs
parents:
diff changeset
   449
         {
hgs
parents:
diff changeset
   450
         if ( !foundList->IsSupported(KMPXMediaArrayContents) )
hgs
parents:
diff changeset
   451
             {
hgs
parents:
diff changeset
   452
             LOGGER_WRITE("KMPXMediaArrayContents not supported");
hgs
parents:
diff changeset
   453
             User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   454
             }
hgs
parents:
diff changeset
   455
             
hgs
parents:
diff changeset
   456
         const CMPXMediaArray* foundArray = foundList->Value<CMPXMediaArray>(KMPXMediaArrayContents);
hgs
parents:
diff changeset
   457
         
hgs
parents:
diff changeset
   458
         // get the first founded item
hgs
parents:
diff changeset
   459
         playlist = CMPXMedia::NewL(*(*foundArray)[0]);
hgs
parents:
diff changeset
   460
         }
hgs
parents:
diff changeset
   461
     else
hgs
parents:
diff changeset
   462
         {
hgs
parents:
diff changeset
   463
         User::Leave( KErrGeneral );
hgs
parents:
diff changeset
   464
         }
hgs
parents:
diff changeset
   465
     
hgs
parents:
diff changeset
   466
     CleanupStack::PopAndDestroy( foundList );
hgs
parents:
diff changeset
   467
     
hgs
parents:
diff changeset
   468
     TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   469
     return playlist;
hgs
parents:
diff changeset
   470
     }
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
void CMediaManager::GetSongL( TInt aSongId, CSongItem& aSongItem )
hgs
parents:
diff changeset
   473
    {
hgs
parents:
diff changeset
   474
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   475
    TMPXItemId id(aSongId);
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
    RArray<TInt> contentIDs;
hgs
parents:
diff changeset
   478
    CleanupClosePushL( contentIDs );
hgs
parents:
diff changeset
   479
    contentIDs.AppendL( KMPXMediaIdMusic );
hgs
parents:
diff changeset
   480
    contentIDs.AppendL( KMPXMediaIdGeneral );
hgs
parents:
diff changeset
   481
    
hgs
parents:
diff changeset
   482
    CMPXMedia* criteria = CMPXMedia::NewL(contentIDs.Array());
hgs
parents:
diff changeset
   483
    CleanupStack::PopAndDestroy( &contentIDs );
hgs
parents:
diff changeset
   484
    CleanupStack::PushL(criteria);
hgs
parents:
diff changeset
   485
    
hgs
parents:
diff changeset
   486
    // set search keys
hgs
parents:
diff changeset
   487
    criteria->SetTObjectValueL<TMPXGeneralType>(
hgs
parents:
diff changeset
   488
            KMPXMediaGeneralType, EMPXItem );
hgs
parents:
diff changeset
   489
    criteria->SetTObjectValueL<TMPXGeneralCategory>(
hgs
parents:
diff changeset
   490
            KMPXMediaGeneralCategory, EMPXSong );   
hgs
parents:
diff changeset
   491
    criteria->SetTObjectValueL<TMPXItemId>(
hgs
parents:
diff changeset
   492
            KMPXMediaGeneralId, id );
hgs
parents:
diff changeset
   493
    
hgs
parents:
diff changeset
   494
    // define attributes fetched
hgs
parents:
diff changeset
   495
    RArray<TMPXAttribute> songAttributes;
hgs
parents:
diff changeset
   496
    CleanupClosePushL(songAttributes);
hgs
parents:
diff changeset
   497
    
hgs
parents:
diff changeset
   498
    songAttributes.AppendL( KMPXMediaGeneralType );
hgs
parents:
diff changeset
   499
    songAttributes.AppendL( KMPXMediaGeneralCategory );
hgs
parents:
diff changeset
   500
    songAttributes.AppendL( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
   501
    songAttributes.AppendL( KMPXMediaGeneralId );
hgs
parents:
diff changeset
   502
    songAttributes.AppendL( KMPXMediaGeneralTitle );
hgs
parents:
diff changeset
   503
    songAttributes.AppendL( KMPXMediaGeneralMimeType );
hgs
parents:
diff changeset
   504
    songAttributes.AppendL( KMPXMediaGeneralDuration );
hgs
parents:
diff changeset
   505
    songAttributes.AppendL( KMPXMediaGeneralComment );
hgs
parents:
diff changeset
   506
    
hgs
parents:
diff changeset
   507
    songAttributes.AppendL( KMPXMediaMusicArtist );
hgs
parents:
diff changeset
   508
    songAttributes.AppendL( KMPXMediaMusicAlbum );
hgs
parents:
diff changeset
   509
    songAttributes.AppendL( KMPXMediaMusicYear );
hgs
parents:
diff changeset
   510
    songAttributes.AppendL( KMPXMediaMusicAlbumTrack );
hgs
parents:
diff changeset
   511
    songAttributes.AppendL( KMPXMediaMusicGenre );
hgs
parents:
diff changeset
   512
    songAttributes.AppendL( KMPXMediaMusicComposer );
hgs
parents:
diff changeset
   513
    
hgs
parents:
diff changeset
   514
    // now find
hgs
parents:
diff changeset
   515
    CMPXMedia* result = 0;
hgs
parents:
diff changeset
   516
    TRAPD(err, result = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() ));
hgs
parents:
diff changeset
   517
    CleanupStack::PopAndDestroy( &songAttributes );
hgs
parents:
diff changeset
   518
    CleanupStack::PopAndDestroy( criteria );
hgs
parents:
diff changeset
   519
    
hgs
parents:
diff changeset
   520
    if ( err )
hgs
parents:
diff changeset
   521
        {
hgs
parents:
diff changeset
   522
        LOGGER_WRITE_1("FindAllL err: %d", err);
hgs
parents:
diff changeset
   523
        User::Leave( err );
hgs
parents:
diff changeset
   524
        }
hgs
parents:
diff changeset
   525
    
hgs
parents:
diff changeset
   526
    CleanupStack::PushL( result );
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
    if ( !result->IsSupported(KMPXMediaArrayCount) )
hgs
parents:
diff changeset
   529
         {
hgs
parents:
diff changeset
   530
         LOGGER_WRITE("KMPXMediaArrayCount not supported");
hgs
parents:
diff changeset
   531
         User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   532
         }
hgs
parents:
diff changeset
   533
    
hgs
parents:
diff changeset
   534
    if ( !result->IsSupported( KMPXMediaArrayContents ) )
hgs
parents:
diff changeset
   535
        {
hgs
parents:
diff changeset
   536
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   537
        }
hgs
parents:
diff changeset
   538
    
hgs
parents:
diff changeset
   539
    const CMPXMediaArray* songsArray =
hgs
parents:
diff changeset
   540
    result->Value<CMPXMediaArray>(KMPXMediaArrayContents);
hgs
parents:
diff changeset
   541
    if ( songsArray->Count() == 0 )
hgs
parents:
diff changeset
   542
        {
hgs
parents:
diff changeset
   543
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   544
        }
hgs
parents:
diff changeset
   545
    const CMPXMedia* songMedia = (*songsArray)[0];
hgs
parents:
diff changeset
   546
    
hgs
parents:
diff changeset
   547
    ReadSongAttributesL( *songMedia, aSongItem, ETrue );
hgs
parents:
diff changeset
   548
    
hgs
parents:
diff changeset
   549
    CleanupStack::PopAndDestroy( result );
hgs
parents:
diff changeset
   550
    
hgs
parents:
diff changeset
   551
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   552
    }
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
CMPXMedia* CMediaManager::CreatePlaylistMediaL( const CPlaylistItem& aPlaylist )
hgs
parents:
diff changeset
   555
    {
hgs
parents:
diff changeset
   556
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   557
    RArray<TInt> contentIDs;
hgs
parents:
diff changeset
   558
    contentIDs.AppendL(KMPXMediaIdGeneral);
hgs
parents:
diff changeset
   559
    
hgs
parents:
diff changeset
   560
    CMPXMedia* playlist = CMPXMedia::NewL( contentIDs.Array() );
hgs
parents:
diff changeset
   561
    CleanupStack::PushL( playlist );
hgs
parents:
diff changeset
   562
    contentIDs.Close();
hgs
parents:
diff changeset
   563
    // add playlist info into the playlist media
hgs
parents:
diff changeset
   564
    playlist->SetTObjectValueL<TUid>(
hgs
parents:
diff changeset
   565
        KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
hgs
parents:
diff changeset
   566
    
hgs
parents:
diff changeset
   567
    // set playlist title
hgs
parents:
diff changeset
   568
    playlist->SetTextValueL( KMPXMediaGeneralTitle, aPlaylist.Title() );
hgs
parents:
diff changeset
   569
    
hgs
parents:
diff changeset
   570
    // set type
hgs
parents:
diff changeset
   571
    playlist->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
hgs
parents:
diff changeset
   572
     
hgs
parents:
diff changeset
   573
    // set category
hgs
parents:
diff changeset
   574
    playlist->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); 
hgs
parents:
diff changeset
   575
    
hgs
parents:
diff changeset
   576
    
hgs
parents:
diff changeset
   577
    TFileName playlistfile;
hgs
parents:
diff changeset
   578
    
hgs
parents:
diff changeset
   579
    TInt drive;
hgs
parents:
diff changeset
   580
    User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultMassStorage, drive) );
hgs
parents:
diff changeset
   581
    TUint driveStatus( 0 );
hgs
parents:
diff changeset
   582
    TInt err = DriveInfo::GetDriveStatus( iFs, drive, driveStatus );
hgs
parents:
diff changeset
   583
    if ( !err && (driveStatus & DriveInfo::EDrivePresent) )
hgs
parents:
diff changeset
   584
        {
hgs
parents:
diff changeset
   585
        User::LeaveIfError( PathInfo::GetRootPath( playlistfile, drive ) );
hgs
parents:
diff changeset
   586
        LOGGER_WRITE_1("mmc playlistfile: %S", &playlistfile);
hgs
parents:
diff changeset
   587
        }
hgs
parents:
diff changeset
   588
    else
hgs
parents:
diff changeset
   589
        {
hgs
parents:
diff changeset
   590
        playlistfile = PathInfo::PhoneMemoryRootPath();
hgs
parents:
diff changeset
   591
        LOGGER_WRITE_1("phone playlistfile: %S", &playlistfile);
hgs
parents:
diff changeset
   592
        }
hgs
parents:
diff changeset
   593
    
hgs
parents:
diff changeset
   594
    playlistfile.Append( KPlaylistPath );
hgs
parents:
diff changeset
   595
    
hgs
parents:
diff changeset
   596
    // set location drive
hgs
parents:
diff changeset
   597
    TDriveUnit driveUnit( playlistfile );
hgs
parents:
diff changeset
   598
    TPtrC driveName = driveUnit.Name();
hgs
parents:
diff changeset
   599
    playlist->SetTextValueL( KMPXMediaGeneralDrive, driveName );
hgs
parents:
diff changeset
   600
    
hgs
parents:
diff changeset
   601
    
hgs
parents:
diff changeset
   602
    TTime time;
hgs
parents:
diff changeset
   603
    time.HomeTime();
hgs
parents:
diff changeset
   604
    playlistfile.AppendNum(time.Int64());
hgs
parents:
diff changeset
   605
    playlistfile.Append(KMPXVirtualPlaylistExt);
hgs
parents:
diff changeset
   606
    
hgs
parents:
diff changeset
   607
    LOGGER_WRITE_1("playlistfile: %S", &playlistfile);
hgs
parents:
diff changeset
   608
    playlist->SetTextValueL(
hgs
parents:
diff changeset
   609
             KMPXMediaGeneralUri, playlistfile );
hgs
parents:
diff changeset
   610
    
hgs
parents:
diff changeset
   611
    // set DbFlags to indicate that this is a virtual playlist
hgs
parents:
diff changeset
   612
    playlist->SetTObjectValueL<TUint>(KMPXMediaGeneralFlags,
hgs
parents:
diff changeset
   613
       KMPXMediaGeneralFlagsSetOrUnsetBit | KMPXMediaGeneralFlagsIsVirtual);
hgs
parents:
diff changeset
   614
hgs
parents:
diff changeset
   615
    // create songs
hgs
parents:
diff changeset
   616
    CMPXMediaArray* medias = CreateMediaArrayLC( aPlaylist );
hgs
parents:
diff changeset
   617
    // set medias
hgs
parents:
diff changeset
   618
    playlist->SetCObjectValueL( KMPXMediaArrayContents, medias );
hgs
parents:
diff changeset
   619
    /// set media count        
hgs
parents:
diff changeset
   620
    playlist->SetTObjectValueL( KMPXMediaArrayCount, medias->Count() );
hgs
parents:
diff changeset
   621
    
hgs
parents:
diff changeset
   622
    CleanupStack::PopAndDestroy(medias);
hgs
parents:
diff changeset
   623
    CleanupStack::Pop(playlist);
hgs
parents:
diff changeset
   624
    
hgs
parents:
diff changeset
   625
    
hgs
parents:
diff changeset
   626
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   627
    return playlist;
hgs
parents:
diff changeset
   628
    }
hgs
parents:
diff changeset
   629
hgs
parents:
diff changeset
   630
CMPXMediaArray* CMediaManager::CreateMediaArrayLC( const CPlaylistItem& aList )
hgs
parents:
diff changeset
   631
    {
hgs
parents:
diff changeset
   632
    CMPXMediaArray* medias = CMPXMediaArray::NewL();
hgs
parents:
diff changeset
   633
    CleanupStack::PushL( medias );
hgs
parents:
diff changeset
   634
    //
hgs
parents:
diff changeset
   635
    // create entries
hgs
parents:
diff changeset
   636
    //
hgs
parents:
diff changeset
   637
    TInt itemCount = aList.ItemCount();
hgs
parents:
diff changeset
   638
    for ( TInt i=0; i<itemCount; i++)
hgs
parents:
diff changeset
   639
        {
hgs
parents:
diff changeset
   640
        TPtrC16 ptrUri = aList.ItemAt(i);
hgs
parents:
diff changeset
   641
        LOGGER_WRITE_1("add uri: %S", &ptrUri);
hgs
parents:
diff changeset
   642
        iCollectionHelper->AddL( ptrUri, this );
hgs
parents:
diff changeset
   643
        iWaitOngoing = ETrue;
hgs
parents:
diff changeset
   644
        LOGGER_WRITE("iWait.Start");
hgs
parents:
diff changeset
   645
        iWait.Start();
hgs
parents:
diff changeset
   646
        LOGGER_WRITE("continue..");
hgs
parents:
diff changeset
   647
    
hgs
parents:
diff changeset
   648
        RArray<TInt> contentIDs;
hgs
parents:
diff changeset
   649
        contentIDs.AppendL(KMPXMediaIdGeneral);
hgs
parents:
diff changeset
   650
        contentIDs.AppendL(KMPXMediaIdAudio);
hgs
parents:
diff changeset
   651
        contentIDs.AppendL(KMPXMediaIdMusic);
hgs
parents:
diff changeset
   652
        contentIDs.AppendL(KMPXMediaIdMTP); 
hgs
parents:
diff changeset
   653
        
hgs
parents:
diff changeset
   654
        CMPXMedia* entry = CMPXMedia::NewL( contentIDs.Array() );
hgs
parents:
diff changeset
   655
        CleanupStack::PushL( entry );
hgs
parents:
diff changeset
   656
        contentIDs.Close();
hgs
parents:
diff changeset
   657
        
hgs
parents:
diff changeset
   658
        entry->SetTObjectValueL<TUid>(
hgs
parents:
diff changeset
   659
                KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
hgs
parents:
diff changeset
   660
        
hgs
parents:
diff changeset
   661
        entry->SetTObjectValueL<TMPXGeneralType>(
hgs
parents:
diff changeset
   662
                     KMPXMediaGeneralType, EMPXItem );
hgs
parents:
diff changeset
   663
        
hgs
parents:
diff changeset
   664
        entry->SetTObjectValueL<TMPXGeneralCategory>(
hgs
parents:
diff changeset
   665
                     KMPXMediaGeneralCategory, EMPXSong );
hgs
parents:
diff changeset
   666
        
hgs
parents:
diff changeset
   667
        
hgs
parents:
diff changeset
   668
        entry->SetTextValueL( KMPXMediaGeneralUri, ptrUri );
hgs
parents:
diff changeset
   669
        
hgs
parents:
diff changeset
   670
        // set location drive
hgs
parents:
diff changeset
   671
        TDriveUnit driveUnit( ptrUri );
hgs
parents:
diff changeset
   672
        TPtrC driveName = driveUnit.Name();
hgs
parents:
diff changeset
   673
        entry->SetTextValueL( KMPXMediaGeneralDrive, driveName );
hgs
parents:
diff changeset
   674
        
hgs
parents:
diff changeset
   675
        medias->AppendL(entry);
hgs
parents:
diff changeset
   676
        CleanupStack::Pop(entry);
hgs
parents:
diff changeset
   677
        }
hgs
parents:
diff changeset
   678
    return medias;
hgs
parents:
diff changeset
   679
    }
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
void CMediaManager::CreateNewPlaylistL( TInt& aNewUid, CPlaylistItem& aList )
hgs
parents:
diff changeset
   682
    {
hgs
parents:
diff changeset
   683
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   684
    
hgs
parents:
diff changeset
   685
    CMPXMedia* playlist = CreatePlaylistMediaL( aList );
hgs
parents:
diff changeset
   686
    CleanupStack::PushL( playlist );
hgs
parents:
diff changeset
   687
    iMediator->AddItemL( playlist );
hgs
parents:
diff changeset
   688
    
hgs
parents:
diff changeset
   689
    if ( !playlist->IsSupported(KMPXMediaGeneralId) )
hgs
parents:
diff changeset
   690
        {
hgs
parents:
diff changeset
   691
        LOGGER_WRITE("KMPXMediaGeneralId not supported");
hgs
parents:
diff changeset
   692
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   693
        }
hgs
parents:
diff changeset
   694
    else
hgs
parents:
diff changeset
   695
        {
hgs
parents:
diff changeset
   696
        // Extract the playlist id from the found object
hgs
parents:
diff changeset
   697
        TUint32 playlistId = *playlist->Value<TMPXItemId>(KMPXMediaGeneralId);
hgs
parents:
diff changeset
   698
        LOGGER_WRITE_1("KMPXMediaGeneralId: %d", playlistId);
hgs
parents:
diff changeset
   699
        aNewUid = playlistId;
hgs
parents:
diff changeset
   700
        
hgs
parents:
diff changeset
   701
        if ( !playlist->IsSupported( KMPXMediaGeneralUri ) )
hgs
parents:
diff changeset
   702
            {
hgs
parents:
diff changeset
   703
            // get url
hgs
parents:
diff changeset
   704
            const TDesC& uri = playlist->ValueText( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
   705
            aList.SetUrlL( uri );
hgs
parents:
diff changeset
   706
            }
hgs
parents:
diff changeset
   707
        }
hgs
parents:
diff changeset
   708
    
hgs
parents:
diff changeset
   709
    CleanupStack::PopAndDestroy(playlist);
hgs
parents:
diff changeset
   710
    
hgs
parents:
diff changeset
   711
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   712
    }
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
void CMediaManager::ReplacePlaylistL( TInt aPlaylistId, CPlaylistItem& aPlaylist )
hgs
parents:
diff changeset
   715
    {
hgs
parents:
diff changeset
   716
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   717
    CMPXMedia* playlist = CMPXMedia::NewL();
hgs
parents:
diff changeset
   718
    CleanupStack::PushL( playlist );
hgs
parents:
diff changeset
   719
    
hgs
parents:
diff changeset
   720
    // add playlist info into the playlist media
hgs
parents:
diff changeset
   721
    playlist->SetTObjectValueL<TUid>(
hgs
parents:
diff changeset
   722
        KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
hgs
parents:
diff changeset
   723
    
hgs
parents:
diff changeset
   724
    // set type
hgs
parents:
diff changeset
   725
    playlist->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
hgs
parents:
diff changeset
   726
     
hgs
parents:
diff changeset
   727
    // set category
hgs
parents:
diff changeset
   728
    playlist->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); 
hgs
parents:
diff changeset
   729
    
hgs
parents:
diff changeset
   730
    
hgs
parents:
diff changeset
   731
    
hgs
parents:
diff changeset
   732
    // find playlist uri
hgs
parents:
diff changeset
   733
    CMPXMedia* oldPlaylist = FindPlaylistL( aPlaylistId );
hgs
parents:
diff changeset
   734
    CleanupStack::PushL( oldPlaylist );
hgs
parents:
diff changeset
   735
    if ( !oldPlaylist->IsSupported(KMPXMediaGeneralUri) )
hgs
parents:
diff changeset
   736
        {
hgs
parents:
diff changeset
   737
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   738
        }
hgs
parents:
diff changeset
   739
    const TDesC& uri = oldPlaylist->ValueText( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
   740
    LOGGER_WRITE_1("uri: %S", &uri);
hgs
parents:
diff changeset
   741
    
hgs
parents:
diff changeset
   742
    playlist->SetTextValueL(
hgs
parents:
diff changeset
   743
            KMPXMediaGeneralUri, uri );
hgs
parents:
diff changeset
   744
    
hgs
parents:
diff changeset
   745
	aPlaylist.SetUrlL( uri );
hgs
parents:
diff changeset
   746
    
hgs
parents:
diff changeset
   747
    const TDesC& title = oldPlaylist->ValueText( KMPXMediaGeneralTitle );
hgs
parents:
diff changeset
   748
    if ( title.Compare( aPlaylist.Title() ) != 0 )
hgs
parents:
diff changeset
   749
        {
hgs
parents:
diff changeset
   750
        LOGGER_WRITE_1("title changed old: %S", &title);
hgs
parents:
diff changeset
   751
        LOGGER_WRITE_1("new title: %S", &aPlaylist.Title());
hgs
parents:
diff changeset
   752
        // set playlist title
hgs
parents:
diff changeset
   753
        playlist->SetTextValueL( KMPXMediaGeneralTitle, aPlaylist.Title() );
hgs
parents:
diff changeset
   754
        
hgs
parents:
diff changeset
   755
        // update title first
hgs
parents:
diff changeset
   756
        iMediator->SetItemL( playlist );
hgs
parents:
diff changeset
   757
        }
hgs
parents:
diff changeset
   758
    
hgs
parents:
diff changeset
   759
    
hgs
parents:
diff changeset
   760
    CleanupStack::PopAndDestroy( oldPlaylist );
hgs
parents:
diff changeset
   761
    
hgs
parents:
diff changeset
   762
    // update songs
hgs
parents:
diff changeset
   763
    CMPXMediaArray* songArray = CreateMediaArrayLC( aPlaylist );
hgs
parents:
diff changeset
   764
    // set medias
hgs
parents:
diff changeset
   765
    playlist->SetCObjectValueL( KMPXMediaArrayContents, songArray );
hgs
parents:
diff changeset
   766
    /// set media count        
hgs
parents:
diff changeset
   767
    playlist->SetTObjectValueL( KMPXMediaArrayCount, songArray->Count() );
hgs
parents:
diff changeset
   768
    
hgs
parents:
diff changeset
   769
    iMediator->SetItemL( playlist );
hgs
parents:
diff changeset
   770
    
hgs
parents:
diff changeset
   771
    CleanupStack::PopAndDestroy( songArray );
hgs
parents:
diff changeset
   772
    CleanupStack::PopAndDestroy( playlist );
hgs
parents:
diff changeset
   773
    
hgs
parents:
diff changeset
   774
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   775
    }
hgs
parents:
diff changeset
   776
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
void CMediaManager::DeletePlaylistL( TInt aPlaylistId )
hgs
parents:
diff changeset
   779
    {
hgs
parents:
diff changeset
   780
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   781
    
hgs
parents:
diff changeset
   782
    CMPXMedia* playlist = FindPlaylistL( aPlaylistId );
hgs
parents:
diff changeset
   783
    CleanupStack::PushL( playlist );
hgs
parents:
diff changeset
   784
    iCollection->Collection().RemoveL( *playlist );
hgs
parents:
diff changeset
   785
    CleanupStack::PopAndDestroy( playlist );
hgs
parents:
diff changeset
   786
    
hgs
parents:
diff changeset
   787
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   788
    }
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
void CMediaManager::HandleAddFileCompleteL( TInt aErr )
hgs
parents:
diff changeset
   791
    {
hgs
parents:
diff changeset
   792
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   793
    LOGGER_WRITE_1("aErr: %d", aErr);
hgs
parents:
diff changeset
   794
    if ( iWaitOngoing )
hgs
parents:
diff changeset
   795
        {
hgs
parents:
diff changeset
   796
        LOGGER_WRITE("AsyncStop");
hgs
parents:
diff changeset
   797
        iWaitOngoing = EFalse;
hgs
parents:
diff changeset
   798
        iWait.AsyncStop();
hgs
parents:
diff changeset
   799
        }
hgs
parents:
diff changeset
   800
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   801
    }
hgs
parents:
diff changeset
   802
hgs
parents:
diff changeset
   803
void CMediaManager::ReadSongAttributesL( const CMPXMedia& aMedia, CSongItem& aSongItem,
hgs
parents:
diff changeset
   804
        TBool aReadFileDetails )
hgs
parents:
diff changeset
   805
    {
hgs
parents:
diff changeset
   806
    if ( !aMedia.IsSupported(KMPXMediaGeneralUri) )
hgs
parents:
diff changeset
   807
        {
hgs
parents:
diff changeset
   808
        LOGGER_WRITE("KMPXMediaGeneralUri not supported");
hgs
parents:
diff changeset
   809
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   810
        }    
hgs
parents:
diff changeset
   811
    
hgs
parents:
diff changeset
   812
    if ( !aMedia.IsSupported(KMPXMediaGeneralId) )
hgs
parents:
diff changeset
   813
        {
hgs
parents:
diff changeset
   814
        LOGGER_WRITE("KMPXMediaGeneralId not supported");
hgs
parents:
diff changeset
   815
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
    
hgs
parents:
diff changeset
   818
    aSongItem.SetId( *aMedia.Value<TMPXItemId>(KMPXMediaGeneralId) );
hgs
parents:
diff changeset
   819
    
hgs
parents:
diff changeset
   820
    const TDesC& uri = aMedia.ValueText(KMPXMediaGeneralUri);
hgs
parents:
diff changeset
   821
    aSongItem.SetUriL( uri );
hgs
parents:
diff changeset
   822
    
hgs
parents:
diff changeset
   823
    if ( aMedia.IsSupported(KMPXMediaGeneralTitle) )
hgs
parents:
diff changeset
   824
        {
hgs
parents:
diff changeset
   825
        aSongItem.SetTitleL( aMedia.ValueText(KMPXMediaGeneralTitle) );
hgs
parents:
diff changeset
   826
        }
hgs
parents:
diff changeset
   827
    
hgs
parents:
diff changeset
   828
    if ( aMedia.IsSupported(KMPXMediaGeneralMimeType) )
hgs
parents:
diff changeset
   829
        {
hgs
parents:
diff changeset
   830
        aSongItem.SetMimeTypeL( aMedia.ValueText(KMPXMediaGeneralMimeType) );
hgs
parents:
diff changeset
   831
        }
hgs
parents:
diff changeset
   832
    
hgs
parents:
diff changeset
   833
    if ( aMedia.IsSupported(KMPXMediaGeneralDuration) )
hgs
parents:
diff changeset
   834
        {
hgs
parents:
diff changeset
   835
        aSongItem.SetDuration( aMedia.ValueTObjectL<TInt>(KMPXMediaGeneralDuration) );
hgs
parents:
diff changeset
   836
        }
hgs
parents:
diff changeset
   837
    
hgs
parents:
diff changeset
   838
    if ( aMedia.IsSupported(KMPXMediaMusicArtist) )
hgs
parents:
diff changeset
   839
        {
hgs
parents:
diff changeset
   840
        aSongItem.SetArtistL( aMedia.ValueText(KMPXMediaMusicArtist) );
hgs
parents:
diff changeset
   841
        }
hgs
parents:
diff changeset
   842
    
hgs
parents:
diff changeset
   843
    if ( aMedia.IsSupported(KMPXMediaMusicAlbum) )
hgs
parents:
diff changeset
   844
        {
hgs
parents:
diff changeset
   845
        aSongItem.SetAlbumL( aMedia.ValueText(KMPXMediaMusicAlbum) );
hgs
parents:
diff changeset
   846
        }
hgs
parents:
diff changeset
   847
    
hgs
parents:
diff changeset
   848
    if ( aMedia.IsSupported(KMPXMediaMusicYear) )
hgs
parents:
diff changeset
   849
        {
hgs
parents:
diff changeset
   850
        TInt64 year = aMedia.ValueTObjectL<TInt64>( KMPXMediaMusicYear );
hgs
parents:
diff changeset
   851
        TTime yearTime( year);
hgs
parents:
diff changeset
   852
        aSongItem.SetYear( yearTime.DateTime().Year() );
hgs
parents:
diff changeset
   853
        }
hgs
parents:
diff changeset
   854
    
hgs
parents:
diff changeset
   855
    if ( aMedia.IsSupported(KMPXMediaMusicAlbumTrack) )
hgs
parents:
diff changeset
   856
        {
hgs
parents:
diff changeset
   857
        aSongItem.SetAlbumTrack( *aMedia.Value<TInt>(KMPXMediaMusicAlbumTrack) );
hgs
parents:
diff changeset
   858
        }
hgs
parents:
diff changeset
   859
    
hgs
parents:
diff changeset
   860
    if ( aMedia.IsSupported(KMPXMediaMusicGenre) )
hgs
parents:
diff changeset
   861
        {
hgs
parents:
diff changeset
   862
        const TDesC& genre = aMedia.ValueText(KMPXMediaMusicGenre);
hgs
parents:
diff changeset
   863
        aSongItem.SetGenreL( genre );
hgs
parents:
diff changeset
   864
        }
hgs
parents:
diff changeset
   865
    
hgs
parents:
diff changeset
   866
    if ( aMedia.IsSupported(KMPXMediaMusicComposer) )
hgs
parents:
diff changeset
   867
        {
hgs
parents:
diff changeset
   868
        aSongItem.SetComposerL( aMedia.ValueText(KMPXMediaMusicComposer) );
hgs
parents:
diff changeset
   869
        }
hgs
parents:
diff changeset
   870
    
hgs
parents:
diff changeset
   871
    if ( aMedia.IsSupported(KMPXMediaGeneralComment) )
hgs
parents:
diff changeset
   872
        {
hgs
parents:
diff changeset
   873
        aSongItem.SetCommentL( aMedia.ValueText(KMPXMediaGeneralComment) );
hgs
parents:
diff changeset
   874
        }
hgs
parents:
diff changeset
   875
    
hgs
parents:
diff changeset
   876
    // Reading file timestamp and size is slow, read only if needed
hgs
parents:
diff changeset
   877
    if ( aReadFileDetails )
hgs
parents:
diff changeset
   878
        {
hgs
parents:
diff changeset
   879
        TEntry fileEntry;
hgs
parents:
diff changeset
   880
        TInt err = iFs.Entry(uri,fileEntry);
hgs
parents:
diff changeset
   881
        if ( !err )
hgs
parents:
diff changeset
   882
            {
hgs
parents:
diff changeset
   883
            aSongItem.SetModifiedTime( fileEntry.iModified );
hgs
parents:
diff changeset
   884
            aSongItem.SetFileSize( fileEntry.iSize );
hgs
parents:
diff changeset
   885
            }
hgs
parents:
diff changeset
   886
        }
hgs
parents:
diff changeset
   887
    
hgs
parents:
diff changeset
   888
    }
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
hgs
parents:
diff changeset
   891
void CMediaManager::DoCancel()
hgs
parents:
diff changeset
   892
    {
hgs
parents:
diff changeset
   893
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   894
    
hgs
parents:
diff changeset
   895
    delete iFoundedMedia;
hgs
parents:
diff changeset
   896
    iFoundedMedia = NULL;
hgs
parents:
diff changeset
   897
    iReadedItems = 0;
hgs
parents:
diff changeset
   898
    iItemsFound = 0;      
hgs
parents:
diff changeset
   899
    TState state = iCurrentState;
hgs
parents:
diff changeset
   900
    iCurrentState = EIdle;
hgs
parents:
diff changeset
   901
    
hgs
parents:
diff changeset
   902
    switch (state)
hgs
parents:
diff changeset
   903
        {
hgs
parents:
diff changeset
   904
        case EReadingPlaylistCount:
hgs
parents:
diff changeset
   905
        case EEnumeratingPlaylists:
hgs
parents:
diff changeset
   906
            iObserver->RegisterAllPlayListsCompleted( KErrCancel );
hgs
parents:
diff changeset
   907
            break;
hgs
parents:
diff changeset
   908
            
hgs
parents:
diff changeset
   909
        case EReadingSongCount:
hgs
parents:
diff changeset
   910
        case EEnumeratingSongs:
hgs
parents:
diff changeset
   911
            iObserver->RegisterAllSongsCompleted( KErrCancel );
hgs
parents:
diff changeset
   912
            break;
hgs
parents:
diff changeset
   913
        default:
hgs
parents:
diff changeset
   914
            break;
hgs
parents:
diff changeset
   915
        }
hgs
parents:
diff changeset
   916
    
hgs
parents:
diff changeset
   917
    LOGGER_WRITE("signal cancel");
hgs
parents:
diff changeset
   918
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   919
    User::RequestComplete( status, KErrCancel );
hgs
parents:
diff changeset
   920
    
hgs
parents:
diff changeset
   921
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   922
    }
hgs
parents:
diff changeset
   923
hgs
parents:
diff changeset
   924
void CMediaManager::RunL()
hgs
parents:
diff changeset
   925
    {
hgs
parents:
diff changeset
   926
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   927
    LOGGER_WRITE_1("iStatus.Int(): %d", iStatus.Int())
hgs
parents:
diff changeset
   928
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   929
    switch (iCurrentState)
hgs
parents:
diff changeset
   930
        {
hgs
parents:
diff changeset
   931
        case EReadingPlaylistCount:
hgs
parents:
diff changeset
   932
            //if ( !iCancel )
hgs
parents:
diff changeset
   933
            //    {
hgs
parents:
diff changeset
   934
                ReadPlaylistCountL();
hgs
parents:
diff changeset
   935
                iReadedItems=0;
hgs
parents:
diff changeset
   936
                // next state
hgs
parents:
diff changeset
   937
                iCurrentState = EEnumeratingPlaylists;
hgs
parents:
diff changeset
   938
                SetActive();
hgs
parents:
diff changeset
   939
                User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
   940
            /*    }
hgs
parents:
diff changeset
   941
            else
hgs
parents:
diff changeset
   942
                {
hgs
parents:
diff changeset
   943
                LOGGER_WRITE("cancel");
hgs
parents:
diff changeset
   944
                iCancel = EFalse;
hgs
parents:
diff changeset
   945
                delete iFoundedMedia; iFoundedMedia = NULL;
hgs
parents:
diff changeset
   946
                iReadedItems = 0;
hgs
parents:
diff changeset
   947
                iItemsFound = 0;
hgs
parents:
diff changeset
   948
                iCurrentState = EIdle;
hgs
parents:
diff changeset
   949
                iObserver->RegisterAllPlayListsCompleted( KErrCancel );
hgs
parents:
diff changeset
   950
                }*/
hgs
parents:
diff changeset
   951
            break;
hgs
parents:
diff changeset
   952
            
hgs
parents:
diff changeset
   953
        case EEnumeratingPlaylists:
hgs
parents:
diff changeset
   954
            //if ( !iCancel )
hgs
parents:
diff changeset
   955
            //    {
hgs
parents:
diff changeset
   956
                ReadPlaylistItemsL();
hgs
parents:
diff changeset
   957
                if ( iReadedItems == iItemsFound )
hgs
parents:
diff changeset
   958
                    {
hgs
parents:
diff changeset
   959
                    // all items readed
hgs
parents:
diff changeset
   960
                    delete iFoundedMedia;
hgs
parents:
diff changeset
   961
                    iFoundedMedia = NULL;
hgs
parents:
diff changeset
   962
                    // next state
hgs
parents:
diff changeset
   963
                    iCurrentState = EIdle;
hgs
parents:
diff changeset
   964
                    iObserver->RegisterAllPlayListsCompleted( KErrNone );
hgs
parents:
diff changeset
   965
                    }
hgs
parents:
diff changeset
   966
                else
hgs
parents:
diff changeset
   967
                    {
hgs
parents:
diff changeset
   968
                    // not ready yet, continue same operation
hgs
parents:
diff changeset
   969
                    SetActive();
hgs
parents:
diff changeset
   970
                    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
   971
                    }
hgs
parents:
diff changeset
   972
             /*   }
hgs
parents:
diff changeset
   973
            else
hgs
parents:
diff changeset
   974
                {
hgs
parents:
diff changeset
   975
                // cancel
hgs
parents:
diff changeset
   976
                LOGGER_WRITE("cancel");
hgs
parents:
diff changeset
   977
                iCancel = EFalse;
hgs
parents:
diff changeset
   978
                delete iFoundedMedia; iFoundedMedia = NULL;
hgs
parents:
diff changeset
   979
                iReadedItems = 0;
hgs
parents:
diff changeset
   980
                iItemsFound = 0;
hgs
parents:
diff changeset
   981
                iCurrentState = EIdle;
hgs
parents:
diff changeset
   982
                iObserver->RegisterAllPlayListsCompleted( KErrCancel );
hgs
parents:
diff changeset
   983
                }*/
hgs
parents:
diff changeset
   984
            break;
hgs
parents:
diff changeset
   985
            
hgs
parents:
diff changeset
   986
        case EReadingSongCount:
hgs
parents:
diff changeset
   987
            //if ( !iCancel )
hgs
parents:
diff changeset
   988
            //    {
hgs
parents:
diff changeset
   989
                ReadSongCountL();
hgs
parents:
diff changeset
   990
                iReadedItems=0;
hgs
parents:
diff changeset
   991
                // next state
hgs
parents:
diff changeset
   992
                iCurrentState = EEnumeratingSongs;
hgs
parents:
diff changeset
   993
                SetActive();
hgs
parents:
diff changeset
   994
                User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
   995
            /*    }
hgs
parents:
diff changeset
   996
            else
hgs
parents:
diff changeset
   997
                {
hgs
parents:
diff changeset
   998
                LOGGER_WRITE("cancel");
hgs
parents:
diff changeset
   999
                iCancel = EFalse;
hgs
parents:
diff changeset
  1000
                delete iFoundedMedia; iFoundedMedia = NULL;
hgs
parents:
diff changeset
  1001
                iReadedItems = 0;
hgs
parents:
diff changeset
  1002
                iItemsFound = 0;
hgs
parents:
diff changeset
  1003
                iCurrentState = EIdle;
hgs
parents:
diff changeset
  1004
                iObserver->RegisterAllSongsCompleted( KErrCancel );
hgs
parents:
diff changeset
  1005
                }*/
hgs
parents:
diff changeset
  1006
            break;
hgs
parents:
diff changeset
  1007
            
hgs
parents:
diff changeset
  1008
        case EEnumeratingSongs:
hgs
parents:
diff changeset
  1009
//            if ( !iCancel )
hgs
parents:
diff changeset
  1010
              //  {
hgs
parents:
diff changeset
  1011
                ReadSongItemsL();
hgs
parents:
diff changeset
  1012
                if ( iReadedItems == iItemsFound )
hgs
parents:
diff changeset
  1013
                    {
hgs
parents:
diff changeset
  1014
                    // all items readed
hgs
parents:
diff changeset
  1015
                    delete iFoundedMedia;
hgs
parents:
diff changeset
  1016
                    iFoundedMedia = NULL;
hgs
parents:
diff changeset
  1017
                    // next state
hgs
parents:
diff changeset
  1018
                    iCurrentState = EIdle;
hgs
parents:
diff changeset
  1019
                    iObserver->RegisterAllSongsCompleted( KErrNone );
hgs
parents:
diff changeset
  1020
                    }
hgs
parents:
diff changeset
  1021
                else
hgs
parents:
diff changeset
  1022
                    {
hgs
parents:
diff changeset
  1023
                    // not ready yet, continue same operation
hgs
parents:
diff changeset
  1024
                    SetActive();
hgs
parents:
diff changeset
  1025
                    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
  1026
                    }
hgs
parents:
diff changeset
  1027
              /*  }
hgs
parents:
diff changeset
  1028
            else
hgs
parents:
diff changeset
  1029
                {
hgs
parents:
diff changeset
  1030
                LOGGER_WRITE("cancel");
hgs
parents:
diff changeset
  1031
                iCancel = EFalse;
hgs
parents:
diff changeset
  1032
                delete iFoundedMedia; iFoundedMedia = NULL;
hgs
parents:
diff changeset
  1033
                iReadedItems = 0;
hgs
parents:
diff changeset
  1034
                iItemsFound = 0;
hgs
parents:
diff changeset
  1035
                iCurrentState = EIdle;
hgs
parents:
diff changeset
  1036
                iObserver->RegisterAllSongsCompleted( KErrCancel );
hgs
parents:
diff changeset
  1037
                }*/
hgs
parents:
diff changeset
  1038
            break;
hgs
parents:
diff changeset
  1039
        default:
hgs
parents:
diff changeset
  1040
            break;
hgs
parents:
diff changeset
  1041
        }
hgs
parents:
diff changeset
  1042
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1043
    }
hgs
parents:
diff changeset
  1044
hgs
parents:
diff changeset
  1045
hgs
parents:
diff changeset
  1046
TInt CMediaManager::RunError( TInt aError )
hgs
parents:
diff changeset
  1047
    {
hgs
parents:
diff changeset
  1048
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1049
    LOGGER_WRITE_1("aError: %d", aError)
hgs
parents:
diff changeset
  1050
    switch (iCurrentState)
hgs
parents:
diff changeset
  1051
        {
hgs
parents:
diff changeset
  1052
        case EReadingPlaylistCount:
hgs
parents:
diff changeset
  1053
        case EEnumeratingPlaylists:
hgs
parents:
diff changeset
  1054
            iObserver->RegisterAllPlayListsCompleted( aError );
hgs
parents:
diff changeset
  1055
            break;
hgs
parents:
diff changeset
  1056
        case EReadingSongCount:
hgs
parents:
diff changeset
  1057
        case EEnumeratingSongs:
hgs
parents:
diff changeset
  1058
            iObserver->RegisterAllSongsCompleted( aError );
hgs
parents:
diff changeset
  1059
            break;
hgs
parents:
diff changeset
  1060
        default:
hgs
parents:
diff changeset
  1061
            LOGGER_WRITE("Unknown state!");
hgs
parents:
diff changeset
  1062
            break;
hgs
parents:
diff changeset
  1063
        }
hgs
parents:
diff changeset
  1064
    
hgs
parents:
diff changeset
  1065
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1066
    return KErrNone;
hgs
parents:
diff changeset
  1067
    }
hgs
parents:
diff changeset
  1068
hgs
parents:
diff changeset
  1069
void CMediaManager::ReadPlaylistCountL()
hgs
parents:
diff changeset
  1070
    {
hgs
parents:
diff changeset
  1071
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1072
    // Find all playlist files in the playlist DB
hgs
parents:
diff changeset
  1073
    RArray<TInt> contentIDs;
hgs
parents:
diff changeset
  1074
    CleanupClosePushL( contentIDs );
hgs
parents:
diff changeset
  1075
    contentIDs.AppendL(KMPXMediaIdGeneral);
hgs
parents:
diff changeset
  1076
    
hgs
parents:
diff changeset
  1077
    CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array());
hgs
parents:
diff changeset
  1078
    CleanupStack::PopAndDestroy( &contentIDs );
hgs
parents:
diff changeset
  1079
    CleanupStack::PushL(searchMedia);
hgs
parents:
diff changeset
  1080
    
hgs
parents:
diff changeset
  1081
    searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem);    
hgs
parents:
diff changeset
  1082
    searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXPlaylist);
hgs
parents:
diff changeset
  1083
    
hgs
parents:
diff changeset
  1084
    RArray<TMPXAttribute> playlistAttributes;
hgs
parents:
diff changeset
  1085
    CleanupClosePushL(playlistAttributes);
hgs
parents:
diff changeset
  1086
    playlistAttributes.AppendL( KMPXMediaGeneralId );
hgs
parents:
diff changeset
  1087
    playlistAttributes.AppendL( KMPXMediaGeneralTitle );
hgs
parents:
diff changeset
  1088
    playlistAttributes.AppendL( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
  1089
    
hgs
parents:
diff changeset
  1090
    LOGGER_WRITE("find all");
hgs
parents:
diff changeset
  1091
    delete iFoundedMedia; iFoundedMedia=NULL;
hgs
parents:
diff changeset
  1092
    iFoundedMedia = iCollectionHelper->FindAllL(*searchMedia, playlistAttributes.Array());
hgs
parents:
diff changeset
  1093
    CleanupStack::PopAndDestroy(&playlistAttributes);
hgs
parents:
diff changeset
  1094
    CleanupStack::PopAndDestroy(searchMedia);
hgs
parents:
diff changeset
  1095
hgs
parents:
diff changeset
  1096
    if ( !iFoundedMedia->IsSupported(KMPXMediaArrayCount) )
hgs
parents:
diff changeset
  1097
        {
hgs
parents:
diff changeset
  1098
        delete iFoundedMedia; iFoundedMedia=NULL;
hgs
parents:
diff changeset
  1099
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
  1100
        }
hgs
parents:
diff changeset
  1101
    
hgs
parents:
diff changeset
  1102
    iItemsFound = *iFoundedMedia->Value<TInt>(KMPXMediaArrayCount);
hgs
parents:
diff changeset
  1103
    
hgs
parents:
diff changeset
  1104
    LOGGER_WRITE_1("playlists: %d", iItemsFound);
hgs
parents:
diff changeset
  1105
hgs
parents:
diff changeset
  1106
    if ( iItemsFound )
hgs
parents:
diff changeset
  1107
        {
hgs
parents:
diff changeset
  1108
        if ( !iFoundedMedia->IsSupported(KMPXMediaArrayContents) )
hgs
parents:
diff changeset
  1109
            {
hgs
parents:
diff changeset
  1110
            delete iFoundedMedia; iFoundedMedia=NULL;
hgs
parents:
diff changeset
  1111
            iItemsFound = 0;
hgs
parents:
diff changeset
  1112
            User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
  1113
            }
hgs
parents:
diff changeset
  1114
        }
hgs
parents:
diff changeset
  1115
    
hgs
parents:
diff changeset
  1116
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1117
    }
hgs
parents:
diff changeset
  1118
hgs
parents:
diff changeset
  1119
void CMediaManager::ReadPlaylistItemsL()
hgs
parents:
diff changeset
  1120
    {
hgs
parents:
diff changeset
  1121
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1122
    TInt start = iReadedItems;
hgs
parents:
diff changeset
  1123
    TInt end = start+iMaxPlaylistItemsToEnumerate;
hgs
parents:
diff changeset
  1124
    if ( end >iItemsFound )
hgs
parents:
diff changeset
  1125
        {
hgs
parents:
diff changeset
  1126
        end = iItemsFound;
hgs
parents:
diff changeset
  1127
        }
hgs
parents:
diff changeset
  1128
    
hgs
parents:
diff changeset
  1129
    const CMPXMediaArray* foundArray = iFoundedMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
hgs
parents:
diff changeset
  1130
            
hgs
parents:
diff changeset
  1131
    for (TInt i = start; i < end; i++)
hgs
parents:
diff changeset
  1132
        {
hgs
parents:
diff changeset
  1133
        LOGGER_WRITE_1("read playlistItem: %d", i);
hgs
parents:
diff changeset
  1134
        CMPXMedia* playlistMedia = CMPXMedia::NewL(*(*foundArray)[i]);
hgs
parents:
diff changeset
  1135
        CleanupStack::PushL( playlistMedia );
hgs
parents:
diff changeset
  1136
        
hgs
parents:
diff changeset
  1137
        // Append playlist to item array
hgs
parents:
diff changeset
  1138
        RegisterPlaylistL( *playlistMedia );
hgs
parents:
diff changeset
  1139
               
hgs
parents:
diff changeset
  1140
        CleanupStack::PopAndDestroy( playlistMedia );
hgs
parents:
diff changeset
  1141
        iReadedItems++;
hgs
parents:
diff changeset
  1142
        }
hgs
parents:
diff changeset
  1143
    
hgs
parents:
diff changeset
  1144
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1145
    }
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
    
hgs
parents:
diff changeset
  1148
hgs
parents:
diff changeset
  1149
void CMediaManager::ReadSongCountL()
hgs
parents:
diff changeset
  1150
    {
hgs
parents:
diff changeset
  1151
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1152
hgs
parents:
diff changeset
  1153
    RArray<TInt> contentIDs;
hgs
parents:
diff changeset
  1154
    CleanupClosePushL( contentIDs );
hgs
parents:
diff changeset
  1155
    contentIDs.AppendL( KMPXMediaIdGeneral );
hgs
parents:
diff changeset
  1156
    contentIDs.AppendL( KMPXMediaIdMusic );
hgs
parents:
diff changeset
  1157
    
hgs
parents:
diff changeset
  1158
    CMPXMedia* criteria = CMPXMedia::NewL(contentIDs.Array());
hgs
parents:
diff changeset
  1159
    CleanupStack::PopAndDestroy( &contentIDs );
hgs
parents:
diff changeset
  1160
    CleanupStack::PushL(criteria);
hgs
parents:
diff changeset
  1161
    
hgs
parents:
diff changeset
  1162
    criteria->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem );
hgs
parents:
diff changeset
  1163
    criteria->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong );
hgs
parents:
diff changeset
  1164
    
hgs
parents:
diff changeset
  1165
    // define attributes fetched
hgs
parents:
diff changeset
  1166
    RArray<TMPXAttribute> songAttributes;
hgs
parents:
diff changeset
  1167
    CleanupClosePushL(songAttributes);
hgs
parents:
diff changeset
  1168
    
hgs
parents:
diff changeset
  1169
    songAttributes.AppendL( KMPXMediaGeneralType );
hgs
parents:
diff changeset
  1170
    songAttributes.AppendL( KMPXMediaGeneralCategory );
hgs
parents:
diff changeset
  1171
    songAttributes.AppendL( KMPXMediaGeneralUri );
hgs
parents:
diff changeset
  1172
    songAttributes.AppendL( KMPXMediaGeneralId );
hgs
parents:
diff changeset
  1173
    songAttributes.AppendL( KMPXMediaGeneralTitle );
hgs
parents:
diff changeset
  1174
    songAttributes.AppendL( KMPXMediaGeneralMimeType );
hgs
parents:
diff changeset
  1175
    songAttributes.AppendL( KMPXMediaGeneralDuration );
hgs
parents:
diff changeset
  1176
    songAttributes.AppendL( KMPXMediaGeneralComment );
hgs
parents:
diff changeset
  1177
    
hgs
parents:
diff changeset
  1178
    songAttributes.AppendL( KMPXMediaMusicArtist );
hgs
parents:
diff changeset
  1179
    songAttributes.AppendL( KMPXMediaMusicAlbum );
hgs
parents:
diff changeset
  1180
    songAttributes.AppendL( KMPXMediaMusicYear );
hgs
parents:
diff changeset
  1181
    songAttributes.AppendL( KMPXMediaMusicAlbumTrack );
hgs
parents:
diff changeset
  1182
    songAttributes.AppendL( KMPXMediaMusicGenre );
hgs
parents:
diff changeset
  1183
    songAttributes.AppendL( KMPXMediaMusicComposer );
hgs
parents:
diff changeset
  1184
    
hgs
parents:
diff changeset
  1185
    delete iFoundedMedia;
hgs
parents:
diff changeset
  1186
    iFoundedMedia = NULL;
hgs
parents:
diff changeset
  1187
    // now find
hgs
parents:
diff changeset
  1188
    LOGGER_WRITE("FindAllL");
hgs
parents:
diff changeset
  1189
    iFoundedMedia = iCollectionHelper->FindAllL( *criteria , songAttributes.Array() );
hgs
parents:
diff changeset
  1190
        
hgs
parents:
diff changeset
  1191
    LOGGER_WRITE("FindAllL ok");
hgs
parents:
diff changeset
  1192
    CleanupStack::PopAndDestroy( &songAttributes );
hgs
parents:
diff changeset
  1193
    CleanupStack::PopAndDestroy( criteria );
hgs
parents:
diff changeset
  1194
    
hgs
parents:
diff changeset
  1195
hgs
parents:
diff changeset
  1196
    if ( !iFoundedMedia->IsSupported(KMPXMediaArrayCount) )
hgs
parents:
diff changeset
  1197
         {
hgs
parents:
diff changeset
  1198
         LOGGER_WRITE("KMPXMediaArrayCount not supported");
hgs
parents:
diff changeset
  1199
         delete iFoundedMedia;
hgs
parents:
diff changeset
  1200
         iFoundedMedia = NULL;
hgs
parents:
diff changeset
  1201
         iItemsFound = 0;
hgs
parents:
diff changeset
  1202
         User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
  1203
         }
hgs
parents:
diff changeset
  1204
     
hgs
parents:
diff changeset
  1205
    // Number of references
hgs
parents:
diff changeset
  1206
    iItemsFound = *iFoundedMedia->Value<TInt>(KMPXMediaArrayCount);
hgs
parents:
diff changeset
  1207
    LOGGER_WRITE_1("songs: %d", iItemsFound);
hgs
parents:
diff changeset
  1208
    if ( iItemsFound )
hgs
parents:
diff changeset
  1209
        {
hgs
parents:
diff changeset
  1210
        if (!iFoundedMedia->IsSupported(KMPXMediaArrayContents))
hgs
parents:
diff changeset
  1211
            {
hgs
parents:
diff changeset
  1212
            delete iFoundedMedia;
hgs
parents:
diff changeset
  1213
            iFoundedMedia = NULL;
hgs
parents:
diff changeset
  1214
            iItemsFound = 0;
hgs
parents:
diff changeset
  1215
            User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
  1216
            }
hgs
parents:
diff changeset
  1217
        }
hgs
parents:
diff changeset
  1218
    
hgs
parents:
diff changeset
  1219
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1220
    }
hgs
parents:
diff changeset
  1221
hgs
parents:
diff changeset
  1222
void CMediaManager::ReadSongItemsL()
hgs
parents:
diff changeset
  1223
    {
hgs
parents:
diff changeset
  1224
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1225
    
hgs
parents:
diff changeset
  1226
    TInt start = iReadedItems;
hgs
parents:
diff changeset
  1227
    TInt end = start+iMaxSongItemsToEnumerate;
hgs
parents:
diff changeset
  1228
    if ( end >iItemsFound )
hgs
parents:
diff changeset
  1229
        {
hgs
parents:
diff changeset
  1230
        end = iItemsFound;
hgs
parents:
diff changeset
  1231
        }
hgs
parents:
diff changeset
  1232
    
hgs
parents:
diff changeset
  1233
    const CMPXMediaArray* foundArray = iFoundedMedia->Value<CMPXMediaArray>(KMPXMediaArrayContents);
hgs
parents:
diff changeset
  1234
    
hgs
parents:
diff changeset
  1235
    TKeyArrayFix key( iKey );
hgs
parents:
diff changeset
  1236
    // Import the references
hgs
parents:
diff changeset
  1237
    for (TInt i = start; i < end; i++)
hgs
parents:
diff changeset
  1238
        {
hgs
parents:
diff changeset
  1239
        //LOGGER_WRITE_1("read songitem: %d",i);
hgs
parents:
diff changeset
  1240
        const CMPXMedia* refMedia = (*foundArray)[i];
hgs
parents:
diff changeset
  1241
        
hgs
parents:
diff changeset
  1242
        CSongItem* song = CSongItem::NewLC();
hgs
parents:
diff changeset
  1243
        
hgs
parents:
diff changeset
  1244
        ReadSongAttributesL( *refMedia, *song, EFalse );
hgs
parents:
diff changeset
  1245
        TSnapshotItem snapshotItem( song->Id(), KAllSongsFolderId );
hgs
parents:
diff changeset
  1246
        snapshotItem.SetItemHash( *song, iHasher );
hgs
parents:
diff changeset
  1247
        
hgs
parents:
diff changeset
  1248
        iSnapshotArray->InsertIsqL( snapshotItem, key );
hgs
parents:
diff changeset
  1249
        
hgs
parents:
diff changeset
  1250
        CleanupStack::PopAndDestroy( song );
hgs
parents:
diff changeset
  1251
        iReadedItems++;
hgs
parents:
diff changeset
  1252
        }
hgs
parents:
diff changeset
  1253
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1254
    }