mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp
changeset 38 b93f525c9244
parent 37 eb79a7c355bf
child 43 0f32e550d9d8
child 48 af3740e3753f
--- a/mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -82,7 +82,9 @@
       iRepeatFeature( ETrue ),
       iShuffleFeature( ETrue ),
       iReopen( EFalse ),
-      iShuffleAll( EFalse )
+      iShuffleAll( EFalse ),
+      iRestoreDefaultPath( EFalse ),
+      iRestorePathIndex(0)
 {
     TX_LOG
 }
@@ -382,6 +384,34 @@
 
 /*!
  \internal
+ */
+void MpMpxCollectionFrameworkWrapperPrivate::savePath( QByteArray &data )
+{
+    TX_ENTRY
+    TRAPD( err, DoSavePathL( data ) );
+    if ( err != KErrNone ) {
+        TX_LOG_ARGS( "Error: " << err << "; should never get here." );
+    }
+    TX_EXIT
+    
+}
+
+/*!
+ \internal
+ */
+void MpMpxCollectionFrameworkWrapperPrivate::restorePath( const QByteArray &data )
+{
+    TX_ENTRY
+    TRAPD( err, DoRestorePathL( data ) );
+    if ( err != KErrNone ) {
+        TX_LOG_ARGS( "Error: " << err << "; should never get here." );
+    }
+    TX_EXIT
+}
+
+
+/*!
+ \internal
  Result of open or re-open operation to the Collection Framework.
  */
 void MpMpxCollectionFrameworkWrapperPrivate::HandleOpenL( 
@@ -512,6 +542,77 @@
 /*!
  \internal
  */
+void MpMpxCollectionFrameworkWrapperPrivate::HandleIsolatedOpenRestorePathL( const CMPXCollectionPath& aPath, TInt aError )
+{
+    TX_ENTRY_ARGS( "aError=" << aError );
+    if ( aError == KErrNone ) {
+        CMPXCollectionPath* cpath = CMPXCollectionPath::NewL( aPath );
+        CleanupStack::PushL( cpath );
+        if ( cpath->Count() <= 0 ) {
+            //There are no entries on the path
+            if ( !iRestoreDefaultPath ) {
+                //Try restoring default path if not already tried
+                //This is a special case where a playlist's songs where on the MMC and it was removed
+                iRestoreDefaultPath = ETrue;
+                iRestorePathIndex = 0;
+                CMPXCollectionPath* cpath = iCollectionUiHelper->MusicAllSongsPathL();
+                CleanupStack::PushL( cpath );
+                iIsolatedCollectionHelper->OpenCollectionL( *cpath, iRestorePathIndex, CMpMpxIsolatedCollectionHelper::RestorePathMode );
+                CleanupStack::PopAndDestroy( cpath );
+            }
+            else {
+                //emit signal to go back to collection view because there is no music
+                emit q_ptr->restorePathFailed();
+            }
+        }
+        else if ( iRestorePathIndex ) {
+            //If RestorePathIndex equals zero there is no need to check with previous index
+            //just go and create playlist below
+            if ( iRestorePathIndex == cpath->IndexOfId( iRestorePathIndexId ) ) {
+                //Song is in path and maintains previous position
+                cpath->Set( iRestorePathIndex );
+                CMPXCollectionPlaylist* playList = CMPXCollectionPlaylist::NewL( *cpath );
+                CleanupStack::PushL( playList );
+                createPlaybackUtilityL();
+                iPlaybackUtility->InitL( *playList, EFalse );
+                CleanupStack::PopAndDestroy( playList );
+            }
+            else { 
+                //Re open path starting at the beginning of the collection
+                iRestorePathIndex = 0;
+                cpath->Back(); 
+                iIsolatedCollectionHelper->OpenCollectionL( *cpath, iRestorePathIndex, CMpMpxIsolatedCollectionHelper::RestorePathMode );
+            }
+        }
+        else {
+            //We create a playlist right away since there is no need to check the index for the first element
+            CMPXCollectionPlaylist* playList = CMPXCollectionPlaylist::NewL( *cpath );
+            CleanupStack::PushL( playList );
+            createPlaybackUtilityL();
+            iPlaybackUtility->InitL( *playList, EFalse );
+            CleanupStack::PopAndDestroy( playList );
+        }
+        CleanupStack::PopAndDestroy( cpath );
+    }
+    else if ( aError == KErrNotFound ) {
+        //Path not found (e.g. MMC removed) try restoring default path
+        iRestoreDefaultPath = ETrue;
+        iRestorePathIndex = 0;
+        CMPXCollectionPath* cpath = iCollectionUiHelper->MusicAllSongsPathL();
+        CleanupStack::PushL( cpath );
+        iIsolatedCollectionHelper->OpenCollectionL( *cpath, iRestorePathIndex, CMpMpxIsolatedCollectionHelper::RestorePathMode );
+        CleanupStack::PopAndDestroy( cpath );
+    }
+    else {
+        //Open path failed
+        TX_LOG_ARGS( "Error: " << aError << "; should never get here." );
+    }
+    TX_EXIT
+}
+
+/*!
+ \internal
+ */
 void MpMpxCollectionFrameworkWrapperPrivate::HandleFindAllL( const CMPXMedia& aResults, TBool aComplete, TInt aError )
 {
     Q_UNUSED( aComplete );
@@ -1294,5 +1395,77 @@
     TX_EXIT
 }
 
+/*!
+ \internal
+ */
+void MpMpxCollectionFrameworkWrapperPrivate::DoSavePathL( QByteArray &data )
+{
+    TX_ENTRY
+    CBufFlat* buffer = CBufFlat::NewL( 256 );
+    CleanupStack::PushL( buffer );
+    TBufBuf bufBuf;
+    bufBuf.Set( *buffer, 0, TBufBuf::EWrite );
+    
+    RWriteStream writeStream( &bufBuf );
+    writeStream.PushL();
+    
+    if ( iPlaybackUtility ) {
+        MMPXSource* source = iPlaybackUtility->Source();
+        CMPXCollectionPlaylist* playList( NULL );
+        if( source ) {
+        playList = source->PlaylistL();
+            if ( playList ) {
+                CleanupStack::PushL( playList );
+                const CMPXCollectionPath& cpath = playList->Path();
+                writeStream << cpath;
+                writeStream.CommitL();
+                CleanupStack::PopAndDestroy( playList );
+            }
+        }
+    }
+    data.append(reinterpret_cast<const char*>(buffer->Ptr(0).Ptr()) ,buffer->Ptr(0).Length());
+    CleanupStack::PopAndDestroy( 2, buffer ); //writeStream and buffer
+    TX_EXIT
+}
+
+/*!
+ \internal
+ */
+void MpMpxCollectionFrameworkWrapperPrivate::DoRestorePathL( const QByteArray &data )
+{
+    TX_ENTRY
+    int dataSize = data.size();
+    if ( dataSize > 0 ) {
+        TPtrC8 activityDataDescriptor( reinterpret_cast<const unsigned char*> ( data.constData() ), data.size() );
+         
+        //Take a copy of the data
+        CBufFlat* buffer = CBufFlat::NewL( dataSize );
+        CleanupStack::PushL( buffer );
+        buffer->InsertL( 0, activityDataDescriptor, dataSize );
+        
+        TBufBuf bufBuf;
+        bufBuf.Set( *buffer, 0, TBufBuf::ERead );
+        RReadStream readStream( &bufBuf );
+        readStream.PushL();
+        
+        CMPXCollectionPath* cpath( NULL );
+        cpath = CMPXCollectionPath::NewL(readStream);
+        CleanupStack::PushL(cpath);
+        iRestorePathIndex = 0;
+        if( cpath->Levels() ) {
+            iRestorePathIndexId = cpath->Id();
+            iRestorePathIndex = cpath->Index();
+            cpath->Back();
+        }
+        if ( !iIsolatedCollectionHelper ) {
+            iIsolatedCollectionHelper = CMpMpxIsolatedCollectionHelper::NewL( this );
+        }   
+        iIsolatedCollectionHelper->OpenCollectionL( *cpath, iRestorePathIndex, CMpMpxIsolatedCollectionHelper::RestorePathMode );
+          
+        CleanupStack::PopAndDestroy( cpath );
+        CleanupStack::PopAndDestroy( 2, buffer ); //readStream and buffer
+    }
+    TX_EXIT
+}
 
 //EOF