# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1273841393 -10800 # Node ID 3ec52facab4d65375a30be9ece33845cfa0b044d # Parent ecf06a08d4d917ec28903a88c7e5276023a23890 Revision: 201017 Kit: 201019 diff -r ecf06a08d4d9 -r 3ec52facab4d app/app.pro --- a/app/app.pro Mon May 03 12:29:20 2010 +0300 +++ b/app/app.pro Fri May 14 15:49:53 2010 +0300 @@ -110,5 +110,7 @@ " DATATYPE { priority=EDataTypePrioritySystem; type=\"audio/x-wav\"; }," \ " DATATYPE { priority=EDataTypePrioritySystem; type=\"audio/x-au\"; }," \ " DATATYPE { priority=EDataTypePrioritySystem; type=\"audio/au\"; }, " \ -" DATATYPE { priority=EDataTypePrioritySystem; type=\"application/vnd.nokia.ringing-tone\"; }" \ +" DATATYPE { priority=EDataTypePrioritySystem; type=\"application/vnd.nokia.ringing-tone\"; }, " \ +" DATATYPE { priority=EDataTypePrioritySystem; type=\"audio/x-mpegurl\"; }, " \ +" DATATYPE { priority=EDataTypePrioritySystem; type=\"audio/mpegurl\"; }" \ " };" \ \ No newline at end of file diff -r ecf06a08d4d9 -r 3ec52facab4d app/src/mpmainwindow.cpp --- a/app/src/mpmainwindow.cpp Mon May 03 12:29:20 2010 +0300 +++ b/app/src/mpmainwindow.cpp Fri May 14 15:49:53 2010 +0300 @@ -137,7 +137,7 @@ activateView(CollectionView); connect(this, SIGNAL( orientationChanged( Qt::Orientation ) ), SLOT( switchView( Qt::Orientation ) ) ); - connect( engine, SIGNAL( libraryRefreshed() ), SLOT( handleLibraryUpdated() ) ); + connect( engine, SIGNAL( libraryUpdated() ), SLOT( handleLibraryUpdated() ) ); engine->checkForSystemEvents(); loadView( PlaybackView ); } @@ -293,7 +293,7 @@ loadView(PlaybackView, MpCommon::FetchView ); MpViewBase* playbackView = reinterpret_cast(mPlaybackViewPlugin->getView()); connect(playbackView, SIGNAL(songSelected(QString)), mMusicServices, SLOT(itemSelected(QString))); - connect( engine, SIGNAL( libraryRefreshed() ), this, SLOT( handleLibraryUpdated() ) ); + connect( engine, SIGNAL( libraryUpdated() ), this, SLOT( handleLibraryUpdated() ) ); engine->checkForSystemEvents(); break; } diff -r ecf06a08d4d9 -r 3ec52facab4d inc/mpengine.h --- a/inc/mpengine.h Mon May 03 12:29:20 2010 +0300 +++ b/inc/mpengine.h Fri May 14 15:49:53 2010 +0300 @@ -26,7 +26,7 @@ class QStringList; class QTranslator; -class HbProgressDialog; +class HbPopup; class MpMpxHarvesterFrameworkWrapper; class MpSongScanner; class MpMediaKeyHandler; @@ -67,7 +67,6 @@ void close(); // Harvester related - void refreshLibrary(); bool verifyUsbBlocking( bool showMessage = false ); void checkForSystemEvents(); @@ -97,8 +96,8 @@ signals: // Harvester related - void libraryAboutToRefresh(); - void libraryRefreshed(); + void libraryAboutToUpdate(); + void libraryUpdated(); void usbBlocked( bool blocked ); // Collection related @@ -112,11 +111,12 @@ public slots: // Harvester related + void refreshLibrary(); void handleScanStarted(); void handleScanEnded( int count, int error ); void handleDiskEvent( MpxDiskEvents event ); void handleUsbEvent( MpxUsbEvents event ); - void handleBlockingNoteClosing(); + void handleOutstandingNoteClosing(); // Collection related void reopenCollection(); @@ -144,6 +144,7 @@ void changeUsbBlockingState( UsbBlockingState state ); void launchBlockingNote(); + void setOutstandingPopup( HbPopup *popup ); private: @@ -153,7 +154,7 @@ MpMpxHarvesterFrameworkWrapper *mMpxHarvesterWrapper; // Own MpSongScanner *mSongScanner; // Own MpMediaKeyHandler *mMediaKeyHandler; // Own - HbProgressDialog *mUsbBlockingNote; // Own + HbPopup *mUsbOutstandingNote; // Own // Collection related MpMpxCollectionFrameworkWrapper *mMpxCollectionWrapper; //Own diff -r ecf06a08d4d9 -r 3ec52facab4d mpengine/bwins/mpengineu.def --- a/mpengine/bwins/mpengineu.def Mon May 03 12:29:20 2010 +0300 +++ b/mpengine/bwins/mpengineu.def Fri May 14 15:49:53 2010 +0300 @@ -9,17 +9,17 @@ ?saveToCurrentPlaylist@MpEngine@@QAEXAAV?$QList@H@@PAVMpMpxCollectionData@@@Z @ 8 NONAME ; void MpEngine::saveToCurrentPlaylist(class QList &, class MpMpxCollectionData *) ?getStaticMetaObject@MpEngine@@SAABUQMetaObject@@XZ @ 9 NONAME ; struct QMetaObject const & MpEngine::getStaticMetaObject(void) ?renamePlaylist@MpEngine@@QAEXAAVQString@@@Z @ 10 NONAME ; void MpEngine::renamePlaylist(class QString &) - ?setRepeat@MpEngine@@QAEX_N@Z @ 11 NONAME ; void MpEngine::setRepeat(bool) - ?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) - ?playlistsRenamed@MpEngine@@IAEX_N@Z @ 15 NONAME ; void MpEngine::playlistsRenamed(bool) - ?playPause@MpEngine@@QAEXXZ @ 16 NONAME ; void MpEngine::playPause(void) - ?checkForSystemEvents@MpEngine@@QAEXXZ @ 17 NONAME ; void MpEngine::checkForSystemEvents(void) - ?renamePlaylist@MpEngine@@QAEXAAVQString@@H@Z @ 18 NONAME ; void MpEngine::renamePlaylist(class QString &, int) - ?handleUsbMtpEndEvent@MpEngine@@AAEXXZ @ 19 NONAME ; void MpEngine::handleUsbMtpEndEvent(void) - ?playEmbedded@MpEngine@@QAEXABVXQSharableFile@@@Z @ 20 NONAME ; void MpEngine::playEmbedded(class XQSharableFile const &) - ?libraryAboutToRefresh@MpEngine@@IAEXXZ @ 21 NONAME ; void MpEngine::libraryAboutToRefresh(void) + ?libraryUpdated@MpEngine@@IAEXXZ @ 11 NONAME ; void MpEngine::libraryUpdated(void) + ?setRepeat@MpEngine@@QAEX_N@Z @ 12 NONAME ; void MpEngine::setRepeat(bool) + ?collectionData@MpEngine@@QAEPAVMpMpxCollectionData@@XZ @ 13 NONAME ; class MpMpxCollectionData * MpEngine::collectionData(void) + ?createPlaylist@MpEngine@@QAEXAAVQString@@AAV?$QList@H@@PAVMpMpxCollectionData@@@Z @ 14 NONAME ; void MpEngine::createPlaylist(class QString &, class QList &, class MpMpxCollectionData *) + ?collectionPlaylistOpened@MpEngine@@IAEXXZ @ 15 NONAME ; void MpEngine::collectionPlaylistOpened(void) + ?playlistsRenamed@MpEngine@@IAEX_N@Z @ 16 NONAME ; void MpEngine::playlistsRenamed(bool) + ?playPause@MpEngine@@QAEXXZ @ 17 NONAME ; void MpEngine::playPause(void) + ?checkForSystemEvents@MpEngine@@QAEXXZ @ 18 NONAME ; void MpEngine::checkForSystemEvents(void) + ?renamePlaylist@MpEngine@@QAEXAAVQString@@H@Z @ 19 NONAME ; void MpEngine::renamePlaylist(class QString &, int) + ?handleUsbMtpEndEvent@MpEngine@@AAEXXZ @ 20 NONAME ; void MpEngine::handleUsbMtpEndEvent(void) + ?playEmbedded@MpEngine@@QAEXABVXQSharableFile@@@Z @ 21 NONAME ; void MpEngine::playEmbedded(class XQSharableFile const &) ?skipForward@MpEngine@@QAEXXZ @ 22 NONAME ; void MpEngine::skipForward(void) ?staticMetaObject@MpEngine@@2UQMetaObject@@B @ 23 NONAME ; struct QMetaObject const MpEngine::staticMetaObject ?setShuffle@MpEngine@@QAEX_N@Z @ 24 NONAME ; void MpEngine::setShuffle(bool) @@ -32,35 +32,36 @@ ?handleScanStarted@MpEngine@@QAEXXZ @ 31 NONAME ; void MpEngine::handleScanStarted(void) ?initialize@MpEngine@@QAEXW4MpViewMode@MpCommon@@VTUid@@@Z @ 32 NONAME ; void MpEngine::initialize(enum MpCommon::MpViewMode, class TUid) ?playbackData@MpEngine@@QAEPAVMpPlaybackData@@XZ @ 33 NONAME ; class MpPlaybackData * MpEngine::playbackData(void) - ?stop@MpEngine@@QAEXXZ @ 34 NONAME ; void MpEngine::stop(void) - ?back@MpEngine@@QAEXXZ @ 35 NONAME ; void MpEngine::back(void) - ?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) - ?handleUsbEvent@MpEngine@@QAEXW4MpxUsbEvents@@@Z @ 39 NONAME ; void MpEngine::handleUsbEvent(enum MpxUsbEvents) - ?songsDeleted@MpEngine@@IAEX_N@Z @ 40 NONAME ; void MpEngine::songsDeleted(bool) - ?handleUsbMassStorageStartEvent@MpEngine@@AAEXXZ @ 41 NONAME ; void MpEngine::handleUsbMassStorageStartEvent(void) - ?qt_metacast@MpEngine@@UAEPAXPBD@Z @ 42 NONAME ; void * MpEngine::qt_metacast(char const *) - ?handleDiskEvent@MpEngine@@QAEXW4MpxDiskEvents@@@Z @ 43 NONAME ; void MpEngine::handleDiskEvent(enum MpxDiskEvents) - ?verifyUsbBlocking@MpEngine@@QAE_N_N@Z @ 44 NONAME ; bool MpEngine::verifyUsbBlocking(bool) - ?saveToPlaylist@MpEngine@@QAEXHAAV?$QList@H@@@Z @ 45 NONAME ; void MpEngine::saveToPlaylist(int, class QList &) - ?handleUsbMassStorageEndEvent@MpEngine@@AAEXXZ @ 46 NONAME ; void MpEngine::handleUsbMassStorageEndEvent(void) - ?usbBlocked@MpEngine@@IAEX_N@Z @ 47 NONAME ; void MpEngine::usbBlocked(bool) - ??0MpEngine@@AAE@XZ @ 48 NONAME ; MpEngine::MpEngine(void) - ?handleUsbMtpNotActive@MpEngine@@AAEXXZ @ 49 NONAME ; void MpEngine::handleUsbMtpNotActive(void) - ?libraryRefreshed@MpEngine@@IAEXXZ @ 50 NONAME ; void MpEngine::libraryRefreshed(void) - ?tr@MpEngine@@SA?AVQString@@PBD0H@Z @ 51 NONAME ; class QString MpEngine::tr(char const *, char const *, int) - ?trUtf8@MpEngine@@SA?AVQString@@PBD0@Z @ 52 NONAME ; class QString MpEngine::trUtf8(char const *, char const *) - ?findPlaylists@MpEngine@@QAEXAAVQStringList@@@Z @ 53 NONAME ; void MpEngine::findPlaylists(class QStringList &) - ?close@MpEngine@@QAEXXZ @ 54 NONAME ; void MpEngine::close(void) - ?isolatedCollectionOpened@MpEngine@@IAEXPAVMpMpxCollectionData@@@Z @ 55 NONAME ; void MpEngine::isolatedCollectionOpened(class MpMpxCollectionData *) - ?handleScanEnded@MpEngine@@QAEXHH@Z @ 56 NONAME ; void MpEngine::handleScanEnded(int, int) - ?previewItem@MpEngine@@QAEXH@Z @ 57 NONAME ; void MpEngine::previewItem(int) - ?skipBackward@MpEngine@@QAEXXZ @ 58 NONAME ; void MpEngine::skipBackward(void) - ??1MpEngine@@UAE@XZ @ 59 NONAME ; MpEngine::~MpEngine(void) - ??_EMpEngine@@UAE@I@Z @ 60 NONAME ; MpEngine::~MpEngine(unsigned int) - ?changeUsbBlockingState@MpEngine@@AAEXW4UsbBlockingState@1@@Z @ 61 NONAME ; void MpEngine::changeUsbBlockingState(enum MpEngine::UsbBlockingState) - ?handleBlockingNoteClosing@MpEngine@@QAEXXZ @ 62 NONAME ; void MpEngine::handleBlockingNoteClosing(void) - ?deleteSongs@MpEngine@@QAEXAAV?$QList@H@@@Z @ 63 NONAME ; void MpEngine::deleteSongs(class QList &) - ?reorderPlaylist@MpEngine@@QAEXHHHH@Z @ 64 NONAME ; void MpEngine::reorderPlaylist(int, int, int, int) + ?handleOutstandingNoteClosing@MpEngine@@QAEXXZ @ 34 NONAME ; void MpEngine::handleOutstandingNoteClosing(void) + ?stop@MpEngine@@QAEXXZ @ 35 NONAME ; void MpEngine::stop(void) + ?setOutstandingPopup@MpEngine@@AAEXPAVHbPopup@@@Z @ 36 NONAME ; void MpEngine::setOutstandingPopup(class HbPopup *) + ?back@MpEngine@@QAEXXZ @ 37 NONAME ; void MpEngine::back(void) + ?libraryAboutToUpdate@MpEngine@@IAEXXZ @ 38 NONAME ; void MpEngine::libraryAboutToUpdate(void) + ?openCollection@MpEngine@@QAEXW4TCollectionContext@@@Z @ 39 NONAME ; void MpEngine::openCollection(enum TCollectionContext) + ?trUtf8@MpEngine@@SA?AVQString@@PBD0H@Z @ 40 NONAME ; class QString MpEngine::trUtf8(char const *, char const *, int) + ?reopenCollection@MpEngine@@QAEXXZ @ 41 NONAME ; void MpEngine::reopenCollection(void) + ?handleUsbEvent@MpEngine@@QAEXW4MpxUsbEvents@@@Z @ 42 NONAME ; void MpEngine::handleUsbEvent(enum MpxUsbEvents) + ?songsDeleted@MpEngine@@IAEX_N@Z @ 43 NONAME ; void MpEngine::songsDeleted(bool) + ?handleUsbMassStorageStartEvent@MpEngine@@AAEXXZ @ 44 NONAME ; void MpEngine::handleUsbMassStorageStartEvent(void) + ?qt_metacast@MpEngine@@UAEPAXPBD@Z @ 45 NONAME ; void * MpEngine::qt_metacast(char const *) + ?handleDiskEvent@MpEngine@@QAEXW4MpxDiskEvents@@@Z @ 46 NONAME ; void MpEngine::handleDiskEvent(enum MpxDiskEvents) + ?verifyUsbBlocking@MpEngine@@QAE_N_N@Z @ 47 NONAME ; bool MpEngine::verifyUsbBlocking(bool) + ?saveToPlaylist@MpEngine@@QAEXHAAV?$QList@H@@@Z @ 48 NONAME ; void MpEngine::saveToPlaylist(int, class QList &) + ?handleUsbMassStorageEndEvent@MpEngine@@AAEXXZ @ 49 NONAME ; void MpEngine::handleUsbMassStorageEndEvent(void) + ?usbBlocked@MpEngine@@IAEX_N@Z @ 50 NONAME ; void MpEngine::usbBlocked(bool) + ??0MpEngine@@AAE@XZ @ 51 NONAME ; MpEngine::MpEngine(void) + ?handleUsbMtpNotActive@MpEngine@@AAEXXZ @ 52 NONAME ; void MpEngine::handleUsbMtpNotActive(void) + ?tr@MpEngine@@SA?AVQString@@PBD0H@Z @ 53 NONAME ; class QString MpEngine::tr(char const *, char const *, int) + ?trUtf8@MpEngine@@SA?AVQString@@PBD0@Z @ 54 NONAME ; class QString MpEngine::trUtf8(char const *, char const *) + ?findPlaylists@MpEngine@@QAEXAAVQStringList@@@Z @ 55 NONAME ; void MpEngine::findPlaylists(class QStringList &) + ?close@MpEngine@@QAEXXZ @ 56 NONAME ; void MpEngine::close(void) + ?isolatedCollectionOpened@MpEngine@@IAEXPAVMpMpxCollectionData@@@Z @ 57 NONAME ; void MpEngine::isolatedCollectionOpened(class MpMpxCollectionData *) + ?handleScanEnded@MpEngine@@QAEXHH@Z @ 58 NONAME ; void MpEngine::handleScanEnded(int, int) + ?previewItem@MpEngine@@QAEXH@Z @ 59 NONAME ; void MpEngine::previewItem(int) + ?skipBackward@MpEngine@@QAEXXZ @ 60 NONAME ; void MpEngine::skipBackward(void) + ??1MpEngine@@UAE@XZ @ 61 NONAME ; MpEngine::~MpEngine(void) + ??_EMpEngine@@UAE@I@Z @ 62 NONAME ; MpEngine::~MpEngine(unsigned int) + ?changeUsbBlockingState@MpEngine@@AAEXW4UsbBlockingState@1@@Z @ 63 NONAME ; void MpEngine::changeUsbBlockingState(enum MpEngine::UsbBlockingState) + ?deleteSongs@MpEngine@@QAEXAAV?$QList@H@@@Z @ 64 NONAME ; void MpEngine::deleteSongs(class QList &) + ?reorderPlaylist@MpEngine@@QAEXHHHH@Z @ 65 NONAME ; void MpEngine::reorderPlaylist(int, int, int, int) diff -r ecf06a08d4d9 -r 3ec52facab4d mpengine/eabi/mpengineu.def --- a/mpengine/eabi/mpengineu.def Mon May 03 12:29:20 2010 +0300 +++ b/mpengine/eabi/mpengineu.def Fri May 14 15:49:53 2010 +0300 @@ -18,15 +18,15 @@ _ZN8MpEngine14collectionDataEv @ 17 NONAME _ZN8MpEngine14createPlaylistER7QStringR5QListIiEP19MpMpxCollectionData @ 18 NONAME _ZN8MpEngine14handleUsbEventE12MpxUsbEvents @ 19 NONAME - _ZN8MpEngine14openCollectionE18TCollectionContext @ 20 NONAME - _ZN8MpEngine14refreshLibraryEv @ 21 NONAME - _ZN8MpEngine14renamePlaylistER7QString @ 22 NONAME - _ZN8MpEngine14renamePlaylistER7QStringi @ 23 NONAME - _ZN8MpEngine14saveToPlaylistEiR5QListIiE @ 24 NONAME - _ZN8MpEngine15handleDiskEventE13MpxDiskEvents @ 25 NONAME - _ZN8MpEngine15handleScanEndedEii @ 26 NONAME - _ZN8MpEngine15reorderPlaylistEiiii @ 27 NONAME - _ZN8MpEngine16libraryRefreshedEv @ 28 NONAME + _ZN8MpEngine14libraryUpdatedEv @ 20 NONAME + _ZN8MpEngine14openCollectionE18TCollectionContext @ 21 NONAME + _ZN8MpEngine14refreshLibraryEv @ 22 NONAME + _ZN8MpEngine14renamePlaylistER7QString @ 23 NONAME + _ZN8MpEngine14renamePlaylistER7QStringi @ 24 NONAME + _ZN8MpEngine14saveToPlaylistEiR5QListIiE @ 25 NONAME + _ZN8MpEngine15handleDiskEventE13MpxDiskEvents @ 26 NONAME + _ZN8MpEngine15handleScanEndedEii @ 27 NONAME + _ZN8MpEngine15reorderPlaylistEiiii @ 28 NONAME _ZN8MpEngine16playlistsRenamedEb @ 29 NONAME _ZN8MpEngine16reopenCollectionEv @ 30 NONAME _ZN8MpEngine16staticMetaObjectE @ 31 NONAME DATA 16 @@ -35,32 +35,33 @@ _ZN8MpEngine18launchBlockingNoteEv @ 34 NONAME _ZN8MpEngine18openCollectionItemEi @ 35 NONAME _ZN8MpEngine19getStaticMetaObjectEv @ 36 NONAME - _ZN8MpEngine20checkForSystemEventsEv @ 37 NONAME - _ZN8MpEngine20handleUsbMtpEndEventEv @ 38 NONAME - _ZN8MpEngine21handleUsbMtpNotActiveEv @ 39 NONAME - _ZN8MpEngine21libraryAboutToRefreshEv @ 40 NONAME - _ZN8MpEngine21saveToCurrentPlaylistER5QListIiEP19MpMpxCollectionData @ 41 NONAME - _ZN8MpEngine22changeUsbBlockingStateENS_16UsbBlockingStateE @ 42 NONAME - _ZN8MpEngine22handleUsbMtpStartEventEv @ 43 NONAME - _ZN8MpEngine22openIsolatedCollectionE18TCollectionContext @ 44 NONAME - _ZN8MpEngine24collectionPlaylistOpenedEv @ 45 NONAME - _ZN8MpEngine24isolatedCollectionOpenedEP19MpMpxCollectionData @ 46 NONAME - _ZN8MpEngine25handleBlockingNoteClosingEv @ 47 NONAME + _ZN8MpEngine19setOutstandingPopupEP7HbPopup @ 37 NONAME + _ZN8MpEngine20checkForSystemEventsEv @ 38 NONAME + _ZN8MpEngine20handleUsbMtpEndEventEv @ 39 NONAME + _ZN8MpEngine20libraryAboutToUpdateEv @ 40 NONAME + _ZN8MpEngine21handleUsbMtpNotActiveEv @ 41 NONAME + _ZN8MpEngine21saveToCurrentPlaylistER5QListIiEP19MpMpxCollectionData @ 42 NONAME + _ZN8MpEngine22changeUsbBlockingStateENS_16UsbBlockingStateE @ 43 NONAME + _ZN8MpEngine22handleUsbMtpStartEventEv @ 44 NONAME + _ZN8MpEngine22openIsolatedCollectionE18TCollectionContext @ 45 NONAME + _ZN8MpEngine24collectionPlaylistOpenedEv @ 46 NONAME + _ZN8MpEngine24isolatedCollectionOpenedEP19MpMpxCollectionData @ 47 NONAME _ZN8MpEngine25releaseIsolatedCollectionEv @ 48 NONAME - _ZN8MpEngine28handleUsbMassStorageEndEventEv @ 49 NONAME - _ZN8MpEngine30handleUsbMassStorageStartEventEv @ 50 NONAME - _ZN8MpEngine4backEv @ 51 NONAME - _ZN8MpEngine4stopEv @ 52 NONAME - _ZN8MpEngine5closeEv @ 53 NONAME - _ZN8MpEngine8instanceEv @ 54 NONAME - _ZN8MpEngine9playPauseEv @ 55 NONAME - _ZN8MpEngine9setRepeatEb @ 56 NONAME - _ZN8MpEngineC1Ev @ 57 NONAME - _ZN8MpEngineC2Ev @ 58 NONAME - _ZN8MpEngineD0Ev @ 59 NONAME - _ZN8MpEngineD1Ev @ 60 NONAME - _ZN8MpEngineD2Ev @ 61 NONAME - _ZNK8MpEngine10metaObjectEv @ 62 NONAME - _ZTI8MpEngine @ 63 NONAME - _ZTV8MpEngine @ 64 NONAME + _ZN8MpEngine28handleOutstandingNoteClosingEv @ 49 NONAME + _ZN8MpEngine28handleUsbMassStorageEndEventEv @ 50 NONAME + _ZN8MpEngine30handleUsbMassStorageStartEventEv @ 51 NONAME + _ZN8MpEngine4backEv @ 52 NONAME + _ZN8MpEngine4stopEv @ 53 NONAME + _ZN8MpEngine5closeEv @ 54 NONAME + _ZN8MpEngine8instanceEv @ 55 NONAME + _ZN8MpEngine9playPauseEv @ 56 NONAME + _ZN8MpEngine9setRepeatEb @ 57 NONAME + _ZN8MpEngineC1Ev @ 58 NONAME + _ZN8MpEngineC2Ev @ 59 NONAME + _ZN8MpEngineD0Ev @ 60 NONAME + _ZN8MpEngineD1Ev @ 61 NONAME + _ZN8MpEngineD2Ev @ 62 NONAME + _ZNK8MpEngine10metaObjectEv @ 63 NONAME + _ZTI8MpEngine @ 64 NONAME + _ZTV8MpEngine @ 65 NONAME diff -r ecf06a08d4d9 -r 3ec52facab4d mpengine/src/mpengine.cpp --- a/mpengine/src/mpengine.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpengine/src/mpengine.cpp Fri May 14 15:49:53 2010 +0300 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -66,7 +67,7 @@ */ /*! - \fn void libraryRefreshed() + \fn void libraryUpdated() This signal is emitted when MpSongScannerHelper ends scanning, or USB-MTP Synchronization finishes. @@ -182,7 +183,7 @@ : mMpxHarvesterWrapper(0), mSongScanner(0), mMediaKeyHandler(0), - mUsbBlockingNote(0), + mUsbOutstandingNote(0), mMpxCollectionWrapper(0), mMpxPlaybackWrapper(0), mMpTranslator(0), @@ -284,8 +285,8 @@ mSongScanner = 0; delete mMediaKeyHandler; mMediaKeyHandler = 0; - delete mUsbBlockingNote; - mUsbBlockingNote = 0; + delete mUsbOutstandingNote; + mUsbOutstandingNote = 0; delete mMpxPlaybackWrapper; mMpxPlaybackWrapper = 0; delete mMpxHarvesterWrapper; @@ -301,20 +302,6 @@ */ /*! - Refresh library by starting the scan. - If scanning is already ongoing, this request is ignored. - */ -void MpEngine::refreshLibrary() -{ - TX_ENTRY - if ( !verifyUsbBlocking( true ) ) { - emit libraryAboutToRefresh(); - mSongScanner->scan(); - } - TX_EXIT -} - -/*! \ Used to verify if an action can be executed depending on USB blocking state. If not, a notification note might be displayed. @@ -326,10 +313,11 @@ if ( mUsbBlockingState == USB_Connected ) { result = true; if ( showMessage ) { - HbMessageBox dialog ( HbMessageBox::MessageTypeInformation ); - dialog.setText( QString( tr( "USB connection in progress. Cannot proceed with operation" ) ) ); - dialog.setModal( true ); - dialog.exec(); + HbMessageBox *dialog = new HbMessageBox( HbMessageBox::MessageTypeInformation ); + dialog->setText( hbTrId( "txt_mus_info_usb_conn_in_progress" ) ); + dialog->setModal( true ); + setOutstandingPopup( dialog ); + mUsbOutstandingNote->show();; } } TX_EXIT @@ -348,6 +336,20 @@ } /*! + Slot to be called to start Refresh library process. + If scanning is already ongoing, this request is ignored. + */ +void MpEngine::refreshLibrary() +{ + TX_ENTRY + if ( !verifyUsbBlocking( true ) ) { + emit libraryAboutToUpdate(); + mSongScanner->scan(); + } + TX_EXIT +} + +/*! Slot to be called when song scanning starts. */ void MpEngine::handleScanStarted() { @@ -364,7 +366,7 @@ Q_UNUSED( count ); Q_UNUSED( error ); mMediaKeyHandler->setEnabled(true); - emit libraryRefreshed(); + emit libraryUpdated(); TX_EXIT } @@ -383,7 +385,7 @@ break; case DiskRemoved: if ( mUsbBlockingState != USB_Synchronizing ) { - emit libraryRefreshed(); + emit libraryUpdated(); } break; case DiskInserted: @@ -391,7 +393,7 @@ refreshLibrary(); } else if ( mUsbBlockingState == USB_Connected ) { - emit libraryRefreshed(); + emit libraryUpdated(); } break; default: @@ -428,12 +430,12 @@ } /*! - Slot to be called when mUsbBlockingNote is about to close. + Slot to be called when mUsbOutstandingNote is about to close. */ -void MpEngine::handleBlockingNoteClosing() +void MpEngine::handleOutstandingNoteClosing() { TX_ENTRY - mUsbBlockingNote = 0; + mUsbOutstandingNote = 0; TX_EXIT } @@ -463,18 +465,20 @@ changeUsbBlockingState( USB_NotConnected ); emit usbBlocked(false); - - if ( mUsbBlockingNote ) { - mUsbBlockingNote->close(); - } - HbMessageBox promptRefresh( HbMessageBox::MessageTypeQuestion ); - promptRefresh.setText( QString( tr( "List may need refreshing due to recent USB synchronisation. Refresh now?" ) ) ); - promptRefresh.setTimeout( HbPopup::NoTimeout ); - promptRefresh.setModal( true ); - HbAction *action = promptRefresh.exec(); - if ( action == promptRefresh.primaryAction() ) { - refreshLibrary(); - } + + HbAction *action; + HbMessageBox *promptRefresh = new HbMessageBox( HbMessageBox::MessageTypeQuestion ); + promptRefresh->setText( hbTrId( "txt_mus_info_music_may_need_to_be_refreshed" ) ); + promptRefresh->setTimeout( HbPopup::NoTimeout ); + promptRefresh->setModal( true ); + promptRefresh->clearActions(); + action = new HbAction( hbTrId( "txt_common_button_yes" ) ); + connect( action, SIGNAL( triggered() ), this, SLOT( refreshLibrary() ) ); + promptRefresh->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_no" ) ); + promptRefresh->addAction( action ); + setOutstandingPopup( promptRefresh ); + mUsbOutstandingNote->show(); TX_EXIT } @@ -490,7 +494,7 @@ emit usbBlocked(true); //Cancel any ongoing operation. - emit libraryAboutToRefresh(); + emit libraryAboutToUpdate(); launchBlockingNote(); @@ -508,11 +512,11 @@ changeUsbBlockingState( USB_NotConnected ); emit usbBlocked(false); - if ( mUsbBlockingNote ) { - mUsbBlockingNote->close(); + if ( mUsbOutstandingNote ) { + mUsbOutstandingNote->close(); } if ( mPreviousUsbState == USB_Synchronizing ) { - emit libraryRefreshed(); + emit libraryUpdated(); } TX_EXIT } @@ -547,19 +551,38 @@ void MpEngine::launchBlockingNote() { TX_ENTRY - if ( !mUsbBlockingNote ) { - mUsbBlockingNote = new HbProgressDialog( HbProgressDialog::WaitDialog ); - mUsbBlockingNote->setModal( true ); - mUsbBlockingNote->setPrimaryAction( 0 ); - mUsbBlockingNote->setTextAlignment( Qt::AlignCenter ); - mUsbBlockingNote->setAttribute( Qt::WA_DeleteOnClose ); - mUsbBlockingNote->setDismissPolicy( HbPopup::NoDismiss ); - mUsbBlockingNote->setText( QString( tr( "USB connection in progress" ) ) ); - connect( mUsbBlockingNote, SIGNAL( aboutToClose() ), this, SLOT( handleBlockingNoteClosing() ) ); + + HbProgressDialog *usbBlockingNote = new HbProgressDialog( HbProgressDialog::WaitDialog ); + usbBlockingNote->setModal( true ); + if ( usbBlockingNote->actions().count() ) { + //Hide cancel action. + usbBlockingNote->actions().at( 0 )->setVisible( false ); } - - mUsbBlockingNote->show(); + usbBlockingNote->setDismissPolicy( HbPopup::NoDismiss ); + usbBlockingNote->setText( hbTrId( "txt_mus_info_usb_conn_in_progress" ) ); + setOutstandingPopup( usbBlockingNote ); + mUsbOutstandingNote->show(); + + TX_EXIT +} +/*! + \internal + sets \a popup as the current outstanding popup and cancels any other active popup. + */ +void MpEngine::setOutstandingPopup( HbPopup *popup ) +{ + TX_ENTRY + //Close previous popup (Normally blocking usb note) + if ( mUsbOutstandingNote ) { + disconnect( mUsbOutstandingNote, SIGNAL( aboutToClose() ), this, SLOT( handleOutstandingNoteClosing() ) ); + mUsbOutstandingNote->close(); + } + + //Set new outstanding popup + popup->setAttribute( Qt::WA_DeleteOnClose ); + connect( popup, SIGNAL( aboutToClose() ), this, SLOT( handleOutstandingNoteClosing() ) ); + mUsbOutstandingNote = popup; TX_EXIT } diff -r ecf06a08d4d9 -r 3ec52facab4d mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp --- a/mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp Fri May 14 15:49:53 2010 +0300 @@ -711,8 +711,13 @@ CMPXCollectionPath* path( iCollectionUtility->Collection().PathL() ); CleanupStack::PushL( path ); - for ( TInt i = 0; i < count; i++ ) { - path->SelectL( selection.at( i ) ); + if (count > 1) { + for ( TInt i = 0; i < count; i++ ){ + path->SelectL( selection.at( i ) ); + } + } + else { + path->Set( selection.at(0) ); } iCollectionUiHelper->DeleteL( *path, this ); CleanupStack::PopAndDestroy( path ); @@ -893,23 +898,30 @@ TMPXItemId collectionId( path->Id( 0 ) ); CleanupStack::PopAndDestroy( path ); - if ( collectionData->context() == ECollectionContextAlbums ) { + if ( ( collectionData->context() == ECollectionContextAlbums ) || + ( collectionData->context() == ECollectionContextArtistAlbums ) || + ( collectionData->context() == ECollectionContextArtists ) ) { for ( TInt i = 0; i < count; i++ ) { CMPXMedia* results; - CMPXMedia* album( containerArray->AtL( selection[i] ) ); + CMPXMedia* container( containerArray->AtL( selection[i] ) ); // Fetch the songs for the selected album - TMPXItemId albumId = album->ValueTObjectL( KMPXMediaGeneralId ); + TMPXItemId containerId = container->ValueTObjectL( KMPXMediaGeneralId ); CMPXMedia* findCriteria = CMPXMedia::NewL(); CleanupStack::PushL( findCriteria ); findCriteria->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); findCriteria->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); - findCriteria->SetTObjectValueL( KMPXMediaGeneralId, albumId ); + findCriteria->SetTObjectValueL( KMPXMediaGeneralId, containerId ); RArray attrs; CleanupClosePushL( attrs ); attrs.Append( TMPXAttribute( KMPXMediaIdGeneral, EMPXMediaGeneralTitle | EMPXMediaGeneralId ) ); - attrs.Append( KMPXMediaMusicAlbumTrack ); + if ( collectionData->context() == ECollectionContextArtists ){ + attrs.Append( KMPXMediaMusicArtist ); + } + else { + attrs.Append( KMPXMediaMusicAlbumTrack ); + } results = iCollectionUtility->Collection().FindAllL( *findCriteria, attrs.Array() ); CleanupStack::PopAndDestroy( &attrs ); CleanupStack::PopAndDestroy( findCriteria ); diff -r ecf06a08d4d9 -r 3ec52facab4d mpengine/src/mpsongscanner.cpp --- a/mpengine/src/mpsongscanner.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpengine/src/mpsongscanner.cpp Fri May 14 15:49:53 2010 +0300 @@ -113,7 +113,6 @@ title->setFontSpec(HbFontSpec(HbFontSpec::Primary)); mScanProgressNote->setHeadingWidget( title ); - mScanProgressNote->setTextAlignment( Qt::AlignCenter ); mScanProgressNote->setText( QString("") ); mScanProgressNote->setAttribute( Qt::WA_DeleteOnClose ); mScanProgressNote->show(); @@ -133,7 +132,8 @@ diskFullDialog->setIcon( HbIcon( QString("qtg_small_fail") ) ); diskFullDialog->setText( hbTrId( "txt_mus_title_refresh_cancelled" ) ); diskFullDialog->setTimeout( HbPopup::NoTimeout); - diskFullDialog->exec(); + diskFullDialog->setAttribute( Qt::WA_DeleteOnClose ); + diskFullDialog->show(); mScanning = false; } diff -r ecf06a08d4d9 -r 3ec52facab4d mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/src/unittest_mpmpxcollectionframeworkwrapper.cpp --- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/src/unittest_mpmpxcollectionframeworkwrapper.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/src/unittest_mpmpxcollectionframeworkwrapper.cpp Fri May 14 15:49:53 2010 +0300 @@ -588,7 +588,10 @@ { QList selection; selection.append(1); + mTest->deleteSongs(selection); + QCOMPARE(mTestPrivate->iCollectionUiHelper->iDelete, TBool(ETrue)); selection.append(3); + selection.append(4); selection.append(5); mTest->deleteSongs(selection); QCOMPARE(mTestPrivate->iCollectionUiHelper->iDelete, TBool(ETrue)); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/audioeffects/group/mpxaudioeffectengine.mmp --- a/mpserviceplugins/audioeffects/group/mpxaudioeffectengine.mmp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/audioeffects/group/mpxaudioeffectengine.mmp Fri May 14 15:49:53 2010 +0300 @@ -52,7 +52,6 @@ LIBRARY mediaclientaudio.lib LIBRARY loudnesseffect.lib LIBRARY audioequalizerutility.lib -LIBRARY equalizer.lib LIBRARY customcommandutility.lib LIBRARY mpxcommon.lib LIBRARY centralrepository.lib diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/audioeffects/src/mpxaudioeffectengine.cpp --- a/mpserviceplugins/audioeffects/src/mpxaudioeffectengine.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/audioeffects/src/mpxaudioeffectengine.cpp Fri May 14 15:49:53 2010 +0300 @@ -36,10 +36,10 @@ #include "mpxaudioeffectengine.h" +// Music setting const TUid KMPCenRepSettingsFeature = {0x10207C92}; const TUint32 KMPCenRepSettingPresetIdKey = 0x00000004; - // ================= MEMBER FUNCTIONS ======================= // ----------------------------------------------------------------------------- @@ -207,7 +207,7 @@ { if(!iStereoEffect) // If stereo widening is ON and not constructed { - TUint stereoLevel = 100; + TUint stereoLevel = 30; // cmdUtil ownership passed into new object MPX_TRAPD(error, iStereoEffect = CStereoWidening::NewL(*iMdaPlayer, @@ -220,7 +220,7 @@ } iStereoEffect->EnableL(); - TUint8 level = 100; + TUint8 level = 30; iStereoEffect->SetStereoWideningLevelL( level ); iStereoEffect->ApplyL(); } @@ -328,7 +328,7 @@ TInt presetId( KEqualizerPresetNone ); TRAP_IGNORE( { - CRepository* repository = CRepository::NewL( KMPCenRepSettingsFeature ); + CRepository* repository = CRepository::NewL( KMPCenRepSettingsFeature ); repository->Get( KMPCenRepSettingPresetIdKey, presetId ); delete repository; repository = NULL; diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/inc/mpxdbmanager.h --- a/mpserviceplugins/inc/mpxdbmanager.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/inc/mpxdbmanager.h Fri May 14 15:49:53 2010 +0300 @@ -340,21 +340,22 @@ * * @return ETrue if the dummy file is created successfully, EFalse otherwise */ - TBool BlockDiskSpace( TDriveUnit aDrive, TInt aOrigDbSize, TBool aIsMTPInUse = EFalse ); + TBool BlockDiskSpace( TInt aIndex, TBool aIsMTPInUse = EFalse ); /** * To copy db from regular drive to RAM * * @return ETrue if succeed - * @leave KErrDiskFull if there is any difficulty copying files + * + * No-operation if fails */ - TBool DoCopyDBToRamL( TDriveUnit aDrive, TBool aIsMTPInUse ); + TBool DoCopyDBToRam( TInt aIndex, TBool aIsMTPInUse ); /** * To copy db back regular drive from RAM * */ - void DoCopyDBFromRamL( TInt aIndex ); + void DoCopyDBFromRam( TInt aIndex ); /** * To replace dummy file with new content @@ -390,7 +391,7 @@ * @param aSize - On return, the total size of the databases on the RAM drive. * @return TInt System error. */ - TInt GetTotalRamDatabasesSize(TInt& aSize); + TInt GetTotalRamDatabasesSizeL(TInt& aSize); /** * Remove dummy file @@ -399,9 +400,7 @@ */ void RemoveDummyFile( TInt index ); - - -/** + /** * Check if disksapce is enough to operatte. If not, it leaves with KErrDiskFull * */ @@ -417,6 +416,12 @@ */ void DoCommitL(); + /** + * Create full path and filename on a specified drive unit. + * @param aDrive identifies the drive unit + */ + HBufC* CreateFullFilenameL(TDriveUnit aDrive); + protected: // Types typedef struct @@ -449,10 +454,9 @@ void CreateTablesL(RSqlDatabase& aDatabase, TBool aCorrupt); /** - * Opens a specified database. - * @param aDrive identifies the drive unit of the database to open + * Opens root database at C-drive. */ - void OpenDatabaseL(TDriveUnit aDrive); + void OpenRootDatabaseL(); /** * Creates a specified database. @@ -462,15 +466,27 @@ /** * Attached a specified database. - * @param aDrive identifies the drive unit of the database to attach + * @param aIndex Index to iDatabaseHandles */ - void AttachDatabaseL(TDriveUnit aDrive); + void AttachDatabaseL(TInt aIndex); /** * Detach a specified database. - * @param aDrive identifies the drive unit of the database to detach + * @param aIndex Index to iDatabaseHandles + */ + void DetachDatabaseL(TInt aIndex); + + /** + * Open database + * @param aIndex Index to iDatabaseHandles */ - void DetachDatabaseL(TDriveUnit aDrive); + void OpenDatabaseAtIndexL( TInt aIndex ); + + /** + * Close database + * @param aIndex Index to iDatabaseHandles + */ + void CloseDatabaseAtIndexL(TInt aIndex); /** * Create filename on a specified drive unit. diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/localaudio/src/mpxlocalaudioplayback.cpp --- a/mpserviceplugins/localaudio/src/mpxlocalaudioplayback.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/localaudio/src/mpxlocalaudioplayback.cpp Fri May 14 15:49:53 2010 +0300 @@ -50,8 +50,6 @@ // CONSTANTS const TUid KLocalPlaybackUid={0x101FFC06}; -//_LIT(KWmaExtension, ".wma"); -//_LIT(KRaExtension, ".ra"); // ============================ LOCAL FUNCTIONS ============================== @@ -435,10 +433,28 @@ { // Re-init audio effects MPX_DEBUG1("CMPXLocalAudioPlayback::CommandL EPbApplyEffect"); + iAudioEffects->DestroyAudioEffect(); if( ( aData == KAudioEffectsID || aData == KEqualizerID ) && ( EStateInitialised == iState ) ) { - TRAP_IGNORE( iAudioEffects->CreateAudioEffectsL() ); + TRAPD(err, iAudioEffects->CreateAudioEffectsL() ); + if(err) + { + MPX_DEBUG2("EPbApplyEffect err = %d", err); + TRAPD(err, iAudioEffects->CreateAudioEffectsL() ); + if(err) + { + MPX_DEBUG2("EPbApplyEffect again err = %d", err); + } + else + { + MPX_DEBUG1("EPbApplyEffect again set"); + } + } + else + { + MPX_DEBUG1("EPbApplyEffect set"); + } iAudioEffectsOn = ETrue; } break; diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/group/mpxm3uplaylistparsers.mmp --- a/mpserviceplugins/m3uplaylistplugin/group/mpxm3uplaylistparsers.mmp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/group/mpxm3uplaylistparsers.mmp Fri May 14 15:49:53 2010 +0300 @@ -29,7 +29,6 @@ VERSION 15.0 USERINCLUDE ../inc -USERINCLUDE ../../inc APP_LAYER_SYSTEMINCLUDE diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/group/mpxm3uplaylistplugin.mmp --- a/mpserviceplugins/m3uplaylistplugin/group/mpxm3uplaylistplugin.mmp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/group/mpxm3uplaylistplugin.mmp Fri May 14 15:49:53 2010 +0300 @@ -38,7 +38,6 @@ END USERINCLUDE ../inc -USERINCLUDE ../../inc APP_LAYER_SYSTEMINCLUDE SYSTEMINCLUDE /epoc32/include/ecom diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistdefs.h --- a/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistdefs.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistdefs.h Fri May 14 15:49:53 2010 +0300 @@ -55,6 +55,6 @@ EMPXM3UPlaylistLineTypeCorrupted = 4 }; -#endif // MPXM3UPLAYLISTDEFS_H - +#endif // MPXM3UPLAYLISTDEFS_H + // End of File diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistexporter.h --- a/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistexporter.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistexporter.h Fri May 14 15:49:53 2010 +0300 @@ -35,7 +35,7 @@ class CMPXM3uPlaylistExporter : public CActive { public: // Constructors and destructor - + /** * Two-phased constructor * @@ -58,7 +58,7 @@ */ IMPORT_C virtual ~CMPXM3uPlaylistExporter(); - + protected: /** @@ -68,22 +68,22 @@ * @param aObserver reference to the playlist plugin observer * @param aPlaylist playlist to be externalized * @param aStatus caller's request status - * @return object of constructed + * @return object of constructed */ IMPORT_C CMPXM3uPlaylistExporter( RFs* aFs, MMPXPlaylistPluginObserver* aObserver, const CMPXMedia& aPlaylist, TRequestStatus& aStatus ); - + /** * 2nd phase constructor * * @param aFilePath File path for where the playlist should be placed */ IMPORT_C virtual void ConstructL( - const TDesC& aFilePath); - + const TDesC& aFilePath); + /** * From CActive * Handles an active object's request completion event @@ -100,7 +100,7 @@ * Does a step of the task */ IMPORT_C virtual void DoTaskStep(); - + private: /** @@ -108,7 +108,7 @@ * the given medias have been processed */ void ExternalizeL(); - + /** * Populates iLines with HBufC8's each representing one line of playlist * file. @@ -135,7 +135,7 @@ /** * Creates a string containing iItem's relative or absolute path (path - * is relative if the audio clip is stored to the same directory, or + * is relative if the audio clip is stored to the same directory, or * it's sub-directories, as the playlist file). The stirng is stored to * iLine. */ @@ -166,7 +166,7 @@ * interface */ void NotifyClient(TInt aError); - + protected: // Data const CMPXMedia& iPlaylist; @@ -181,13 +181,13 @@ RFs* iFs; // not owned MMPXPlaylistPluginObserver* iObserver; // not owned - + TInt iCurrentMedia; TBool iMoreToDo; - TRequestStatus* iCallerStatus; + TRequestStatus* iCallerStatus; }; #endif // MPXM3UPLAYLISTIMPORTER_H + - diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistimporter.h --- a/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistimporter.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistimporter.h Fri May 14 15:49:53 2010 +0300 @@ -39,7 +39,7 @@ class CMPXM3uPlaylistImporter : public CActive { public: // Constructors and destructor - + /** * Two-phased constructor * @@ -63,7 +63,7 @@ * Destructor */ IMPORT_C virtual ~CMPXM3uPlaylistImporter(); - + protected: /** @@ -81,14 +81,14 @@ const CArrayFix& aTopCharacterSet, const CArrayFix& aAvailableCharacterSet, TRequestStatus& aStatus ); - + /** * 2nd phase constructor * * @param aPlaylistUri URI of the playlist file to be internalized */ IMPORT_C virtual void ConstructL( const TDesC& aPlaylistUri ); - + /** * From CActive * Handles an active object's request completion event @@ -105,7 +105,7 @@ * Does a step of the task */ IMPORT_C virtual void DoTaskStep(); - + /** * Does a step of the task, leave if there is an error */ @@ -117,7 +117,7 @@ * Reads data from playlist file to the buffer */ void ReadPlaylistFileToBufferL(); - + /** * Auto detects the character encoding from the supplied character * set @@ -132,7 +132,7 @@ const TDesC8& aSample, const CArrayFix& aCharacterSet, TUint& aCharSetId); - + /** * Parses the buffer where playlist file was read to. */ @@ -175,12 +175,12 @@ * compose CMPXMedia to be sent back to the client */ void ComposePlaylistL(); - + /** * Reset data members for after completing the current request */ void Cleanup(); - + /** * Notify client of the specified error through MMPXPlaylistPluginObserver * interface @@ -195,7 +195,7 @@ EMPXM3UParseWithAutoDetectEncoding, EMPXM3UComposePlaylistMedia }; - + protected: // Data HBufC* iBuffer; @@ -207,12 +207,12 @@ RFs* iFs; // not owned MMPXPlaylistPluginObserver* iObserver;// not owned - + TBool iExtendedFormat; - + TRequestStatus* iCallerStatus; - TInt iEndLineNumber; + TInt iEndLineNumber; TInt iCurrentLineNumber; TBool iMoreToDo; TBool iEndOfFile; @@ -220,15 +220,15 @@ CMPXMediaArray* iAutoEncodingPlaylistArray; TInt iAutoEncodingInvalidItems; - + CMPXMedia* iPlaylist; - + TMPXM3UImporterState iState; - + const CArrayFix& iTopCharacterSet; const CArrayFix& iAvailableCharacterSet; }; #endif // MPXM3UPLAYLISTIMPORTER_H + - diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistplugin.h --- a/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistplugin.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/inc/mpxm3uplaylistplugin.h Fri May 14 15:49:53 2010 +0300 @@ -33,12 +33,12 @@ /** * CMPXM3uPlaylistPlugin implements CMPXPlaylistPlugin to provide m3u -* playlist importing and exporting services. +* playlist importing and exporting services. */ NONSHARABLE_CLASS(CMPXM3uPlaylistPlugin) : public CMPXPlaylistPlugin { public: // Constructors and destructor - + /** * Two-phased constructor * @@ -51,10 +51,10 @@ * Destructor */ ~CMPXM3uPlaylistPlugin(); - + public: // from base clase CMPXPlaylistPlugin - /** + /** * Internalize a playlist * * @param aStatus caller's request status @@ -64,7 +64,7 @@ TRequestStatus& aStatus, const TDesC& aPlaylistUri); - /** + /** * Externalize a playlist * * @param aStatus caller's request status @@ -105,7 +105,7 @@ * cancel a client request */ void Cancel(); - + private: /** @@ -115,9 +115,9 @@ /** * 2nd phase constructor - */ + */ void ConstructL(); - + private: CMPXM3uPlaylistImporter* iImporter; @@ -127,5 +127,5 @@ }; #endif // MPXM3UPLAYLISTPLUGIN_H + - diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/src/mpxm3uplaylistimporter.cpp --- a/mpserviceplugins/m3uplaylistplugin/src/mpxm3uplaylistimporter.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/src/mpxm3uplaylistimporter.cpp Fri May 14 15:49:53 2010 +0300 @@ -36,7 +36,7 @@ // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- -// Constructor. +// Constructor. // ---------------------------------------------------------------------------- EXPORT_C CMPXM3uPlaylistImporter::CMPXM3uPlaylistImporter( RFs* aFs, @@ -71,19 +71,19 @@ iPlaylistFilePath.Set(aPlaylistUri); iAutoEncodingPlaylistArray = CMPXMediaArray::NewL(); - + *iCallerStatus = KRequestPending; TRequestStatus* status = &iStatus; *status = KRequestPending; - User::RequestComplete(status, KErrNone); + User::RequestComplete(status, KErrNone); SetActive(); - + MPX_DEBUG1("CMPXM3uPlaylistImporter::ConstructL() exiting"); } - + // ---------------------------------------------------------------------------- -// Two-phased constructor. +// Two-phased constructor. // ---------------------------------------------------------------------------- EXPORT_C CMPXM3uPlaylistImporter* CMPXM3uPlaylistImporter::NewL( RFs* aFs, @@ -91,7 +91,7 @@ const TDesC& aPlaylistUri, const CArrayFix& aTopCharacterSet, const CArrayFix& aAvailableCharacterSet, - TRequestStatus& aStatus ) + TRequestStatus& aStatus ) { CMPXM3uPlaylistImporter* self = new(ELeave)CMPXM3uPlaylistImporter( @@ -103,7 +103,7 @@ } // ---------------------------------------------------------------------------- -// Destructor. +// Destructor. // ---------------------------------------------------------------------------- // EXPORT_C CMPXM3uPlaylistImporter::~CMPXM3uPlaylistImporter() @@ -119,7 +119,7 @@ EXPORT_C void CMPXM3uPlaylistImporter::RunL() { MPX_DEBUG1("CMPXM3uPlaylistImporter::RunL"); - + if ( iMoreToDo && iStatus.Int() == KErrNone ) { DoTaskStep(); @@ -127,12 +127,12 @@ } else { - User::RequestComplete( iCallerStatus, iStatus.Int() ); - NotifyClient(iStatus.Int()); - Cleanup(); + User::RequestComplete( iCallerStatus, iStatus.Int() ); + NotifyClient(iStatus.Int()); + Cleanup(); } } - + // ---------------------------------------------------------------------------- // Implements cancellation of an outstanding request. // ---------------------------------------------------------------------------- @@ -142,12 +142,12 @@ MPX_DEBUG1("CMPXM3uPlaylistImporter::DoCancel"); TInt error( KErrCancel ); - + // notify client that the request has been cancelled NotifyClient(error); Cleanup(); - + if ( iCallerStatus ) { User::RequestComplete( iCallerStatus, error ); @@ -161,17 +161,17 @@ EXPORT_C void CMPXM3uPlaylistImporter::DoTaskStep() { MPX_DEBUG1("CMPXM3uPlaylistImporter::DoTaskStep()"); - + TRequestStatus* status = &iStatus; *status = KRequestPending; TInt error( KErrNone ); - + MPX_TRAP( error, DoTaskStepL() ); User::RequestComplete( status, error ); } - + // ---------------------------------------------------------------------------- // Performs one step of the task. Leaves when an error is encountered // ---------------------------------------------------------------------------- @@ -179,21 +179,21 @@ EXPORT_C void CMPXM3uPlaylistImporter::DoTaskStepL() { MPX_DEBUG1("CMPXM3uPlaylistImporter::DoTaskStepL()"); - + switch( iState ) - { + { case EMPXM3UReadBufferWithAutoDetectEncoding: { ReadPlaylistFileToBufferL(); iState = EMPXM3UParseWithAutoDetectEncoding; } break; - + case EMPXM3UParseWithAutoDetectEncoding: { ParsePlaylistBufferL( *iAutoEncodingPlaylistArray, iAutoEncodingInvalidItems ); - + // If at the moment, we know that there is at least one error parsing // with auto detect encoding, we don't need to proceed until end of // file anymore, this playlist file is concluded to be corrupted @@ -201,17 +201,17 @@ { delete iAutoEncodingPlaylistArray; iAutoEncodingPlaylistArray = NULL; - + User::Leave(KErrCorrupt); } // we've finished parsing with auto detect encoding we will return // the playlist parsed with auto encoding else if ( iEndOfFile ) - { + { iState = EMPXM3UComposePlaylistMedia; } - } + } break; case EMPXM3UComposePlaylistMedia: @@ -220,7 +220,7 @@ iMoreToDo = EFalse; } break; - + default: { User::Leave(KErrAbort); @@ -235,23 +235,23 @@ // void CMPXM3uPlaylistImporter::ReadPlaylistFileToBufferL() { - MPX_DEBUG2("Before reading playlist to buffer: heap size = %d", User::Heap().Size()); + MPX_DEBUG2("Before reading playlist to buffer: heap size = %d", User::Heap().Size()); delete iBuffer; iBuffer = NULL; - iBufferPtr.Set(KNullDesC); + iBufferPtr.Set(KNullDesC); // // leave with KErrNotFound if the playlist file does not exist - // + // if (!BaflUtils::FileExists(*iFs, iPlaylistFilePath)) { User::Leave(KErrNotFound); } - + TEntry entry; User::LeaveIfError(iFs->Entry(iPlaylistFilePath, entry)); - + HBufC* buffer = HBufC::NewLC(entry.iSize); TPtr ptr = buffer->Des(); @@ -271,13 +271,13 @@ TUint charSetId(0); TInt error = DetectCharacterSetL(*buf8, iTopCharacterSet, charSetId); MPX_DEBUG3("encoding detected using top character set is 0x%x, error %d", charSetId, error); - + // when we fail to detect the encoding, use all available character set in the // system to try again. If that also fails, abandon the operation. if (error) { User::LeaveIfError(DetectCharacterSetL(*buf8, iAvailableCharacterSet, charSetId)); - MPX_DEBUG2("encoding detected using available character set is 0x%x", charSetId); + MPX_DEBUG2("encoding detected using available character set is 0x%x", charSetId); } // read the whole file if the sample taken isn't the whole file @@ -286,7 +286,7 @@ User::LeaveIfError(iFs->ReadFileSection( iPlaylistFilePath, 0, ptr8, entry.iSize)); } - + // perform character conversion using the selected encoding TInt state(CCnvCharacterSetConverter::KStateDefault); TInt numOfUnconvertibleChars(0); @@ -306,14 +306,14 @@ charSetConv->PrepareToConvertToOrFromL(charSetId, iAvailableCharacterSet, *iFs); retVal = charSetConv->ConvertToUnicode(ptr, *buf8, state, numOfUnconvertibleChars); } - + if (retVal > 0 || numOfUnconvertibleChars > 0) { MPX_DEBUG3("Unable to find character encoding for the playlist file. retVal = %d, numOfUnconvertibleChars = %d", - retVal, numOfUnconvertibleChars); + retVal, numOfUnconvertibleChars); User::Leave(KErrNotSupported); } - + // remove the byte order mark (BOM) character prepended at the beginning // of the stream if encoded with unicode as per Unicode section 2.4 if ((charSetId == KCharacterSetIdentifierUnicodeLittle || @@ -323,20 +323,20 @@ { ptr.Delete(0,1); } - + iBuffer = buffer; iBufferPtr.Set(*iBuffer); - - CleanupStack::PopAndDestroy(2, buf8); // charSetConv & buf8 + + CleanupStack::PopAndDestroy(2, buf8); // charSetConv & buf8 CleanupStack::Pop(buffer); - + // brand new buffer which hasn't been read, reset iCurrentLineNumber and // iEndLineNumber, and iEndOfFile iCurrentLineNumber = 0; iEndLineNumber = KMPXM3UNumOfLinesToProcess; iEndOfFile = EFalse; - MPX_DEBUG2("After reading playlist to buffer: heap size = %d", User::Heap().Size()); + MPX_DEBUG2("After reading playlist to buffer: heap size = %d", User::Heap().Size()); } // ----------------------------------------------------------------------------- @@ -354,7 +354,7 @@ { User::Leave(KErrNotSupported); } - + TInt confidence(0); TInt highestConfidence(0); TUint charSetId(0); @@ -385,7 +385,7 @@ return KErrNone; } } - + // ----------------------------------------------------------------------------- // CMPXM3uPlaylistPlugin::ParsePlaylistBufferL // ----------------------------------------------------------------------------- @@ -402,7 +402,7 @@ aPlaylist.Count() < KMPXM3UPlaylistMaxItemCount && ReadNextLineL()) { - ProcessLineL(aPlaylist, aInvalidItemCount); + ProcessLineL(aPlaylist, aInvalidItemCount); } if ( aPlaylist.Count() == KMPXM3UPlaylistMaxItemCount ) @@ -414,7 +414,7 @@ // haven't finished processing all lines in the file, but have processed // KMPXM3UNumOfLinesToProcess number of lines. Set up iEndLineNumber for // the next iteration - // + // if ( !iEndOfFile && iCurrentLineNumber == iEndLineNumber ) { iEndLineNumber += KMPXM3UNumOfLinesToProcess; @@ -442,7 +442,7 @@ // Try to find line change TInt offset = iBufferPtr.FindF(KMPXM3ULineChange); - + if (offset == KErrNotFound) { // No line change was found --> last line had no line change @@ -454,7 +454,7 @@ { // Found line change TInt length(offset); - if ((offset > KMPXM3UNoOffset) && + if ((offset > KMPXM3UNoOffset) && (iBufferPtr[length - 1] == KMPXM3UCarriageReturn)) // magic { --length; @@ -473,7 +473,7 @@ iCurrentLineNumber++; return ETrue; } - + // ----------------------------------------------------------------------------- // CMPXM3uPlaylistImporter::ProcessLineL() // ----------------------------------------------------------------------------- @@ -497,7 +497,7 @@ // The file is in the extented format iExtendedFormat = ETrue; return; - } + } } if (!iItem) @@ -506,22 +506,22 @@ iItem->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); iItem->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong); } - + // Parse line and then decide what to do with it switch (ParseLineL(iItem, aInvalidItemCount)) { case EMPXM3UPlaylistLineTypeExtinf: // Continue to next round break; - + case EMPXM3UPlaylistLineTypePath: { // Line was a path => add item to playlist aPlaylist.AppendL(iItem); iItem = NULL; // item now owned by aPlaylist } - break; - + break; + case EMPXM3UPlaylistLineTypeNotSupported: case EMPXM3UPlaylistLineTypeCorrupted: default: @@ -534,7 +534,7 @@ break; } } - + // ----------------------------------------------------------------------------- // CMPXM3uPlaylistImporter::ParseLineL // ----------------------------------------------------------------------------- @@ -588,7 +588,7 @@ CleanupStack::PopAndDestroy( title ); return EMPXM3UPlaylistLineTypeExtinf; // line type extinf - } + } } } @@ -599,7 +599,7 @@ case KMPXM3UNoOffset: // Unsupported extended info tag found from this line return EMPXM3UPlaylistLineTypeNotSupported; - + case KErrNotFound: default: // Extended info not found from the beginning of line => line is @@ -608,7 +608,7 @@ // Get absolute path TInt error(KErrNone); HBufC* uri = ParseAbsolutePathLC(*iLine, error); - + if (error) { if (error == KErrPathNotFound) @@ -622,9 +622,9 @@ { CleanupStack::PopAndDestroy( uri ); } - + ++aInvalidItemCount; - + // All other errors are considered to mean playlist is // corrupt. return EMPXM3UPlaylistLineTypeCorrupted; @@ -633,7 +633,7 @@ aItem->SetTextValueL(KMPXMediaGeneralUri, *uri); MPX_DEBUG2(" uri %S", uri); - + // if title isn't supplied by the m3u file, extract file name from // URI as the title if (!aItem->IsSupported(KMPXMediaGeneralTitle)) @@ -645,7 +645,7 @@ } CleanupStack::PopAndDestroy( uri ); - + return EMPXM3UPlaylistLineTypePath; // line type path } } @@ -660,10 +660,10 @@ TInt& aError) { HBufC* path = NULL; - + TBool isAbsolute( EFalse ); - - if (aPath.Length() > KPathStartingChars && + + if (aPath.Length() > KPathStartingChars && !aPath.Mid(1, 2).CompareF(KMPXM3UAbsPath)) // magic: the 2nd and 3rd chars // are always ":\" // for absolute paths @@ -698,7 +698,7 @@ aError = iFs->IsValidName(*path) ? KErrNone : KErrBadName; } - + // It is possible that a song exists in the filesystem but isn't added to // the database because it's not a supported type. If such song is included // in a playlist, it will be added to the database when the playlist is added. @@ -715,7 +715,7 @@ return path; } - + // ----------------------------------------------------------------------------- // CMPlayerM3UPlaylistParser::ComposePlaylistL // ----------------------------------------------------------------------------- @@ -727,50 +727,50 @@ // contain the CMPXMediaArray // iPlaylist = CMPXMedia::NewL(); - + // set playlist title TParsePtrC parser(iPlaylistFilePath); iPlaylist->SetTextValueL(KMPXMediaGeneralTitle, parser.Name()); - + // set playlist URI iPlaylist->SetTextValueL(KMPXMediaGeneralUri, iPlaylistFilePath); - + // set type iPlaylist->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); - + // set category - iPlaylist->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXPlaylist); + iPlaylist->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXPlaylist); // set playlist array iPlaylist->SetCObjectValueL(KMPXMediaArrayContents, iAutoEncodingPlaylistArray); - + // set array acount iPlaylist->SetTObjectValueL(KMPXMediaArrayCount, iAutoEncodingPlaylistArray->Count()); - + // playlist makes a copy of the array, we can now free the medias // array delete iAutoEncodingPlaylistArray; iAutoEncodingPlaylistArray = NULL; } - + // ---------------------------------------------------------------------------- -// Cleanup. +// Cleanup. // ---------------------------------------------------------------------------- // void CMPXM3uPlaylistImporter::Cleanup() { delete iBuffer; iBuffer = NULL; - + delete iLine; - iLine = NULL; + iLine = NULL; delete iItem; iItem = NULL; - + delete iAutoEncodingPlaylistArray; iAutoEncodingPlaylistArray = NULL; - + delete iPlaylist; iPlaylist = NULL; } @@ -783,7 +783,7 @@ { MPX_DEBUG3("CMPXM3uPlaylistImporter::NotifyClient - iAutoEncodingInvalidItems=%d error=%d", iAutoEncodingInvalidItems, aError); - + if ( iObserver ) { if (aError) @@ -801,11 +801,11 @@ // notify client. return the playlist media CMPXMedia* playlist = iPlaylist; iPlaylist = NULL; // client takes over the ownership - + // to-do: change HandlePlaylistL to HandlePlaylist TRAP_IGNORE(iObserver->HandlePlaylistL( playlist, aError, ETrue )); } - } + } } - + // End of file diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/m3uplaylistplugin/src/mpxm3uplaylistplugin.cpp --- a/mpserviceplugins/m3uplaylistplugin/src/mpxm3uplaylistplugin.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/m3uplaylistplugin/src/mpxm3uplaylistplugin.cpp Fri May 14 15:49:53 2010 +0300 @@ -33,10 +33,10 @@ #include "mpxm3uplaylistdefs.h" #include "mpxm3uplaylistdefs.hrh" - + // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- -// Constructor. +// Constructor. // ---------------------------------------------------------------------------- CMPXM3uPlaylistPlugin::CMPXM3uPlaylistPlugin() { @@ -48,13 +48,13 @@ void CMPXM3uPlaylistPlugin::ConstructL() { iRequiredAttributes.AppendL(KMPXMediaGeneralUri); - + iOptionalAttributes.AppendL(KMPXMediaGeneralTitle); iOptionalAttributes.AppendL(KMPXMediaGeneralDuration); } - + // ---------------------------------------------------------------------------- -// Two-phased constructor. +// Two-phased constructor. // ---------------------------------------------------------------------------- CMPXM3uPlaylistPlugin* CMPXM3uPlaylistPlugin::NewL(TAny* /*aInitParams*/) { @@ -66,7 +66,7 @@ } // ---------------------------------------------------------------------------- -// Destructor. +// Destructor. // ---------------------------------------------------------------------------- CMPXM3uPlaylistPlugin::~CMPXM3uPlaylistPlugin() { @@ -90,7 +90,7 @@ iImporter = NULL; // processing starts as soon as object is instantiated. When request completes, - // client is notified through MMPXPlaylistPlugibObserver interface + // client is notified through MMPXPlaylistPlugibObserver interface iImporter = CMPXM3uPlaylistImporter::NewL( iFs, iObserver, aPlaylistUri, *iTopCharacterSet, *iAvailableCharacterSet, aStatus ); @@ -104,14 +104,14 @@ const CMPXMedia& aPlaylist, const TDesC& aFilePath) { - MPX_DEBUG1("CMPXM3uPlaylistPlugin::ExternalizePlaylistL"); + MPX_DEBUG1("CMPXM3uPlaylistPlugin::ExternalizePlaylistL"); // instantiate a new CMPXM3uPlaylistExporter to handle this request delete iExporter; iExporter = NULL; - + // processing starts as soon as object is instantiated. When request completes, - // client is notified through MMPXPlaylistPlugibObserver interface + // client is notified through MMPXPlaylistPlugibObserver interface iExporter = CMPXM3uPlaylistExporter::NewL( iFs, iObserver, aPlaylist, aFilePath, aStatus ); @@ -123,7 +123,7 @@ // ---------------------------------------------------------------------------- const TArray CMPXM3uPlaylistPlugin::RequiredAttributes() const { - return iRequiredAttributes.Array(); + return iRequiredAttributes.Array(); } // ---------------------------------------------------------------------------- @@ -132,7 +132,7 @@ // ---------------------------------------------------------------------------- const TArray CMPXM3uPlaylistPlugin::OptionalAttributes() const { - return iOptionalAttributes.Array(); + return iOptionalAttributes.Array(); } // ---------------------------------------------------------------------------- @@ -152,7 +152,7 @@ { iImporter->Cancel(); } - + if ( iExporter ) { iExporter->Cancel(); @@ -163,7 +163,7 @@ // ---------------------------------------------------------------------------- // The list of implementations // ---------------------------------------------------------------------------- -const TImplementationProxy ImplementationTable[] = +const TImplementationProxy ImplementationTable[] = { IMPLEMENTATION_PROXY_ENTRY(KMPXM3uPlaylistImplUid, CMPXM3uPlaylistPlugin::NewL) }; // ---------------------------------------------------------------------------- @@ -174,5 +174,5 @@ aTableCount=sizeof(ImplementationTable)/sizeof(TImplementationProxy); return ImplementationTable; } - + // End of file diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxinmemoryplugin/src/mpxinmemoryplugin.cpp --- a/mpserviceplugins/mpxinmemoryplugin/src/mpxinmemoryplugin.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxinmemoryplugin/src/mpxinmemoryplugin.cpp Fri May 14 15:49:53 2010 +0300 @@ -514,6 +514,7 @@ if( index != KErrNotFound ) { iEmbeddedContext.Remove( index ); + delete iTemporaryData[index]; iTemporaryData.Remove( index ); iEmbeddedContext.Compress(); iTemporaryData.Compress(); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp --- a/mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbcommon/src/mpxdbmanager.cpp Fri May 14 15:49:53 2010 +0300 @@ -193,13 +193,6 @@ CloseAllDatabases(); delete iDbFile; -#ifdef __RAMDISK_PERF_ENABLE - TInt count(iDatabaseHandles.Count()); - for (TInt i = 0; i < count; ++i) - { - RemoveDummyFile(i); - } -#endif //__RAMDISK_PERF_ENABLE iDatabaseHandles.Close(); } @@ -278,7 +271,7 @@ } TInt count(iDatabaseHandles.Count()); - TBool ret = EFalse; + //TBool ret = EFalse; for ( TInt i = 0; i < count ; ++i ) { if ( iDatabaseHandles[i].iUseRAMdb ) @@ -287,23 +280,25 @@ MPX_DEBUG1("CMPXDbManager::CopyDBsToRamL iUseRAMdb already ETrue"); continue; } - iDatabaseHandles[i].iUseRAMdb = ETrue; - TRAPD(err, ret = DoCopyDBToRamL( iDatabaseHandles[i].iDrive, aIsMTPInUse )) + CloseDatabaseAtIndexL( i ); // let leave: not much we can't do if we can't close the original DB + DoCopyDBToRam( i, aIsMTPInUse ); // copies if it can + TRAPD( err, OpenDatabaseAtIndexL( i ) ); if ( err != KErrNone ) { - MPX_DEBUG2("CMPXDbManager::CopyDBsToRamL error=%d", err); - // remove dymmy file + MPX_DEBUG2("CMPXDbManager::CopyDBsToRamL OpenDatabaseAtIndexL leave=%d", err); RemoveDummyFile(i); - // try to close database that is opened from RAM disk - TRAP_IGNORE(CloseDatabaseL( iDatabaseHandles[i].iDrive )); - iDatabaseHandles[i].iUseRAMdb = EFalse; - // reopen database from drive not from RAM - OpenDatabaseL( iDatabaseHandles[i].iDrive ); - continue; // continue to copy for next drive - } - if ( !ret ) - { - iDatabaseHandles[i].iUseRAMdb = EFalse; + if ( iDatabaseHandles[i].iUseRAMdb ) + { + // go back to disk DB + TRAP_IGNORE(CloseDatabaseAtIndexL( i )); + iDatabaseHandles[i].iUseRAMdb = EFalse; + OpenDatabaseAtIndexL( i ); + continue; + } + else + { + User::Leave( err ); + } } } @@ -322,73 +317,51 @@ // ---------------------------------------------------------------------------- -// CMPXDbManager::DoCopyDBsToRamL +// CMPXDbManager::DoCopyDBToRam // ---------------------------------------------------------------------------- // -TBool CMPXDbManager::DoCopyDBToRamL( TDriveUnit aDrive, TBool aIsMTPInUse ) +TBool CMPXDbManager::DoCopyDBToRam( TInt aIndex, TBool aIsMTPInUse ) { #ifdef __RAMDISK_PERF_ENABLE - MPX_DEBUG2("-->CMPXDbManager::DoCopyDBsToRamL drive=%d", (TInt)aDrive); - TFileName dst; - TFileName src; - dst.Append(iRAMFolder); - src.Append(aDrive.Name()); - src.Append(KDBFilePath); - TRAPD( err, BaflUtils::EnsurePathExistsL( iFs, dst )); - if ( err != KErrNone ) + MPX_DEBUG2("-->CMPXDbManager::DoCopyDBsToRam drive=%d", (TInt)iDatabaseHandles[aIndex].iDrive); + DatabaseHandle& database = iDatabaseHandles[aIndex]; + TInt err = KErrNone; + + delete database.iOrigFullFilePath; + database.iOrigFullFilePath = 0; + delete database.iTargetFullFilePath; + database.iTargetFullFilePath = 0; + TRAP (err, + database.iOrigFullFilePath = CreateFullFilenameL( database.iDrive ); + database.iUseRAMdb = ETrue; // must turn this on to create RAM filename + database.iTargetFullFilePath = CreateFullFilenameL( database.iDrive ); + BaflUtils::EnsurePathExistsL( iFs, *database.iTargetFullFilePath )); + database.iUseRAMdb = EFalse; + if (err != KErrNone) { + MPX_DEBUG1("CMPXDbManager::DoCopyDBsToRamL() CreateFilenameL or EnsurePathExistsL failed"); return EFalse; } - TFileName filename; - filename.Format(KSecurePath, User::Identity().iUid, iDbFile); //x:\private\10281e17\[sldfdsf]mpxv2_5.db - src.Append(filename); - MPX_DEBUG2("RAMDisk src path=%S", &src); - TEntry entry; - iFs.Entry( src, entry ); - if (!BlockDiskSpace( aDrive, entry.iSize, aIsMTPInUse ) ) + MPX_DEBUG2("RAMDisk src path=%S", database.iOrigFullFilePath); + MPX_DEBUG2("RAMDisk dst path=%S", database.iTargetFullFilePath); + + if (!BlockDiskSpace( aIndex, aIsMTPInUse ) ) { MPX_DEBUG1("CMPXDbManager::DoCopyDBsToRamL() BlockDiskSpace failed"); return EFalse; // continue for next drive } - TBuf<2> d; - d.Append(aDrive.Name()); - HBufC* temp = HBufC::NewLC(KMaxFileName); - temp->Des().Append(d.Left(1)); - temp->Des().Append(iDbFile->Des()); - filename.Format(KSecurePath, User::Identity().iUid, temp); - CleanupStack::PopAndDestroy(temp); - dst.Append(filename); - MPX_DEBUG2("RAMDisk dst path=%S", &dst); - TInt index( GetDatabaseIndex((TInt)aDrive) ); - delete iDatabaseHandles[index].iOrigFullFilePath; - iDatabaseHandles[index].iOrigFullFilePath = 0; - delete iDatabaseHandles[index].iTargetFullFilePath; - iDatabaseHandles[index].iTargetFullFilePath = 0; - - // Save these path so it is convenient to copy back - iDatabaseHandles[index].iOrigFullFilePath = HBufC::NewL(src.Length()); - iDatabaseHandles[index].iTargetFullFilePath = HBufC::NewL(dst.Length()); - - iDatabaseHandles[index].iOrigFullFilePath->Des().Append(src); - iDatabaseHandles[index].iTargetFullFilePath->Des().Append(dst); - TRAP(err, CloseDatabaseL(aDrive)); - if ( err != KErrNone ) + if ( BaflUtils::CopyFile(iFs, *database.iOrigFullFilePath, *database.iTargetFullFilePath ) != KErrNone ) { - MPX_DEBUG2("<--CMPXDbManager::DoCopyDBsToRamL error=%d", err); - TInt index(GetDatabaseIndex((TInt)aDrive)); - if ( index >= 0 ) - { - RemoveDummyFile( index ); - } + RemoveDummyFile( aIndex ); return EFalse; } - User::LeaveIfError( BaflUtils::CopyFile(iFs, src, dst )); - OpenDatabaseL((TInt)aDrive); - - MPX_DEBUG2("RAMDisk Database opened=%d", (TInt)aDrive); + MPX_DEBUG2("RAMDisk Database copied=%d", (TInt)database.iDrive); + database.iUseRAMdb = ETrue; // succeeded moving DB to RAM MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsToRamL"); - return ETrue; + return ETrue; +#else + return EFalse; #endif //__RAMDISK_PERF_ENABLE } @@ -398,34 +371,52 @@ // EXPORT_C void CMPXDbManager::CopyDBsFromRamL() { + MPX_FUNC("CMPXDbManager::CopyDBsFromRamL"); #ifdef __RAMDISK_PERF_ENABLE - MPX_DEBUG1("-->CMPXDbManager::CopyDBsFromRamL"); if( iRAMDiskPerfEnabled ) { TInt transactionCount = iTransactionCount; if (iTransactionCount > 0) { iTransactionCount = 0; - DoCommitL(); + TRAP_IGNORE( DoCommitL() ); } TInt count(iDatabaseHandles.Count()); - for (TInt i = 0; i < count && iDatabaseHandles[i].iUseRAMdb; ++i) + TInt leaveError = KErrNone; + iRAMInUse = EFalse; + // Should not leave until all the databases have been copied from RAM drive. + for (TInt i = 0; i < count; ++i) { - TRAPD(err, DoCopyDBFromRamL(i)); - if ( err != KErrNone ) + if ( !iDatabaseHandles[i].iUseRAMdb ) { - MPX_DEBUG2("<--CMPXDbManager::CopyDBsFromRamL error=%d", err); - //anyting wrong, delete the temp file and open database from drive + continue; + } + TRAPD( error, CloseDatabaseAtIndexL( i ) ); + if ( error ) + { + // Can't close db on RAM drive, so cleanup. + MPX_DEBUG2("CMPXDbManager::CopyDBsFromRamL CloseDatabaseAtIndexL fail: error = %d", error); + // Delete database on RAM drive. + BaflUtils::DeleteFile(iFs, *iDatabaseHandles[i].iTargetFullFilePath); + // Delete dummy file RemoveDummyFile(i); - // delete Db on RAM - User::LeaveIfError( BaflUtils::DeleteFile(iFs, - *iDatabaseHandles[i].iTargetFullFilePath)); + } + else + { + DoCopyDBFromRam(i); } iDatabaseHandles[i].iUseRAMdb = EFalse; // open db from drive - OpenDatabaseL( iDatabaseHandles[i].iDrive ); + TRAP( error, OpenDatabaseAtIndexL( i ) ); + if ( error && !leaveError ) + { + leaveError = error; + } } + + // leave if error + User::LeaveIfError(leaveError); if (transactionCount > 0) { @@ -433,47 +424,52 @@ iTransactionCount = transactionCount; } } - iRAMInUse = EFalse; - - MPX_DEBUG1("<--CMPXDbManager::CopyDBsFromRamL"); #endif //__RAMDISK_PERF_ENABLE } // ---------------------------------------------------------------------------- -// CMPXDbManager::DoCopyDBsToRamL +// CMPXDbManager::DoCopyDBsToRam // ---------------------------------------------------------------------------- // -void CMPXDbManager::DoCopyDBFromRamL( TInt aIndex ) +void CMPXDbManager::DoCopyDBFromRam( TInt aIndex ) { #ifdef __RAMDISK_PERF_ENABLE - MPX_DEBUG1("-->CMPXDbManager::DoCopyDBsFromRamL"); - MPX_DEBUG2("-->CMPXDbManager::DoCopyDBsFromRamL Drive %d will be closed before copying db from RAM.", - iDatabaseHandles[aIndex].iDrive); - - CloseDatabaseL(iDatabaseHandles[aIndex].iDrive); - - // Delete existing DB on drive - User::LeaveIfError( BaflUtils::DeleteFile(iFs, - *iDatabaseHandles[aIndex].iOrigFullFilePath)); - MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRamL old DB on drive deleted"); - - // Rename dummy file to be orignal file name - User::LeaveIfError( BaflUtils::RenameFile(iFs, - iDatabaseHandles[aIndex].iDummyFilePath, - *iDatabaseHandles[aIndex].iOrigFullFilePath) ); - MPX_DEBUG1("CMPXDbManager::CopyDBsFromRamL RAMDisk renamed."); + MPX_DEBUG1("-->CMPXDbManager::DoCopyDBsFromRam"); + DatabaseHandle& database = iDatabaseHandles[aIndex]; //Copy Db from RAM to replace dummy file - ReplaceFileL( *iDatabaseHandles[aIndex].iTargetFullFilePath, *iDatabaseHandles[aIndex].iOrigFullFilePath); - - MPX_DEBUG1("CMPXDbManager::CopyDBsFromRamL RAMDisk copied back."); + TRAPD(error, ReplaceFileL( *database.iTargetFullFilePath, database.iDummyFilePath)); + MPX_DEBUG2("CMPXDbManager::CopyDBsFromRam RAMDisk copied over dummy, error=%d", error); + + // done with RAM DB (whether copying succeeded or not) so can delete it + // can ignore errors since we cannot do anything if this fails + BaflUtils::DeleteFile(iFs, *database.iTargetFullFilePath); + MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRam RAM DB deleted"); + + if ( error == KErrNone ) + { + // Delete old DB on drive + // Can ignore error: either original does not exist or something is wrong and can't help it + BaflUtils::DeleteFile(iFs, *database.iOrigFullFilePath); + MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRam old DB on drive deleted"); - // Delete existing DB on RAM - User::LeaveIfError( BaflUtils::DeleteFile(iFs, *iDatabaseHandles[aIndex].iTargetFullFilePath)); - MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRamL RAMDisk deleted"); + // Rename dummy file to be original file name + error = BaflUtils::RenameFile(iFs, database.iDummyFilePath, *database.iOrigFullFilePath); + MPX_DEBUG2("CMPXDbManager::CopyDBsFromRam dummy file renamed, error=%d", error); + if ( error ) + { + // Error renaming dummy file, delete dummy file. + RemoveDummyFile(aIndex); + } + } + else + { + RemoveDummyFile(aIndex); + MPX_DEBUG1("CMPXDbManager::DoCopyDBsFromRam dummy file deleted"); + } - MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsFromRamL"); + MPX_DEBUG1("<--CMPXDbManager::DoCopyDBsFromRam"); #endif //__RAMDISK_PERF_ENABLE } @@ -484,7 +480,7 @@ // Leaves on error. // Implementation follows CFileMan::Copy except that // - we don't resize target file to zero -// - we can assume that files already exist +// - we can assume that source file already exists // - we don't copy file attributes & timestamp // ---------------------------------------------------------------------------- // @@ -496,7 +492,12 @@ CleanupClosePushL( srcFile ); RFile dstFile; - User::LeaveIfError( dstFile.Open(iFs, aDstName, EFileWrite|EFileWriteDirectIO|EFileShareExclusive) ); + TInt error = dstFile.Open(iFs, aDstName, EFileWrite|EFileWriteDirectIO|EFileShareExclusive); + if (error == KErrNotFound) + { + error = dstFile.Create(iFs, aDstName, EFileWrite|EFileWriteDirectIO|EFileShareExclusive); + } + User::LeaveIfError ( error ); CleanupClosePushL( dstFile ); // resize destination file @@ -551,11 +552,8 @@ if ( iDatabaseHandles[index].iDummyFilePath.Length() ) { - TInt err = BaflUtils::DeleteFile(iFs, iDatabaseHandles[index].iDummyFilePath); - if ( !err ) - { - iDatabaseHandles[index].iDummyFilePath.Zero(); - } + BaflUtils::DeleteFile(iFs, iDatabaseHandles[index].iDummyFilePath); + iDatabaseHandles[index].iDummyFilePath.Zero(); } MPX_DEBUG1("<--CMPXDbManager::RemoveDummyFile"); #endif //__RAMDISK_PERF_ENABLE @@ -652,7 +650,7 @@ TDriveUnit cdrive(KRootDrive()); CreateDatabaseL(cdrive); - OpenDatabaseL(cdrive); + OpenRootDatabaseL(); TInt count(aDrives.Count()); for (TInt i = 0; i < count; ++i) @@ -675,13 +673,14 @@ handle.iUseRAMdb = EFalse; #endif //__RAMDISK_PERF_ENABLE + TInt index = iDatabaseHandles.Count(); iDatabaseHandles.AppendL(handle); TVolumeInfo vol; if (iFs.Volume(vol, drive) == KErrNone) { CreateDatabaseL(drive); - AttachDatabaseL(drive); + AttachDatabaseL( index ); } } } @@ -715,16 +714,18 @@ if (iDatabaseHandles[i].iDrive == aDrive) { MPX_DEBUG2("CMPXDbManager::OpenDatabaseL found %d", aDrive); - if (!iDatabaseHandles[i].iOpen) + TInt transactionCount = iTransactionCount; + if (iTransactionCount > 0) { - MPX_DEBUG1("CMPXDbManager::OpenDatabaseL not open found"); - // make sure the database is created - CreateDatabaseL(drive); - - // attach - AttachDatabaseL(drive); + iTransactionCount = 0; + DoCommitL(); } - + OpenDatabaseAtIndexL( i ); + if (transactionCount > 0) + { + DoBeginL(); + iTransactionCount = transactionCount; + } found = ETrue; break; } @@ -740,6 +741,18 @@ // ResetPreparedQueries(); } + +void CMPXDbManager::OpenDatabaseAtIndexL( TInt aIndex ) + { + DatabaseHandle & database = iDatabaseHandles[aIndex]; + if (!database.iOpen) + { + MPX_DEBUG1("CMPXDbManager::OpenDatabaseAtIndexL not open"); + // make sure the database is created + CreateDatabaseL( TDriveUnit(database.iDrive) ); + AttachDatabaseL( aIndex ); + } + } // ---------------------------------------------------------------------------- // Closes a specified database. @@ -754,11 +767,7 @@ { User::Leave(KErrNotReady); } - - // Close all prepared statements if a db is closed - // - ResetPreparedQueries(); - + TDriveUnit drive(aDrive); TDriveUnit cdrive(KRootDrive()); TBool found(EFalse); @@ -770,11 +779,54 @@ { if (iDatabaseHandles[i].iDrive == aDrive) { - MPX_DEBUG2("CMPXDbManager::CloseDatabaseL found %d", aDrive); - if (iDatabaseHandles[i].iOpen) + TBool inTransaction = InTransaction(); + TInt transactionCount = iTransactionCount; + iTransactionCount = 0; + + if (inTransaction) //if the transaction is ongoing, try committing { - MPX_DEBUG1("CMPXDbManager::CloseDatabaseL found open"); - DetachDatabaseL(drive); + //if transaction committing fails, try roll-back + TInt error = iDatabase.Exec( KCommitTransaction ); + if ( error != KErrNone ) + { + //The error is ignored since we can't do nothing about it + iDatabase.Exec( KRollbackTransaction ); + } + } + +#ifdef __RAMDISK_PERF_ENABLE + if ( iRAMDiskPerfEnabled && iDatabaseHandles[i].iUseRAMdb ) + { + MPX_DEBUG2("CMPXDbManager::CloseDatabaseL found %d at RAM", aDrive); + TRAPD( err, CloseDatabaseAtIndexL( i ) ); + if ( err != KErrNone ) + { + // Can't close db on RAM drive, so cleanup. + MPX_DEBUG2("CMPXDbManager::CloseDatabaseL CloseDatabaseAtIndexL fail: error = %d", err); + // Delete dummy file + RemoveDummyFile(i); + iDatabaseHandles[i].iUseRAMdb = EFalse; + // Delete database on RAM drive. + User::LeaveIfError( BaflUtils::DeleteFile(iFs, *iDatabaseHandles[i].iTargetFullFilePath) ); + } + else + { + DoCopyDBFromRam(i); + } + iDatabaseHandles[i].iUseRAMdb = EFalse; + } + else +#endif + { + MPX_DEBUG2("CMPXDbManager::CloseDatabaseL found %d", aDrive); + CloseDatabaseAtIndexL( i ); + } + + //Let MTP handle the transcation if there is any + if ( inTransaction ) + { + DoBeginL(); + iTransactionCount = transactionCount; } found = ETrue; @@ -790,6 +842,19 @@ } +void CMPXDbManager::CloseDatabaseAtIndexL( TInt aIndex ) + { + // Close all prepared statements if a db is closed + // + ResetPreparedQueries(); + + if (iDatabaseHandles[aIndex].iOpen) + { + MPX_DEBUG1("CMPXDbManager::CloseDatabaseAtIndexL found open"); + DetachDatabaseL( aIndex ); + } +} + // ---------------------------------------------------------------------------- // Closes all databases. // ---------------------------------------------------------------------------- @@ -808,10 +873,13 @@ 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].iDummyFilePath.Zero(); + iDatabaseHandles[i].iTargetFullFilePath = 0; #endif //__RAMDISK_PERF_ENABLE } @@ -831,8 +899,7 @@ if (!iInitialized) { - TDriveUnit cdrive(KRootDrive()); - OpenDatabaseL(cdrive); + OpenRootDatabaseL(); } TInt count(iDatabaseHandles.Count()); @@ -841,7 +908,7 @@ TVolumeInfo vol; if (iFs.Volume(vol, iDatabaseHandles[i].iDrive) == KErrNone) { - AttachDatabaseL(iDatabaseHandles[i].iDrive); + AttachDatabaseL( i ); } } iInitialized = ETrue; @@ -939,11 +1006,11 @@ User::Leave(KErrNotReady); } - TBool found(EFalse); + TInt index = KErrNotFound; if (aDrive == EDriveC) { - found = ETrue; + index = iDatabaseHandles.Count(); } else { @@ -952,12 +1019,12 @@ { if ((iDatabaseHandles[i].iDrive == aDrive) && (iDatabaseHandles[i].iOpen)) { - found = ETrue; + index = i; break; } } } - if (found) + if ( index >= 0 ) { HBufC * filename = CreateFilenameL(aDrive); CleanupStack::PushL(filename); @@ -980,12 +1047,12 @@ } else { - DetachDatabaseL(drive_unit); + DetachDatabaseL( index ); RSqlDatabase::Delete(*filename); CreateDatabaseL(drive_unit); - AttachDatabaseL(drive_unit); + AttachDatabaseL( index ); } } @@ -1637,6 +1704,7 @@ // void CMPXDbManager::ResetPreparedQueries() { + MPX_FUNC("CMPXDbManager::ResetPreparedQueries"); iPreparedStatements.Reset(); TInt c( iStatements.Count() ); @@ -1675,17 +1743,16 @@ } // ---------------------------------------------------------------------------- -// Opens a specified database. +// Opens root database on C-drive // ---------------------------------------------------------------------------- // -void CMPXDbManager::OpenDatabaseL( - TDriveUnit aDrive) +void CMPXDbManager::OpenRootDatabaseL() { - MPX_FUNC("CMPXDbManager::OpenDatabaseL"); - - HBufC * filename = CreateFilenameL(aDrive); + MPX_FUNC("CMPXDbManager::OpenRootDatabaseL"); + TDriveUnit cdrive(KRootDrive()); + HBufC * filename = CreateFilenameL(cdrive); CleanupStack::PushL(filename); - User::LeaveIfError(iDatabase.Open(filename->Des())); + User::LeaveIfError(iDatabase.Open(*filename)); CleanupStack::PopAndDestroy(filename); } @@ -1746,67 +1813,50 @@ // Attaches a specified database. // ---------------------------------------------------------------------------- // -void CMPXDbManager::AttachDatabaseL( - TDriveUnit aDrive) +void CMPXDbManager::AttachDatabaseL( TInt aIndex ) { MPX_FUNC("CMPXDbManager::AttachDatabaseL"); - - TBool found(EFalse); - - TInt count(iDatabaseHandles.Count()); - for (TInt i = 0; i < count; ++i) + ASSERT( aIndex < iDatabaseHandles.Count() ); + DatabaseHandle & database = iDatabaseHandles[ aIndex ]; + if (!database.iOpen) { - if (iDatabaseHandles[i].iDrive == aDrive) - { - if (!iDatabaseHandles[i].iOpen) - { - HBufC* filename = CreateFilenameL(aDrive); - CleanupStack::PushL(filename); + HBufC* filename = CreateFilenameL( database.iDrive ); + CleanupStack::PushL(filename); #ifdef __RAMDISK_PERF_ENABLE - if( iDatabaseHandles[i].iUseRAMdb ) - { - delete iDatabaseHandles[i].iAliasname; - iDatabaseHandles[i].iAliasname = HBufC::NewL(KAliasName().Length()); - HBufC* temp = HBufC::NewLC(2); // form of DE, DF, DX,... - temp->Des().Append(iRAMDrive); // length == 2 - TDriveUnit pdrive(aDrive); - temp->Des().Append(pdrive.Name().Left(1)); //length == 2+ 1 - iDatabaseHandles[i].iAliasname->Des().Format(KRAMAliasName, temp); - MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - RAM change aliasname of %S", iDatabaseHandles[i].iAliasname ); - CleanupStack::PopAndDestroy(temp); - } - else + if( database.iUseRAMdb ) + { + delete database.iAliasname; + database.iAliasname = HBufC::NewL(KAliasName().Length()); + HBufC* temp = HBufC::NewLC(2); // form of DE, DF, DX,... + temp->Des().Append(iRAMDrive); // length == 2 + TDriveUnit pdrive( database.iDrive ); + temp->Des().Append(pdrive.Name().Left(1)); //length == 2+ 1 + database.iAliasname->Des().Format(KRAMAliasName, temp); + MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - RAM change aliasname of %S", database.iAliasname ); + CleanupStack::PopAndDestroy(temp); + } + else #endif //__RAMDISK_PERF_ENABLE - { - delete iDatabaseHandles[i].iAliasname; - TDriveUnit drive(aDrive); - const TDesC& driveName = drive.Name(); - iDatabaseHandles[i].iAliasname = HBufC::NewL(KAliasName().Length()); - iDatabaseHandles[i].iAliasname->Des().Format(KAliasName, &driveName); - MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - normal change aliasname of %S", iDatabaseHandles[i].iAliasname); - } - - TInt err = iDatabase.Attach(filename->Des(), *(iDatabaseHandles[i].iAliasname)); - MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - Attach Error =%d", err); - User::LeaveIfError(err); - iDatabaseHandles[i].iOpen = ETrue; + { + delete database.iAliasname; + TDriveUnit drive( database.iDrive ); + const TDesC& driveName = drive.Name(); + database.iAliasname = HBufC::NewL(KAliasName().Length()); + database.iAliasname->Des().Format(KAliasName, &driveName); + MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - normal change aliasname of %S", database.iAliasname); + } - CleanupStack::PopAndDestroy(filename); - } - else - { - MPX_DEBUG1("CMPXDbManager::AttachDatabaseL - found already open"); - } - - found = ETrue; - break; - } + TInt err = iDatabase.Attach( *filename, *database.iAliasname ); + MPX_DEBUG2("CMPXDbManager::AttachDatabaseL - Attach Error =%d", err); + User::LeaveIfError(err); + database.iOpen = ETrue; + + CleanupStack::PopAndDestroy(filename); } - if (!found) + else { - MPX_DEBUG1("CMPXDbManager::AttachDatabaseL - not found"); - User::Leave(KErrNotFound); + MPX_DEBUG1("CMPXDbManager::AttachDatabaseL - found already open"); } } @@ -1814,48 +1864,22 @@ // Detaches a specified database. // ---------------------------------------------------------------------------- // -void CMPXDbManager::DetachDatabaseL( - TDriveUnit aDrive) +void CMPXDbManager::DetachDatabaseL( TInt aIndex ) { MPX_FUNC("CMPXDbManager::DetachDatabaseL"); - ASSERT(iInitialized); - TBool found(EFalse); - - TInt count(iDatabaseHandles.Count()); - for (TInt i = 0; i < count; ++i) + ASSERT( iInitialized && aIndex < iDatabaseHandles.Count() ); + DatabaseHandle & database = iDatabaseHandles[ aIndex ]; + if ( database.iOpen ) { - if (iDatabaseHandles[i].iDrive == aDrive) + MPX_DEBUG2("CMPXDbManager::DetachDatabaseL iAliasname=%S is open",database.iAliasname ); + TInt err = iDatabase.Detach(*(database.iAliasname)); + if ( err ) { -#ifdef __RAMDISK_PERF_ENABLE - if ( iDatabaseHandles[i].iOpen || iDatabaseHandles[i].iUseRAMdb ) -#else //__RAMDISK_PERF_ENABLE - if ( iDatabaseHandles[i].iOpen ) -#endif //__RAMDISK_PERF_ENABLE - - { - MPX_DEBUG1("CMPXDbManager::DetachDatabaseL found drive that is opening"); - TInt err = iDatabase.Detach(*(iDatabaseHandles[i].iAliasname)); - if ( err ) - { - MPX_DEBUG2("CMPXDbManager::DetachDatabaseL detach failed Error=%d", err); - } - else - { - MPX_DEBUG2("CMPXDbManager::DetachDatabaseL iAliasname=%S", iDatabaseHandles[i].iAliasname); - } - User::LeaveIfError(err); - iDatabaseHandles[i].iOpen = EFalse; - } - - found = ETrue; - break; + MPX_DEBUG2("CMPXDbManager::DetachDatabaseL detach failed Error=%d", err); } - } - if (!found) - { - MPX_DEBUG1("CMPXDbManager::DetachDatabaseL drive not found in iDatabaseHandlers"); - User::Leave(KErrNotFound); + User::LeaveIfError(err); + database.iOpen = EFalse; } } @@ -1883,12 +1907,11 @@ path.Append(_L(":")); TBuf<2> d; d.Append(aDrive.Name()); - HBufC* temp = HBufC::NewLC(KMaxFileName); - temp->Des().Append(d.Left(1)); // attach original drive name - temp->Des().Append(iDbFile->Des()); - filename->Des().Format(securefilePath, &path, User::Identity().iUid, temp); + TFileName temp; + temp.Append(d.Left(1)); // attach original drive name + temp.Append(iDbFile->Des()); + filename->Des().Format(securefilePath, &path, User::Identity().iUid, &temp); MPX_DEBUG3("CMPXDbManager::CreateFilenameL - path=%S filename=%S", &path, filename); - CleanupStack::PopAndDestroy(temp); } else #endif //__RAMDISK_PERF_ENABLE @@ -1896,7 +1919,6 @@ MPX_DEBUG1("CMPXDbManager::CreateFilenameL - use normal drive"); const TDesC& driveName = aDrive.Name(); filename->Des().Format(securefilePath, &driveName, User::Identity().iUid, iDbFile); - } MPX_DEBUG2("CMPXDbManager::CreateFilenameL filename = %S", filename); @@ -2054,7 +2076,7 @@ TDriveUnit drive(iDatabaseHandles[i].iDrive); CreateDatabaseL(drive); MPX_DEBUG1("RegenerateAllDatabasesL: Attaching new DB"); - AttachDatabaseL(drive); + AttachDatabaseL( i ); MPX_DEBUG1("RegenerateAllDatabasesL: DB regeneration complete"); CleanupStack::PopAndDestroy(filename); } @@ -2607,41 +2629,36 @@ // CMPXDbManager::BlockDiskSpaceL // --------------------------------------------------------------------------- // -TBool CMPXDbManager::BlockDiskSpace( TDriveUnit aDrive, TInt aOrigDbSize, TBool aIsMTPInUse ) +TBool CMPXDbManager::BlockDiskSpace( TInt aIndex, TBool aIsMTPInUse ) { #ifdef __RAMDISK_PERF_ENABLE - MPX_DEBUG2("-->CMPXDbManager::BlockDiskSpaceL %d", (TInt)aDrive ); - + MPX_DEBUG2("-->CMPXDbManager::BlockDiskSpaceL %d", aIndex ); + DatabaseHandle & database = iDatabaseHandles[aIndex]; // if current DB size can not fit in RAM, abort now TInt ramDrive; RFs::CharToDrive(iRAMDrive, ramDrive); TVolumeInfo vol; TInt err = iFs.Volume( vol, ramDrive ); - if ( vol.iFree <= aOrigDbSize + KMPMinimumRAMSizeToRun ) + TEntry origDb; + iFs.Entry( *database.iOrigFullFilePath, origDb ); + if ( vol.iFree <= origDb.iSize + KMPMinimumRAMSizeToRun ) { MPX_DEBUG1("-->CMPXDbManager::BlockDiskSpaceL Not enough even for copy original DB file, leave" ); return EFalse; } // ensure you have the disk volume and database - err = iFs.Volume( vol, (TInt)aDrive ); + err = iFs.Volume( vol, database.iDrive ); if (err != KErrNone) { - MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Volume not available on drive %d", (TInt)aDrive); - return EFalse; - } - - TInt index( GetDatabaseIndex((TInt)aDrive) ); - if (index < 0) - { - MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Database not available for drive %d", (TInt)aDrive); + MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Volume not available on drive %d", database.iDrive); return EFalse; } // Check if the drive has enough space to block MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Disk total free space in bytes =%Lu", vol.iFree); - TInt64 blockingSize( CalculateInitalDummyDBSize( vol, aOrigDbSize, aIsMTPInUse )); + TInt64 blockingSize( CalculateInitalDummyDBSize( vol, origDb.iSize, aIsMTPInUse )); MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Disk blocking size =%Lu", blockingSize); if ( vol.iFree <= blockingSize + 1*KMPMegaByte ) { @@ -2650,15 +2667,15 @@ } // Create and resize the dummy file - TFileName dummyDbFileName; TChar ch; - RFs::DriveToChar((TInt)aDrive, ch ); - dummyDbFileName.Format( KDummyDbFile, (TUint)ch); + RFs::DriveToChar(database.iDrive, ch ); + database.iDummyFilePath.Format( KDummyDbFile, (TUint)ch); RFile dummyDb; - err = dummyDb.Replace( iFs, dummyDbFileName, EFileWrite ); + err = dummyDb.Replace( iFs, database.iDummyFilePath, EFileWrite ); if (err != KErrNone) { MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Can't open dummy file %d", err); + database.iDummyFilePath.Zero(); return EFalse; } err = dummyDb.SetSize( blockingSize ); @@ -2666,13 +2683,12 @@ { MPX_DEBUG2("CMPXDbManager::BlockDiskSpaceL Can't resize dummy file %d", err); dummyDb.Close(); + RemoveDummyFile(aIndex); return EFalse; } dummyDb.Close(); MPX_DEBUG1("CMPXDbManager::BlockDiskSpaceL Ok to block"); - - iDatabaseHandles[index].iDummyFilePath.Copy(dummyDbFileName); MPX_DEBUG1("<--CMPXDbManager::BlockDiskSpace"); return ETrue; @@ -2801,7 +2817,7 @@ else { TInt size=0; - TInt err = GetTotalRamDatabasesSize(size); + TInt err = GetTotalRamDatabasesSizeL(size); if ( err || (size > iMaximumAllowedRAMDiskSpaceToCopy) ) { // Databases using too much RAM space, copy back to normal drive and continue to harvest. @@ -2889,7 +2905,7 @@ TInt count(iDatabaseHandles.Count()); for (TInt i = 0; i < count && iDatabaseHandles[i].iUseRAMdb ; ++i) { - CloseDatabaseL( iDatabaseHandles[i].iDrive ); + CloseDatabaseAtIndexL( i ); TInt err= BaflUtils::CopyFile(iFs, iDatabaseHandles[i].iTargetFullFilePath->Des(), @@ -2897,7 +2913,7 @@ MPX_DEBUG2("CMPXDbManager::BackupDBsL err = %d", err); - OpenDatabaseL( iDatabaseHandles[i].iDrive ); + OpenDatabaseAtIndexL( i ); } if (transactionCount > 0) @@ -2960,7 +2976,7 @@ // CMPXDbManager::GetTotalRamDatabasesSize // --------------------------------------------------------------------------- // -TInt CMPXDbManager::GetTotalRamDatabasesSize(TInt& aSize) +TInt CMPXDbManager::GetTotalRamDatabasesSizeL(TInt& aSize) { MPX_FUNC("CMPXDbManager::GetTotalRamDatabasesSize"); TInt err = KErrNotSupported; @@ -2988,22 +3004,65 @@ filename.Format(KSecurePath, User::Identity().iUid, temp); CleanupStack::PopAndDestroy(temp); dbFilename.Append(filename); - MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Database name = %S", &dbFilename); + MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSizeL - Database name = %S", &dbFilename); TEntry entry; err = iFs.Entry( dbFilename, entry ); if ( (err != KErrNone) && (err != KErrNotFound) ) { break; } - MPX_DEBUG3("CMPXDbManager::GetTotalRamDatabasesSize - Size of Db %S = %d", &dbFilename, entry.iSize); + MPX_DEBUG3("CMPXDbManager::GetTotalRamDatabasesSizeL - Size of Db %S = %d", &dbFilename, entry.iSize); // sum up size size += entry.iSize; } aSize = size; - MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Total Size of Dbs = %d", size); + MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSizeL - Total Size of Dbs = %d", size); #endif //__RAMDISK_PERF_ENABLE - MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSize - Return err = %d", err); + MPX_DEBUG2("CMPXDbManager::GetTotalRamDatabasesSizeL - Return err = %d", err); return err; } + +// ---------------------------------------------------------------------------- +// Creates the absolute database filename on a specified drive. +// ---------------------------------------------------------------------------- +// +HBufC* CMPXDbManager::CreateFullFilenameL(TDriveUnit aDrive) + { + MPX_FUNC("CMPXDbManager::CreateFullFilenameL"); + + HBufC* filename = HBufC::NewL(KMaxFileName); + const TDesC& securefilePath = KSecureFilePath; + TDriveUnit cdrive(KRootDrive()); + +#ifdef __RAMDISK_PERF_ENABLE + TInt index(GetDatabaseIndex((TInt)aDrive)); + if ( index >=0 && iDatabaseHandles[index].iUseRAMdb && aDrive != cdrive ) + { + MPX_DEBUG1("CMPXDbManager::CreateFullFilenameL - use RAMDisk"); + TFileName path; + path.Append(iRAMDrive); + path.Append(_L(":")); + path.Append(KDBFilePath); + TBuf<2> d; + d.Append(aDrive.Name()); + TFileName temp; + temp.Append(d.Left(1)); // attach original drive name + temp.Append(iDbFile->Des()); + filename->Des().Format(securefilePath, &path, User::Identity().iUid, &temp); + MPX_DEBUG3("CMPXDbManager::CreateFullFilenameL - path=%S filename=%S", &path, filename); + } + else +#endif //__RAMDISK_PERF_ENABLE + { + MPX_DEBUG1("CMPXDbManager::CreateFullFilenameL - use normal drive"); + TFileName dbPath; + dbPath.Append(aDrive.Name()); + dbPath.Append(KDBFilePath); + filename->Des().Format(securefilePath, &dbPath, User::Identity().iUid, iDbFile); + } + MPX_DEBUG2("CMPXDbManager::CreateFullFilenameL filename = %S", filename); + return filename; + } + // End of File diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/data/mpxcollectiondbhgres.rss --- a/mpserviceplugins/mpxsqlitedbhgplugin/data/mpxcollectiondbhgres.rss Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/data/mpxcollectiondbhgres.rss Fri May 14 15:49:53 2010 +0300 @@ -22,7 +22,6 @@ #include #include "mpxcollectiondb.hrh" - STRUCT MENU_ITEM { LONG id; @@ -236,7 +235,7 @@ { txt = qtn_mus_pl_recently_downloaded; } - + // --------------------------------------------------------------------------- // r_mpx_qtn_mus_music_num_songs // Number of songs text diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/group/mpxdbpluginiconshg.mk --- a/mpserviceplugins/mpxsqlitedbhgplugin/group/mpxdbpluginiconshg.mk Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/group/mpxdbpluginiconshg.mk Fri May 14 15:49:53 2010 +0300 @@ -37,15 +37,15 @@ CLEANLIB : ; RESOURCE : - mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \ - /Ficonlist.txt + mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \ + /Ficonlist.txt FREEZE : ; SAVESPACE : ; RELEASABLES : - @echo $(HEADERFILENAME)&& \ - @echo $(ICONTARGETFILENAME) + @echo $(HEADERFILENAME)&& \ + @echo $(ICONTARGETFILENAME) FINAL : ; diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbabstractalbum.h Fri May 14 15:49:53 2010 +0300 @@ -50,7 +50,7 @@ * @return New CMPXDbCategory instance. */ static CMPXDbAbstractAlbum* NewL(CMPXDbManager& aDbManager, - TMPXGeneralCategory aCategory); + TMPXGeneralCategory aCategory, RFs& aFs); /** * Two-phased constructor. @@ -59,7 +59,7 @@ * @return New CMPXDbCategory instance on the cleanup stack. */ static CMPXDbAbstractAlbum* NewLC(CMPXDbManager& aDbManager, - TMPXGeneralCategory aCategory); + TMPXGeneralCategory aCategory, RFs& aFs); /** * Destructor @@ -84,9 +84,17 @@ * into consideration when generating the unique row id * @return The unique id of the row added. */ - TUint32 AddItemL( const TDesC& aName, const TDesC& aAlbumArtist, const TDesC& aGenre, TInt aDriveId, TBool& aNewRecord, - TBool aCaseSensitive = ETrue); - + TUint32 AddItemL( const TDesC& aUri, const TDesC& aName, const TDesC& aAlbumArtist, TInt aDriveId, TBool& aNewRecord, + TBool aCaseSensitive = EFalse); + + /** + * Add existing item to table with same entry fields values except new Uri. + * @param aOldId: existing item Id + * @param newUri: new Uri + * @return The unique id of the row added. + */ + TUint32 AddUpdatedItemL(TUint32 aOldId, const TDesC& newUri); + /** * Decrement the number of songs for the item. If the count gets to 0, remove * the item. @@ -103,13 +111,17 @@ */ void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, TBool aMtpInUse); - + /** - * Remove a abstractalbum and return its URI - * @param aAbstractAlbumId identifies the abstractalbum - * @return HBufC containing the URI. Ownership is transferred. + * Remove a abstractalbum, remove entry from AbstractAlbum table, + * Thumbnail table, corresponding alb from file system + * @param aAbstractAlbumId ID of the abstractalbum to remove + * @param aItemChangedMessages a list of change events as a result of the + * abstractalbum removal + * @param aFileDeleted indicate if alb file already deleted from file system */ - HBufC* DeleteAbstractAlbumL(TUint32 aAbstractAlbumId, TInt aDriveId = 0); + void RemoveAbstractAlbumL(TUint32 aAbstractalbumId, + CMPXMessageArray& aItemChangedMessages, TBool aFileDeleted); /** * Update a category item. @@ -120,6 +132,29 @@ * category was updated */ void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages); + + /** + * Delete or Rename Thumbnail from TN DB by calling Thumbnail manager + * Rename Thumbnail if aNewPath is not NULL, otherwise Delete Thumbnail + * @param aOldPath: old Uri + * @param aNewPath: new Uri + * @param aPriority: priority pass to Thumbnail manager + */ + void HandleTNL( const TDesC& aOldPath, const TDesC& aNewPath = KNullDesC, TInt aPriority =0 ); + + /** + * Get the uri field for a given ID. + * @param aId identifies the abstractalbum item + * @return uri that matches aId. Ownership is abandoned. + */ + HBufC* GetUriL(TUint32 aId); + + /** + * Get Ids of albstractalbum with no song associated. + * Rename Thumbnail if aNewPath is not NULL, otherwise Delete Thumbnail + * @param aItemsIds: array of Ids for abstractalbums which have no song associated. + */ + void GetAllItemsWithNoSongL(RArray& aItemsIds); private: @@ -142,35 +177,37 @@ */ void GenerateAbstractAlbumFieldsValuesL(const CMPXMedia& aMedia, CDesCArray& aFields, CDesCArray& aValues); - + + /** + * Remove a abstractalbum from AbstractAlbum table + * @param aAbstractAlbumId identifies the abstractalbum + * @param aDriveId drive Id + */ + void DeleteAbstractAlbumEntryL(TUint32 aAbstractAlbumId, TInt aDriveId = 0); + /** * @see MMPXTable */ virtual void CreateTableL(RSqlDatabase& aDatabase, TBool aCorruptTable); - - /** * @see MMPXTable */ virtual TBool CheckTableL(RSqlDatabase& aDatabase); - - - + /** * C++ constructor. * @param aDbManager database manager to use for database interactions * @param aCategory identifies the category */ - CMPXDbAbstractAlbum(CMPXDbManager& aDbManager, TMPXGeneralCategory aCategory); + CMPXDbAbstractAlbum(CMPXDbManager& aDbManager, TMPXGeneralCategory aCategory, RFs& aFs); /** * Second phase constructor. */ void ConstructL(); - - + /** * MThumbnailManagerObserver */ @@ -180,7 +217,7 @@ * MThumbnailManagerObserver */ void ThumbnailReady( - TInt aError, + TInt aError, MThumbnailData& aThumbnail, TThumbnailRequestId aId ); public: @@ -191,9 +228,9 @@ enum TAbstractAlbumColumns { EAbstractAlbumUniqueId = KMPXTableDefaultIndex, + EAbstractAlbumUri, EAbstractAlbumName, EAbstractAlbumArtist, - EAbstractAlbumGenre, EAbstractAlbumSongCount, EAbstractAlbumVolumeId, EAbstractAlbumFieldCount @@ -201,6 +238,8 @@ private: // Data CThumbnailManager* iTNManager; + TBool iRenameTN; + RFs& iFs; }; #endif // MPXDBAbstractAlbum_H diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h Fri May 14 15:49:53 2010 +0300 @@ -29,7 +29,7 @@ class MMPXDbAlbumObserver { public: - virtual TInt HandleIsUnknownArtistL(TUint32 aId) = 0; + virtual TInt HandleIsUnknownArtistL(TUint32 aId) = 0; virtual TUint32 HandleArtistForAlbumL( const TUint32 aId ) = 0; }; /** @@ -99,7 +99,7 @@ */ void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, const TUint32 aArtist); - + /** * Gets the details for all category items. * @param aAttrs attributes to be returned @@ -109,7 +109,7 @@ CMPXMediaArray& aMediaArray); /** - * Update a category item. + * Update a category item. * @param aId: The ID of the category to update * @param aMedia: The media data * @param aDriveId: The Drive Id the name (category) belongs @@ -122,17 +122,17 @@ /** * Get albums count for a specified artist * @param aId: The ID of the artist - */ + */ TInt GetAlbumsCountForArtistL(TUint32 aArtistId); /** * Get songs count for a specified album and a specified artist * @param aArtistId: The ID of the artist * @param aAlbumId: The ID of the album - */ + */ TInt GetSongsCountInAlbumMatchingArtistL(TUint32 aArtistId, TUint32 aAlbumId); - - private: + + private: /** * Updates the media with information from the table * @param aRecord record containing the source fields @@ -149,12 +149,12 @@ * @param aValues values of each field of Album table * @return a string containing the selection criteria. The ownership is passed to the caller. */ - void GenerateAlbumFieldsValuesL(const CMPXMedia& aMedia, + void GenerateAlbumFieldsValuesL(const CMPXMedia& aMedia, CDesCArray& aFields, CDesCArray& aValues); TBool IsUnknownArtistL(TUint32 aId); - + TUint32 ArtistForAlbumL(const TUint32 aId); private: // from MMPXTable diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbartist.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbartist.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbartist.h Fri May 14 15:49:53 2010 +0300 @@ -62,7 +62,7 @@ * Destructor */ virtual ~CMPXDbArtist(); - + public: /** * Add a category item. If the record already exists, its counter will @@ -77,7 +77,7 @@ */ TUint32 AddItemL(const TDesC& aName, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord, TBool aCaseSensitive = ETrue); - + /** * Gets the details for all category items. * @param aAttrs attributes to be returned @@ -85,9 +85,9 @@ */ void GetAllCategoryItemsL(const TArray& aAttrs, CMPXMediaArray& aMediaArray); - + /** - * Update a category item. + * Update a category item. * @param aId: The ID of the category to update * @param aMedia: The media data * @param aDriveId: The Drive Id the name (category) belongs @@ -95,14 +95,14 @@ * category was updated */ void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages); - + /* * Checks if the specified artist item is unknown * @param aId identifies the artist item * @return ETrue if it is unknown, EFalse otherwise - */ + */ TBool IsUnknownArtistL(TUint32 aId); - + private: /** @@ -121,9 +121,9 @@ * @param aValues values of each field of Artist table * @return a string containing the selection criteria. The ownership is passed to the caller. */ - void GenerateArtistFieldsValuesL(const CMPXMedia& aMedia, + void GenerateArtistFieldsValuesL(const CMPXMedia& aMedia, CDesCArray& aFields, CDesCArray& aValues); - + /** * Gets the Album counts for a Artist item * @param aId identifies the Artist item @@ -142,7 +142,7 @@ * @see MMPXTable */ virtual TBool CheckTableL(RSqlDatabase& aDatabase); - + private: /** diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbautoplaylist.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbautoplaylist.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbautoplaylist.h Fri May 14 15:49:53 2010 +0300 @@ -99,7 +99,7 @@ void GetAllPlaylistsL(CMPXMediaArray& aMediaArray); private: - + /** * Get count and duration information of the auto-playlist * @param aType the type of the auto-playlist diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbcategory.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbcategory.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbcategory.h Fri May 14 15:49:53 2010 +0300 @@ -176,16 +176,16 @@ */ TInt GetSongsCountL(TInt aDriveId, TUint32 aId); - /** - * Update a category item. - * @param aId: The ID of the category to update - * @param aMedia: The media data - * @param aDriveId: The Drive Id the name (category) belongs - * @param aItemChangedMessages: if valid on return contains a updated message if the + /** + * Update a category item. + * @param aId: The ID of the category to update + * @param aMedia: The media data + * @param aDriveId: The Drive Id the name (category) belongs + * @param aItemChangedMessages: if valid on return contains a updated message if the * category was updated */ - void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages); - + void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages); + protected: /** diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h Fri May 14 15:49:53 2010 +0300 @@ -110,7 +110,7 @@ * @return TUint32 id of the item added */ TUint32 AddSongWithNoTransactionL(const CMPXMedia& aMedia, CMPXMessageArray* aMessageArray=NULL); - + /** * Add a playlist to the collection * @param aMedia playlist media object with title and URI of the playlist. @@ -124,12 +124,13 @@ * @return playlist Id of the playlist */ TUint32 AddSongToPlaylistL(const CMPXMedia& aMedia); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED +#ifdef ABSTRACTAUDIOALBUM_INCLUDED /** * Add an abstractalbum to the collection * @param aMedia abstractalbum media object with URI of the abstractalbum. + * @param aMessageArray change event message to notify client of the changes * @return abstractalbum Id of the abstractalbum created - */ + */ TUint32 AddAbstractAlbumL(const CMPXMedia& aMedia, CMPXMessageArray* aMessageArray=NULL); #endif // ABSTRACTAUDIOALBUM_INCLUDED /** @@ -142,19 +143,30 @@ */ CMPXDbActiveTask::TChangeVisibility UpdateSongL(const CMPXMedia& aMedia, CMPXMessageArray& aItemChangedMessages); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED +#ifdef ABSTRACTAUDIOALBUM_INCLUDED /** - * Update songs info for songs associated with abstractalbum + * Update abstractalbum info to AbstractAlbum table and Songs associated with abstractalbum * in the music collection database - * @param aMedia songDetails object which contains file path, + * @param aMedia media object + * @param aItemChangedMessages a list of change events as a result of the + * song update + * @return ETrue if UI visible change else EFalse + */ + CMPXDbActiveTask::TChangeVisibility UpdateAbstractAlbumL(const CMPXMedia& aMedia, + CMPXMessageArray& aItemChangedMessages); + + /** + * Update all songs which associate with AbstractAlbum to new AbstractAlbum info + * in the collection + * @param aMedia media object which contains file path, * artist, composer, name(title), track, etc... * @param aItemChangedMessages a list of change events as a result of the * song update * @return ETrue if UI visible change else EFalse - */ - CMPXDbActiveTask::TChangeVisibility UpdateAbstractAlbumSongsL(const CMPXMedia& aMedia, + */ + CMPXDbActiveTask::TChangeVisibility UpdateSongsAbstractAlbumInfoL(const CMPXMedia& aMedia, CMPXMessageArray& aItemChangedMessages); -#endif // ABSTRACTAUDIOALBUM_INCLUDED +#endif // ABSTRACTAUDIOALBUM_INCLUDED /** * Update playlist info in the music collection database * @param aMedia playlist details object which contains file path, @@ -241,15 +253,16 @@ CMPXMessageArray& aItemChangedMessages); #ifdef ABSTRACTAUDIOALBUM_INCLUDED /** - * Remove a abstractalbum This will remove all the songs from the abstractalbum + * Remove a abstractalbum, remove entry from AbstractAlbum table, + * Thumbnail table, corresponding alb from file system * @param aAbstractAlbumId ID of the abstractalbum to remove - * @param aUriArray a descriptor array to contain the URI of the deleted file * @param aItemChangedMessages a list of change events as a result of the * abstractalbum removal + * @param aFileDeleted indicate if alb file already deleted from file system */ - void RemoveAbstractAlbumL(TUint32 aAbstractAlbumId, CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages); -#endif // ABSTRACTAUDIOALBUM_INCLUDED + void RemoveAbstractAlbumL(TUint32 aAbstractAlbumId, + CMPXMessageArray& aItemChangedMessages, TBool aFileDeleted); +#endif // ABSTRACTAUDIOALBUM_INCLUDED /** * Remove a song from the specified playlist. @@ -659,7 +672,7 @@ * Ends a refresh operation. */ void RefreshEndL(); - + /** * Notification of mtp start */ @@ -737,21 +750,11 @@ */ void PreCloseCollectionL(); - /** - * Notifies the handler that the collection was closed. - */ - void CollectionClosed(); - - /** - * Notifies the handler that the collection was opened. - */ - void CollectionOpenedL(); - /** * Checks if the spefified drive is a remove drive - */ + */ TBool IsRemoteDrive(TDriveNumber aDrive); - + /** * Checks if there is a drive that has a low disk space * @leave KErrDiskFull if the space on one of the drives is below the @@ -888,17 +891,8 @@ */ void DoRemovePlaylistL(TUint32 aPlaylistId, CDesCArray& aUriArray, CMPXMessageArray& aItemChangedMessages); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED - /** - * Deletes a specified abstractalbum. - * @param aAbstractAlbumId the abstractalbum to be deleted. - * @param aUriArray on return contains the URIs of the items deleted. - * @param aItemChangedMessages on return contains changed messages for all - * affected items - */ - void DoRemoveAbstractAlbumL(TUint32 aAbstractalbumId, CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages); -#endif // ABSTRACTAUDIOALBUM_INCLUDED + + /** * Deletes a song from a playlist. * @param aPlaylistId identifies the playlist. @@ -911,6 +905,22 @@ 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. */ @@ -1018,10 +1028,11 @@ * @see MMPXDbMusicObserver */ virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, - const TDesC& aName, TInt aDriveId, + const TDesC& aName, + TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, - const TDesC& aAlbumArtist=KNullDesC, - const TDesC& aGenre=KNullDesC); + const TDesC& aUri, + const TDesC& aAlbumArtist=KNullDesC); #else /** @@ -1032,13 +1043,13 @@ CMPXMessageArray* aItemChangedMessages, TBool& aItemExist); #endif // ABSTRACTAUDIOALBUM_INCLUDED - virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName, - TUint32 aArtist, const TDesC& aArt, - TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist); + virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName, + TUint32 aArtist, const TDesC& aArt, + TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist); - virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId, - const CMPXMedia& aMedia, TInt aDrive, CMPXMessageArray* aItemChangedMessages); - + virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId, + const CMPXMedia& aMedia, TInt aDrive, CMPXMessageArray* aItemChangedMessages); + /** * @see MMPXDbMusicObserver */ @@ -1055,7 +1066,7 @@ * @see MMPXDbMusicObserver */ virtual void HandlePlaybackTimeModifiedL(CMPXMessageArray& aItemChangedMessages); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED +#ifdef ABSTRACTAUDIOALBUM_INCLUDED /** * @see MMPXDbMusicObserver */ @@ -1073,7 +1084,7 @@ */ virtual TBool HandleIsUnknownArtistL(TUint32 aArtistId); virtual TUint32 HandleArtistForAlbumL(const TUint32 aAlbumId); - + private: // From MMPXDbPlaylistObserver /** * @see MMPXDbPlaylistObserver @@ -1121,8 +1132,6 @@ RFs& iFs; CMPXResource& iResource; TBool iOutOfDisk; // Are we in out of disk mode? - TBool iSynchronizeBasicTable; // Basic music table was not updated during last refresh - TBool iCollectionOpen; // Databases opened TBool iRefresh; // Refresh operation currently performed TBool iMtpInUse; // Flag for MTP operation TInt iOpOnDbCount; // Count to provide a min op amount in one transaction diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h Fri May 14 15:49:53 2010 +0300 @@ -318,7 +318,7 @@ * @param aMedia returns the song information */ void GetSongL(TInt aSongId, const TArray& aAttrs, CMPXMedia& aMedia); - + /** * Returns all songs in the playlist. * @param aDrive identifies in db @@ -421,14 +421,13 @@ #ifdef ABSTRACTAUDIOALBUM_INCLUDED - /** + /** * Returns all songs for a given abstractalbum. - * @param aDrive drive ID AbstractAlbum stored * @param aAbstractAlbumId abstractalbum to get the songs for * @param aAttrs attributes to be retrieved * @param aMediaArray returns the song attributes. */ - void GetAllSongsForAbstractAlbumL(TInt aDrive, TInt aAbstractAlbumId, + void GetAllSongsForAbstractAlbumL(TUint aAbstractAlbumId, const TArray& aAttrs, CMPXMediaArray& aMediaArray); #endif // ABSTRACTAUDIOALBUM_INCLUDED /** @@ -525,24 +524,9 @@ /** * Get the ID of Artist which belongs to the specified Album - * @param aId, the ID of Album + * @param aId, the ID of Album */ TUint32 CMPXDbMusic::ArtistForAlbumL(const TUint32 aId); - - /** - * Signals the start of a refresh operation - */ - void RefreshStartL(); - - /** - * Signals the end of a refresh operation - */ - void RefreshEndL(); - - /* - * Refresh music basic table - */ - void RefreshBasicTableL(); /* * Check the integrity of the music basic table @@ -693,9 +677,9 @@ 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); + 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, @@ -711,7 +695,7 @@ * @return ETrue if the media contains one or more supported attribute; * otherwise EFalse. */ - TBool IsSupported(const CMPXMedia& aMedia); + TBool IsSupported(const CMPXMedia& aMedia); private: // from MMPXTable @@ -749,8 +733,8 @@ * Column indexes in the music table */ enum TMusicColumns - { - EMusicUniqueId = KMPXTableDefaultIndex, + { + EMusicUniqueId = KMPXTableDefaultIndex, EMusicDbFlag, EMusicVolumeId, EMusicTitle, @@ -811,7 +795,9 @@ // file extensions to check DRM type, owned CDesCArrayFlat* iExtensionsDrm; MMPXDbMusicObserver& iObserver; - TBool iRefresh; +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + TBool iArtNeedUpdated; +#endif // ABSTRACTAUDIOALBUM_INCLUDED }; #endif // MPXDBMUSIC_H diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h --- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h Fri May 14 15:49:53 2010 +0300 @@ -155,7 +155,7 @@ _LIT(KQueryMusicGetMostPlayed, "SELECT Music.*,Artist.Name,Album.Name,Genre.Name,Composer.Name FROM :dbname.Music,:dbname.Artist,:dbname.Album,:dbname.Genre,:dbname.Composer WHERE Music.Deleted=0 AND Music.PlayCount<>0 AND Music.Album=Album.UniqueId AND Music.Artist=Artist.UniqueId AND Music.Genre=Genre.UniqueId AND Music.Composer=Composer.UniqueId ORDER BY PlayCount DESC, TimePlayed DESC LIMIT %u"); _LIT(KQueryMusicGetRecentlyAdded, "SELECT Music.*,Artist.Name,Album.Name,Genre.Name,Composer.Name FROM :dbname.Music,:dbname.Artist,:dbname.Album,:dbname.Genre,:dbname.Composer WHERE Music.Deleted=0 AND (julianday(Music.TimeAdded)>julianday('now','-7 days')) AND Music.Album=Album.UniqueId AND Music.Artist=Artist.UniqueId AND Music.Genre=Genre.UniqueId AND Music.Composer=Composer.UniqueId ORDER BY 11 DESC"); #ifdef ABSTRACTAUDIOALBUM_INCLUDED -_LIT(KQueryMusicGetSongsForAbstractAlbum,"SELECT Music.*,AbstractAlbum.Name FROM :dbname.Music,:dbname.AbstractAlbum WHERE Music.Deleted=0 AND Music.AbstractAlbum=AbstractAlbum.UniqueId AND AbstractAlbum.UniqueId=%u"); +_LIT(KQueryMusicGetSongsForAbstractAlbum,"SELECT Music.*,AbstractAlbum.Uri FROM :dbname.Music,:dbname.AbstractAlbum WHERE Music.Deleted=0 AND Music.AbstractAlbum=AbstractAlbum.UniqueId AND AbstractAlbum.UniqueId=%u"); #endif // ABSTRACTAUDIOALBUM_INCLUDED _LIT(KQueryMusicSong, "SELECT UniqueId,DbFlag,VolumeId,Title,0,'',0,Location FROM :dbname.Music WHERE %S"); _LIT(KQueryMusicFindAll, "SELECT Music.*,Artist.Name,Album.Name,Genre.Name,Composer.Name FROM :dbname.Music,:dbname.Artist,:dbname.Album,:dbname.Genre,:dbname.Composer WHERE %S AND Music.Album=Album.UniqueId AND Music.Artist=Artist.UniqueId AND Music.Genre=Genre.UniqueId AND Music.Composer=Composer.UniqueId %S"); @@ -222,8 +222,11 @@ // Select songs information from music, playlistsongs and playlistsonginfo via playlistid order by playlistsongs's ordinal _LIT(KQueryMusicGetAllSongsbyPl,"select mu.UniqueId,mu.DbFlag,mu.VolumeId,mu.Title,mu.Artist,mu.Art,0,mu.Location,pl.UniqueId as PlUId, pl.ordinal from :dbname.music as mu,:pldbname.playlistsongs as pl where mu.Deleted=0 AND mu.uniqueid = pl.songid and pl.playlistid =%u ORDER BY 10"); +#ifdef ABSTRACTAUDIOALBUM_INCLUDED _LIT(KQueryMusicGetAllSongsInfobyPl,"SELECT Music.*,Artist.Name,Album.Name,Genre.Name,Composer.Name,pl.UniqueId as PlUId,pl.ordinal FROM :dbname.Music,:dbname.Artist,:dbname.Album,:dbname.Genre,:dbname.Composer,:pldbname.playlistsongs as pl WHERE Music.Deleted=0 AND Music.Album=Album.UniqueId AND Music.Artist=Artist.UniqueId AND Music.Genre=Genre.UniqueId AND Music.Composer=Composer.UniqueId AND Music.UniqueId=pl .songid and pl .PlaylistId=%u ORDER BY 40"); - +#else +_LIT(KQueryMusicGetAllSongsInfobyPl,"SELECT Music.*,Artist.Name,Album.Name,Genre.Name,Composer.Name,pl.UniqueId as PlUId,pl.ordinal FROM :dbname.Music,:dbname.Artist,:dbname.Album,:dbname.Genre,:dbname.Composer,:pldbname.playlistsongs as pl WHERE Music.Deleted=0 AND Music.Album=Album.UniqueId AND Music.Artist=Artist.UniqueId AND Music.Genre=Genre.UniqueId AND Music.Composer=Composer.UniqueId AND Music.UniqueId=pl .songid and pl .PlaylistId=%u ORDER BY 37"); +#endif _LIT(KQuerySongsInArtistAlbum, "SELECT count(*) FROM :dbname.Music WHERE Deleted=0 AND Artist=%u AND Album=%u"); _LIT(KQueryMusicGetArtistForAlbum, "SELECT Artist FROM :dbname.Music,:dbname.Artist WHERE Music.Deleted=0 AND Music.Artist=Artist.UniqueId AND Music.Album=%u"); @@ -268,7 +271,7 @@ _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)"); -#else +#else _LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.4.0',%u)"); #endif // ABSTRACTAUDIOALBUM_INCLUDED _LIT(KQueryAuxiliarySetTime, "UPDATE :dbname.Auxiliary SET TimeRefreshed='%S', Corrupt=0"); @@ -351,7 +354,7 @@ _LIT(KQueryPlaylistSongsGetSongInfo, "SELECT PlaylistSongs.UniqueId,PlaylistSongs.SongId,PlaylistSongs.PlaylistId,PlaylistSongs.Ordinal,PlaylistSongInfo.VolumeId,PlaylistSongInfo.DbFlag,PlaylistSongInfo.Uri,PlaylistSongInfo.Title FROM :dbname.PlaylistSongs,:dbname.PlaylistSongInfo WHERE PlaylistSongs.UniqueId=%u AND PlaylistSongs.SongId=%u AND PlaylistSongs.SongId=PlaylistSongInfo.SongId"); _LIT(KQueryPlaylistSongsUpdateSongOrdinalAfterDelete, "UPDATE :dbname.PlaylistSongs SET Ordinal=Ordinal-1 WHERE PlaylistId=%u AND Ordinal>%u"); -_LIT(KQueryPlaylistSongsUpdateSongOrdinal, "UPDATE :dbname.PlaylistSongs SET Ordinal=%u WHERE SongId=%u"); +_LIT(KQueryPlaylistSongsUpdateSongOrdinal, "UPDATE :dbname.PlaylistSongs SET Ordinal=%u WHERE UniqueId=%u"); _LIT(KQueryPlaylistSongsMoveSongUp, "UPDATE :dbname.PlaylistSongs SET Ordinal=Ordinal+1 WHERE PlaylistId=%u AND Ordinal>=%u AND Ordinal<%u"); _LIT(KQueryPlaylistSongsMoveSongDown, "UPDATE :dbname.PlaylistSongs SET Ordinal=Ordinal-1 WHERE PlaylistId=%u AND Ordinal<=%u AND Ordinal>%u"); @@ -427,7 +430,7 @@ 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"); @@ -458,16 +461,17 @@ // _LIT(KAbstractAlbumCreateTable,"CREATE TABLE AbstractAlbum(" L"UniqueId INTEGER PRIMARY KEY," + L"Uri TEXT," L"Name TEXT COLLATE NOCASE," L"AlbumArtist TEXT," - L"Genre TEXT," L"SongCount INTEGER," L"VolumeId INTEGER)"); -_LIT(KAbstractAlbumCheckTable,"SELECT UniqueId,Name,SongCount,VolumeId FROM AbstractAlbum"); +_LIT(KAbstractAlbumCheckTable,"SELECT UniqueId,Uri,Name,AlbumArtist,SongCount,VolumeId FROM AbstractAlbum"); _LIT(KCriterionAbstractAlbumVolumeId, "VolumeId=%u"); -_LIT(KQueryAbstractAlbumInsert, "INSERT INTO :dbname.AbstractAlbum(UniqueId,Name,AlbumArtist,Genre,SongCount,VolumeId) VALUES(%u,'%S','%S','%S',%u,%u)"); +_LIT(KQueryAbstractAlbumInsert, "INSERT INTO :dbname.AbstractAlbum(UniqueId,Uri,Name,AlbumArtist,SongCount,VolumeId) VALUES(%u,'%S','%S','%S',%u,%u)"); _LIT(KQueryAbstractAlbumUpdate, "UPDATE :dbname.AbstractAlbum SET %S WHERE UniqueId=%u"); _LIT(KCriterionCategoryVolumeId, "SELECT VolumeId FROM :dbname.AbstractAlbum WHERE UniqueId=%u"); +_LIT(KQueryAbstractAlbumsWithNoSong, "SELECT * FROM :dbname.AbstractAlbum WHERE SongCount=0"); #endif // ABSTRACTAUDIOALBUM_INCLUDED #endif // MPXDBPLUGINQUERIES_H diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbabstractalbum.cpp Fri May 14 15:49:53 2010 +0300 @@ -14,6 +14,7 @@ * Description: Responsible for interation with the category tables: * Artist, Album, Genre, Composer and AbstractAlbum * +* */ @@ -36,9 +37,6 @@ // CONSTANTS - - - // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- @@ -47,11 +45,11 @@ // CMPXDbAbstractAlbum* CMPXDbAbstractAlbum::NewL( CMPXDbManager& aDbManager, - TMPXGeneralCategory aCategory) + TMPXGeneralCategory aCategory, RFs& aFs) { MPX_FUNC("CMPXDbAbstractAlbum::NewL"); - CMPXDbAbstractAlbum* self = CMPXDbAbstractAlbum::NewLC(aDbManager, aCategory); + CMPXDbAbstractAlbum* self = CMPXDbAbstractAlbum::NewLC(aDbManager, aCategory, aFs); CleanupStack::Pop(self); return self; } @@ -62,11 +60,11 @@ // CMPXDbAbstractAlbum* CMPXDbAbstractAlbum::NewLC( CMPXDbManager& aDbManager, - TMPXGeneralCategory aCategory) + TMPXGeneralCategory aCategory, RFs& aFs) { MPX_FUNC("CMPXDbAbstractAlbum::NewLC"); - CMPXDbAbstractAlbum* self = new (ELeave) CMPXDbAbstractAlbum(aDbManager, aCategory); + CMPXDbAbstractAlbum* self = new (ELeave) CMPXDbAbstractAlbum(aDbManager, aCategory, aFs); CleanupStack::PushL(self); self->ConstructL(); return self; @@ -102,9 +100,9 @@ // ---------------------------------------------------------------------------- // TUint32 CMPXDbAbstractAlbum::AddItemL( + const TDesC& aUri, const TDesC& aName, const TDesC& aAlbumArtist, - const TDesC& aGenre, TInt aDriveId, TBool& aNewRecord, TBool aCaseSensitive) @@ -112,19 +110,21 @@ MPX_FUNC("CMPXDbAbstractAlbum::AddItemL"); TUint32 rowId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXAbstractAlbum, - aName, aCaseSensitive)); - + aUri, aCaseSensitive)); + aNewRecord = !CategoryItemExistsL(aDriveId, rowId); + if ( aNewRecord ) { + HBufC* uri = MPXDbCommonUtil::ProcessSingleQuotesLC(aUri); HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName); HBufC* albumartist = MPXDbCommonUtil::ProcessSingleQuotesLC(aAlbumArtist); - HBufC* genre = MPXDbCommonUtil::ProcessSingleQuotesLC(aGenre); - - iDbManager.ExecuteQueryL(aDriveId, KQueryAbstractAlbumInsert, rowId, name, albumartist, genre, 0, MPXDbCommonUtil::GetVolIdMatchDriveIdL(iDbManager.Fs(), aDriveId)); - CleanupStack::PopAndDestroy(3, name); + + iDbManager.ExecuteQueryL(aDriveId, KQueryAbstractAlbumInsert, rowId, uri, name, albumartist, 0, MPXDbCommonUtil::GetVolIdMatchDriveIdL(iDbManager.Fs(), aDriveId)); + CleanupStack::PopAndDestroy(3, uri); } else { + MPX_DEBUG1("CMPXDbAbstractAlbum::AddItemL, increase song count for abstractalbum"); // increment the number of songs for the category HBufC* query = PreProcessStringLC(KQueryCategoryIncrementSongCount); iDbManager.ExecuteQueryL(aDriveId, *query, rowId); @@ -134,7 +134,36 @@ return rowId; } +// ---------------------------------------------------------------------------- +// CMPXDbAbstractAlbum::AddUpdatedItemL +// ---------------------------------------------------------------------------- +// +TUint32 CMPXDbAbstractAlbum::AddUpdatedItemL(TUint32 aOldId, const TDesC& newUri) + { + MPX_FUNC("CMPXDbAbstractAlbum::AddUpdatedItemL"); + iRenameTN = ETrue; + + //get the existing item based on aOldId + HBufC* query = NULL; + query = PreProcessStringLC(KQueryCategoryItem); + RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, aOldId)); + CleanupStack::PopAndDestroy(query); + + CleanupClosePushL(recordset); + TBool newRecord(ETrue); + if (recordset.Next() != KSqlAtRow) + { + User::Leave(KErrNotFound); + } + //save the existing entry fields values for renaming purpose + const TDesC& name(MPXDbCommonUtil::GetColumnTextL (recordset, EAbstractAlbumName)); + const TDesC& albumartist(MPXDbCommonUtil::GetColumnTextL (recordset, EAbstractAlbumArtist)); + TUint32 itemId = AddItemL(newUri, name, albumartist, GetDriveIdL(aOldId), newRecord, EFalse); + CleanupStack::PopAndDestroy(&recordset); + + return itemId; + } // ---------------------------------------------------------------------------- // CMPXDbAbstractAlbum::DecrementSongsForCategoryL @@ -150,8 +179,7 @@ MPX_FUNC("CMPXDbAbstractAlbum::DecrementSongsForCategoryL"); TInt songCount = GetSongsCountL(aDriveId, aId); - // if just one song uses this category. Use <= just in case - //while MTP connection, just decrease songCount in DB, do not do deletion. + //while MTP connection, just decrease songCount in DB, do not do deletion. if ( songCount > 0 ) { aItemExist = ETrue; @@ -161,74 +189,92 @@ CleanupStack::PopAndDestroy(query); songCount--; } - - if ((songCount == 0) && !aMtpInUse) + if (songCount == 0) { - HBufC* uri = DeleteAbstractAlbumL(aId, aDriveId); - MPX_DEBUG1("CMPXDbAbstractAlbum::DeleteAbstractAlbumL,implicitly delete AbstractAlbum Object when it has 0 references"); - aItemExist = EFalse; - if (aItemChangedMessages) + //get uri + HBufC* uri = GetUriL(aId); + CleanupStack::PushL(uri); + + if (!aMtpInUse) + { + DeleteAbstractAlbumEntryL(aId, aDriveId); + MPX_DEBUG1("CMPXDbAbstractAlbum::DecrementSongsForCategoryL,implicitly delete AbstractAlbum Object when it has 0 references"); + aItemExist = EFalse; + if (aItemChangedMessages) + { + // add the item changed message + MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aId, EMPXItemDeleted, + EMPXAbstractAlbum, KDBPluginUid); + } + //delete .alb file from file system + TInt err = BaflUtils::DeleteFile(iFs, *uri); + if(KErrNone != err) + { + MPX_DEBUG2("CMPXDbAbstractAlbum::DecrementSongsForCategoryL,File not deleted from file system with err=%d", err); + } + } + if(!iRenameTN) + { + HandleTNL(*uri); + } + CleanupStack::PopAndDestroy(uri); + } + } + +// ---------------------------------------------------------------------------- +// CMPXDbAbstractAlbum::RemoveAbstractAlbumL +// ---------------------------------------------------------------------------- +// +void CMPXDbAbstractAlbum::RemoveAbstractAlbumL(TUint32 aAbstractAlbumId, + CMPXMessageArray& aItemChangedMessages, TBool aFileDeleted) + { + MPX_FUNC("CMPXDbAbstractAlbum::RemoveAbstractAlbumL"); + HBufC* uri = GetUriL(aAbstractAlbumId); + CleanupStack::PushL(uri); + + DeleteAbstractAlbumEntryL(aAbstractAlbumId); + HandleTNL(*uri); + if (!aFileDeleted) + { + TInt err = BaflUtils::DeleteFile(iFs, *uri); + if(KErrNone != err) { - // add the item changed message - MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aId, EMPXItemDeleted, - EMPXAbstractAlbum, KDBPluginUid); - } - delete uri; - } + MPX_DEBUG2("CMPXDbAbstractAlbum::RemoveAbstractAlbumL,File not deleted from file system with err=%d", err); + } + } + MPXDbCommonUtil::AddItemChangedMessageL(aItemChangedMessages, aAbstractAlbumId, EMPXItemDeleted, EMPXAbstractAlbum, KDBPluginUid); + CleanupStack::PopAndDestroy(uri); } // ---------------------------------------------------------------------------- -// CMPXDbAbstractAlbum::DeleteAbstractAlbumL +// CMPXDbAbstractAlbum::HandleTNL // ---------------------------------------------------------------------------- // -HBufC* CMPXDbAbstractAlbum::DeleteAbstractAlbumL( - TUint32 aAbstractAlbumId, TInt aDriveId) - { - MPX_FUNC("CMPXDbAbstractAlbum::DeleteAbstractAlbumL"); +void CMPXDbAbstractAlbum::HandleTNL( const TDesC& aOldPath, + const TDesC& aNewPath, TInt aPriority ) + { + MPX_FUNC("CMPXDbAbstractAlbum::HandleTNL"); - //before delete category, get the abstract album path - HBufC* uri = GetNameL(aAbstractAlbumId); - // delete the category - if (uri) - { - CleanupStack::PushL(uri); - - if (aDriveId) - DeleteCategoryL(aAbstractAlbumId, aDriveId); - else - { - TInt drive = MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(), - ExecuteIntQueryL(KCriterionCategoryVolumeId, aAbstractAlbumId)); - DeleteCategoryL(aAbstractAlbumId, drive); - } -//delete abstract album .alb from TN table -#ifdef RD_MPX_TNM_INTEGRATION - // remove from thumbnail database table - CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( - *uri, KImageFileType ); - iTNManager->DeleteThumbnails( *source ); - CleanupStack::PopAndDestroy( source ); -#endif //RD_MPX_TNM_INTEGRATION - - - //delete abstract album .alb file from file system - RFs rFs; - User::LeaveIfError( rFs.Connect() ); - CleanupClosePushL( rFs ); - - TInt err = BaflUtils::DeleteFile(rFs, *uri); - if(KErrNone != err) - { - MPX_DEBUG2("CMPXDbAbstractAlbum::DeleteAbstractAlbumL,File not deleted from file system with err=%d", err); - } - - CleanupStack::PopAndDestroy( &rFs ); - } - - CleanupStack::Pop(uri); - return uri; - } + if (aNewPath.Compare(KNullDesC)==0 && aOldPath.Compare(KNullDesC)!=0) + { + // remove from thumbnail database table + MPX_DEBUG1("CMPXDbAbstractAlbum::HandleTNL, delete TN"); + 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 ); + //after rename, reset flag + iRenameTN = EFalse; + } + } // ---------------------------------------------------------------------------- @@ -261,12 +307,34 @@ MPXDbCommonUtil::AddItemAlbumChangedMessageL(*aItemChangedMessages, aId, EMPXItemModified, EMPXAbstractAlbum, KDBPluginUid, ETrue, 0 ); } - CleanupStack::PopAndDestroy(setStr); CleanupStack::PopAndDestroy(values); CleanupStack::PopAndDestroy(fields); } + +// ---------------------------------------------------------------------------- +// CMPXDbAbstractAlbum::GetUriL +// ---------------------------------------------------------------------------- +// +HBufC* CMPXDbAbstractAlbum::GetUriL( + TUint32 aId) + { + MPX_FUNC("CMPXDbAbstractAlbum::GetUriL"); + + RSqlStatement recordset(GetCategoryRecordL(aId)); + CleanupClosePushL(recordset); + + if (recordset.Next() != KSqlAtRow) + { + User::LeaveIfError(KErrNotFound); + } + HBufC* uri = MPXDbCommonUtil::GetColumnTextL(recordset, EAbstractAlbumUri).AllocL(); + CleanupStack::PopAndDestroy(&recordset); + return uri; + } + + // ---------------------------------------------------------------------------- // CMPXDbAbstractAlbum::UpdateMediaL // ---------------------------------------------------------------------------- @@ -276,41 +344,41 @@ const TArray& aAttrs, CMPXMedia& aMedia) { - MPX_FUNC("CMPXDbAbstractAlbum::UpdateMediaL"); + MPX_FUNC("CMPXDbAbstractAlbum::UpdateMediaL"); - TInt count(aAttrs.Count()); - for (TInt i = 0; i < count; ++i) - { - TInt contentId(aAttrs[i].ContentId()); - TUint attributeId(aAttrs[i].AttributeId()); + TInt count(aAttrs.Count()); + for (TInt i = 0; i < count; ++i) + { + TInt contentId(aAttrs[i].ContentId()); + TUint attributeId(aAttrs[i].AttributeId()); if (contentId == KMPXMediaIdGeneral) { if (attributeId & EMPXMediaGeneralId) { + MPX_DEBUG1(" EMPXMediaGeneralId"); aMedia.SetTObjectValueL(KMPXMediaGeneralId, aRecord.ColumnInt64(EAbstractAlbumUniqueId)); } if (attributeId & EMPXMediaGeneralTitle) { + MPX_DEBUG1(" EMPXMediaGeneralTitle"); TPtrC title(MPXDbCommonUtil::GetColumnTextL(aRecord, EAbstractAlbumName)); aMedia.SetTextValueL(KMPXMediaGeneralTitle, title); MPX_DEBUG2(" AbstractAlbumName[%S]", &title); - } + } if (attributeId & EMPXMediaGeneralCount) { + MPX_DEBUG1(" EMPXMediaGeneralCount"); TInt songCount = GetSongsCountL(KDbManagerAllDrives, aRecord.ColumnInt64(EAbstractAlbumUniqueId)); aMedia.SetTObjectValueL(KMPXMediaGeneralCount, songCount ); } - if (attributeId & EMPXMediaGeneralDrive) - { + if (attributeId & EMPXMediaGeneralDrive || + (attributeId & EMPXMediaGeneralUri)) + { TUint32 volId(aRecord.ColumnInt64(EAbstractAlbumVolumeId)); TInt driveId = MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(), volId); - - // LTAN-7GH6BZ, crash if eject memory card when adding song to existing AbstractAlbum - // due to special timing issue, it is possible drive number is -1 and create a - // panic when use for TDriveUnit MPX_DEBUG3("volId = %d, driveId = %d", volId, driveId); // handle possibly delay from framework notification @@ -320,63 +388,100 @@ User::Leave(KErrNotReady); } TDriveUnit driveUnit(driveId); - - aMedia.SetTextValueL(KMPXMediaGeneralDrive, driveUnit.Name()); + if (attributeId & EMPXMediaGeneralUri) + { + TPtrC uri(MPXDbCommonUtil::GetColumnTextL(aRecord, EAbstractAlbumUri)); + aMedia.SetTextValueL(KMPXMediaGeneralUri, uri); + MPX_DEBUG2(" AbstractAlbum URI[%S]", &uri); + } + if (attributeId & EMPXMediaGeneralDrive) + { + aMedia.SetTextValueL(KMPXMediaGeneralDrive, driveUnit.Name()); + } + } + } // end if contentId == KMPXMediaIdGeneral - } - } // end if contentId == KMPXMediaIdGeneral else if ( contentId == KMPXMediaIdMusic) { if (attributeId & EMPXMediaMusicAlbumArtist) - { + { + MPX_DEBUG1(" EMPXMediaMusicAlbumArtist"); TPtrC albumartist(MPXDbCommonUtil::GetColumnTextL(aRecord, EAbstractAlbumArtist)); aMedia.SetTextValueL(KMPXMediaMusicAlbumArtist, albumartist); - - - MPX_DEBUG2(" albumartist[%S]", &albumartist); - } - if (attributeId & EMPXMediaMusicGenre) - { - TPtrC genre(MPXDbCommonUtil::GetColumnTextL(aRecord, EAbstractAlbumGenre)); - aMedia.SetTextValueL(KMPXMediaMusicGenre, genre); - MPX_DEBUG2(" Genre[%S]", &genre); } } - + } // end for aMedia.SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); aMedia.SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAbstractAlbum); } +// ---------------------------------------------------------------------------- +// CMPXDbAbstractAlbum::GetAllItemsWithNoSongL +// ---------------------------------------------------------------------------- +// +void CMPXDbAbstractAlbum::GetAllItemsWithNoSongL(RArray& aItemsIds) + { + MPX_FUNC("CMPXDbAbstractAlbum::GetAllItemsWithNoSongL"); + RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryAbstractAlbumsWithNoSong)); + CleanupClosePushL(recordset); + + TInt err(KErrNone); + while ((err = recordset.Next()) == KSqlAtRow) + { + TUint32 uniqueID(recordset.ColumnInt64(EAbstractAlbumUniqueId)); + aItemsIds.AppendL(uniqueID); + } + CleanupStack::PopAndDestroy(&recordset); + if (err!= KSqlAtEnd) + { + User::Leave(KErrCorrupt); + } + } + // ---------------------------------------------------------------------------- -// CMPXDbAbstractAlbum::GenerateAlbumFieldsValuesL +// CMPXDbAbstractAlbum::GenerateAbstractAlbumFieldsValuesL // ---------------------------------------------------------------------------- // void CMPXDbAbstractAlbum::GenerateAbstractAlbumFieldsValuesL(const CMPXMedia& aMedia, CDesCArray& aFields, CDesCArray& aValues) { MPX_FUNC("CMPXDbAbstractAlbum::GenerateAbstractAlbumFieldsValuesL"); -//support Winlogo use case - if (aMedia.IsSupported(KMPXMediaGeneralTitle)) + //support Winlogo use case + if (aMedia.IsSupported(KMPXMediaGeneralTitle)) { TPtrC truncatedName(aMedia.ValueText(KMPXMediaGeneralTitle).Left(KMCMaxTextLen)); MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCCategoryName, truncatedName); } -//support Winlogo use case - if (aMedia.IsSupported(KMPXMediaMusicAlbumArtist)) + //support Winlogo use case + if (aMedia.IsSupported(KMPXMediaMusicAlbumArtist)) { TPtrC truncatedAlbumArtist(aMedia.ValueText(KMPXMediaMusicAlbumArtist).Left(KMCMaxTextLen)); MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicAlbumArtist, truncatedAlbumArtist); } - if (aMedia.IsSupported(KMPXMediaMusicGenre)) + } + +// ---------------------------------------------------------------------------- +// CMPXDbAbstractAlbum::DeleteAbstractAlbumEntryL +// ---------------------------------------------------------------------------- +// +void CMPXDbAbstractAlbum::DeleteAbstractAlbumEntryL( + TUint32 aAbstractAlbumId, TInt aDriveId) + { + MPX_FUNC("CMPXDbAbstractAlbum::DeleteAbstractAlbumEntryL"); + + //delete entry from table + if (aDriveId) + DeleteCategoryL(aAbstractAlbumId, aDriveId); + else { - TPtrC truncatedGenre(aMedia.ValueText(KMPXMediaMusicGenre).Left(KMCMaxTextLen)); - MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicGenre, truncatedGenre); + TInt drive = MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(), + ExecuteIntQueryL(KCriterionCategoryVolumeId, aAbstractAlbumId)); + DeleteCategoryL(aAbstractAlbumId, drive); } } - // ---------------------------------------------------------------------------- // CMPXDbAlbum::CreateTableL // ---------------------------------------------------------------------------- @@ -419,8 +524,9 @@ // CMPXDbAbstractAlbum::CMPXDbAbstractAlbum( CMPXDbManager& aDbManager, - TMPXGeneralCategory aCategory) : - CMPXDbCategory(aDbManager, aCategory) + TMPXGeneralCategory aCategory, RFs& aFs) : + CMPXDbCategory(aDbManager, aCategory), + iFs(aFs) { MPX_FUNC("CMPXDbAbstractAlbum::CMPXDbAbstractAlbum"); } @@ -437,26 +543,27 @@ #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 } // --------------------------------------------------------------------------- -// CMPXDbAbstractAlbum::ThumbnailReady +// CMPXDbAbstractAlbum::ThumbnailReady // Callback but not used here // --------------------------------------------------------------------------- -void CMPXDbAbstractAlbum::ThumbnailPreviewReady( +void CMPXDbAbstractAlbum::ThumbnailPreviewReady( MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ ) { } - + // --------------------------------------------------------------------------- // CMPXDbAbstractAlbum::ThumbnailReady // Callback but not used here // --------------------------------------------------------------------------- -void CMPXDbAbstractAlbum::ThumbnailReady( TInt /*aError*/, +void CMPXDbAbstractAlbum::ThumbnailReady( TInt /*aError*/, MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ ) { } diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp Fri May 14 15:49:53 2010 +0300 @@ -116,14 +116,14 @@ TBool aCaseSensitive) { MPX_FUNC("CMPXDbAlbum::AddItemL"); - + // try to find the item first TUint32 rowId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), iCategory, aName, aCaseSensitive)); aNewRecord = !CategoryItemExistsL(aDriveId, rowId); if (aNewRecord) - { + { // insert new HBufC* query = PreProcessStringLC(KQueryAlbumInsert); HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName); @@ -142,9 +142,9 @@ query = PreProcessStringLC(KQueryCategoryItem); RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, rowId)); CleanupStack::PopAndDestroy(query); - + CleanupClosePushL(recordset); - + if (recordset.Next() != KSqlAtRow) { User::Leave(KErrNotFound); @@ -152,22 +152,22 @@ // Artist TUint32 artistId = recordset.ColumnInt64(EAlbumArtist); - + // the current one is Unknown and the new one is Not Unknown. if ( IsUnknownArtistL( artistId ) && !IsUnknownArtistL( aArtist ) ) { _LIT( KFormatArtistId, "Artist=%d" ); HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen); setStr->Des().Format( KFormatArtistId, aArtist ); - + iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, rowId); - CleanupStack::PopAndDestroy(setStr); + CleanupStack::PopAndDestroy(setStr); } - + // Album Art TPtrC art(KNullDesC); art.Set(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArt)); - + // the current one is Unknown and the new one is Not Unknown if ( art == KNullDesC && aArt != KNullDesC ) { @@ -181,9 +181,9 @@ CleanupStack::PopAndDestroy(setStr); CleanupStack::PopAndDestroy(artReplaceSingleQuote); } - + CleanupStack::PopAndDestroy(&recordset); - + // increment the number of songs for the category query = PreProcessStringLC(KQueryCategoryIncrementSongCount); iDbManager.ExecuteQueryL(aDriveId, *query, rowId); @@ -223,43 +223,45 @@ else { aItemExist = ETrue; - + // retrieve the existing record HBufC* query = PreProcessStringLC(KQueryCategoryItem); RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, aId)); CleanupStack::PopAndDestroy(query); - + CleanupClosePushL(recordset); - + if (recordset.Next() != KSqlAtRow) { User::Leave(KErrNotFound); } TUint32 artistId = recordset.ColumnInt64(EAlbumArtist); - + CleanupStack::PopAndDestroy(&recordset); - + // the current artist is equal to deleted song's artist if ( artistId == aArtist ) { TUint32 newArtistId = ArtistForAlbumL(aId); - - _LIT( KFormatArtistId, "Artist=%d" ); - HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen); - setStr->Des().Format(KFormatArtistId, newArtistId); - - iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId); - CleanupStack::PopAndDestroy(setStr); - - if (aItemChangedMessages) + if ( artistId != newArtistId ) { - // add the item changed message - MPXDbCommonUtil::AddItemAlbumChangedMessageL(*aItemChangedMessages, aId, EMPXItemModified, - EMPXAlbum, KDBPluginUid, ETrue, 0 ); + _LIT( KFormatArtistId, "Artist=%d" ); + HBufC* setStr = HBufC::NewLC(KFormatArtistId().Length() + KMCIntegerLen); + setStr->Des().Format(KFormatArtistId, newArtistId); + + iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId); + CleanupStack::PopAndDestroy(setStr); + + if (aItemChangedMessages) + { + // add the item changed message + MPXDbCommonUtil::AddItemAlbumChangedMessageL(*aItemChangedMessages, aId, EMPXItemModified, + EMPXAlbum, KDBPluginUid, ETrue, 0 ); + } } } - + // decrement the number of songs for the category query = PreProcessStringLC(KQueryCategoryDecrementSongCount); iDbManager.ExecuteQueryL(aDriveId, *query, aId); @@ -291,9 +293,9 @@ // ---------------------------------------------------------------------------- // void CMPXDbAlbum::UpdateItemL( - TUint32 aId, - const CMPXMedia& aMedia, - TInt aDriveId, + TUint32 aId, + const CMPXMedia& aMedia, + TInt aDriveId, CMPXMessageArray* aItemChangedMessages) { MPX_FUNC("CMPXDbAlbum::UpdateItemL"); @@ -333,7 +335,7 @@ TInt prevId(0); TInt count(0); TInt err(KErrNone); - + while ((err = recordset.Next()) == KSqlAtRow) { TUint32 rowId(recordset.ColumnInt64(EAlbumUniqueId)); @@ -341,7 +343,7 @@ { continue; } - + count++; prevId = rowId; } @@ -362,7 +364,7 @@ TInt CMPXDbAlbum::GetSongsCountInAlbumMatchingArtistL(TUint32 aArtistId, TUint32 aAlbumId) { MPX_FUNC("CMPXDbAlbum::GetSongsCountInAlbumMatchingArtistL"); - + return ExecuteSumQueryL(KQuerySongsInArtistAlbum, aArtistId, aAlbumId); } @@ -388,14 +390,14 @@ if (attributeId & EMPXMediaGeneralId) { MPX_DEBUG1(" EMPXMediaGeneralId"); - + aMedia.SetTObjectValueL(KMPXMediaGeneralId, aRecord.ColumnInt64(EAlbumUniqueId)); } if (attributeId & EMPXMediaGeneralTitle) { MPX_DEBUG1(" EMPXMediaGeneralTitle"); - + TPtrC album( MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumName) ); aMedia.SetTextValueL(KMPXMediaGeneralTitle, MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumName)); @@ -414,17 +416,17 @@ else if ( contentId == KMPXMediaIdMusic ) { if (attributeId & EMPXMediaMusicArtist) - { + { MPX_DEBUG1(" EMPXMediaMusicArtist"); TPtrC artistName(KNullDesC); - + // if album is unknown, ignore arist name if (MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumName) != KNullDesC) { artistName.Set(MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumArtistName)); } - + aMedia.SetTextValueL(KMPXMediaMusicArtist, artistName); MPX_DEBUG2(" Artist[%S]", &artistName); } @@ -451,13 +453,13 @@ MPX_DEBUG1(" EMPXMediaMusicAlbumArtFileName"); TPtrC art(KNullDesC); - + // if album is unknown, ignore album art name if (MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumName) != KNullDesC) { art.Set(MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumArt)); } - + aMedia.SetTextValueL(KMPXMediaMusicAlbumArtFileName, art); MPX_DEBUG2(" Art[%S]", &art); } @@ -479,13 +481,13 @@ const TDesC& albumArtFilename = aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen); MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArt, albumArtFilename); } - + 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, KMCMusicArtist, artistId); } } diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbartist.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbartist.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbartist.cpp Fri May 14 15:49:53 2010 +0300 @@ -86,7 +86,7 @@ CMPXDbManager& aDbManager, TMPXGeneralCategory aCategory, MMPXDbArtistObserver& aObserver) : - CMPXDbCategory(aDbManager, aCategory), + CMPXDbCategory(aDbManager, aCategory), iObserver(aObserver) { MPX_FUNC("CMPXDbArtist::CMPXDbArtist"); @@ -122,7 +122,7 @@ aNewRecord = !CategoryItemExistsL(aDriveId, rowId); if (aNewRecord) - { + { // insert new HBufC* query = PreProcessStringLC(KQueryArtistInsert); HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName); @@ -141,18 +141,18 @@ query = PreProcessStringLC(KQueryCategoryItem); RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, rowId)); CleanupStack::PopAndDestroy(query); - + CleanupClosePushL(recordset); - + if (recordset.Next() != KSqlAtRow) { User::Leave(KErrNotFound); } - + // Album Art TPtrC art(KNullDesC); art.Set(MPXDbCommonUtil::GetColumnTextL(recordset, EArtistArt)); - + // the current one is Unknown and the new one is Not Unknown if ( art == KNullDesC && aArt != KNullDesC ) { @@ -166,9 +166,9 @@ CleanupStack::PopAndDestroy(setStr); CleanupStack::PopAndDestroy(artReplaceSingleQuote); } - + CleanupStack::PopAndDestroy(&recordset); - + // increment the number of songs for the category query = PreProcessStringLC(KQueryCategoryIncrementSongCount); iDbManager.ExecuteQueryL(aDriveId, *query, rowId); @@ -185,16 +185,16 @@ TBool CMPXDbArtist::IsUnknownArtistL(TUint32 aId) { MPX_FUNC("CMPXDbArtist::IsUnknownArtistL"); - + HBufC* name = GetNameL(aId); - + TInt ret = EFalse; if (*name == KNullDesC) { ret = ETrue; } delete name; - + return ret; } @@ -220,7 +220,7 @@ if (attributeId & EMPXMediaGeneralId) { MPX_DEBUG1(" EMPXMediaGeneralId"); - + aMedia.SetTObjectValueL(KMPXMediaGeneralId, aRecord.ColumnInt64(EArtistUniqueId)); MPX_DEBUG2(" Id[%d]", aRecord.ColumnInt64(EArtistUniqueId)); @@ -228,7 +228,7 @@ if (attributeId & EMPXMediaGeneralTitle) { MPX_DEBUG1(" EMPXMediaGeneralTitle"); - + TPtrC artist( MPXDbCommonUtil::GetColumnTextL(aRecord, EArtistName) ); aMedia.SetTextValueL(KMPXMediaGeneralTitle, MPXDbCommonUtil::GetColumnTextL(aRecord, EArtistName)); @@ -245,7 +245,7 @@ TInt songCount = GetSongsCountL( KDbManagerAllDrives, aRecord.ColumnInt64( EArtistUniqueId ) ); aMedia.SetTObjectValueL(KMPXMediaGeneralCount, songCount); // mod by anjokela - + MPX_DEBUG1(" EMPXMediaGeneralCount"); MPX_DEBUG2(" SongCount[%d]", songCount); } @@ -255,7 +255,7 @@ if (attributeId & EMPXMediaMusicAlbumArtFileName) { MPX_DEBUG1(" EMPXMediaMusicAlbumArtFileName"); - TPtrC art(KNullDesC); + TPtrC art(KNullDesC); art.Set(MPXDbCommonUtil::GetColumnTextL(aRecord, EArtistArt)); aMedia.SetTextValueL(KMPXMediaMusicAlbumArtFileName, art); MPX_DEBUG2(" Art[%S]", &art); @@ -279,7 +279,7 @@ MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArt, albumArtFilename); } } - + // ---------------------------------------------------------------------------- // CMPXDbArtist::GetAlbumsCountL // ---------------------------------------------------------------------------- @@ -287,14 +287,14 @@ TInt CMPXDbArtist::GetAlbumsCountL(TUint32 aId) { MPX_FUNC("CMPXDbArtist::GetAlbumsCountL"); - + return iObserver.HandleGetAlbumsCountForArtistL(aId); } - + // ---------------------------------------------------------------------------- // CMPXDbArtist::GetAllCategoryItemsL // ---------------------------------------------------------------------------- -// +// void CMPXDbArtist::GetAllCategoryItemsL( const TArray& aAttrs, CMPXMediaArray& aMediaArray) @@ -313,9 +313,9 @@ // ---------------------------------------------------------------------------- // void CMPXDbArtist::UpdateItemL( - TUint32 aId, - const CMPXMedia& aMedia, - TInt aDriveId, + TUint32 aId, + const CMPXMedia& aMedia, + TInt aDriveId, CMPXMessageArray* aItemChangedMessages) { MPX_FUNC("CMPXDbAlbum::UpdateItemL"); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbautoplaylist.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbautoplaylist.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbautoplaylist.cpp Fri May 14 15:49:53 2010 +0300 @@ -301,7 +301,7 @@ MPX_FUNC("CMPXDbAutoPlaylist::GetPlaylistDetails"); HBufC* query = NULL; - + switch ( aType ) { case EMPXMostPlayedPlaylist: @@ -320,7 +320,7 @@ User::Leave(KErrArgument); break; } - + RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query)); CleanupClosePushL(recordset); @@ -331,10 +331,10 @@ aCount++; sum += recordset.ColumnInt64(KMPXTableDefaultIndex); } - + CleanupStack::PopAndDestroy(&recordset); CleanupStack::PopAndDestroy(query); - + if (err != KSqlAtEnd) { User::Leave(KErrCorrupt); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcategory.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcategory.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcategory.cpp Fri May 14 15:49:53 2010 +0300 @@ -189,7 +189,7 @@ else if (criterion == KMPXMediaGeneralTitle) { #ifdef RD_MPX_COLLECTION_CACHE - + if (aCriteria.ValueText(KMPXMediaGeneralTitle).Length() <= 0) { TUint32 itemId = MPXDbCommonUtil::GenerateUniqueIdL( @@ -212,14 +212,19 @@ #endif //RD_MPX_COLLECTION_CACHE } #ifdef ABSTRACTAUDIOALBUM_INCLUDED - else if (criterion == KMPXMediaGeneralUri) - { - TUint32 itemId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), iCategory, - aCriteria.ValueText(KMPXMediaGeneralUri), (iCategory != EMPXGenre))); - HBufC* critStr = PreProcessStringLC(KCriterionCategoryUniqueId); - MPXDbCommonUtil::AddSqlCriterionL(*criteriaArray, *critStr, itemId); - CleanupStack::PopAndDestroy(critStr); - } + else if (criterion == KMPXMediaGeneralUri) + { + //only Genre and AbstractAlbum are not case sensitive + TBool caseSensitive = ETrue; + if ((iCategory == EMPXGenre) || (iCategory == EMPXAbstractAlbum)) + caseSensitive = EFalse; + + TUint32 itemId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), iCategory, + aCriteria.ValueText(KMPXMediaGeneralUri), caseSensitive)); + HBufC* critStr = PreProcessStringLC(KCriterionCategoryUniqueId); + MPXDbCommonUtil::AddSqlCriterionL(*criteriaArray, *critStr, itemId); + CleanupStack::PopAndDestroy(critStr); + } else if (criterion == KMPXMediaGeneralDrive) { const TDesC& drive(aCriteria.ValueText(KMPXMediaGeneralDrive)); @@ -257,8 +262,12 @@ const TUint32 aId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, - TBool& aItemExist, - TBool /*aMTPInUse*/) + TBool& aItemExist +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + , + TBool /*aMTPInUse*/ +#endif //ABSTRACTAUDIOALBUM_INCLUDED +) { MPX_FUNC("CMPXDbCategory::DecrementSongsForCategoryL"); @@ -472,9 +481,9 @@ } void CMPXDbCategory::UpdateItemL( - TUint32 /*aId*/, - const CMPXMedia& /*aMedia*/, - TInt /*aDriveId*/, + TUint32 /*aId*/, + const CMPXMedia& /*aMedia*/, + TInt /*aDriveId*/, CMPXMessageArray* /*aItemChangedMessages*/) { // nothing diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcomposer.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcomposer.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcomposer.cpp Fri May 14 15:49:53 2010 +0300 @@ -21,6 +21,8 @@ #include #include "mpxdbcomposer.h" +// CONSTANTS + // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbgenre.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbgenre.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbgenre.cpp Fri May 14 15:49:53 2010 +0300 @@ -21,6 +21,8 @@ #include #include "mpxdbgenre.h" +// CONSTANTS + // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp Fri May 14 15:49:53 2010 +0300 @@ -154,10 +154,10 @@ iExtensions = iResource.ReadDesCArrayL(R_MC_MUSIC_FILE_EXTENSIONS); iExtensionsMime = iResource.ReadDesCArrayL(R_MC_FILE_EXTENSIONS_MIME); iExtensionsDrm = iResource.ReadDesCArrayL(R_MC_FILE_EXTENSIONS_DRM); - + // make sure all databases are created and valid iDbManager = CMPXCollectionDbManager::NewL(iFs); - + CDesCArrayFlat* musicFolders = #ifdef RD_MULTIPLE_DRIVE GetMusicFoldersL(); @@ -170,22 +170,21 @@ ProcessMusicFoldersL(*musicFolders); CleanupStack::PopAndDestroy(musicFolders); - // Create the db infrastructure, + // Create the db infrastructure, // iDbMusic = CMPXDbMusic::NewL(*iDbManager, iResource, *this); iDbPlaylist = CMPXDbPlaylist::NewL(*iDbManager, *this); iDbArtist = CMPXDbArtist::NewL(*iDbManager, EMPXArtist, *this); - iDbAlbum = CMPXDbAlbum::NewL(*iDbManager, EMPXAlbum, *this); + iDbAlbum = CMPXDbAlbum::NewL(*iDbManager, EMPXAlbum, *this); iDbGenre = CMPXDbGenre::NewL(*iDbManager, EMPXGenre); iDbComposer = CMPXDbComposer::NewL(*iDbManager, EMPXComposer); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED - iDbAbstractAlbum = CMPXDbAbstractAlbum::NewL(*iDbManager, EMPXAbstractAlbum); -#endif // ABSTRACTAUDIOALBUM_INCLUDED +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + iDbAbstractAlbum = CMPXDbAbstractAlbum::NewL(*iDbManager, EMPXAbstractAlbum, iFs); +#endif // ABSTRACTAUDIOALBUM_INCLUDED iAutoPlaylist = CMPXDbAutoPlaylist::NewL(*iDbManager, iFs, iResource); iDbAuxiliary = CMPXDbAuxiliary::NewL(*iDbManager); MPX_TRAPD(err, iDbManager->InitDatabasesL(iDbDrives)); - iCollectionOpen = ETrue; // If KErrCorrupt is returned, a database file was found to be corrupted // and was replaced with a new one. The db plugin can ignore this error and continue @@ -316,24 +315,22 @@ MPX_FUNC("CMPXDbHandler::AddAbstractAlbumL"); BeginTransactionL(); - // TUint32 abstractAlbumId(0); TBool newRecord(EFalse); TInt err(KErrNone); TDriveUnit drive(aMedia.ValueText(KMPXMediaGeneralUri)); - TPtrC name(aMedia.ValueText(KMPXMediaGeneralUri).Left(KMCMaxTextLen)); + TPtrC uri(aMedia.ValueText(KMPXMediaGeneralUri).Left(KMCMaxTextLen)); + TPtrC name(aMedia.ValueText(KMPXMediaGeneralTitle).Left(KMCMaxTextLen)); TPtrC albumartist(aMedia.ValueText(KMPXMediaMusicAlbumArtist).Left(KMCMaxTextLen)); - TPtrC genre(aMedia.ValueText(KMPXMediaMusicGenre).Left(KMCMaxTextLen)); - - //only insert to AbstractAlbum table when it is new item - TUint32 abstractAlbumId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, name, (EMPXAbstractAlbum!=EMPXGenre))); - + + //only insert to AbstractAlbum table when it is new item + TUint32 abstractAlbumId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, uri, EFalse)); + newRecord = !iDbAbstractAlbum->CategoryItemExistsL(drive, abstractAlbumId); - - - if (newRecord) + + if (newRecord) { - MPX_TRAP(err, abstractAlbumId = iDbAbstractAlbum->AddItemL( name, albumartist, genre, drive, newRecord, (EMPXAbstractAlbum != EMPXGenre))); + MPX_TRAP(err, abstractAlbumId = iDbAbstractAlbum->AddItemL(uri, name, albumartist, drive, newRecord, EFalse)); if (iOutOfDisk && (err == KErrNotFound)) { err = KErrDiskFull; @@ -346,57 +343,134 @@ } EndTransactionL(err); - return abstractAlbumId; + return abstractAlbumId; } // ---------------------------------------------------------------------------- -// Update all songs which associate with AbstractAlbum in the collection +// Update abstractalbum info to AbstractAlbum table and all songs which associate +// with AbstractAlbum in the collection // ---------------------------------------------------------------------------- // -CMPXDbActiveTask::TChangeVisibility CMPXDbHandler::UpdateAbstractAlbumSongsL( +CMPXDbActiveTask::TChangeVisibility CMPXDbHandler::UpdateAbstractAlbumL( const CMPXMedia& aMedia, CMPXMessageArray& aItemChangedMessages) { - MPX_FUNC("CMPXDbHandler::UpdateAbstractAlbumSongsL"); + MPX_FUNC("CMPXDbHandler::UpdateAbstractAlbumL"); CMPXDbActiveTask::TChangeVisibility visibleChange(CMPXDbActiveTask::ENotVisibile); - + TUint32 itemId(0); if (aMedia.IsSupported(KMPXMediaGeneralUri)) { - const TDesC& art(aMedia.ValueText (KMPXMediaGeneralUri)); - - TBool existRecord(EFalse); + const TDesC& uri(aMedia.ValueText (KMPXMediaGeneralUri)); TDriveUnit drive(aMedia.ValueText(KMPXMediaGeneralUri)); - TUint32 rowId(MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, art, (EMPXAbstractAlbum != EMPXGenre))); - //check if abstractAlbum in ABSTRACTALBUM table before update songs - existRecord = iDbAbstractAlbum->CategoryItemExistsL(drive, rowId); - - //update songs associated with abstractalbum only when abstractalbum associated already - //in the AbstractAlbum table - if (existRecord) - { - if (aMedia.IsSupported(KMPXMediaArrayContents)) + + //get Id based on new uri + itemId = MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, uri, EFalse); + if (!itemId) + { + User::Leave(KErrNotSupported); + } + + //if updating to new item, need do renaming for AbstractAlbum: delete old one and insert a new entry to AbstractAlbum table + //if a new item, need update songs associated and renaming albstractalbum table + if (aMedia.IsSupported(KMPXMediaGeneralId)) + { + MPX_DEBUG1("CMPXDbHandler::UpdateAbstractAlbumL, rename case"); + + BeginTransactionL(); + //get old id, for renaming + TInt err(KErrNone); + TUint32 oldId = (aMedia.ValueTObjectL(KMPXMediaGeneralId)).iId2; + if (oldId && (oldId != itemId) ) //pass the old UID for renaming, do not care if new itemId exist or not { - - CMPXMediaArray* mediaArray = aMedia.Value(KMPXMediaArrayContents); - User::LeaveIfNull(mediaArray); + //get old Uri based on old Id + HBufC* oldUri = iDbAbstractAlbum->GetUriL(oldId); + CleanupStack::PushL(oldUri); + + //add and update new item to AbstractAlbum table + //old existing item field values need to be saved and added when adding new item + MPX_TRAP(err, itemId = iDbAbstractAlbum->AddUpdatedItemL(oldId, uri )); + + if (iOutOfDisk && (err == KErrNotFound)) + { + err = KErrDiskFull; + } + + MPXDbCommonUtil::AddItemChangedMessageL(aItemChangedMessages, itemId, EMPXItemInserted, + EMPXAbstractAlbum, KDBPluginUid); + + //find and update all songs associated with oldId + RArray songAttributes; + CleanupClosePushL(songAttributes); + songAttributes.AppendL(KMPXMediaGeneralId); + + CMPXMediaArray* mediaArray = CMPXMediaArray::NewL(); + CleanupStack::PushL(mediaArray); + + //get all songs associated + MPX_TRAP(err, iDbMusic->GetAllSongsForAbstractAlbumL(oldId, songAttributes.Array(), *mediaArray)); + if (err == KErrNotFound) + { + // Leave with KErrNotFound + MPX_DEBUG1("CMPXDbHandler::UpdateAbstractAlbumL, leave with not found"); + User::Leave(KErrNotFound); + } + TInt count(mediaArray->Count()); + MPX_DEBUG2("CMPXDbHandler::UpdateAbstractAlbumL, [%d] songs associated", count); + //go through all songs for updating for (TInt i = 0; i < count; i++) { - CMPXMedia* element = mediaArray->AtL(i); - element->SetTextValueL(KMPXMediaMusicAlbumArtFileName, art ); - visibleChange = UpdateSongL(*element, aItemChangedMessages); + CMPXMedia* song = mediaArray->AtL(i); + song->SetTextValueL(KMPXMediaMusicAlbumArtFileName, uri ); + visibleChange = UpdateSongL(*song, aItemChangedMessages); } - } - else - { - iDbAbstractAlbum->UpdateItemL(rowId, aMedia, drive, &aItemChangedMessages); + CleanupStack::PopAndDestroy(mediaArray); + CleanupStack::PopAndDestroy(&songAttributes); + + //rename TN + iDbAbstractAlbum->HandleTNL(*oldUri, uri, 0); + CleanupStack::PopAndDestroy(oldUri); } - } + EndTransactionL(err); + }//renaming + + //check if abstractAlbum exist in ABSTRACTALBUM table before update it + else if (iDbAbstractAlbum->CategoryItemExistsL(drive, itemId)) + { + //support updating Name, AlbumArtist fields for AbstractAlbum table + iDbAbstractAlbum->UpdateItemL(itemId, aMedia, drive, &aItemChangedMessages); + } } return visibleChange; -} + } + +// ---------------------------------------------------------------------------- +// Update all songs which associate with AbstractAlbum to new AbstractAlbum info +// in the collection +// ---------------------------------------------------------------------------- +// +CMPXDbActiveTask::TChangeVisibility CMPXDbHandler::UpdateSongsAbstractAlbumInfoL( + const CMPXMedia& aMedia, + CMPXMessageArray& aItemChangedMessages) + { + MPX_FUNC("CMPXDbHandler::UpdateSongsAbstractAlbumInfoL"); + const TDesC& uri(aMedia.ValueText (KMPXMediaGeneralUri)); + //need to update songs information to music table + CMPXMediaArray* mediaArray = aMedia.Value(KMPXMediaArrayContents); + User::LeaveIfNull(mediaArray); + TInt count(mediaArray->Count()); + CMPXDbActiveTask::TChangeVisibility visibleChange(CMPXDbActiveTask::ENotVisibile); + for (TInt i = 0; i < count; i++) + { + CMPXMedia* mediaSong = mediaArray->AtL(i); + mediaSong->SetTextValueL(KMPXMediaMusicAlbumArtFileName, uri ); + visibleChange = UpdateSongL(*mediaSong, aItemChangedMessages); + } + return visibleChange; + } #endif // ABSTRACTAUDIOALBUM_INCLUDED + // ---------------------------------------------------------------------------- // Update a song in the collection // ---------------------------------------------------------------------------- @@ -590,40 +664,10 @@ // void CMPXDbHandler::RemoveAbstractAlbumL( TUint32 aAbstractAlbumId, - CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages) + CMPXMessageArray& aItemChangedMessages, TBool aFileDeleted) { MPX_FUNC("CMPXDbHandler::RemoveAbstractAlbumL"); - - BeginTransactionL(); - MPX_TRAPD(err, DoRemoveAbstractAlbumL(aAbstractAlbumId, aUriArray, aItemChangedMessages)); - EndTransactionL(err); - } - -// ---------------------------------------------------------------------------- -// Remove specified abstractalbum -// ---------------------------------------------------------------------------- -// -void CMPXDbHandler::DoRemoveAbstractAlbumL( - TUint32 aAbstractAlbumId, - CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages) - { - MPX_FUNC("CMPXDbHandler::DoRemoveAbstractAlbumL"); - - - HBufC* uri(iDbAbstractAlbum->DeleteAbstractAlbumL(aAbstractAlbumId)); - if (uri) - { - CleanupStack::PushL(uri); - aUriArray.AppendL(*uri); - CleanupStack::PopAndDestroy(uri); - } - - MPXDbCommonUtil::AddItemChangedMessageL(aItemChangedMessages, aAbstractAlbumId, EMPXItemDeleted, - EMPXAbstractAlbum, KDBPluginUid); - - + iDbAbstractAlbum->RemoveAbstractAlbumL(aAbstractAlbumId, aItemChangedMessages, aFileDeleted); } #endif // ABSTRACTAUDIOALBUM_INCLUDED @@ -890,7 +934,7 @@ const TDesC& aUri) { MPX_FUNC("CMPXDbHandler::GetAbstractAlbumIdMatchingUriL"); - return MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, aUri, ETrue); + return MPXDbCommonUtil::GenerateUniqueIdL(iFs, EMPXAbstractAlbum, aUri, EFalse); } #endif // ABSTRACTAUDIOALBUM_INCLUDED @@ -930,7 +974,7 @@ MPX_FUNC("CMPXDbHandler::GetAlbumsMatchingArtistL"); RArray attributes; CleanupClosePushL( attributes ); - + TBool tryGetSongCount = EFalse; TInt attrCount(aAttrs.Count()); TInt i = 0; @@ -948,17 +992,17 @@ tryGetSongCount = ETrue; break; } - + attributes.Append(aAttrs[i]); } - + for (TInt j = i+1; j < attrCount; j++) { attributes.Append(aAttrs[j]); } iDbAlbum->GetSubCategoryItemsL(EMPXArtist, aArtistId, attributes.Array(), aMediaArray); CleanupStack::PopAndDestroy(&attributes); - + TInt pPath(0); if (aMediaArray.Count()) { @@ -969,20 +1013,20 @@ MPX_ASSERT(pPath); } } - + TInt albumCount(aMediaArray.Count()); if (albumCount) { if ( tryGetSongCount ) { TInt startIndex = pPath ? 1 : 0; - + for (TInt i = startIndex; i < albumCount; i++) { CMPXMedia* media = aMediaArray[i]; TUint32 albumId((media->ValueTObjectL(KMPXMediaGeneralId))); - TInt songCount = iDbAlbum->GetSongsCountInAlbumMatchingArtistL(aArtistId, albumId); + TInt songCount = iDbAlbum->GetSongsCountInAlbumMatchingArtistL(aArtistId, albumId); media->SetTObjectValueL(KMPXMediaGeneralCount, songCount ); MPX_DEBUG2(" SongCount[%d]", songCount ); @@ -1487,14 +1531,6 @@ // This is needed for the case where we were OOD before, but user // has cleared some space but now try to refresh MPX_TRAPD(err, iDbManager->InitDatabasesL(iDbDrives)); - iCollectionOpen = ETrue; - // Update (synchronize) music basic table if it's not - // in sync with music table - if(iSynchronizeBasicTable) - { - iDbMusic->RefreshEndL(); - } - iSynchronizeBasicTable = ETrue; if(err == KErrDiskFull) { @@ -1510,11 +1546,9 @@ iOutOfDisk = ETrue; } } - #ifdef __RAMDISK_PERF_ENABLE - iDbManager->CopyDBsToRamL(); + iDbManager->CopyDBsToRamL(); #endif //__RAMDISK_PERF_ENABLE - iDbMusic->RefreshStartL(); BeginTransactionL(); iRefresh = ETrue; @@ -1537,14 +1571,13 @@ curTime.HomeTime(); SetLastRefreshedTimeL(curTime); } - iDbMusic->RefreshEndL(); - //Update of music basic table fails when the collection is not open - //Next time the collection is opened the music basic table must be updated - if (iCollectionOpen ) - { - iSynchronizeBasicTable = EFalse; - } - + +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + //for AbstractAlbum garbage collection + //can not leave + TRAP_IGNORE( AbstractAlbumCleanUpL() ); +#endif + #ifdef __RAMDISK_PERF_ENABLE iDbManager->CopyDBsFromRamL(); #endif //__RAMDISK_PERF_ENABLE @@ -1585,15 +1618,24 @@ iMtpInUse = EFalse; iOpOnDbCount = 0; iDbManager->CommitL(); + TInt err = KErrNone; + #ifdef __RAMDISK_PERF_ENABLE - TRAPD(err, iDbManager->CopyDBsFromRamL()); + TRAP(err, iDbManager->CopyDBsFromRamL()); if ( err != KErrNone ) { MPX_DEBUG2("CMPXDbHandler::MtpEndL error=%d", err); } #endif //__RAMDISK_PERF_ENABLE - + +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + TRAP(err, RemoveAbstractAlbumsWithNoSongL()); + if ( err != KErrNone ) + { + MPX_DEBUG2("CMPXDbHandler::MtpEndL error happened when cleanup albstractalbum with no songs association[%d]", err); + } +#endif MPX_DEBUG1("<--CMPXDbHandler::MtpEndL"); } @@ -1709,14 +1751,14 @@ iDbManager->RollbackL(); User::Leave(aError); } - + if(iOpOnDbCount >= KMaxOpInTransaction) { MPX_DEBUG2("CMPXDbHandler::EndTransactionL - %d>KMaxOpInTransaction Commiting",iOpOnDbCount); iOpOnDbCount = 0; iDbManager->CommitL(); iDbManager->BeginL(); - } + } } else { @@ -1725,7 +1767,7 @@ MPX_DEBUG2("CMPXDbHandler::EndTransactionL - Rollback [%d]", aError); iDbManager->RollbackL(); - + // KSqlDbCorrupted indicates DB corrupted, need to recreate. if ( aError != KSqlDbCorrupted ) { @@ -1775,35 +1817,6 @@ } // ---------------------------------------------------------------------------- -// Notifies the handler that the collection was closed. -// ---------------------------------------------------------------------------- -// -void CMPXDbHandler::CollectionClosed() - { - MPX_FUNC("CMPXDbHandler::CollectionClosed"); - - iCollectionOpen = EFalse; - } - -// ---------------------------------------------------------------------------- -//Notifies the handler that the collection was opened. -// ---------------------------------------------------------------------------- -// -void CMPXDbHandler::CollectionOpenedL() - { - MPX_FUNC("CMPXDbHandler::CollectionOpened"); - - iCollectionOpen = ETrue; - // Update (synchronize) music basic table if it's not - // in sync with music table - if(iSynchronizeBasicTable) - { - iDbMusic->RefreshEndL(); - iSynchronizeBasicTable = EFalse; - } - } - -// ---------------------------------------------------------------------------- // Add song to collection // ---------------------------------------------------------------------------- // @@ -1826,7 +1839,7 @@ // update the playlist tables // make sure the song db flags are reset and not just updated iDbPlaylist->UpdateSongL(aMedia, ETrue); - + if(iMtpInUse) { ++iOpOnDbCount; @@ -2166,7 +2179,7 @@ // add the item changed message MPXDbCommonUtil::AddItemChangedMessageL(aItemChangedMessages, aSongId, EMPXItemDeleted, EMPXSong, KDBPluginUid); - + if(iMtpInUse) { @@ -2349,6 +2362,84 @@ MPXDbCommonUtil::AddItemChangedMessageL(aItemChangedMessages, aSongId, EMPXItemDeleted, 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 @@ -2472,8 +2563,7 @@ TInt attrCount(aAttrs.Count()); if ( attrCount > 1 || (attrCount == 1 && !(aAttrs[0] == KMPXMediaGeneralId)) ) { - TInt abstractAlbumDrive(iDbAbstractAlbum->GetDriveIdL(abstractAlbumId)); - MPX_TRAPD(err, iDbMusic->GetAllSongsForAbstractAlbumL(abstractAlbumDrive, abstractAlbumId, aAttrs, aMediaArray)); + MPX_TRAPD(err, iDbMusic->GetAllSongsForAbstractAlbumL( abstractAlbumId, aAttrs, aMediaArray)); if (err == KErrNotFound) { // @@ -3034,9 +3124,9 @@ TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist -#ifdef ABSTRACTAUDIOALBUM_INCLUDED - ,const TDesC& aAlbumArtist, - const TDesC& aGenre +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + ,const TDesC& aUri + ,const TDesC& aAlbumArtist #endif // ABSTRACTAUDIOALBUM_INCLUDED ) { @@ -3045,21 +3135,28 @@ MPX_PERF_START(CMPXDbHandler_AddCategoryItemL); TBool newRecord(EFalse); -#ifdef ABSTRACTAUDIOALBUM_INCLUDED - TUint32 id(0); +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + TUint32 id(0); //for AbstractAlbum, SetAbstractAlbum, associate songs with abstractalbum. //only called with newRecord as EFalse //increment songCount if id exist in AbstractAlbum table, otherwise do nothing. + + //only Genre, AbstractAlbum are not case sensitive + TBool caseSensitive = ETrue; + if ((aCategory == EMPXGenre) || (aCategory == EMPXAbstractAlbum)) + caseSensitive = EFalse; + if (aCategory == EMPXAbstractAlbum) - { - id = iDbAbstractAlbum->AddItemL( aName, aAlbumArtist, aGenre, aDriveId, newRecord, (aCategory != EMPXGenre)); - } + { + id = iDbAbstractAlbum->AddItemL(aUri, aName, aAlbumArtist, aDriveId, newRecord, caseSensitive); + } else { - id = DbCategoryL(aCategory)->AddItemL(aName, aDriveId, newRecord, (aCategory != EMPXGenre)); -#else + id = DbCategoryL(aCategory)->AddItemL(aName, aDriveId, newRecord, caseSensitive); +#else TUint32 id(DbCategoryL(aCategory)->AddItemL(aName, aDriveId, newRecord, (aCategory != EMPXGenre))); #endif // ABSTRACTAUDIOALBUM_INCLUDED + if (newRecord && aItemChangedMessages) { MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemInserted, @@ -3069,7 +3166,7 @@ // and it is NOT a new record, // we should send the item number changed message else if ( ( aCategory == EMPXGenre || aCategory == EMPXComposer ) && - !newRecord && aItemChangedMessages ) + !newRecord && aItemChangedMessages ) { MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemModified, aCategory, KDBPluginUid); @@ -3079,7 +3176,6 @@ } #endif // ABSTRACTAUDIOALBUM_INCLUDED MPX_PERF_END(CMPXDbHandler_AddCategoryItemL); - return id; } @@ -3107,7 +3203,7 @@ { id = iDbArtist->AddItemL(aName, aArt, aDriveId, newRecord, (aCategory != EMPXGenre)); } - + if (newRecord && aItemChangedMessages) { MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemInserted, @@ -3125,30 +3221,30 @@ MPX_PERF_END(CMPXDbHandler_AddCategoryItemL); return id; - } + } void CMPXDbHandler::UpdateCategoryItemL( - TMPXGeneralCategory aCategory, - TUint32 aCategoryId, - const CMPXMedia& aMedia, - TInt aDrive, - CMPXMessageArray* aItemChangedMessages) - { - switch(aCategory) - { - case EMPXAlbum: + TMPXGeneralCategory aCategory, + TUint32 aCategoryId, + const CMPXMedia& aMedia, + TInt aDrive, + CMPXMessageArray* aItemChangedMessages) + { + switch(aCategory) + { + case EMPXAlbum: iDbAlbum->UpdateItemL(aCategoryId, aMedia, aDrive, aItemChangedMessages); - break; - - case EMPXArtist: - iDbArtist->UpdateItemL(aCategoryId, aMedia, aDrive, aItemChangedMessages); - break; - - default: + break; + + case EMPXArtist: + iDbArtist->UpdateItemL(aCategoryId, aMedia, aDrive, aItemChangedMessages); + break; + + default: DbCategoryL(aCategory)->UpdateItemL(aCategoryId, aMedia, aDrive, aItemChangedMessages); - break; - } - } + break; + } + } // ---------------------------------------------------------------------------- // CMPXDbHandler::DeleteSongForCategoryL // ---------------------------------------------------------------------------- @@ -3250,9 +3346,9 @@ } TInt CMPXDbHandler::HandleGetAlbumsCountForArtistL(TUint32 aArtistId) - { - return iDbAlbum->GetAlbumsCountForArtistL(aArtistId); - } + { + return iDbAlbum->GetAlbumsCountForArtistL(aArtistId); + } TBool CMPXDbHandler::HandleIsUnknownArtistL(TUint32 aArtistId) { @@ -3267,10 +3363,10 @@ // ---------------------------------------------------------------------------------------------------------- // CMPXDbHandler::HandleGetAlbumNameForSongL // ---------------------------------------------------------------------------------------------------------- -// +// HBufC* CMPXDbHandler::HandleGetAlbumNameFromIdL(TUint32 aId) { - return iDbAbstractAlbum->GetNameL(aId); + return iDbAbstractAlbum->GetUriL(aId); } #endif // ABSTRACTAUDIOALBUM_INCLUDED // End of file diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Fri May 14 15:49:53 2010 +0300 @@ -110,6 +110,9 @@ MMPXDbMusicObserver& aObserver) : CMPXDbTable(aDbManager), iObserver(aObserver) +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + ,iArtNeedUpdated(ETrue) +#endif { MPX_FUNC("CMPXDbMusic::CMPXDbMusic"); } @@ -148,7 +151,7 @@ } // add the song DoAddSongL(songId, aMedia, aDrive, aMessageArray); - + return songId; } @@ -238,7 +241,7 @@ oldSongId = (aMedia.ValueTObjectL(KMPXMediaGeneralId)).iId2; if ( oldSongId <= 0 ) { - oldSongId = aSongId; + oldSongId = aSongId; } RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetSong, oldSongId)); CleanupClosePushL(recordset); @@ -253,20 +256,27 @@ visible = DoUpdateSongL(aSongId, aMedia, driveUnit, aItemChangedMessages, recordset); - // Update Album table - if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName) || aMedia.IsSupported(KMPXMediaMusicArtist)) - { - TUint32 albumId = recordset.ColumnInt64(EMusicAlbum); - iObserver.UpdateCategoryItemL(EMPXAlbum, albumId, aMedia, driveUnit, aItemChangedMessages); - } - - // Update Artist table - if ( aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName) ) +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if(iArtNeedUpdated) { - TUint32 artistId = recordset.ColumnInt64(EMusicArtist); - iObserver.UpdateCategoryItemL(EMPXArtist, artistId, aMedia, driveUnit, aItemChangedMessages); +#endif // ABSTRACTAUDIOALBUM_INCLUDED + // Update Album table + if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName) || aMedia.IsSupported(KMPXMediaMusicArtist)) + { + TUint32 albumId = recordset.ColumnInt64(EMusicAlbum); + iObserver.UpdateCategoryItemL(EMPXAlbum, albumId, aMedia, driveUnit, aItemChangedMessages); + } + + // Update Artist table + if ( aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName) ) + { + TUint32 artistId = recordset.ColumnInt64(EMusicArtist); + iObserver.UpdateCategoryItemL(EMPXArtist, artistId, aMedia, driveUnit, aItemChangedMessages); + } +#ifdef ABSTRACTAUDIOALBUM_INCLUDED } - + iArtNeedUpdated = ETrue; //reset flag +#endif // ABSTRACTAUDIOALBUM_INCLUDED CleanupStack::PopAndDestroy(&recordset); } @@ -295,7 +305,7 @@ oldSongId = (aMedia.ValueTObjectL(KMPXMediaGeneralId)).iId2; if ( oldSongId <= 0 ) { - oldSongId = aSongId; + oldSongId = aSongId; } // process the media parameter and construct the fields and values array CMPXDbActiveTask::TChangeVisibility visible(GenerateMusicFieldsValuesL(oldSongId, aMedia, aItemChangedMessages, @@ -665,11 +675,11 @@ // CMPXDbMusic::GetAllSongsLimitedL // ---------------------------------------------------------------------------- // -void CMPXDbMusic::GetAllSongsLimitedL(const TArray& aAttrs, +void CMPXDbMusic::GetAllSongsLimitedL(const TArray& aAttrs, CMPXMediaArray& aMediaArray, TInt aLimit) { 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 ); @@ -684,8 +694,8 @@ void CMPXDbMusic::GetSongsInBlockL( const TArray& aAttrs, CMPXMediaArray& aMediaArray, - TPtrC aTitle, - TUint aNumOfSongs, + TPtrC aTitle, + TUint aNumOfSongs, TBool aAsc) { MPX_FUNC("CMPXDbMusic::GetSongsInBlockL"); @@ -812,13 +822,12 @@ // ---------------------------------------------------------------------------- // void CMPXDbMusic::GetAllSongsForAbstractAlbumL( - TInt aDrive, - TInt aAbstractAlbumId, + TUint aAbstractAlbumId, const TArray& aAttrs, CMPXMediaArray& aMediaArray) { - MPX_FUNC("CMPXDbMusic::GetAllSongsL"); - ExecuteMediaQueryL(aDrive, aAttrs, aMediaArray, KQueryMusicGetSongsForAbstractAlbum(), aAbstractAlbumId); + MPX_FUNC("CMPXDbMusic::GetAllSongsForAbstractAlbumL"); + ExecuteMediaQueryL(aAttrs, aMediaArray, KQueryMusicGetSongsForAbstractAlbum(), aAbstractAlbumId); } #endif // ABSTRACTAUDIOALBUM_INCLUDED @@ -969,7 +978,7 @@ TUint CMPXDbMusic::GetDriveTrackCountL(TInt aDrive) { TUint count(0); - + RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aDrive,KQueryMusicCount)); CleanupClosePushL(recordset); @@ -980,7 +989,7 @@ count = TUint(recordset.ColumnInt64(KMPXTableDefaultIndex)); CleanupStack::PopAndDestroy(&recordset); - + return count; } @@ -992,7 +1001,7 @@ CDesCArray& aUriArr, TInt& aLastID) { MPX_FUNC("CMPXDbMusic::GetMusicUriArrayL"); - + HBufC* query = NULL; if(aFromID == 0) { @@ -1006,11 +1015,11 @@ } RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aDrive,*query)); - + CleanupStack::PopAndDestroy(query); - + CleanupClosePushL(recordset); - + TInt lastID = 0; TInt err(KErrNone); while((err = recordset.Next()) == KSqlAtRow) @@ -1040,37 +1049,17 @@ TUint32 CMPXDbMusic::ArtistForAlbumL(const TUint32 aId) { RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetArtistForAlbum, aId)); - + CleanupClosePushL(recordset); if (recordset.Next() != KSqlAtRow) { User::Leave(KErrNotFound); } - TUint32 artistId = recordset.ColumnInt64(KMPXTableDefaultIndex); - CleanupStack::PopAndDestroy(&recordset); - - return artistId; - } + TUint32 artistId = recordset.ColumnInt64(KMPXTableDefaultIndex); + CleanupStack::PopAndDestroy(&recordset); -// ---------------------------------------------------------------------------- -// CMPXDbMusic::RefreshStartL -// ---------------------------------------------------------------------------- -// -void CMPXDbMusic::RefreshStartL() - { - iRefresh = ETrue; - MPX_FUNC("CMPXDbMusic::RefreshStartL"); - } - -// ---------------------------------------------------------------------------- -// CMPXDbMusic::RefreshEndL -// ---------------------------------------------------------------------------- -// -void CMPXDbMusic::RefreshEndL() - { - MPX_FUNC("CMPXDbMusic::RefreshEndL"); - iRefresh = EFalse; + return artistId; } // ---------------------------------------------------------------------------- @@ -1161,15 +1150,23 @@ MPX_DEBUG1(" !aMedia.IsSupported(KMPXMediaGeneralId)"); TUint32 songId(aMusicTable.ColumnInt64(EMusicUniqueId)); TInt columnCount(aMusicTable.ColumnCount()); +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if(columnCount == 40 && aMusicTable.ColumnIndex(_L("PlUId"))==38) + { + TUint32 pListUId(aMusicTable.ColumnInt64(38)); + aMedia.SetTObjectValueL(KMPXMediaGeneralId, TMPXItemId(pListUId, songId)); + } +#else if(columnCount == 37 && aMusicTable.ColumnIndex(_L("PlUId"))==35) { TUint32 pListUId(aMusicTable.ColumnInt64(35)); aMedia.SetTObjectValueL(KMPXMediaGeneralId, TMPXItemId(pListUId, songId)); - } + } +#endif else - { - aMedia.SetTObjectValueL(KMPXMediaGeneralId, songId); - } + { + aMedia.SetTObjectValueL(KMPXMediaGeneralId, songId); + } MPX_DEBUG2(" SongId[%d]", songId); } // FIX ME temporary always fetch URI @@ -1184,7 +1181,7 @@ } if (aAttrId & EMPXMediaGeneralDrive) { - MPX_DEBUG1(" EMPXMediaGeneralDrive"); + MPX_DEBUG1(" EMPXMediaGeneralDrive"); TDriveUnit driveUnit; if (aMedia.IsSupported(KMPXMediaGeneralUri)) { @@ -1194,10 +1191,10 @@ } else { - MPX_DEBUG1(" !aMedia.IsSupported(KMPXMediaGeneralUri)"); + MPX_DEBUG1(" !aMedia.IsSupported(KMPXMediaGeneralUri)"); driveUnit = MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(), aMusicTable.ColumnInt64(EMusicVolumeId)); - MPX_DEBUG2(" driveUnit=%d", (TInt)driveUnit); + MPX_DEBUG2(" driveUnit=%d", (TInt)driveUnit); } TPtrC driveName(driveUnit.Name()); @@ -1206,12 +1203,12 @@ } if (aAttrId & EMPXMediaGeneralSize) { - MPX_DEBUG1(" EMPXMediaGeneralSize"); + MPX_DEBUG1(" EMPXMediaGeneralSize"); // to-do: store this in the DB } if (aAttrId & EMPXMediaGeneralDuration) { - MPX_DEBUG1(" EMPXMediaGeneralDuration"); + MPX_DEBUG1(" EMPXMediaGeneralDuration"); TInt32 duration(aMusicTable.ColumnInt(EMusicDuration)); aMedia.SetTObjectValueL(KMPXMediaGeneralDuration, duration); MPX_DEBUG2(" Duration[%d]", duration); @@ -1224,42 +1221,42 @@ MPX_DEBUG2(" Title[%S]", &title); } if ( aAttrId & EMPXMediaGeneralDate) - { - MPX_DEBUG1(" EMPXMediaGeneralDate"); - const TDesC& dateStr(MPXDbCommonUtil::GetColumnTextL (aMusicTable, - EMusicTimeAdded)); - if ( dateStr.Compare (KNullDesC)!= 0) - { - TTime dateTime(MPXDbCommonUtil::DesToTTimeL (dateStr)); - aMedia.SetTObjectValueL (KMPXMediaGeneralDate, - dateTime.Int64 ()); - } - MPX_DEBUG2(" Date[%S]", &dateStr); - } + { + MPX_DEBUG1(" EMPXMediaGeneralDate"); + const TDesC& dateStr(MPXDbCommonUtil::GetColumnTextL (aMusicTable, + EMusicTimeAdded)); + if ( dateStr.Compare (KNullDesC)!= 0) + { + TTime dateTime(MPXDbCommonUtil::DesToTTimeL (dateStr)); + aMedia.SetTObjectValueL (KMPXMediaGeneralDate, + dateTime.Int64 ()); + } + MPX_DEBUG2(" Date[%S]", &dateStr); + } if (aAttrId & EMPXMediaGeneralComment) { - MPX_DEBUG1(" EMPXMediaGeneralComment"); + MPX_DEBUG1(" EMPXMediaGeneralComment"); TPtrC comment(MPXDbCommonUtil::GetColumnTextL(aMusicTable, EMusicComment)); aMedia.SetTextValueL(KMPXMediaGeneralComment, comment); MPX_DEBUG2(" Comment[%S]", &comment); } if (aAttrId & EMPXMediaGeneralMimeType) { - MPX_DEBUG1(" EMPXMediaGeneralMimeType"); + MPX_DEBUG1(" EMPXMediaGeneralMimeType"); TPtrC mimeType(MPXDbCommonUtil::GetColumnTextL(aMusicTable, EMusicMimeType)); aMedia.SetTextValueL(KMPXMediaGeneralMimeType, mimeType); MPX_DEBUG2(" MimeType[%S]", &mimeType); } if (aAttrId & EMPXMediaGeneralSynchronized) { - MPX_DEBUG1(" EMPXMediaGeneralSynchronized"); + MPX_DEBUG1(" EMPXMediaGeneralSynchronized"); TInt sync(aMusicTable.ColumnInt(EMusicSync)); aMedia.SetTObjectValueL(KMPXMediaGeneralSynchronized, sync); MPX_DEBUG2(" Synchronized[%d]", sync); } if (aAttrId & EMPXMediaGeneralDeleted) { - MPX_DEBUG1(" EMPXMediaGeneralDeleted"); + MPX_DEBUG1(" EMPXMediaGeneralDeleted"); TInt del(aMusicTable.ColumnInt(EMusicDeleted)); aMedia.SetTObjectValueL(KMPXMediaGeneralDeleted, del); MPX_DEBUG2(" Deleted[%d]", del); @@ -1278,20 +1275,20 @@ } if (aAttrId & EMPXMediaGeneralCollectionId) { - MPX_DEBUG1(" EMPXMediaGeneralCollectionId"); + MPX_DEBUG1(" EMPXMediaGeneralCollectionId"); aMedia.SetTObjectValueL(KMPXMediaGeneralCollectionId, TUid::Uid(KDBPluginUid)); } if(aAttrId & EMPXMediaGeneralCopyright) { - MPX_DEBUG1(" EMPXMediaGeneralCopyright"); + MPX_DEBUG1(" EMPXMediaGeneralCopyright"); TPtrC copyright(MPXDbCommonUtil::GetColumnTextL(aMusicTable, EMusicCopyright)); aMedia.SetTextValueL(KMPXMediaGeneralCopyright, copyright); MPX_DEBUG2(" Copyright[%S]", ©right); } if (aAttrId & EMPXMediaGeneralFlags) { - MPX_DEBUG1(" EMPXMediaGeneralFlags"); + MPX_DEBUG1(" EMPXMediaGeneralFlags"); TUint32 dbFlags(aMusicTable.ColumnInt64(EMusicDbFlag)); MPX_DEBUG2(" dbFlags=%b", dbFlags); TDriveUnit driveUnit; @@ -1306,16 +1303,16 @@ else { driveUnit = MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(), - aMusicTable.ColumnInt64(EMusicVolumeId)); + aMusicTable.ColumnInt64(EMusicVolumeId)); } MPX_DEBUG2(" driveUnit=%d", (TInt)driveUnit); } else { - MPX_DEBUG1(" !aMedia.IsSupported(KMPXMediaGeneralUri)"); + MPX_DEBUG1(" !aMedia.IsSupported(KMPXMediaGeneralUri)"); driveUnit = MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(), aMusicTable.ColumnInt64(EMusicVolumeId)); - MPX_DEBUG2(" driveUnit=%d", (TInt)driveUnit); + MPX_DEBUG2(" driveUnit=%d", (TInt)driveUnit); } TInt driveId = driveUnit & KMPXMediaGeneralFlagsDriveInfo; // 5 bits @@ -1326,12 +1323,12 @@ } if (aAttrId & EMPXMediaGeneralPlayCount) { - MPX_DEBUG1(" EMPXMediaGeneralPlayCount"); + MPX_DEBUG1(" EMPXMediaGeneralPlayCount"); TUint32 playcount(aMusicTable.ColumnInt(EMusicPlayCount)); aMedia.SetTObjectValueL(KMPXMediaGeneralPlayCount, playcount); MPX_DEBUG2(" PlayCount[%d]", playcount); } - + MPX_DEBUG1("<--CMPXDbMusic::UpdateMediaGeneralL"); } @@ -1365,18 +1362,18 @@ MPX_DEBUG2(" Album[%S]", &album); } if ( aAttrId & EMPXMediaMusicYear) - { - const TDesC& dateStr(MPXDbCommonUtil::GetColumnTextL (aMusicTable, - EMusicReleaseDate)); - if ( dateStr.Compare (KNullDesC)!= 0) - { - TTime dateTime(MPXDbCommonUtil::DesToTTimeL (dateStr)); - aMedia.SetTObjectValueL (KMPXMediaMusicYear, - dateTime.Int64 ()); - MPX_DEBUG2(" Year[%d]", dateTime.Int64()); - } - MPX_DEBUG2(" ReleaseDate[%S]", &dateStr); - } + { + const TDesC& dateStr(MPXDbCommonUtil::GetColumnTextL (aMusicTable, + EMusicReleaseDate)); + if ( dateStr.Compare (KNullDesC)!= 0) + { + TTime dateTime(MPXDbCommonUtil::DesToTTimeL (dateStr)); + aMedia.SetTObjectValueL (KMPXMediaMusicYear, + dateTime.Int64 ()); + MPX_DEBUG2(" Year[%d]", dateTime.Int64()); + } + MPX_DEBUG2(" ReleaseDate[%S]", &dateStr); + } if (aAttrId & EMPXMediaMusicAlbumTrack) { TInt32 track(aMusicTable.ColumnInt(EMusicAlbumTrack)); @@ -1456,13 +1453,19 @@ } } #ifdef ABSTRACTAUDIOALBUM_INCLUDED - if (aAttrId & EMPXMediaMusicAlbumArtist) + if (aAttrId & EMPXMediaMusicAlbumArtist) { TPtrC albumartist(MPXDbCommonUtil::GetColumnTextL(aMusicTable, EMusicAlbumArtist)); aMedia.SetTextValueL(KMPXMediaMusicAlbumArtist, albumartist); MPX_DEBUG2(" Music AlbumArtist[%S]", &albumartist); } #endif // ABSTRACTAUDIOALBUM_INCLUDED + if (aAttrId & EMPXMediaMusicAlbumId) + { + TUint32 albumId(aMusicTable.ColumnInt64(EMusicAlbum)); + aMedia.SetTObjectValueL(KMPXMediaMusicAlbumId, albumId); + MPX_DEBUG2(" AlbumId[%d]", albumId); + } } // ---------------------------------------------------------------------------- @@ -1546,7 +1549,7 @@ songChangedMessage = CMPXMedia::NewL(); CleanupStack::PushL(songChangedMessage); MPXDbCommonUtil::FillItemChangedMessageL(*songChangedMessage, aSongId, - aMusicTable ? EMPXItemModified : EMPXItemInserted, EMPXSong, KDBPluginUid); + aMusicTable ? EMPXItemModified : EMPXItemInserted, EMPXSong, KDBPluginUid); } // NOTE: Attributes being processed here should be listed in IsSupported() @@ -1577,7 +1580,7 @@ { curFlag = aMusicTable->ColumnInt64(EMusicDbFlag); } - TUint32 oldFlag(curFlag); + TUint32 oldFlag(curFlag); if (flag & KMPXMediaGeneralFlagsSetOrUnsetBit) { @@ -1717,10 +1720,10 @@ if (aItemChangedMessages) { iObserver.HandlePlayCountModifiedL(*aItemChangedMessages); - } + } addSongChangedMessage = EFalse; } - + MPX_DEBUG2(" PlayCount[%d]", curCount); } @@ -1737,7 +1740,7 @@ if (aItemChangedMessages) { iObserver.HandlePlaybackTimeModifiedL(*aItemChangedMessages); - } + } addSongChangedMessage = EFalse; } MPX_DEBUG2(" PlaybackTime[%S]", time); @@ -1876,6 +1879,12 @@ #ifdef ABSTRACTAUDIOALBUM_INCLUDED TParsePtrC parse(albumArtFilename); TPtrC ext(parse.Ext()); + //set flag to false, so .alb will not overwrite art field in album, artist table + // when song with embedded art + if ((ext.CompareF(KAbstractAlbumExt)== 0) && containEmbeddedArt) + { + iArtNeedUpdated = EFalse; + } if ( ((ext.CompareF(KAbstractAlbumExt)== 0) && !containEmbeddedArt) || (ext.CompareF(KAbstractAlbumExt)!= 0)) { @@ -1968,18 +1977,18 @@ } MPX_DEBUG2(" DRM type[%d]", drmType); } - + if (attributeId & KMPXMediaDrmRightsStatus.iAttributeId) { if (aMusicTable) { - TMPXMediaDrmRightsStatus status = + TMPXMediaDrmRightsStatus status = aMedia.ValueTObjectL(KMPXMediaDrmRightsStatus); - + //.Set the db flag TUint32 curFlag(aMusicTable->ColumnInt64(EMusicDbFlag)); TUint32 oldFlag(curFlag); - + if ((status != EMPXDrmRightsFull) && (status != EMPXDrmRightsRestricted)) { // No rights @@ -1990,18 +1999,18 @@ // Rights valid curFlag &= (KMPXMediaGeneralFlagsIsDrmLicenceInvalid ^ 0xFFFFFFFF); } - + // The field is written ONLY if the flag value is changing if (((curFlag ^ oldFlag) & 0x7FFFFFFF) != 0) { MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicDbFlag, curFlag); visibleChange = CMPXDbActiveTask::EAllVisible; } - + MPX_DEBUG2(" Rights Status[%d]", curFlag); } } - + break; } @@ -2024,7 +2033,7 @@ } // end switch } // end for - // get the current artist/album/genre/composer + // get the current artist/album/genre/composer/abstractalbum // this is required because the recordset may be reused by the code below TUint32 artistId(0); TUint32 albumId(0); @@ -2057,26 +2066,26 @@ } // update the album field - if (UpdateCategoryFieldL(EMPXAlbum, aMedia, KMPXMediaMusicAlbum, albumId, - aDrive, aItemChangedMessages, id, artistIdForAlbum)) + if (UpdateCategoryFieldL(EMPXAlbum, aMedia, KMPXMediaMusicAlbum, albumId, + aDrive, aItemChangedMessages, id, artistIdForAlbum)) { MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicAlbum, id); metaDataModified = (aMusicTable != NULL); visibleChange = CMPXDbActiveTask::EAllVisible; - + // // added to handle error EALU-73WDJN. If the album name of the last song // in the album for the artist is changed to an existing album name from // artist view, a change message needs to be sent in order for UI to // correctly refresh. // - // Fix for EDXU-7BBALS, remove check for HasOtherSongsInArtistAlbumL + // Fix for EDXU-7BBALS, remove check for HasOtherSongsInArtistAlbumL // Always send a Album Inserted message when Album change to get Artist updated if (aItemChangedMessages) { // send album added m essage instead of album deleted or modified // to avoid collection paths of other clients being modified - MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, albumId, + MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, albumId, EMPXItemInserted, EMPXAlbum, KDBPluginUid); } } @@ -2136,7 +2145,7 @@ } CleanupStack::PopAndDestroy(songChangedMessage); } - + return visibleChange; } @@ -2262,7 +2271,7 @@ const TDesC& uri = aCriteria.ValueText(KMPXMediaGeneralUri); TUint32 itemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXCollection, uri, EFalse); - + MPXDbCommonUtil::AddSqlCriterionL(*sqlCriteria, KCriterionMusicUniqueId, itemId); } else if (criterion == KMPXMediaGeneralDrive) @@ -2271,7 +2280,13 @@ { // validate the drive letter, TDriveUnit panics if given drive isn't between // 'A' to 'Z' - TDriveUnit driveUnit(aCriteria.ValueText(KMPXMediaGeneralDrive)); + const TDesC& drive = aCriteria.ValueText(KMPXMediaGeneralDrive); + TInt driveInt = 0; + if( drive == KNullDesC || RFs::CharToDrive( drive[0], driveInt )!= KErrNone ) + { + User::Leave(KErrArgument); + } + TDriveUnit driveUnit(drive); MPXDbCommonUtil::AddSqlCriterionL(*sqlCriteria, KCriterionMusicVolume, MPXDbCommonUtil::GetVolIdMatchDriveIdL(iDbManager.Fs(), driveUnit)); volumeAdded = ETrue; @@ -2390,17 +2405,28 @@ TInt changeMsgCount( 0 ); if( aItemChangedMessages ) { - changeMsgCount = aItemChangedMessages->Count(); + changeMsgCount = aItemChangedMessages->Count(); } - + if (aMedia.IsSupported(aAttribute)) { TPtrC name(aMedia.ValueText(aAttribute).Left(KMCMaxTextLen)); // construct the new ID for the category record +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + // genre and abstractalbum are not case sensitive + TBool caseSensitive = ETrue; + if ((aCategory == EMPXGenre) || (aCategory == EMPXAbstractAlbum)) + caseSensitive = EFalse; + + aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, + name, caseSensitive); + +#else // only genre is not case sensitive aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, name, (aCategory != EMPXGenre)); +#endif if (!aOldId || (aOldId != aItemId)) { // only add if the ID changed, @@ -2410,20 +2436,28 @@ { if (aMedia.ValueTObjectL(KMPXMediaGeneralCategory) == EMPXSong ) { - iObserver.AddCategoryItemL(aCategory, name, aDriveId, - aItemChangedMessages, itemAdded, KNullDesC, KNullDesC); + iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId, + aItemChangedMessages, itemAdded, name, KNullDesC); } else - { - TPtrC albumartist(aMedia.ValueText(KMPXMediaMusicAlbumArtist).Left(KMCMaxTextLen)); - //get AlbumArt, Genre for AbstractAlbum - MPX_DEBUG2(" Music albumartist[%S]", &albumartist); - TPtrC genre(aMedia.ValueText(KMPXMediaMusicGenre).Left(KMCMaxTextLen)); - MPX_DEBUG2(" Music Genre[%S]", &genre); - - // ignore the return value - iObserver.AddCategoryItemL(aCategory, name, aDriveId, - aItemChangedMessages, itemAdded, albumartist, genre); + { + TPtrC albumartist(KNullDesC); + TPtrC abstractAlbumName(KNullDesC); + if (aMedia.IsSupported(KMPXMediaMusicAlbumArtist) ) + { + albumartist.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtist).Left(KMCMaxTextLen)); + //get AlbumArt AbstractAlbum + MPX_DEBUG2(" albumartist[%S]", &albumartist); + } + if (aMedia.IsSupported(KMPXMediaGeneralTitle) ) + { + abstractAlbumName.Set(aMedia.ValueText(KMPXMediaGeneralTitle).Left(KMCMaxTextLen)); + MPX_DEBUG2(" abstractAlbumName[%S]", &abstractAlbumName); + } + // ignore the return value + + iObserver.AddCategoryItemL(aCategory, abstractAlbumName, aDriveId, + aItemChangedMessages, itemAdded, name, albumartist); } } else @@ -2438,24 +2472,29 @@ } else { +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + // genre and abstractalbum are not case sensitive + aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, KNullDesC, + (aCategory != EMPXGenre)&&(aCategory != EMPXAbstractAlbum)); +#else // only genre is not case sensitive aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, KNullDesC, (aCategory != EMPXGenre)); +#endif if (!aOldId || (aOldId != aItemId)) { #ifdef ABSTRACTAUDIOALBUM_INCLUDED if(aCategory == EMPXAbstractAlbum) - { - //get AlbumArt, Genre for AbstractAlbum + { + //get AlbumArt for AbstractAlbum TPtrC albumartist(aMedia.ValueText(KMPXMediaMusicAlbumArtist).Left(KMCMaxTextLen)); - MPX_DEBUG2(" Music albumartist[%S]", &albumartist); - TPtrC genre(aMedia.ValueText(KMPXMediaMusicGenre).Left(KMCMaxTextLen)); - MPX_DEBUG2(" Music Genre[%S]", &genre); - + MPX_DEBUG2(" Music albumartist[%S]", &albumartist); + TPtrC abstractAlbumName(aMedia.ValueText(KMPXMediaGeneralTitle).Left(KMCMaxTextLen)); + MPX_DEBUG2(" Music abstractAlbumName[%S]", &abstractAlbumName); // ignore the return value - iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId, - aItemChangedMessages, itemAdded, albumartist, genre); - } + iObserver.AddCategoryItemL(aCategory, abstractAlbumName, aDriveId, + aItemChangedMessages, itemAdded, KNullDesC, albumartist); + } else #endif // ABSTRACTAUDIOALBUM_INCLUDED { @@ -2466,18 +2505,14 @@ updated = ETrue; } } -#ifdef ABSTRACTAUDIOALBUM_INCLUDED - //no need to delete old item for abstractalbum - if (aOldId && (aOldId != aItemId) && (aCategory != EMPXAbstractAlbum)) -#else - if (aOldId && (aOldId != aItemId)) -#endif // ABSTRACTAUDIOALBUM_INCLUDED + + if (aOldId && (aOldId != aItemId)) { - iObserver.DeleteSongForCategoryL(aCategory, aOldId, aDriveId, + 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 @@ -2493,10 +2528,10 @@ for( TInt i=0; i(KMPXMessageMediaGeneralId); TMPXChangeEventType changeType = msg.ValueTObjectL(KMPXMessageChangeEventType); - + // Look for the added and deleted category IDs // if( id == aOldId && changeType == EMPXItemDeleted ) @@ -2508,8 +2543,8 @@ newId = i; } } - - if( oldId != KErrNotFound && + + if( oldId != KErrNotFound && newId != KErrNotFound ) { aItemChangedMessages->Remove(oldId); // category removed @@ -2541,7 +2576,7 @@ TUint32 aOldId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, - TUint32& aItemId, + TUint32& aItemId, TUint32 aArtistId) { TBool updated(EFalse); @@ -2554,9 +2589,9 @@ TInt changeMsgCount( 0 ); if( aItemChangedMessages ) { - changeMsgCount = aItemChangedMessages->Count(); + changeMsgCount = aItemChangedMessages->Count(); } - + if (aMedia.IsSupported(aAttribute)) { TPtrC name(aMedia.ValueText(aAttribute).Left(KMCMaxTextLen)); @@ -2569,13 +2604,13 @@ { // 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)); - } + TPtrC art(KNullDesC); + if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName)) + { + art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); + } - iObserver.AddCategoryItemL(aCategory, name, aArtistId, art, aDriveId, aItemChangedMessages, itemAdded); + iObserver.AddCategoryItemL(aCategory, name, aArtistId, art, aDriveId, aItemChangedMessages, itemAdded); updated = ETrue; } } @@ -2592,7 +2627,7 @@ art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); } - iObserver.AddCategoryItemL(aCategory, KNullDesC, aArtistId, art, aDriveId, + iObserver.AddCategoryItemL(aCategory, KNullDesC, aArtistId, art, aDriveId, aItemChangedMessages, itemAdded); updated = ETrue; } @@ -2600,11 +2635,11 @@ if (aOldId && (aOldId != aItemId)) { - iObserver.DeleteSongForCategoryL(aCategory, aOldId, aDriveId, + 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 @@ -2620,10 +2655,10 @@ for( TInt i=0; i(KMPXMessageMediaGeneralId); TMPXChangeEventType changeType = msg.ValueTObjectL(KMPXMessageChangeEventType); - + // Look for the added and deleted category IDs // if( id == aOldId && changeType == EMPXItemDeleted ) @@ -2635,8 +2670,8 @@ newId = i; } } - - if( oldId != KErrNotFound && + + if( oldId != KErrNotFound && newId != KErrNotFound ) { aItemChangedMessages->Remove(oldId); // category removed @@ -2676,7 +2711,7 @@ EMPXMediaGeneralTitle | EMPXMediaGeneralUri | EMPXMediaGeneralFlags); - + TBool extraRequired(EFalse); TInt count(aAttrs.Count()); for (TInt i = 0; i < count; ++i) @@ -2705,7 +2740,7 @@ TBool CMPXDbMusic::IsSupported( const CMPXMedia& aMedia) { - MPX_FUNC("CMPXDbMusic::IsSupported"); + MPX_FUNC("CMPXDbMusic::IsSupported"); // this checklist should match the attributes processed in DoFillInDatabaseInfoL return aMedia.IsSupported(KMPXMediaGeneralTitle) || diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplaylist.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplaylist.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplaylist.cpp Fri May 14 15:49:53 2010 +0300 @@ -86,7 +86,7 @@ // ---------------------------------------------------------------------------- // CMPXDbPlaylist::CMPXDbPlaylist( - CMPXDbManager& aDbManager, + CMPXDbManager& aDbManager, MMPXDbPlaylistObserver& aObserver) : CMPXDbTable(aDbManager), iObserver(aObserver) @@ -794,10 +794,10 @@ MPXDbCommonUtil::GetColumnTextL(aRecord, EPlaylistTime)).Int64()); } if ( attributeId & EMPXMediaGeneralDuration ) - { + { // make sure the PlaylistSongs query is executed after all fields // from the current record have been processed, otherwise the recordset - // may point to something else + // may point to something else durationRequested = ETrue; } diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplaylistsongs.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplaylistsongs.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplaylistsongs.cpp Fri May 14 15:49:53 2010 +0300 @@ -525,7 +525,7 @@ attributes.AppendL(KMPXMediaGeneralType); attributes.AppendL(KMPXMediaGeneralCategory); attributes.AppendL(KMPXMediaGeneralId); - + // cannot execute a joined query to the music table // because the song records in the music table may be on a different drive ExecuteMediaQueryL(attributes.Array(), aMediaArray, KQueryPlaylistSongsGetSongs, aPlaylistId); @@ -546,7 +546,7 @@ { MPX_DEBUG2("-->CMPXDbPlaylistSongs::GetSongsL(playlist 0x%x)", aPlaylistId); TBool valid(EFalse); - + RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryPlaylistSongsGetSongsInfo, aPlaylistId)); CleanupClosePushL(recordset); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp --- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp Fri May 14 15:49:53 2010 +0300 @@ -153,6 +153,7 @@ iMusicMenuTitle = iResource->ReadHBufCL(R_MPX_QTN_MUS_TITLE_MUSIC_MENU); #endif // __ENABLE_MUSIC_TEXT_ALIGNMENT + iActiveTask = CMPXDbActiveTask::NewL(*this); CRepository* cenrep(NULL); @@ -335,9 +336,11 @@ break; } case EMcCmdClose: + // called before destructing this plug-in: no actions required + break; case EMcCloseCollection: { - MPX_DEBUG1("CMPXDbPlugin::CommandL - EMcCloseCollection"); + MPX_DEBUG2("CMPXDbPlugin::CommandL - EMcCloseCollection %d", aArg); // Close the specified database TRAP_IGNORE(iDbHandler->PreCloseCollectionL()); #ifdef RD_MULTIPLE_DRIVE @@ -350,7 +353,7 @@ for (TInt i=0; iIsRemoteDrive(static_cast(driveArray[i])))) + if (( driveArray[i] != EDriveC) && (!iDbHandler->IsRemoteDrive(static_cast(driveArray[i])))) { MPX_DEBUG2("Closing database %i", driveArray[i]); TRAP_IGNORE( iDbHandler->CloseDatabaseL( driveArray[i] ) ); @@ -359,12 +362,11 @@ } else { - iDbHandler->CloseDatabaseL(aArg); + TRAP_IGNORE( iDbHandler->CloseDatabaseL(aArg) ); //Closing can fail if physical media has been removed or forced disk dismount has occurred. } #else iDbHandler->CloseDatabaseL(aArg); #endif // RD_MULTIPLE_DRIVE - iDbHandler->CollectionClosed(); break; } case EMcReOpenCollection: @@ -379,7 +381,7 @@ for( TInt i=0; iIsRemoteDrive(static_cast(driveArray[i])))) + if( (driveArray[i] != EDriveC) && (!iDbHandler->IsRemoteDrive(static_cast(driveArray[i])))) { TUint driveStatus(0); User::LeaveIfError( DriveInfo::GetDriveStatus( @@ -394,7 +396,6 @@ #else iDbHandler->OpenDatabaseL(aArg); #endif // RD_MULTIPLE_DRIVE - TRAP_IGNORE(iDbHandler->CollectionOpenedL()); break; } case EMcRefreshStarted: @@ -438,12 +439,12 @@ case EMcCmdMtpStart: iDbHandler->CheckDiskSpaceOnDrivesL(); iMtpInUse = ETrue; - iDbHandler->MtpStartL(); + iDbHandler->MtpStartL(); break; case EMcCmdMtpEnd: iDbHandler->CheckDiskSpaceOnDrivesL(); iMtpInUse = EFalse; - iDbHandler->MtpEndL(); + iDbHandler->MtpEndL(); break; default: { @@ -785,7 +786,6 @@ CMPXMediaArray* array = CMPXMediaArray::NewL(); CleanupStack::PushL(array); -// TInt count(0); TInt levels(aPath.Levels()); TBool isASong(EFalse); @@ -1146,9 +1146,9 @@ // Add "all" item under an artist MPXDbCommonUtil::PrependMediaL(*aArray, *iAllSongsForArtistTitle, EMPXItem, EMPXAlbum, aPath.Id(idIndex), 0, 0, 1); - + (*aArray)[1]->SetTObjectValueL(KMPXMediaGeneralCount, total); - + TMPXItemId allId = ((*aArray)[1]->ValueTObjectL(KMPXMediaGeneralId)); if (aArray->Count() > 2) { // path media, all id and at least one media @@ -1398,6 +1398,7 @@ iDbHandler->GetSongsMatchingPlaylistL(aPath.Id (idIndex).iId2, aAttrs, aArray); } + SetMediaGeneralAttributesL(aEntries, EMPXItem, EMPXPlaylist, aPath.Id(idIndex).iId2); // populate EMPXMediaGeneralNonPermissibleActions @@ -2589,11 +2590,11 @@ mediaId = iDbHandler->GetPlaylistIdMatchingUriL(uri); iDbHandler->RemovePlaylistL(mediaId, *fp, *itemChangedMessages); } -#ifdef ABSTRACTAUDIOALBUM_INCLUDED +#ifdef ABSTRACTAUDIOALBUM_INCLUDED else if (category == EMPXAbstractAlbum ) { mediaId = iDbHandler->GetAbstractAlbumIdMatchingUriL(uri); - iDbHandler->RemoveAbstractAlbumL(mediaId, *fp, *itemChangedMessages); + iDbHandler->RemoveAbstractAlbumL(mediaId, *itemChangedMessages, EFalse); } #endif // ABSTRACTAUDIOALBUM_INCLUDED else @@ -3445,11 +3446,11 @@ CMPXMessageArray* changeMsgAry = CMPXMessageArray::NewL(); CleanupStack::PushL(changeMsgAry); - // start a transaction here - if (!iDbHandler->InTransaction()) - { - iDbHandler->BeginTransactionL(); - } + // start a transaction here + if (!iDbHandler->InTransaction()) + { + iDbHandler->BeginTransactionL(); + } // Group of items if (aMedia.ValueTObjectL(KMPXMediaGeneralType) == EMPXGroup) @@ -3471,8 +3472,8 @@ itemId = DoAddItemL(aMedia, *changeMsgAry); } - // end transaction here. - iDbHandler->EndTransactionL(KErrNone); + // end transaction here. + iDbHandler->EndTransactionL(KErrNone); iActiveTask->SetVisibleChange(CMPXDbActiveTask::EAllVisible); DoHandleChangeL(changeMsgAry); @@ -3529,18 +3530,14 @@ case EMPXAbstractAlbum: { if (aMedia.IsSupported(KMPXMediaGeneralUri)) - { - + { + //add abstractalbum to AbstractAlbum table itemId = iDbHandler->AddAbstractAlbumL(aMedia, &aMessageArray); - + + //in case aMedia as mediaArray which contains songs as arrayContents, need to update all songs associated if ( aMedia.IsSupported(KMPXMediaArrayContents)) { - //need to update songs information to music table - CMPXMediaArray* array = aMedia.Value(KMPXMediaArrayContents); - if (array->Count()) - { - iDbHandler->UpdateAbstractAlbumSongsL(aMedia, aMessageArray); - } + iDbHandler->UpdateSongsAbstractAlbumInfoL(aMedia, aMessageArray); } } else @@ -3553,7 +3550,7 @@ case EMPXSong: { // For the use case of adding thousands of songs at once, - // we do not create a new database transaction for each song; + // we do not create a new database transaction for each song; // Instead DoAddL() will batch 100 songs under a single transaction. // This enhancement improves performance with MMC-based databases. if (aBatchCommit) @@ -3564,7 +3561,7 @@ { itemId = iDbHandler->AddSongL(aMedia, &aMessageArray); } - + MPXDbCommonUtil::AddItemChangedMessageL(aMessageArray, itemId, EMPXItemInserted, EMPXSong, KDBPluginUid); } @@ -3718,7 +3715,20 @@ #ifdef ABSTRACTAUDIOALBUM_INCLUDED case EMPXAbstractAlbum: { - visibleChange = iDbHandler->UpdateAbstractAlbumSongsL(aMedia, aMessageArray); + //update all songes which associate with ABSTRACTALBUM + if (aMedia.IsSupported(KMPXMediaGeneralUri)) + { + //in case aMedia as mediaArray which contains songs as arrayContents, need to update all songs associated + if ( aMedia.IsSupported(KMPXMediaArrayContents)) + { + iDbHandler->UpdateSongsAbstractAlbumInfoL(aMedia, aMessageArray); + } + //only update field values in abstractalbum table, or renaming (change uri) for abstractalbum table + else + { + visibleChange = iDbHandler->UpdateAbstractAlbumL(aMedia, aMessageArray); + } + } } break; #endif // ABSTRACTAUDIOALBUM_INCLUDED @@ -4382,9 +4392,9 @@ case EBrowseComposer: { aAttrs.AppendL( TMPXAttribute(KMPXMediaIdMusic, -// EMPXMediaMusicArtist | EMPXMediaMusicAlbumArtFileName ) ); +// EMPXMediaMusicArtist | EMPXMediaMusicAlbumArtFileName ) ); //added ganes - EMPXMediaMusicArtist | EMPXMediaMusicAlbumArtFileName | EMPXMediaMusicAlbum) ); + EMPXMediaMusicArtist | EMPXMediaMusicAlbumArtFileName | EMPXMediaMusicAlbum) ); aSupportedIds.AppendL( KMPXMediaIdMusic ); break; } diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxdbpodcast.h --- a/mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxdbpodcast.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxdbpodcast.h Fri May 14 15:49:53 2010 +0300 @@ -148,13 +148,16 @@ * @param aEpisodeId the ID of the episode to be removed * @param aUriArray on return contains the URI of the deleted episode * @param aItemChangedMessages on return contains changed messages + * @param IsAdd denotes whether DeleteEpisodeL is called as part of + * adding an episode or deleting an episode ,if called as part of adding + * pass ETrue else if part of deletion pass EFalse. * @param aDeleteRecord indicates whether the client has explictly requested * to delete the records from the database. If ETrue, records * associated with the media will be deleted from the database; * if EFalse, the record will be marked as deleted only. */ void DeleteEpisodeL(TUint32 aEpisodeId, CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages, TBool aDeleteRecord); + CMPXMessageArray& aItemChangedMessages, TBool IsAdd, TBool aDeleteRecord); /** * Remove episodes matching a category from the Podcast table @@ -618,6 +621,8 @@ * @param aRecordset episode record to be removed * @param aUriArray, on return will be filled with all the paths that were removed * @param aItemChangedMessages: change events as result of the episode removal + * @param IsAdd denotes whether DoDeleteEpisodeL is called as part of + * adding an episode or deleting an episode. * @param aDeleteRecord: indicates whether the client has explictly requested * to delete the records from the database. If ETrue, records * associated with the media will be deleted from the database; @@ -626,7 +631,7 @@ * @return Error code. */ void DoDeleteEpisodeL(RSqlStatement& aRecordset, CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages, TBool aDeleteRecord = EFalse); + CMPXMessageArray& aItemChangedMessages, TBool IsAdd, TBool aDeleteRecord = EFalse); /** * Constructs the fields and corresponding values to be written into the Podcast diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h --- a/mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/inc/mpxpodcastcollectiondbdef.h Fri May 14 15:49:53 2010 +0300 @@ -15,7 +15,6 @@ * */ - #ifndef MPXPODCASTCOLLECTIONDBDEF_H #define MPXPODCASTCOLLECTIONDBDEF_H diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxdbcategory.cpp --- a/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxdbcategory.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxdbcategory.cpp Fri May 14 15:49:53 2010 +0300 @@ -588,13 +588,17 @@ iDbManager.ExecuteSelectQueryL(aDriveId, *query, aId)); CleanupClosePushL(recordset); - if (recordset.Next() != KSqlAtRow) + TInt err(KSqlAtEnd); + TInt ret(0) ; + while((err = recordset.Next()) == KSqlAtRow) + { + ret += recordset.ColumnInt(KMPXTableDefaultIndex); + } + if(err != KSqlAtEnd) { User::Leave(KErrNotFound); } - - TInt ret = recordset.ColumnInt(KMPXTableDefaultIndex); - + MPX_DEBUG2("CMPXDbCategory::GetEpisodeCountL Count %d" , ret); CleanupStack::PopAndDestroy(&recordset); CleanupStack::PopAndDestroy(query); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxdbpodcast.cpp --- a/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxdbpodcast.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxdbpodcast.cpp Fri May 14 15:49:53 2010 +0300 @@ -144,7 +144,16 @@ CMPXMessageArray* itemChangedMessages = CMPXMediaArray::NewL(); CleanupStack::PushL( itemChangedMessages ); - DeleteEpisodeL( episodeId, *fp, *itemChangedMessages, ETrue ); + //Isadd is passed as true as its called from AddEpisodeL + //IsAdd true means dont decrement the episode count from tables like + //Artist Genere, Album, and Composer , which is not needed when + //DeleteEpisodeL is called as part of Add operation + TRAPD( err, DeleteEpisodeL( episodeId, *fp, *itemChangedMessages, ETrue, ETrue ) ); + + if ( err != KErrNone ) // EpisodeExistL has found a record from a previously deleted episode, cleanup it now + { + iDbManager.ExecuteQueryL( aDrive, KQueryPodcastDelete(), episodeId ); + } CleanupStack::PopAndDestroy( itemChangedMessages ); CleanupStack::PopAndDestroy( fp ); @@ -187,7 +196,7 @@ void CMPXDbPodcast::DeleteEpisodeL( TUint32 aEpisodeId, CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages, + CMPXMessageArray& aItemChangedMessages, TBool IsAdd, TBool aDeleteRecord) { MPX_FUNC("CMPXDbPodcast::DeleteEpisodeL"); @@ -199,7 +208,7 @@ { User::Leave(KErrNotFound); } - DoDeleteEpisodeL(recordset, aUriArray, aItemChangedMessages, aDeleteRecord); + DoDeleteEpisodeL(recordset, aUriArray, aItemChangedMessages, IsAdd, aDeleteRecord); CleanupStack::PopAndDestroy(&recordset); } @@ -1224,7 +1233,7 @@ void CMPXDbPodcast::DoDeleteEpisodeL( RSqlStatement& aRecordset, CDesCArray& aUriArray, - CMPXMessageArray& aItemChangedMessages, + CMPXMessageArray& aItemChangedMessages, TBool IsAdd , TBool aDeleteRecord) { MPX_FUNC("CMPXDbPodcast::DoDeleteEpisodeL"); @@ -1235,22 +1244,28 @@ aUriArray.AppendL(*uri); TDriveUnit driveUnit(*uri); CleanupStack::PopAndDestroy(uri); - - // process the author - iObserver.DeleteEpisodeForCategoryL(EMPXArtist, aRecordset.ColumnInt64(EPodcastArtist), - driveUnit, &aItemChangedMessages); + + //if adding then dont delete episode category + if(!IsAdd) + { + // process the author + iObserver.DeleteEpisodeForCategoryL(EMPXArtist, aRecordset.ColumnInt64(EPodcastArtist), + driveUnit, &aItemChangedMessages ); + + // process the title + iObserver.DeleteEpisodeForCategoryL(EMPXAlbum, aRecordset.ColumnInt64(EPodcastAlbum), + driveUnit, &aItemChangedMessages); + + // process the genre + iObserver.DeleteEpisodeForCategoryL(EMPXGenre, aRecordset.ColumnInt64(EPodcastGenre), + driveUnit, &aItemChangedMessages); + + // process the composer + iObserver.DeleteEpisodeForCategoryL(EMPXComposer, aRecordset.ColumnInt64(EPodcastComposer), + driveUnit, &aItemChangedMessages); + } + - // process the title - iObserver.DeleteEpisodeForCategoryL(EMPXAlbum, aRecordset.ColumnInt64(EPodcastAlbum), - driveUnit, &aItemChangedMessages); - - // process the genre - iObserver.DeleteEpisodeForCategoryL(EMPXGenre, aRecordset.ColumnInt64(EPodcastGenre), - driveUnit, &aItemChangedMessages); - - // process the composer - iObserver.DeleteEpisodeForCategoryL(EMPXComposer, aRecordset.ColumnInt64(EPodcastComposer), - driveUnit, &aItemChangedMessages); // add a change event for removing the episode itself TUint32 episodeId(aRecordset.ColumnInt64(EPodcastUniqueId)); diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbhandler.cpp --- a/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbhandler.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbhandler.cpp Fri May 14 15:49:53 2010 +0300 @@ -1211,8 +1211,9 @@ } #endif - // delete the episode - iDbPodcast->DeleteEpisodeL(aEpisodeId, aUriArray, aItemChangedMessages, deleteRecord); + // delete the episode + // IsAdd is passed EFalse to ensure the episode count will be decremented + iDbPodcast->DeleteEpisodeL(aEpisodeId, aUriArray, aItemChangedMessages, EFalse, deleteRecord); } // ---------------------------------------------------------------------------- diff -r ecf06a08d4d9 -r 3ec52facab4d mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbplugin.cpp --- a/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbplugin.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpserviceplugins/mpxsqlitepodcastdbplugin/src/mpxpodcastdbplugin.cpp Fri May 14 15:49:53 2010 +0300 @@ -22,7 +22,6 @@ #include #include -//#include #include #include #include @@ -338,7 +337,7 @@ for (TInt i=0; iIsRemoteDrive(static_cast(driveArray[i])))) + if ((driveArray[i] != EDriveC) && (!iDbHandler->IsRemoteDrive(static_cast(driveArray[i])))) { MPX_DEBUG2("Closing database %i", driveArray[i]); TRAP_IGNORE( iDbHandler->CloseDatabaseL( driveArray[i] ) ); @@ -366,7 +365,7 @@ for( TInt i=0; iIsRemoteDrive(static_cast(driveArray[i])))) + if (( driveArray[i] != EDriveC ) && (!iDbHandler->IsRemoteDrive(static_cast(driveArray[i])))) { TUint driveStatus(0); User::LeaveIfError( DriveInfo::GetDriveStatus( @@ -738,7 +737,6 @@ CMPXMediaArray* array = CMPXMediaArray::NewL(); CleanupStack::PushL(array); -// TInt count(0); TInt levels(aPath.Levels()); TBool isEpisode(EFalse); @@ -2285,7 +2283,7 @@ fp->AppendL(*uri); CleanupStack::PopAndDestroy(uri); iSelections.Remove(0); - + } aCmd.SetNoNewLCObjectL (KMPXCommandCollectionRetrieveMediaUriArray, fp); if (iFirstDeleteStep) @@ -2723,8 +2721,8 @@ } else // Single item { - if ( iDbHandler ) - { + if(iDbHandler) + { visibleChange = iDbHandler->UpdateEpisodeL(*task, msgArray); done = ETrue; } @@ -2863,7 +2861,7 @@ } iDbHandler->EndTransactionL( err ); } - + // Broadcase change messages // if (iActiveTask->GetVisibleChange()) @@ -2877,9 +2875,9 @@ if (aErr != KErrCancel) { iObs->HandleCommandComplete(NULL, aErr); - } + } } - + // ---------------------------------------------------------------------------------------------------------- // Complete a delete operation @@ -3096,7 +3094,7 @@ EMPXMediaGeneralUri | EMPXMediaGeneralFlags | EMPXMediaGeneralCount | EMPXMediaGeneralPlayCount | EMPXMediaGeneralLastPlaybackPosition | EMPXMediaGeneralCollectionId | EMPXMediaGeneralDate)); - + aAttrs.AppendL(TMPXAttribute(KMPXMediaIdPodcast, EMPXMediaPodcastType | EMPXMediaPodcastCategoryGroup | EMPXMediaPodcastIsPlaying)); diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerartists.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerartists.h Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Music Player collection container definition - Artists. +* +*/ + +#ifndef MPCOLLECTIONCONTAINERARTISTS_H +#define MPCOLLECTIONCONTAINERARTISTS_H + +#include "mpcollectionlistcontainer.h" + +class HbGroupBox; + +class MpCollectionContainerArtists : public MpCollectionListContainer +{ + Q_OBJECT + +public: + + explicit MpCollectionContainerArtists( HbDocumentLoader *loader, QGraphicsItem *parent=0 ); + virtual ~MpCollectionContainerArtists(); + +public slots: + + void itemActivated( const QModelIndex &index ); + +private: + + void setupContainer(); + +private: + + HbGroupBox *mInfoBar; // Own + + QString mArtist; + QString mAlbum; + +}; + +#endif // MPCOLLECTIONCONTAINERARTISTS_H + diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/inc/mpcollectionpopuphandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionpopuphandler.h Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Music Player popup handler. +* +*/ + +#ifndef MPCOLLECTIONPOPUPHANDLER_H +#define MPCOLLECTIONPOPUPHANDLER_H + +#include + +class MpCollectionView; +class HbPopup; +class HbAction; +class MpEngine; +class QAbstractItemModel; +class MpMpxCollectionData; +class QPointF; + +class MpCollectionPopupHandler : public QObject +{ + Q_OBJECT + +public: + MpCollectionPopupHandler( MpCollectionView *parent ); + virtual ~MpCollectionPopupHandler(); + + void openDefaultViewContextMenu( int index, const QPointF &coords ); + void openFetchViewContextMenu( int index, const QPointF &coords ); + void openRenamePlaylistContainerDialog( const QString ¤tName ); + void openRenamePlaylistItemDialog( const QString ¤tName ); + void openAddSongsToPlaylist( QAbstractItemModel* model ); + void openDeleteSongs( QAbstractItemModel* model ); + void openAddToCurrentPlaylist( MpMpxCollectionData* collectionData ); + void openCreateNewPlaylist( MpMpxCollectionData* collectionData ); + void openArrangeSongs( MpMpxCollectionData* collectionData ); + void cancelOngoingPopup(); + + bool showingPopup(); + +public slots: + //Context Menus + void defaultContextMenuOptionSelected( HbAction *selectedAction ); + void fetcherContextMenuOptionSelected( HbAction *selectedAction ); + + //Dialogs + void handleAddToPlaylistDialogFinished( HbAction *selectedAction ); + void handleAddToPlaylistGetTextFinished( HbAction *selectedAction ); + void handleRenamePlaylistContainer( HbAction *selectedAction ); + void handleRenamePlaylistItem( HbAction *selectedAction ); + void handleAddSongsToPlayList( HbAction *selectedAction ); + void handleDeleteSongs( HbAction *selectedAction ); + void handleAddToCurrentPlaylist( HbAction *selectedAction ); + void handleCreateNewPlaylistGetTextFinished( HbAction *selectedAction ); + void handleCreateNewPlaylistGetModelIndexesFinished( HbAction *selectedAction ); + void handleArrangeSongs( HbAction *selectedAction ); + void handleRequestDelete( HbAction *selectedAction ); + + void outstandingPopupClosing(); + +private: + void setOutstandingPopup( HbPopup *popup ); + void clearOutstandingPopup( HbPopup *popup ); + void launchAddToPlaylistDialog( QList &selection ); + void queryNewPlaylistName(const QStringList &playlists, const char *handler ); + void getText(const QString &label, const QString &text, const char *handler ); + void getModelIndexes( const QString &label, QAbstractItemModel* model, const char *handler ); + void launchArrangeSongsDialog( MpMpxCollectionData* collectionData ); + void requestDelete( QList &selection ); + +private: + MpCollectionView *mView; // Not own + HbPopup *mOutstandingPopup; // Own + MpEngine *mMpEngine; // Not own + + class MpPopupHandlerPermanentData : public QObject + { + public: + MpPopupHandlerPermanentData( QObject *parent=0 ); + virtual ~MpPopupHandlerPermanentData(); + void clear(); + public: + MpMpxCollectionData *mIsolatedCollectionData; // Not own + QAbstractItemModel *mAbstractItemModel; // Own + QList mSelectedItems; + QString mOriginalName; + int mContextMenuIndex; + }; + + MpPopupHandlerPermanentData *mPermanentData; // Own +}; + +#endif // MPCOLLECTIONPOPUPHANDLER_H + diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h --- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h Fri May 14 15:49:53 2010 +0300 @@ -38,8 +38,8 @@ class MpMpxCollectionData; class MpNowPlayingWidget; class MpSnapshotWidget; +class MpCollectionPopupHandler; class QTranslator; -class HbPopup; class MpCollectionView : public MpViewBase { @@ -54,6 +54,8 @@ void activateView(); void deactivateView(); void setDefaultView(); + bool isActivated(); + void openItem( int index ); signals: @@ -65,6 +67,7 @@ void openSongs(); void openArtists(); + void openAlbums(); void openPlaylists(); void openGenres(); void find(); @@ -91,11 +94,8 @@ void prepareToAddToPlaylist(); void handleIsolatedCollectionOpened( MpMpxCollectionData* collectionData ); - void addToCurrentPlaylist( MpMpxCollectionData* collectionData ); - void createNewPlaylist( MpMpxCollectionData* collectionData ); void arrangeSongs(); void openContextMenu( int index, const QPointF &coords ); - void outstandingPopupClosing(); void handleUsbBlocked( bool blocked ); void handleLibraryAboutToUpdate(); @@ -103,9 +103,6 @@ private: - void openDefaultViewContextMenu( int index, const QPointF &coords ); - void openFetchViewContextMenu( int index, const QPointF &coords ); - void setMainToolBar(); void setPlaylistToolBar(); @@ -118,13 +115,8 @@ void setBannerVisibility( bool visible ); int generateShuffleIndex(); - void launchAddToPlaylistDialog( QList &selection ); void startContainerTransition( TCollectionContext contextFrom, TCollectionContext contextTo ); - void requestDelete( QList &selection ); - QModelIndexList getModelIndexes( const QString &label, QAbstractItemModel* model, bool &ok ); - QString getText(const QString &label,const QString &text, bool &ok); - void setOutstandingPopup(HbPopup *popup); - bool queryNewPlaylistName(QString &newPlaylistName , const QStringList &playlists ); + void cancelOngoingOperation(); private: @@ -142,8 +134,8 @@ bool mBannerAttached; HbMainWindow *mWindow; // Not own - HbAction *mSoftKeyQuit; // Not own - HbAction *mSoftKeyBack; // Not own + HbAction *mNavigationQuit; // Not own + HbAction *mNavigationBack; // Not own MpCollectionDocumentLoader *mDocumentLoader; // Own HbWidget *mMainContainer; // Own @@ -157,7 +149,7 @@ QTranslator *mCommonTranslator; // Own bool mActivationWaiting; - HbPopup *mOutstandingPopup; // Not own + MpCollectionPopupHandler *mMpPopupHandler; // Own bool mUsbBlocked; diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/mpcollectionviewplugin.pro --- a/mpviewplugins/mpcollectionviewplugin/mpcollectionviewplugin.pro Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/mpcollectionviewplugin.pro Fri May 14 15:49:53 2010 +0300 @@ -47,10 +47,12 @@ src/mpcollectioncontainer.cpp \ src/mpcollectionlistcontainer.cpp \ src/mpcollectioncontainerallsongs.cpp \ + src/mpcollectioncontainerartists.cpp \ src/mpcollectioncontaineralbums.cpp \ src/mpcollectioncontainerplaylists.cpp \ src/mpcollectioncontainergenres.cpp \ - src/mpsnapshotwidget.cpp + src/mpsnapshotwidget.cpp \ + src/mpcollectionpopuphandler.cpp HEADERS = ../../inc/mpviewbase.h \ inc/mpcollectionviewplugin.h \ @@ -60,9 +62,11 @@ inc/mpcollectioncontainer.h \ inc/mpcollectionlistcontainer.h \ inc/mpcollectioncontainerallsongs.h \ + inc/mpcollectioncontainerartists.h \ inc/mpcollectioncontaineralbums.h \ inc/mpcollectioncontainerplaylists.h \ inc/mpcollectioncontainergenres.h \ - inc/mpsnapshotwidget.h + inc/mpsnapshotwidget.h \ + inc/mpcollectionpopuphandler.h RESOURCES += resources/mpcollectionviewresources.qrc diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/resources/musiccollection.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpcollectionviewplugin/resources/musiccollection.docml Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + +
+ +
\ No newline at end of file diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerartists.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerartists.cpp Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,193 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Music Player collection container definition - Artists. +* +*/ + +#include + +#include +#include +#include +#include + +#include "mpcollectioncontainerartists.h" +#include "mpmpxcollectiondata.h" +#include "mptrace.h" + +/*! + \class MpCollectionContainerArtists + \brief Music Player collection container definition - Artists. + + 'Artists' collection container implements the interface specified + by MpCollectionContainer. It provides a layout and widgets for the + 'Artists' view. + + This container handles the following contexts: + \li ECollectionContextArtists + \li ECollectionContextArtistAlbums + \li ECollectionContextArtistSongs + + \sa MpCollectionContainer +*/ + +/*! + Constructs the collection container. + */ +MpCollectionContainerArtists::MpCollectionContainerArtists( HbDocumentLoader *loader, QGraphicsItem *parent ) + : MpCollectionListContainer(loader, parent), + mInfoBar(0) +{ + TX_LOG +} + +/*! + Destructs the collection container. + */ +MpCollectionContainerArtists::~MpCollectionContainerArtists() +{ + TX_ENTRY + delete mInfoBar; + delete mList; + TX_EXIT +} + +/*! + Slot to be called when an item is selected by the user. + */ +void MpCollectionContainerArtists::itemActivated( const QModelIndex &index ) +{ + int row = index.row(); + TX_ENTRY_ARGS("index=" << row); + + if ( mCollectionContext == ECollectionContextArtists ) { + mArtist = mCollectionData->itemData(row, MpMpxCollectionData::Title); + if ( mArtist.isEmpty() ) { + mArtist = hbTrId("txt_mus_subtitle_unknown"); + } + } + else if ( mCollectionContext == ECollectionContextArtistAlbums ) { + mAlbum = mCollectionData->itemData(row, MpMpxCollectionData::Title); + if ( mAlbum.isEmpty() ) { + mAlbum = hbTrId("txt_mus_dblist_val_unknown3"); + } + } + MpCollectionListContainer::itemActivated(index); + TX_EXIT +} + +/*! + Sets up the container by organizing widgets according to its layout. + + \reimp + */ +void MpCollectionContainerArtists::setupContainer() +{ + TX_ENTRY_ARGS("mCollectionContext=" << mCollectionContext); + if ( mCollectionData->count() ) { + bool ok = false; + QGraphicsWidget *widget; + if ( mCollectionContext == ECollectionContextArtists ) { + mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "artists", &ok); + if ( !ok ) { + TX_LOG_ARGS("Error: invalid xml file."); + Q_ASSERT_X(ok, "MpCollectionContainerArtists::setupContainer", "invalid xml file"); + } + if ( !mList ) { + widget = mDocumentLoader->findWidget(QString("artistsList")); + mList = qobject_cast(widget); + mIndexFeedback->setItemView(mList); + initializeList(); + } + if ( mInfoBar ) { + delete mInfoBar; + mInfoBar = 0; + } + } + else if ( mCollectionContext == ECollectionContextArtistAlbums ) { + mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "artistSongs", &ok); + if ( !ok ) { + TX_LOG_ARGS("Error: invalid xml file."); + Q_ASSERT_X(ok, "MpCollectionContainerArtists::setupContainer", "invalid xml file"); + } + + widget = mDocumentLoader->findWidget(QString("artistSongsDetail")); + mInfoBar = qobject_cast(widget); + + QString details; + if ( mViewMode == MpCommon::FetchView ) { + details = "Select a song"; + } + else { + details = mArtist; + } + mInfoBar->setHeading(details); + } + else if ( mCollectionContext == ECollectionContextAlbumSongs ) { + mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "artistSongs", &ok); + if ( !ok ) { + TX_LOG_ARGS("Error: invalid xml file."); + Q_ASSERT_X(ok, "MpCollectionContainerArtists::setupContainer", "invalid xml file"); + } + + widget = mDocumentLoader->findWidget(QString("artistSongsDetail")); + mInfoBar = qobject_cast(widget); + + QString details; + if ( mViewMode == MpCommon::FetchView ) { + details = "Select a song"; + } + else { + details = mArtist; + details.append(" - "); + details.append(mAlbum); + } + mInfoBar->setHeading(details); + } + else if ( mCollectionContext == ECollectionContextArtistSongs ) { + mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "artistSongs", &ok); + if ( !ok ) { + TX_LOG_ARGS("Error: invalid xml file."); + Q_ASSERT_X(ok, "MpCollectionContainerArtists::setupContainer", "invalid xml file"); + } + + widget = mDocumentLoader->findWidget(QString("artistSongsDetail")); + mInfoBar = qobject_cast(widget); + + QString details; + if ( mViewMode == MpCommon::FetchView ) { + details = "Select a song"; + } + else if ( mArtist.isEmpty() ) { + details = hbTrId("txt_mus_subtitle_unknown_all"); + } + else{ + details = hbTrId( "txt_mus_subtitle_1_all" ).arg(mArtist); + + } + mInfoBar->setHeading(details); + } + } + else { + if ( mInfoBar ) { + // When last song in an album is deleted and album list is reloaded + delete mInfoBar; + mInfoBar = 0; + } + // Call empty list from base class + setupEmptyListContainer(); + } + TX_EXIT +} + diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerfactory.cpp --- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerfactory.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerfactory.cpp Fri May 14 15:49:53 2010 +0300 @@ -21,6 +21,7 @@ #include "mpcollectionview.h" #include "mpcollectioncontainer.h" #include "mpcollectioncontainerallsongs.h" +#include "mpcollectioncontainerartists.h" #include "mpcollectioncontaineralbums.h" #include "mpcollectioncontainerplaylists.h" #include "mpcollectioncontainergenres.h" @@ -75,6 +76,16 @@ connect( mCurrentContainer, SIGNAL(itemActivated(int)), mView, SLOT(openIndex(int)) ); connect( mCurrentContainer, SIGNAL(itemLongPressed(int, QPointF)), mView, SLOT(openContextMenu(int, QPointF)) ); break; + case ECollectionContextArtists: + if ( ( mCurrentContext != ECollectionContextArtistAlbums ) && ( mCurrentContext != ECollectionContextAlbumSongs) ) + { + deleteCurrentContainer(); + mCurrentContainer = new MpCollectionContainerArtists(mDocumentLoader); + mCurrentContainer->initialize(); + connect( mCurrentContainer, SIGNAL(itemActivated(int)), mView, SLOT(openIndex(int)) ); + connect( mCurrentContainer, SIGNAL(itemLongPressed(int, QPointF)), mView, SLOT(openContextMenu(int, QPointF)) ); + } + break; case ECollectionContextAlbums: if ( mCurrentContext != ECollectionContextAlbumSongs ) { deleteCurrentContainer(); @@ -103,6 +114,8 @@ } break; case ECollectionContextAlbumSongs: + case ECollectionContextArtistAlbums: + case ECollectionContextArtistSongs: case ECollectionContextPlaylistSongs: case ECollectionContextGenreSongs: // For this contexts, reuse the same container. @@ -123,6 +136,11 @@ case ECollectionContextAllSongs: delete static_cast(mCurrentContainer); break; + case ECollectionContextArtists: + case ECollectionContextArtistAlbums: + case ECollectionContextArtistSongs: + delete static_cast(mCurrentContainer); + break; case ECollectionContextAlbums: case ECollectionContextAlbumSongs: delete static_cast(mCurrentContainer); diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,1039 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Music Player collection popup handler. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mpengine.h" +#include "mpcollectionview.h" +#include "mpmpxcollectiondata.h" +#include "mpcollectiondatamodel.h" +#include "mpmpxcollectionviewdefs.h" +#include "mpcollectionpopuphandler.h" +#include "mptrace.h" + +const int KNullIndex = -1; + +/*! + \class MpCollectionPopupHandler + \brief Music Player collection popup handler. + + This class controls the asynchronous operation of all dialogs + used by collection view. +*/ + +/*! + Constructs the collection popup handler. + */ +MpCollectionPopupHandler::MpCollectionPopupHandler( MpCollectionView *parent ) + : QObject( parent ), + mView( parent ), + mOutstandingPopup( 0 ), + mMpEngine( 0 ), + mPermanentData( 0 ) +{ + TX_ENTRY + mMpEngine = MpEngine::instance(); + mPermanentData = new MpPopupHandlerPermanentData( this ); + TX_EXIT +} + +/*! + Destructs the collection popup handler. + */ +MpCollectionPopupHandler::~MpCollectionPopupHandler() +{ + TX_ENTRY + delete mOutstandingPopup; + TX_EXIT +} + +/*! + Default view context menu. + */ +void MpCollectionPopupHandler::openDefaultViewContextMenu( int index, const QPointF &coords ) +{ + TX_ENTRY + HbMenu *contextMenu = 0; + HbAction *action; + bool usbBlocked = mMpEngine->verifyUsbBlocking(); + + switch ( mMpEngine->collectionData()->context() ) { + case ECollectionContextAllSongs: + case ECollectionContextArtistSongs: + case ECollectionContextAlbumSongs: + contextMenu = new HbMenu(); + action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) ); + action->setObjectName( "open" ); + action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) ); + action->setObjectName( "add" ); + action->setEnabled( !usbBlocked ); + action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) ); + action->setObjectName( "delete" ); + action->setEnabled( !usbBlocked ); + break; + case ECollectionContextAlbums: + case ECollectionContextArtists: + case ECollectionContextArtistAlbums: + contextMenu = new HbMenu(); + action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) ); + action->setObjectName( "open" ); + action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) ); + action->setObjectName( "add" ); + action->setEnabled( !usbBlocked ); + action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) ); + action->setObjectName( "delete" ); + action->setEnabled( !usbBlocked ); + break; + case ECollectionContextPlaylists: + if ( !mMpEngine->collectionData()->isAutoPlaylist( index ) ) { + contextMenu = new HbMenu(); + action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) ); + action->setObjectName( "open" ); + action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) ); + action->setObjectName("delete"); + action->setEnabled( !usbBlocked ); + action = contextMenu->addAction( hbTrId( "txt_common_menu_rename_item" ) ); + action->setObjectName( "rename playlist" ); + action->setEnabled( !usbBlocked ); + } + break; + case ECollectionContextPlaylistSongs: + if ( !mMpEngine->collectionData()->isAutoPlaylist() ) { + contextMenu = new HbMenu(); + action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) ); + action->setObjectName( "open" ); + action = contextMenu->addAction( hbTrId( "txt_common_menu_remove" ) ); + action->setObjectName( "delete" ); + action->setEnabled( !usbBlocked ); + } + break; + default: + break; + } + + if ( contextMenu ) { + if ( mView->isActivated() ) { + mPermanentData->mContextMenuIndex = index; + contextMenu->setPreferredPos( coords ); + contextMenu->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup( contextMenu ); + contextMenu->open( this, SLOT( defaultContextMenuOptionSelected( HbAction* ) ) ); + } + else { + delete contextMenu; + contextMenu = 0; + } + } + + TX_EXIT +} + +/*! + Fetch view context menu + */ +void MpCollectionPopupHandler::openFetchViewContextMenu( int index, const QPointF &coords ) +{ + TX_ENTRY_ARGS( "index=" << index ); + + HbAction *action; + HbMenu *contextMenu = 0; + + switch ( mMpEngine->collectionData()->context() ) { + case ECollectionContextAllSongs: + case ECollectionContextArtistSongs: + case ECollectionContextAlbumSongs: + case ECollectionContextPlaylistSongs: + case ECollectionContextGenreSongs: + contextMenu = new HbMenu(); + action = contextMenu->addAction( hbTrId("txt_common_menu_play_music") ); + action->setEnabled( mMpEngine->verifyUsbBlocking() ); + break; + default: + break; + } + + if ( contextMenu ) { + if ( mView->isActivated() ) { + mPermanentData->mContextMenuIndex = index; + contextMenu->setPreferredPos( coords ); + contextMenu->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup( contextMenu ); + contextMenu->open( this, SLOT( fetcherContextMenuOptionSelected( HbAction* ) ) ); + } + else { + delete contextMenu; + contextMenu = 0; + } + } + + TX_EXIT +} + +/*! + Request a string to rename the playlist container. + */ +void MpCollectionPopupHandler::openRenamePlaylistContainerDialog( const QString ¤tName ) +{ + TX_ENTRY_ARGS( "Current name=" << currentName ); + mPermanentData->mOriginalName = currentName; + getText( hbTrId( "txt_mus_dialog_enter_name" ), currentName, + SLOT( handleRenamePlaylistContainer( HbAction* ) ) ); + TX_EXIT +} + +/*! + Request a string to rename the playlist item. + */ +void MpCollectionPopupHandler::openRenamePlaylistItemDialog( const QString ¤tName ) +{ + TX_ENTRY_ARGS( "Current name=" << currentName ); + mPermanentData->mOriginalName = currentName; + getText( hbTrId( "txt_mus_dialog_enter_name" ), currentName, + SLOT( handleRenamePlaylistItem( HbAction* ) ) ); + TX_EXIT +} + +/*! + Request to select songs to add to the playlist + */ +void MpCollectionPopupHandler::openAddSongsToPlaylist( QAbstractItemModel* model ) +{ + TX_ENTRY + getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), model, + SLOT( handleAddSongsToPlayList( HbAction* ) ) ); + TX_EXIT +} + +/*! + Request to select songs to be deleted + */ +void MpCollectionPopupHandler::openDeleteSongs( QAbstractItemModel* model ) +{ + TX_ENTRY + getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), model, + SLOT( handleDeleteSongs( HbAction* ) ) ); + TX_EXIT +} + +/*! + Request to select songs to be added to the current play list + */ +void MpCollectionPopupHandler::openAddToCurrentPlaylist( MpMpxCollectionData* collectionData ) +{ + TX_ENTRY + mPermanentData->mIsolatedCollectionData = collectionData; + MpCollectionDataModel *collectionDataModel; + collectionDataModel = new MpCollectionDataModel( collectionData ); + collectionDataModel->refreshModel(); + + getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), collectionDataModel, + SLOT( handleAddToCurrentPlaylist( HbAction* ) ) ); + TX_EXIT +} + +/*! + Request to create a new play list and then add songs to it. + */ +void MpCollectionPopupHandler::openCreateNewPlaylist( MpMpxCollectionData* collectionData ) +{ + TX_ENTRY + mPermanentData->mIsolatedCollectionData = collectionData; + + MpCollectionDataModel *collectionDataModel; + collectionDataModel = new MpCollectionDataModel( collectionData ); + collectionDataModel->refreshModel(); + mPermanentData->mAbstractItemModel = collectionDataModel; + + QStringList playlists; + mMpEngine->findPlaylists( playlists ); + queryNewPlaylistName( playlists, SLOT( handleCreateNewPlaylistGetTextFinished( HbAction* ) ) ); + TX_EXIT +} + +/*! + Request to reorder songs + */ +void MpCollectionPopupHandler::openArrangeSongs( MpMpxCollectionData* collectionData ) +{ + TX_ENTRY + launchArrangeSongsDialog( collectionData ); + TX_EXIT +} + +/*! + Closes any active popup + */ +void MpCollectionPopupHandler::cancelOngoingPopup() +{ + TX_ENTRY + if ( mOutstandingPopup ) { + mOutstandingPopup->close(); + + //Delete/Clear permanent data until current popup gets deleted + mPermanentData->setParent( mOutstandingPopup ); + //Generate new permanent data for future popups + mPermanentData = new MpPopupHandlerPermanentData( this ); + } + else { + mPermanentData->clear(); + } + + TX_EXIT +} + +/*! + TODO: Workaround for HbListView multiple events: longPress and activated. Remove once HbListView get fixed (wk16) + */ +bool MpCollectionPopupHandler::showingPopup() +{ + return mOutstandingPopup; +} + +/*! + Slot to be called when an option has been selected from default context menu. + */ +void MpCollectionPopupHandler::defaultContextMenuOptionSelected( HbAction *selectedAction ) +{ + TX_ENTRY + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + QList selection; + selection.append( mPermanentData->mContextMenuIndex ); + if ( objectName == "open" ) { + mView->openItem( mPermanentData->mContextMenuIndex ); + } + if ( objectName == "add" ) { + launchAddToPlaylistDialog( selection ); + } + else if ( objectName == "delete" ) { + requestDelete( selection ); + } + else if ( objectName == "rename playlist" ) { + QString currentName; + currentName = mMpEngine->collectionData()->itemData( + mPermanentData->mContextMenuIndex, MpMpxCollectionData::Title ); + openRenamePlaylistItemDialog( currentName ); + } + } + TX_EXIT +} + +/*! + Slot to be called when play option has been selected from fetcher context menu. + */ +void MpCollectionPopupHandler::fetcherContextMenuOptionSelected( HbAction *selectedAction ) +{ + TX_ENTRY + if ( selectedAction ) { + // Start the playback process. View will switch to playbackview. + mMpEngine->previewItem( mPermanentData->mContextMenuIndex ); + } + TX_EXIT +} + +/*! + Slot to be called when AddToPlaylist dialog has finished + */ +void MpCollectionPopupHandler::handleAddToPlaylistDialogFinished( HbAction *selectedAction ) +{ + TX_ENTRY + HbSelectionDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + bool operationCompleted( true ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "new" ) { + QStringList playlists; + mMpEngine->findPlaylists( playlists ); + queryNewPlaylistName( playlists, SLOT( handleAddToPlaylistGetTextFinished( HbAction* ) ) ); + operationCompleted = false; + } + } + else if ( dialog->selectedItems().count() ) {//this only works for SingleSelection + // User selected existing playlist. + mMpEngine->saveToPlaylist( dialog->selectedItems().at( 0 ).toInt(), mPermanentData->mSelectedItems ); + } + + if ( operationCompleted ) { + mPermanentData->clear(); + } + TX_EXIT +} + +/*! + Slot to be called when input dialog (getText) has finished, comming from AddToPlayList. + */ +void MpCollectionPopupHandler::handleAddToPlaylistGetTextFinished( HbAction *selectedAction ) +{ + TX_ENTRY + HbInputDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + bool operationCompleted( true ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QString newPlaylistName = dialog->value().toString(); + if ( newPlaylistName.length() ) { + //Create new playlist with given name + mMpEngine->createPlaylist( newPlaylistName, mPermanentData->mSelectedItems ); + } + else { + //No valid name, prompt for one again. + getText( hbTrId( "txt_mus_dialog_enter_name" ), newPlaylistName, + SLOT( handleAddToPlaylistGetTextFinished( HbAction* ) ) ); + operationCompleted = false; + } + } + else { + // user decided to not provide a new name, go back to playlist list selection + QStringList playlists; + mMpEngine->findPlaylists( playlists ); + if ( playlists.count() ) { + //are saved playlists, back to playlist selection dialog + launchAddToPlaylistDialog( mPermanentData->mSelectedItems ); + operationCompleted = false; + } + } + } + + if ( operationCompleted ) { + mPermanentData->clear(); + } + TX_EXIT +} + +/*! + Slot to be called when input dialog (getText) has finished, comming from RenamePlaylistContainer. + */ +void MpCollectionPopupHandler::handleRenamePlaylistContainer( HbAction *selectedAction ) +{ + TX_ENTRY + HbInputDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + bool operationCompleted( true ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QString newPlaylistName = dialog->value().toString(); + if ( newPlaylistName.length() ) { + if ( newPlaylistName != mPermanentData->mOriginalName ) { + mMpEngine->renamePlaylist( newPlaylistName ); + } + } + else { + //No valid name, prompt for one again. + getText( hbTrId( "txt_mus_dialog_enter_name" ), newPlaylistName, + SLOT( handleRenamePlaylistContainer( HbAction* ) ) ); + operationCompleted = false; + } + } + } + + if ( operationCompleted ) { + mPermanentData->clear(); + } + TX_EXIT +} + +/*! + Slot to be called when input dialog (getText) has finished, comming from RenamePlaylist ContextMenu. + */ +void MpCollectionPopupHandler::handleRenamePlaylistItem( HbAction *selectedAction ) +{ + TX_ENTRY + HbInputDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + bool operationCompleted( true ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QString newPlaylistName = dialog->value().toString(); + if ( newPlaylistName.length() ) { + if ( newPlaylistName != mPermanentData->mOriginalName ) { + mMpEngine->renamePlaylist( newPlaylistName, mPermanentData->mContextMenuIndex ); + } + } + else { + //No valid name, prompt for one again. + getText( hbTrId( "txt_mus_dialog_enter_name" ), newPlaylistName, + SLOT( handleRenamePlaylistItem( HbAction* ) ) ); + operationCompleted = false; + } + } + } + + if ( operationCompleted ) { + mPermanentData->clear(); + } + TX_EXIT +} + +/*! + Slot to be called when select songs dialog (getModelIndexes) has finished, coming from AddSongsToPlayList. + */ +void MpCollectionPopupHandler::handleAddSongsToPlayList( HbAction *selectedAction ) +{ + TX_ENTRY + HbSelectionDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QModelIndexList selectedModelIndexes; + selectedModelIndexes = dialog->selectedModelIndexes(); + if ( selectedModelIndexes.count() ) { + QList selection; + for ( int i = 0; i < selectedModelIndexes.size(); ++i ) { + selection.append( selectedModelIndexes.at( i ).row() ); + } + launchAddToPlaylistDialog( selection ); + } + } + } + + //Dialog is using CollectionView main model, avoid dialog destructor to alter it. + dialog->setModel( 0 ); + + TX_EXIT +} + +/*! + Slot to be called when select songs dialog (getModelIndexes) has finished, coming from DeleteSongs. + */ +void MpCollectionPopupHandler::handleDeleteSongs( HbAction *selectedAction ) +{ + TX_ENTRY + HbSelectionDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QModelIndexList selectedModelIndexes; + selectedModelIndexes = dialog->selectedModelIndexes(); + if ( selectedModelIndexes.count() ) { + QList selection; + for ( int i = 0; i < selectedModelIndexes.size(); ++i ) { + selection.append( selectedModelIndexes.at( i ).row() ); + } + requestDelete( selection ); + } + } + } + + //Dialog is using CollectionView main model, avoid dialog destructor to alter it. + dialog->setModel( 0 ); + + TX_EXIT +} + +/*! + Slot to be called when select songs dialog (getModelIndexes) has finished, coming from AddToCurrentPlaylist. + */ +void MpCollectionPopupHandler::handleAddToCurrentPlaylist( HbAction *selectedAction ) +{ + TX_ENTRY + HbSelectionDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QModelIndexList selectedModelIndexes; + selectedModelIndexes = dialog->selectedModelIndexes(); + if ( selectedModelIndexes.count() ) { + QList selection; + for ( int i = 0; i < selectedModelIndexes.size(); ++i ) { + selection.append( selectedModelIndexes.at( i ).row() ); + } + mMpEngine->saveToCurrentPlaylist( selection, + mPermanentData->mIsolatedCollectionData ); + } + } + } + + //Pull the model to delete it. Dialog destructor only removes items from model, but doesn't delete them. + mPermanentData->mAbstractItemModel = dialog->model(); + dialog->setModel( 0 ); + + mPermanentData->clear(); + + TX_EXIT +} + +/*! + Slot to be called when the input dialog (getText) has finished, comming from CreateNewPlaylist. + */ +void MpCollectionPopupHandler::handleCreateNewPlaylistGetTextFinished( HbAction *selectedAction ) +{ + TX_ENTRY + HbInputDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + bool operationCompleted( true ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QString newPlaylistName = dialog->value().toString(); + if ( newPlaylistName.length() ) { + //Store the new playlist name and query for the items to be added + mPermanentData->mOriginalName = newPlaylistName; + getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), + mPermanentData->mAbstractItemModel, + SLOT( handleCreateNewPlaylistGetModelIndexesFinished( HbAction* ) ) ); + } + else { + //No valid name, prompt for one again. + getText( hbTrId( "txt_mus_dialog_enter_name" ), newPlaylistName, + SLOT( handleCreateNewPlaylistGetTextFinished( HbAction* ) ) ); + } + operationCompleted = false; + } + } + + if ( operationCompleted ) { + mPermanentData->clear(); + } + TX_EXIT +} + +/*! + Slot to be called when the select songs dialog (getModelIndexes) has finished, coming from CreateNewPlaylist-GetText. + */ +void MpCollectionPopupHandler::handleCreateNewPlaylistGetModelIndexesFinished( HbAction *selectedAction ) +{ + TX_ENTRY + HbSelectionDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + QList selection; + QModelIndexList selectedModelIndexes; + selectedModelIndexes = dialog->selectedModelIndexes(); + if ( selectedModelIndexes.count() ) { + for ( int i = 0; i < selectedModelIndexes.size(); ++i ) { + selection.append( selectedModelIndexes.at( i ).row() ); + } + } + //Creating Playlist even when there is no selection. + mMpEngine->createPlaylist( mPermanentData->mOriginalName, selection, + mPermanentData->mIsolatedCollectionData ); + } + } + + dialog->setModel( 0 ); + + mPermanentData->clear(); + + TX_EXIT +} + +/*! + Slot to be called when arrange songs dialog has finished. + */ +void MpCollectionPopupHandler::handleArrangeSongs( HbAction *selectedAction ) +{ + TX_ENTRY + Q_UNUSED( selectedAction ); + HbDialog *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + + //Reopen the collection so the ordinals get fixed on the view list, if we + //delete items the index will not match to the item on the collection. + mMpEngine->reopenCollection(); + + TX_EXIT +} + +/*! + Slot to be called when delete confirmation dialog has finished. + */ +void MpCollectionPopupHandler::handleRequestDelete( HbAction *selectedAction ) +{ + TX_ENTRY + HbMessageBox *dialog = qobject_cast( sender() ); + clearOutstandingPopup( dialog ); + + if ( selectedAction ) { + QString objectName = selectedAction->objectName(); + if ( objectName == "ok" ) { + mMpEngine->deleteSongs( mPermanentData->mSelectedItems ); + } + selectedAction->setEnabled( false ); + } + + mPermanentData->clear(); + + TX_EXIT +} + +/*! + Slot to be called when a popup is getting closed. Usefull when a dialog is closed before it finishes + (dialog not closed by a direct user action). + */ +void MpCollectionPopupHandler::outstandingPopupClosing() +{ + TX_ENTRY + HbPopup *popup = qobject_cast( sender() ); + if ( popup ) { + Q_ASSERT( popup == mOutstandingPopup ); + mOutstandingPopup = 0; + } + TX_EXIT +} + +/*! + \internal + sets \a popup as the current outstanding popup and cancels any other previous popup. + */ +void MpCollectionPopupHandler::setOutstandingPopup( HbPopup *popup ) +{ + TX_ENTRY + if ( mOutstandingPopup ) { + TX_LOG_ARGS( "Warning: Multiple popups attempted to be displayed" ); + mOutstandingPopup->close(); + } + + connect( popup, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) ); + mOutstandingPopup = popup; + TX_EXIT +} + +/*! + \internal + clears and disconnects \a popup. In some cases it's needed to open a new dialog when a current one has just finished. + */ +void MpCollectionPopupHandler::clearOutstandingPopup( HbPopup *popup ) +{ + TX_ENTRY + disconnect( popup, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) ); + mOutstandingPopup = 0; + TX_EXIT +} + +/*! + \internal + Launches the 'Add to playlist' dialog. + */ +void MpCollectionPopupHandler::launchAddToPlaylistDialog( QList &selection ) +{ + TX_ENTRY + if (!mView->isActivated()) { + mPermanentData->clear(); + return; + } + + QStringList playlists; + mPermanentData->mSelectedItems = selection; + mMpEngine->findPlaylists( playlists ); + if ( playlists.count() ) { + //There are saved playlists, query for a saved playlist or new. + HbAction *action; + HbSelectionDialog *dialog = new HbSelectionDialog(); + dialog->setStringItems( playlists ); + dialog->setSelectionMode( HbAbstractItemView::SingleSelection ); + dialog->setHeadingWidget(new HbLabel( hbTrId( "txt_mus_title_select_playlist" ) ) ); + dialog->clearActions(); + action = new HbAction( hbTrId( "txt_mus_button_new" ) ); + action->setObjectName( "new" ); + dialog->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_cancel" ) ); + action->setObjectName( "cancel" ); + dialog->addAction( action ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup( dialog ); + dialog->open( this, SLOT( handleAddToPlaylistDialogFinished( HbAction* ) ) ); + } + else { + //querying for a new playlist name. + queryNewPlaylistName( playlists, SLOT( handleAddToPlaylistGetTextFinished( HbAction* ) ) ); + } + TX_EXIT +} + +/*! + \internal + Trigger an imput text dialog with a suggested playlist name. + uses \a playlists to generate a suggested playlist name + \handler Slot that should be called when input dialog finished + */ +void MpCollectionPopupHandler::queryNewPlaylistName(const QStringList &playlists, + const char *handler ) +{ + TX_ENTRY + int i = 0; + for ( ; + playlists.contains( hbTrId( "txt_mus_dialog_enter_name_entry_playlist_l1" ).arg( i ) ) ; + i++ ) {}; + QString suggestedPlaylistName = hbTrId( "txt_mus_dialog_enter_name_entry_playlist_l1" ).arg( i ); + getText( hbTrId( "txt_mus_dialog_enter_name" ), suggestedPlaylistName, handler ); + TX_EXIT +} + +/*! + \internal + Launches an input text dialog. + \a label Dialog title. + \a text Suggested text. + \a handler Slot to be called when input dialog finishes. + */ +void MpCollectionPopupHandler::getText( const QString &label, const QString &text, + const char *handler ) +{ + TX_ENTRY + if ( !mView->isActivated() ) { + mPermanentData->clear(); + return; + } + + HbAction *action; + HbInputDialog *dialog = new HbInputDialog(); + dialog->setPromptText( label ); + dialog->setInputMode( HbInputDialog::TextInput ); + dialog->setValue( text ); + dialog->clearActions(); + action = new HbAction( hbTrId( "txt_common_button_ok" ) ); + action->setObjectName( "ok" ); + dialog->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_cancel" ) ); + action->setObjectName( "cancel" ); + dialog->addAction( action ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup( dialog ); + dialog->open( this, handler ); + TX_EXIT +} + +/*! + \internal + Launches a list dialog to select items. + \a label Dialog title. + \a model List model. + \a handler Slot to be called when list dialog finishes. + */ +void MpCollectionPopupHandler::getModelIndexes( const QString &label, QAbstractItemModel* model, + const char *handler) +{ + TX_ENTRY + + if ( !mView->isActivated() ) { + mPermanentData->clear(); + return; + } + + HbAction *action; + HbSelectionDialog *dialog = new HbSelectionDialog(); + dialog->setHeadingWidget( new HbLabel( label ) ); + dialog->setSelectionMode( HbAbstractItemView::MultiSelection ); + dialog->setModel( model ); + dialog->clearActions(); + action = new HbAction( hbTrId( "txt_common_button_ok" ) ); + action->setObjectName( "ok" ); + dialog->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_cancel" ) ); + action->setObjectName( "cancel" ); + dialog->addAction( action ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup( dialog ); + dialog->open( this, handler ); + + TX_EXIT +} + +/*! + \internal + Launches a list dialog to reorder them. + \a collectionData Base to generate dialog's model. + */ +void MpCollectionPopupHandler::launchArrangeSongsDialog( MpMpxCollectionData* collectionData ) +{ + TX_ENTRY + + if ( !mView->isActivated() ) { + return; + } + + HbListView *listView = new HbListView(); + listView->setItemRecycling( true ); + listView->setScrollingStyle( HbListView::PanOrFlick ); + listView->setClampingStyle( HbListView::BounceBackClamping ); + HbScrollBar *scrollbar = listView->verticalScrollBar(); + scrollbar->show(); + scrollbar->setInteractive( true); + listView->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded); + MpCollectionDataModel *model; + //Ownership of the model is passed to the listView as a child object. + model = new MpCollectionDataModel( collectionData, listView ); + model->refreshModel(); + connect( model, + SIGNAL( orderChanged( int, int, int, int ) ), + mMpEngine, + SLOT( reorderPlaylist( int, int, int, int ) ) ); + listView->setModel( model ); + listView->setArrangeMode( true ); + HbDialog *dialog = new HbDialog(); + dialog->setDismissPolicy( HbPopup::NoDismiss ); + dialog->setTimeout( HbPopup::NoTimeout ); + + HbLabel *label = new HbLabel( hbTrId( "txt_mus_title_arrange" ) ); + dialog->setHeadingWidget( label ); + dialog->setContentWidget( listView ); + dialog->clearActions(); + HbAction *action; + action = new HbAction( hbTrId( "txt_common_button_ok" ) ); + dialog->addAction( action ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup(dialog); + dialog->open( this, SLOT( handleArrangeSongs( HbAction* ) ) ); + + TX_EXIT +} + +/*! + \internal + Request a delete operation always it has been confirmed. + \a selection Items selected to be deleted. + */ +void MpCollectionPopupHandler::requestDelete( QList &selection ) +{ + TX_ENTRY + QString message; + mPermanentData->mSelectedItems = selection; + bool needsConfirmation = true; + + switch ( mMpEngine->collectionData()->context() ) { + case ECollectionContextAllSongs: + case ECollectionContextArtistSongs: + case ECollectionContextAlbumSongs: + message = hbTrId( "txt_mus_delete_song" ); + break; + case ECollectionContextArtists: + message = hbTrId( "txt_mus_delete_artist" ); + break; + case ECollectionContextAlbums: + case ECollectionContextArtistAlbums: + message = hbTrId( "txt_mus_delete_album" ); + break; + case ECollectionContextPlaylists: + message = hbTrId( "txt_mus_delete_playlist" ); + break; + case ECollectionContextPlaylistSongs: + case ECollectionContextGenres: + case ECollectionContextGenreSongs: + needsConfirmation = false; + mMpEngine->deleteSongs( mPermanentData->mSelectedItems ); + mPermanentData->clear(); + break; + case ECollectionContextUnknown: + default: + // We shouldn't be here + needsConfirmation = false; + mPermanentData->clear(); + TX_LOG_ARGS( "Invalid Collection Context" ); + break; + } + + if ( needsConfirmation ) { + if ( !mView->isActivated() ) { + mPermanentData->clear(); + return; + } + + HbAction *action; + HbMessageBox *dialog = new HbMessageBox( HbMessageBox::MessageTypeQuestion ); + + dialog->setText( message ); + dialog->setTimeout( HbPopup::NoTimeout ); + dialog->clearActions(); + action = new HbAction( hbTrId( "txt_common_button_yes" ) ); + action->setObjectName( "ok" ); + dialog->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_no" ) ); + action->setObjectName( "cancel" ); + dialog->addAction( action ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + setOutstandingPopup( dialog ); + dialog->open( this, SLOT( handleRequestDelete( HbAction* ) ) ); + } + + TX_EXIT +} + + +//------------------------------------------------------------------ +// MpPopupHandlerPermanentData +//------------------------------------------------------------------ +/*! + Constructs the popup handler permanent data. + */ +MpCollectionPopupHandler::MpPopupHandlerPermanentData::MpPopupHandlerPermanentData( QObject *parent ) + : QObject( parent ), + mIsolatedCollectionData( 0 ), + mAbstractItemModel( 0 ), + mContextMenuIndex( KNullIndex ) +{ + TX_ENTRY + mSelectedItems.clear(); + mOriginalName.clear(); + TX_EXIT +} + +/*! + Destructs the popup handler permanent data. + */ +MpCollectionPopupHandler::MpPopupHandlerPermanentData::~MpPopupHandlerPermanentData() +{ + TX_ENTRY + clear(); + TX_EXIT +} + +/*! + \internal + Clears all permanent data. + */ +void MpCollectionPopupHandler::MpPopupHandlerPermanentData::clear() +{ + TX_ENTRY + mSelectedItems.clear(); + mOriginalName.clear(); + mContextMenuIndex = KNullIndex; + if ( mIsolatedCollectionData ) { + MpEngine::instance()->releaseIsolatedCollection(); + mIsolatedCollectionData = 0; + } + if ( mAbstractItemModel ) { + delete mAbstractItemModel; + mAbstractItemModel = 0; + } + TX_EXIT +} diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp --- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp Fri May 14 15:49:53 2010 +0300 @@ -26,8 +26,6 @@ #include #include #include -#include -#include #include #include #include @@ -47,6 +45,7 @@ #include "mpsnapshotwidget.h" #include "mpsettingsmanager.h" #include "mpcollectionlistcontainer.h" +#include "mpcollectionpopuphandler.h" const char*MUSIC_COLLECTION_DOCML = ":/docml/musiccollection.docml"; @@ -55,7 +54,7 @@ const int KMainToolBarAll = 0; const int KMainToolBarArtists = 1; - +const int KMainToolBarAlbums = 2; const int KMainToolBarPlaylists = 3; const int KPlaylistToolBarAdd = 0; @@ -91,8 +90,8 @@ mActivated( false ), mNowPlayingBanner( 0 ), mBannerAttached( false ), - mSoftKeyQuit( 0 ), - mSoftKeyBack( 0 ), + mNavigationQuit( 0 ), + mNavigationBack( 0 ), mDocumentLoader( 0 ), mMainContainer( 0 ), mMainToolBar( 0 ), @@ -101,7 +100,7 @@ mMpTranslator( 0 ), mCommonTranslator( 0 ), mActivationWaiting( false ), - mOutstandingPopup( 0 ), + mMpPopupHandler( 0 ), mUsbBlocked( false ) { TX_LOG @@ -114,8 +113,8 @@ { TX_ENTRY delete mSnapshot; - delete mSoftKeyQuit; - delete mSoftKeyBack; + delete mNavigationQuit; + delete mNavigationBack; HbToolBar *toolBar = takeToolBar(); if ( mMainToolBar != toolBar && mPlaylistToolBar != toolBar ) { @@ -166,11 +165,11 @@ mWindow = mainWindow(); // Create softkey actions - mSoftKeyQuit = new HbAction( Hb::QuitAction, this ); - connect( mSoftKeyQuit, SIGNAL( triggered() ), this, SLOT( back() ) ); + mNavigationQuit = new HbAction( Hb::QuitNaviAction, this ); + connect( mNavigationQuit, SIGNAL( triggered() ), this, SLOT( back() ) ); - mSoftKeyBack = new HbAction( Hb::BackAction, this ); - connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) ); + mNavigationBack = new HbAction( Hb::BackNaviAction, this ); + connect( mNavigationBack, SIGNAL( triggered() ), this, SLOT( back() ) ); mMpEngine = MpEngine::instance(); @@ -255,12 +254,14 @@ } mContainerFactory = new MpCollectionContainerFactory( this, mDocumentLoader ); + + mMpPopupHandler = new MpCollectionPopupHandler( this ); connect( mMpEngine, SIGNAL( usbBlocked(bool) ), this, SLOT( handleUsbBlocked(bool) ) ); - connect( mMpEngine, SIGNAL( libraryAboutToRefresh() ), + connect( mMpEngine, SIGNAL( libraryAboutToUpdate() ), this, SLOT( handleLibraryAboutToUpdate() ) ); - connect( mMpEngine, SIGNAL( libraryRefreshed() ), + connect( mMpEngine, SIGNAL( libraryUpdated() ), this, SLOT( handleLibraryUpdated() ) ); mUsbBlocked = mMpEngine->verifyUsbBlocking(); @@ -301,10 +302,7 @@ TX_ENTRY mActivated = false; - if ( mOutstandingPopup ) { - mOutstandingPopup->close(); - } - menu()->close(); + cancelOngoingOperation(); setNavigationAction( 0 ); TX_EXIT @@ -324,7 +322,27 @@ if ( mBannerAttached ) { setBannerVisibility( false ); } + TX_EXIT +} +/*! + Returns view activation status. + */ +bool MpCollectionView::isActivated() +{ + TX_LOG_ARGS( "View activated = " << mActivated ); + return mActivated; +} + +/*! + Opens or plays an item through collection container in order to keep track of the Artist / Album data used by infobar. + */ +void MpCollectionView::openItem( int index ) +{ + TX_ENTRY_ARGS( "index = " << index ); + QModelIndex modelIndex; + modelIndex = mCollectionDataModel->index( index ); + qobject_cast(mCollectionContainer)->itemActivated( modelIndex ); TX_EXIT } @@ -371,6 +389,19 @@ void MpCollectionView::openArtists() { TX_ENTRY + if ( mCollectionContext != ECollectionContextArtists ) { + mMpEngine->openCollection( ECollectionContextArtists ); + } + TX_EXIT +} + + +/*! + Slot to be called when 'Albums' action is triggered from the toolbar. + */ +void MpCollectionView::openAlbums() +{ + TX_ENTRY if ( mCollectionContext != ECollectionContextAlbums ) { mMpEngine->openCollection( ECollectionContextAlbums ); } @@ -407,8 +438,9 @@ void MpCollectionView::find() { // Todo - HbMessageBox messageBox( "Not ready!", HbMessageBox::MessageTypeInformation ); - messageBox.exec(); + HbMessageBox *messageBox = new HbMessageBox( "Not ready!", HbMessageBox::MessageTypeInformation ); + messageBox->setAttribute( Qt::WA_DeleteOnClose ); + messageBox->show(); updateToolBar(); } @@ -418,8 +450,9 @@ void MpCollectionView::openMusicStore() { // Todo - HbMessageBox messageBox( "Not ready!", HbMessageBox::MessageTypeInformation ); - messageBox.exec(); + HbMessageBox *messageBox = new HbMessageBox( "Not ready!", HbMessageBox::MessageTypeInformation ); + messageBox->setAttribute( Qt::WA_DeleteOnClose ); + messageBox->show(); updateToolBar(); } @@ -434,6 +467,7 @@ QString songUri; switch ( mCollectionContext ) { case ECollectionContextAllSongs: + case ECollectionContextArtistSongs: case ECollectionContextAlbumSongs: case ECollectionContextPlaylistSongs: case ECollectionContextGenreSongs: @@ -446,7 +480,11 @@ } } if ( doOpen ) { - mMpEngine->openCollectionItem( index ); + // TODO: "if" used as workaround for HbListView multiple events: longPress and activated. + // Remove once HbListView get fixed (wk14 or 16) + if ( !mMpPopupHandler->showingPopup() ) { + mMpEngine->openCollectionItem( index ); + } } TX_EXIT } @@ -460,6 +498,7 @@ bool doExit( false ); switch ( mCollectionContext ) { case ECollectionContextAllSongs: + case ECollectionContextArtists: case ECollectionContextAlbums: case ECollectionContextPlaylists: case ECollectionContextGenres: @@ -467,6 +506,8 @@ doExit = true; break; case ECollectionContextAlbumSongs: + case ECollectionContextArtistAlbums: + case ECollectionContextArtistSongs: case ECollectionContextPlaylistSongs: case ECollectionContextGenreSongs: mMpEngine->back(); @@ -559,21 +600,7 @@ */ void MpCollectionView::addToPlaylist() { - if ( !mMpEngine->verifyUsbBlocking( true ) ) { - QModelIndexList SelectedModelIndexes; - bool ok; - SelectedModelIndexes = getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), - mCollectionDataModel, - ok); - - if ( ok && SelectedModelIndexes.count() ) { - QList selection; - for ( int i = 0; i < SelectedModelIndexes.size(); ++i ) { - selection.append( SelectedModelIndexes.at( i ).row() ); - } - launchAddToPlaylistDialog( selection ); - } - } + mMpPopupHandler->openAddSongsToPlaylist( mCollectionDataModel ); } /*! @@ -581,20 +608,7 @@ */ void MpCollectionView::deleteSongs() { - QModelIndexList SelectedModelIndexes; - bool ok; - SelectedModelIndexes = getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), - mCollectionDataModel, - ok); - - if ( ok && SelectedModelIndexes.count() ) { - QList selection; - for ( int i = 0; i < SelectedModelIndexes.size(); ++i ) { - selection.append( SelectedModelIndexes.at( i ).row() ); - } - requestDelete( selection ); - updateMenu(); - } + mMpPopupHandler->openDeleteSongs( mCollectionDataModel ); } /*! @@ -602,16 +616,9 @@ */ void MpCollectionView::renameCurrentPlaylistContainer() { - if ( !mMpEngine->verifyUsbBlocking( true ) ) { - QString currentName; - currentName = mCollectionData->collectionTitle(); - bool ok = false; - QString newName; - newName = getText( hbTrId( "txt_mus_dialog_enter_name" ), currentName, ok ); - if ( ok && ( currentName != newName ) ) { - mMpEngine->renamePlaylist( newName ); - } - } + QString currentName; + currentName = mCollectionData->collectionTitle(); + mMpPopupHandler->openRenamePlaylistContainerDialog( currentName ); } @@ -652,9 +659,7 @@ */ void MpCollectionView::prepareToAddToPlaylist() { - TX_ENTRY - //We dismiss dialogs here since after open is complete we are triggering a dialog. - setOutstandingPopup( 0 ); + TX_ENTRY mMpEngine->openIsolatedCollection( ECollectionContextAllSongs ); TX_EXIT } @@ -665,115 +670,24 @@ void MpCollectionView::handleIsolatedCollectionOpened( MpMpxCollectionData* collectionData ) { TX_ENTRY - if ( mActivated && !mOutstandingPopup ) { + if ( mActivated ) { if (ECollectionContextPlaylistSongs == mCollectionContext) { - addToCurrentPlaylist( collectionData ); + mMpPopupHandler->openAddToCurrentPlaylist( collectionData ); } else if (ECollectionContextPlaylists == mCollectionContext) { - createNewPlaylist( collectionData ); + mMpPopupHandler->openCreateNewPlaylist( collectionData ); } } - //Playlist is saved asynchronosly by the default collection, it is OK to release now. - mMpEngine->releaseIsolatedCollection(); TX_EXIT } - -/*! - Slot to be called to add items to current playlist. - */ -void MpCollectionView::addToCurrentPlaylist( MpMpxCollectionData* collectionData ) -{ - MpCollectionDataModel *collectionDataModel; - collectionDataModel = new MpCollectionDataModel( collectionData ); - collectionDataModel->refreshModel(); - QModelIndexList SelectedModelIndexes; - bool ok; - SelectedModelIndexes = getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), - collectionDataModel, - ok); - - if ( ok && SelectedModelIndexes.count() ) { - QList selection; - for ( int i = 0; i < SelectedModelIndexes.size(); ++i ) { - selection.append( SelectedModelIndexes.at( i ).row() ); - } - mMpEngine->saveToCurrentPlaylist( selection, collectionData ); - } - delete collectionDataModel; -} - -/*! - Slot to be called to add items to new playlist. - */ -void MpCollectionView::createNewPlaylist( MpMpxCollectionData* collectionData ) -{ - MpCollectionDataModel *collectionDataModel; - collectionDataModel = new MpCollectionDataModel( collectionData ); - collectionDataModel->refreshModel(); - - QString newPlaylistName; - bool ok; - QStringList playlists; - mMpEngine->findPlaylists( playlists ); - ok = queryNewPlaylistName(newPlaylistName , playlists); - if ( ok ) { - QModelIndexList SelectedModelIndexes; - SelectedModelIndexes = getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), - collectionDataModel, - ok); - QList selection; - if ( ok && SelectedModelIndexes.count() ) { - for ( int i = 0; i < SelectedModelIndexes.size(); ++i ) { - selection.append( SelectedModelIndexes.at( i ).row() ); - } - } - //Creating Playlist even when there is no selection. - mMpEngine->createPlaylist( newPlaylistName, selection, collectionData ); - } - delete collectionDataModel; -} - /*! Slot to be called to arrange songs in a playlist. */ void MpCollectionView::arrangeSongs( ) { - HbListView *listView = new HbListView(); - listView->setItemRecycling(true); - listView->setScrollingStyle( HbListView::PanOrFlick ); - listView->setClampingStyle( HbListView::BounceBackClamping ); - HbScrollBar *scrollbar = listView->verticalScrollBar(); - scrollbar->show(); - scrollbar->setInteractive(true); - listView->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded); - MpCollectionDataModel *model; - //Ownership of the model is passed to the listView as a child object. - model = new MpCollectionDataModel( mCollectionData, listView ); - model->refreshModel(); - connect( model, - SIGNAL( orderChanged( int, int, int, int ) ), - mMpEngine, - SLOT( reorderPlaylist( int, int, int, int ) ) ); - listView->setModel( model ); - listView->setArrangeMode( true ); - HbDialog *popup = new HbDialog(); - popup->setAttribute( Qt::WA_DeleteOnClose ); - popup->setDismissPolicy( HbPopup::NoDismiss ); - popup->setTimeout( HbPopup::NoTimeout ); - - HbLabel *label = new HbLabel( hbTrId( "txt_mus_title_arrange" ) ); - popup->setHeadingWidget( label ); - popup->setContentWidget( listView ); - popup->setPrimaryAction( new HbAction( hbTrId( "txt_common_button_ok" ), popup ) ); - popup->setModal( true ); - connect( popup, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) ); - //Reopen the collection so the ordinals get fixed on the view list, if we - //delete items the index will not match to the item on the collection. - connect( popup, SIGNAL( aboutToClose() ), mMpEngine, SLOT( reopenCollection() ) ); - setOutstandingPopup(popup); - popup->show(); + mMpPopupHandler->openArrangeSongs( mCollectionData ); } /*! @@ -784,10 +698,10 @@ TX_ENTRY_ARGS( "index=" << index ); switch ( mViewMode ) { case MpCommon::DefaultView: - openDefaultViewContextMenu( index, coords ); + mMpPopupHandler->openDefaultViewContextMenu( index, coords ); break; case MpCommon::FetchView: - openFetchViewContextMenu( index, coords ); + mMpPopupHandler->openFetchViewContextMenu( index, coords ); break; default: break; @@ -796,29 +710,14 @@ } /*! - Slot to be called when a dialog is about to close. - */ -void MpCollectionView::outstandingPopupClosing() -{ - HbPopup *popup = qobject_cast( sender() ); - if ( popup ) { - Q_ASSERT( popup != mOutstandingPopup ); - mOutstandingPopup = 0; - } -} - -/*! Slot to be called when USB blocking status changes. */ void MpCollectionView::handleUsbBlocked( bool blocked ) { TX_ENTRY_ARGS( "blocked=" << blocked ); mUsbBlocked = blocked; - - if ( mActivated && mUsbBlocked && mOutstandingPopup ) { - mOutstandingPopup->close(); - mMpEngine->verifyUsbBlocking( true ); - } + + cancelOngoingOperation(); updateMenu(); if ( mCollectionContext == ECollectionContextPlaylistSongs ) { @@ -833,13 +732,7 @@ void MpCollectionView::handleLibraryAboutToUpdate() { TX_ENTRY - - if ( mActivated ) { - if ( mOutstandingPopup ) { - mOutstandingPopup->close(); - } - menu()->close(); - } + cancelOngoingOperation(); TX_EXIT } @@ -854,141 +747,16 @@ activateView(); } else { + cancelOngoingOperation(); + //Update cache, even if collection is in background. - //Library refreshing could be triggered at any point due USB connect./disconnect. + //Library refreshing could be triggered at any point due USB/MMC events. mMpEngine->reopenCollection(); } TX_EXIT } /*! - Default view context menu. - */ -void MpCollectionView::openDefaultViewContextMenu( int index, const QPointF &coords ) -{ - HbMenu *contextMenu = 0; - HbAction *action; - switch ( mCollectionContext ) { - case ECollectionContextAllSongs: - case ECollectionContextAlbumSongs: - contextMenu = new HbMenu(); - action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) ); - action->setObjectName( "play" ); - action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) ); - action->setObjectName( "add" ); - action->setEnabled( !mUsbBlocked ); - action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) ); - action->setObjectName( "delete" ); - action->setEnabled( !mUsbBlocked ); - break; - case ECollectionContextAlbums: - contextMenu = new HbMenu(); - action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) ); - action->setObjectName( "open" ); - action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) ); - action->setObjectName( "add" ); - action->setEnabled( !mUsbBlocked ); - action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) ); - action->setObjectName( "delete" ); - action->setEnabled( !mUsbBlocked ); - break; - case ECollectionContextPlaylists: - if ( !mCollectionData->isAutoPlaylist( index ) ) { - contextMenu = new HbMenu(); - action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) ); - action->setObjectName( "open" ); - action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) ); - action->setObjectName("delete"); - action->setEnabled( !mUsbBlocked ); - action = contextMenu->addAction( hbTrId( "txt_common_menu_rename_item" ) ); - action->setObjectName( "rename playlist" ); - action->setEnabled( !mUsbBlocked ); - } - break; - case ECollectionContextPlaylistSongs: - if ( !mCollectionData->isAutoPlaylist() ) { - contextMenu = new HbMenu(); - action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) ); - action->setObjectName( "play" ); - action = contextMenu->addAction( hbTrId( "txt_common_menu_remove" ) ); - action->setObjectName( "delete" ); - action->setEnabled( !mUsbBlocked ); - } - break; - default: - break; - } - - if ( contextMenu ) { - setOutstandingPopup( contextMenu ); - HbAction *selectedAction = mActivated ? contextMenu->exec( coords ) : 0; - setOutstandingPopup( 0 ); - if ( selectedAction ) { - QString objectName = selectedAction->objectName(); - QList selection; - selection.append( index ); - if ( objectName == "open" || objectName == "play" ) { - QModelIndex modelIndex; - modelIndex = mCollectionDataModel->index(index); - qobject_cast(mCollectionContainer)->itemActivated( modelIndex ); - } - else if ( !mMpEngine->verifyUsbBlocking( true ) ) { - if ( objectName == "add" ) { - launchAddToPlaylistDialog( selection ); - } - else if ( objectName == "delete" ) { - requestDelete( selection ); - } - else if ( objectName == "rename playlist" ) { - QString currentName; - currentName = mCollectionData->itemData( index, MpMpxCollectionData::Title ); - bool ok = false; - QString newName; - newName = getText( hbTrId("txt_mus_dialog_enter_name" ), currentName, ok ); - if ( ok && ( currentName != newName ) ) { - mMpEngine->renamePlaylist( newName, index ); - } - } - } - } - } - contextMenu->deleteLater(); - TX_EXIT -} - -/*! - Fetch view context menu - */ -void MpCollectionView::openFetchViewContextMenu( int index, const QPointF &coords ) -{ - TX_ENTRY_ARGS( "index=" << index ); - - HbMenu *contextMenu = 0; - switch ( mCollectionContext ) { - case ECollectionContextAllSongs: - case ECollectionContextAlbumSongs: - case ECollectionContextPlaylistSongs: - case ECollectionContextGenreSongs: - contextMenu = new HbMenu(); - contextMenu->addAction( hbTrId("txt_common_menu_play_music") ); - break; - default: - break; - } - - if ( contextMenu ) { - setOutstandingPopup( contextMenu ); - if ( mActivated ? contextMenu->exec( coords ) : 0 ) { - // Start the playback process. View will switch to playbackview. - mMpEngine->previewItem( index ); - } - setOutstandingPopup( 0 ); - } - contextMenu->deleteLater(); - TX_EXIT -} - -/*! \internal Sets the main ( default ) toolbar for the view. */ @@ -1006,10 +774,15 @@ action = createToolBarAction( actionsGroup, "qtg_mono_songs_all" ); connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openSongs() ) ); mMainToolBar->addAction( action ); + + // Artists + action = createToolBarAction( actionsGroup, "qtg_mono_artists" ); + connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openArtists() ) ); + mMainToolBar->addAction( action ); // Albums - action = createToolBarAction( actionsGroup, "qtg_mono_artists_albums" ); - connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openArtists() ) ); + action = createToolBarAction( actionsGroup, "qtg_mono_music_albums" ); + connect( action, SIGNAL( triggered( bool ) ), this, SLOT( openAlbums() ) ); mMainToolBar->addAction( action ); // Playlists @@ -1034,9 +807,13 @@ case ECollectionContextAllSongs: action = qobject_cast( mMainToolBar->actions()[KMainToolBarAll] ); break; + case ECollectionContextArtists: + case ECollectionContextArtistAlbums: + action = qobject_cast( mMainToolBar->actions()[KMainToolBarArtists] ); + break; case ECollectionContextAlbums: case ECollectionContextAlbumSongs: - action = qobject_cast( mMainToolBar->actions()[KMainToolBarArtists] ); + action = qobject_cast( mMainToolBar->actions()[KMainToolBarAlbums] ); break; case ECollectionContextPlaylists: case ECollectionContextPlaylistSongs: @@ -1162,6 +939,18 @@ else { menuAction->setDisabled( true ); } + + connect( myMenu->addAction(hbTrId("txt_common_opt_exit")), SIGNAL(triggered()), this, SLOT(exit()) ); + break; + + case ECollectionContextArtists: + menuAction = myMenu->addAction( hbTrId( "txt_mus_opt_refresh_library" ) ); + if ( !mUsbBlocked ) { + connect( menuAction, SIGNAL( triggered() ), this, SLOT( refreshLibrary() ) ); + } + else { + menuAction->setDisabled( true ); + } connect( myMenu->addAction(hbTrId("txt_common_opt_exit")), SIGNAL(triggered()), this, SLOT(exit()) ); break; case ECollectionContextAlbums: @@ -1176,6 +965,7 @@ } connect( myMenu->addAction(hbTrId("txt_common_opt_exit")), SIGNAL(triggered()), this, SLOT(exit()) ); break; + case ECollectionContextArtistSongs: case ECollectionContextAlbumSongs: menuAction = myMenu->addAction( hbTrId( "txt_mus_opt_add_to_playlist" ) ); if ( !mUsbBlocked ) { @@ -1259,6 +1049,8 @@ setToolBar( new HbToolBar ); } break; + case ECollectionContextArtistAlbums: + case ECollectionContextArtistSongs: case ECollectionContextAlbumSongs: case ECollectionContextGenreSongs: if ( !toolBar()->actions().empty() ) { @@ -1282,18 +1074,19 @@ if ( mViewMode == MpCommon::FetchView ) { // 'Back' is used in all views in fetch mode because we must // appear as an embedded application. - setNavigationAction( mSoftKeyBack ); + setNavigationAction( mNavigationBack ); } else { switch ( mCollectionContext ) { case ECollectionContextAllSongs: + case ECollectionContextArtists: case ECollectionContextAlbums: case ECollectionContextPlaylists: case ECollectionContextGenres: - setNavigationAction( mSoftKeyQuit ); + setNavigationAction( mNavigationQuit ); break; default: - setNavigationAction( mSoftKeyBack ); + setNavigationAction( mNavigationBack ); break; } } @@ -1340,58 +1133,6 @@ /*! \internal - Launches the 'Add to playlist' dialog. - */ -void MpCollectionView::launchAddToPlaylistDialog( QList &selection ) -{ - if (!mActivated) { - return; - } - QString newPlaylistName; - QStringList playlists; - mMpEngine->findPlaylists( playlists ); - HbListDialog dialog; - dialog.setStringItems( playlists ); - dialog.setSelectionMode( HbAbstractItemView::SingleSelection ); - dialog.setHeadingWidget(new HbLabel( hbTrId( "txt_mus_title_select_playlist" ) ) ); - dialog.setPrimaryAction(new HbAction( hbTrId( "txt_mus_button_new" ) ) ); - dialog.setSecondaryAction(new HbAction( hbTrId( "txt_common_button_cancel" ) ) ); - - forever { - if ( playlists.count() ) { - //There are saved playlists, query for a saved playlist or new. - setOutstandingPopup( &dialog ); - HbAction *selectedAction = mActivated ? dialog.exec() : 0; - setOutstandingPopup( 0 ); - if ( selectedAction == dialog.primaryAction() ) { - //User selected pimaryAction "new", fall trough to new playlyst query. - } - else if ( dialog.selectedItems().count() ) {//this only works for SingleSelection - // User selected existing playlist, add songs and exit the loop. - mMpEngine->saveToPlaylist( dialog.selectedItems().at( 0 ), selection ); - break; - } - else { - //Cancel was pressed or dialog was closed or never executed, exit the loop. - break; - } - } - //querying for a new playlist name. - if ( queryNewPlaylistName(newPlaylistName , playlists) ) { - // user selected a new playlist, save and exit the loop. - mMpEngine->createPlaylist( newPlaylistName, selection ); - break; - } - else if (!playlists.count()) { - // user decided to not provide a new name and there are no saved playlists, exit the loop - break; - } - // user decided to not provide a new name and there are saved playlists, back to the top. - } //forever -} - -/*! - \internal starts a transition of the main container with a decoy snapshot. */ void MpCollectionView::startContainerTransition( TCollectionContext contextFrom, TCollectionContext contextTo ) @@ -1408,6 +1149,9 @@ if ( ( contextFrom == ECollectionContextAlbums && contextTo == ECollectionContextAlbumSongs ) || + ( contextFrom == ECollectionContextArtists && contextTo == ECollectionContextArtistAlbums ) || + ( contextFrom == ECollectionContextArtistAlbums && contextTo == ECollectionContextAlbumSongs ) || + ( contextFrom == ECollectionContextArtistAlbums && contextTo == ECollectionContextArtistSongs ) || ( contextFrom == ECollectionContextPlaylists && contextTo == ECollectionContextPlaylistSongs ) || ( contextFrom == ECollectionContextGenres && contextTo == ECollectionContextGenreSongs ) ) { HbEffect::start( mSnapshot, @@ -1425,6 +1169,9 @@ QString( "mainContainer_effect") ); } else if( ( contextFrom == ECollectionContextAlbumSongs && contextTo == ECollectionContextAlbums ) || + ( contextFrom == ECollectionContextArtistAlbums && contextTo == ECollectionContextArtists ) || + ( contextFrom == ECollectionContextAlbumSongs && contextTo == ECollectionContextArtistAlbums ) || + ( contextFrom == ECollectionContextArtistSongs && contextTo == ECollectionContextArtistAlbums ) || ( contextFrom == ECollectionContextPlaylistSongs && contextTo == ECollectionContextPlaylists ) || ( contextFrom == ECollectionContextGenreSongs && contextTo == ECollectionContextGenres ) ) { HbEffect::start( mSnapshot, @@ -1461,168 +1208,13 @@ /*! \internal - request a delete operation always it has been confirmed. + Closes any active dialog or menu. */ -void MpCollectionView::requestDelete( QList &selection ) +void MpCollectionView::cancelOngoingOperation() { - bool confirmation( false ); - // Todo: Use HbMessageBox::question when time-out removed from it - HbMessageBox dialog( HbMessageBox::MessageTypeQuestion ); - - QString message; - HbAction *action = 0; - - switch ( mCollectionContext ) { - case ECollectionContextAllSongs: - case ECollectionContextAlbumSongs: - message = hbTrId( "txt_mus_delete_song" ); - dialog.setText( message ); - dialog.setTimeout( HbPopup::NoTimeout ); - setOutstandingPopup( &dialog ); - action = mActivated ? dialog.exec() : 0; - setOutstandingPopup( 0 ); - if ( action && action == dialog.primaryAction() ) { - confirmation = true; - } - break; - case ECollectionContextAlbums: - message = hbTrId( "txt_mus_delete_album" ); - dialog.setText( message ); - dialog.setTimeout( HbPopup::NoTimeout ); - setOutstandingPopup( &dialog ); - action = mActivated ? dialog.exec() : 0; - setOutstandingPopup( 0 ); - if ( action && action == dialog.primaryAction() ) { - confirmation = true; - } - break; - case ECollectionContextPlaylists: - message = hbTrId( "txt_mus_delete_playlist" ); - dialog.setText( message ); - dialog.setTimeout( HbPopup::NoTimeout ); - setOutstandingPopup( &dialog ); - action = mActivated ? dialog.exec() : 0; - setOutstandingPopup( 0 ); - if ( action && action == dialog.primaryAction() ) { - confirmation = true; - } - break; - case ECollectionContextPlaylistSongs: - case ECollectionContextGenres: - case ECollectionContextGenreSongs: - confirmation = true; - break; - case ECollectionContextUnknown: - default: - // We shouldn't be here - TX_LOG_ARGS( "Invalid Collection Context:" << mCollectionContext ); - break; - } - - if ( confirmation ) { - mMpEngine->deleteSongs( selection ); + if ( mActivated ) { + mMpPopupHandler->cancelOngoingPopup(); + menu()->close(); } } -/*! - \internal - Returns a list of itmes selected. - */ -QModelIndexList MpCollectionView::getModelIndexes( const QString &label, QAbstractItemModel* model, bool &ok ) -{ - QModelIndexList result; - - if ( !mActivated ) { - ok = false; - return result; - } - - HbListDialog *dlg = new HbListDialog(); - dlg->setHeadingWidget( new HbLabel( label ) ); - dlg->setSelectionMode( HbAbstractItemView::MultiSelection ); - dlg->setModel( model ); - setOutstandingPopup( dlg ); - HbAction* action = mActivated ? dlg->exec() : 0; - setOutstandingPopup( 0 ); - if( action == dlg->primaryAction() ){ //OK was pressed - ok = true; - result = dlg->selectedModelIndexes(); - } - else{ //Cancel was pressed or dialog was closed or never executed. - ok = false; - } - dlg->setModel( 0 ); - delete dlg; - return result; -} - -/*! - \internal - Returns a string from user input. - */ -QString MpCollectionView::getText( const QString &label,const QString &text, - bool &ok ) -{ - - QString result; - - if ( !mActivated ) { - ok = false; - return result; - } - - HbInputDialog *dlg = new HbInputDialog(); - dlg->setPromptText( label ); - dlg->setInputMode( HbInputDialog::TextInput ); - dlg->setValue( text ); - setOutstandingPopup( dlg ); - HbAction* action = mActivated ? dlg->exec() : 0; - setOutstandingPopup( 0 ); - if( action == dlg->primaryAction() ) { //OK was pressed - ok = true; - result = dlg->value().toString(); - } else { //Cancel was pressed or dialog was closed or never executed. - ok = false; - } - delete dlg; - return result; -} - -/*! - \internal - sets \a popup as the current outstanding popup and cancels any otstanding popup. - */ -void MpCollectionView::setOutstandingPopup( HbPopup *popup ) -{ - if ( mOutstandingPopup ) { - mOutstandingPopup->close(); - } - mOutstandingPopup = popup; -} - -/*! - \internal - sets \a newPlaylistName with imput name from the user, uses \a playlists to - generate a suggested playlist name, retrns true if the user confirmed the query. - */ -bool MpCollectionView::queryNewPlaylistName(QString &newPlaylistName , const QStringList &playlists ) -{ - bool ret= false; - if (!mActivated) { - return ret; - } - int i = 0; - for ( ; - playlists.contains( hbTrId( "txt_mus_dialog_enter_name_entry_playlist_l1" ).arg( i ) ) ; - i++ ) {}; - QString suggestedPlaylistName = hbTrId( "txt_mus_dialog_enter_name_entry_playlist_l1" ).arg( i ); - QString suggestedText; - bool ok = false; - suggestedText = getText( hbTrId("txt_mus_dialog_enter_name" ), suggestedPlaylistName, ok); - if ( ok ) { - newPlaylistName = suggestedText; - ret = true; - } - return ret; -} - diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/src/unittest_mpcollectioncontainers.cpp --- a/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/src/unittest_mpcollectioncontainers.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/src/unittest_mpcollectioncontainers.cpp Fri May 14 15:49:53 2010 +0300 @@ -36,6 +36,7 @@ #include "mpcollectioncontainer.h" #include "mpcollectionlistcontainer.h" #include "mpcollectioncontainerallsongs.h" +#include "mpcollectioncontainerartists.h" #include "mpcollectioncontaineralbums.h" #include "mpcollectioncontainerplaylists.h" #include "mpcollectioncontainergenres.h" @@ -116,15 +117,32 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); + QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); delete mTest; mTest = 0; + mTest = new MpCollectionContainerArtists(mView->mDocumentLoader); + QVERIFY(static_cast(mTest)->mList == 0); + QVERIFY(static_cast(mTest)->mInfoBar == 0); + QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); + + QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); + + delete mTest; + mTest = 0; + mTest = new MpCollectionContainerAlbums(mView->mDocumentLoader); QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); delete mTest; @@ -134,6 +152,8 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); delete mTest; @@ -143,6 +163,8 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAllSongs); @@ -151,6 +173,8 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAlbums); @@ -159,6 +183,8 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->indexFeedbackPolicy() == HbIndexFeedback::IndexFeedbackSingleCharacter); QCOMPARE(mTest->mCollectionContext,ECollectionContextUnknown); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); } @@ -180,9 +206,54 @@ QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == static_cast(mTest)->mList); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAllSongs); mTest = 0; + mTest = mView->mContainerFactory->createContainer(ECollectionContextArtists); + mCollectionData->mContext = ECollectionContextArtists; + mTest->setDataModel(mCollectionDataModel); + + QVERIFY(static_cast(mTest)->mList != 0); + QVERIFY(static_cast(mTest)->mInfoBar == 0); + QCOMPARE(static_cast(mTest)->mList->itemRecycling(), true); + QCOMPARE(static_cast(mTest)->mList->scrollingStyle(), HbListView::PanOrFlick); + QCOMPARE(static_cast(mTest)->mList->clampingStyle(), HbListView::BounceBackClamping); + QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); + QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); + QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == static_cast(mTest)->mList); + QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextArtists); + + mCollectionData->mContext = ECollectionContextArtistAlbums; + mTest->setDataModel(mCollectionDataModel); + + QVERIFY(static_cast(mTest)->mList != 0); + QVERIFY(static_cast(mTest)->mInfoBar != 0); + QCOMPARE(static_cast(mTest)->mList->itemRecycling(), true); + QCOMPARE(static_cast(mTest)->mList->scrollingStyle(), HbListView::PanOrFlick); + QCOMPARE(static_cast(mTest)->mList->clampingStyle(), HbListView::BounceBackClamping); + QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); + QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); + QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == static_cast(mTest)->mList); + QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextArtists); + + mCollectionData->mContext = ECollectionContextArtistSongs; + mTest->setDataModel(mCollectionDataModel); + + QVERIFY(static_cast(mTest)->mList != 0); + QVERIFY(static_cast(mTest)->mInfoBar != 0); + QCOMPARE(static_cast(mTest)->mList->itemRecycling(), true); + QCOMPARE(static_cast(mTest)->mList->scrollingStyle(), HbListView::PanOrFlick); + QCOMPARE(static_cast(mTest)->mList->clampingStyle(), HbListView::BounceBackClamping); + QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); + QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); + QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == static_cast(mTest)->mList); + QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextArtists); + + mTest = 0; mTest = mView->mContainerFactory->createContainer(ECollectionContextAlbums); mCollectionData->mContext = ECollectionContextAlbums; mTest->setDataModel(mCollectionDataModel); @@ -195,6 +266,7 @@ QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == static_cast(mTest)->mList); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAlbums); mCollectionData->mContext = ECollectionContextAlbumSongs; @@ -208,6 +280,7 @@ QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == static_cast(mTest)->mList); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAlbums); mTest = 0; @@ -223,6 +296,7 @@ QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); mCollectionData->mContext = ECollectionContextPlaylistSongs; @@ -236,8 +310,28 @@ QCOMPARE(static_cast(mTest)->mList->longPressEnabled(), true); QCOMPARE(static_cast(mTest)->mList->verticalScrollBarPolicy(), HbScrollArea::ScrollBarAsNeeded); QCOMPARE(static_cast(mTest)->mList->listItemPrototype()->graphicsSize(), HbListViewItem::Thumbnail); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); + //Test the case when all the songs are removed from a playlist, previous case is precondition... + mCollectionData->mCount = 0; + mTest->setDataModel(mCollectionDataModel); + QVERIFY(static_cast(mTest)->mList != 0); + QVERIFY(static_cast(mTest)->mInfoBar == 0); + QVERIFY(static_cast(mTest)->mNoMusic != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); + QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); + + //Test the case when songs get added to empty playlist, previous case is precondition... + mCollectionData->mCount = 1; + mTest->setDataModel(mCollectionDataModel); + QVERIFY(static_cast(mTest)->mList != 0); + QVERIFY(static_cast(mTest)->mInfoBar != 0); + QVERIFY(static_cast(mTest)->mNoMusic == 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); + QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); + + //No data mTest = 0; mCollectionData->mCount = 0; @@ -247,6 +341,7 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAllSongs); mTest = 0; @@ -257,6 +352,7 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAlbums); mCollectionData->mContext = ECollectionContextAlbumSongs; @@ -265,6 +361,7 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextAlbums); mTest = 0; @@ -275,15 +372,18 @@ QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic != 0); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); mCollectionData->mContext = ECollectionContextPlaylistSongs; mTest->setDataModel(mCollectionDataModel); - + mCollectionData->mCount = 0; QVERIFY(static_cast(mTest)->mList == 0); QVERIFY(static_cast(mTest)->mInfoBar == 0); QVERIFY(static_cast(mTest)->mNoMusic != 0); - QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); + QVERIFY(static_cast(mTest)->mIndexFeedback->itemView() == 0 ); + QCOMPARE(mView->mContainerFactory->mCurrentContext, ECollectionContextPlaylists); + } /*! @@ -299,18 +399,25 @@ QCOMPARE(qvariant_cast(spy.at(0).at(0)), -1); mTest = 0; - mTest = mView->mContainerFactory->createContainer(ECollectionContextAlbums); + mTest = mView->mContainerFactory->createContainer(ECollectionContextArtists); QSignalSpy spy2(mTest, SIGNAL(itemActivated( int ))); - static_cast(mTest)->itemActivated(QModelIndex()); + static_cast(mTest)->itemActivated(QModelIndex()); QCOMPARE(spy2.count(), 1); QCOMPARE(qvariant_cast(spy2.at(0).at(0)), -1); mTest = 0; - mTest = mView->mContainerFactory->createContainer(ECollectionContextPlaylists); + mTest = mView->mContainerFactory->createContainer(ECollectionContextAlbums); QSignalSpy spy3(mTest, SIGNAL(itemActivated( int ))); - static_cast(mTest)->itemActivated(QModelIndex()); + static_cast(mTest)->itemActivated(QModelIndex()); QCOMPARE(spy3.count(), 1); QCOMPARE(qvariant_cast(spy3.at(0).at(0)), -1); + + mTest = 0; + mTest = mView->mContainerFactory->createContainer(ECollectionContextPlaylists); + QSignalSpy spy4(mTest, SIGNAL(itemActivated( int ))); + static_cast(mTest)->itemActivated(QModelIndex()); + QCOMPARE(spy4.count(), 1); + QCOMPARE(qvariant_cast(spy4.at(0).at(0)), -1); } /*! @@ -327,18 +434,25 @@ QCOMPARE(qvariant_cast(spy.at(0).at(0)), -1); mTest = 0; - mTest = mView->mContainerFactory->createContainer(ECollectionContextAlbums); + mTest = mView->mContainerFactory->createContainer(ECollectionContextArtists); QSignalSpy spy2(mTest, SIGNAL(itemLongPressed( int, QPointF ))); - static_cast(mTest)->onLongPressed(viewItem->listItemPrototype(), QPointF()); + static_cast(mTest)->onLongPressed(viewItem->listItemPrototype(), QPointF()); QCOMPARE(spy2.count(), 1); QCOMPARE(qvariant_cast(spy2.at(0).at(0)), -1); mTest = 0; - mTest = mView->mContainerFactory->createContainer(ECollectionContextPlaylists); + mTest = mView->mContainerFactory->createContainer(ECollectionContextAlbums); QSignalSpy spy3(mTest, SIGNAL(itemLongPressed( int, QPointF ))); - static_cast(mTest)->onLongPressed(viewItem->listItemPrototype(), QPointF()); + static_cast(mTest)->onLongPressed(viewItem->listItemPrototype(), QPointF()); QCOMPARE(spy3.count(), 1); QCOMPARE(qvariant_cast(spy3.at(0).at(0)), -1); + + mTest = 0; + mTest = mView->mContainerFactory->createContainer(ECollectionContextPlaylists); + QSignalSpy spy4(mTest, SIGNAL(itemLongPressed( int, QPointF ))); + static_cast(mTest)->onLongPressed(viewItem->listItemPrototype(), QPointF()); + QCOMPARE(spy4.count(), 1); + QCOMPARE(qvariant_cast(spy4.at(0).at(0)), -1); } // End of file diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/stub/inc/mpcollectionview.h --- a/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/stub/inc/mpcollectionview.h Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/stub/inc/mpcollectionview.h Fri May 14 15:49:53 2010 +0300 @@ -76,8 +76,8 @@ bool mEffectOnGoing; HbMainWindow *mWindow; // Not own - HbAction *mSoftKeyQuit; // Not own - HbAction *mSoftKeyBack; // Not own + HbAction *mNavigationQuit; // Not own + HbAction *mNavigationBack; // Not own MpCollectionDocumentLoader *mDocumentLoader; // Own HbWidget *mMainContainer; // Own diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/unittest_mpcollectioncontainers.pro --- a/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/unittest_mpcollectioncontainers.pro Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/unittest_mpcollectioncontainers.pro Fri May 14 15:49:53 2010 +0300 @@ -35,6 +35,7 @@ ../../inc/mpcollectioncontainer.h \ ../../inc/mpcollectionlistcontainer.h \ ../../inc/mpcollectioncontainerallsongs.h \ + ../../inc/mpcollectioncontainerartists.h \ ../../inc/mpcollectioncontaineralbums.h \ ../../inc/mpcollectioncontainerplaylists.h \ ../../inc/mpcollectioncontainergenres.h \ @@ -48,6 +49,7 @@ ../../src/mpcollectioncontainer.cpp \ ../../src/mpcollectionlistcontainer.cpp \ ../../src/mpcollectioncontainerallsongs.cpp \ + ../../src/mpcollectioncontainerartists.cpp \ ../../src/mpcollectioncontaineralbums.cpp \ ../../src/mpcollectioncontainerplaylists.cpp \ ../../src/mpcollectioncontainergenres.cpp \ diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpdetailsviewplugin/inc/mpdetailsview.h --- a/mpviewplugins/mpdetailsviewplugin/inc/mpdetailsview.h Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpdetailsviewplugin/inc/mpdetailsview.h Fri May 14 15:49:53 2010 +0300 @@ -109,7 +109,7 @@ bool mActivated; HbMainWindow *mWindow; - HbAction *mSoftKeyBack; + HbAction *mNavigationBack; HbWidget *mContainer; HbLabel *mSongText; //owned diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpdetailsviewplugin/resources/detailsview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpdetailsviewplugin/resources/detailsview.docml Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpdetailsviewplugin/src/mpdetailsview.cpp --- a/mpviewplugins/mpdetailsviewplugin/src/mpdetailsview.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpdetailsviewplugin/src/mpdetailsview.cpp Fri May 14 15:49:53 2010 +0300 @@ -63,7 +63,7 @@ mFrameworkWrapper( 0 ), mActivated( false ), mWindow( 0 ), - mSoftKeyBack( 0 ), + mNavigationBack( 0 ), mSongText( NULL ), mAlbumText( NULL ), mArtistText( NULL ), @@ -127,8 +127,8 @@ if ( mFrameworkWrapper ) { delete mFrameworkWrapper; } - if ( mSoftKeyBack ) { - delete mSoftKeyBack; + if ( mNavigationBack ) { + delete mNavigationBack; } if ( mDocumentLoader ) { delete mDocumentLoader; @@ -174,7 +174,7 @@ } mWindow = mainWindow(); - mSoftKeyBack = new HbAction( Hb::BackAction, this ); + mNavigationBack = new HbAction( Hb::BackNaviAction, this ); mFrameworkWrapper = new MpMpxDetailsFrameworkWrapper( ); mSongData = mFrameworkWrapper->songData(); @@ -213,7 +213,7 @@ // TODO: might need later setupMenu(); - connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) ); + connect( mNavigationBack, SIGNAL( triggered() ), this, SLOT( back() ) ); connect( mShareButton, SIGNAL( clicked() ), this, SLOT( share() ) ); connect( mSongData, SIGNAL( albumArtReady() ), this, SLOT( albumArtChanged() ) ); connect( mSongData, SIGNAL( playbackInfoChanged() ), this, SLOT( playbackInfoChanged() ) ); @@ -229,7 +229,7 @@ void MpDetailsView::activateView() { TX_ENTRY - setNavigationAction( mSoftKeyBack ); + setNavigationAction( mNavigationBack ); mFrameworkWrapper->retrieveSong(); mActivated = true; diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpdetailsviewplugin/src/mpsongdata.cpp --- a/mpviewplugins/mpdetailsviewplugin/src/mpsongdata.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpdetailsviewplugin/src/mpsongdata.cpp Fri May 14 15:49:53 2010 +0300 @@ -61,13 +61,6 @@ */ MpSongData::MpSongData( QObject *parent ) : QObject( parent ), - mTitle( NULL ), - mAlbum( NULL ), - mArtist( NULL ), - mComposer( NULL), - mGenre( NULL ), - mYear( NULL ), - mAlbumTrack( NULL ), mAlbumArt(), mReqId( KUndefined ) { diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpdetailsviewplugin/tsrc/unittest_mpdetailsview/src/unittest_mpdetailsview.cpp --- a/mpviewplugins/mpdetailsviewplugin/tsrc/unittest_mpdetailsview/src/unittest_mpdetailsview.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpdetailsviewplugin/tsrc/unittest_mpdetailsview/src/unittest_mpdetailsview.cpp Fri May 14 15:49:53 2010 +0300 @@ -138,7 +138,7 @@ } void TestMpDetailsView::testbackSlot() { - connect(this, SIGNAL(back()), mTest->mSoftKeyBack, SIGNAL(triggered())); + connect(this, SIGNAL(back()), mTest->mNavigationBack, SIGNAL(triggered())); QSignalSpy spy(mTest, SIGNAL(command(int))); QVERIFY(spy.isValid()); QCOMPARE(spy.count(),0); diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpplaybackviewplugin/inc/mpplaybackview.h --- a/mpviewplugins/mpplaybackviewplugin/inc/mpplaybackview.h Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpplaybackviewplugin/inc/mpplaybackview.h Fri May 14 15:49:53 2010 +0300 @@ -78,7 +78,7 @@ MpEqualizerWidget *mEqualizerWidget; // Own HbMainWindow *mWindow; // Not own - HbAction *mSoftKeyBack; // Own + HbAction *mNavigationBack; // Own bool mActivated; HbIcon *mPlayIcon; // Own diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpplaybackviewplugin/resources/playbackwidget.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpplaybackviewplugin/resources/playbackwidget.docml Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpplaybackviewplugin/src/mpequalizerwidget.cpp --- a/mpviewplugins/mpplaybackviewplugin/src/mpequalizerwidget.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpplaybackviewplugin/src/mpequalizerwidget.cpp Fri May 14 15:49:53 2010 +0300 @@ -86,18 +86,19 @@ { TX_ENTRY + HbAction *action; setTimeout(NoTimeout); + setModal( true ); setDismissPolicy(HbDialog::NoDismiss); setFrameType(HbPopup::Strong); - setHeadingWidget(new HbLabel(hbTrId("txt_mus_title_select_preset"))); - setPrimaryAction(new HbAction(hbTrId("txt_common_button_ok"))); - setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"))); - + setHeadingWidget(new HbLabel(hbTrId("txt_mus_title_select_preset"))); + + if ( mEqualizerReady ) { mOriginalPreset = mEqualizerWrapper->activePreset(); QStringList listItems = mEqualizerWrapper->presetNames(); listItems.prepend(hbTrId("txt_mus_list_off")); - + int presetSelected; if (mOriginalPreset == KEqualizerPresetNone) { presetSelected = 0; //First list item corresponds to "OFF" @@ -105,25 +106,23 @@ else { presetSelected = mOriginalPreset; } - + mPresetsList = new HbRadioButtonList(listItems, presetSelected, HbRadioButtonList::NoPreview, this); setContentWidget( mPresetsList ); //mPresetsList now owned by HbDialog - + connect( mPresetsList, SIGNAL(itemSelected(int)), this, SLOT(presetSelected(int))); } - connect( secondaryAction(), - SIGNAL( triggered(bool) ), - this, - SLOT( cancelSelected(bool) ) ); - - connect( primaryAction(), - SIGNAL( triggered(bool) ), - this, - SLOT( okSelected(bool) ) ); + clearActions(); + action = new HbAction( hbTrId( "txt_common_button_ok" ) ); + connect( action, SIGNAL( triggered( bool ) ), this, SLOT( okSelected( bool ) ) ); + addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_cancel" ) ); + connect( action, SIGNAL( triggered( bool ) ), this, SLOT( cancelSelected( bool ) ) ); + addAction( action ); TX_EXIT } diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp --- a/mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp Fri May 14 15:49:53 2010 +0300 @@ -61,7 +61,7 @@ mPlaybackData( 0 ), mPlaybackWidget( 0 ), mEqualizerWidget( new MpEqualizerWidget() ), - mSoftKeyBack( 0 ), + mNavigationBack( 0 ), mActivated( false ), mPlayIcon( 0 ), mPauseIcon( 0 ), @@ -79,7 +79,7 @@ MpPlaybackView::~MpPlaybackView() { TX_ENTRY - delete mSoftKeyBack; + delete mNavigationBack; delete mPlayIcon; delete mPauseIcon; delete mShuffleOnIcon; @@ -119,8 +119,8 @@ mWindow = mainWindow(); - mSoftKeyBack = new HbAction( Hb::BackAction, this ); - connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) ); + mNavigationBack = new HbAction( Hb::BackNaviAction, this ); + connect( mNavigationBack, SIGNAL( triggered() ), this, SLOT( back() ) ); mMpEngine = MpEngine::instance(); mPlaybackData = mMpEngine->playbackData(); @@ -152,7 +152,7 @@ { TX_ENTRY mActivated = true; - setNavigationAction( mSoftKeyBack ); + setNavigationAction( mNavigationBack ); TX_EXIT } @@ -420,7 +420,7 @@ if( mEqualizerWidget ) { - mEqualizerWidget->exec(); + mEqualizerWidget->show(); } TX_EXIT diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/src/unittest_mpequalizerwidget.cpp --- a/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/src/unittest_mpequalizerwidget.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/src/unittest_mpequalizerwidget.cpp Fri May 14 15:49:53 2010 +0300 @@ -116,8 +116,7 @@ QVERIFY(mTest->dismissPolicy() == HbDialog::NoDismiss); QVERIFY(mTest->frameType() == HbPopup::Strong); QVERIFY(mTest->headingWidget() != 0); - QVERIFY(mTest->primaryAction() != 0); - QVERIFY(mTest->secondaryAction() != 0); + QVERIFY(mTest->actions().count() != 0); QVERIFY(mTest->contentWidget() == 0); diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpsettingsviewplugin/inc/mpsettingsview.h --- a/mpviewplugins/mpsettingsviewplugin/inc/mpsettingsview.h Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpsettingsviewplugin/inc/mpsettingsview.h Fri May 14 15:49:53 2010 +0300 @@ -46,7 +46,7 @@ private: HbMainWindow *mWindow; // not own - HbAction *mSoftKeyBack; // own + HbAction *mNavigationBack; // own MpSettingsAudioEffectsWidget *mAudioEffectsWidget; // not own Q_DISABLE_COPY(MpSettingsView) diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpsettingsviewplugin/resources/settingsview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpsettingsviewplugin/resources/settingsview.docml Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpsettingsviewplugin/src/mpsettingsaudioeffectswidget.cpp --- a/mpviewplugins/mpsettingsviewplugin/src/mpsettingsaudioeffectswidget.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpsettingsviewplugin/src/mpsettingsaudioeffectswidget.cpp Fri May 14 15:49:53 2010 +0300 @@ -83,6 +83,7 @@ slider->setContentWidgetData( QString( "toolTipVisible" ), false ); slider->setContentWidgetData( QString( "tickPosition" ), Hb::SliderTicksRight ); slider->setContentWidgetData( QString( "sliderPosition" ),mFrameworkWrapper->balance() ); + slider->setContentWidgetData( QString( "trackFilled" ), false ); if ( mFrameworkWrapper->loudness() == true ) { loudnessItem->setContentWidgetData( QString( "text" ), hbTrId( "txt_mus_setlabel_loudness_val_on" ) ); loudnessItem->setContentWidgetData( QString( "additionalText" ), hbTrId( "txt_mus_setlabel_loudness_val_off" ) ); diff -r ecf06a08d4d9 -r 3ec52facab4d mpviewplugins/mpsettingsviewplugin/src/mpsettingsview.cpp --- a/mpviewplugins/mpsettingsviewplugin/src/mpsettingsview.cpp Mon May 03 12:29:20 2010 +0300 +++ b/mpviewplugins/mpsettingsviewplugin/src/mpsettingsview.cpp Fri May 14 15:49:53 2010 +0300 @@ -46,7 +46,7 @@ */ MpSettingsView::MpSettingsView() : mWindow(0), - mSoftKeyBack(0), + mNavigationBack(0), mAudioEffectsWidget(0) { TX_LOG @@ -58,7 +58,7 @@ MpSettingsView::~MpSettingsView() { TX_ENTRY - delete mSoftKeyBack; + delete mNavigationBack; TX_EXIT } @@ -83,17 +83,17 @@ } mWindow = mainWindow(); - mSoftKeyBack = new HbAction(Hb::BackAction, this); + mNavigationBack = new HbAction(Hb::BackNaviAction, this); mAudioEffectsWidget = new MpSettingsAudioEffectsWidget(this); mAudioEffectsWidget->initialize(); setWidget( mAudioEffectsWidget ); - connect( mSoftKeyBack, + connect( mNavigationBack, SIGNAL(triggered()), this, SLOT(back()) ); - connect( mSoftKeyBack, + connect( mNavigationBack, SIGNAL(triggered()), mAudioEffectsWidget, SLOT(persistBalance()) ); @@ -106,7 +106,7 @@ void MpSettingsView::activateView() { TX_ENTRY - setNavigationAction( mSoftKeyBack ); + setNavigationAction( mNavigationBack ); TX_EXIT } diff -r ecf06a08d4d9 -r 3ec52facab4d utilities/mpnowplayingbanner/resources/nowplaying.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utilities/mpnowplayingbanner/resources/nowplaying.docml Fri May 14 15:49:53 2010 +0300 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +