mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp
changeset 48 af3740e3753f
parent 42 79c49924ae23
child 54 c5b304f4d89b
equal deleted inserted replaced
42:79c49924ae23 48:af3740e3753f
    14 * Description: Wrapper for mpx collection framework utilities - private implementation.
    14 * Description: Wrapper for mpx collection framework utilities - private implementation.
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 #include <QStringList>
    18 #include <QStringList>
       
    19 #include <QRegExp>
       
    20 #include <QFileInfo>
       
    21 #include <QDateTime>
       
    22 #include <QTime>
       
    23 #include <QDate>
    19 
    24 
    20 #include <s32strm.h>
    25 #include <s32strm.h>
    21 #include <s32mem.h>
    26 #include <s32mem.h>
    22 #include <apgcli.h>
    27 #include <apgcli.h>
    23 #include <apacmdln.h>
    28 #include <apacmdln.h>
    30 #include <mpxcollectionplaylist.h>
    35 #include <mpxcollectionplaylist.h>
    31 #include <mpxmessagecontainerdefs.h>
    36 #include <mpxmessagecontainerdefs.h>
    32 #include <mpxmediacollectiondetaildefs.h>
    37 #include <mpxmediacollectiondetaildefs.h>
    33 #include <mpxmediamusicdefs.h>
    38 #include <mpxmediamusicdefs.h>
    34 #include <mpxmediageneraldefs.h>
    39 #include <mpxmediageneraldefs.h>
       
    40 #include <mpxmediaaudiodefs.h>
       
    41 #include <mpxmediadrmdefs.h>
    35 #include <mpxcollectionplugin.hrh>
    42 #include <mpxcollectionplugin.hrh>
    36 #include <mpxmessagegeneraldefs.h>
    43 #include <mpxmessagegeneraldefs.h>
    37 #include <mpxmediacontainerdefs.h>
    44 #include <mpxmediacontainerdefs.h>
    38 #include <mpxcollectionmessagedefs.h>
    45 #include <mpxcollectionmessagedefs.h>
    39 #include <mpxparameter.h>
    46 #include <mpxparameter.h>
    48 #include "mpmpxcollectionframeworkwrapper.h"
    55 #include "mpmpxcollectionframeworkwrapper.h"
    49 #include "mpmpxcollectiondata.h"
    56 #include "mpmpxcollectiondata.h"
    50 #include "mpcommondefs.h"
    57 #include "mpcommondefs.h"
    51 #include "mptrace.h"
    58 #include "mptrace.h"
    52 #include "mpsettingsmanager.h"
    59 #include "mpsettingsmanager.h"
       
    60 #include "mpsongdata.h"
    53 
    61 
    54 const TInt KIncrementalDelayNone = 0;
    62 const TInt KIncrementalDelayNone = 0;
    55 const TInt KIncrementalDelayHalfSecond = 1000000;
    63 const TInt KIncrementalDelayHalfSecond = 500000;
    56 const TInt KIncrementalFetchBlockSize = 40;
    64 const TInt KIncrementalFetchBlockSize = 400;
    57 
    65 
    58 const TInt KMPXChunkSize = 100;  // number of songs added in each chunk, IncAddL
    66 const TInt KMPXChunkSize = 100;  // number of songs added in each chunk, IncAddL
    59 _LIT( KPlaylistPath, "C:\\Data\\Playlists\\" ); // Todo
    67 _LIT( KPlaylistPath, "C:\\Data\\Playlists\\" ); // Todo
    60 
    68 
    61 /*!
    69 /*!
    82       iRepeatFeature( ETrue ),
    90       iRepeatFeature( ETrue ),
    83       iShuffleFeature( ETrue ),
    91       iShuffleFeature( ETrue ),
    84       iReopen( EFalse ),
    92       iReopen( EFalse ),
    85       iShuffleAll( EFalse ),
    93       iShuffleAll( EFalse ),
    86       iRestoreDefaultPath( EFalse ),
    94       iRestoreDefaultPath( EFalse ),
    87       iRestorePathIndex(0)
    95       iRestorePathIndex( 0 ),
       
    96 	  iSongData( 0 )
    88 {
    97 {
    89     TX_LOG
    98     TX_LOG
    90 }
    99 }
    91 
   100 
    92 /*!
   101 /*!
   119 }
   128 }
   120 
   129 
   121 /*!
   130 /*!
   122  \internal
   131  \internal
   123  */
   132  */
   124 void MpMpxCollectionFrameworkWrapperPrivate::init( TUid hostUid )
   133 void MpMpxCollectionFrameworkWrapperPrivate::init( TUid hostUid, MpSongData *songData )
   125 {
   134 {
   126 
   135     TX_ENTRY
   127     mHostUid = hostUid;
   136     iHostUid = hostUid;
       
   137     iSongData = songData;
   128     TRAPD( err, DoInitL() );
   138     TRAPD( err, DoInitL() );
   129     if ( err != KErrNone ) {
   139     if ( err != KErrNone ) {
   130         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
   140         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
   131     }
   141     }
       
   142     TX_EXIT
   132 }
   143 }
   133 
   144 
   134 /*!
   145 /*!
   135  \internal
   146  \internal
   136  */
   147  */
   376     if ( err != KErrNone ) {
   387     if ( err != KErrNone ) {
   377         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
   388         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
   378     }
   389     }
   379     else {
   390     else {
   380         iShuffleAll = ETrue; 
   391         iShuffleAll = ETrue; 
       
   392     }
       
   393     TX_EXIT
       
   394 }
       
   395 
       
   396 /*!
       
   397  \internal
       
   398  */
       
   399 void MpMpxCollectionFrameworkWrapperPrivate::retrieveSongDetails( int index )
       
   400 {
       
   401     TX_ENTRY
       
   402     TRAPD( err, DoRetrieveSongDetailsL(index) );
       
   403     if ( err != KErrNone ) {
       
   404         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
   381     }
   405     }
   382     TX_EXIT
   406     TX_EXIT
   383 }
   407 }
   384 
   408 
   385 /*!
   409 /*!
   483  */
   507  */
   484 void MpMpxCollectionFrameworkWrapperPrivate::HandleCollectionMediaL( 
   508 void MpMpxCollectionFrameworkWrapperPrivate::HandleCollectionMediaL( 
   485     const CMPXMedia& aMedia,
   509     const CMPXMedia& aMedia,
   486     TInt aError )
   510     TInt aError )
   487 {
   511 {
   488     Q_UNUSED( aMedia );
   512     TX_ENTRY
   489     Q_UNUSED( aError );
   513     if ( KErrNone != aError ){
       
   514         TX_LOG_ARGS( "Error: " << aError << "; should never get here." );
       
   515         TX_EXIT
       
   516         return;
       
   517     }
       
   518     iSongData->setMpxMedia( aMedia );
       
   519     TX_EXIT
   490 }
   520 }
   491 
   521 
   492 /*!
   522 /*!
   493  \internal
   523  \internal
   494  Handles the completion of any collection helper event.
   524  Handles the completion of any collection helper event.
   627  \internal
   657  \internal
   628  */
   658  */
   629 void MpMpxCollectionFrameworkWrapperPrivate::DoInitL()
   659 void MpMpxCollectionFrameworkWrapperPrivate::DoInitL()
   630 {
   660 {
   631     TX_ENTRY
   661     TX_ENTRY
   632     iCollectionUtility = MMPXCollectionUtility::NewL( this, mHostUid );
   662     iCollectionUtility = MMPXCollectionUtility::NewL( this, iHostUid );
   633     iCollectionUiHelper = CMPXCollectionHelperFactory:: NewCollectionUiHelperL( mHostUid );
   663     iCollectionUiHelper = CMPXCollectionHelperFactory:: NewCollectionUiHelperL( iHostUid );
   634     iIncrementalOpenUtil = CMPXCollectionOpenUtility::NewL( this, mHostUid );  
   664     iIncrementalOpenUtil = CMPXCollectionOpenUtility::NewL( this, iHostUid );
   635     iCollectionData = new MpMpxCollectionData();
   665     iCollectionData = new MpMpxCollectionData();
   636     TX_EXIT
   666     TX_EXIT
   637 }
   667 }
   638 
   668 
   639 /*!
   669 /*!
   719     RArray<TMPXAttribute> attrs;
   749     RArray<TMPXAttribute> attrs;
   720     CleanupClosePushL( attrs );
   750     CleanupClosePushL( attrs );
   721     TArray<TMPXAttribute> ary = attrs.Array();
   751     TArray<TMPXAttribute> ary = attrs.Array();
   722     iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
   752     iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
   723     iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize,
   753     iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize,
   724                                   KErrNotFound, CMPXCollectionOpenUtility::EFetchNormal );
   754                                   KErrNotFound, CMPXCollectionOpenUtility::EFetchDown );
   725     iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
   755     iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
   726     CleanupStack::PopAndDestroy( &attrs );
   756     CleanupStack::PopAndDestroy( &attrs );
   727     TX_EXIT
   757     TX_EXIT
   728 }
   758 }
   729 
   759 
   760     delete iUserPlaylists;
   790     delete iUserPlaylists;
   761     iUserPlaylists = NULL;
   791     iUserPlaylists = NULL;
   762 
   792 
   763     RArray<TMPXAttribute> attrs;
   793     RArray<TMPXAttribute> attrs;
   764     CleanupClosePushL( attrs );
   794     CleanupClosePushL( attrs );
   765     attrs.Append( KMPXMediaGeneralId );
   795     attrs.AppendL( KMPXMediaGeneralId );
   766     attrs.Append( KMPXMediaGeneralTitle );
   796     attrs.AppendL( KMPXMediaGeneralTitle );
   767 
   797 
   768     CMPXMedia* criteria = CMPXMedia::NewL();
   798     CMPXMedia* criteria = CMPXMedia::NewL();
   769     CleanupStack::PushL( criteria );
   799     CleanupStack::PushL( criteria );
   770     criteria->SetTObjectValueL<TMPXGeneralType>( 
   800     criteria->SetTObjectValueL<TMPXGeneralType>( 
   771         KMPXMediaGeneralType, EMPXGroup );
   801         KMPXMediaGeneralType, EMPXGroup );
  1029 void MpMpxCollectionFrameworkWrapperPrivate::DoPreviewAlbumSongL( int index )
  1059 void MpMpxCollectionFrameworkWrapperPrivate::DoPreviewAlbumSongL( int index )
  1030 {
  1060 {
  1031     TX_ENTRY
  1061     TX_ENTRY
  1032     //TODO: all calls to playback utility should be done via the engine and trough the playback FW wrapper.
  1062     //TODO: all calls to playback utility should be done via the engine and trough the playback FW wrapper.
  1033     if ( !iPlaybackUtility ) {
  1063     if ( !iPlaybackUtility ) {
  1034         iPlaybackUtility = MMPXPlaybackUtility::UtilityL( mHostUid );
  1064         iPlaybackUtility = MMPXPlaybackUtility::UtilityL( iHostUid );
  1035     }
  1065     }
  1036 
  1066 
  1037     // Get the current path
  1067     // Get the current path
  1038     CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
  1068     CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
  1039     CleanupStack::PushL( cpath );
  1069     CleanupStack::PushL( cpath );
  1098 {
  1128 {
  1099     const CMPXMedia& container = iCollectionData->containerMedia();
  1129     const CMPXMedia& container = iCollectionData->containerMedia();
  1100     const CMPXMediaArray* mediaArray = container.Value<CMPXMediaArray>( KMPXMediaArrayContents );
  1130     const CMPXMediaArray* mediaArray = container.Value<CMPXMediaArray>( KMPXMediaArrayContents );
  1101     CMPXMedia* album( mediaArray->AtL( index ) );
  1131     CMPXMedia* album( mediaArray->AtL( index ) );
  1102 
  1132 
  1103     // Fetch the songs for the selected album
  1133 	// Obtain the artistId from the container
       
  1134     TMPXItemId artistId = container.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
       
  1135 	
       
  1136     // Fetch the songs for the selected album and the artist
       
  1137 	// Specifying artistId is necessary to search for songs in the artist’s unknown album.
  1104     TMPXItemId albumId = album->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
  1138     TMPXItemId albumId = album->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId);
  1105     CMPXMedia* findCriteria = CMPXMedia::NewL();
  1139     CMPXMedia* findCriteria = CMPXMedia::NewL();
  1106     CleanupStack::PushL( findCriteria );
  1140     CleanupStack::PushL( findCriteria );
  1107     findCriteria->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXGroup );
  1141     findCriteria->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXGroup );
  1108     findCriteria->SetTObjectValueL<TMPXGeneralCategory>( KMPXMediaGeneralCategory, EMPXSong );
  1142     findCriteria->SetTObjectValueL<TMPXGeneralCategory>( KMPXMediaGeneralCategory, EMPXSong );
  1109     findCriteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, albumId );
  1143     findCriteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, albumId );
       
  1144     findCriteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralContainerId, artistId );
  1110     RArray<TMPXAttribute> attrs;
  1145     RArray<TMPXAttribute> attrs;
  1111     CleanupClosePushL( attrs );
  1146     CleanupClosePushL( attrs );
  1112     attrs.Append( TMPXAttribute( KMPXMediaIdGeneral,
  1147     attrs.AppendL( TMPXAttribute( KMPXMediaIdGeneral,
  1113                                  EMPXMediaGeneralTitle |
  1148                                  EMPXMediaGeneralTitle |
  1114 								 EMPXMediaGeneralUri |
  1149 								 EMPXMediaGeneralUri |
  1115                                  EMPXMediaGeneralId |
  1150                                  EMPXMediaGeneralId |
  1116                                  EMPXMediaGeneralType |
  1151                                  EMPXMediaGeneralType |
  1117                                  EMPXMediaGeneralCategory |
  1152                                  EMPXMediaGeneralCategory |
  1118                                  EMPXMediaGeneralFlags ) );
  1153                                  EMPXMediaGeneralFlags ) );
  1119     attrs.Append( KMPXMediaMusicAlbumTrack );
  1154     attrs.AppendL( KMPXMediaMusicAlbumTrack );
  1120 
  1155 
  1121     iCollectionUtility->Collection().FindAllL( *findCriteria, attrs.Array(), *this );
  1156     iCollectionUtility->Collection().FindAllL( *findCriteria, attrs.Array(), *this );
  1122     CleanupStack::PopAndDestroy( &attrs );
  1157     CleanupStack::PopAndDestroy( &attrs );
  1123     CleanupStack::PopAndDestroy( findCriteria );
  1158     CleanupStack::PopAndDestroy( findCriteria );
  1124 }
  1159 }
  1236             // This will result in HandleOpenL with CMPXCollectionPlaylist
  1271             // This will result in HandleOpenL with CMPXCollectionPlaylist
  1237             iCollectionUtility->Collection().OpenL();
  1272             iCollectionUtility->Collection().OpenL();
  1238         }
  1273         }
  1239     }
  1274     }
  1240     else if( id == KMPXMessageIdItemChanged ) {
  1275     else if( id == KMPXMessageIdItemChanged ) {
  1241         emit q_ptr->containerContentsChanged();                     
  1276         TInt eventType( aMsg.ValueTObjectL<TMPXChangeEventType>( KMPXMessageChangeEventType ) );
  1242     }  
  1277 
       
  1278         if ( eventType == EMPXItemDeleted || eventType == EMPXItemInserted ) {
       
  1279             emit q_ptr->containerContentsChanged();
       
  1280         }
       
  1281     }
  1243     TX_EXIT
  1282     TX_EXIT
  1244 }
  1283 }
  1245 
  1284 
  1246 
  1285 
  1247 /*!
  1286 /*!
  1299             findCriteria->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXGroup );
  1338             findCriteria->SetTObjectValueL<TMPXGeneralType>( KMPXMediaGeneralType, EMPXGroup );
  1300             findCriteria->SetTObjectValueL<TMPXGeneralCategory>( KMPXMediaGeneralCategory, EMPXSong );
  1339             findCriteria->SetTObjectValueL<TMPXGeneralCategory>( KMPXMediaGeneralCategory, EMPXSong );
  1301             findCriteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, containerId );
  1340             findCriteria->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, containerId );
  1302             RArray<TMPXAttribute> attrs;
  1341             RArray<TMPXAttribute> attrs;
  1303             CleanupClosePushL( attrs );
  1342             CleanupClosePushL( attrs );
  1304             attrs.Append( TMPXAttribute( KMPXMediaIdGeneral,
  1343             attrs.AppendL( TMPXAttribute( KMPXMediaIdGeneral,
  1305                                          EMPXMediaGeneralTitle |
  1344                                          EMPXMediaGeneralTitle |
  1306                                          EMPXMediaGeneralId ) );
  1345                                          EMPXMediaGeneralId ) );
  1307             results = iCollectionUtility->Collection().FindAllL( *findCriteria, attrs.Array() );
  1346             results = iCollectionUtility->Collection().FindAllL( *findCriteria, attrs.Array() );
  1308             CleanupStack::PopAndDestroy( &attrs );
  1347             CleanupStack::PopAndDestroy( &attrs );
  1309             CleanupStack::PopAndDestroy( findCriteria );
  1348             CleanupStack::PopAndDestroy( findCriteria );
  1363  */
  1402  */
  1364 void MpMpxCollectionFrameworkWrapperPrivate::createPlaybackUtilityL() 
  1403 void MpMpxCollectionFrameworkWrapperPrivate::createPlaybackUtilityL() 
  1365 {
  1404 {
  1366     if ( !iPlaybackUtility ) {
  1405     if ( !iPlaybackUtility ) {
  1367 
  1406 
  1368         iPlaybackUtility = MMPXPlaybackUtility::UtilityL( mHostUid );
  1407         iPlaybackUtility = MMPXPlaybackUtility::UtilityL( iHostUid );
  1369 
  1408 
  1370         if ( iShuffleFeature ) {
  1409         if ( iShuffleFeature ) {
  1371             iPlaybackUtility->SetL( EPbPropertyRandomMode, MpSettingsManager::shuffle() ? ETrue : EFalse );
  1410             iPlaybackUtility->SetL( EPbPropertyRandomMode, MpSettingsManager::shuffle() ? ETrue : EFalse );
  1372         }
  1411         }
  1373         if ( iRepeatFeature ) {
  1412         if ( iRepeatFeature ) {
  1390     MpSettingsManager::setShuffle( true );
  1429     MpSettingsManager::setShuffle( true );
  1391     createPlaybackUtilityL();
  1430     createPlaybackUtilityL();
  1392     iPlaybackUtility->InitL( *playList, ETrue );
  1431     iPlaybackUtility->InitL( *playList, ETrue );
  1393     CleanupStack::PopAndDestroy( playList );
  1432     CleanupStack::PopAndDestroy( playList );
  1394     CleanupStack::PopAndDestroy( cpath );
  1433     CleanupStack::PopAndDestroy( cpath );
       
  1434     TX_EXIT
       
  1435 }
       
  1436 
       
  1437 /*!
       
  1438  \internal
       
  1439  */
       
  1440 void MpMpxCollectionFrameworkWrapperPrivate::DoRetrieveSongDetailsL( int index )
       
  1441 {
       
  1442     TX_ENTRY
       
  1443     RArray<TMPXAttribute> requestedAttr;
       
  1444     CleanupClosePushL( requestedAttr );
       
  1445     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralTitle ) );
       
  1446     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicArtist ) );
       
  1447     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicAlbum ) );
       
  1448     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralUri ) );
       
  1449     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicAlbumArtFileName ) );
       
  1450     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralMimeType ) );
       
  1451     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicAlbumTrack ) );
       
  1452     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicComposer ) );
       
  1453     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicYear ) );
       
  1454     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicGenre ) );
       
  1455     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralDuration ) );
       
  1456     requestedAttr.AppendL( TMPXAttribute( KMPXMediaAudioBitrate ) );
       
  1457     requestedAttr.AppendL( TMPXAttribute( KMPXMediaAudioSamplerate ) );
       
  1458     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralCopyright ) );
       
  1459     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicURL ) );
       
  1460     requestedAttr.AppendL( TMPXAttribute( KMPXMediaDrmProtected ) );
       
  1461 
       
  1462     CMPXCollectionPath* cpath = iCollectionUtility->Collection().PathL();
       
  1463     CleanupStack::PushL( cpath );
       
  1464     TCollectionContext context = iCollectionData->context();
       
  1465     if ( context == ECollectionContextArtistAlbumsTBone
       
  1466          || context == ECollectionContextAlbumsTBone ) {
       
  1467         CMPXMediaArray *mediaArray;
       
  1468         const CMPXMedia& container = iCollectionData->containerMedia();
       
  1469         mediaArray = const_cast<CMPXMediaArray*>( container.Value<CMPXMediaArray>( KMPXMediaArrayContents ) );
       
  1470         int currentAlbumIndex = iCollectionData->currentAlbumIndex();
       
  1471         CMPXMedia* album( mediaArray->AtL( currentAlbumIndex ) );
       
  1472         if ( album->IsSupported(KMPXMediaArrayContents) ) {
       
  1473             const CMPXMediaArray* songs = album->Value<CMPXMediaArray>(KMPXMediaArrayContents);
       
  1474             User::LeaveIfNull(const_cast<CMPXMediaArray*>(songs));
       
  1475             CMPXMedia* song = songs->AtL(index);
       
  1476             TMPXItemId id( song->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
       
  1477             cpath->AppendL( id );   // Top level items of songs
       
  1478             cpath->Set( 0 );        // Select 1st song
       
  1479         }
       
  1480     }
       
  1481     else {
       
  1482         cpath->Set( index );
       
  1483     }
       
  1484     iCollectionUtility->Collection().MediaL( *cpath, requestedAttr.Array() );
       
  1485     CleanupStack::PopAndDestroy( cpath );
       
  1486     CleanupStack::PopAndDestroy( &requestedAttr );
  1395     TX_EXIT
  1487     TX_EXIT
  1396 }
  1488 }
  1397 
  1489 
  1398 /*!
  1490 /*!
  1399  \internal
  1491  \internal