201025
authorhgs
Fri, 25 Jun 2010 17:21:37 -0500
changeset 38 b93f525c9244
parent 37 eb79a7c355bf
child 43 0f32e550d9d8
201025
app/app.pro
app/inc/mpmainwindow.h
app/resources/musicplayer.docml
app/resources/musicplayer.splashml
app/rom/musicplayer.iby
app/src/main.cpp
app/src/mpmainwindow.cpp
inc/mpengine.h
mpdata/src/mpmpxcollectiondata_p.cpp
mpdata/tsrc/unittest_mpmpxcollectiondata/src/unittest_mpmpxcollectiondata.cpp
mpengine/bwins/mpengineu.def
mpengine/eabi/mpengineu.def
mpengine/inc/mpmpxcollectionframeworkwrapper.h
mpengine/inc/mpmpxcollectionframeworkwrapper_p.h
mpengine/inc/mpmpxisolatedcollectionhelper.h
mpengine/src/mpengine.cpp
mpengine/src/mpmediakeyhandler_p.cpp
mpengine/src/mpmediakeyremconresponse.cpp
mpengine/src/mpmpxcollectionframeworkwrapper.cpp
mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp
mpengine/src/mpmpxisolatedcollectionhelper.cpp
mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp
mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h
mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h
mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h
mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h
mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h
mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h
mpserviceplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp
mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp
mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp
mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp
mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp
mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp
mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h
mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h
mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp
mpviewplugins/mpdetailsviewplugin/inc/mpdetailssharedialog.h
musicwidgetplugin/rom/musicwidgetplugin.iby
tsrc/mpfetchertestapp/inc/mpfetchertestappview.h
tsrc/mpfetchertestapp/src/mpfetchertestappview.cpp
--- a/app/app.pro	Fri Jun 11 19:36:32 2010 -0500
+++ b/app/app.pro	Fri Jun 25 17:21:37 2010 -0500
@@ -26,7 +26,11 @@
     SKINICON = qtg_large_music_player
 
     BLD_INF_RULES.prj_exports += \
-        "../sis/musicplayer_stub.sis          /epoc32/data/z/system/install/musicplayer_stub.sis"
+        "../sis/musicplayer_stub.sis          /epoc32/data/z/system/install/musicplayer_stub.sis" \
+        "resources/musicplayer.docml          /epoc32/release/winscw/udeb/Z/resource/hb/splashml/musicplayer.docml" \
+        "resources/musicplayer.splashml       /epoc32/release/winscw/udeb/Z/resource/hb/splashml/musicplayer.splashml" \
+        "resources/musicplayer.docml          /epoc32/data/Z/resource/hb/splashml/musicplayer.docml" \
+        "resources/musicplayer.splashml       /epoc32/data/Z/resource/hb/splashml/musicplayer.splashml"
 
 }
 
--- a/app/inc/mpmainwindow.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/app/inc/mpmainwindow.h	Fri Jun 25 17:21:37 2010 -0500
@@ -29,6 +29,7 @@
 class MpxViewPlugin;
 class MusicServices;
 class MpGlobalPopupHandler;
+class HbActivityManager;
 
 // Class declaration
 class MpMainWindow: public MpxViewFramework
@@ -55,6 +56,10 @@
 
     void initialize( ActivityMode mode );
 
+signals:
+    // For automation testability
+    void applicationReady();
+
 public slots:
     void handleCommand( int commandCode );
     void handleLibraryUpdated();
@@ -62,6 +67,8 @@
     void switchView( Qt::Orientation orientation );
     void initializeServiceView( TUid hostUid );
     void handleActivity();
+    void saveActivity();
+    void handleRestorePathFailed();
 
 private:
     void activateView(ViewType);
@@ -69,6 +76,7 @@
     void disconnectView();
     void keyPressEvent(QKeyEvent *event);
     MpxViewPlugin*  loadView( ViewType type, MpCommon::MpViewMode viewMode= MpCommon::DefaultView );
+    void loadActivity( QVariant data );
 
 private:
 
@@ -81,6 +89,8 @@
     ViewType              mVerticalViewType;
     MusicServices         *mMusicServices;         // Own
     MpGlobalPopupHandler  *mPopupHandler;          // Own
+    bool                   mUserExit;
+    HbActivityManager     *mActivityManager;       //Not Own
 
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/resources/musicplayer.docml	Fri Jun 25 17:21:37 2010 -0500
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<hbdocument version="0.9">
+    <section name="portrait">
+        <widget name="splashView" type="HbView">
+            <string locid="txt_mus_title_music" name="title" value="musicplayer"/>
+        </widget>
+    </section>
+    <section name="landscape">
+        <widget name="splashView" type="HbView">
+            <string locid="txt_mus_title_music" name="title" value="musicplayer"/>
+            <enums name="titleBarFlags" value="TitleBarHidden"/>
+        </widget>
+    </section>
+
+</hbdocument>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/resources/musicplayer.splashml	Fri Jun 25 17:21:37 2010 -0500
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hbsplash version="1">
+    <docml>musicplayer.docml</docml>
+    <widget>splashView</widget>
+    <appuid>0x10207C62</appuid>
+    <tsappname>musicplayer</tsappname>
+    <use-section when="portrait">portrait</use-section>
+    <use-section when="landscape">landscape</use-section>
+</hbsplash>
--- a/app/rom/musicplayer.iby	Fri Jun 11 19:36:32 2010 -0500
+++ b/app/rom/musicplayer.iby	Fri Jun 25 17:21:37 2010 -0500
@@ -25,5 +25,7 @@
 data = ZPRIVATE\10003A3F\import\APPS\musicplayer_reg.rsc   PRIVATE\10003a3f\import\apps\musicplayer_reg.rsc
 
 data = ZSYSTEM\install\musicplayer_stub.sis          system\install\musicplayer_stub.sis
+data = ZRESOURCE\hb\splashml\musicplayer.splashml    RESOURCE_FILES_DIR\hb\splashml\musicplayer.splashml
+data = ZRESOURCE\hb\splashml\musicplayer.docml       RESOURCE_FILES_DIR\hb\splashml\musicplayer.docml
 
 #endif	// MUSICPLAYER_IBY
\ No newline at end of file
--- a/app/src/main.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/app/src/main.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -18,6 +18,8 @@
 #include <QtGui>
 #include <hbapplication.h>
 #include <hbtranslator.h>
+#include <xqserviceutil.h>
+#include <hbsplashscreen.h>
 
 #include "mpmainwindow.h"
 #include "mptrace.h"
@@ -52,19 +54,17 @@
     TX_STATIC_ENTRY
 
     // Initialization
