# HG changeset patch # User hgs # Date 1277504497 18000 # Node ID b93f525c92441a2df9dd31085cdf0a1ef11def87 # Parent eb79a7c355bfd9006df0410cde7f01e35406ca1b 201025 diff -r eb79a7c355bf -r b93f525c9244 app/app.pro --- 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" } diff -r eb79a7c355bf -r b93f525c9244 app/inc/mpmainwindow.h --- 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 }; diff -r eb79a7c355bf -r b93f525c9244 app/resources/musicplayer.docml --- /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 @@ + + +
+ + + +
+
+ + + + +
+ +
diff -r eb79a7c355bf -r b93f525c9244 app/resources/musicplayer.splashml --- /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 @@ + + + musicplayer.docml + splashView + 0x10207C62 + musicplayer + portrait + landscape + diff -r eb79a7c355bf -r b93f525c9244 app/rom/musicplayer.iby --- 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 diff -r eb79a7c355bf -r b93f525c9244 app/src/main.cpp --- 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 #include #include +#include +#include #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; diff -r eb79a7c355bf -r b93f525c9244 app/src/mpmainwindow.cpp --- 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(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(qApp); - app->activityManager()->waitActivity(); + //Register to application manager to wait for activities and clear previous activities on the task switcher + mActivityManager = qobject_cast(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(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(qApp); - QString activityId = app->activateId(); - - if( !activityId.compare( "MusicNowPlayingView&launchtype=standalone" ) ) { - if ( orientation() == Qt::Vertical ) { - if( mVerticalViewType != PlaybackView ) { - activateView( PlaybackView ); - } - } - } - HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); - activityManager->waitActivity(); + TX_ENTRY + QVariantHash activityData = data.toHash(); + QByteArray serializedRestorePath = activityData.value( "restorePath" ).toByteArray(); + MpEngineFactory::sharedEngine()->loadActivityData( serializedRestorePath ); + TX_EXIT } diff -r eb79a7c355bf -r b93f525c9244 inc/mpengine.h --- 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(); diff -r eb79a7c355bf -r b93f525c9244 mpdata/src/mpmpxcollectiondata_p.cpp --- 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( KMPXMediaGeneralId ) ); diff -r eb79a7c355bf -r b93f525c9244 mpdata/tsrc/unittest_mpmpxcollectiondata/src/unittest_mpmpxcollectiondata.cpp --- 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( KMPXMediaGeneralId, itemId ); QVERIFY( mTest->testCachedItem( itemId ) ); diff -r eb79a7c355bf -r b93f525c9244 mpengine/bwins/mpengineu.def --- 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 &, 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 &, 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 &) - ?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 &) - ?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 &, 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 &, 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 &) + ?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 &) + ?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) diff -r eb79a7c355bf -r b93f525c9244 mpengine/eabi/mpengineu.def --- 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 diff -r eb79a7c355bf -r b93f525c9244 mpengine/inc/mpmpxcollectionframeworkwrapper.h --- 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: diff -r eb79a7c355bf -r b93f525c9244 mpengine/inc/mpmpxcollectionframeworkwrapper_p.h --- 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 &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; }; diff -r eb79a7c355bf -r b93f525c9244 mpengine/inc/mpmpxisolatedcollectionhelper.h --- 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; }; diff -r eb79a7c355bf -r b93f525c9244 mpengine/src/mpengine.cpp --- 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() diff -r eb79a7c355bf -r b93f525c9244 mpengine/src/mpmediakeyhandler_p.cpp --- 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( aPtr )->HandleRepeatEvent(); - return KErrNone; } diff -r eb79a7c355bf -r b93f525c9244 mpengine/src/mpmediakeyremconresponse.cpp --- 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 ); diff -r eb79a7c355bf -r b93f525c9244 mpengine/src/mpmpxcollectionframeworkwrapper.cpp --- 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. */ diff -r eb79a7c355bf -r b93f525c9244 mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp --- 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(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 ( 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 diff -r eb79a7c355bf -r b93f525c9244 mpengine/src/mpmpxisolatedcollectionhelper.cpp --- 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 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; + } + } } diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp --- 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(); } // ---------------------------------------------------------------------------- diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h --- 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: diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h --- 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& 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: diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h --- 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 }; diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h --- 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. diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h --- 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& aAttrs); private: // from MMPXTable @@ -809,6 +812,7 @@ #ifdef ABSTRACTAUDIOALBUM_INCLUDED TBool iArtNeedUpdated; #endif // ABSTRACTAUDIOALBUM_INCLUDED + RPointerArray iAllSongsQueryResult; }; #endif // MPXDBMUSIC_H diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.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(" diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/src/mpxcollectiondbmanager.cpp --- 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 diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp --- 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 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 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 diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp --- 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); } diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp --- 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 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 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; } // --------------------------------------------------------------------------- diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp --- 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& 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(KMPXMessageMediaGeneralId); - TMPXChangeEventType changeType = msg.ValueTObjectL(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 // ---------------------------------------------------------------------------- diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp --- 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( 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(KMPXCollectionCommandIdIncOpenLAscDsc); } - +*/ CMPXCollectionPath* path = aCmd.ValueCObjectL(KMPXCollectionCommandIdIncOpenLPath); CleanupStack::PushL( path ); MPX_DEBUG_PATH( *path ); diff -r eb79a7c355bf -r b93f525c9244 mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h --- 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"); diff -r eb79a7c355bf -r b93f525c9244 mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h --- 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(); diff -r eb79a7c355bf -r b93f525c9244 mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp --- 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; } diff -r eb79a7c355bf -r b93f525c9244 mpviewplugins/mpdetailsviewplugin/inc/mpdetailssharedialog.h --- 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 #include -#include +#include #include "mpsharedata.h" class QGraphicsWebView; diff -r eb79a7c355bf -r b93f525c9244 musicwidgetplugin/rom/musicwidgetplugin.iby --- 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 diff -r eb79a7c355bf -r b93f525c9244 tsrc/mpfetchertestapp/inc/mpfetchertestappview.h --- 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(); diff -r eb79a7c355bf -r b93f525c9244 tsrc/mpfetchertestapp/src/mpfetchertestappview.cpp --- 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 #include "mpfetchertestappview.h" +#include +#include +#include +#include + 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); + } +}