-    HbApplication app(argc, argv);
+    HbApplication app(argc, argv, Hb::NoSplash);
+    if ( !XQServiceUtil::isService() ) {
+        HbSplashScreen::start( );
+    }
     QVariantHash params = app.activateParams();
     HbTranslator translator;
     translator.loadCommon();
     MpMainWindow::ActivityMode mode;
     
     if ( !params.value( "activityname" ).toString().compare( "MusicNowPlayingView" ) ) { 
-        if( params.contains( "shuffle" ) ) {
-            mode = !params.value( "shuffle" ).toString().compare( "yes" ) ? MpMainWindow::MusicNowPlayingViewShuffleAll : MpMainWindow::MusicNowPlayingView;
-        }
-        else {
-            mode = MpMainWindow::MusicNowPlayingView;
-        }
+        mode = MpMainWindow::MusicNowPlayingView;
     }
     else {
         mode = MpMainWindow::MusicMainView;
--- a/app/src/mpmainwindow.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/app/src/mpmainwindow.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -33,6 +33,9 @@
 #include "mpglobalpopuphandler.h"
 #include "mptrace.h"
 
+const QString MUSIC_MAIN_VIEW = "MusicMainView";
+const QString MUSIC_NOW_PLAYING_VIEW = "MusicNowPlayingView";
+
 /*!
    \class MpMainWindow
    \brief The MpMainWindow class provides Main Window functionalities.
@@ -55,7 +58,9 @@
       mCurrentViewPlugin(0),
       mVerticalViewType( CollectionView ),
       mMusicServices(0),
-      mPopupHandler(0)
+      mPopupHandler(0),
+      mUserExit( false ),
+      mActivityManager(0)
 {
     TX_LOG
 }
@@ -123,41 +128,62 @@
     }
 
     if ( !mMusicServices ) {
+        HbApplication* app = qobject_cast<HbApplication*>(qApp);
+        QVariantHash params = app->activateParams();
         MpEngineFactory::createSharedEngine();
         mPopupHandler = new MpGlobalPopupHandler( this );
+        if( app->activateReason() == Hb::ActivationReasonActivity ) {
+            // Restoring an activity, not a fresh startup or a service
+            // Activities from Task switcher only have one parameter
+            if( params.count() == 1 ) {
+                 loadActivity( app->activateData() );
+            }
+        }
         if ( orientation() == Qt::Vertical ) {
             // If first startup ignore shuffleAll and send to collection view to refresh library
             if ( mode == MusicMainView  || MpSettingsManager::firstStartup() ) {
-                loadView(CollectionView);
-                activateView(CollectionView);
-                loadView(MediaWallView);
+                loadView( CollectionView );
+                activateView( CollectionView );
+                loadView( MediaWallView );
                 loadView( PlaybackView );
-            } else if (mode == MusicNowPlayingViewShuffleAll ) {
-                MpEngineFactory::sharedEngine()->shuffleAll();
+            } else if ( mode == MusicNowPlayingView ) {
+                if( params.contains( "shuffle" ) ) {
+                    if( !params.value( "shuffle" ).toString().compare( "yes" ) ) {
+                        MpEngineFactory::sharedEngine()->shuffleAll();
+                    }
+                }
                 loadView( PlaybackView );
-                activateView(PlaybackView);
-                loadView(CollectionView);
-                loadView(MediaWallView);
+                activateView( PlaybackView );
+                loadView( CollectionView );
+                loadView( MediaWallView );
             }
         }
         else {
             // If first startup ignore shuffleAll and send to refresh library
-            if( mode == MusicNowPlayingViewShuffleAll && !MpSettingsManager::firstStartup() ) {
-                MpEngineFactory::sharedEngine()->shuffleAll();
+            if( mode == MusicNowPlayingView && !MpSettingsManager::firstStartup() ) {
+                if( params.contains( "shuffle" ) ) {
+                    if( !params.value( "shuffle" ).toString().compare( "yes" ) ) {
+                        MpEngineFactory::sharedEngine()->shuffleAll();
+                    }
+                }
                 mVerticalViewType = PlaybackView;
             }
-            loadView(MediaWallView);
-            activateView(MediaWallView);
-            loadView(CollectionView);
+            loadView( MediaWallView );
+            activateView( MediaWallView );
+            loadView( CollectionView );
             loadView( PlaybackView );
         }
         connect(this, SIGNAL( orientationChanged( Qt::Orientation ) ), SLOT( switchView( Qt::Orientation ) ) );
         connect( MpEngineFactory::sharedEngine(), SIGNAL( libraryUpdated() ), SLOT( handleLibraryUpdated() ) );
         MpEngineFactory::sharedEngine()->checkForSystemEvents();
-        //Register to application manager to wait for activities
-        HbApplication* app = qobject_cast<HbApplication*>(qApp);
-        app->activityManager()->waitActivity();
+        //Register to application manager to wait for activities and clear previous activities on the task switcher
+        mActivityManager = qobject_cast<HbApplication*>(qApp)->activityManager();
+        mActivityManager->waitActivity();
+        mActivityManager->removeActivity( MUSIC_MAIN_VIEW );
+        mActivityManager->removeActivity( MUSIC_NOW_PLAYING_VIEW );
         connect( app, SIGNAL( activate() ), this , SLOT( handleActivity() ) );
+        connect( app, SIGNAL( aboutToQuit() ), this, SLOT( saveActivity() ) );
+        emit applicationReady();
         
     }
     else {
@@ -182,6 +208,7 @@
             if ( mCurrentViewPlugin ) {
                 disconnectView();
             }
+            mUserExit = true;
             qApp->quit();
             break;
         case MpCommon::SendToBackground:
@@ -326,6 +353,9 @@
     }
 }
 
+/*!
+  Slot to initialize the view that corresponds to the requested service  
+ */
 void MpMainWindow::initializeServiceView( TUid hostUid )
 {
     switch (mMusicServices->currentService()) {
@@ -360,6 +390,74 @@
         Q_ASSERT_X(false, "MpMainWindow::initializeServiceView", "undefined service");
         break;
     }
+    emit applicationReady();
+}
+
+/*!
+  Slot to handle activity switching once the stand alone instance is running and registered 
+  in the activity manager to wait for activities.
+  Only running activity supported at the moment is "MusicNowPlayingView"
+ */
+void MpMainWindow::handleActivity()
+{
+    TX_ENTRY
+    HbApplication* app = qobject_cast<HbApplication*>(qApp);
+    QString activityId = app->activateId();
+    
+    if( !activityId.compare( MUSIC_NOW_PLAYING_VIEW ) ) {
+        if ( orientation() == Qt::Vertical ) {
+            if( mVerticalViewType != PlaybackView ) {
+                activateView( PlaybackView );
+            }
+        }
+    }
+    
+    mActivityManager->waitActivity();
+    TX_EXIT
+}
+
+/*!
+  Slot to save activity upon exiting application
+ */
+void MpMainWindow::saveActivity()
+{
+    TX_ENTRY
+    QString activity = ( mVerticalViewType == CollectionView ) ? MUSIC_MAIN_VIEW : MUSIC_NOW_PLAYING_VIEW;
+    //Get data from engine
+    QByteArray serializedRestorePath;
+    if ( mUserExit ) {
+        //Internal exit will always return to the main view
+        activity = MUSIC_MAIN_VIEW;
+    }
+    else {
+        //Only saved data if exited via task switcher or GOOM
+        MpEngineFactory::sharedEngine()->saveActivityData( serializedRestorePath );
+    }
+    QVariantHash activityParameters;
+    activityParameters.insert( "screenshot", QPixmap::grabWidget( this, this->rect() ) );
+    QVariantHash activityData;
+    activityData.insert( "restorePath", serializedRestorePath );
+       
+    
+    bool ok = mActivityManager->addActivity( activity , activityData, activityParameters );
+    if ( !ok ){
+        TX_LOG_ARGS( "Error: Add Failed; should never get here." );
+    }
+    TX_EXIT
+}
+
+/*!
+  Slot to handle a failed path restoration. Switch to collection view if not already there.
+ */
+void MpMainWindow::handleRestorePathFailed()
+{
+    TX_ENTRY
+    if ( orientation() == Qt::Vertical ) {
+        if( mVerticalViewType != CollectionView ) {
+            activateView( CollectionView );
+        }
+    }
+    TX_EXIT
 }
 
 /*!
@@ -414,23 +512,15 @@
 }
 
 /*!
-  Slot to handle activity switching once the stand alone instance is running and registered 
-  in the activity manager to wait for activities.
-  Only running activity supported at the moment is "MusicNowPlayingView"
+  Load activity called via task switcher
+  Restore view and playback path if applicable
  */
-void MpMainWindow::handleActivity()
+void MpMainWindow::loadActivity( QVariant data )
 {
-    HbApplication* app = qobject_cast<HbApplication*>(qApp);
-    QString activityId = app->activateId();
-    
-    if( !activityId.compare( "MusicNowPlayingView&launchtype=standalone" ) ) {
-        if ( orientation() == Qt::Vertical ) {
-            if( mVerticalViewType != PlaybackView ) {
-                activateView( PlaybackView );
-            }
-        }
-    }
-    HbActivityManager* activityManager = qobject_cast<HbApplication*>(qApp)->activityManager();
-    activityManager->waitActivity();
+    TX_ENTRY
+    QVariantHash activityData = data.toHash();
+    QByteArray serializedRestorePath = activityData.value( "restorePath" ).toByteArray();
+    MpEngineFactory::sharedEngine()->loadActivityData( serializedRestorePath );
+    TX_EXIT
 }
 
--- a/inc/mpengine.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/inc/mpengine.h	Fri Jun 25 17:21:37 2010 -0500
@@ -121,6 +121,10 @@
     void disableEqualizer();
     int activePreset();
     QStringList presetNames();
+    
+    //Activity related
+    void saveActivityData( QByteArray &data );
+    void loadActivityData( const QByteArray &data );
 
 signals:
 
@@ -142,6 +146,7 @@
     void playlistsRenamed( bool success );
     void isolatedCollectionOpened( MpMpxCollectionData* collectionData );
     void containerContentsChanged();
+    void restorePathFailed();
 
     // Equalizer related
     void equalizerReady();
--- a/mpdata/src/mpmpxcollectiondata_p.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpdata/src/mpmpxcollectiondata_p.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -668,7 +668,7 @@
  */
 bool MpMpxCollectionDataPrivate::DoTestCachedItemL( int itemId )
 {
-    if ( !iCachedRemovedItem && !iCachedRemovedItem->IsSupported( KMPXMediaGeneralId ) ) {
+    if ( !iCachedRemovedItem || !iCachedRemovedItem->IsSupported( KMPXMediaGeneralId ) ) {
         User::Leave(KErrNotFound);
     }
     return ( itemId == iCachedRemovedItem->ValueTObjectL<TInt>( KMPXMediaGeneralId ) );
--- a/mpdata/tsrc/unittest_mpmpxcollectiondata/src/unittest_mpmpxcollectiondata.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpdata/tsrc/unittest_mpmpxcollectiondata/src/unittest_mpmpxcollectiondata.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -625,9 +625,14 @@
     int itemId = 147;
     CMPXMedia* item = CMPXMedia::NewL();
 
+    // Test error case when iCachedRemovedItem is NULL. 
+    QVERIFY( !mTest->testCachedItem( itemId ) );
+
+    // Test error case when KMPXMediaGeneralId is not supported. 
     mTestPrivate->iCachedRemovedItem = item;
     QVERIFY( !mTest->testCachedItem( itemId ) );
 
+    // Test good case.
     item->SetTObjectValueL<TMPXItemId>( KMPXMediaGeneralId, itemId );
     QVERIFY( mTest->testCachedItem( itemId ) );
 
--- a/mpengine/bwins/mpengineu.def	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/bwins/mpengineu.def	Fri Jun 25 17:21:37 2010 -0500
@@ -1,128 +1,131 @@
 EXPORTS
-	?metaObject@MpEngine@@UBEPBUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const * MpEngine::metaObject(void) const
-	?instance@MpEngineFactory@@SAPAV1@XZ @ 2 NONAME ; class MpEngineFactory * MpEngineFactory::instance(void)
-	?createIsolatedEngine@MpEngineFactory@@SAPAVMpEngine@@W4EngineMode@2@@Z @ 3 NONAME ; class MpEngine * MpEngineFactory::createIsolatedEngine(enum MpEngine::EngineMode)
-	??_EMpSongScanner@@UAE@I@Z @ 4 NONAME ; MpSongScanner::~MpSongScanner(unsigned int)
-	?findAlbumSongs@MpEngine@@QAEXH@Z @ 5 NONAME ; void MpEngine::findAlbumSongs(int)
-	?equalizerReady@MpEngine@@IAEXXZ @ 6 NONAME ; void MpEngine::equalizerReady(void)
-	?setPosition@MpEngine@@QAEXH@Z @ 7 NONAME ; void MpEngine::setPosition(int)
-	?saveToCurrentPlaylist@MpEngine@@QAEXAAV?$QList@H@@PAVMpMpxCollectionData@@@Z @ 8 NONAME ; void MpEngine::saveToCurrentPlaylist(class QList<int> &, class MpMpxCollectionData *)
-	?metaObject@MpEngineFactory@@UBEPBUQMetaObject@@XZ @ 9 NONAME ; struct QMetaObject const * MpEngineFactory::metaObject(void) const
-	?handleDeleteStarted@MpEngine@@QAEXW4TCollectionContext@@H@Z @ 10 NONAME ; void MpEngine::handleDeleteStarted(enum TCollectionContext, int)
-	?handleEqualizerReady@MpEngine@@QAEXXZ @ 11 NONAME ; void MpEngine::handleEqualizerReady(void)
-	?collectionData@MpEngine@@QAEPAVMpMpxCollectionData@@XZ @ 12 NONAME ; class MpMpxCollectionData * MpEngine::collectionData(void)
-	?createPlaylist@MpEngine@@QAEXAAVQString@@AAV?$QList@H@@PAVMpMpxCollectionData@@@Z @ 13 NONAME ; void MpEngine::createPlaylist(class QString &, class QList<int> &, class MpMpxCollectionData *)
-	?collectionPlaylistOpened@MpEngine@@IAEXXZ @ 14 NONAME ; void MpEngine::collectionPlaylistOpened(void)
-	?tr@MpSongScanner@@SA?AVQString@@PBD0@Z @ 15 NONAME ; class QString MpSongScanner::tr(char const *, char const *)
-	?renamePlaylist@MpEngine@@QAEXAAVQString@@H@Z @ 16 NONAME ; void MpEngine::renamePlaylist(class QString &, int)
-	?scanCountChanged@MpSongScanner@@IAEXH@Z @ 17 NONAME ; void MpSongScanner::scanCountChanged(int)
-	?handleUsbMtpEndEvent@MpEngine@@AAEXXZ @ 18 NONAME ; void MpEngine::handleUsbMtpEndEvent(void)
-	?setBalance@MpEngine@@QAEXH@Z @ 19 NONAME ; void MpEngine::setBalance(int)
-	?songData@MpEngine@@QAEPAVMpSongData@@XZ @ 20 NONAME ; class MpSongData * MpEngine::songData(void)
-	?skipForward@MpEngine@@QAEXXZ @ 21 NONAME ; void MpEngine::skipForward(void)
-	??_EMpEngineFactory@@UAE@I@Z @ 22 NONAME ; MpEngineFactory::~MpEngineFactory(unsigned int)
-	?playAlbumSongs@MpEngine@@QAEXHHPAVMpMpxCollectionData@@@Z @ 23 NONAME ; void MpEngine::playAlbumSongs(int, int, class MpMpxCollectionData *)
-	?setShuffle@MpEngine@@QAEX_N@Z @ 24 NONAME ; void MpEngine::setShuffle(bool)
-	?openIsolatedCollection@MpEngine@@QAEXW4TCollectionContext@@@Z @ 25 NONAME ; void MpEngine::openIsolatedCollection(enum TCollectionContext)
-	?usbSynchronizationFinished@MpEngine@@IAEXXZ @ 26 NONAME ; void MpEngine::usbSynchronizationFinished(void)
-	?trUtf8@MpSongScanner@@SA?AVQString@@PBD0H@Z @ 27 NONAME ; class QString MpSongScanner::trUtf8(char const *, char const *, int)
-	?close@MpEngineFactory@@SAXXZ @ 28 NONAME ; void MpEngineFactory::close(void)
-	?qt_metacall@MpEngine@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 29 NONAME ; int MpEngine::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?playlistSaved@MpEngine@@IAEX_N@Z @ 30 NONAME ; void MpEngine::playlistSaved(bool)
-	?playbackData@MpEngine@@QAEPAVMpPlaybackData@@XZ @ 31 NONAME ; class MpPlaybackData * MpEngine::playbackData(void)
-	?stop@MpEngine@@QAEXXZ @ 32 NONAME ; void MpEngine::stop(void)
-	?retrieveSong@MpEngine@@QAEXXZ @ 33 NONAME ; void MpEngine::retrieveSong(void)
-	?libraryAboutToUpdate@MpEngine@@IAEXXZ @ 34 NONAME ; void MpEngine::libraryAboutToUpdate(void)
-	?scan@MpSongScanner@@QAEX_N@Z @ 35 NONAME ; void MpSongScanner::scan(bool)
-	?openCollection@MpEngine@@QAEXW4TCollectionContext@@@Z @ 36 NONAME ; void MpEngine::openCollection(enum TCollectionContext)
-	?trUtf8@MpEngine@@SA?AVQString@@PBD0H@Z @ 37 NONAME ; class QString MpEngine::trUtf8(char const *, char const *, int)
-	?reopenCollection@MpEngine@@QAEXXZ @ 38 NONAME ; void MpEngine::reopenCollection(void)
-	?songsDeleted@MpEngine@@IAEX_N@Z @ 39 NONAME ; void MpEngine::songsDeleted(bool)
-	??0MpEngineFactory@@AAE@XZ @ 40 NONAME ; MpEngineFactory::MpEngineFactory(void)
-	?refreshLibrary@MpEngine@@QAEX_N@Z @ 41 NONAME ; void MpEngine::refreshLibrary(bool)
-	?qt_metacast@MpEngine@@UAEPAXPBD@Z @ 42 NONAME ; void * MpEngine::qt_metacast(char const *)
-	?startSeekForward@MpEngine@@QAEXXZ @ 43 NONAME ; void MpEngine::startSeekForward(void)
-	?saveToPlaylist@MpEngine@@QAEXHAAV?$QList@H@@@Z @ 44 NONAME ; void MpEngine::saveToPlaylist(int, class QList<int> &)
-	?qt_metacall@MpEngineFactory@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 45 NONAME ; int MpEngineFactory::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?qt_metacall@MpSongScanner@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 46 NONAME ; int MpSongScanner::qt_metacall(enum QMetaObject::Call, int, void * *)
-	?libraryRefreshNeeded@MpEngine@@IAEXXZ @ 47 NONAME ; void MpEngine::libraryRefreshNeeded(void)
-	?handleDiskEvent@MpSongScanner@@QAEXW4MpxDiskEvents@@@Z @ 48 NONAME ; void MpSongScanner::handleDiskEvent(enum MpxDiskEvents)
-	?tr@MpEngineFactory@@SA?AVQString@@PBD0H@Z @ 49 NONAME ; class QString MpEngineFactory::tr(char const *, char const *, int)
-	?tr@MpEngine@@SA?AVQString@@PBD0H@Z @ 50 NONAME ; class QString MpEngine::tr(char const *, char const *, int)
-	?trUtf8@MpEngine@@SA?AVQString@@PBD0@Z @ 51 NONAME ; class QString MpEngine::trUtf8(char const *, char const *)
-	?findPlaylists@MpEngine@@QAEXAAVQStringList@@@Z @ 52 NONAME ; void MpEngine::findPlaylists(class QStringList &)
-	?presetNames@MpEngine@@QAE?AVQStringList@@XZ @ 53 NONAME ; class QStringList MpEngine::presetNames(void)
-	?isAutomaticScan@MpSongScanner@@QAE_NXZ @ 54 NONAME ; bool MpSongScanner::isAutomaticScan(void)
-	??1MpEngineFactory@@UAE@XZ @ 55 NONAME ; MpEngineFactory::~MpEngineFactory(void)
-	?previewItem@MpEngine@@QAEXH@Z @ 56 NONAME ; void MpEngine::previewItem(int)
-	??1MpSongScanner@@UAE@XZ @ 57 NONAME ; MpSongScanner::~MpSongScanner(void)
-	?loudness@MpEngine@@QAE_NXZ @ 58 NONAME ; bool MpEngine::loudness(void)
-	?staticMetaObject@MpEngineFactory@@2UQMetaObject@@B @ 59 NONAME ; struct QMetaObject const MpEngineFactory::staticMetaObject
-	?deleteSongs@MpEngine@@QAEXAAV?$QList@H@@@Z @ 60 NONAME ; void MpEngine::deleteSongs(class QList<int> &)
-	?releaseIsolatedCollection@MpEngine@@QAEXXZ @ 61 NONAME ; void MpEngine::releaseIsolatedCollection(void)
-	?deleteStarted@MpEngine@@IAEXW4TCollectionContext@@H@Z @ 62 NONAME ; void MpEngine::deleteStarted(enum TCollectionContext, int)
-	?stopSeeking@MpEngine@@QAEXXZ @ 63 NONAME ; void MpEngine::stopSeeking(void)
-	?playEmbedded@MpEngine@@QAEXVQString@@@Z @ 64 NONAME ; void MpEngine::playEmbedded(class QString)
-	?initialize@MpEngine@@AAEXVTUid@@W4EngineMode@1@@Z @ 65 NONAME ; void MpEngine::initialize(class TUid, enum MpEngine::EngineMode)
-	?tr@MpEngine@@SA?AVQString@@PBD0@Z @ 66 NONAME ; class QString MpEngine::tr(char const *, char const *)
-	?disableEqualizer@MpEngine@@QAEXXZ @ 67 NONAME ; void MpEngine::disableEqualizer(void)
-	?getStaticMetaObject@MpEngine@@SAABUQMetaObject@@XZ @ 68 NONAME ; struct QMetaObject const & MpEngine::getStaticMetaObject(void)
-	?shuffleAll@MpEngine@@QAEXXZ @ 69 NONAME ; void MpEngine::shuffleAll(void)
-	?qt_metacast@MpEngineFactory@@UAEPAXPBD@Z @ 70 NONAME ; void * MpEngineFactory::qt_metacast(char const *)
-	?renamePlaylist@MpEngine@@QAEXAAVQString@@@Z @ 71 NONAME ; void MpEngine::renamePlaylist(class QString &)
-	?libraryUpdated@MpEngine@@IAEXXZ @ 72 NONAME ; void MpEngine::libraryUpdated(void)
-	?metaObject@MpSongScanner@@UBEPBUQMetaObject@@XZ @ 73 NONAME ; struct QMetaObject const * MpSongScanner::metaObject(void) const
-	?setRepeat@MpEngine@@QAEX_N@Z @ 74 NONAME ; void MpEngine::setRepeat(bool)
-	?trUtf8@MpEngineFactory@@SA?AVQString@@PBD0@Z @ 75 NONAME ; class QString MpEngineFactory::trUtf8(char const *, char const *)
-	??0MpSongScanner@@QAE@PAVMpMpxHarvesterFrameworkWrapper@@PAVQObject@@@Z @ 76 NONAME ; MpSongScanner::MpSongScanner(class MpMpxHarvesterFrameworkWrapper *, class QObject *)
-	?cancelCollectionRequest@MpEngine@@QAEXXZ @ 77 NONAME ; void MpEngine::cancelCollectionRequest(void)
-	?containerContentsChanged@MpEngine@@IAEXXZ @ 78 NONAME ; void MpEngine::containerContentsChanged(void)
-	?startSeekBackward@MpEngine@@QAEXXZ @ 79 NONAME ; void MpEngine::startSeekBackward(void)
-	?playlistsRenamed@MpEngine@@IAEX_N@Z @ 80 NONAME ; void MpEngine::playlistsRenamed(bool)
-	?playPause@MpEngine@@QAEXXZ @ 81 NONAME ; void MpEngine::playPause(void)
-	?checkForSystemEvents@MpEngine@@QAEXXZ @ 82 NONAME ; void MpEngine::checkForSystemEvents(void)
-	?tr@MpEngineFactory@@SA?AVQString@@PBD0@Z @ 83 NONAME ; class QString MpEngineFactory::tr(char const *, char const *)
-	?applyPreset@MpEngine@@QAEXH@Z @ 84 NONAME ; void MpEngine::applyPreset(int)
-	?playEmbedded@MpEngine@@QAEXABVXQSharableFile@@@Z @ 85 NONAME ; void MpEngine::playEmbedded(class XQSharableFile const &)
-	?trUtf8@MpEngineFactory@@SA?AVQString@@PBD0H@Z @ 86 NONAME ; class QString MpEngineFactory::trUtf8(char const *, char const *, int)
-	?staticMetaObject@MpEngine@@2UQMetaObject@@B @ 87 NONAME ; struct QMetaObject const MpEngine::staticMetaObject
-	?scanStarted@MpSongScanner@@IAEXXZ @ 88 NONAME ; void MpSongScanner::scanStarted(void)
-	?unableToCotinueDueUSB@MpEngine@@IAEXXZ @ 89 NONAME ; void MpEngine::unableToCotinueDueUSB(void)
-	?handleUsbMtpStartEvent@MpEngine@@AAEXXZ @ 90 NONAME ; void MpEngine::handleUsbMtpStartEvent(void)
-	?openCollectionItem@MpEngine@@QAEXH@Z @ 91 NONAME ; void MpEngine::openCollectionItem(int)
-	?cancelScan@MpSongScanner@@QAEXXZ @ 92 NONAME ; void MpSongScanner::cancelScan(void)
-	?trUtf8@MpSongScanner@@SA?AVQString@@PBD0@Z @ 93 NONAME ; class QString MpSongScanner::trUtf8(char const *, char const *)
-	?handleScanStarted@MpEngine@@QAEXXZ @ 94 NONAME ; void MpEngine::handleScanStarted(void)
-	?back@MpEngine@@QAEXXZ @ 95 NONAME ; void MpEngine::back(void)
-	?activePreset@MpEngine@@QAEHXZ @ 96 NONAME ; int MpEngine::activePreset(void)
-	?tr@MpSongScanner@@SA?AVQString@@PBD0H@Z @ 97 NONAME ; class QString MpSongScanner::tr(char const *, char const *, int)
-	?handleUsbEvent@MpEngine@@QAEXW4MpxUsbEvents@@@Z @ 98 NONAME ; void MpEngine::handleUsbEvent(enum MpxUsbEvents)
-	?songScanner@MpEngine@@QAEPAVMpSongScanner@@XZ @ 99 NONAME ; class MpSongScanner * MpEngine::songScanner(void)
-	?sharedEngine@MpEngineFactory@@SAPAVMpEngine@@XZ @ 100 NONAME ; class MpEngine * MpEngineFactory::sharedEngine(void)
-	?handleUsbMassStorageStartEvent@MpEngine@@AAEXXZ @ 101 NONAME ; void MpEngine::handleUsbMassStorageStartEvent(void)
-	?balance@MpEngine@@QAEHXZ @ 102 NONAME ; int MpEngine::balance(void)
-	?handleDeleteEnded@MpEngine@@QAEX_N@Z @ 103 NONAME ; void MpEngine::handleDeleteEnded(bool)
-	?handleDiskEvent@MpEngine@@QAEXW4MpxDiskEvents@@@Z @ 104 NONAME ; void MpEngine::handleDiskEvent(enum MpxDiskEvents)
-	?verifyUsbBlocking@MpEngine@@QAE_N_N@Z @ 105 NONAME ; bool MpEngine::verifyUsbBlocking(bool)
-	?usbSynchronizationStarted@MpEngine@@IAEXXZ @ 106 NONAME ; void MpEngine::usbSynchronizationStarted(void)
-	?handleUsbMassStorageEndEvent@MpEngine@@AAEXXZ @ 107 NONAME ; void MpEngine::handleUsbMassStorageEndEvent(void)
-	?createSharedEngine@MpEngineFactory@@SAPAVMpEngine@@VTUid@@W4EngineMode@2@@Z @ 108 NONAME ; class MpEngine * MpEngineFactory::createSharedEngine(class TUid, enum MpEngine::EngineMode)
-	?usbBlocked@MpEngine@@IAEX_N@Z @ 109 NONAME ; void MpEngine::usbBlocked(bool)
-	?getStaticMetaObject@MpSongScanner@@SAABUQMetaObject@@XZ @ 110 NONAME ; struct QMetaObject const & MpSongScanner::getStaticMetaObject(void)
-	?getStaticMetaObject@MpEngineFactory@@SAABUQMetaObject@@XZ @ 111 NONAME ; struct QMetaObject const & MpEngineFactory::getStaticMetaObject(void)
-	??0MpEngine@@AAE@XZ @ 112 NONAME ; MpEngine::MpEngine(void)
-	?handleUsbMtpNotActive@MpEngine@@AAEXXZ @ 113 NONAME ; void MpEngine::handleUsbMtpNotActive(void)
-	?staticMetaObject@MpSongScanner@@2UQMetaObject@@B @ 114 NONAME ; struct QMetaObject const MpSongScanner::staticMetaObject
-	?handleScanEnded@MpSongScanner@@QAEXHH@Z @ 115 NONAME ; void MpSongScanner::handleScanEnded(int, int)
-	?isolatedCollectionOpened@MpEngine@@IAEXPAVMpMpxCollectionData@@@Z @ 116 NONAME ; void MpEngine::isolatedCollectionOpened(class MpMpxCollectionData *)
-	?handleScanEnded@MpEngine@@QAEXHH@Z @ 117 NONAME ; void MpEngine::handleScanEnded(int, int)
-	?aboutToAddSongs@MpEngine@@IAEXH@Z @ 118 NONAME ; void MpEngine::aboutToAddSongs(int)
-	?skipBackward@MpEngine@@QAEXXZ @ 119 NONAME ; void MpEngine::skipBackward(void)
-	??_EMpEngine@@UAE@I@Z @ 120 NONAME ; MpEngine::~MpEngine(unsigned int)
-	??1MpEngine@@UAE@XZ @ 121 NONAME ; MpEngine::~MpEngine(void)
-	?changeUsbBlockingState@MpEngine@@AAEXW4UsbBlockingState@1@@Z @ 122 NONAME ; void MpEngine::changeUsbBlockingState(enum MpEngine::UsbBlockingState)
-	?setLoudness@MpEngine@@QAEX_N@Z @ 123 NONAME ; void MpEngine::setLoudness(bool)
-	?scanFinished@MpSongScanner@@IAEXHH@Z @ 124 NONAME ; void MpSongScanner::scanFinished(int, int)
-	?reorderPlaylist@MpEngine@@QAEXHHHH@Z @ 125 NONAME ; void MpEngine::reorderPlaylist(int, int, int, int)
+	?instance@MpEngineFactory@@SAPAV1@XZ @ 1 NONAME ; class MpEngineFactory * MpEngineFactory::instance(void)
+	?saveToCurrentPlaylist@MpEngine@@QAEXAAV?$QList@H@@PAVMpMpxCollectionData@@@Z @ 2 NONAME ; void MpEngine::saveToCurrentPlaylist(class QList<int> &, class MpMpxCollectionData *)
+	?handleDeleteStarted@MpEngine@@QAEXW4TCollectionContext@@H@Z @ 3 NONAME ; void MpEngine::handleDeleteStarted(enum TCollectionContext, int)
+	?collectionData@MpEngine@@QAEPAVMpMpxCollectionData@@XZ @ 4 NONAME ; class MpMpxCollectionData * MpEngine::collectionData(void)
+	?createPlaylist@MpEngine@@QAEXAAVQString@@AAV?$QList@H@@PAVMpMpxCollectionData@@@Z @ 5 NONAME ; void MpEngine::createPlaylist(class QString &, class QList<int> &, class MpMpxCollectionData *)
+	?collectionPlaylistOpened@MpEngine@@IAEXXZ @ 6 NONAME ; void MpEngine::collectionPlaylistOpened(void)
+	?renamePlaylist@MpEngine@@QAEXAAVQString@@H@Z @ 7 NONAME ; void MpEngine::renamePlaylist(class QString &, int)
+	?scanCountChanged@MpSongScanner@@IAEXH@Z @ 8 NONAME ; void MpSongScanner::scanCountChanged(int)
+	?handleUsbMtpEndEvent@MpEngine@@AAEXXZ @ 9 NONAME ; void MpEngine::handleUsbMtpEndEvent(void)
+	?setBalance@MpEngine@@QAEXH@Z @ 10 NONAME ; void MpEngine::setBalance(int)
+	?playAlbumSongs@MpEngine@@QAEXHHPAVMpMpxCollectionData@@@Z @ 11 NONAME ; void MpEngine::playAlbumSongs(int, int, class MpMpxCollectionData *)
+	?setShuffle@MpEngine@@QAEX_N@Z @ 12 NONAME ; void MpEngine::setShuffle(bool)
+	?openIsolatedCollection@MpEngine@@QAEXW4TCollectionContext@@@Z @ 13 NONAME ; void MpEngine::openIsolatedCollection(enum TCollectionContext)
+	?usbSynchronizationFinished@MpEngine@@IAEXXZ @ 14 NONAME ; void MpEngine::usbSynchronizationFinished(void)
+	?qt_metacall@MpEngine@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 15 NONAME ; int MpEngine::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?playlistSaved@MpEngine@@IAEX_N@Z @ 16 NONAME ; void MpEngine::playlistSaved(bool)
+	?playbackData@MpEngine@@QAEPAVMpPlaybackData@@XZ @ 17 NONAME ; class MpPlaybackData * MpEngine::playbackData(void)
+	?stop@MpEngine@@QAEXXZ @ 18 NONAME ; void MpEngine::stop(void)
+	?retrieveSong@MpEngine@@QAEXXZ @ 19 NONAME ; void MpEngine::retrieveSong(void)
+	?scan@MpSongScanner@@QAEX_N@Z @ 20 NONAME ; void MpSongScanner::scan(bool)
+	?openCollection@MpEngine@@QAEXW4TCollectionContext@@@Z @ 21 NONAME ; void MpEngine::openCollection(enum TCollectionContext)
+	??0MpEngineFactory@@AAE@XZ @ 22 NONAME ; MpEngineFactory::MpEngineFactory(void)
+	?libraryRefreshNeeded@MpEngine@@IAEXXZ @ 23 NONAME ; void MpEngine::libraryRefreshNeeded(void)
+	?handleDiskEvent@MpSongScanner@@QAEXW4MpxDiskEvents@@@Z @ 24 NONAME ; void MpSongScanner::handleDiskEvent(enum MpxDiskEvents)
+	?tr@MpEngine@@SA?AVQString@@PBD0H@Z @ 25 NONAME ; class QString MpEngine::tr(char const *, char const *, int)
+	?trUtf8@MpEngine@@SA?AVQString@@PBD0@Z @ 26 NONAME ; class QString MpEngine::trUtf8(char const *, char const *)
+	?presetNames@MpEngine@@QAE?AVQStringList@@XZ @ 27 NONAME ; class QStringList MpEngine::presetNames(void)
+	?previewItem@MpEngine@@QAEXH@Z @ 28 NONAME ; void MpEngine::previewItem(int)
+	??1MpSongScanner@@UAE@XZ @ 29 NONAME ; MpSongScanner::~MpSongScanner(void)
+	?loudness@MpEngine@@QAE_NXZ @ 30 NONAME ; bool MpEngine::loudness(void)
+	?deleteSongs@MpEngine@@QAEXAAV?$QList@H@@@Z @ 31 NONAME ; void MpEngine::deleteSongs(class QList<int> &)
+	?releaseIsolatedCollection@MpEngine@@QAEXXZ @ 32 NONAME ; void MpEngine::releaseIsolatedCollection(void)
+	?deleteStarted@MpEngine@@IAEXW4TCollectionContext@@H@Z @ 33 NONAME ; void MpEngine::deleteStarted(enum TCollectionContext, int)
+	?stopSeeking@MpEngine@@QAEXXZ @ 34 NONAME ; void MpEngine::stopSeeking(void)
+	?initialize@MpEngine@@AAEXVTUid@@W4EngineMode@1@@Z @ 35 NONAME ; void MpEngine::initialize(class TUid, enum MpEngine::EngineMode)
+	?tr@MpEngine@@SA?AVQString@@PBD0@Z @ 36 NONAME ; class QString MpEngine::tr(char const *, char const *)
+	?disableEqualizer@MpEngine@@QAEXXZ @ 37 NONAME ; void MpEngine::disableEqualizer(void)
+	?getStaticMetaObject@MpEngine@@SAABUQMetaObject@@XZ @ 38 NONAME ; struct QMetaObject const & MpEngine::getStaticMetaObject(void)
+	?qt_metacast@MpEngineFactory@@UAEPAXPBD@Z @ 39 NONAME ; void * MpEngineFactory::qt_metacast(char const *)
+	?libraryUpdated@MpEngine@@IAEXXZ @ 40 NONAME ; void MpEngine::libraryUpdated(void)
+	??0MpSongScanner@@QAE@PAVMpMpxHarvesterFrameworkWrapper@@PAVQObject@@@Z @ 41 NONAME ; MpSongScanner::MpSongScanner(class MpMpxHarvesterFrameworkWrapper *, class QObject *)
+	?checkForSystemEvents@MpEngine@@QAEXXZ @ 42 NONAME ; void MpEngine::checkForSystemEvents(void)
+	?applyPreset@MpEngine@@QAEXH@Z @ 43 NONAME ; void MpEngine::applyPreset(int)
+	?trUtf8@MpEngineFactory@@SA?AVQString@@PBD0H@Z @ 44 NONAME ; class QString MpEngineFactory::trUtf8(char const *, char const *, int)
+	?staticMetaObject@MpEngine@@2UQMetaObject@@B @ 45 NONAME ; struct QMetaObject const MpEngine::staticMetaObject
+	?scanStarted@MpSongScanner@@IAEXXZ @ 46 NONAME ; void MpSongScanner::scanStarted(void)
+	?unableToCotinueDueUSB@MpEngine@@IAEXXZ @ 47 NONAME ; void MpEngine::unableToCotinueDueUSB(void)
+	?openCollectionItem@MpEngine@@QAEXH@Z @ 48 NONAME ; void MpEngine::openCollectionItem(int)
+	?handleScanStarted@MpEngine@@QAEXXZ @ 49 NONAME ; void MpEngine::handleScanStarted(void)
+	?back@MpEngine@@QAEXXZ @ 50 NONAME ; void MpEngine::back(void)
+	?tr@MpSongScanner@@SA?AVQString@@PBD0H@Z @ 51 NONAME ; class QString MpSongScanner::tr(char const *, char const *, int)
+	?songScanner@MpEngine@@QAEPAVMpSongScanner@@XZ @ 52 NONAME ; class MpSongScanner * MpEngine::songScanner(void)
+	?handleUsbMassStorageStartEvent@MpEngine@@AAEXXZ @ 53 NONAME ; void MpEngine::handleUsbMassStorageStartEvent(void)
+	?saveActivityData@MpEngine@@QAEXAAVQByteArray@@@Z @ 54 NONAME ; void MpEngine::saveActivityData(class QByteArray &)
+	?handleDeleteEnded@MpEngine@@QAEX_N@Z @ 55 NONAME ; void MpEngine::handleDeleteEnded(bool)
+	?handleDiskEvent@MpEngine@@QAEXW4MpxDiskEvents@@@Z @ 56 NONAME ; void MpEngine::handleDiskEvent(enum MpxDiskEvents)
+	?verifyUsbBlocking@MpEngine@@QAE_N_N@Z @ 57 NONAME ; bool MpEngine::verifyUsbBlocking(bool)
+	?usbSynchronizationStarted@MpEngine@@IAEXXZ @ 58 NONAME ; void MpEngine::usbSynchronizationStarted(void)
+	?handleUsbMassStorageEndEvent@MpEngine@@AAEXXZ @ 59 NONAME ; void MpEngine::handleUsbMassStorageEndEvent(void)
+	?getStaticMetaObject@MpSongScanner@@SAABUQMetaObject@@XZ @ 60 NONAME ; struct QMetaObject const & MpSongScanner::getStaticMetaObject(void)
+	?getStaticMetaObject@MpEngineFactory@@SAABUQMetaObject@@XZ @ 61 NONAME ; struct QMetaObject const & MpEngineFactory::getStaticMetaObject(void)
+	??0MpEngine@@AAE@XZ @ 62 NONAME ; MpEngine::MpEngine(void)
+	?isolatedCollectionOpened@MpEngine@@IAEXPAVMpMpxCollectionData@@@Z @ 63 NONAME ; void MpEngine::isolatedCollectionOpened(class MpMpxCollectionData *)
+	?aboutToAddSongs@MpEngine@@IAEXH@Z @ 64 NONAME ; void MpEngine::aboutToAddSongs(int)
+	??1MpEngine@@UAE@XZ @ 65 NONAME ; MpEngine::~MpEngine(void)
+	?changeUsbBlockingState@MpEngine@@AAEXW4UsbBlockingState@1@@Z @ 66 NONAME ; void MpEngine::changeUsbBlockingState(enum MpEngine::UsbBlockingState)
+	?metaObject@MpEngine@@UBEPBUQMetaObject@@XZ @ 67 NONAME ; struct QMetaObject const * MpEngine::metaObject(void) const
+	??_EMpSongScanner@@UAE@I@Z @ 68 NONAME ; MpSongScanner::~MpSongScanner(unsigned int)
+	?createIsolatedEngine@MpEngineFactory@@SAPAVMpEngine@@W4EngineMode@2@@Z @ 69 NONAME ; class MpEngine * MpEngineFactory::createIsolatedEngine(enum MpEngine::EngineMode)
+	?equalizerReady@MpEngine@@IAEXXZ @ 70 NONAME ; void MpEngine::equalizerReady(void)
+	?findAlbumSongs@MpEngine@@QAEXH@Z @ 71 NONAME ; void MpEngine::findAlbumSongs(int)
+	?setPosition@MpEngine@@QAEXH@Z @ 72 NONAME ; void MpEngine::setPosition(int)
+	?metaObject@MpEngineFactory@@UBEPBUQMetaObject@@XZ @ 73 NONAME ; struct QMetaObject const * MpEngineFactory::metaObject(void) const
+	?handleEqualizerReady@MpEngine@@QAEXXZ @ 74 NONAME ; void MpEngine::handleEqualizerReady(void)
+	?tr@MpSongScanner@@SA?AVQString@@PBD0@Z @ 75 NONAME ; class QString MpSongScanner::tr(char const *, char const *)
+	??_EMpEngineFactory@@UAE@I@Z @ 76 NONAME ; MpEngineFactory::~MpEngineFactory(unsigned int)
+	?skipForward@MpEngine@@QAEXXZ @ 77 NONAME ; void MpEngine::skipForward(void)
+	?songData@MpEngine@@QAEPAVMpSongData@@XZ @ 78 NONAME ; class MpSongData * MpEngine::songData(void)
+	?trUtf8@MpSongScanner@@SA?AVQString@@PBD0H@Z @ 79 NONAME ; class QString MpSongScanner::trUtf8(char const *, char const *, int)
+	?close@MpEngineFactory@@SAXXZ @ 80 NONAME ; void MpEngineFactory::close(void)
+	?libraryAboutToUpdate@MpEngine@@IAEXXZ @ 81 NONAME ; void MpEngine::libraryAboutToUpdate(void)
+	?reopenCollection@MpEngine@@QAEXXZ @ 82 NONAME ; void MpEngine::reopenCollection(void)
+	?trUtf8@MpEngine@@SA?AVQString@@PBD0H@Z @ 83 NONAME ; class QString MpEngine::trUtf8(char const *, char const *, int)
+	?songsDeleted@MpEngine@@IAEX_N@Z @ 84 NONAME ; void MpEngine::songsDeleted(bool)
+	?refreshLibrary@MpEngine@@QAEX_N@Z @ 85 NONAME ; void MpEngine::refreshLibrary(bool)
+	?qt_metacast@MpEngine@@UAEPAXPBD@Z @ 86 NONAME ; void * MpEngine::qt_metacast(char const *)
+	?startSeekForward@MpEngine@@QAEXXZ @ 87 NONAME ; void MpEngine::startSeekForward(void)
+	?saveToPlaylist@MpEngine@@QAEXHAAV?$QList@H@@@Z @ 88 NONAME ; void MpEngine::saveToPlaylist(int, class QList<int> &)
+	?qt_metacall@MpEngineFactory@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 89 NONAME ; int MpEngineFactory::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?qt_metacall@MpSongScanner@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 90 NONAME ; int MpSongScanner::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?tr@MpEngineFactory@@SA?AVQString@@PBD0H@Z @ 91 NONAME ; class QString MpEngineFactory::tr(char const *, char const *, int)
+	?findPlaylists@MpEngine@@QAEXAAVQStringList@@@Z @ 92 NONAME ; void MpEngine::findPlaylists(class QStringList &)
+	?isAutomaticScan@MpSongScanner@@QAE_NXZ @ 93 NONAME ; bool MpSongScanner::isAutomaticScan(void)
+	??1MpEngineFactory@@UAE@XZ @ 94 NONAME ; MpEngineFactory::~MpEngineFactory(void)
+	?staticMetaObject@MpEngineFactory@@2UQMetaObject@@B @ 95 NONAME ; struct QMetaObject const MpEngineFactory::staticMetaObject
+	?playEmbedded@MpEngine@@QAEXVQString@@@Z @ 96 NONAME ; void MpEngine::playEmbedded(class QString)
+	?shuffleAll@MpEngine@@QAEXXZ @ 97 NONAME ; void MpEngine::shuffleAll(void)
+	?metaObject@MpSongScanner@@UBEPBUQMetaObject@@XZ @ 98 NONAME ; struct QMetaObject const * MpSongScanner::metaObject(void) const
+	?renamePlaylist@MpEngine@@QAEXAAVQString@@@Z @ 99 NONAME ; void MpEngine::renamePlaylist(class QString &)
+	?setRepeat@MpEngine@@QAEX_N@Z @ 100 NONAME ; void MpEngine::setRepeat(bool)
+	?cancelCollectionRequest@MpEngine@@QAEXXZ @ 101 NONAME ; void MpEngine::cancelCollectionRequest(void)
+	?trUtf8@MpEngineFactory@@SA?AVQString@@PBD0@Z @ 102 NONAME ; class QString MpEngineFactory::trUtf8(char const *, char const *)
+	?containerContentsChanged@MpEngine@@IAEXXZ @ 103 NONAME ; void MpEngine::containerContentsChanged(void)
+	?playPause@MpEngine@@QAEXXZ @ 104 NONAME ; void MpEngine::playPause(void)
+	?playlistsRenamed@MpEngine@@IAEX_N@Z @ 105 NONAME ; void MpEngine::playlistsRenamed(bool)
+	?startSeekBackward@MpEngine@@QAEXXZ @ 106 NONAME ; void MpEngine::startSeekBackward(void)
+	?tr@MpEngineFactory@@SA?AVQString@@PBD0@Z @ 107 NONAME ; class QString MpEngineFactory::tr(char const *, char const *)
+	?playEmbedded@MpEngine@@QAEXABVXQSharableFile@@@Z @ 108 NONAME ; void MpEngine::playEmbedded(class XQSharableFile const &)
+	?handleUsbMtpStartEvent@MpEngine@@AAEXXZ @ 109 NONAME ; void MpEngine::handleUsbMtpStartEvent(void)
+	?cancelScan@MpSongScanner@@QAEXXZ @ 110 NONAME ; void MpSongScanner::cancelScan(void)
+	?trUtf8@MpSongScanner@@SA?AVQString@@PBD0@Z @ 111 NONAME ; class QString MpSongScanner::trUtf8(char const *, char const *)
+	?activePreset@MpEngine@@QAEHXZ @ 112 NONAME ; int MpEngine::activePreset(void)
+	?handleUsbEvent@MpEngine@@QAEXW4MpxUsbEvents@@@Z @ 113 NONAME ; void MpEngine::handleUsbEvent(enum MpxUsbEvents)
+	?loadActivityData@MpEngine@@QAEXABVQByteArray@@@Z @ 114 NONAME ; void MpEngine::loadActivityData(class QByteArray const &)
+	?sharedEngine@MpEngineFactory@@SAPAVMpEngine@@XZ @ 115 NONAME ; class MpEngine * MpEngineFactory::sharedEngine(void)
+	?balance@MpEngine@@QAEHXZ @ 116 NONAME ; int MpEngine::balance(void)
+	?createSharedEngine@MpEngineFactory@@SAPAVMpEngine@@VTUid@@W4EngineMode@2@@Z @ 117 NONAME ; class MpEngine * MpEngineFactory::createSharedEngine(class TUid, enum MpEngine::EngineMode)
+	?handleUsbMtpNotActive@MpEngine@@AAEXXZ @ 118 NONAME ; void MpEngine::handleUsbMtpNotActive(void)
+	?restorePathFailed@MpEngine@@IAEXXZ @ 119 NONAME ; void MpEngine::restorePathFailed(void)
+	?usbBlocked@MpEngine@@IAEX_N@Z @ 120 NONAME ; void MpEngine::usbBlocked(bool)
+	?handleScanEnded@MpSongScanner@@QAEXHH@Z @ 121 NONAME ; void MpSongScanner::handleScanEnded(int, int)
+	?staticMetaObject@MpSongScanner@@2UQMetaObject@@B @ 122 NONAME ; struct QMetaObject const MpSongScanner::staticMetaObject
+	?handleScanEnded@MpEngine@@QAEXHH@Z @ 123 NONAME ; void MpEngine::handleScanEnded(int, int)
+	??_EMpEngine@@UAE@I@Z @ 124 NONAME ; MpEngine::~MpEngine(unsigned int)
+	?skipBackward@MpEngine@@QAEXXZ @ 125 NONAME ; void MpEngine::skipBackward(void)
 	?qt_metacast@MpSongScanner@@UAEPAXPBD@Z @ 126 NONAME ; void * MpSongScanner::qt_metacast(char const *)
+	?reorderPlaylist@MpEngine@@QAEXHHHH@Z @ 127 NONAME ; void MpEngine::reorderPlaylist(int, int, int, int)
+	?scanFinished@MpSongScanner@@IAEXHH@Z @ 128 NONAME ; void MpSongScanner::scanFinished(int, int)
+	?setLoudness@MpEngine@@QAEX_N@Z @ 129 NONAME ; void MpEngine::setLoudness(bool)
 
--- a/mpengine/eabi/mpengineu.def	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/eabi/mpengineu.def	Fri Jun 25 17:21:37 2010 -0500
@@ -73,56 +73,59 @@
 	_ZN8MpEngine15handleScanEndedEii @ 72 NONAME
 	_ZN8MpEngine15reorderPlaylistEiiii @ 73 NONAME
 	_ZN8MpEngine16disableEqualizerEv @ 74 NONAME
-	_ZN8MpEngine16playlistsRenamedEb @ 75 NONAME
-	_ZN8MpEngine16reopenCollectionEv @ 76 NONAME
-	_ZN8MpEngine16startSeekForwardEv @ 77 NONAME
-	_ZN8MpEngine16staticMetaObjectE @ 78 NONAME DATA 16
-	_ZN8MpEngine17handleDeleteEndedEb @ 79 NONAME
-	_ZN8MpEngine17handleScanStartedEv @ 80 NONAME
-	_ZN8MpEngine17startSeekBackwardEv @ 81 NONAME
-	_ZN8MpEngine17verifyUsbBlockingEb @ 82 NONAME
-	_ZN8MpEngine18openCollectionItemEi @ 83 NONAME
-	_ZN8MpEngine19getStaticMetaObjectEv @ 84 NONAME
-	_ZN8MpEngine19handleDeleteStartedE18TCollectionContexti @ 85 NONAME
-	_ZN8MpEngine20checkForSystemEventsEv @ 86 NONAME
-	_ZN8MpEngine20handleEqualizerReadyEv @ 87 NONAME
-	_ZN8MpEngine20handleUsbMtpEndEventEv @ 88 NONAME
-	_ZN8MpEngine20libraryAboutToUpdateEv @ 89 NONAME
-	_ZN8MpEngine20libraryRefreshNeededEv @ 90 NONAME
-	_ZN8MpEngine21handleUsbMtpNotActiveEv @ 91 NONAME
-	_ZN8MpEngine21saveToCurrentPlaylistER5QListIiEP19MpMpxCollectionData @ 92 NONAME
-	_ZN8MpEngine21unableToCotinueDueUSBEv @ 93 NONAME
-	_ZN8MpEngine22changeUsbBlockingStateENS_16UsbBlockingStateE @ 94 NONAME
-	_ZN8MpEngine22handleUsbMtpStartEventEv @ 95 NONAME
-	_ZN8MpEngine22openIsolatedCollectionE18TCollectionContext @ 96 NONAME
-	_ZN8MpEngine23cancelCollectionRequestEv @ 97 NONAME
-	_ZN8MpEngine24collectionPlaylistOpenedEv @ 98 NONAME
-	_ZN8MpEngine24containerContentsChangedEv @ 99 NONAME
-	_ZN8MpEngine24isolatedCollectionOpenedEP19MpMpxCollectionData @ 100 NONAME
-	_ZN8MpEngine25releaseIsolatedCollectionEv @ 101 NONAME
-	_ZN8MpEngine25usbSynchronizationStartedEv @ 102 NONAME
-	_ZN8MpEngine26usbSynchronizationFinishedEv @ 103 NONAME
-	_ZN8MpEngine28handleUsbMassStorageEndEventEv @ 104 NONAME
-	_ZN8MpEngine30handleUsbMassStorageStartEventEv @ 105 NONAME
-	_ZN8MpEngine4backEv @ 106 NONAME
-	_ZN8MpEngine4stopEv @ 107 NONAME
-	_ZN8MpEngine7balanceEv @ 108 NONAME
-	_ZN8MpEngine8loudnessEv @ 109 NONAME
-	_ZN8MpEngine8songDataEv @ 110 NONAME
-	_ZN8MpEngine9playPauseEv @ 111 NONAME
-	_ZN8MpEngine9setRepeatEb @ 112 NONAME
-	_ZN8MpEngineC1Ev @ 113 NONAME
-	_ZN8MpEngineC2Ev @ 114 NONAME
-	_ZN8MpEngineD0Ev @ 115 NONAME
-	_ZN8MpEngineD1Ev @ 116 NONAME
-	_ZN8MpEngineD2Ev @ 117 NONAME
-	_ZNK13MpSongScanner10metaObjectEv @ 118 NONAME
-	_ZNK15MpEngineFactory10metaObjectEv @ 119 NONAME
-	_ZNK8MpEngine10metaObjectEv @ 120 NONAME
-	_ZTI13MpSongScanner @ 121 NONAME
-	_ZTI15MpEngineFactory @ 122 NONAME
-	_ZTI8MpEngine @ 123 NONAME
-	_ZTV13MpSongScanner @ 124 NONAME
-	_ZTV15MpEngineFactory @ 125 NONAME
-	_ZTV8MpEngine @ 126 NONAME
+	_ZN8MpEngine16loadActivityDataERK10QByteArray @ 75 NONAME
+	_ZN8MpEngine16playlistsRenamedEb @ 76 NONAME
+	_ZN8MpEngine16reopenCollectionEv @ 77 NONAME
+	_ZN8MpEngine16saveActivityDataER10QByteArray @ 78 NONAME
+	_ZN8MpEngine16startSeekForwardEv @ 79 NONAME
+	_ZN8MpEngine16staticMetaObjectE @ 80 NONAME DATA 16
+	_ZN8MpEngine17handleDeleteEndedEb @ 81 NONAME
+	_ZN8MpEngine17handleScanStartedEv @ 82 NONAME
+	_ZN8MpEngine17restorePathFailedEv @ 83 NONAME
+	_ZN8MpEngine17startSeekBackwardEv @ 84 NONAME
+	_ZN8MpEngine17verifyUsbBlockingEb @ 85 NONAME
+	_ZN8MpEngine18openCollectionItemEi @ 86 NONAME
+	_ZN8MpEngine19getStaticMetaObjectEv @ 87 NONAME
+	_ZN8MpEngine19handleDeleteStartedE18TCollectionContexti @ 88 NONAME
+	_ZN8MpEngine20checkForSystemEventsEv @ 89 NONAME
+	_ZN8MpEngine20handleEqualizerReadyEv @ 90 NONAME
+	_ZN8MpEngine20handleUsbMtpEndEventEv @ 91 NONAME
+	_ZN8MpEngine20libraryAboutToUpdateEv @ 92 NONAME
+	_ZN8MpEngine20libraryRefreshNeededEv @ 93 NONAME
+	_ZN8MpEngine21handleUsbMtpNotActiveEv @ 94 NONAME
+	_ZN8MpEngine21saveToCurrentPlaylistER5QListIiEP19MpMpxCollectionData @ 95 NONAME
+	_ZN8MpEngine21unableToCotinueDueUSBEv @ 96 NONAME
+	_ZN8MpEngine22changeUsbBlockingStateENS_16UsbBlockingStateE @ 97 NONAME
+	_ZN8MpEngine22handleUsbMtpStartEventEv @ 98 NONAME
+	_ZN8MpEngine22openIsolatedCollectionE18TCollectionContext @ 99 NONAME
+	_ZN8MpEngine23cancelCollectionRequestEv @ 100 NONAME
+	_ZN8MpEngine24collectionPlaylistOpenedEv @ 101 NONAME
+	_ZN8MpEngine24containerContentsChangedEv @ 102 NONAME
+	_ZN8MpEngine24isolatedCollectionOpenedEP19MpMpxCollectionData @ 103 NONAME
+	_ZN8MpEngine25releaseIsolatedCollectionEv @ 104 NONAME
+	_ZN8MpEngine25usbSynchronizationStartedEv @ 105 NONAME
+	_ZN8MpEngine26usbSynchronizationFinishedEv @ 106 NONAME
+	_ZN8MpEngine28handleUsbMassStorageEndEventEv @ 107 NONAME
+	_ZN8MpEngine30handleUsbMassStorageStartEventEv @ 108 NONAME
+	_ZN8MpEngine4backEv @ 109 NONAME
+	_ZN8MpEngine4stopEv @ 110 NONAME
+	_ZN8MpEngine7balanceEv @ 111 NONAME
+	_ZN8MpEngine8loudnessEv @ 112 NONAME
+	_ZN8MpEngine8songDataEv @ 113 NONAME
+	_ZN8MpEngine9playPauseEv @ 114 NONAME
+	_ZN8MpEngine9setRepeatEb @ 115 NONAME
+	_ZN8MpEngineC1Ev @ 116 NONAME
+	_ZN8MpEngineC2Ev @ 117 NONAME
+	_ZN8MpEngineD0Ev @ 118 NONAME
+	_ZN8MpEngineD1Ev @ 119 NONAME
+	_ZN8MpEngineD2Ev @ 120 NONAME
+	_ZNK13MpSongScanner10metaObjectEv @ 121 NONAME
+	_ZNK15MpEngineFactory10metaObjectEv @ 122 NONAME
+	_ZNK8MpEngine10metaObjectEv @ 123 NONAME
+	_ZTI13MpSongScanner @ 124 NONAME
+	_ZTI15MpEngineFactory @ 125 NONAME
+	_ZTI8MpEngine @ 126 NONAME
+	_ZTV13MpSongScanner @ 127 NONAME
+	_ZTV15MpEngineFactory @ 128 NONAME
+	_ZTV8MpEngine @ 129 NONAME
 
--- a/mpengine/inc/mpmpxcollectionframeworkwrapper.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/inc/mpmpxcollectionframeworkwrapper.h	Fri Jun 25 17:21:37 2010 -0500
@@ -68,6 +68,9 @@
    
     void openShuffleAllSongsPath();
     
+    void savePath( QByteArray &data );
+    void restorePath( const QByteArray &data ); 
+    
 signals:
 
     void collectionPlaylistOpened();
@@ -80,6 +83,7 @@
     void isolatedCollectionOpened( MpMpxCollectionData* collectionData );
     
     void containerContentsChanged();
+    void restorePathFailed();
 
 private:
 
--- a/mpengine/inc/mpmpxcollectionframeworkwrapper_p.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/inc/mpmpxcollectionframeworkwrapper_p.h	Fri Jun 25 17:21:37 2010 -0500
@@ -85,6 +85,9 @@
     
     MpMpxCollectionData *collectionData();
     void openShuffleAllSongsPath();
+    
+    void savePath( QByteArray &data );
+    void restorePath( const QByteArray &data );
 
 private:
 
@@ -96,6 +99,7 @@
     void HandleCollectionMediaL( const CMPXMedia& aMedia, TInt aError );
     void HandleOperationCompleteL( TCHelperOperation aOperation, TInt aErr, void* aArgument );
     void HandleIsolatedOpenL( const CMPXMedia& aEntries, TInt aError );
+    void HandleIsolatedOpenRestorePathL( const CMPXCollectionPath& aPath, TInt aError );
     void HandleFindAllL( const CMPXMedia& aResults, TBool aComplete, TInt aError );
 
     void DoInitL();
@@ -129,6 +133,8 @@
     void PreparePlaylistMediaL( CMPXMedia& aMedia, QList<int> &selection, MpMpxCollectionData *collectionData );
     void createPlaybackUtilityL();
     void DoPlayAllSongsPlaylistL();
+    void DoSavePathL( QByteArray &data );
+    void DoRestorePathL( const QByteArray &data );
 
 private:
 
@@ -149,6 +155,9 @@
     TBool                             iShuffleFeature;
     TBool                             iReopen;
     TBool                             iShuffleAll;
+    TBool                             iRestoreDefaultPath;
+    TInt                              iRestorePathIndex;
+    TMPXItemId                        iRestorePathIndexId;
 
 };
 
--- a/mpengine/inc/mpmpxisolatedcollectionhelper.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/inc/mpmpxisolatedcollectionhelper.h	Fri Jun 25 17:21:37 2010 -0500
@@ -23,6 +23,7 @@
 class CMPXCollectionOpenUtility;
 class CMPXCollectionPath;
 
+const TInt KIncrementalNullOffset = 0;
 /*!
     \class MpMpxIsolatedCollectionHelperObserver
     \brief Observer interface for class CMpMpxIsolatedCollectionHelper
@@ -35,17 +36,23 @@
 
     virtual void HandleIsolatedOpenL( const CMPXMedia& aEntries, 
             TInt aError ) = 0;
+    
+    virtual void HandleIsolatedOpenRestorePathL( const CMPXCollectionPath& aPath,
+            TInt aError ) = 0;
 };
 
 class CMpMpxIsolatedCollectionHelper : public CBase,
                                       public MMPXCollectionObserver
 {
 public:
-
+    enum MpOpenMode{
+        DefaultMode = 0,
+        RestorePathMode 
+    };
     static CMpMpxIsolatedCollectionHelper* NewL( MMpMpxIsolatedCollectionHelperObserver* aObserver );
     static CMpMpxIsolatedCollectionHelper* NewLC( MMpMpxIsolatedCollectionHelperObserver* aObserver );
     virtual ~CMpMpxIsolatedCollectionHelper();
-    void OpenCollectionL( CMPXCollectionPath& aPath );
+    void OpenCollectionL( CMPXCollectionPath& aPath, TInt aIndex = KIncrementalNullOffset, MpOpenMode aMode = DefaultMode );
     
 private:
     CMpMpxIsolatedCollectionHelper( MMpMpxIsolatedCollectionHelperObserver* aObserver );
@@ -60,6 +67,7 @@
     MMpMpxIsolatedCollectionHelperObserver* iObserver;
     CMPXCollectionOpenUtility*              iIncrementalOpenUtil; //owned
     TBool                                   iFirstIncrementalOpen;
+    MpOpenMode                              iOpenMode;
 
 };
 
--- a/mpengine/src/mpengine.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/src/mpengine.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -168,6 +168,14 @@
  */
 
 /*!
+    \fn void restorePathFailed()
+
+    This signal is emitted when an the previous path cannot be restored 
+    (i.e. no music in collection).
+
+ */
+
+/*!
     \fn void containerContentsChanged()
 
     This signal is emitted when items are removed or inserted on the current 
@@ -266,6 +274,9 @@
         connect( mMpxCollectionWrapper, SIGNAL( songsDeleted( bool ) ),
                 this, SLOT( handleDeleteEnded( bool ) ),
                 Qt::QueuedConnection );
+        connect( mMpxCollectionWrapper, SIGNAL( restorePathFailed() ),
+                this, SIGNAL( restorePathFailed() ),
+                Qt::QueuedConnection );
     }
 
     if( mode == StandAlone ){
@@ -970,6 +981,22 @@
 }
 
 /*!
+ Save data needed to later restore state (activity)
+ */
+void MpEngine::saveActivityData( QByteArray &data )
+{
+    mMpxCollectionWrapper->savePath( data );
+}
+
+/*!
+ Restore state from activity data 
+ */
+void MpEngine::loadActivityData( const QByteArray &data ) 
+{
+    mMpxCollectionWrapper->restorePath( data );
+}
+
+/*!
  Slot to handle equalizer ready signal from equalizer wrapper.
  */
 void MpEngine::handleEqualizerReady()
--- a/mpengine/src/mpmediakeyhandler_p.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/src/mpmediakeyhandler_p.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -405,13 +405,63 @@
         TMPXPlaybackState playerState( iPlaybackUtility->StateL() );
 
         switch ( aCommandId ) {
+        case EPbCmdPlayPause:
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused 
+                 || playerState == EPbStateStopped ) {
+                iPlaybackUtility->CommandL( EPbCmdPlayPause );
+            }
+            break;
+        case EPbCmdPlay:
+            if ( playerState == EPbStateStopped || playerState == EPbStatePaused ) {
+                iPlaybackUtility->CommandL( EPbCmdPlay );
+            }
+            break;
+        case EPbCmdStop:
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused ) {
+                iPlaybackUtility->CommandL( EPbCmdStop );
+            }
+            break;
+        case EPbCmdPause:
+            if ( playerState == EPbStatePlaying ) {
+                iPlaybackUtility->CommandL( EPbCmdPause );
+            }
+            break;
+        case EPbCmdStartSeekBackward:
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused ) {
+                iPlaybackUtility->CommandL( EPbCmdStartSeekBackward );
+            }
+            break;
+        case EPbCmdStartSeekForward:
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused ) {
+                iPlaybackUtility->CommandL( EPbCmdStartSeekForward );
+            }
+            break;
+        case EPbCmdStopSeeking:
+            if ( playerState == EPbStateSeekingBackward || playerState == EPbStateSeekingForward ) {
+                iPlaybackUtility->CommandL( EPbCmdStopSeeking );
+            }
+            break;
+        case EPbCmdPrevious:
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused 
+                 || playerState == EPbStateStopped ) {
+                iPlaybackUtility->CommandL( EPbCmdPrevious );
+            }
+            break;
+        case EPbCmdNext:
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused 
+                 || playerState == EPbStateStopped ) {
+                iPlaybackUtility->CommandL( EPbCmdNext );
+            }
+            break;
         case EPbCmdIncreaseVolume:
-            if ( EPbStatePlaying == playerState ) {
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused 
+                 || playerState == EPbStateStopped ) {
                 iPlaybackUtility->CommandL( EPbCmdIncreaseVolume );
             }
             break;
         case EPbCmdDecreaseVolume:
-            if ( EPbStatePlaying == playerState ) {
+            if ( playerState == EPbStatePlaying || playerState == EPbStatePaused 
+                 || playerState == EPbStateStopped ) {
                 iPlaybackUtility->CommandL( EPbCmdDecreaseVolume );
             }
             break;
@@ -419,7 +469,6 @@
             break;
         }
     }
-
 }
 
 // ---------------------------------------------------------------------------
@@ -431,7 +480,6 @@
 
     static_cast<MpMediaKeyHandlerPrivate*>( aPtr )->HandleRepeatEvent();
 
-
     return KErrNone;
 }
 
--- a/mpengine/src/mpmediakeyremconresponse.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/src/mpmediakeyremconresponse.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -70,6 +70,54 @@
         {
         switch ( aOperationId )
             {
+            case ERemConCoreApiPausePlayFunction:
+                {
+                iRemConCoreApiTarget.PausePlayFunctionResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiPlay:
+                {
+                iRemConCoreApiTarget.PlayResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiStop:
+                {
+                iRemConCoreApiTarget.StopResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiPause:
+                {
+                iRemConCoreApiTarget.PauseResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiRewind:
+                {
+                iRemConCoreApiTarget.RewindResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiFastForward:
+                {
+                iRemConCoreApiTarget.FastForwardResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiBackward:
+                {
+                iRemConCoreApiTarget.BackwardResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
+            case ERemConCoreApiForward:
+                {
+                iRemConCoreApiTarget.ForwardResponse( iStatus, KErrNone );
+                SetActive();
+                break;
+                }
             case ERemConCoreApiVolumeUp:
                 {
                 iRemConCoreApiTarget.VolumeUpResponse( iStatus, KErrNone );
--- a/mpengine/src/mpmpxcollectionframeworkwrapper.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/src/mpmpxcollectionframeworkwrapper.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -294,6 +294,22 @@
 {
     d_ptr->openShuffleAllSongsPath();
 }
+
+/*!
+ Called to save playback data used for publishing activity (i.e. restore path) 
+ */
+void  MpMpxCollectionFrameworkWrapper::savePath( QByteArray &data )
+{
+    d_ptr->savePath( data );
+}
+
+/*!
+ Called to load playback data used from returning activity (i.e. restore path) 
+ */
+void MpMpxCollectionFrameworkWrapper::restorePath( const QByteArray &data ) 
+{
+    return d_ptr->restorePath( data );
+}
 /*!
  Cancels CollectionUiHelper request.
  */
--- 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
--- a/mpengine/src/mpmpxisolatedcollectionhelper.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpengine/src/mpmpxisolatedcollectionhelper.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -28,7 +28,7 @@
 const TInt KIncrementalDelayNone = 0;
 const TInt KIncrementalDelayHalfSecond = 1000000;
 const TInt KIncrementalFetchBlockSize = 20;
-const TInt KIncrementalNullOffset = 0;
+
 
 
 /*!
@@ -78,10 +78,10 @@
  \internal
  Opens an isolated collection with the /a path.
  */
-void CMpMpxIsolatedCollectionHelper::OpenCollectionL( CMPXCollectionPath& aPath )
+void CMpMpxIsolatedCollectionHelper::OpenCollectionL( CMPXCollectionPath& aPath, TInt aIndex, MpOpenMode aMode )
     {
     //Using incremental open to open the collection.
-    
+    iOpenMode = aMode;
     // Cancel any reads
     iIncrementalOpenUtil->Stop();
 
@@ -92,7 +92,7 @@
     TArray<TMPXAttribute> ary = attrs.Array();
     iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
     iIncrementalOpenUtil->StartL( aPath, ary, KIncrementalFetchBlockSize,
-                                  KIncrementalNullOffset, CMPXCollectionOpenUtility::EFetchNormal );
+                                  aIndex, CMPXCollectionOpenUtility::EFetchNormal );
     iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
     CleanupStack::PopAndDestroy( &attrs );
     }
@@ -131,8 +131,22 @@
     {
     if ( iFirstIncrementalOpen )
         {
-        iObserver->HandleIsolatedOpenL( aEntries, aError );
+        CMPXCollectionPath* cPath = NULL;
         iFirstIncrementalOpen = EFalse;
+        switch( iOpenMode ) {
+        case RestorePathMode:
+            cPath = iIncrementalOpenUtil->PathL();
+            CleanupStack::PushL( cPath );
+            iObserver->HandleIsolatedOpenRestorePathL( *cPath, aError );
+            CleanupStack::PopAndDestroy( cPath );
+
+            break;
+        case DefaultMode:
+        default:
+            iObserver->HandleIsolatedOpenL( aEntries, aError );
+            break;
+        }
+        
         }
     }
 
--- a/mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -867,30 +867,27 @@
     {
     MPX_FUNC("CMPXDbManager::CloseAllDatabases");
 
-    if (iInitialized)
-        {
-        // Close all prepared statements if a db is closed
-        //
-        ResetPreparedQueries();
+    // Close all prepared statements if a db is closed
+    //
+    ResetPreparedQueries();
 
-        TInt count(iDatabaseHandles.Count());
-        for (TInt i = 0; i < count; ++i)
-            {
-            delete iDatabaseHandles[i].iAliasname;
-            iDatabaseHandles[i].iAliasname = 0;
+    TInt count(iDatabaseHandles.Count());
+    for (TInt i = 0; i < count; ++i)
+        {
+        delete iDatabaseHandles[i].iAliasname;
+        iDatabaseHandles[i].iAliasname = 0;
 #ifdef __RAMDISK_PERF_ENABLE 
-            RemoveDummyFile(i);            	
-            delete iDatabaseHandles[i].iOrigFullFilePath;
-			iDatabaseHandles[i].iOrigFullFilePath = 0;
-            delete iDatabaseHandles[i].iTargetFullFilePath;
-			iDatabaseHandles[i].iTargetFullFilePath = 0;
+        RemoveDummyFile(i);            	
+        delete iDatabaseHandles[i].iOrigFullFilePath;
+        iDatabaseHandles[i].iOrigFullFilePath = 0;
+        delete iDatabaseHandles[i].iTargetFullFilePath;
+        iDatabaseHandles[i].iTargetFullFilePath = 0;
 #endif //__RAMDISK_PERF_ENABLE 
-            }
+        }
 
-        iDatabaseHandles.Reset();
-        iDatabase.Close();
-        iInitialized = EFalse;
-        }
+    iDatabaseHandles.Reset();
+    iDatabase.Close();
+    iInitialized = EFalse;
     }
 
 // ----------------------------------------------------------------------------
@@ -1732,6 +1729,16 @@
     }
 
 // ----------------------------------------------------------------------------
+// CleanupTransaction: close transaction when creating DB
+// ----------------------------------------------------------------------------
+//
+static void CleanupTransaction(TAny * aDatabase)
+    {
+    TInt err = ((RSqlDatabase*)aDatabase)->Exec(KRollbackTransaction);
+    MPX_DEBUG2("CMPXDbManager CleanupTransaction rollback, error %d", err);
+    }
+    
+// ----------------------------------------------------------------------------
 // CMPXDbManager::CreateTablesL
 // ----------------------------------------------------------------------------
 //
@@ -1739,11 +1746,26 @@
 	RSqlDatabase& aDatabase,
 	TBool aCorrupt)
 	{
+	MPX_FUNC("CMPXDbManager::CreateTablesL");
+    TInt err = aDatabase.Exec(KBeginTransaction);
+    if (err < 0)
+       {
+       MPX_DEBUG2("SQL BEGIN TRANSACTION error %d", err);
+       User::Leave (err);
+       }
+    CleanupStack::PushL(TCleanupItem(&CleanupTransaction, &aDatabase));
     TInt count(iTables.Count());
     for (TInt i = 0; i < count; ++i)
         {
         iTables[i]->CreateTableL(aDatabase, aCorrupt);
         }
+    err = aDatabase.Exec(KCommitTransaction);
+    if (err < 0)
+        {
+        MPX_DEBUG2("SQL COMMIT TRANSACTION error %d", err);
+        User::Leave (err);
+        }
+    CleanupStack::Pop();
 	}
 
 // ----------------------------------------------------------------------------
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h	Fri Jun 25 17:21:37 2010 -0500
@@ -28,9 +28,11 @@
 
 // Db filename
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
-_LIT(KMCDbFile, "mpxv2_6.db");
+_LIT(KMCDbFile, "mpxv3_0.db");
+_LIT(KMCDbFileEMMC, "mpxv3_0i.db");
 #else 
-_LIT(KMCDbFile, "mpxv2_5.db");
+_LIT(KMCDbFile, "mpxv3_0n.db");
+_LIT(KMCDbFileEMMC, "mpxv3_0in.db");
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
 // Collection Db resource file
 _LIT(KMPXCollectionDbResourceFile,  "mpxcollectiondbhgres.rsc");
@@ -133,6 +135,8 @@
 _LIT(KMCPlaylistSongInfoVolumeId,   "VolumeId");
 _LIT(KMCPlaylistSongInfoDbFlag,     "DbFlag");
 
+// == Album TABLE FIELDS ==============================================
+_LIT(KMCAlbumArtistName, "ArtistName");
 // == Auxiliary TABLE FIELDS ==================================================
 // Version of database
 // The version integer looks like:
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h	Fri Jun 25 17:21:37 2010 -0500
@@ -156,6 +156,25 @@
         */
         void GetAllItemsWithNoSongL(RArray<TUint32>& aItemsIds);
 
+        /**
+        * Create Thumbnail Manager session.
+        * Create Thumbnail Manager session when needed: rename/delete entries in Thumbnail table.
+        */
+        void CreateTNMSessionL();
+        
+        /**
+        * Remove all abstractalbum items with no songs associated,
+        * TN entry and .alb files also removed.
+        *
+        */
+        void RemoveAbstractAlbumsWithNoSongL();
+        
+        /**
+        /* When refresh library, Remove .alb entry from AbstractAlnum table, TN table if .alb files already deleted 
+        /* from file system via file manager.
+        */
+        void AbstractAlbumCleanUpL();
+       
     private:
 
 
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h	Fri Jun 25 17:21:37 2010 -0500
@@ -30,7 +30,7 @@
     {
     public:
         virtual TInt HandleIsUnknownArtistL(TUint32 aId) = 0;
-        virtual TUint32 HandleArtistForAlbumL( const TUint32 aId ) = 0;
+        virtual HBufC* HandleArtistForAlbumL( const TUint32 aId ) = 0;
         /**
         * HandleAlbumartForAlbumL.
         * @param aId, The album ID.
@@ -86,7 +86,7 @@
         *        into consideration when generating the unique row id
         * @return The unique id of the row added.
         */
-        TUint32 AddItemL(const TDesC& aName, TUint32 aArtist, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord,
+        TUint32 AddItemL(const TDesC& aName, const TDesC& aArtistName, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord,
             TBool aCaseSensitive = ETrue);
 
         /**
@@ -171,7 +171,12 @@
 
         TBool IsUnknownArtistL(TUint32 aId);
 
-        TUint32 ArtistForAlbumL(const TUint32 aId);
+        /**
+        * Get the ArtistName of song which belongs to the specified Album.
+        * @param aId The ID of the album
+        * @returns alternative artistname retrieved in the specified Album.
+        */
+        HBufC* ArtistForAlbumL(const TUint32 aId);
         /**
         * Get the Albumart of song which belongs to the specified Album.
         * @param aId The ID of the album
@@ -214,11 +219,10 @@
         enum TAlbumColumns
             {
             EAlbumUniqueId = KMPXTableDefaultIndex,
+            EAlbumArtistName,
             EAlbumName,
-            EAlbumSongCount,
-            EAlbumArtist,
+            EAlbumSongCount,      
             EAlbumArt,
-            EAlbumArtistName,
             EAlbumFieldCount
             };
 
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h	Fri Jun 25 17:21:37 2010 -0500
@@ -913,21 +913,7 @@
         void DoRemoveSongFromPlaylistL(TUint32 aPlaylistId, const TMPXItemId& aSongId,
             TInt aOrdinal, CMPXMessageArray& aItemChangedMessages);
 
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED  
-        /**
-        * Remove all abstractalbum items with no songs associated,
-        * TN and .alb files also removed.
-        *
-        */
-        void RemoveAbstractAlbumsWithNoSongL();
-        
-          /**
-        /* When refresh library, Remove .alb entry from AbstractAlnum table, TN table if .alb files deleted 
-        /* from file manager 
-        */
-        void AbstractAlbumCleanUpL();
-       
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
 
         /**
         * Deletes all song records marked as deleted.
@@ -1052,7 +1038,7 @@
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
 
        virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName,
-            TUint32 aArtist, const TDesC& aArt,
+           const TDesC& aArtistName, const TDesC& aArt,
             TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist);
 
        virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
@@ -1091,7 +1077,12 @@
     * @see MMPXDbAlbumObserver
     */
     virtual TBool HandleIsUnknownArtistL(TUint32 aArtistId);
-    virtual TUint32 HandleArtistForAlbumL(const TUint32 aAlbumId);
+    /**
+    * Get the Artistname of song which belongs to the specified Album.     
+    * @param aId, The Album ID.
+	* @returns alternative artistname retrieved in the specified Album.
+    */
+    virtual HBufC* HandleArtistForAlbumL(const TUint32 aAlbumId);
         
     /**
     * Get the Albumart of song which belongs to the specified Album.     
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h	Fri Jun 25 17:21:37 2010 -0500
@@ -80,7 +80,7 @@
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
        // for Album and Artist table
         virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName,
-            TUint32 aArtistId, const TDesC& aArt,
+            const TDesC& aArtistName, const TDesC& aArt,
             TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist) = 0;
         /**
         * Called when the ID of a category item changed for a Music record, for example when
@@ -528,7 +528,7 @@
          * Get the ID of Artist which belongs to the specified Album
          * @param aId, the ID of Album
          */
-        TUint32 CMPXDbMusic::ArtistForAlbumL(const TUint32 aId);
+        TUint32 ArtistForAlbumL(const TUint32 aId);
             
         /**
         * Get the Albumart of song which belongs to the specified Album
@@ -688,9 +688,6 @@
             const TMPXAttribute& aAttribute, TUint32 aOldId, TInt aDriveId,
             CMPXMessageArray* aItemChangedMessages, TUint32& aItemId);
 
-        TBool UpdateCategoryFieldL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia,
-          const TMPXAttribute& aAttribute, TUint32 aOldId, TInt aDriveId,
-          CMPXMessageArray* aItemChangedMessages, TUint32& aItemId, TUint32 aArtistId);
         /**
         * Checks if extra attributes are required. The "standard attribute set includes:
         * EMPXMediaGeneralId, EMPXMediaGeneralType, EMPXMediaGeneralCategory,
@@ -707,6 +704,12 @@
         *  otherwise EFalse.
         */
         TBool IsSupported(const CMPXMedia& aMedia);
+        
+        /**
+         * Query all songs from the database and add results to the 
+         * iAllSongsQueryResult cache array.
+         */
+        void ExecuteQueryAllSongsL(const TArray<TMPXAttribute>& aAttrs);
 
     private:    // from MMPXTable
 
@@ -809,6 +812,7 @@
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED 
         TBool iArtNeedUpdated;
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
+        RPointerArray<CMPXMedia> iAllSongsQueryResult;
     };
 
 #endif // MPXDBMUSIC_H
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h	Fri Jun 25 17:21:37 2010 -0500
@@ -270,9 +270,9 @@
 _LIT(KAuxiliaryDropTable,"DROP TABLE Auxiliary");
 _LIT(KAuxiliaryCheckTable, "SELECT Id,Version,TimeRefreshed,TimeSynced,Corrupt,SaveDeletedRecordCount FROM AUXILIARY");
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
-_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.5.0',%u)");
+_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.6.0',%u)");
 #else
-_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.4.0',%u)");
+_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.6.1',%u)");
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
 _LIT(KQueryAuxiliarySetTime, "UPDATE :dbname.Auxiliary SET TimeRefreshed='%S', Corrupt=0");
 _LIT(KQueryAuxiliaryGetTime, "SELECT TimeRefreshed FROM :dbname.Auxiliary");
@@ -427,19 +427,22 @@
 //
 _LIT(KAlbumCreateTable,"CREATE TABLE Album("
     L"UniqueId INTEGER PRIMARY KEY,"
+    L"ArtistName TEXT COLLATE NOCASE,"
     L"Name TEXT COLLATE NOCASE,"
     L"SongCount INTEGER,"
-    L"Artist INTEGER,"
-    L"Art TEXT)");
+	L"Art TEXT)");
 
-_LIT(KAlbumCheckTable,"SELECT UniqueId,Name,SongCount,Artist,Art FROM Album");
+_LIT(KAlbumCheckTable,"SELECT UniqueId,ArtistName,Name,SongCount,Art FROM Album");
 
-_LIT(KQueryAlbumInsert, "INSERT INTO :dbname.Album(UniqueId,Name,SongCount,Artist,Art) VALUES(%u,'%S',%u,%u,'%S')");
+_LIT(KQueryAlbumInsert, "INSERT INTO :dbname.Album(UniqueId,ArtistName,Name,SongCount,Art) VALUES(%u,'%S','%S',%u,'%S')");
 _LIT(KQueryAlbumUpdate, "UPDATE :dbname.Album SET %S WHERE UniqueId=%u");
 
 _LIT(KQueryAlbumItem, "SELECT Album.*,Artist.Name FROM :dbname.Album,:dbname.Artist WHERE Album.Artist=Artist.UniqueId AND UniqueId=%u");
-_LIT(KQueryAlbumAll, "SELECT Album.*,Artist.Name FROM :dbname.Album,:dbname.Artist WHERE Album.Artist=Artist.UniqueId ORDER BY 2");
-_LIT(KQueryAlbumAllMediaWall, "SELECT Album.*,Artist.Name FROM :dbname.Album,:dbname.Artist WHERE Album.Artist=Artist.UniqueId ORDER BY 6");
+_LIT(KQueryAlbumAll, "SELECT Album.* FROM :dbname.Album ORDER BY Name");
+_LIT(KQueryAlbumAllMediaWall, "SELECT Album.* FROM :dbname.Album ORDER BY ArtistName");
+_LIT(KCriterionArtistName, "ArtistName='%S'");
+_LIT(KCriterionArt, "Art='%S'");
+
 // == Artist table queries ==========================================
 //
 _LIT(KArtistCreateTable,"CREATE TABLE Artist("
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -80,7 +80,26 @@
 void CMPXCollectionDbManager::ConstructL()
     {
     MPX_FUNC("CMPXCollectionDbManager::ConstructL");
-    CMPXDbManager::ConstructL(TFileName(KMCDbFile));
+    //Find out if the system has an internal drive (eMMC)
+    TBool eMMC( EFalse );
+    TDriveInfo driveInfo;  
+    if( Fs().Drive( driveInfo, EDriveE ) == KErrNone )
+    	{
+        if ( driveInfo.iDriveAtt & KDriveAttInternal )
+        	eMMC = ETrue;
+    	}
+    
+    //Use different name for Dbs if the system has an internal drive vs. MMC-only.	
+    //Since hard-coded drive letters in the Thumbnail URIs
+    //So Dbs are not interchangeable between an internal drive system and MMC-only system.
+    if ( eMMC )	
+        {
+        CMPXDbManager::ConstructL(TFileName( KMCDbFileEMMC ));
+        }
+    else
+        {
+        CMPXDbManager::ConstructL(TFileName( KMCDbFile ));
+    	}
     }
 
 // End of File
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -78,7 +78,8 @@
     {
     MPX_FUNC("CMPXDbAbstractAlbum::~CMPXDbAbstractAlbum");
 #ifdef RD_MPX_TNM_INTEGRATION
-    delete iTNManager;
+    if (iTNManager)
+        delete iTNManager;
 #endif //RD_MPX_TNM_INTEGRATION
     }
 
@@ -222,6 +223,81 @@
     }
 
 // ----------------------------------------------------------------------------
+// Remove abstractalbums which have no songs associated.
+// ----------------------------------------------------------------------------
+//
+void CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL()
+    {
+    MPX_FUNC("CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL");
+    
+    RArray<TUint32> iItemsIds;
+    CleanupClosePushL(iItemsIds);
+    
+    //get all abstractalbum with no songs associated.
+    GetAllItemsWithNoSongL(iItemsIds);
+    TInt count = iItemsIds.Count();
+    TInt err = KErrNone;
+    if (count)
+        {           	
+        MPX_DEBUG2("CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL, abstractalbum count[%d] ", iItemsIds.Count());
+        CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL();
+        CleanupStack::PushL(itemChangedMessages);
+
+        //go through each one to delete
+        for (TInt i=0; i< count; i++)
+            {
+            TRAP(err, RemoveAbstractAlbumL(iItemsIds[i], *itemChangedMessages, EFalse));
+            if (err != KErrNone)
+                {
+                MPX_DEBUG2("CMPXDbAbstractAlbum::RemoveAbstractAlbumsWithNoSongL, error happens when delete abstractalbum, err ", err);
+                }
+            }
+       CleanupStack::PopAndDestroy(itemChangedMessages);
+       }
+    CleanupStack::PopAndDestroy(&iItemsIds);
+  }
+
+// ----------------------------------------------------------------------------
+// Remove .alb entry from AbstractAlnum table, TN table if .alb files deleted 
+// from file manager when refresh library
+// ----------------------------------------------------------------------------
+//
+void CMPXDbAbstractAlbum::AbstractAlbumCleanUpL()
+    {
+    MPX_FUNC("CMPXDbAbstractAlbum::AbstractAlbumCleanUpL");
+    RArray<TMPXAttribute> attributes;
+    CleanupClosePushL(attributes);
+    attributes.AppendL(KMPXMediaGeneralUri);
+    CMPXMediaArray* mediaArray = CMPXMediaArray::NewL();
+    CleanupStack::PushL(mediaArray);
+    
+    GetAllCategoryItemsL(attributes.Array(), *mediaArray);
+
+    TInt count(mediaArray->Count());
+    if (count)
+        {      
+        CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL();
+        CleanupStack::PushL(itemChangedMessages);
+        for (TInt i = 0; i < count; i++)
+            {
+            CMPXMedia* element = mediaArray->AtL(i);
+            const TDesC& uri = element->ValueText(KMPXMediaGeneralUri);                                 
+
+            //check if the file exists in file system
+            if (!(BaflUtils::FileExists(iFs, uri)))
+                {
+                //generate abstractalbum UID with the Uri
+                TUint32 abstractAlbumId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, uri, EFalse));
+                RemoveAbstractAlbumL(abstractAlbumId, *itemChangedMessages, ETrue);             
+                }
+            }
+            CleanupStack::PopAndDestroy(itemChangedMessages);
+        }
+        CleanupStack::PopAndDestroy(mediaArray);       
+        CleanupStack::PopAndDestroy(&attributes);     
+    }
+
+// ----------------------------------------------------------------------------
 // CMPXDbAbstractAlbum::RemoveAbstractAlbumL
 // ----------------------------------------------------------------------------
 //
@@ -252,10 +328,13 @@
 // ----------------------------------------------------------------------------
 //
 void CMPXDbAbstractAlbum::HandleTNL( const TDesC& aOldPath,
-        const TDesC& aNewPath, TInt /*aPriority*/ )
+        const TDesC& aNewPath, TInt aPriority )
   {
   MPX_FUNC("CMPXDbAbstractAlbum::HandleTNL");
-
+  if (!iTNManager)
+      {
+      CreateTNMSessionL();
+      }
   if (aNewPath.Compare(KNullDesC)==0 && aOldPath.Compare(KNullDesC)!=0)
       {         
       // remove from thumbnail database table
@@ -263,14 +342,15 @@
       CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC(
                aOldPath, KImageFileType );
       iTNManager->DeleteThumbnails( *source );
+          
       CleanupStack::PopAndDestroy( source );
       }
    else if (aNewPath.Compare(KNullDesC)!=0)
       {
       //rename thumbnail
-      MPX_DEBUG1("CMPXDbAbstractAlbum::HandleTNL, rename TN");
-      // TODO: uncomment when RenameThumbnailsL is supported.
-      //iTNManager->RenameThumbnailsL( aOldPath,  aNewPath, aPriority );
+      MPX_DEBUG1("CMPXDbAbstractAlbum::HandleTNL, rename Thumbnail entry in Thumbnail table");
+    
+      iTNManager->RenameThumbnailsL( aOldPath,  aNewPath, aPriority );  
       //after rename, reset flag
       iRenameTN = EFalse;
       }
@@ -532,6 +612,7 @@
     CMPXDbManager& aDbManager,
     TMPXGeneralCategory aCategory, RFs& aFs) :
     CMPXDbCategory(aDbManager, aCategory),
+    iTNManager(NULL),
     iFs(aFs)
     {
     MPX_FUNC("CMPXDbAbstractAlbum::CMPXDbAbstractAlbum");
@@ -546,11 +627,7 @@
     MPX_FUNC("CMPXDbAbstractAlbum::ConstructL");
 
     BaseConstructL();
-#ifdef RD_MPX_TNM_INTEGRATION
-    // Create Thumbnail Manager instance. This object is the observer.
-    iTNManager = CThumbnailManager::NewL( *this );
     iRenameTN = EFalse;
-#endif //RD_MPX_TNM_INTEGRATION
     }
 
 
@@ -573,4 +650,16 @@
         MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ )
     {
     }
+
+// ---------------------------------------------------------------------------
+// CMPXDbAbstractAlbum::CreateTNMSessionL
+// Create thumbnail session
+// ---------------------------------------------------------------------------    
+void CMPXDbAbstractAlbum::CreateTNMSessionL()
+    {
+    if(!iTNManager)
+        {
+        iTNManager = CThumbnailManager::NewL( *this );
+        }
+    }
 // End of File
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -112,7 +112,7 @@
 //
 TUint32 CMPXDbAlbum::AddItemL(
     const TDesC& aName,
-    TUint32 aArtist,
+    const TDesC& aArtistName,
     const TDesC& aArt,
     TInt aDriveId,
     TBool& aNewRecord,
@@ -130,11 +130,13 @@
         // insert new
         HBufC* query = PreProcessStringLC(KQueryAlbumInsert);
         HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName);
+        HBufC* artistname = MPXDbCommonUtil::ProcessSingleQuotesLC(aArtistName);
 		HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(aArt);
 
-        iDbManager.ExecuteQueryL(aDriveId, *query, rowId, name, 1, aArtist, art);
+        iDbManager.ExecuteQueryL(aDriveId, *query, rowId, artistname, name, 1, art); 
 
 		CleanupStack::PopAndDestroy(art);
+        CleanupStack::PopAndDestroy(artistname);
         CleanupStack::PopAndDestroy(name);
         CleanupStack::PopAndDestroy(query);
         }
@@ -154,17 +156,21 @@
 	    }
 
         // Artist
-        TUint32 artistId = recordset.ColumnInt64(EAlbumArtist);
+        TPtrC artistname(KNullDesC);
+        artistname.Set(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName));
 
         // the current one is Unknown and the new one is Not Unknown.
-        if ( IsUnknownArtistL( artistId ) && !IsUnknownArtistL( aArtist ) )
+         if ( artistname == KNullDesC  && aArtistName!= KNullDesC )
             {
-            _LIT( KFormatArtistId, "Artist=%d" );
-            HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen);
-            setStr->Des().Format( KFormatArtistId, aArtist );
-
+            HBufC* artistnameReplaceSingleQuote = 
+                            MPXDbCommonUtil::ProcessSingleQuotesLC( aArtistName );
+            TPtrC criteria(KCriterionArtistName);
+            HBufC* setStr = HBufC::NewLC(criteria.Length() + artistnameReplaceSingleQuote->Length()); 
+            setStr->Des().Format( KCriterionArtistName, artistnameReplaceSingleQuote );
+           
             iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, rowId);
             CleanupStack::PopAndDestroy(setStr);
+            CleanupStack::PopAndDestroy(artistnameReplaceSingleQuote);
             }
 
         // Album Art
@@ -176,9 +182,10 @@
             {
             HBufC* artReplaceSingleQuote = 
                             MPXDbCommonUtil::ProcessSingleQuotesLC( aArt );
-            _LIT( KFormatArt, "Art=\'%S\'" );
-            HBufC* setStr = HBufC::NewLC(256);
-            setStr->Des().Format( KFormatArt, artReplaceSingleQuote );
+
+            TPtrC criteria(KCriterionArt);
+            HBufC* setStr = HBufC::NewLC(criteria.Length() + artReplaceSingleQuote->Length()); 
+            setStr->Des().Format( KCriterionArt, artReplaceSingleQuote );
 
             iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, rowId);
             CleanupStack::PopAndDestroy(setStr);
@@ -240,24 +247,31 @@
             User::Leave(KErrNotFound);
         }
 
-        TUint32 artistId = recordset.ColumnInt64(EAlbumArtist);
         TBool itemModified = EFalse;
+        TPtrC artistname(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName));
+        TUint32 artistId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXArtist,
+	            artistname, ETrue);
 
         // the current artist is equal to deleted song's artist
         if ( artistId == aArtist )
             {
-            TUint32 newArtistId = ArtistForAlbumL(aId);
-            if ( artistId != newArtistId )
-                {
-                _LIT( KFormatArtistId, "Artist=%d" );
-                HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen);
-                setStr->Des().Format(KFormatArtistId, newArtistId);
+            HBufC* newArtistname = ArtistForAlbumL(aId);
+            
+            CleanupStack::PushL(newArtistname);
+            if (newArtistname && newArtistname->CompareF(artistname)!=0)
+                { 
+                HBufC* artistnameReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( *newArtistname );
+                TPtrC criteria(KCriterionArtistName);
+                HBufC* setStr = HBufC::NewLC(criteria.Length() + artistnameReplaceSingleQuote->Length()); 
+                setStr->Des().Format( KCriterionArtistName, artistnameReplaceSingleQuote );                    	
 
                 iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId);
                 CleanupStack::PopAndDestroy(setStr);
+                CleanupStack::PopAndDestroy(artistnameReplaceSingleQuote);
                 itemModified = ETrue;
                 }
-            }
+            CleanupStack::PopAndDestroy(newArtistname);             
+            }         
         
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED      
     TBool nonEmbeddedArt = EFalse;
@@ -290,9 +304,9 @@
                 {
                 MPX_DEBUG1("CMPXDbAlbum::DecrementSongsForCategoryL, get newArt");
                 HBufC* artReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( *newArt );
-                _LIT( KFormatArt, "Art=\'%S\'" );
-                HBufC* setStr = HBufC::NewLC(256);                 
-                setStr->Des().Format( KFormatArt, artReplaceSingleQuote );
+                TPtrC criteria(KCriterionArt);   
+                HBufC* setStr = HBufC::NewLC(criteria.Length() + artReplaceSingleQuote->Length()); 
+                setStr->Des().Format( KCriterionArt, artReplaceSingleQuote );
 
                 iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId);
                 CleanupStack::PopAndDestroy(setStr);
@@ -553,9 +567,7 @@
 	if (aMedia.IsSupported(KMPXMediaMusicArtist))
 	    {
 	    const TDesC& artistName = aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen);
-	    TUint32 artistId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXArtist,
-	            artistName, ETrue);
-	    MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArtist, artistId);
+	    MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCAlbumArtistName, artistName);
 	    }
 	}
 
@@ -572,7 +584,7 @@
 // CMPXDbAlbum::ArtistForAlbumL
 // ----------------------------------------------------------------------------
 //
-TUint32 CMPXDbAlbum::ArtistForAlbumL(const TUint32 aId)
+HBufC* CMPXDbAlbum::ArtistForAlbumL(const TUint32 aId)
     {
     return iObserver.HandleArtistForAlbumL(aId);
     }
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -1589,9 +1589,8 @@
             }
 
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
-        //for AbstractAlbum garbage collection
-        //can not leave
-        TRAP_IGNORE( AbstractAlbumCleanUpL() );
+    //for AbstractAlbum garbage collection
+    TRAP_IGNORE( iDbAbstractAlbum->AbstractAlbumCleanUpL() );
 #endif
    
 #ifdef __RAMDISK_PERF_ENABLE
@@ -1622,6 +1621,12 @@
     
         iDbManager->BeginL();
         }
+    //create Thumbnail manager session for cleanup for abstractalbum when MTP end.
+    //because when MTP end comes, in case of mode switching, we need to do it as fast as possible, 
+    //hence we don’t want the delay happens on that time.    
+#ifdef RD_MPX_TNM_INTEGRATION           
+    iDbAbstractAlbum->CreateTNMSessionL();
+#endif  //RD_MPX_TNM_INTEGRATION
     MPX_DEBUG1("<--CMPXDbHandler::MtpStartL");
     }
 
@@ -1647,11 +1652,13 @@
 #endif //__RAMDISK_PERF_ENABLE
 
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
-    TRAP(err, RemoveAbstractAlbumsWithNoSongL());
+    BeginTransactionL();
+    TRAP(err, iDbAbstractAlbum->RemoveAbstractAlbumsWithNoSongL());
     if ( err != KErrNone )
         {
         MPX_DEBUG2("CMPXDbHandler::MtpEndL error happened when cleanup albstractalbum with no songs association[%d]", err);
         }
+    EndTransactionL(err);
 #endif
     MPX_DEBUG1("<--CMPXDbHandler::MtpEndL");
     }
@@ -2383,83 +2390,6 @@
         EMPXSong, KDBPluginUid);
     }
     
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED  
-// ----------------------------------------------------------------------------
-// Remove abstractalbums which have no songs associated.
-// ----------------------------------------------------------------------------
-//
-void CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL()
-    {
-    MPX_FUNC("CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL");
-    
-    BeginTransactionL();
-    RArray<TUint32> iItemsIds;
-    CleanupClosePushL(iItemsIds);
-      //get all abstractalbum with no songs associated.
-    iDbAbstractAlbum->GetAllItemsWithNoSongL(iItemsIds);
-    TInt count = iItemsIds.Count();
-    TInt err = KErrNone;
-    if (count)
-        {
-        MPX_DEBUG2("CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL, abstractalbum count[%d] ", iItemsIds.Count());
-        CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL();
-        CleanupStack::PushL(itemChangedMessages);
-
-        //go through each one to delete
-        for (TInt i=0; i< count; i++)
-            {
-            TRAP(err, RemoveAbstractAlbumL(iItemsIds[i], *itemChangedMessages, EFalse));
-            if (err != KErrNone)
-                {
-                MPX_DEBUG2("CMPXDbHandler::RemoveAbstractAlbumsWithNoSongL, error happens when delete abstractalbum, err ", err);
-                }
-            }
-       CleanupStack::PopAndDestroy(itemChangedMessages);
-       }
-    CleanupStack::PopAndDestroy(&iItemsIds);
-    EndTransactionL(err); 
-  }
-  
-// ----------------------------------------------------------------------------
-// Remove .alb entry from AbstractAlnum table, TN table if .alb files deleted 
-// from file manager when refresh library
-// ----------------------------------------------------------------------------
-//
-void CMPXDbHandler::AbstractAlbumCleanUpL()
-    {
-    MPX_FUNC("CMPXDbHandler::AbstractAlbumCleanUpL");
-    RArray<TMPXAttribute> attributes;
-    CleanupClosePushL(attributes);
-    attributes.AppendL(KMPXMediaGeneralUri);
-    CMPXMediaArray* mediaArray = CMPXMediaArray::NewL();
-    CleanupStack::PushL(mediaArray);
-    
-    iDbAbstractAlbum->GetAllCategoryItemsL(attributes.Array(), *mediaArray);
-
-    TInt count(mediaArray->Count());
-    if (count)
-        {
-        CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL();
-        CleanupStack::PushL(itemChangedMessages);
-        for (TInt i = 0; i < count; i++)
-            {
-            CMPXMedia* element = mediaArray->AtL(i);
-            const TDesC& uri = element->ValueText(KMPXMediaGeneralUri);                                 
-
-            //check if the file exists in file system
-            if (!(BaflUtils::FileExists(iFs, uri)))
-                {
-                //generate abstractalbum UID with the Uri
-                TUint32 abstractAlbumId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, uri, EFalse));
-                RemoveAbstractAlbumL(abstractAlbumId, *itemChangedMessages, ETrue);             
-                }
-            }
-            CleanupStack::PopAndDestroy(itemChangedMessages);
-        }
-        CleanupStack::PopAndDestroy(mediaArray);       
-        CleanupStack::PopAndDestroy(&attributes);     
-    }
-#endif //ABSTRACTAUDIOALBUM_INCLUDED
 
 // ----------------------------------------------------------------------------
 // CMPXDbHandler::DoCleanupDeletedRecordsL
@@ -2911,22 +2841,6 @@
 
         // append the drive to the drive list
         iDbDrives.AppendL(driveUnit);
-
-        // make sure the folder is created
-        TVolumeInfo info;
-        if (iFs.Volume(info, driveUnit) == KErrNone)
-           {
-            if (!BaflUtils::PathExists(iFs, folder))
-                {
-                // create music folder if necessary
-                TInt err(iFs.MkDirAll(folder));
-                MPX_DEBUG3("Try to create music folder %S return code %d", &folder, err);
-                if (err != KErrAlreadyExists)
-                    {
-                    User::LeaveIfError(err);
-                    }
-                }
-            }
         }
     }
 
@@ -3202,7 +3116,7 @@
 TUint32 CMPXDbHandler::AddCategoryItemL(
         TMPXGeneralCategory aCategory,
         const TDesC& aName,
-        TUint32 aArtist,
+        const TDesC& aArtistName,
         const TDesC& aArt,
         TInt aDriveId,
         CMPXMessageArray* aItemChangedMessages,
@@ -3215,9 +3129,9 @@
     TBool newRecord(EFalse);
 
     TUint32 id = 0;
-    if ( aArtist )
+    if(aCategory == EMPXAlbum)
         {
-        id = iDbAlbum->AddItemL(aName, aArtist, aArt, aDriveId, newRecord, (aCategory != EMPXGenre));
+        id = iDbAlbum->AddItemL(aName, aArtistName, aArt, aDriveId, newRecord, (aCategory != EMPXGenre));
         }
     else
         {
@@ -3379,9 +3293,12 @@
 // CMPXDbHandler::HandleArtistForAlbumL
 // ---------------------------------------------------------------------------
 //
-TUint32 CMPXDbHandler::HandleArtistForAlbumL(const TUint32 aAlbumId)
+HBufC* CMPXDbHandler::HandleArtistForAlbumL(const TUint32 aAlbumId)
     {
-    return iDbMusic->ArtistForAlbumL(aAlbumId);
+
+    TUint32 artistId = iDbMusic->ArtistForAlbumL(aAlbumId);
+    HBufC* artistname = GetNameMatchingIdL(artistId);
+    return artistname;
     }
 
 // ---------------------------------------------------------------------------
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -56,6 +56,7 @@
 _LIT( KAbstractAlbumExt, ".alb" );
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
 
+const TInt KAllSongsQueryResultGranularity = 250;
 
 // ============================ MEMBER FUNCTIONS ==============================
 
@@ -99,6 +100,7 @@
     {
     MPX_FUNC("CMPXDbMusic::~CMPXDbMusic");
     delete iExtensionsDrm;
+    iAllSongsQueryResult.ResetAndDestroy();
     }
 
 // ----------------------------------------------------------------------------
@@ -113,6 +115,7 @@
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
     ,iArtNeedUpdated(ETrue)
 #endif
+    ,iAllSongsQueryResult(KAllSongsQueryResultGranularity)
     {
     MPX_FUNC("CMPXDbMusic::CMPXDbMusic");
     }
@@ -682,11 +685,51 @@
     {
     MPX_FUNC("CMPXDbMusic::GetAllSongsLimitedL");
 
-    // Gets a subset of the data from all songs ordered by title
-    HBufC* query = HBufC::NewLC( KQueryMusicGetSongsLimited().Length() + KMCIntegerLen );
-    query->Des().Format( KQueryMusicGetSongsLimited, aLimit );
-    ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
-    CleanupStack::PopAndDestroy( query );    
+	// Reset and create a cache for the query results.
+	if (iAllSongsQueryResult.Count())
+		{
+        iAllSongsQueryResult.ResetAndDestroy();
+		}
+
+	ExecuteQueryAllSongsL(aAttrs);
+
+    TInt limit = aLimit > iAllSongsQueryResult.Count() ?
+    	iAllSongsQueryResult.Count() : aLimit;
+
+	for ( TInt i=0; i < limit; i++ )
+		{
+        CMPXMedia* m = iAllSongsQueryResult[i];
+		aMediaArray.AppendL(*m);
+		}
+    }
+
+// ----------------------------------------------------------------------------
+// CMPXDbMusic::ExecuteQueryAllSongsL
+// ----------------------------------------------------------------------------
+//
+void CMPXDbMusic::ExecuteQueryAllSongsL(const TArray<TMPXAttribute>& aAttrs)
+    {
+    // Run query and add result media objects to the cache array.
+    MPX_FUNC("CMPXDbMusic::ExecuteQueryAllSongsL");
+
+    RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetAllSongs));
+    CleanupClosePushL(recordset);
+
+    TInt err(KErrNone);
+    while ((err = recordset.Next()) == KSqlAtRow)
+        {
+        CMPXMedia* media = CMPXMedia::NewL();
+        CleanupStack::PushL(media);
+        UpdateMediaL(recordset, aAttrs, *media);
+        iAllSongsQueryResult.AppendL(media);
+        CleanupStack::Pop(media);
+        }
+
+    CleanupStack::PopAndDestroy(&recordset);
+    if (err!= KSqlAtEnd)
+        {
+        User::Leave(KErrCorrupt);
+        }
     }
 
 // ----------------------------------------------------------------------------
@@ -723,12 +766,23 @@
                                      TInt aOffset,
                                      TInt aCount )
     {
-    MPX_DEBUG1("CMPXDbMusic::GetSongsAtOffsetL <--");   
+	MPX_DEBUG3("CMPXDbMusic::GetSongsAtOffsetL offset[%d], count[%d]", aOffset, aCount);
+
+	if ( !iAllSongsQueryResult.Count() )
+		{
+		// If there's no cache, create a cache for the query results.
+		ExecuteQueryAllSongsL(aAttrs);
+		}
 
-    ExecuteMediaQueryL(aAttrs, aMediaArray, KQueryMusicGetSongsAtOffset, 
-                       aCount, aOffset, EOffSetQuery );
-    
-    MPX_DEBUG1("CMPXDbMusic::GetSongsAtOffsetL() -->"); 
+	TInt limit = aOffset + aCount > iAllSongsQueryResult.Count() ?
+		iAllSongsQueryResult.Count() : aOffset + aCount;
+	for ( TInt i = aOffset; i < limit; i++ )
+		{
+        CMPXMedia* m = iAllSongsQueryResult[i];
+		aMediaArray.AppendL(*m);
+		}
+
+    MPX_DEBUG1("CMPXDbMusic::GetSongsAtOffsetL() -->");
     }
 
 // ----------------------------------------------------------------------------
@@ -2081,19 +2135,17 @@
 
     // update the artist field
     TUint32 id(0);
-    TUint32 artistIdForAlbum(artistId);
     if (UpdateCategoryFieldL(EMPXArtist, aMedia, KMPXMediaMusicArtist, artistId,
-        aDrive, aItemChangedMessages, id, 0))
+        aDrive, aItemChangedMessages, id))
         {
         MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArtist, id);
         metaDataModified = (aMusicTable != NULL);
         visibleChange = CMPXDbActiveTask::EAllVisible;
-        artistIdForAlbum = id;
         }
 
     // update the album field
     if (UpdateCategoryFieldL(EMPXAlbum, aMedia, KMPXMediaMusicAlbum, albumId,
-        aDrive, aItemChangedMessages, id, artistIdForAlbum))
+        aDrive, aItemChangedMessages, id))
         {
         MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicAlbum, id);
         metaDataModified = (aMusicTable != NULL);
@@ -2488,6 +2540,25 @@
                     }
                 else
 #endif // ABSTRACTAUDIOALBUM_INCLUDED
+                    if (aCategory == EMPXArtist || aCategory == EMPXAlbum)
+                    {
+                    TPtrC art(KNullDesC);
+                    TPtrC artistname(KNullDesC);
+
+                    if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
+                        {
+                        art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
+                        }
+                    if (aCategory == EMPXAlbum)
+                        {
+                        if (aMedia.IsSupported(KMPXMediaMusicArtist))
+                            {
+                            artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen));
+                            }
+                        }
+                    iObserver.AddCategoryItemL(aCategory, name, artistname, art, aDriveId, aItemChangedMessages, itemAdded);
+                    }
+                else
                     {
                     // ignore the return value
                     iObserver.AddCategoryItemL(aCategory, name, aDriveId,
@@ -2523,8 +2594,27 @@
                     }            
                else
 #endif // ABSTRACTAUDIOALBUM_INCLUDED        
-                      {              
-                      // ignore the return value
+                    if (aCategory == EMPXArtist || aCategory == EMPXAlbum)
+                   {
+                   TPtrC art(KNullDesC);
+                   TPtrC artistname(KNullDesC);
+                   if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
+                       {
+                       art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
+                        }
+                   if (aCategory == EMPXAlbum)
+                       {
+                       if (aMedia.IsSupported(KMPXMediaMusicArtist))
+                           {
+                           artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen));
+                           }
+                       }
+                   iObserver.AddCategoryItemL(aCategory, KNullDesC, artistname, art, aDriveId,
+                        aItemChangedMessages, itemAdded);
+                   }
+               else
+                   {
+                   // ignore the return value
                       iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId,
                             aItemChangedMessages, itemAdded);
                       }
@@ -2595,132 +2685,7 @@
     return updated;
     }
 
-TBool CMPXDbMusic::UpdateCategoryFieldL(
-    TMPXGeneralCategory aCategory,
-    const CMPXMedia& aMedia,
-    const TMPXAttribute& aAttribute,
-    TUint32 aOldId,
-    TInt aDriveId,
-    CMPXMessageArray* aItemChangedMessages,
-    TUint32& aItemId,
-    TUint32 aArtistId)
-    {
-    TBool updated(EFalse);
-    TBool itemNotRemoved( EFalse );
-    TBool itemAdded( EFalse );
 
-    // update category table and add category Id to the music table
-    if (!aOldId || aMedia.IsSupported(aAttribute))
-        {
-        TInt changeMsgCount( 0 );
-        if( aItemChangedMessages )
-            {
-            changeMsgCount = aItemChangedMessages->Count();
-            }
-
-        if (aMedia.IsSupported(aAttribute))
-            {
-            TPtrC name(aMedia.ValueText(aAttribute).Left(KMCMaxTextLen));
-
-            // construct the new ID for the category record
-            // only genre is not case sensitive
-            aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory,
-                name, (aCategory != EMPXGenre));
-            if (!aOldId || (aOldId != aItemId))
-                {
-                // only add if the ID changed,
-                // otherwise the song was updated but the artist name was not
-                TPtrC art(KNullDesC);
-                if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
-                    {
-                    art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
-                    }
-
-                iObserver.AddCategoryItemL(aCategory, name, aArtistId, art, aDriveId, aItemChangedMessages, itemAdded);
-                updated = ETrue;
-                }
-            }
-        else
-            {
-            // only genre is not case sensitive
-            aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, KNullDesC,
-                (aCategory != EMPXGenre));
-            if (!aOldId || (aOldId != aItemId))
-                {
-				TPtrC art(KNullDesC);
-				if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
-					{
-					art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
-					}
-
-				iObserver.AddCategoryItemL(aCategory, KNullDesC, aArtistId, art, aDriveId,
-                    aItemChangedMessages, itemAdded);
-                updated = ETrue;
-                }
-            }
-
-        if (aOldId && (aOldId != aItemId))
-            {
-            iObserver.DeleteSongForCategoryL(aCategory, aOldId, aDriveId,
-                aItemChangedMessages, itemNotRemoved);
-            updated = ETrue;
-            }
-
-        // Special case where the item(s) has been renamed.
-        // In this case, a new category is created +1 change msg
-        //               a old category is removed +1 change msg
-        // We merge these 2 change messages into one using the deprecated ID
-        //
-        if( aItemChangedMessages )
-            {
-            TInt newChangeMsgCount( aItemChangedMessages->Count() );
-            if(  newChangeMsgCount - changeMsgCount > 0 )
-                {
-                TInt oldId = KErrNotFound;
-                TInt newId = KErrNotFound;
-                for( TInt i=0; i<newChangeMsgCount; ++i )
-                    {
-                    CMPXMessage& msg = *(*aItemChangedMessages)[i];
-
-                    TMPXItemId id = msg.ValueTObjectL<TMPXItemId>(KMPXMessageMediaGeneralId);
-                    TMPXChangeEventType changeType = msg.ValueTObjectL<TMPXChangeEventType>(KMPXMessageChangeEventType);
-
-                    // Look for the added and deleted category IDs
-                    //
-                    if( id == aOldId && changeType == EMPXItemDeleted )
-                        {
-                        oldId = i;
-                        }
-                    else if( id == aItemId && changeType == EMPXItemInserted )
-                        {
-                        newId = i;
-                        }
-                    }
-
-                if( oldId != KErrNotFound &&
-                    newId != KErrNotFound )
-                    {
-                    aItemChangedMessages->Remove(oldId);  // category removed
-                    aItemChangedMessages->Remove(newId);  // category added
-                    MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aItemId, EMPXItemModified,
-                                                            aCategory, KDBPluginUid, aOldId );
-                    }
-                else if ( oldId !=KErrNotFound && itemAdded ) // old item removed, new item already exist
-                    {
-                    MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aItemId, EMPXItemModified,
-                                                            aCategory, KDBPluginUid, aOldId );
-                    }
-                else if ( newId !=KErrNotFound && itemNotRemoved ) // new item added, old item still exist
-                    {
-                    MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aOldId, EMPXItemModified,
-                                                            aCategory, KDBPluginUid, aItemId );
-                    }
-                }
-            }
-        }
-
-    return updated;
-    }
 // ----------------------------------------------------------------------------
 // CMPXDbMusic::ExtraFieldsRequired
 // ----------------------------------------------------------------------------
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -4079,12 +4079,13 @@
     TInt numItems = aCmd.ValueTObjectL<TInt>( KMPXCollectionCommandIdIncOpenLNumItems );
 
     TReadDirection direction(EReadUnknown);
+/*  Ascending and Decending reads are currently not used. We optimized for offset reads.
     if( aCmd.IsSupported(KMPXCollectionCommandIdIncOpenLAscDsc) &&
         aCmd.IsSupported(KMPXCollectionCommandIdIncOpenLKeyItem) )
         {
         direction = aCmd.ValueTObjectL<TReadDirection>(KMPXCollectionCommandIdIncOpenLAscDsc);
         }
-
+*/
     CMPXCollectionPath* path =  aCmd.ValueCObjectL<CMPXCollectionPath>(KMPXCollectionCommandIdIncOpenLPath);
     CleanupStack::PushL( path );
     MPX_DEBUG_PATH( *path );
--- a/mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h	Fri Jun 25 17:21:37 2010 -0500
@@ -27,7 +27,7 @@
 
 // Db filename
 _LIT(KMCDbFile, "pcv6_1.db");
-
+_LIT(KMCDbFileEMMC, "pcv6_1i.db");
 // Collection Db resource file
 _LIT(KMPXCollectionDbResourceFile,  "PCRes.rsc");
 
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h	Fri Jun 25 17:21:37 2010 -0500
@@ -108,7 +108,7 @@
     void setPlaylistToolBar();
 
     HbAction *createToolBarAction( QActionGroup *actionsGroup,
-        const QString& icon );
+        const QString& icon, const QString& objectName );
 
     void updateMenu();
     void updateToolBar();
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -803,33 +803,34 @@
     if ( !mMainToolBar ) {
         //Create the toolbar.
         mMainToolBar = new HbToolBar();
+        mMainToolBar->setObjectName( "MainToolBar" );
         mMainToolBar->setOrientation( Qt::Horizontal );
         QActionGroup *actionsGroup = new QActionGroup( mMainToolBar );
         HbAction *action;
 
         // All Songs
-        action = createToolBarAction( actionsGroup, "qtg_mono_songs_all" );
+        action = createToolBarAction( actionsGroup, "qtg_mono_songs_all", "AllSongsAction" );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openSongs() ) );
         mMainToolBar->addAction( action );
         
         // Artists
-        action = createToolBarAction( actionsGroup, "qtg_mono_artists" );
+        action = createToolBarAction( actionsGroup, "qtg_mono_artists", "ArtistsAction" );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openArtists() ) );
         mMainToolBar->addAction( action );
 
         // Albums
-        action = createToolBarAction( actionsGroup, "qtg_mono_music_albums" );
+        action = createToolBarAction( actionsGroup, "qtg_mono_music_albums", "AlbumsAction" );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openAlbums() ) );
         mMainToolBar->addAction( action );
 
         // Playlists
-        action = createToolBarAction( actionsGroup, "qtg_mono_playlist" );
+        action = createToolBarAction( actionsGroup, "qtg_mono_playlist", "PlaylistsAction" );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openPlaylists() ) );
         mMainToolBar->addAction( action );
         
         if ( mViewMode != MpCommon::FetchView ) {
             // Music Store
-            action = createToolBarAction(actionsGroup, "qtg_mono_ovistore" );
+            action = createToolBarAction(actionsGroup, "qtg_mono_ovistore", "MusicStoreAction" );
             connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openMusicStore() ) );
             mMainToolBar->addAction( action );
         }
@@ -872,26 +873,26 @@
     TX_ENTRY
     if ( !mPlaylistToolBar ) {
         mPlaylistToolBar = new HbToolBar();
+        mPlaylistToolBar->setObjectName( "PlaylistToolBar" );
         mPlaylistToolBar->setOrientation( Qt::Horizontal );
         HbAction *action;
-        HbIcon *icon;
 
         action = new HbAction( this );
-        icon = new HbIcon( "qtg_mono_plus" );
-        action->setIcon( *icon );
+        action->setIcon( HbIcon( "qtg_mono_plus" ) );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( prepareToAddToPlaylist() ) );
+        action->setObjectName( "AddToPlaylistAction" );
         mPlaylistToolBar->addAction( action );
 
         action = new HbAction( this );
-        icon = new HbIcon( "qtg_mono_minus" );
-        action->setIcon( *icon);
+        action->setIcon( HbIcon( "qtg_mono_minus" ) );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( deleteSongs() ) );
+        action->setObjectName( "RemoveFromPlaylistAction" );
         mPlaylistToolBar->addAction( action );
 
         action = new HbAction( this );
-        icon = new HbIcon( "qtg_mono_organize" );
-        action->setIcon( *icon );
+        action->setIcon( HbIcon( "qtg_mono_organize" ) );
         connect( action, SIGNAL( triggered( bool ) ), this, SLOT( arrangeSongs() ) );
+        action->setObjectName( "OrganizePlaylistAction" );
         mPlaylistToolBar->addAction( action );
     }
 
@@ -922,13 +923,15 @@
  */
 HbAction *MpCollectionView::createToolBarAction(
     QActionGroup *actionsGroup,
-    const QString& icon )
+    const QString& icon,
+    const QString& objectName )
 {
     HbIcon actionIcon( icon );
 
     HbAction *action = new HbAction( actionsGroup );
     action->setIcon( actionIcon );
     action->setCheckable( true );
+    action->setObjectName( objectName );
     return action;
 }
 
--- a/mpviewplugins/mpdetailsviewplugin/inc/mpdetailssharedialog.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/mpviewplugins/mpdetailsviewplugin/inc/mpdetailssharedialog.h	Fri Jun 25 17:21:37 2010 -0500
@@ -21,7 +21,7 @@
 
 #include <HbDialog>
 #include <QList>
-#include <QSsLError>
+#include <QSslError>
 #include "mpsharedata.h"
 
 class QGraphicsWebView;
--- a/musicwidgetplugin/rom/musicwidgetplugin.iby	Fri Jun 11 19:36:32 2010 -0500
+++ b/musicwidgetplugin/rom/musicwidgetplugin.iby	Fri Jun 25 17:21:37 2010 -0500
@@ -22,5 +22,6 @@
 data=ZPRIVATE\20022f35\import\widgetregistry\200286FA\musicwidgetplugin.qtplugin        private\20022f35\import\widgetregistry\200286FA\musicwidgetplugin.qtplugin
 data=ZPRIVATE\20022f35\import\widgetregistry\200286FA\musicwidgetplugin.manifest        private\20022f35\import\widgetregistry\200286FA\musicwidgetplugin.manifest
 data=ZPRIVATE\20022f35\import\widgetregistry\200286FA\musicwidgetplugin.xml             private\20022f35\import\widgetregistry\200286FA\musicwidgetplugin.xml
+data=ZPRIVATE\20022f35\import\widgetregistry\200286FA\musicwidgeticon.png               private\20022f35\import\widgetregistry\200286FA\musicwidgeticon.png
 
 #endif // MUSICWIDGETPLUGIN_IBY
\ No newline at end of file
--- a/tsrc/mpfetchertestapp/inc/mpfetchertestappview.h	Fri Jun 11 19:36:32 2010 -0500
+++ b/tsrc/mpfetchertestapp/inc/mpfetchertestappview.h	Fri Jun 25 17:21:37 2010 -0500
@@ -43,6 +43,9 @@
     void launchHomeScreen();
     void launchHomeScreenNowPlaying();
     void launchHomeScreenNPShuffle();
+    void playNPVSong();
+    void endMP();
+    void killMP();
     
     
     
--- a/tsrc/mpfetchertestapp/src/mpfetchertestappview.cpp	Fri Jun 11 19:36:32 2010 -0500
+++ b/tsrc/mpfetchertestapp/src/mpfetchertestappview.cpp	Fri Jun 25 17:21:37 2010 -0500
@@ -24,6 +24,11 @@
 #include <QDebug>
 #include "mpfetchertestappview.h"
 
+#include <apgcli.h>
+#include <apacmdln.h>
+#include <apgtask.h>
+#include <eikenv.h>
+
 
 MpFetcherTestAppView::MpFetcherTestAppView(QGraphicsItem *parent) :
     HbView(parent),
@@ -120,39 +125,68 @@
                 connect(button, SIGNAL(clicked()), SLOT(fetchSong()));
                 bottomLayout->addItem(button);
             }
+            
+            QGraphicsLinearLayout *playLayout = new QGraphicsLinearLayout(Qt::Horizontal);
             HbPushButton* playButton = new HbPushButton("Play song");
             if (playButton)
             {
                 connect(playButton, SIGNAL(clicked()), SLOT(viewSong()));
-                bottomLayout->addItem(playButton);
+                playLayout->addItem(playButton);
             }
             HbPushButton* viewButton = new HbPushButton("Play song caged");
             if (viewButton)
             {
                 connect(viewButton, SIGNAL(clicked()), SLOT(viewSongCaged()));
-                bottomLayout->addItem(viewButton);
+                playLayout->addItem(viewButton);
             }
-                        
+            bottomLayout->addItem(playLayout);
+            
+            QGraphicsLinearLayout *hsLayout = new QGraphicsLinearLayout(Qt::Horizontal);
             HbPushButton* homeScreenButton = new HbPushButton("HS Widget MainView");
             if (homeScreenButton)
             {
                 connect(homeScreenButton, SIGNAL(clicked()), SLOT(launchHomeScreen()));
-                bottomLayout->addItem(homeScreenButton);
+                hsLayout->addItem(homeScreenButton);
             }
                      
             HbPushButton* homeScreenButtonNPV = new HbPushButton("HS Widget NowPlayingView");
             if (homeScreenButtonNPV)
             {
                 connect(homeScreenButtonNPV, SIGNAL(clicked()), SLOT(launchHomeScreenNowPlaying()));
-                bottomLayout->addItem(homeScreenButtonNPV);
+                hsLayout->addItem(homeScreenButtonNPV);
             }
             
             HbPushButton* homeScreenButtonNPVS = new HbPushButton("HS Widget NPV Shuffle");
             if (homeScreenButtonNPVS)
             {
                 connect(homeScreenButtonNPVS, SIGNAL(clicked()), SLOT(launchHomeScreenNPShuffle()));
-                bottomLayout->addItem(homeScreenButtonNPVS);
+                hsLayout->addItem(homeScreenButtonNPVS);
+            }
+            bottomLayout->addItem(hsLayout);
+            
+            HbPushButton* NowPlayingButton = new HbPushButton("NPV File Activity");
+            if (NowPlayingButton)
+            {
+                connect(NowPlayingButton, SIGNAL(clicked()), SLOT(playNPVSong()));
+                bottomLayout->addItem(NowPlayingButton);
             }
+            QGraphicsLinearLayout *goomLayout = new QGraphicsLinearLayout(Qt::Horizontal);
+            HbPushButton* endButton = new HbPushButton("End MP");
+            if (endButton)
+            {
+                connect(endButton, SIGNAL(clicked()), SLOT(endMP()));
+                goomLayout->addItem(endButton);
+            }
+                     
+            HbPushButton* killButton = new HbPushButton("Kill MP");
+            if (killButton)
+            {
+                connect(killButton, SIGNAL(clicked()), SLOT(killMP()));
+                goomLayout->addItem(killButton);
+            }
+            
+            bottomLayout->addItem(goomLayout);
+            
             layout->addItem(bottomLayout);
         }
 
@@ -437,3 +471,55 @@
    }
  
 }
+
+void MpFetcherTestAppView::playNPVSong()
+{
+    QUrl url;
+
+    url.setUrl("appto://10207C62?activityname=MusicNowPlayingView&launchtype=standalone&uri=" + mResultEdit->text() );
+    if(mReq){
+        delete mReq;
+        mReq = 0;
+    }
+    mReq = mAppMgr.create(url);    
+    if (mReq == NULL)
+    {
+        // No handlers for the URI
+        return;
+    }
+    
+    mReq->setBackground(false);
+
+    // Send the request
+   bool res = mReq->send();
+   if  (!res) 
+   {
+       // Request failed. 
+      int error = mReq->lastError();
+
+      // Handle error
+   }
+ 
+}
+
+void MpFetcherTestAppView::endMP()
+{
+    TApaTaskList taskList(CEikonEnv::Static()->WsSession());
+    TApaTask task = taskList.FindApp(TUid::Uid(270564450));
+    if (task.Exists()) {
+        task.EndTask();
+    } else {
+        qCritical("Cannot bring to forward task %08x", 270564450);
+    }
+
+}
+void MpFetcherTestAppView::killMP()
+{
+    TApaTaskList taskList(CEikonEnv::Static()->WsSession());
+    TApaTask task = taskList.FindApp(TUid::Uid(270564450));
+    if (task.Exists()) {
+        task.KillTask();
+    } else {
+        qCritical("Cannot bring to forward task %08x", 270564450);
+    }
+}