--- a/app/inc/mpmainwindow.h Wed Aug 18 09:46:20 2010 +0300
+++ b/app/inc/mpmainwindow.h Thu Sep 02 20:24:03 2010 +0300
@@ -40,7 +40,8 @@
public:
enum ViewType {
- CollectionView = 1,
+ NoView = 0,
+ CollectionView,
PlaybackView,
SettingsView,
DetailsView,
@@ -88,6 +89,7 @@
MpxViewPlugin *mMediaWallViewPlugin; // Own
MpxViewPlugin *mCurrentViewPlugin; // Own
ViewType mVerticalViewType;
+ ViewType mPreviousVerticalViewType;
MusicServices *mMusicServices; // Own
MpGlobalPopupHandler *mPopupHandler; // Own
bool mUserExit;
--- a/app/src/mpglobalpopuphandler.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/app/src/mpglobalpopuphandler.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -43,7 +43,6 @@
const QString KScanFinished = QString( "ScanFinishedDialog" );
const QString KUnableToContinueDueUSB = QString( "UnableToContinueDueUSB" );
const QString KUsbBlockingNote = QString( "UsbBlockingNote" );
-const QString KPromptRefresh = QString( "PromptRefresh" );
const QString KMTPInfoDialog = QString( "MTPInfoDialog" );
// Popups Actions
@@ -317,13 +316,9 @@
void MpGlobalPopupHandler::launchDiskFullDialog()
{
TX_ENTRY
- QString diskfull;
- diskfull = hbTrId( "txt_mus_title_refresh_cancelled" );
- diskfull.append(" ");
- diskfull.append( hbTrId( "txt_mus_info_out_of_disk_space" ) );
HbMessageBox *diskFullDialog = new HbMessageBox();
diskFullDialog->setIcon( HbIcon( QString("qtg_small_fail") ) );
- diskFullDialog->setText( diskfull );
+ diskFullDialog->setText( hbTrId( "txt_mus_info_out_of_disk_space" ) );
diskFullDialog->setTimeout( HbPopup::NoTimeout);
diskFullDialog->setAttribute( Qt::WA_DeleteOnClose );
diskFullDialog->setObjectName( KDiskFullDialog );
--- a/app/src/mpmainwindow.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/app/src/mpmainwindow.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -58,6 +58,7 @@
mMediaWallViewPlugin(0),
mCurrentViewPlugin(0),
mVerticalViewType( CollectionView ),
+ mPreviousVerticalViewType( NoView ),
mMusicServices(0),
mPopupHandler(0),
mUserExit( false ),
@@ -221,19 +222,22 @@
lower();
break;
case MpCommon::ActivateCollectionView:
- activateView(CollectionView);
+ activateView( CollectionView );
break;
case MpCommon::ActivatePlaybackView:
- activateView(PlaybackView);
+ activateView( PlaybackView );
break;
case MpCommon::ActivateSettingsView:
- activateView(SettingsView);
+ activateView( SettingsView );
break;
case MpCommon::ActivateDetailsView:
- activateView(DetailsView);
+ activateView( DetailsView );
break;
case MpCommon::ActivatePreviousView:
- activateView(mVerticalViewType);
+ if ( orientation() == Qt::Vertical
+ && mPreviousVerticalViewType != NoView ) {
+ activateView( mPreviousVerticalViewType );
+ }
break;
}
TX_EXIT
@@ -248,7 +252,7 @@
activateView( mVerticalViewType );
}
else {
- activateView(MediaWallView);
+ activateView( MediaWallView );
}
}
@@ -281,7 +285,13 @@
Q_ASSERT( mCurrentViewPlugin );
if ( mCurrentViewPlugin ) {
- if ( viewType != MediaWallView && viewType != DetailsView ) {
+ if ( viewType != MediaWallView ) {
+ //storing previous vertical view type only if it is not the same
+ //view, this to be able to keep track of the previously activated
+ //view excluding media wall switching.
+ if ( mVerticalViewType != viewType ) {
+ mPreviousVerticalViewType = mVerticalViewType;
+ }
mVerticalViewType = viewType;
}
addView( reinterpret_cast<HbView*>( mCurrentViewPlugin->getView() ) );
@@ -336,8 +346,7 @@
}
else if ( mCollectionViewPlugin && mCurrentViewPlugin != mCollectionViewPlugin ) {
activateView( CollectionView );
- MpViewBase* collectionView = reinterpret_cast<MpViewBase*>(mCollectionViewPlugin->getView());
- collectionView->setDefaultView();
+
}
TX_EXIT
--- a/inc/mpcollectiondatamodel.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpcollectiondatamodel.h Thu Sep 02 20:24:03 2010 +0300
@@ -24,6 +24,7 @@
class MpMpxCollectionData;
class MpCollectionAlbumArtManager;
+class MpPlaybackData;
#if defined(BUILD_MPDATA_LIB)
#define MPDATA_EXPORT Q_DECL_EXPORT
@@ -37,7 +38,7 @@
public:
- explicit MpCollectionDataModel( MpMpxCollectionData *data, QObject *parent=0 );
+ explicit MpCollectionDataModel( MpMpxCollectionData *data, MpPlaybackData *playbackData = 0, QObject *parent=0 );
virtual ~MpCollectionDataModel();
int rowCount(const QModelIndex &parent=QModelIndex()) const;
@@ -52,6 +53,8 @@
MpMpxCollectionData *collectionData();
+ void setLayout(TCollectionLayout layout);
+
signals:
void orderChanged( int containerId, int itemId, int itemOrdinal, int newOrdinal );
@@ -63,14 +66,18 @@
void updateAlbumArt( int index );
void refreshModel();
void reloadData();
+ void reloadData( int fromIndex, int toIndex );
+ void fileCorrupted( int songId );
private:
MpMpxCollectionData *mCollectionData; // Not own
+ MpPlaybackData *mPlaybackData; // Not own
MpCollectionAlbumArtManager *mAlbumArtManager; // Own
int mRowCount;
int mAlbumIndexOffset;
int mHiddenItemIndex;
+ TCollectionLayout mCollectionLayout;
};
--- a/inc/mpcollectiontbonelistdatamodel.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpcollectiontbonelistdatamodel.h Thu Sep 02 20:24:03 2010 +0300
@@ -43,6 +43,7 @@
int rowCount(const QModelIndex &parent=QModelIndex()) const;
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const;
+ void enablePlaybackIndicatorEnable(bool enable);
signals:
@@ -54,6 +55,8 @@
void refreshModel();
void updateSong();
void updatePlaybackState();
+ void fileCorrupted(int songId);
+
private:
@@ -62,6 +65,7 @@
int mRowCount;
int mCurrentSongId;
bool mPlaybackActive;
+ bool mPlaybackIndicatorEnabled;
};
--- a/inc/mpengine.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpengine.h Thu Sep 02 20:24:03 2010 +0300
@@ -147,6 +147,7 @@
// Playback related
void volumePropertyChanged( MpCommon::MpVolumeProperty property, int value );
+ void corruptedStop();
// Equalizer related
void equalizerReady();
--- a/inc/mpmpxcollectiondata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpmpxcollectiondata.h Thu Sep 02 20:24:03 2010 +0300
@@ -19,6 +19,7 @@
#define MPMPXCOLLECTIONDATA_H
#include <QObject>
+#include <QAbstractListModel>
#include "mpmpxcollectionviewdefs.h"
@@ -50,6 +51,11 @@
Rating,
AlbumArtUri
};
+
+ enum DataProperty {
+ Corrupted,
+ DrmExpired
+ };
explicit MpMpxCollectionData( QObject *parent=0 );
virtual ~MpMpxCollectionData();
@@ -74,18 +80,26 @@
int currentAlbumIndex() const;
int albumSongsCount() const;
QString albumSongData( int index, MpMpxCollectionData::DataType type ) const;
+ bool hasItemProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
+ bool hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
void setMpxMedia( const CMPXMedia& entries, bool reopen=false );
+ void incrementalOpenUpdate();
const CMPXMedia& containerMedia();
void setContext( TCollectionContext context );
void setAlbumContent( const CMPXMedia& albumContent );
int itemIndex( int itemUniqueId );
int albumSongIndex( int songUniqueId );
+ QList<int> songIndex( int songUniqueId );
+ void setCorruptValue(QModelIndex index, bool tBone );
+ void setReloadAlbumContent( bool reloadAlbum );
+
signals:
void contextChanged( TCollectionContext context );
void dataChanged();
+ void dataChanged( int fromIndex, int toIndex );
void albumDataChanged();
void refreshAlbumSongs();
--- a/inc/mpmpxcollectionviewdefs.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpmpxcollectionviewdefs.h Thu Sep 02 20:24:03 2010 +0300
@@ -38,5 +38,12 @@
// Register so type can be used in signal and slot connection
Q_DECLARE_METATYPE(TCollectionContext)
+// Layout where the collection is being shown.
+enum TCollectionLayout {
+ ECollectionListView = 0,
+ ECollectionSelectionDialog,
+ ECollectionArrangeSongsDialog
+};
+
#endif // MPMPXCOLLECTIONVIEWDEFS_H
--- a/inc/mpplaybackdata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpplaybackdata.h Thu Sep 02 20:24:03 2010 +0300
@@ -76,6 +76,7 @@
void commitPlaybackInfo();
void resetData();
+ void setCorrupted( int id );
public slots:
@@ -89,6 +90,7 @@
void albumArtReady();
void playbackStateChanged();
void playbackInfoChanged();
+ void fileCorrupted(int id );
private:
--- a/inc/mpviewbase.h Wed Aug 18 09:46:20 2010 +0300
+++ b/inc/mpviewbase.h Thu Sep 02 20:24:03 2010 +0300
@@ -30,7 +30,6 @@
void setViewMode(MpCommon::MpViewMode viewMode) { mViewMode = viewMode; }
MpCommon::MpViewMode viewMode() { return mViewMode; }
- virtual void setDefaultView() { }
signals:
--- a/layers.sysdef.xml Wed Aug 18 09:46:20 2010 +0300
+++ b/layers.sysdef.xml Thu Sep 02 20:24:03 2010 +0300
@@ -3,7 +3,7 @@
<!ENTITY layer_real_source_path "sf/app/musicplayer" >
]>
-<SystemDefinition name="avdomain" schema="1.5.1">
+<SystemDefinition name="musicplayer" schema="1.5.1">
<systemModel>
<!-- Common file for prebuild layers-->
<layer name="app_layer">
--- a/mpdata/bwins/mpdatau.def Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/bwins/mpdatau.def Thu Sep 02 20:24:03 2010 +0300
@@ -1,170 +1,184 @@
EXPORTS
?tr@MpMpxCollectionData@@SA?AVQString@@PBD0@Z @ 1 NONAME ; class QString MpMpxCollectionData::tr(char const *, char const *)
- ?dropMimeData@MpCollectionDataModel@@UAE_NPBVQMimeData@@W4DropAction@Qt@@HHABVQModelIndex@@@Z @ 2 NONAME ; bool MpCollectionDataModel::dropMimeData(class QMimeData const *, enum Qt::DropAction, int, int, class QModelIndex const &)
- ?currentAlbumIndex@MpMpxCollectionData@@QBEHXZ @ 3 NONAME ; int MpMpxCollectionData::currentAlbumIndex(void) const
- ?refreshModel@MpCollectionDataModel@@QAEXXZ @ 4 NONAME ; void MpCollectionDataModel::refreshModel(void)
- ?contextChanged@MpMpxCollectionData@@IAEXW4TCollectionContext@@@Z @ 5 NONAME ; void MpMpxCollectionData::contextChanged(enum TCollectionContext)
- ?mimeData@MpCollectionDataModel@@UBEPAVQMimeData@@ABV?$QList@VQModelIndex@@@@@Z @ 6 NONAME ; class QMimeData * MpCollectionDataModel::mimeData(class QList<class QModelIndex> const &) const
- ?fileName@MpSongData@@QBE?AVQString@@XZ @ 7 NONAME ; class QString MpSongData::fileName(void) const
- ?trUtf8@MpMpxCollectionData@@SA?AVQString@@PBD0H@Z @ 8 NONAME ; class QString MpMpxCollectionData::trUtf8(char const *, char const *, int)
- ?tr@MpMpxCollectionData@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString MpMpxCollectionData::tr(char const *, char const *, int)
- ??_EMpMpxCollectionData@@UAE@I@Z @ 10 NONAME ; MpMpxCollectionData::~MpMpxCollectionData(unsigned int)
- ?qt_metacast@MpCollectionDataModel@@UAEPAXPBD@Z @ 11 NONAME ; void * MpCollectionDataModel::qt_metacast(char const *)
- ?updateAlbumArt@MpCollectionDataModel@@QAEXH@Z @ 12 NONAME ; void MpCollectionDataModel::updateAlbumArt(int)
- ?resetData@MpPlaybackData@@QAEXXZ @ 13 NONAME ; void MpPlaybackData::resetData(void)
- ??_EMpPlaybackData@@UAE@I@Z @ 14 NONAME ; MpPlaybackData::~MpPlaybackData(unsigned int)
- ?metaObject@MpPlaybackData@@UBEPBUQMetaObject@@XZ @ 15 NONAME ; struct QMetaObject const * MpPlaybackData::metaObject(void) const
- ?refreshModel@MpCollectionTBoneListDataModel@@QAEXXZ @ 16 NONAME ; void MpCollectionTBoneListDataModel::refreshModel(void)
- ?title@MpSongData@@QBE?AVQString@@XZ @ 17 NONAME ; class QString MpSongData::title(void) const
- ?data@MpCollectionDataModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 18 NONAME ; class QVariant MpCollectionDataModel::data(class QModelIndex const &, int) const
- ?setAlbumId@MpPlaybackData@@QAE_NH@Z @ 19 NONAME ; bool MpPlaybackData::setAlbumId(int)
- ?mimeType@MpSongData@@QBE?AVQString@@XZ @ 20 NONAME ; class QString MpSongData::mimeType(void) const
- ?removeItem@MpMpxCollectionData@@QAEXH@Z @ 21 NONAME ; void MpMpxCollectionData::removeItem(int)
- ?getStaticMetaObject@MpMpxCollectionData@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & MpMpxCollectionData::getStaticMetaObject(void)
- ?itemCount@MpMpxCollectionData@@QAEHH@Z @ 23 NONAME ; int MpMpxCollectionData::itemCount(int)
- ?isAutoPlaylist@MpMpxCollectionData@@QAE_NH@Z @ 24 NONAME ; bool MpMpxCollectionData::isAutoPlaylist(int)
- ?position@MpPlaybackData@@QBEHXZ @ 25 NONAME ; int MpPlaybackData::position(void) const
- ?setAlbumArtUri@MpPlaybackData@@QAEXABVQString@@@Z @ 26 NONAME ; void MpPlaybackData::setAlbumArtUri(class QString const &)
- ??_EMpCollectionDataModel@@UAE@I@Z @ 27 NONAME ; MpCollectionDataModel::~MpCollectionDataModel(unsigned int)
- ?qt_metacast@MpSongData@@UAEPAXPBD@Z @ 28 NONAME ; void * MpSongData::qt_metacast(char const *)
- ?positionChanged@MpPlaybackData@@IAEXXZ @ 29 NONAME ; void MpPlaybackData::positionChanged(void)
- ?tr@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0H@Z @ 30 NONAME ; class QString MpCollectionTBoneListDataModel::tr(char const *, char const *, int)
- ?itemIndex@MpMpxCollectionData@@QAEHH@Z @ 31 NONAME ; int MpMpxCollectionData::itemIndex(int)
- ?title@MpPlaybackData@@QBEABVQString@@XZ @ 32 NONAME ; class QString const & MpPlaybackData::title(void) const
- ?qt_metacall@MpCollectionDataModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 33 NONAME ; int MpCollectionDataModel::qt_metacall(enum QMetaObject::Call, int, void * *)
- ?artist@MpSongData@@QBE?AVQString@@XZ @ 34 NONAME ; class QString MpSongData::artist(void) const
- ?setMpxMedia@MpMpxCollectionData@@QAEXABVCMPXMedia@@_N@Z @ 35 NONAME ; void MpMpxCollectionData::setMpxMedia(class CMPXMedia const &, bool)
- ?staticMetaObject@MpSongData@@2UQMetaObject@@B @ 36 NONAME ; struct QMetaObject const MpSongData::staticMetaObject
- ?playbackState@MpPlaybackData@@QBE?AW4SimplifiedState@1@XZ @ 37 NONAME ; enum MpPlaybackData::SimplifiedState MpPlaybackData::playbackState(void) const
- ?tr@MpSongData@@SA?AVQString@@PBD0H@Z @ 38 NONAME ; class QString MpSongData::tr(char const *, char const *, int)
- ?context@MpMpxCollectionData@@QBE?AW4TCollectionContext@@XZ @ 39 NONAME ; enum TCollectionContext MpMpxCollectionData::context(void) const
- ?supportedDropActions@MpCollectionDataModel@@UBE?AV?$QFlags@W4DropAction@Qt@@@@XZ @ 40 NONAME ; class QFlags<enum Qt::DropAction> MpCollectionDataModel::supportedDropActions(void) const
- ?setContext@MpMpxCollectionData@@QAEXW4TCollectionContext@@@Z @ 41 NONAME ; void MpMpxCollectionData::setContext(enum TCollectionContext)
- ?durationChanged@MpPlaybackData@@IAEXXZ @ 42 NONAME ; void MpPlaybackData::durationChanged(void)
- ?staticMetaObject@MpPlaybackData@@2UQMetaObject@@B @ 43 NONAME ; struct QMetaObject const MpPlaybackData::staticMetaObject
- ?staticMetaObject@MpCollectionTBoneListDataModel@@2UQMetaObject@@B @ 44 NONAME ; struct QMetaObject const MpCollectionTBoneListDataModel::staticMetaObject
- ?orderChanged@MpCollectionDataModel@@IAEXHHHH@Z @ 45 NONAME ; void MpCollectionDataModel::orderChanged(int, int, int, int)
- ?metaObject@MpCollectionTBoneListDataModel@@UBEPBUQMetaObject@@XZ @ 46 NONAME ; struct QMetaObject const * MpCollectionTBoneListDataModel::metaObject(void) const
- ?tr@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0@Z @ 47 NONAME ; class QString MpCollectionTBoneListDataModel::tr(char const *, char const *)
- ?bitRate@MpSongData@@QBE?AVQString@@XZ @ 48 NONAME ; class QString MpSongData::bitRate(void) const
- ?albumDataAvailable@MpCollectionTBoneListDataModel@@IAEXXZ @ 49 NONAME ; void MpCollectionTBoneListDataModel::albumDataAvailable(void)
- ?setUri@MpPlaybackData@@QAE_NABVQString@@@Z @ 50 NONAME ; bool MpPlaybackData::setUri(class QString const &)
- ?qt_metacast@MpCollectionTBoneListDataModel@@UAEPAXPBD@Z @ 51 NONAME ; void * MpCollectionTBoneListDataModel::qt_metacast(char const *)
- ?removeAlbumArtFile@MpSongData@@QBEXXZ @ 52 NONAME ; void MpSongData::removeAlbumArtFile(void) const
- ?duration@MpSongData@@QBE?AVQString@@XZ @ 53 NONAME ; class QString MpSongData::duration(void) const
- ?qt_metacall@MpCollectionTBoneListDataModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 54 NONAME ; int MpCollectionTBoneListDataModel::qt_metacall(enum QMetaObject::Call, int, void * *)
- ??0MpCollectionDataModel@@QAE@PAVMpMpxCollectionData@@PAVQObject@@@Z @ 55 NONAME ; MpCollectionDataModel::MpCollectionDataModel(class MpMpxCollectionData *, class QObject *)
- ?isAutoPlaylist@MpMpxCollectionData@@QAE_NXZ @ 56 NONAME ; bool MpMpxCollectionData::isAutoPlaylist(void)
- ?updatePlaybackState@MpCollectionTBoneListDataModel@@QAEXXZ @ 57 NONAME ; void MpCollectionTBoneListDataModel::updatePlaybackState(void)
- ?setAlbum@MpPlaybackData@@QAE_NABVQString@@@Z @ 58 NONAME ; bool MpPlaybackData::setAlbum(class QString const &)
- ?setCurrentAlbum@MpMpxCollectionData@@QAE_NH@Z @ 59 NONAME ; bool MpMpxCollectionData::setCurrentAlbum(int)
- ?itemId@MpMpxCollectionData@@QAEHH@Z @ 60 NONAME ; int MpMpxCollectionData::itemId(int)
- ?trUtf8@MpSongData@@SA?AVQString@@PBD0H@Z @ 61 NONAME ; class QString MpSongData::trUtf8(char const *, char const *, int)
- ?artist@MpPlaybackData@@QBEABVQString@@XZ @ 62 NONAME ; class QString const & MpPlaybackData::artist(void) const
- ?setContext@MpCollectionDataModel@@QAEXW4TCollectionContext@@@Z @ 63 NONAME ; void MpCollectionDataModel::setContext(enum TCollectionContext)
- ?sampleRate@MpSongData@@QBE?AVQString@@XZ @ 64 NONAME ; class QString MpSongData::sampleRate(void) const
- ?playbackStateChanged@MpPlaybackData@@IAEXXZ @ 65 NONAME ; void MpPlaybackData::playbackStateChanged(void)
- ?copyright@MpSongData@@QBE?AVQString@@XZ @ 66 NONAME ; class QString MpSongData::copyright(void) const
- ?duration@MpPlaybackData@@QBEHXZ @ 67 NONAME ; int MpPlaybackData::duration(void) const
- ?genre@MpSongData@@QBE?AVQString@@XZ @ 68 NONAME ; class QString MpSongData::genre(void) const
- ??0MpCollectionTBoneListDataModel@@QAE@PAVMpMpxCollectionData@@PAVMpPlaybackData@@PAVQObject@@@Z @ 69 NONAME ; MpCollectionTBoneListDataModel::MpCollectionTBoneListDataModel(class MpMpxCollectionData *, class MpPlaybackData *, class QObject *)
- ?getStaticMetaObject@MpCollectionDataModel@@SAABUQMetaObject@@XZ @ 70 NONAME ; struct QMetaObject const & MpCollectionDataModel::getStaticMetaObject(void)
- ?setDuration@MpPlaybackData@@QAEXH@Z @ 71 NONAME ; void MpPlaybackData::setDuration(int)
- ?albumDataChanged@MpMpxCollectionData@@IAEXXZ @ 72 NONAME ; void MpMpxCollectionData::albumDataChanged(void)
- ??0MpSongData@@QAE@PAVQObject@@@Z @ 73 NONAME ; MpSongData::MpSongData(class QObject *)
- ?uri@MpPlaybackData@@QBEABVQString@@XZ @ 74 NONAME ; class QString const & MpPlaybackData::uri(void) const
- ?albumArtReady@MpSongData@@IAEXXZ @ 75 NONAME ; void MpSongData::albumArtReady(void)
- ?rowCount@MpCollectionDataModel@@UBEHABVQModelIndex@@@Z @ 76 NONAME ; int MpCollectionDataModel::rowCount(class QModelIndex const &) const
- ?trUtf8@MpPlaybackData@@SA?AVQString@@PBD0H@Z @ 77 NONAME ; class QString MpPlaybackData::trUtf8(char const *, char const *, int)
- ?thumbnailReady@MpPlaybackData@@QAEXABVQPixmap@@PAXHH@Z @ 78 NONAME ; void MpPlaybackData::thumbnailReady(class QPixmap const &, void *, int, int)
- ?staticMetaObject@MpMpxCollectionData@@2UQMetaObject@@B @ 79 NONAME ; struct QMetaObject const MpMpxCollectionData::staticMetaObject
- ?tr@MpPlaybackData@@SA?AVQString@@PBD0H@Z @ 80 NONAME ; class QString MpPlaybackData::tr(char const *, char const *, int)
- ?modified@MpSongData@@QBE?AVQString@@XZ @ 81 NONAME ; class QString MpSongData::modified(void) const
- ?setRealAudio@MpPlaybackData@@QAE_N_N@Z @ 82 NONAME ; bool MpPlaybackData::setRealAudio(bool)
- ?qt_metacall@MpMpxCollectionData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 83 NONAME ; int MpMpxCollectionData::qt_metacall(enum QMetaObject::Call, int, void * *)
- ?albumArtReady@MpPlaybackData@@IAEXXZ @ 84 NONAME ; void MpPlaybackData::albumArtReady(void)
- ?album@MpPlaybackData@@QBEABVQString@@XZ @ 85 NONAME ; class QString const & MpPlaybackData::album(void) const
- ?albumSongsCount@MpMpxCollectionData@@QBEHXZ @ 86 NONAME ; int MpMpxCollectionData::albumSongsCount(void) const
- ?count@MpMpxCollectionData@@QBEHXZ @ 87 NONAME ; int MpMpxCollectionData::count(void) const
- ??1MpSongData@@UAE@XZ @ 88 NONAME ; MpSongData::~MpSongData(void)
- ?dataReloaded@MpCollectionDataModel@@IAEXXZ @ 89 NONAME ; void MpCollectionDataModel::dataReloaded(void)
- ?testCachedItem@MpMpxCollectionData@@QAE_NH@Z @ 90 NONAME ; bool MpMpxCollectionData::testCachedItem(int)
- ?setMpxMedia@MpSongData@@QAEXABVCMPXMedia@@@Z @ 91 NONAME ; void MpSongData::setMpxMedia(class CMPXMedia const &)
- ?tr@MpCollectionDataModel@@SA?AVQString@@PBD0@Z @ 92 NONAME ; class QString MpCollectionDataModel::tr(char const *, char const *)
- ?setTitle@MpPlaybackData@@QAE_NABVQString@@@Z @ 93 NONAME ; bool MpPlaybackData::setTitle(class QString const &)
- ?getStaticMetaObject@MpCollectionTBoneListDataModel@@SAABUQMetaObject@@XZ @ 94 NONAME ; struct QMetaObject const & MpCollectionTBoneListDataModel::getStaticMetaObject(void)
- ?trUtf8@MpCollectionDataModel@@SA?AVQString@@PBD0@Z @ 95 NONAME ; class QString MpCollectionDataModel::trUtf8(char const *, char const *)
- ?musicURL@MpSongData@@QBE?AVQString@@XZ @ 96 NONAME ; class QString MpSongData::musicURL(void) const
- ?realAudio@MpPlaybackData@@QAE_NXZ @ 97 NONAME ; bool MpPlaybackData::realAudio(void)
- ?staticMetaObject@MpCollectionDataModel@@2UQMetaObject@@B @ 98 NONAME ; struct QMetaObject const MpCollectionDataModel::staticMetaObject
- ?rowCount@MpCollectionTBoneListDataModel@@UBEHABVQModelIndex@@@Z @ 99 NONAME ; int MpCollectionTBoneListDataModel::rowCount(class QModelIndex const &) const
- ?dataChanged@MpMpxCollectionData@@IAEXXZ @ 100 NONAME ; void MpMpxCollectionData::dataChanged(void)
- ?trUtf8@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0H@Z @ 101 NONAME ; class QString MpCollectionTBoneListDataModel::trUtf8(char const *, char const *, int)
- ?getStaticMetaObject@MpSongData@@SAABUQMetaObject@@XZ @ 102 NONAME ; struct QMetaObject const & MpSongData::getStaticMetaObject(void)
- ?setItemVisibility@MpCollectionDataModel@@QAEXABVQModelIndex@@_N@Z @ 103 NONAME ; void MpCollectionDataModel::setItemVisibility(class QModelIndex const &, bool)
- ?songDetailInfoChanged@MpSongData@@IAEXXZ @ 104 NONAME ; void MpSongData::songDetailInfoChanged(void)
- ?mimeTypes@MpCollectionDataModel@@UBE?AVQStringList@@XZ @ 105 NONAME ; class QStringList MpCollectionDataModel::mimeTypes(void) const
- ?albumArt@MpSongData@@QBEXAAVHbIcon@@@Z @ 106 NONAME ; void MpSongData::albumArt(class HbIcon &) const
- ?isDrmProtected@MpSongData@@QBE_NXZ @ 107 NONAME ; bool MpSongData::isDrmProtected(void) const
- ?collectionTitle@MpMpxCollectionData@@QBE?AVQString@@XZ @ 108 NONAME ; class QString MpMpxCollectionData::collectionTitle(void) const
- ?albumTrack@MpSongData@@QBE?AVQString@@XZ @ 109 NONAME ; class QString MpSongData::albumTrack(void) const
- ?tr@MpPlaybackData@@SA?AVQString@@PBD0@Z @ 110 NONAME ; class QString MpPlaybackData::tr(char const *, char const *)
- ?qt_metacall@MpPlaybackData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 111 NONAME ; int MpPlaybackData::qt_metacall(enum QMetaObject::Call, int, void * *)
- ?albumSongData@MpMpxCollectionData@@QBE?AVQString@@HW4DataType@1@@Z @ 112 NONAME ; class QString MpMpxCollectionData::albumSongData(int, enum MpMpxCollectionData::DataType) const
- ?playbackInfoChanged@MpSongData@@IAEXXZ @ 113 NONAME ; void MpSongData::playbackInfoChanged(void)
- ?insertCachedItem@MpMpxCollectionData@@QAEXH@Z @ 114 NONAME ; void MpMpxCollectionData::insertCachedItem(int)
- ?setAlbumContent@MpMpxCollectionData@@QAEXABVCMPXMedia@@@Z @ 115 NONAME ; void MpMpxCollectionData::setAlbumContent(class CMPXMedia const &)
- ??0MpMpxCollectionData@@QAE@PAVQObject@@@Z @ 116 NONAME ; MpMpxCollectionData::MpMpxCollectionData(class QObject *)
- ?setArtist@MpPlaybackData@@QAE_NABVQString@@@Z @ 117 NONAME ; bool MpPlaybackData::setArtist(class QString const &)
- ?trUtf8@MpSongData@@SA?AVQString@@PBD0@Z @ 118 NONAME ; class QString MpSongData::trUtf8(char const *, char const *)
- ?albumId@MpPlaybackData@@QAEHXZ @ 119 NONAME ; int MpPlaybackData::albumId(void)
- ??1MpMpxCollectionData@@UAE@XZ @ 120 NONAME ; MpMpxCollectionData::~MpMpxCollectionData(void)
- ??0MpPlaybackData@@QAE@PAVQObject@@@Z @ 121 NONAME ; MpPlaybackData::MpPlaybackData(class QObject *)
- ?trUtf8@MpCollectionDataModel@@SA?AVQString@@PBD0H@Z @ 122 NONAME ; class QString MpCollectionDataModel::trUtf8(char const *, char const *, int)
- ?metaObject@MpMpxCollectionData@@UBEPBUQMetaObject@@XZ @ 123 NONAME ; struct QMetaObject const * MpMpxCollectionData::metaObject(void) const
- ?qt_metacast@MpMpxCollectionData@@UAEPAXPBD@Z @ 124 NONAME ; void * MpMpxCollectionData::qt_metacast(char const *)
- ?qt_metacast@MpPlaybackData@@UAEPAXPBD@Z @ 125 NONAME ; void * MpPlaybackData::qt_metacast(char const *)
- ?size@MpSongData@@QBE?AVQString@@XZ @ 126 NONAME ; class QString MpSongData::size(void) const
- ??_EMpSongData@@UAE@I@Z @ 127 NONAME ; MpSongData::~MpSongData(unsigned int)
- ?containerId@MpMpxCollectionData@@QAEHXZ @ 128 NONAME ; int MpMpxCollectionData::containerId(void)
- ?containerMedia@MpMpxCollectionData@@QAEABVCMPXMedia@@XZ @ 129 NONAME ; class CMPXMedia const & MpMpxCollectionData::containerMedia(void)
- ??_EMpCollectionTBoneListDataModel@@UAE@I@Z @ 130 NONAME ; MpCollectionTBoneListDataModel::~MpCollectionTBoneListDataModel(unsigned int)
- ??1MpCollectionDataModel@@UAE@XZ @ 131 NONAME ; MpCollectionDataModel::~MpCollectionDataModel(void)
- ?tr@MpCollectionDataModel@@SA?AVQString@@PBD0H@Z @ 132 NONAME ; class QString MpCollectionDataModel::tr(char const *, char const *, int)
- ?reloadData@MpCollectionDataModel@@QAEXXZ @ 133 NONAME ; void MpCollectionDataModel::reloadData(void)
- ??1MpCollectionTBoneListDataModel@@UAE@XZ @ 134 NONAME ; MpCollectionTBoneListDataModel::~MpCollectionTBoneListDataModel(void)
- ?qt_metacall@MpSongData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 135 NONAME ; int MpSongData::qt_metacall(enum QMetaObject::Call, int, void * *)
- ?reservedLength@MpSongData@@QBEHXZ @ 136 NONAME ; int MpSongData::reservedLength(void) const
- ?collectionData@MpCollectionDataModel@@QAEPAVMpMpxCollectionData@@XZ @ 137 NONAME ; class MpMpxCollectionData * MpCollectionDataModel::collectionData(void)
- ?trUtf8@MpMpxCollectionData@@SA?AVQString@@PBD0@Z @ 138 NONAME ; class QString MpMpxCollectionData::trUtf8(char const *, char const *)
- ?setPosition@MpPlaybackData@@QAEXH@Z @ 139 NONAME ; void MpPlaybackData::setPosition(int)
- ??1MpPlaybackData@@UAE@XZ @ 140 NONAME ; MpPlaybackData::~MpPlaybackData(void)
- ?tr@MpSongData@@SA?AVQString@@PBD0@Z @ 141 NONAME ; class QString MpSongData::tr(char const *, char const *)
- ?refreshAlbumSongs@MpMpxCollectionData@@IAEXXZ @ 142 NONAME ; void MpMpxCollectionData::refreshAlbumSongs(void)
- ?setPlaybackState@MpPlaybackData@@QAEXW4SimplifiedState@1@@Z @ 143 NONAME ; void MpPlaybackData::setPlaybackState(enum MpPlaybackData::SimplifiedState)
- ?trUtf8@MpPlaybackData@@SA?AVQString@@PBD0@Z @ 144 NONAME ; class QString MpPlaybackData::trUtf8(char const *, char const *)
- ?albumDataChanged@MpCollectionTBoneListDataModel@@IAEXXZ @ 145 NONAME ; void MpCollectionTBoneListDataModel::albumDataChanged(void)
- ?comment@MpSongData@@QBE?AVQString@@XZ @ 146 NONAME ; class QString MpSongData::comment(void) const
- ?year@MpSongData@@QBE?AVQString@@XZ @ 147 NONAME ; class QString MpSongData::year(void) const
- ?data@MpCollectionTBoneListDataModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 148 NONAME ; class QVariant MpCollectionTBoneListDataModel::data(class QModelIndex const &, int) const
- ?albumSongIndex@MpMpxCollectionData@@QAEHH@Z @ 149 NONAME ; int MpMpxCollectionData::albumSongIndex(int)
- ?getStaticMetaObject@MpPlaybackData@@SAABUQMetaObject@@XZ @ 150 NONAME ; struct QMetaObject const & MpPlaybackData::getStaticMetaObject(void)
- ?composer@MpSongData@@QBE?AVQString@@XZ @ 151 NONAME ; class QString MpSongData::composer(void) const
- ?albumArt@MpPlaybackData@@QBEXAAVHbIcon@@@Z @ 152 NONAME ; void MpPlaybackData::albumArt(class HbIcon &) const
- ?commitPlaybackInfo@MpPlaybackData@@QAEXXZ @ 153 NONAME ; void MpPlaybackData::commitPlaybackInfo(void)
- ?removeRows@MpCollectionDataModel@@UAE_NHHABVQModelIndex@@@Z @ 154 NONAME ; bool MpCollectionDataModel::removeRows(int, int, class QModelIndex const &)
- ?albumSongId@MpMpxCollectionData@@QAEHH@Z @ 155 NONAME ; int MpMpxCollectionData::albumSongId(int)
- ?thumbnailReady@MpSongData@@QAEXVQPixmap@@PAXHH@Z @ 156 NONAME ; void MpSongData::thumbnailReady(class QPixmap, void *, int, int)
- ?id@MpPlaybackData@@QAEHXZ @ 157 NONAME ; int MpPlaybackData::id(void)
- ?album@MpSongData@@QBE?AVQString@@XZ @ 158 NONAME ; class QString MpSongData::album(void) const
- ?albumArtBase64@MpSongData@@QBE?AVQString@@XZ @ 159 NONAME ; class QString MpSongData::albumArtBase64(void) const
- ?playbackInfoChanged@MpPlaybackData@@IAEXXZ @ 160 NONAME ; void MpPlaybackData::playbackInfoChanged(void)
- ?itemData@MpMpxCollectionData@@QBE?AVQString@@HW4DataType@1@@Z @ 161 NONAME ; class QString MpMpxCollectionData::itemData(int, enum MpMpxCollectionData::DataType) const
- ?link@MpSongData@@QBE?AVQString@@XZ @ 162 NONAME ; class QString MpSongData::link(void) const
- ?trUtf8@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0@Z @ 163 NONAME ; class QString MpCollectionTBoneListDataModel::trUtf8(char const *, char const *)
- ?updateSong@MpCollectionTBoneListDataModel@@QAEXXZ @ 164 NONAME ; void MpCollectionTBoneListDataModel::updateSong(void)
- ?setId@MpPlaybackData@@QAE_NH@Z @ 165 NONAME ; bool MpPlaybackData::setId(int)
- ?metaObject@MpCollectionDataModel@@UBEPBUQMetaObject@@XZ @ 166 NONAME ; struct QMetaObject const * MpCollectionDataModel::metaObject(void) const
- ?metaObject@MpSongData@@UBEPBUQMetaObject@@XZ @ 167 NONAME ; struct QMetaObject const * MpSongData::metaObject(void) const
- ?setLink@MpSongData@@QAEXABVQString@@@Z @ 168 NONAME ; void MpSongData::setLink(class QString const &)
+ ?setCorrupted@MpPlaybackData@@QAEXH@Z @ 2 NONAME ; void MpPlaybackData::setCorrupted(int)
+ ?dropMimeData@MpCollectionDataModel@@UAE_NPBVQMimeData@@W4DropAction@Qt@@HHABVQModelIndex@@@Z @ 3 NONAME ; bool MpCollectionDataModel::dropMimeData(class QMimeData const *, enum Qt::DropAction, int, int, class QModelIndex const &)
+ ?currentAlbumIndex@MpMpxCollectionData@@QBEHXZ @ 4 NONAME ; int MpMpxCollectionData::currentAlbumIndex(void) const
+ ?refreshModel@MpCollectionDataModel@@QAEXXZ @ 5 NONAME ; void MpCollectionDataModel::refreshModel(void)
+ ?contextChanged@MpMpxCollectionData@@IAEXW4TCollectionContext@@@Z @ 6 NONAME ; void MpMpxCollectionData::contextChanged(enum TCollectionContext)
+ ?mimeData@MpCollectionDataModel@@UBEPAVQMimeData@@ABV?$QList@VQModelIndex@@@@@Z @ 7 NONAME ; class QMimeData * MpCollectionDataModel::mimeData(class QList<class QModelIndex> const &) const
+ ?fileName@MpSongData@@QBE?AVQString@@XZ @ 8 NONAME ; class QString MpSongData::fileName(void) const
+ ?trUtf8@MpMpxCollectionData@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString MpMpxCollectionData::trUtf8(char const *, char const *, int)
+ ?tr@MpMpxCollectionData@@SA?AVQString@@PBD0H@Z @ 10 NONAME ; class QString MpMpxCollectionData::tr(char const *, char const *, int)
+ ??_EMpMpxCollectionData@@UAE@I@Z @ 11 NONAME ; MpMpxCollectionData::~MpMpxCollectionData(unsigned int)
+ ?qt_metacast@MpCollectionDataModel@@UAEPAXPBD@Z @ 12 NONAME ; void * MpCollectionDataModel::qt_metacast(char const *)
+ ?updateAlbumArt@MpCollectionDataModel@@QAEXH@Z @ 13 NONAME ; void MpCollectionDataModel::updateAlbumArt(int)
+ ?resetData@MpPlaybackData@@QAEXXZ @ 14 NONAME ; void MpPlaybackData::resetData(void)
+ ??_EMpPlaybackData@@UAE@I@Z @ 15 NONAME ; MpPlaybackData::~MpPlaybackData(unsigned int)
+ ?setLink@MpSongData@@QAEXABVQString@@@Z @ 16 NONAME ; void MpSongData::setLink(class QString const &)
+ ?metaObject@MpPlaybackData@@UBEPBUQMetaObject@@XZ @ 17 NONAME ; struct QMetaObject const * MpPlaybackData::metaObject(void) const
+ ?refreshModel@MpCollectionTBoneListDataModel@@QAEXXZ @ 18 NONAME ; void MpCollectionTBoneListDataModel::refreshModel(void)
+ ?title@MpSongData@@QBE?AVQString@@XZ @ 19 NONAME ; class QString MpSongData::title(void) const
+ ?data@MpCollectionDataModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 20 NONAME ; class QVariant MpCollectionDataModel::data(class QModelIndex const &, int) const
+ ?setAlbumId@MpPlaybackData@@QAE_NH@Z @ 21 NONAME ; bool MpPlaybackData::setAlbumId(int)
+ ?mimeType@MpSongData@@QBE?AVQString@@XZ @ 22 NONAME ; class QString MpSongData::mimeType(void) const
+ ?removeItem@MpMpxCollectionData@@QAEXH@Z @ 23 NONAME ; void MpMpxCollectionData::removeItem(int)
+ ?getStaticMetaObject@MpMpxCollectionData@@SAABUQMetaObject@@XZ @ 24 NONAME ; struct QMetaObject const & MpMpxCollectionData::getStaticMetaObject(void)
+ ?itemCount@MpMpxCollectionData@@QAEHH@Z @ 25 NONAME ; int MpMpxCollectionData::itemCount(int)
+ ?isAutoPlaylist@MpMpxCollectionData@@QAE_NH@Z @ 26 NONAME ; bool MpMpxCollectionData::isAutoPlaylist(int)
+ ?position@MpPlaybackData@@QBEHXZ @ 27 NONAME ; int MpPlaybackData::position(void) const
+ ?setAlbumArtUri@MpPlaybackData@@QAEXABVQString@@@Z @ 28 NONAME ; void MpPlaybackData::setAlbumArtUri(class QString const &)
+ ??_EMpCollectionDataModel@@UAE@I@Z @ 29 NONAME ; MpCollectionDataModel::~MpCollectionDataModel(unsigned int)
+ ?qt_metacast@MpSongData@@UAEPAXPBD@Z @ 30 NONAME ; void * MpSongData::qt_metacast(char const *)
+ ?positionChanged@MpPlaybackData@@IAEXXZ @ 31 NONAME ; void MpPlaybackData::positionChanged(void)
+ ?tr@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0H@Z @ 32 NONAME ; class QString MpCollectionTBoneListDataModel::tr(char const *, char const *, int)
+ ?itemIndex@MpMpxCollectionData@@QAEHH@Z @ 33 NONAME ; int MpMpxCollectionData::itemIndex(int)
+ ?title@MpPlaybackData@@QBEABVQString@@XZ @ 34 NONAME ; class QString const & MpPlaybackData::title(void) const
+ ?hasAlbumSongProperty@MpMpxCollectionData@@QBE_NHW4DataProperty@1@@Z @ 35 NONAME ; bool MpMpxCollectionData::hasAlbumSongProperty(int, enum MpMpxCollectionData::DataProperty) const
+ ?qt_metacall@MpCollectionDataModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 36 NONAME ; int MpCollectionDataModel::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?artist@MpSongData@@QBE?AVQString@@XZ @ 37 NONAME ; class QString MpSongData::artist(void) const
+ ?setMpxMedia@MpMpxCollectionData@@QAEXABVCMPXMedia@@_N@Z @ 38 NONAME ; void MpMpxCollectionData::setMpxMedia(class CMPXMedia const &, bool)
+ ?staticMetaObject@MpSongData@@2UQMetaObject@@B @ 39 NONAME ; struct QMetaObject const MpSongData::staticMetaObject
+ ?playbackState@MpPlaybackData@@QBE?AW4SimplifiedState@1@XZ @ 40 NONAME ; enum MpPlaybackData::SimplifiedState MpPlaybackData::playbackState(void) const
+ ?tr@MpSongData@@SA?AVQString@@PBD0H@Z @ 41 NONAME ; class QString MpSongData::tr(char const *, char const *, int)
+ ?context@MpMpxCollectionData@@QBE?AW4TCollectionContext@@XZ @ 42 NONAME ; enum TCollectionContext MpMpxCollectionData::context(void) const
+ ?supportedDropActions@MpCollectionDataModel@@UBE?AV?$QFlags@W4DropAction@Qt@@@@XZ @ 43 NONAME ; class QFlags<enum Qt::DropAction> MpCollectionDataModel::supportedDropActions(void) const
+ ?setContext@MpMpxCollectionData@@QAEXW4TCollectionContext@@@Z @ 44 NONAME ; void MpMpxCollectionData::setContext(enum TCollectionContext)
+ ?durationChanged@MpPlaybackData@@IAEXXZ @ 45 NONAME ; void MpPlaybackData::durationChanged(void)
+ ?staticMetaObject@MpPlaybackData@@2UQMetaObject@@B @ 46 NONAME ; struct QMetaObject const MpPlaybackData::staticMetaObject
+ ?staticMetaObject@MpCollectionTBoneListDataModel@@2UQMetaObject@@B @ 47 NONAME ; struct QMetaObject const MpCollectionTBoneListDataModel::staticMetaObject
+ ?orderChanged@MpCollectionDataModel@@IAEXHHHH@Z @ 48 NONAME ; void MpCollectionDataModel::orderChanged(int, int, int, int)
+ ?metaObject@MpCollectionTBoneListDataModel@@UBEPBUQMetaObject@@XZ @ 49 NONAME ; struct QMetaObject const * MpCollectionTBoneListDataModel::metaObject(void) const
+ ?tr@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0@Z @ 50 NONAME ; class QString MpCollectionTBoneListDataModel::tr(char const *, char const *)
+ ?bitRate@MpSongData@@QBE?AVQString@@XZ @ 51 NONAME ; class QString MpSongData::bitRate(void) const
+ ?albumDataAvailable@MpCollectionTBoneListDataModel@@IAEXXZ @ 52 NONAME ; void MpCollectionTBoneListDataModel::albumDataAvailable(void)
+ ?setUri@MpPlaybackData@@QAE_NABVQString@@@Z @ 53 NONAME ; bool MpPlaybackData::setUri(class QString const &)
+ ?qt_metacast@MpCollectionTBoneListDataModel@@UAEPAXPBD@Z @ 54 NONAME ; void * MpCollectionTBoneListDataModel::qt_metacast(char const *)
+ ?removeAlbumArtFile@MpSongData@@QBEXXZ @ 55 NONAME ; void MpSongData::removeAlbumArtFile(void) const
+ ?duration@MpSongData@@QBE?AVQString@@XZ @ 56 NONAME ; class QString MpSongData::duration(void) const
+ ?qt_metacall@MpCollectionTBoneListDataModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 57 NONAME ; int MpCollectionTBoneListDataModel::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?isAutoPlaylist@MpMpxCollectionData@@QAE_NXZ @ 58 NONAME ; bool MpMpxCollectionData::isAutoPlaylist(void)
+ ?updatePlaybackState@MpCollectionTBoneListDataModel@@QAEXXZ @ 59 NONAME ; void MpCollectionTBoneListDataModel::updatePlaybackState(void)
+ ?setReloadAlbumContent@MpMpxCollectionData@@QAEX_N@Z @ 60 NONAME ; void MpMpxCollectionData::setReloadAlbumContent(bool)
+ ?setAlbum@MpPlaybackData@@QAE_NABVQString@@@Z @ 61 NONAME ; bool MpPlaybackData::setAlbum(class QString const &)
+ ?setCurrentAlbum@MpMpxCollectionData@@QAE_NH@Z @ 62 NONAME ; bool MpMpxCollectionData::setCurrentAlbum(int)
+ ?itemId@MpMpxCollectionData@@QAEHH@Z @ 63 NONAME ; int MpMpxCollectionData::itemId(int)
+ ?trUtf8@MpSongData@@SA?AVQString@@PBD0H@Z @ 64 NONAME ; class QString MpSongData::trUtf8(char const *, char const *, int)
+ ?artist@MpPlaybackData@@QBEABVQString@@XZ @ 65 NONAME ; class QString const & MpPlaybackData::artist(void) const
+ ?setContext@MpCollectionDataModel@@QAEXW4TCollectionContext@@@Z @ 66 NONAME ; void MpCollectionDataModel::setContext(enum TCollectionContext)
+ ?sampleRate@MpSongData@@QBE?AVQString@@XZ @ 67 NONAME ; class QString MpSongData::sampleRate(void) const
+ ?playbackStateChanged@MpPlaybackData@@IAEXXZ @ 68 NONAME ; void MpPlaybackData::playbackStateChanged(void)
+ ?copyright@MpSongData@@QBE?AVQString@@XZ @ 69 NONAME ; class QString MpSongData::copyright(void) const
+ ?duration@MpPlaybackData@@QBEHXZ @ 70 NONAME ; int MpPlaybackData::duration(void) const
+ ?genre@MpSongData@@QBE?AVQString@@XZ @ 71 NONAME ; class QString MpSongData::genre(void) const
+ ??0MpCollectionTBoneListDataModel@@QAE@PAVMpMpxCollectionData@@PAVMpPlaybackData@@PAVQObject@@@Z @ 72 NONAME ; MpCollectionTBoneListDataModel::MpCollectionTBoneListDataModel(class MpMpxCollectionData *, class MpPlaybackData *, class QObject *)
+ ?getStaticMetaObject@MpCollectionDataModel@@SAABUQMetaObject@@XZ @ 73 NONAME ; struct QMetaObject const & MpCollectionDataModel::getStaticMetaObject(void)
+ ?setDuration@MpPlaybackData@@QAEXH@Z @ 74 NONAME ; void MpPlaybackData::setDuration(int)
+ ?albumDataChanged@MpMpxCollectionData@@IAEXXZ @ 75 NONAME ; void MpMpxCollectionData::albumDataChanged(void)
+ ??0MpSongData@@QAE@PAVQObject@@@Z @ 76 NONAME ; MpSongData::MpSongData(class QObject *)
+ ?uri@MpPlaybackData@@QBEABVQString@@XZ @ 77 NONAME ; class QString const & MpPlaybackData::uri(void) const
+ ?albumArtReady@MpSongData@@IAEXXZ @ 78 NONAME ; void MpSongData::albumArtReady(void)
+ ?rowCount@MpCollectionDataModel@@UBEHABVQModelIndex@@@Z @ 79 NONAME ; int MpCollectionDataModel::rowCount(class QModelIndex const &) const
+ ?fileCorrupted@MpPlaybackData@@IAEXH@Z @ 80 NONAME ; void MpPlaybackData::fileCorrupted(int)
+ ?trUtf8@MpPlaybackData@@SA?AVQString@@PBD0H@Z @ 81 NONAME ; class QString MpPlaybackData::trUtf8(char const *, char const *, int)
+ ?thumbnailReady@MpPlaybackData@@QAEXABVQPixmap@@PAXHH@Z @ 82 NONAME ; void MpPlaybackData::thumbnailReady(class QPixmap const &, void *, int, int)
+ ?staticMetaObject@MpMpxCollectionData@@2UQMetaObject@@B @ 83 NONAME ; struct QMetaObject const MpMpxCollectionData::staticMetaObject
+ ?tr@MpPlaybackData@@SA?AVQString@@PBD0H@Z @ 84 NONAME ; class QString MpPlaybackData::tr(char const *, char const *, int)
+ ?modified@MpSongData@@QBE?AVQString@@XZ @ 85 NONAME ; class QString MpSongData::modified(void) const
+ ?setRealAudio@MpPlaybackData@@QAE_N_N@Z @ 86 NONAME ; bool MpPlaybackData::setRealAudio(bool)
+ ?qt_metacall@MpMpxCollectionData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 87 NONAME ; int MpMpxCollectionData::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?albumArtReady@MpPlaybackData@@IAEXXZ @ 88 NONAME ; void MpPlaybackData::albumArtReady(void)
+ ?album@MpPlaybackData@@QBEABVQString@@XZ @ 89 NONAME ; class QString const & MpPlaybackData::album(void) const
+ ?albumSongsCount@MpMpxCollectionData@@QBEHXZ @ 90 NONAME ; int MpMpxCollectionData::albumSongsCount(void) const
+ ??0MpCollectionDataModel@@QAE@PAVMpMpxCollectionData@@PAVMpPlaybackData@@PAVQObject@@@Z @ 91 NONAME ; MpCollectionDataModel::MpCollectionDataModel(class MpMpxCollectionData *, class MpPlaybackData *, class QObject *)
+ ?count@MpMpxCollectionData@@QBEHXZ @ 92 NONAME ; int MpMpxCollectionData::count(void) const
+ ??1MpSongData@@UAE@XZ @ 93 NONAME ; MpSongData::~MpSongData(void)
+ ?dataReloaded@MpCollectionDataModel@@IAEXXZ @ 94 NONAME ; void MpCollectionDataModel::dataReloaded(void)
+ ?hasItemProperty@MpMpxCollectionData@@QBE_NHW4DataProperty@1@@Z @ 95 NONAME ; bool MpMpxCollectionData::hasItemProperty(int, enum MpMpxCollectionData::DataProperty) const
+ ?testCachedItem@MpMpxCollectionData@@QAE_NH@Z @ 96 NONAME ; bool MpMpxCollectionData::testCachedItem(int)
+ ?setMpxMedia@MpSongData@@QAEXABVCMPXMedia@@@Z @ 97 NONAME ; void MpSongData::setMpxMedia(class CMPXMedia const &)
+ ?tr@MpCollectionDataModel@@SA?AVQString@@PBD0@Z @ 98 NONAME ; class QString MpCollectionDataModel::tr(char const *, char const *)
+ ?setTitle@MpPlaybackData@@QAE_NABVQString@@@Z @ 99 NONAME ; bool MpPlaybackData::setTitle(class QString const &)
+ ?getStaticMetaObject@MpCollectionTBoneListDataModel@@SAABUQMetaObject@@XZ @ 100 NONAME ; struct QMetaObject const & MpCollectionTBoneListDataModel::getStaticMetaObject(void)
+ ?trUtf8@MpCollectionDataModel@@SA?AVQString@@PBD0@Z @ 101 NONAME ; class QString MpCollectionDataModel::trUtf8(char const *, char const *)
+ ?musicURL@MpSongData@@QBE?AVQString@@XZ @ 102 NONAME ; class QString MpSongData::musicURL(void) const
+ ?realAudio@MpPlaybackData@@QAE_NXZ @ 103 NONAME ; bool MpPlaybackData::realAudio(void)
+ ?staticMetaObject@MpCollectionDataModel@@2UQMetaObject@@B @ 104 NONAME ; struct QMetaObject const MpCollectionDataModel::staticMetaObject
+ ?rowCount@MpCollectionTBoneListDataModel@@UBEHABVQModelIndex@@@Z @ 105 NONAME ; int MpCollectionTBoneListDataModel::rowCount(class QModelIndex const &) const
+ ?setCorruptValue@MpMpxCollectionData@@QAEXVQModelIndex@@_N@Z @ 106 NONAME ; void MpMpxCollectionData::setCorruptValue(class QModelIndex, bool)
+ ?dataChanged@MpMpxCollectionData@@IAEXXZ @ 107 NONAME ; void MpMpxCollectionData::dataChanged(void)
+ ?trUtf8@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0H@Z @ 108 NONAME ; class QString MpCollectionTBoneListDataModel::trUtf8(char const *, char const *, int)
+ ?getStaticMetaObject@MpSongData@@SAABUQMetaObject@@XZ @ 109 NONAME ; struct QMetaObject const & MpSongData::getStaticMetaObject(void)
+ ?setItemVisibility@MpCollectionDataModel@@QAEXABVQModelIndex@@_N@Z @ 110 NONAME ; void MpCollectionDataModel::setItemVisibility(class QModelIndex const &, bool)
+ ?songDetailInfoChanged@MpSongData@@IAEXXZ @ 111 NONAME ; void MpSongData::songDetailInfoChanged(void)
+ ?mimeTypes@MpCollectionDataModel@@UBE?AVQStringList@@XZ @ 112 NONAME ; class QStringList MpCollectionDataModel::mimeTypes(void) const
+ ?albumArt@MpSongData@@QBEXAAVHbIcon@@@Z @ 113 NONAME ; void MpSongData::albumArt(class HbIcon &) const
+ ?isDrmProtected@MpSongData@@QBE_NXZ @ 114 NONAME ; bool MpSongData::isDrmProtected(void) const
+ ?collectionTitle@MpMpxCollectionData@@QBE?AVQString@@XZ @ 115 NONAME ; class QString MpMpxCollectionData::collectionTitle(void) const
+ ?albumTrack@MpSongData@@QBE?AVQString@@XZ @ 116 NONAME ; class QString MpSongData::albumTrack(void) const
+ ?tr@MpPlaybackData@@SA?AVQString@@PBD0@Z @ 117 NONAME ; class QString MpPlaybackData::tr(char const *, char const *)
+ ?qt_metacall@MpPlaybackData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 118 NONAME ; int MpPlaybackData::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?albumSongData@MpMpxCollectionData@@QBE?AVQString@@HW4DataType@1@@Z @ 119 NONAME ; class QString MpMpxCollectionData::albumSongData(int, enum MpMpxCollectionData::DataType) const
+ ?playbackInfoChanged@MpSongData@@IAEXXZ @ 120 NONAME ; void MpSongData::playbackInfoChanged(void)
+ ?insertCachedItem@MpMpxCollectionData@@QAEXH@Z @ 121 NONAME ; void MpMpxCollectionData::insertCachedItem(int)
+ ?setAlbumContent@MpMpxCollectionData@@QAEXABVCMPXMedia@@@Z @ 122 NONAME ; void MpMpxCollectionData::setAlbumContent(class CMPXMedia const &)
+ ?enablePlaybackIndicatorEnable@MpCollectionTBoneListDataModel@@QAEX_N@Z @ 123 NONAME ; void MpCollectionTBoneListDataModel::enablePlaybackIndicatorEnable(bool)
+ ??0MpMpxCollectionData@@QAE@PAVQObject@@@Z @ 124 NONAME ; MpMpxCollectionData::MpMpxCollectionData(class QObject *)
+ ?setArtist@MpPlaybackData@@QAE_NABVQString@@@Z @ 125 NONAME ; bool MpPlaybackData::setArtist(class QString const &)
+ ?trUtf8@MpSongData@@SA?AVQString@@PBD0@Z @ 126 NONAME ; class QString MpSongData::trUtf8(char const *, char const *)
+ ?fileCorrupted@MpCollectionTBoneListDataModel@@QAEXH@Z @ 127 NONAME ; void MpCollectionTBoneListDataModel::fileCorrupted(int)
+ ?albumId@MpPlaybackData@@QAEHXZ @ 128 NONAME ; int MpPlaybackData::albumId(void)
+ ??1MpMpxCollectionData@@UAE@XZ @ 129 NONAME ; MpMpxCollectionData::~MpMpxCollectionData(void)
+ ??0MpPlaybackData@@QAE@PAVQObject@@@Z @ 130 NONAME ; MpPlaybackData::MpPlaybackData(class QObject *)
+ ?trUtf8@MpCollectionDataModel@@SA?AVQString@@PBD0H@Z @ 131 NONAME ; class QString MpCollectionDataModel::trUtf8(char const *, char const *, int)
+ ?metaObject@MpMpxCollectionData@@UBEPBUQMetaObject@@XZ @ 132 NONAME ; struct QMetaObject const * MpMpxCollectionData::metaObject(void) const
+ ?qt_metacast@MpMpxCollectionData@@UAEPAXPBD@Z @ 133 NONAME ; void * MpMpxCollectionData::qt_metacast(char const *)
+ ?qt_metacast@MpPlaybackData@@UAEPAXPBD@Z @ 134 NONAME ; void * MpPlaybackData::qt_metacast(char const *)
+ ?size@MpSongData@@QBE?AVQString@@XZ @ 135 NONAME ; class QString MpSongData::size(void) const
+ ??_EMpSongData@@UAE@I@Z @ 136 NONAME ; MpSongData::~MpSongData(unsigned int)
+ ?containerId@MpMpxCollectionData@@QAEHXZ @ 137 NONAME ; int MpMpxCollectionData::containerId(void)
+ ?containerMedia@MpMpxCollectionData@@QAEABVCMPXMedia@@XZ @ 138 NONAME ; class CMPXMedia const & MpMpxCollectionData::containerMedia(void)
+ ??_EMpCollectionTBoneListDataModel@@UAE@I@Z @ 139 NONAME ; MpCollectionTBoneListDataModel::~MpCollectionTBoneListDataModel(unsigned int)
+ ??1MpCollectionDataModel@@UAE@XZ @ 140 NONAME ; MpCollectionDataModel::~MpCollectionDataModel(void)
+ ?fileCorrupted@MpCollectionDataModel@@QAEXH@Z @ 141 NONAME ; void MpCollectionDataModel::fileCorrupted(int)
+ ?tr@MpCollectionDataModel@@SA?AVQString@@PBD0H@Z @ 142 NONAME ; class QString MpCollectionDataModel::tr(char const *, char const *, int)
+ ?reloadData@MpCollectionDataModel@@QAEXXZ @ 143 NONAME ; void MpCollectionDataModel::reloadData(void)
+ ??1MpCollectionTBoneListDataModel@@UAE@XZ @ 144 NONAME ; MpCollectionTBoneListDataModel::~MpCollectionTBoneListDataModel(void)
+ ?qt_metacall@MpSongData@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 145 NONAME ; int MpSongData::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?reservedLength@MpSongData@@QBEHXZ @ 146 NONAME ; int MpSongData::reservedLength(void) const
+ ?collectionData@MpCollectionDataModel@@QAEPAVMpMpxCollectionData@@XZ @ 147 NONAME ; class MpMpxCollectionData * MpCollectionDataModel::collectionData(void)
+ ?trUtf8@MpMpxCollectionData@@SA?AVQString@@PBD0@Z @ 148 NONAME ; class QString MpMpxCollectionData::trUtf8(char const *, char const *)
+ ?setPosition@MpPlaybackData@@QAEXH@Z @ 149 NONAME ; void MpPlaybackData::setPosition(int)
+ ??1MpPlaybackData@@UAE@XZ @ 150 NONAME ; MpPlaybackData::~MpPlaybackData(void)
+ ?tr@MpSongData@@SA?AVQString@@PBD0@Z @ 151 NONAME ; class QString MpSongData::tr(char const *, char const *)
+ ?setPlaybackState@MpPlaybackData@@QAEXW4SimplifiedState@1@@Z @ 152 NONAME ; void MpPlaybackData::setPlaybackState(enum MpPlaybackData::SimplifiedState)
+ ?refreshAlbumSongs@MpMpxCollectionData@@IAEXXZ @ 153 NONAME ; void MpMpxCollectionData::refreshAlbumSongs(void)
+ ?trUtf8@MpPlaybackData@@SA?AVQString@@PBD0@Z @ 154 NONAME ; class QString MpPlaybackData::trUtf8(char const *, char const *)
+ ?albumDataChanged@MpCollectionTBoneListDataModel@@IAEXXZ @ 155 NONAME ; void MpCollectionTBoneListDataModel::albumDataChanged(void)
+ ?comment@MpSongData@@QBE?AVQString@@XZ @ 156 NONAME ; class QString MpSongData::comment(void) const
+ ?year@MpSongData@@QBE?AVQString@@XZ @ 157 NONAME ; class QString MpSongData::year(void) const
+ ?data@MpCollectionTBoneListDataModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 158 NONAME ; class QVariant MpCollectionTBoneListDataModel::data(class QModelIndex const &, int) const
+ ?albumSongIndex@MpMpxCollectionData@@QAEHH@Z @ 159 NONAME ; int MpMpxCollectionData::albumSongIndex(int)
+ ?getStaticMetaObject@MpPlaybackData@@SAABUQMetaObject@@XZ @ 160 NONAME ; struct QMetaObject const & MpPlaybackData::getStaticMetaObject(void)
+ ?composer@MpSongData@@QBE?AVQString@@XZ @ 161 NONAME ; class QString MpSongData::composer(void) const
+ ?albumArt@MpPlaybackData@@QBEXAAVHbIcon@@@Z @ 162 NONAME ; void MpPlaybackData::albumArt(class HbIcon &) const
+ ?commitPlaybackInfo@MpPlaybackData@@QAEXXZ @ 163 NONAME ; void MpPlaybackData::commitPlaybackInfo(void)
+ ?removeRows@MpCollectionDataModel@@UAE_NHHABVQModelIndex@@@Z @ 164 NONAME ; bool MpCollectionDataModel::removeRows(int, int, class QModelIndex const &)
+ ?albumSongId@MpMpxCollectionData@@QAEHH@Z @ 165 NONAME ; int MpMpxCollectionData::albumSongId(int)
+ ?thumbnailReady@MpSongData@@QAEXVQPixmap@@PAXHH@Z @ 166 NONAME ; void MpSongData::thumbnailReady(class QPixmap, void *, int, int)
+ ?songIndex@MpMpxCollectionData@@QAE?AV?$QList@H@@H@Z @ 167 NONAME ; class QList<int> MpMpxCollectionData::songIndex(int)
+ ?album@MpSongData@@QBE?AVQString@@XZ @ 168 NONAME ; class QString MpSongData::album(void) const
+ ?id@MpPlaybackData@@QAEHXZ @ 169 NONAME ; int MpPlaybackData::id(void)
+ ?albumArtBase64@MpSongData@@QBE?AVQString@@XZ @ 170 NONAME ; class QString MpSongData::albumArtBase64(void) const
+ ?playbackInfoChanged@MpPlaybackData@@IAEXXZ @ 171 NONAME ; void MpPlaybackData::playbackInfoChanged(void)
+ ?itemData@MpMpxCollectionData@@QBE?AVQString@@HW4DataType@1@@Z @ 172 NONAME ; class QString MpMpxCollectionData::itemData(int, enum MpMpxCollectionData::DataType) const
+ ?link@MpSongData@@QBE?AVQString@@XZ @ 173 NONAME ; class QString MpSongData::link(void) const
+ ?trUtf8@MpCollectionTBoneListDataModel@@SA?AVQString@@PBD0@Z @ 174 NONAME ; class QString MpCollectionTBoneListDataModel::trUtf8(char const *, char const *)
+ ?updateSong@MpCollectionTBoneListDataModel@@QAEXXZ @ 175 NONAME ; void MpCollectionTBoneListDataModel::updateSong(void)
+ ?setId@MpPlaybackData@@QAE_NH@Z @ 176 NONAME ; bool MpPlaybackData::setId(int)
+ ?metaObject@MpCollectionDataModel@@UBEPBUQMetaObject@@XZ @ 177 NONAME ; struct QMetaObject const * MpCollectionDataModel::metaObject(void) const
+ ?metaObject@MpSongData@@UBEPBUQMetaObject@@XZ @ 178 NONAME ; struct QMetaObject const * MpSongData::metaObject(void) const
+ ?setLayout@MpCollectionDataModel@@QAEXW4TCollectionLayout@@@Z @ 179 NONAME ; void MpCollectionDataModel::setLayout(enum TCollectionLayout)
+ ?dataChanged@MpMpxCollectionData@@IAEXHH@Z @ 180 NONAME ; void MpMpxCollectionData::dataChanged(int, int)
+ ?reloadData@MpCollectionDataModel@@QAEXHH@Z @ 181 NONAME ; void MpCollectionDataModel::reloadData(int, int)
+ ?incrementalOpenUpdate@MpMpxCollectionData@@QAEXXZ @ 182 NONAME ; void MpMpxCollectionData::incrementalOpenUpdate(void)
--- a/mpdata/eabi/mpdatau.def Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/eabi/mpdatau.def Thu Sep 02 20:24:03 2010 +0300
@@ -8,163 +8,177 @@
_ZN10MpSongData19getStaticMetaObjectEv @ 7 NONAME
_ZN10MpSongData19playbackInfoChangedEv @ 8 NONAME
_ZN10MpSongData21songDetailInfoChangedEv @ 9 NONAME
- _ZN10MpSongDataC1EP7QObject @ 10 NONAME
- _ZN10MpSongDataC2EP7QObject @ 11 NONAME
- _ZN10MpSongDataD0Ev @ 12 NONAME
- _ZN10MpSongDataD1Ev @ 13 NONAME
- _ZN10MpSongDataD2Ev @ 14 NONAME
- _ZN14MpPlaybackData10setAlbumIdEi @ 15 NONAME
- _ZN14MpPlaybackData11qt_metacallEN11QMetaObject4CallEiPPv @ 16 NONAME
- _ZN14MpPlaybackData11qt_metacastEPKc @ 17 NONAME
- _ZN14MpPlaybackData11setDurationEi @ 18 NONAME
- _ZN14MpPlaybackData11setPositionEi @ 19 NONAME
- _ZN14MpPlaybackData12setRealAudioEb @ 20 NONAME
- _ZN14MpPlaybackData13albumArtReadyEv @ 21 NONAME
- _ZN14MpPlaybackData14setAlbumArtUriERK7QString @ 22 NONAME
- _ZN14MpPlaybackData14thumbnailReadyERK7QPixmapPvii @ 23 NONAME
- _ZN14MpPlaybackData15durationChangedEv @ 24 NONAME
- _ZN14MpPlaybackData15positionChangedEv @ 25 NONAME
- _ZN14MpPlaybackData16setPlaybackStateENS_15SimplifiedStateE @ 26 NONAME
- _ZN14MpPlaybackData16staticMetaObjectE @ 27 NONAME DATA 16
- _ZN14MpPlaybackData18commitPlaybackInfoEv @ 28 NONAME
- _ZN14MpPlaybackData19getStaticMetaObjectEv @ 29 NONAME
- _ZN14MpPlaybackData19playbackInfoChangedEv @ 30 NONAME
- _ZN14MpPlaybackData20playbackStateChangedEv @ 31 NONAME
- _ZN14MpPlaybackData2idEv @ 32 NONAME
- _ZN14MpPlaybackData5setIdEi @ 33 NONAME
- _ZN14MpPlaybackData6setUriERK7QString @ 34 NONAME
- _ZN14MpPlaybackData7albumIdEv @ 35 NONAME
- _ZN14MpPlaybackData8setAlbumERK7QString @ 36 NONAME
- _ZN14MpPlaybackData8setTitleERK7QString @ 37 NONAME
- _ZN14MpPlaybackData9realAudioEv @ 38 NONAME
- _ZN14MpPlaybackData9resetDataEv @ 39 NONAME
- _ZN14MpPlaybackData9setArtistERK7QString @ 40 NONAME
- _ZN14MpPlaybackDataC1EP7QObject @ 41 NONAME
- _ZN14MpPlaybackDataC2EP7QObject @ 42 NONAME
- _ZN14MpPlaybackDataD0Ev @ 43 NONAME
- _ZN14MpPlaybackDataD1Ev @ 44 NONAME
- _ZN14MpPlaybackDataD2Ev @ 45 NONAME
- _ZN19MpMpxCollectionData10removeItemEi @ 46 NONAME
- _ZN19MpMpxCollectionData10setContextE18TCollectionContext @ 47 NONAME
- _ZN19MpMpxCollectionData11albumSongIdEi @ 48 NONAME
- _ZN19MpMpxCollectionData11containerIdEv @ 49 NONAME
- _ZN19MpMpxCollectionData11dataChangedEv @ 50 NONAME
- _ZN19MpMpxCollectionData11qt_metacallEN11QMetaObject4CallEiPPv @ 51 NONAME
- _ZN19MpMpxCollectionData11qt_metacastEPKc @ 52 NONAME
- _ZN19MpMpxCollectionData11setMpxMediaERK9CMPXMediab @ 53 NONAME
- _ZN19MpMpxCollectionData14albumSongIndexEi @ 54 NONAME
- _ZN19MpMpxCollectionData14containerMediaEv @ 55 NONAME
- _ZN19MpMpxCollectionData14contextChangedE18TCollectionContext @ 56 NONAME
- _ZN19MpMpxCollectionData14isAutoPlaylistEi @ 57 NONAME
- _ZN19MpMpxCollectionData14isAutoPlaylistEv @ 58 NONAME
- _ZN19MpMpxCollectionData14testCachedItemEi @ 59 NONAME
- _ZN19MpMpxCollectionData15setAlbumContentERK9CMPXMedia @ 60 NONAME
- _ZN19MpMpxCollectionData15setCurrentAlbumEi @ 61 NONAME
- _ZN19MpMpxCollectionData16albumDataChangedEv @ 62 NONAME
- _ZN19MpMpxCollectionData16insertCachedItemEi @ 63 NONAME
- _ZN19MpMpxCollectionData16staticMetaObjectE @ 64 NONAME DATA 16
- _ZN19MpMpxCollectionData17refreshAlbumSongsEv @ 65 NONAME
- _ZN19MpMpxCollectionData19getStaticMetaObjectEv @ 66 NONAME
- _ZN19MpMpxCollectionData6itemIdEi @ 67 NONAME
- _ZN19MpMpxCollectionData9itemCountEi @ 68 NONAME
- _ZN19MpMpxCollectionData9itemIndexEi @ 69 NONAME
- _ZN19MpMpxCollectionDataC1EP7QObject @ 70 NONAME
- _ZN19MpMpxCollectionDataC2EP7QObject @ 71 NONAME
- _ZN19MpMpxCollectionDataD0Ev @ 72 NONAME
- _ZN19MpMpxCollectionDataD1Ev @ 73 NONAME
- _ZN19MpMpxCollectionDataD2Ev @ 74 NONAME
- _ZN21MpCollectionDataModel10reloadDataEv @ 75 NONAME
- _ZN21MpCollectionDataModel10removeRowsEiiRK11QModelIndex @ 76 NONAME
- _ZN21MpCollectionDataModel10setContextE18TCollectionContext @ 77 NONAME
- _ZN21MpCollectionDataModel11qt_metacallEN11QMetaObject4CallEiPPv @ 78 NONAME
- _ZN21MpCollectionDataModel11qt_metacastEPKc @ 79 NONAME
- _ZN21MpCollectionDataModel12dataReloadedEv @ 80 NONAME
- _ZN21MpCollectionDataModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 81 NONAME
- _ZN21MpCollectionDataModel12orderChangedEiiii @ 82 NONAME
- _ZN21MpCollectionDataModel12refreshModelEv @ 83 NONAME
- _ZN21MpCollectionDataModel14collectionDataEv @ 84 NONAME
- _ZN21MpCollectionDataModel14updateAlbumArtEi @ 85 NONAME
- _ZN21MpCollectionDataModel16staticMetaObjectE @ 86 NONAME DATA 16
- _ZN21MpCollectionDataModel17setItemVisibilityERK11QModelIndexb @ 87 NONAME
- _ZN21MpCollectionDataModel19getStaticMetaObjectEv @ 88 NONAME
- _ZN21MpCollectionDataModelC1EP19MpMpxCollectionDataP7QObject @ 89 NONAME
- _ZN21MpCollectionDataModelC2EP19MpMpxCollectionDataP7QObject @ 90 NONAME
- _ZN21MpCollectionDataModelD0Ev @ 91 NONAME
- _ZN21MpCollectionDataModelD1Ev @ 92 NONAME
- _ZN21MpCollectionDataModelD2Ev @ 93 NONAME
- _ZN30MpCollectionTBoneListDataModel10updateSongEv @ 94 NONAME
- _ZN30MpCollectionTBoneListDataModel11qt_metacallEN11QMetaObject4CallEiPPv @ 95 NONAME
- _ZN30MpCollectionTBoneListDataModel11qt_metacastEPKc @ 96 NONAME
- _ZN30MpCollectionTBoneListDataModel12refreshModelEv @ 97 NONAME
- _ZN30MpCollectionTBoneListDataModel16albumDataChangedEv @ 98 NONAME
- _ZN30MpCollectionTBoneListDataModel16staticMetaObjectE @ 99 NONAME DATA 16
- _ZN30MpCollectionTBoneListDataModel18albumDataAvailableEv @ 100 NONAME
- _ZN30MpCollectionTBoneListDataModel19getStaticMetaObjectEv @ 101 NONAME
- _ZN30MpCollectionTBoneListDataModel19updatePlaybackStateEv @ 102 NONAME
- _ZN30MpCollectionTBoneListDataModelC1EP19MpMpxCollectionDataP14MpPlaybackDataP7QObject @ 103 NONAME
- _ZN30MpCollectionTBoneListDataModelC2EP19MpMpxCollectionDataP14MpPlaybackDataP7QObject @ 104 NONAME
- _ZN30MpCollectionTBoneListDataModelD0Ev @ 105 NONAME
- _ZN30MpCollectionTBoneListDataModelD1Ev @ 106 NONAME
- _ZN30MpCollectionTBoneListDataModelD2Ev @ 107 NONAME
- _ZNK10MpSongData10albumTrackEv @ 108 NONAME
- _ZNK10MpSongData10metaObjectEv @ 109 NONAME
- _ZNK10MpSongData10sampleRateEv @ 110 NONAME
- _ZNK10MpSongData14albumArtBase64Ev @ 111 NONAME
- _ZNK10MpSongData14isDrmProtectedEv @ 112 NONAME
- _ZNK10MpSongData14reservedLengthEv @ 113 NONAME
- _ZNK10MpSongData18removeAlbumArtFileEv @ 114 NONAME
- _ZNK10MpSongData4linkEv @ 115 NONAME
- _ZNK10MpSongData4sizeEv @ 116 NONAME
- _ZNK10MpSongData4yearEv @ 117 NONAME
- _ZNK10MpSongData5albumEv @ 118 NONAME
- _ZNK10MpSongData5genreEv @ 119 NONAME
- _ZNK10MpSongData5titleEv @ 120 NONAME
- _ZNK10MpSongData6artistEv @ 121 NONAME
- _ZNK10MpSongData7bitRateEv @ 122 NONAME
- _ZNK10MpSongData7commentEv @ 123 NONAME
- _ZNK10MpSongData8albumArtER6HbIcon @ 124 NONAME
- _ZNK10MpSongData8composerEv @ 125 NONAME
- _ZNK10MpSongData8durationEv @ 126 NONAME
- _ZNK10MpSongData8fileNameEv @ 127 NONAME
- _ZNK10MpSongData8mimeTypeEv @ 128 NONAME
- _ZNK10MpSongData8modifiedEv @ 129 NONAME
- _ZNK10MpSongData8musicURLEv @ 130 NONAME
- _ZNK10MpSongData9copyrightEv @ 131 NONAME
- _ZNK14MpPlaybackData10metaObjectEv @ 132 NONAME
- _ZNK14MpPlaybackData13playbackStateEv @ 133 NONAME
- _ZNK14MpPlaybackData3uriEv @ 134 NONAME
- _ZNK14MpPlaybackData5albumEv @ 135 NONAME
- _ZNK14MpPlaybackData5titleEv @ 136 NONAME
- _ZNK14MpPlaybackData6artistEv @ 137 NONAME
- _ZNK14MpPlaybackData8albumArtER6HbIcon @ 138 NONAME
- _ZNK14MpPlaybackData8durationEv @ 139 NONAME
- _ZNK14MpPlaybackData8positionEv @ 140 NONAME
- _ZNK19MpMpxCollectionData10metaObjectEv @ 141 NONAME
- _ZNK19MpMpxCollectionData13albumSongDataEiNS_8DataTypeE @ 142 NONAME
- _ZNK19MpMpxCollectionData15albumSongsCountEv @ 143 NONAME
- _ZNK19MpMpxCollectionData15collectionTitleEv @ 144 NONAME
- _ZNK19MpMpxCollectionData17currentAlbumIndexEv @ 145 NONAME
- _ZNK19MpMpxCollectionData5countEv @ 146 NONAME
- _ZNK19MpMpxCollectionData7contextEv @ 147 NONAME
- _ZNK19MpMpxCollectionData8itemDataEiNS_8DataTypeE @ 148 NONAME
- _ZNK21MpCollectionDataModel10metaObjectEv @ 149 NONAME
- _ZNK21MpCollectionDataModel20supportedDropActionsEv @ 150 NONAME
- _ZNK21MpCollectionDataModel4dataERK11QModelIndexi @ 151 NONAME
- _ZNK21MpCollectionDataModel8mimeDataERK5QListI11QModelIndexE @ 152 NONAME
- _ZNK21MpCollectionDataModel8rowCountERK11QModelIndex @ 153 NONAME
- _ZNK21MpCollectionDataModel9mimeTypesEv @ 154 NONAME
- _ZNK30MpCollectionTBoneListDataModel10metaObjectEv @ 155 NONAME
- _ZNK30MpCollectionTBoneListDataModel4dataERK11QModelIndexi @ 156 NONAME
- _ZNK30MpCollectionTBoneListDataModel8rowCountERK11QModelIndex @ 157 NONAME
- _ZTI10MpSongData @ 158 NONAME
- _ZTI14MpPlaybackData @ 159 NONAME
- _ZTI19MpMpxCollectionData @ 160 NONAME
- _ZTI21MpCollectionDataModel @ 161 NONAME
- _ZTI30MpCollectionTBoneListDataModel @ 162 NONAME
- _ZTV10MpSongData @ 163 NONAME
- _ZTV14MpPlaybackData @ 164 NONAME
- _ZTV19MpMpxCollectionData @ 165 NONAME
- _ZTV21MpCollectionDataModel @ 166 NONAME
- _ZTV30MpCollectionTBoneListDataModel @ 167 NONAME
- _ZN10MpSongData7setLinkERK7QString @ 168 NONAME
+ _ZN10MpSongData7setLinkERK7QString @ 10 NONAME
+ _ZN10MpSongDataC1EP7QObject @ 11 NONAME
+ _ZN10MpSongDataC2EP7QObject @ 12 NONAME
+ _ZN10MpSongDataD0Ev @ 13 NONAME
+ _ZN10MpSongDataD1Ev @ 14 NONAME
+ _ZN10MpSongDataD2Ev @ 15 NONAME
+ _ZN14MpPlaybackData10setAlbumIdEi @ 16 NONAME
+ _ZN14MpPlaybackData11qt_metacallEN11QMetaObject4CallEiPPv @ 17 NONAME
+ _ZN14MpPlaybackData11qt_metacastEPKc @ 18 NONAME
+ _ZN14MpPlaybackData11setDurationEi @ 19 NONAME
+ _ZN14MpPlaybackData11setPositionEi @ 20 NONAME
+ _ZN14MpPlaybackData12setCorruptedEi @ 21 NONAME
+ _ZN14MpPlaybackData12setRealAudioEb @ 22 NONAME
+ _ZN14MpPlaybackData13albumArtReadyEv @ 23 NONAME
+ _ZN14MpPlaybackData13fileCorruptedEi @ 24 NONAME
+ _ZN14MpPlaybackData14setAlbumArtUriERK7QString @ 25 NONAME
+ _ZN14MpPlaybackData14thumbnailReadyERK7QPixmapPvii @ 26 NONAME
+ _ZN14MpPlaybackData15durationChangedEv @ 27 NONAME
+ _ZN14MpPlaybackData15positionChangedEv @ 28 NONAME
+ _ZN14MpPlaybackData16setPlaybackStateENS_15SimplifiedStateE @ 29 NONAME
+ _ZN14MpPlaybackData16staticMetaObjectE @ 30 NONAME DATA 16
+ _ZN14MpPlaybackData18commitPlaybackInfoEv @ 31 NONAME
+ _ZN14MpPlaybackData19getStaticMetaObjectEv @ 32 NONAME
+ _ZN14MpPlaybackData19playbackInfoChangedEv @ 33 NONAME
+ _ZN14MpPlaybackData20playbackStateChangedEv @ 34 NONAME
+ _ZN14MpPlaybackData2idEv @ 35 NONAME
+ _ZN14MpPlaybackData5setIdEi @ 36 NONAME
+ _ZN14MpPlaybackData6setUriERK7QString @ 37 NONAME
+ _ZN14MpPlaybackData7albumIdEv @ 38 NONAME
+ _ZN14MpPlaybackData8setAlbumERK7QString @ 39 NONAME
+ _ZN14MpPlaybackData8setTitleERK7QString @ 40 NONAME
+ _ZN14MpPlaybackData9realAudioEv @ 41 NONAME
+ _ZN14MpPlaybackData9resetDataEv @ 42 NONAME
+ _ZN14MpPlaybackData9setArtistERK7QString @ 43 NONAME
+ _ZN14MpPlaybackDataC1EP7QObject @ 44 NONAME
+ _ZN14MpPlaybackDataC2EP7QObject @ 45 NONAME
+ _ZN14MpPlaybackDataD0Ev @ 46 NONAME
+ _ZN14MpPlaybackDataD1Ev @ 47 NONAME
+ _ZN14MpPlaybackDataD2Ev @ 48 NONAME
+ _ZN19MpMpxCollectionData10removeItemEi @ 49 NONAME
+ _ZN19MpMpxCollectionData10setContextE18TCollectionContext @ 50 NONAME
+ _ZN19MpMpxCollectionData11albumSongIdEi @ 51 NONAME
+ _ZN19MpMpxCollectionData11containerIdEv @ 52 NONAME
+ _ZN19MpMpxCollectionData11dataChangedEv @ 53 NONAME
+ _ZN19MpMpxCollectionData11qt_metacallEN11QMetaObject4CallEiPPv @ 54 NONAME
+ _ZN19MpMpxCollectionData11qt_metacastEPKc @ 55 NONAME
+ _ZN19MpMpxCollectionData11setMpxMediaERK9CMPXMediab @ 56 NONAME
+ _ZN19MpMpxCollectionData14albumSongIndexEi @ 57 NONAME
+ _ZN19MpMpxCollectionData14containerMediaEv @ 58 NONAME
+ _ZN19MpMpxCollectionData14contextChangedE18TCollectionContext @ 59 NONAME
+ _ZN19MpMpxCollectionData14isAutoPlaylistEi @ 60 NONAME
+ _ZN19MpMpxCollectionData14isAutoPlaylistEv @ 61 NONAME
+ _ZN19MpMpxCollectionData14testCachedItemEi @ 62 NONAME
+ _ZN19MpMpxCollectionData15setAlbumContentERK9CMPXMedia @ 63 NONAME
+ _ZN19MpMpxCollectionData15setCorruptValueE11QModelIndexb @ 64 NONAME
+ _ZN19MpMpxCollectionData15setCurrentAlbumEi @ 65 NONAME
+ _ZN19MpMpxCollectionData16albumDataChangedEv @ 66 NONAME
+ _ZN19MpMpxCollectionData16insertCachedItemEi @ 67 NONAME
+ _ZN19MpMpxCollectionData16staticMetaObjectE @ 68 NONAME DATA 16
+ _ZN19MpMpxCollectionData17refreshAlbumSongsEv @ 69 NONAME
+ _ZN19MpMpxCollectionData19getStaticMetaObjectEv @ 70 NONAME
+ _ZN19MpMpxCollectionData21setReloadAlbumContentEb @ 71 NONAME
+ _ZN19MpMpxCollectionData6itemIdEi @ 72 NONAME
+ _ZN19MpMpxCollectionData9itemCountEi @ 73 NONAME
+ _ZN19MpMpxCollectionData9itemIndexEi @ 74 NONAME
+ _ZN19MpMpxCollectionData9songIndexEi @ 75 NONAME
+ _ZN19MpMpxCollectionDataC1EP7QObject @ 76 NONAME
+ _ZN19MpMpxCollectionDataC2EP7QObject @ 77 NONAME
+ _ZN19MpMpxCollectionDataD0Ev @ 78 NONAME
+ _ZN19MpMpxCollectionDataD1Ev @ 79 NONAME
+ _ZN19MpMpxCollectionDataD2Ev @ 80 NONAME
+ _ZN21MpCollectionDataModel10reloadDataEv @ 81 NONAME
+ _ZN21MpCollectionDataModel10removeRowsEiiRK11QModelIndex @ 82 NONAME
+ _ZN21MpCollectionDataModel10setContextE18TCollectionContext @ 83 NONAME
+ _ZN21MpCollectionDataModel11qt_metacallEN11QMetaObject4CallEiPPv @ 84 NONAME
+ _ZN21MpCollectionDataModel11qt_metacastEPKc @ 85 NONAME
+ _ZN21MpCollectionDataModel12dataReloadedEv @ 86 NONAME
+ _ZN21MpCollectionDataModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 87 NONAME
+ _ZN21MpCollectionDataModel12orderChangedEiiii @ 88 NONAME
+ _ZN21MpCollectionDataModel12refreshModelEv @ 89 NONAME
+ _ZN21MpCollectionDataModel13fileCorruptedEi @ 90 NONAME
+ _ZN21MpCollectionDataModel14collectionDataEv @ 91 NONAME
+ _ZN21MpCollectionDataModel14updateAlbumArtEi @ 92 NONAME
+ _ZN21MpCollectionDataModel16staticMetaObjectE @ 93 NONAME DATA 16
+ _ZN21MpCollectionDataModel17setItemVisibilityERK11QModelIndexb @ 94 NONAME
+ _ZN21MpCollectionDataModel19getStaticMetaObjectEv @ 95 NONAME
+ _ZN21MpCollectionDataModelC1EP19MpMpxCollectionDataP14MpPlaybackDataP7QObject @ 96 NONAME
+ _ZN21MpCollectionDataModelC2EP19MpMpxCollectionDataP14MpPlaybackDataP7QObject @ 97 NONAME
+ _ZN21MpCollectionDataModelD0Ev @ 98 NONAME
+ _ZN21MpCollectionDataModelD1Ev @ 99 NONAME
+ _ZN21MpCollectionDataModelD2Ev @ 100 NONAME
+ _ZN30MpCollectionTBoneListDataModel10updateSongEv @ 101 NONAME
+ _ZN30MpCollectionTBoneListDataModel11qt_metacallEN11QMetaObject4CallEiPPv @ 102 NONAME
+ _ZN30MpCollectionTBoneListDataModel11qt_metacastEPKc @ 103 NONAME
+ _ZN30MpCollectionTBoneListDataModel12refreshModelEv @ 104 NONAME
+ _ZN30MpCollectionTBoneListDataModel13fileCorruptedEi @ 105 NONAME
+ _ZN30MpCollectionTBoneListDataModel16albumDataChangedEv @ 106 NONAME
+ _ZN30MpCollectionTBoneListDataModel16staticMetaObjectE @ 107 NONAME DATA 16
+ _ZN30MpCollectionTBoneListDataModel18albumDataAvailableEv @ 108 NONAME
+ _ZN30MpCollectionTBoneListDataModel19getStaticMetaObjectEv @ 109 NONAME
+ _ZN30MpCollectionTBoneListDataModel19updatePlaybackStateEv @ 110 NONAME
+ _ZN30MpCollectionTBoneListDataModel29enablePlaybackIndicatorEnableEb @ 111 NONAME
+ _ZN30MpCollectionTBoneListDataModelC1EP19MpMpxCollectionDataP14MpPlaybackDataP7QObject @ 112 NONAME
+ _ZN30MpCollectionTBoneListDataModelC2EP19MpMpxCollectionDataP14MpPlaybackDataP7QObject @ 113 NONAME
+ _ZN30MpCollectionTBoneListDataModelD0Ev @ 114 NONAME
+ _ZN30MpCollectionTBoneListDataModelD1Ev @ 115 NONAME
+ _ZN30MpCollectionTBoneListDataModelD2Ev @ 116 NONAME
+ _ZNK10MpSongData10albumTrackEv @ 117 NONAME
+ _ZNK10MpSongData10metaObjectEv @ 118 NONAME
+ _ZNK10MpSongData10sampleRateEv @ 119 NONAME
+ _ZNK10MpSongData14albumArtBase64Ev @ 120 NONAME
+ _ZNK10MpSongData14isDrmProtectedEv @ 121 NONAME
+ _ZNK10MpSongData14reservedLengthEv @ 122 NONAME
+ _ZNK10MpSongData18removeAlbumArtFileEv @ 123 NONAME
+ _ZNK10MpSongData4linkEv @ 124 NONAME
+ _ZNK10MpSongData4sizeEv @ 125 NONAME
+ _ZNK10MpSongData4yearEv @ 126 NONAME
+ _ZNK10MpSongData5albumEv @ 127 NONAME
+ _ZNK10MpSongData5genreEv @ 128 NONAME
+ _ZNK10MpSongData5titleEv @ 129 NONAME
+ _ZNK10MpSongData6artistEv @ 130 NONAME
+ _ZNK10MpSongData7bitRateEv @ 131 NONAME
+ _ZNK10MpSongData7commentEv @ 132 NONAME
+ _ZNK10MpSongData8albumArtER6HbIcon @ 133 NONAME
+ _ZNK10MpSongData8composerEv @ 134 NONAME
+ _ZNK10MpSongData8durationEv @ 135 NONAME
+ _ZNK10MpSongData8fileNameEv @ 136 NONAME
+ _ZNK10MpSongData8mimeTypeEv @ 137 NONAME
+ _ZNK10MpSongData8modifiedEv @ 138 NONAME
+ _ZNK10MpSongData8musicURLEv @ 139 NONAME
+ _ZNK10MpSongData9copyrightEv @ 140 NONAME
+ _ZNK14MpPlaybackData10metaObjectEv @ 141 NONAME
+ _ZNK14MpPlaybackData13playbackStateEv @ 142 NONAME
+ _ZNK14MpPlaybackData3uriEv @ 143 NONAME
+ _ZNK14MpPlaybackData5albumEv @ 144 NONAME
+ _ZNK14MpPlaybackData5titleEv @ 145 NONAME
+ _ZNK14MpPlaybackData6artistEv @ 146 NONAME
+ _ZNK14MpPlaybackData8albumArtER6HbIcon @ 147 NONAME
+ _ZNK14MpPlaybackData8durationEv @ 148 NONAME
+ _ZNK14MpPlaybackData8positionEv @ 149 NONAME
+ _ZNK19MpMpxCollectionData10metaObjectEv @ 150 NONAME
+ _ZNK19MpMpxCollectionData13albumSongDataEiNS_8DataTypeE @ 151 NONAME
+ _ZNK19MpMpxCollectionData15albumSongsCountEv @ 152 NONAME
+ _ZNK19MpMpxCollectionData15collectionTitleEv @ 153 NONAME
+ _ZNK19MpMpxCollectionData15hasItemPropertyEiNS_12DataPropertyE @ 154 NONAME
+ _ZNK19MpMpxCollectionData17currentAlbumIndexEv @ 155 NONAME
+ _ZNK19MpMpxCollectionData20hasAlbumSongPropertyEiNS_12DataPropertyE @ 156 NONAME
+ _ZNK19MpMpxCollectionData5countEv @ 157 NONAME
+ _ZNK19MpMpxCollectionData7contextEv @ 158 NONAME
+ _ZNK19MpMpxCollectionData8itemDataEiNS_8DataTypeE @ 159 NONAME
+ _ZNK21MpCollectionDataModel10metaObjectEv @ 160 NONAME
+ _ZNK21MpCollectionDataModel20supportedDropActionsEv @ 161 NONAME
+ _ZNK21MpCollectionDataModel4dataERK11QModelIndexi @ 162 NONAME
+ _ZNK21MpCollectionDataModel8mimeDataERK5QListI11QModelIndexE @ 163 NONAME
+ _ZNK21MpCollectionDataModel8rowCountERK11QModelIndex @ 164 NONAME
+ _ZNK21MpCollectionDataModel9mimeTypesEv @ 165 NONAME
+ _ZNK30MpCollectionTBoneListDataModel10metaObjectEv @ 166 NONAME
+ _ZNK30MpCollectionTBoneListDataModel4dataERK11QModelIndexi @ 167 NONAME
+ _ZNK30MpCollectionTBoneListDataModel8rowCountERK11QModelIndex @ 168 NONAME
+ _ZTI10MpSongData @ 169 NONAME
+ _ZTI14MpPlaybackData @ 170 NONAME
+ _ZTI19MpMpxCollectionData @ 171 NONAME
+ _ZTI21MpCollectionDataModel @ 172 NONAME
+ _ZTI30MpCollectionTBoneListDataModel @ 173 NONAME
+ _ZTV10MpSongData @ 174 NONAME
+ _ZTV14MpPlaybackData @ 175 NONAME
+ _ZTV19MpMpxCollectionData @ 176 NONAME
+ _ZTV21MpCollectionDataModel @ 177 NONAME
+ _ZTV30MpCollectionTBoneListDataModel @ 178 NONAME
+ _ZN21MpCollectionDataModel9setLayoutE17TCollectionLayout @ 179 NONAME
+ _ZN19MpMpxCollectionData11dataChangedEii @ 180 NONAME
+ _ZN19MpMpxCollectionData21incrementalOpenUpdateEv @ 181 NONAME
+ _ZN21MpCollectionDataModel10reloadDataEii @ 182 NONAME
--- a/mpdata/inc/mpmpxcollectiondata_p.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/inc/mpmpxcollectiondata_p.h Thu Sep 02 20:24:03 2010 +0300
@@ -21,6 +21,8 @@
#include <e32base.h>
#include <QHash>
+#include <QPair>
+#include <QAbstractListModel>
#include "mpmpxcollectiondata.h"
#include "mpmpxcollectionviewdefs.h"
@@ -40,7 +42,7 @@
int count() const;
QString collectionTitle() const;
- QString itemData( int index, MpMpxCollectionData::DataType type ) const;
+ QString itemData( int index, MpMpxCollectionData::DataType type );
bool isAutoPlaylist();
bool isAutoPlaylist( int index );
@@ -56,33 +58,46 @@
int currentAlbumIndex() const;
int albumSongsCount() const;
QString albumSongData( int index, MpMpxCollectionData::DataType type ) const;
+ bool hasItemProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
+ bool hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
void setMpxMedia( const CMPXMedia& entries, bool reopen );
+ void incrementalOpenUpdate();
const CMPXMedia& containerMedia();
void setContext( TCollectionContext context );
void setAlbumContent( const CMPXMedia& albumContent );
int itemIndex( int itemUniqueId );
int albumSongIndex( int songUniqueId );
+ QList<int> songIndex( int songUniqueId );
+ void setCorruptValue( QModelIndex index, bool tBone );
+ void setReloadAlbumContent( bool reloadAlbum );
private:
+
void loadAlbumsLookup();
void loadAlbumSongsLookup();
- void DoGetDataL( int index, MpMpxCollectionData::DataType type, QString& data ) const;
+ void setReloadRange( int index );
+ int itemId2( int index);
+ void DoGetDataL( int index, MpMpxCollectionData::DataType type, QString& data );
bool DoIsAutoPlaylistL();
bool DoIsAutoPlaylistL( int index );
int DoGetItemCountL( int index );
int DoGetContainerIdL();
int DoGetItemIdL( int index );
+ int DoGetItemId2L( int index );
int DoGetAlbumSongIdL( int index );
void DoRemoveItemL( int index );
bool DoTestCachedItemL( int itemId );
bool DoSetCurrentAlbumL( int index );
void DoGetAlbumSongDataL( int index, MpMpxCollectionData::DataType type, QString& data ) const;
+ bool DoHasItemPropertyL( int index, MpMpxCollectionData:: DataProperty type ) const;
+ bool DoHasAlbumSongPropertyL( int index, MpMpxCollectionData:: DataProperty type ) const;
void SetCollectionContextL();
void DoSetMpxMediaL( const CMPXMedia& entries );
void DoSetAlbumContentL( const CMPXMedia& albumContent );
+ void DoSetCorruptValueL( QModelIndex index, bool tBone );
private:
@@ -96,9 +111,14 @@
int iCurrentAlbumIndex;
int iAlbumSongCount;
- QHash<int, int> albumIdIndexMapping;
- QHash<int, int> albumSongIdIndexMapping;
+ QHash<int, int> iAlbumIdIndexMapping;
+ QHash<int, int> iAlbumSongIdIndexMapping;
+ QHash<int, int> iSongIdIndexMapping;
+ bool iReloadAlbumContent;
+ bool iNeedReload;
+ QPair<int, int> iReloadRange;
+
};
#endif // MPMPXCOLLECTIONDATA_P_H
--- a/mpdata/src/mpcollectiondatamodel.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/src/mpcollectiondatamodel.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -26,6 +26,7 @@
#include "mpcollectiondatamodel.h"
#include "mpcollectionalbumartmanager.h"
+#include "mpplaybackdata.h"
#include "mpmpxcollectiondata.h"
#include "mptrace.h"
@@ -67,18 +68,26 @@
/*!
Constructs the collection data model.
*/
-MpCollectionDataModel::MpCollectionDataModel( MpMpxCollectionData *data, QObject *parent )
- : QAbstractListModel( parent ),
- mCollectionData( data ),
- mRowCount( 0 ),
- mAlbumIndexOffset( 0 ),
- mHiddenItemIndex( -1 )
+MpCollectionDataModel::MpCollectionDataModel( MpMpxCollectionData *data, MpPlaybackData *playbackData, QObject *parent )
+ : QAbstractListModel(parent),
+ mCollectionData(data),
+ mPlaybackData(playbackData),
+ mRowCount(0),
+ mAlbumIndexOffset(0),
+ mHiddenItemIndex(-1),
+ mCollectionLayout(ECollectionListView)
{
TX_ENTRY
connect( mCollectionData, SIGNAL(contextChanged(TCollectionContext)), this, SLOT(setContext(TCollectionContext)) );
connect( mCollectionData, SIGNAL(dataChanged()), this, SLOT(reloadData()) );
+ connect( mCollectionData, SIGNAL(dataChanged(int, int)), this, SLOT(reloadData(int, int)) );
mAlbumArtManager = new MpCollectionAlbumArtManager(mCollectionData);
connect( mAlbumArtManager, SIGNAL(albumArtReady(int)), this, SLOT(updateAlbumArt(int)) );
+
+ if ( mPlaybackData ) {
+ connect( mPlaybackData, SIGNAL(fileCorrupted(int)),
+ this, SLOT(fileCorrupted(int)) );
+ }
TX_EXIT
}
@@ -143,7 +152,24 @@
display << primaryText;
}
else {
- display << hbTrId("txt_mus_other_unknown4");
+ switch ( context ) {
+ case ECollectionContextArtists:
+ display << hbTrId("txt_mus_list_unknown");
+ break;
+ case ECollectionContextArtistAlbums:
+ case ECollectionContextAlbums:
+ display << hbTrId("txt_mus_dblist_unknown");
+ break;
+ case ECollectionContextAlbumsTBone:
+ case ECollectionContextArtistAlbumsTBone:
+ display << hbTrId("txt_mus_other_unknown8");
+ break;
+ default:
+ // Otherwise the primary text should be the Song Title or File Name
+ // but can not be empty, if so there is an error.
+ TX_LOG_ARGS("Error: Song title empty.");
+ break;
+ }
}
break;
case ECollectionContextAlbumsMediaWall:
@@ -152,7 +178,7 @@
display << primaryText;
}
else {
- display << hbTrId("txt_mus_other_unknown4");
+ display << hbTrId("txt_mus_other_unknown2");
}
break;
default:
@@ -171,7 +197,26 @@
display << secondaryText;
}
else {
- display << hbTrId("txt_mus_other_unknown3");
+ switch ( context ) {
+ case ECollectionContextAllSongs:
+ case ECollectionContextPlaylistSongs:
+ if ( mCollectionLayout == ECollectionSelectionDialog ) {
+ display << hbTrId("txt_mus_dblist_val_unknown4");
+ }
+ else if ( mCollectionLayout == ECollectionArrangeSongsDialog ) {
+ display << hbTrId("txt_mus_other_unknown9");
+ }
+ else {
+ display << hbTrId("txt_mus_dblist_val_unknown");
+ }
+ break;
+ case ECollectionContextAlbums:
+ display << hbTrId("txt_mus_dblist_val_unknown2");
+ break;
+ case ECollectionContextAlbumsTBone:
+ display << hbTrId("txt_mus_other_unknown5");
+ break;
+ }
}
break;
case ECollectionContextArtistAlbumsTBone:
@@ -180,7 +225,7 @@
display << secondaryText;
}
else {
- display << hbTrId("txt_mus_other_unknown3");
+ display << hbTrId("txt_mus_other_unknown5");
}
break;
case ECollectionContextArtistAllSongs:
@@ -189,7 +234,7 @@
display << secondaryText;
}
else {
- display << hbTrId("txt_mus_other_unknown4");
+ display << hbTrId("txt_mus_dblist_val_unknown3");
}
break;
case ECollectionContextAlbumsMediaWall:
@@ -198,7 +243,7 @@
display << secondaryText;
}
else {
- display << hbTrId("txt_mus_other_unknown3");
+ display << hbTrId("txt_mus_other_unknown1");
}
break;
default:
@@ -222,6 +267,24 @@
returnValue = mAlbumArtManager->albumArt( row );
}
break;
+ case ECollectionContextAllSongs:
+ case ECollectionContextArtistAllSongs:
+ case ECollectionContextPlaylistSongs:
+ if( mCollectionData->hasItemProperty(row, MpMpxCollectionData::Corrupted) ){
+ QList<QVariant> iconList;
+ iconList << QVariant();
+ iconList << HbIcon("qtg_mono_corrupted");
+ returnValue = iconList;
+ }
+ else if ( mCollectionData->hasItemProperty(row, MpMpxCollectionData::DrmExpired) ) {
+ QList<QVariant> iconList;
+ iconList << QVariant();
+ iconList << HbIcon("qtg_small_drm_rights_expired");
+ returnValue = iconList;
+ }
+ break;
+ default:
+ break;
}
}
else if ( role == Hb::IndexFeedbackRole ) {
@@ -375,6 +438,14 @@
}
/*!
+ Sets the layout where the collection is being displayed.
+ */
+void MpCollectionDataModel::setLayout(TCollectionLayout layout)
+{
+ mCollectionLayout = layout;
+}
+
+/*!
Slot to be called when collection context is changed.
*/
void MpCollectionDataModel::setContext( TCollectionContext context )
@@ -419,8 +490,7 @@
index -= mAlbumIndexOffset;
if ( index >= 0 && index < mRowCount ) {
- QModelIndex modelIndex = QAbstractItemModel::createIndex(index, 0);
- emit dataChanged(modelIndex, modelIndex);
+ emit dataChanged(this->index(index, 0), this->index(index, 0));
}
TX_EXIT
}
@@ -462,3 +532,35 @@
TX_EXIT
}
+/*!
+ Slot to be called when data has changed (same context) and model needs to reload
+ the data in the specified range.
+ */
+void MpCollectionDataModel::reloadData( int fromIndex, int toIndex )
+{
+ TX_ENTRY_ARGS("fromIndex=" << fromIndex << ", toIndex=" << toIndex);
+ emit dataChanged(this->index(fromIndex,0), this->index(toIndex,0));
+ TX_EXIT
+}
+
+/*!
+ Slot to be called when a song is marked as corrupted
+ */
+void MpCollectionDataModel::fileCorrupted(int songId)
+{
+ TX_ENTRY
+ QModelIndex corruptedSongIndex;
+ QList<int> indexList = mCollectionData->songIndex( songId );
+ for (int i = 0; i < indexList.count(); i++){
+ corruptedSongIndex = index( indexList.at(i) );
+ if ( corruptedSongIndex.isValid() && (!(mCollectionData->hasItemProperty(corruptedSongIndex.row(),
+ MpMpxCollectionData::Corrupted)))) {
+
+ mCollectionData->setCorruptValue(corruptedSongIndex, false);
+ emit dataChanged( corruptedSongIndex, corruptedSongIndex );
+ }
+ }
+ TX_EXIT
+}
+
+
--- a/mpdata/src/mpcollectiontbonelistdatamodel.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/src/mpcollectiontbonelistdatamodel.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -75,7 +75,8 @@
mPlaybackData( playbackData ),
mRowCount( 0 ),
mCurrentSongId( 0 ),
- mPlaybackActive( false )
+ mPlaybackActive( false ),
+ mPlaybackIndicatorEnabled( false )
{
TX_ENTRY
connect( mCollectionData, SIGNAL(refreshAlbumSongs()),
@@ -84,12 +85,8 @@
this, SIGNAL(albumDataChanged()) );
if ( mPlaybackData ) {
- connect( mPlaybackData, SIGNAL(playbackInfoChanged()),
- this, SLOT(updateSong()));
-
- connect( mPlaybackData, SIGNAL(playbackStateChanged()),
- this, SLOT(updatePlaybackState()));
- mPlaybackActive = mPlaybackData->playbackState() != MpPlaybackData::NotPlaying;
+ connect( mPlaybackData, SIGNAL(fileCorrupted( int )),
+ this, SLOT(fileCorrupted( int )));
}
TX_EXIT
@@ -141,7 +138,19 @@
}
}
else if ( role == Qt::DecorationRole ) {
- if ( mPlaybackActive
+ if ( mCollectionData->hasAlbumSongProperty(row, MpMpxCollectionData::Corrupted) ) {
+ QList<QVariant> iconList;
+ iconList << QVariant();
+ iconList << HbIcon("qtg_mono_corrupted");
+ returnValue = iconList;
+ }
+ else if ( mCollectionData->hasAlbumSongProperty(row, MpMpxCollectionData::DrmExpired) ) {
+ QList<QVariant> iconList;
+ iconList << QVariant();
+ iconList << HbIcon("qtg_small_drm_rights_expired");
+ returnValue = iconList;
+ }
+ else if ( mPlaybackActive && mPlaybackIndicatorEnabled
&& mPlaybackData->id() == mCollectionData->albumSongId( row ) ) {
QList<QVariant> iconList;
iconList << QVariant(); //primary icon is not used.
@@ -155,6 +164,36 @@
}
/*!
+ Set Playback Indicator in TBone List Model
+ */
+void MpCollectionTBoneListDataModel::enablePlaybackIndicatorEnable(bool enable)
+{
+ TX_ENTRY
+ if ( !mPlaybackData ) {
+ return;
+ }
+ if ( enable ){
+ connect( mPlaybackData, SIGNAL(playbackInfoChanged()),
+ this, SLOT(updateSong()));
+
+ connect( mPlaybackData, SIGNAL(playbackStateChanged()),
+ this, SLOT(updatePlaybackState()));
+ mPlaybackActive = mPlaybackData->playbackState() != MpPlaybackData::NotPlaying;
+ mPlaybackIndicatorEnabled = true;
+ }
+ else{
+ disconnect( mPlaybackData, SIGNAL(playbackInfoChanged()),
+ this, SLOT(updateSong()));
+
+ disconnect( mPlaybackData, SIGNAL(playbackStateChanged()),
+ this, SLOT(updatePlaybackState()));
+ mPlaybackActive = false;
+ mPlaybackIndicatorEnabled = false;
+ }
+ TX_EXIT
+}
+
+/*!
Slot to be called when data has changed and model needs to be refreshed
to reflect the new data.
*/
@@ -209,6 +248,25 @@
updateSong();
}
}
+
+/*!
+ Slot to be called when a song is marked as corrupted
+ */
+void MpCollectionTBoneListDataModel::fileCorrupted(int songId)
+{
+ TX_ENTRY
+ QModelIndex corruptedSongIndex;
+ corruptedSongIndex = index( mCollectionData->albumSongIndex( songId ) );
+ if ( !(corruptedSongIndex.isValid()) ){
+ mCollectionData->setReloadAlbumContent( true );
+ }
+ else if (!(mCollectionData->hasAlbumSongProperty(corruptedSongIndex.row(),
+ MpMpxCollectionData::Corrupted))) {
+ mCollectionData->setCorruptValue(corruptedSongIndex, true);
+ emit dataChanged( corruptedSongIndex, corruptedSongIndex );
+ }
+ TX_EXIT
+}
//EOF
--- a/mpdata/src/mpmpxcollectiondata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/src/mpmpxcollectiondata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -52,6 +52,17 @@
\sa setMpxMedia()
*/
+/*!
+ \fn void dataChanged( int fromIndex, int toIndex )
+
+ This signal is emitted when a new data set is available within the
+ same context. This can happen during an incremental open operation,
+ if the view accesses a range of data that doesn't have final data
+ (i.e. Unknown). This signal is emitted upon completion of incremental
+ open operation, if such unavailable range was accessed.
+
+ \sa setMpxMedia()
+ */
/*!
\fn void albumDataChanged()
@@ -241,6 +252,27 @@
}
/*!
+ Returns item property for the specified \a index and \a type in the current item.
+ Currently supported data types are: Corrupted and DrmExpired. All others will return
+ false bool.
+ */
+
+bool MpMpxCollectionData::hasItemProperty( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+ return d_ptr->hasItemProperty( index, type );
+}
+
+/*!
+ Returns item property for the specified \a index and \a type in the current album.
+ Currently supported data types are: Corrupted and DrmExpired. All others will return
+ false bool.
+ */
+bool MpMpxCollectionData::hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+ return d_ptr->hasAlbumSongProperty( index, type);
+}
+
+/*!
Sets the media \a entries from the MPX framework. The \a reopen flag indicates
whether the new media is a result of reopenCollection() operation in the MpEngine.
Internal usage only from MpEngine.
@@ -251,6 +283,15 @@
}
/*!
+ Called when collection was opened with incremental open. This indicates that the
+ media received in setMpxMedia() has an update.
+ */
+void MpMpxCollectionData::incrementalOpenUpdate()
+{
+ d_ptr->incrementalOpenUpdate();
+}
+
+/*!
Returns the container media from the MPX framework.
Internal usage only from MpEngine.
@@ -304,6 +345,32 @@
return d_ptr->albumSongIndex( songUniqueId );
}
-//EOF
+/*!
+ Returns the list of index for the song with \a songUniqueId.
+ A list is returned due to playlist can contain the same song
+ multiple times.
+
+ */
+QList<int> MpMpxCollectionData::songIndex( int songUniqueId )
+{
+ return d_ptr->songIndex( songUniqueId );
+}
+
+/*!
+ Set model index \a index as corrupted.
+ */
+void MpMpxCollectionData::setCorruptValue( QModelIndex index, bool tBone )
+{
+ d_ptr->setCorruptValue( index, tBone );
+}
+/*!
+ Set the reloadAlbumContent variable to \a reloadAlbum
+
+ */
+void MpMpxCollectionData::setReloadAlbumContent( bool reloadAlbum )
+{
+ d_ptr->setReloadAlbumContent( reloadAlbum );
+}
+
--- a/mpdata/src/mpmpxcollectiondata_p.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/src/mpmpxcollectiondata_p.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -38,13 +38,15 @@
\internal
*/
MpMpxCollectionDataPrivate::MpMpxCollectionDataPrivate( MpMpxCollectionData *wrapper )
- : q_ptr( wrapper ),
- iContext( ECollectionContextUnknown ),
+ : q_ptr(wrapper),
+ iContext(ECollectionContextUnknown),
iContainerMedia(0),
iMediaArray(0),
iCachedRemovedItem(0),
iCurrentAlbumIndex(-1),
- iAlbumSongCount(0)
+ iAlbumSongCount(0),
+ iReloadAlbumContent(false),
+ iNeedReload(false)
{
TX_LOG
}
@@ -99,7 +101,7 @@
/*!
\internal
*/
-QString MpMpxCollectionDataPrivate::itemData( int index, MpMpxCollectionData::DataType type ) const
+QString MpMpxCollectionDataPrivate::itemData( int index, MpMpxCollectionData::DataType type )
{
TX_ENTRY_ARGS("index=" << index << ", type=" << type);
QString data;
@@ -318,6 +320,36 @@
/*!
\internal
+ */
+bool MpMpxCollectionDataPrivate::hasItemProperty( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+ TX_ENTRY_ARGS("index=" << index << ", type=" << type);
+ bool available = false;
+ TRAPD(err, available = DoHasItemPropertyL(index, type));
+ if ( err != KErrNone ) {
+ TX_LOG_ARGS("Error: " << err << "; should never get here.");
+ }
+ TX_EXIT
+ return available;
+}
+
+/*!
+ \internal
+ */
+bool MpMpxCollectionDataPrivate::hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+ TX_ENTRY_ARGS("index=" << index << ", type=" << type);
+ bool available = false;
+ TRAPD(err, available = DoHasAlbumSongPropertyL(index, type));
+ if ( err != KErrNone ) {
+ TX_LOG_ARGS("Error: " << err << "; should never get here.");
+ }
+ TX_EXIT
+ return available;
+}
+
+/*!
+ \internal
New data from MPX collection. This could be due to Open operation, in which case
context would have changed. This could also be due to Re-open after operations
such as delete, playlist renaming, playlist rearraging, etc., in which case the
@@ -413,6 +445,23 @@
/*!
\internal
+ This indicates data update during incremental open operation. This indicates
+ that media received in setMpxMedia() has updates.
+ */
+void MpMpxCollectionDataPrivate::incrementalOpenUpdate()
+{
+ TX_ENTRY_ARGS( "iNeedReload=" << iNeedReload);
+ if ( iNeedReload ) {
+ if ( itemId(iReloadRange.second) != -1 ) {
+ iNeedReload = false;
+ emit q_ptr->dataChanged(iReloadRange.first, iReloadRange.second);
+ }
+ }
+ TX_EXIT
+}
+
+/*!
+ \internal
*/
const CMPXMedia& MpMpxCollectionDataPrivate::containerMedia()
{
@@ -455,7 +504,7 @@
*/
int MpMpxCollectionDataPrivate::itemIndex( int itemUniqueId )
{
- return albumIdIndexMapping.value( itemUniqueId, -1 );
+ return iAlbumIdIndexMapping.value( itemUniqueId, -1 );
}
/*!
@@ -465,9 +514,47 @@
*/
int MpMpxCollectionDataPrivate::albumSongIndex( int songUniqueId )
{
- return albumSongIdIndexMapping.value( songUniqueId, -1 );
+ return iAlbumSongIdIndexMapping.value( songUniqueId, -1 );
+}
+
+/*!
+ \internal
+ Use to lookup playing song id to index of song in collection and playlist
+ view
+ */
+QList<int> MpMpxCollectionDataPrivate::songIndex( int songUniqueId )
+{
+ TX_ENTRY
+ if(iSongIdIndexMapping.empty()){
+ for ( int i = count() - 1 ; i >= 0 ; i-- ) {
+ iSongIdIndexMapping.insertMulti( itemId2( i ) , i );
+ }
+ }
+ TX_EXIT
+ return iSongIdIndexMapping.values( songUniqueId );
}
+/*!
+ \internal
+ Set item at index to corrupted depends on if viewing TBone
+ */
+void MpMpxCollectionDataPrivate::setCorruptValue( QModelIndex index, bool tBone)
+{
+ TX_ENTRY
+ TRAPD(err, DoSetCorruptValueL(index, tBone));
+ if ( err != KErrNone ) {
+ TX_LOG_ARGS("Error: " << err << "; should never get here.");
+ }
+ TX_EXIT
+}
+
+/*!
+ \internal
+ */
+void MpMpxCollectionDataPrivate::setReloadAlbumContent( bool reloadAlbum )
+{
+ iReloadAlbumContent = reloadAlbum;
+}
/*!
\internal
@@ -475,12 +562,12 @@
void MpMpxCollectionDataPrivate::loadAlbumsLookup()
{
//Clearing all the album ids.
- albumIdIndexMapping.clear();
+ iAlbumIdIndexMapping.clear();
if ( iContext == ECollectionContextAlbumsMediaWall) {
//Adding album ids and indixes to the hash, for itemIndex lookup.
//This is disabled for other containers to save resources.
for ( int i = count() - 1 ; i >= 0 ; i-- ) {
- albumIdIndexMapping.insert( itemId( i ) , i );
+ iAlbumIdIndexMapping.insert( itemId( i ) , i );
}
}
}
@@ -491,24 +578,66 @@
void MpMpxCollectionDataPrivate::loadAlbumSongsLookup()
{
//Clearing all the song ids.
- albumSongIdIndexMapping.clear();
- if ( iContext == ECollectionContextAlbumsMediaWall) {
- //Adding album song ids and indixes to the hash, for albumSongIndex lookup.
- //This is disabled for other containers to save resources.
- for ( int i = albumSongsCount() - 1 ; i >= 0 ; i-- ) {
- albumSongIdIndexMapping.insert( albumSongId( i ) , i );
- }
+ iAlbumSongIdIndexMapping.clear();
+ //Adding album song ids and indixes to the hash, for albumSongIndex lookup.
+ //This is disabled for other containers to save resources.
+ for ( int i = albumSongsCount() - 1 ; i >= 0 ; i-- ) {
+ iAlbumSongIdIndexMapping.insert( albumSongId( i ) , i );
}
}
/*!
\internal
*/
-void MpMpxCollectionDataPrivate::DoGetDataL( int index, MpMpxCollectionData::DataType type, QString& data ) const
+void MpMpxCollectionDataPrivate::setReloadRange( int index )
+{
+ TX_ENTRY_ARGS( "index=" << index);
+ if ( !iNeedReload ) {
+ iNeedReload = true;
+ iReloadRange.first = index;
+ iReloadRange.second = index;
+ }
+ else if ( index < iReloadRange.first ) {
+ iReloadRange.first = index;
+ }
+ else if ( index > iReloadRange.second ) {
+ iReloadRange.second = index;
+ }
+ TX_EXIT
+}
+
+/*!
+ \internal
+ */
+int MpMpxCollectionDataPrivate::itemId2( int index )
+{
+ TX_ENTRY_ARGS( "index=" << index );
+ int id = -1;
+ TRAPD( err, id = DoGetItemId2L( index ) );
+ if ( err == KErrNone ) {
+ TX_LOG_ARGS( "id=" << id );
+ }
+ else {
+ TX_LOG_ARGS( "Error: " << err << "; should never get here." );
+ }
+ TX_EXIT
+ return id;
+}
+
+/*!
+ \internal
+ */
+void MpMpxCollectionDataPrivate::DoGetDataL( int index, MpMpxCollectionData::DataType type, QString& data )
{
TX_ENTRY
CMPXMedia* currentMedia( iMediaArray->AtL( index ) );
+ if ( currentMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId) == KMPXInvalidItemId ) {
+ // Accessing a data that hasn't been fully fetched from the collection.
+ // This can happen during incremental open. Set the index as reload candidate.
+ setReloadRange(index);
+ }
+
TBuf<10> countBuf;
TInt count = 0;
switch ( type ) {
@@ -631,10 +760,29 @@
int MpMpxCollectionDataPrivate::DoGetItemIdL( int index )
{
CMPXMedia* currentMedia( iMediaArray->AtL( index ) );
- if ( !currentMedia->IsSupported( KMPXMediaGeneralId ) ) {
- User::Leave(KErrNotFound);
+ if ( currentMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId) == KMPXInvalidItemId ) {
+ return -1;
+ }
+ else {
+ int id1 = (currentMedia->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId )).iId1;
+ int id2 = (currentMedia->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId )).iId2;
+ TX_LOG_ARGS( "id1=" << id1 << ", id2=" << id2 );
+ return (currentMedia->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId )).iId1;
}
- return currentMedia->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+}
+
+/*!
+ \internal
+ */
+int MpMpxCollectionDataPrivate::DoGetItemId2L( int index )
+{
+ CMPXMedia* currentMedia( iMediaArray->AtL( index ) );
+ if ( currentMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId) == KMPXInvalidItemId ) {
+ return -1;
+ }
+ else {
+ return (currentMedia->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId )).iId2;
+ }
}
/*!
@@ -646,10 +794,12 @@
const CMPXMediaArray* songs = album->Value<CMPXMediaArray>(KMPXMediaArrayContents);
User::LeaveIfNull(const_cast<CMPXMediaArray*>(songs));
CMPXMedia* song = songs->AtL(index);
- if ( !song->IsSupported( KMPXMediaGeneralId ) ) {
- User::Leave(KErrNotFound);
+ if ( song->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId) == KMPXInvalidItemId ) {
+ return -1;
}
- return song->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+ else {
+ return song->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+ }
}
/*!
@@ -683,16 +833,18 @@
iCurrentAlbumIndex = index;
bool songsAvailable = false;
- CMPXMedia* album( iMediaArray->AtL( index ) );
- if ( album->IsSupported(KMPXMediaArrayContents) ) {
- // We've previously fetched the songs for this album so
- // all we do now is populate the list with the song titles.
- const CMPXMediaArray* songs = album->Value<CMPXMediaArray>(KMPXMediaArrayContents);
- iAlbumSongCount = songs->Count();
- songsAvailable = true;
- TX_LOG_ARGS("Songs available.");
- loadAlbumSongsLookup();
- emit q_ptr->refreshAlbumSongs();
+ if (!iReloadAlbumContent){
+ CMPXMedia* album( iMediaArray->AtL( index ) );
+ if ( album->IsSupported(KMPXMediaArrayContents) ) {
+ // We've previously fetched the songs for this album so
+ // all we do now is populate the list with the song titles.
+ const CMPXMediaArray* songs = album->Value<CMPXMediaArray>(KMPXMediaArrayContents);
+ iAlbumSongCount = songs->Count();
+ songsAvailable = true;
+ TX_LOG_ARGS("Songs available.");
+ loadAlbumSongsLookup();
+ emit q_ptr->refreshAlbumSongs();
+ }
}
TX_EXIT
return songsAvailable;
@@ -737,9 +889,75 @@
/*!
\internal
*/
+bool MpMpxCollectionDataPrivate::DoHasItemPropertyL( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+ TX_ENTRY
+ CMPXMedia* currentMedia( iMediaArray->AtL( index ) );
+
+ TInt flags(0);
+ if ( currentMedia->IsSupported( KMPXMediaGeneralFlags ) ) {
+ flags = currentMedia->ValueTObjectL<TUint>( KMPXMediaGeneralFlags );
+ }
+ switch ( type ) {
+ case MpMpxCollectionData::Corrupted:
+ if ( ( flags ) & ( KMPXMediaGeneralFlagsIsCorrupted ) ){
+ return true;
+ }
+ break;
+ case MpMpxCollectionData::DrmExpired:
+ if ( ( flags ) & ( KMPXMediaGeneralFlagsIsDrmLicenceInvalid ) ){
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+ TX_EXIT
+ return false;
+}
+
+/*!
+ \internal
+ */
+bool MpMpxCollectionDataPrivate::DoHasAlbumSongPropertyL( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+ TX_ENTRY
+ CMPXMedia* album( iMediaArray->AtL( iCurrentAlbumIndex ) );
+ if ( album->IsSupported(KMPXMediaArrayContents) ) {
+ const CMPXMediaArray* songs = album->Value<CMPXMediaArray>(KMPXMediaArrayContents);
+ User::LeaveIfNull(const_cast<CMPXMediaArray*>(songs));
+ CMPXMedia* song = songs->AtL(index);
+ TInt flags(0);
+ if ( song->IsSupported( KMPXMediaGeneralFlags ) ) {
+ flags = song->ValueTObjectL<TUint>( KMPXMediaGeneralFlags );
+ }
+ switch ( type ) {
+ case MpMpxCollectionData::Corrupted:
+ if ( ( flags ) & ( KMPXMediaGeneralFlagsIsCorrupted ) ){
+ return true;
+ }
+ break;
+ case MpMpxCollectionData::DrmExpired:
+ if ( ( flags ) & ( KMPXMediaGeneralFlagsIsDrmLicenceInvalid ) ){
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ }
+ TX_EXIT
+ return false;
+}
+/*!
+ \internal
+ */
void MpMpxCollectionDataPrivate::SetCollectionContextL()
{
TX_ENTRY
+ // Clear Song Index Hash when context switched
+ iSongIdIndexMapping.clear();
TMPXGeneralType containerType( EMPXNoType );
if ( iContainerMedia->IsSupported( KMPXMediaGeneralType ) ) {
containerType = iContainerMedia->ValueTObjectL<TMPXGeneralType>( KMPXMediaGeneralType );
@@ -802,7 +1020,7 @@
iContainerMedia = CMPXMedia::NewL(entries);
iMediaArray = const_cast<CMPXMediaArray*>(iContainerMedia->Value<CMPXMediaArray>( KMPXMediaArrayContents ) );
TX_LOG_ARGS("media count=" << iMediaArray->Count() );
-
+ iReloadAlbumContent = false;
SetCollectionContextL();
TX_EXIT
}
@@ -829,4 +1047,25 @@
TX_EXIT
}
+/*!
+ \internal
+ */
+void MpMpxCollectionDataPrivate::DoSetCorruptValueL(QModelIndex index, bool tBone)
+{
+ TX_ENTRY
+ if (tBone){
+ CMPXMedia* album( iMediaArray->AtL( iCurrentAlbumIndex ) );
+ if ( album->IsSupported(KMPXMediaArrayContents) ) {
+ const CMPXMediaArray* songs = album->Value<CMPXMediaArray>(KMPXMediaArrayContents);
+ User::LeaveIfNull(const_cast<CMPXMediaArray*>(songs));
+ CMPXMedia* song = songs->AtL( index.row() );
+ song->SetTObjectValueL<TUint>( KMPXMediaGeneralFlags,KMPXMediaGeneralFlagsIsCorrupted );
+ }
+ }
+ else {
+ CMPXMedia* song( iMediaArray->AtL( index.row() ) );
+ song->SetTObjectValueL<TUint>( KMPXMediaGeneralFlags,KMPXMediaGeneralFlagsIsCorrupted );
+ }
+ TX_EXIT
+}
--- a/mpdata/src/mpplaybackdata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/src/mpplaybackdata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -68,6 +68,13 @@
title, artist and album name.
*/
+/*!
+ \fn void fileCorrupted()
+
+ This signal is emitted when a file is found corrupted. Call by
+ PlayBackWrapper.
+ */
+
/*!
@@ -174,16 +181,10 @@
{
TX_ENTRY_ARGS( "artist = " << artist )
bool change = false;
- // data is different or mArtist was not set befor or it was reset.
- // When artist is empty and mArtist is empty mArtist should be unknown text.
+ // data is different or mArtist was not set before or it was reset.
if ( artist != mArtist || mArtist.isNull()) {
change = true;
- if ( artist.isEmpty() ){
- mArtist = hbTrId( "txt_mus_other_unknown3" );
- }
- else {
- mArtist = artist;
- }
+ mArtist = artist;
}
TX_EXIT
return change;
@@ -205,16 +206,10 @@
{
TX_ENTRY_ARGS( "album = " << album )
bool change = false;
- // data is different or mAlbum was not set befor or it was reset.
- // when album is empty and mAlbum is empty mAlbum should be unknown text.
+ // data is different or mAlbum was not set before or it was reset.
if ( album != mAlbum || mAlbum.isNull() ) {
change = true;
- if ( album.isEmpty() ){
- mAlbum = hbTrId( "txt_mus_other_unknown4" );
- }
- else{
- mAlbum = album;
- }
+ mAlbum = album;
}
TX_EXIT
return change;
@@ -411,6 +406,14 @@
}
/*!
+ Emit fileCorrupted(id) signal when a file with id is corrupted
+*/
+void MpPlaybackData::setCorrupted( int id )
+{
+ emit fileCorrupted( id );
+}
+
+/*!
Slot to handle the album art thumb.
*/
void MpPlaybackData::thumbnailReady(
--- a/mpdata/src/mpsongdata_p.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/src/mpsongdata_p.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -146,79 +146,7 @@
QString MpSongDataPrivate::genre() const
{
TX_LOG
- QString localizedString(mGenre);
-
- if ( mGenre == "Acoustic" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_acoustic" );
- }
- else if ( mGenre == "Alternative" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_alternative" );
- }
- else if ( mGenre == "Blues" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_blues" );
- }
- else if ( mGenre == "Classical" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_classical" );
- }
- else if ( mGenre == "Country" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_country" );
- }
- else if ( mGenre == "Dance" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_dance" );
- }
- else if ( mGenre == "Easy Listening" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_easy_listening" );
- }
- else if ( mGenre == "Electronic" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_electronic" );
- }
- else if ( mGenre == "Folk" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_folk" );
- }
- else if ( mGenre == "Hip-Hop" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_hiphop" );
- }
- else if ( mGenre == "Jazz" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_jazz" );
- }
- else if ( mGenre == "Latin" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_latin" );
- }
- else if ( mGenre == "Metal" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_metal" );
- }
- else if ( mGenre == "New Age" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_new_age" );
- }
- else if ( mGenre == "Other" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_other" );
- }
- else if ( mGenre == "Pop" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_pop" );
- }
- else if ( mGenre == "R&B" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_rb" );
- }
- else if ( mGenre == "Rap" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_rap" );
- }
- else if ( mGenre == "Reggae" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_reggae" );
- }
- else if ( mGenre == "Rock" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_rock" );
- }
- else if ( mGenre == "Soundtrack" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_soundtrack" );
- }
- else if ( mGenre == "Spoken" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_spoken" );
- }
- else if ( mGenre == "World" ) {
- localizedString = hbTrId( "txt_mus_dblist_genre_val_world" );
- }
- TX_EXIT_ARGS( "Logical String = " << localizedString );
- return localizedString;
+ return mGenre;
}
/*!
--- a/mpdata/tsrc/unittest_mpcollectiondatamodel/inc/unittest_mpcollectiondatamodel.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/tsrc/unittest_mpcollectiondatamodel/inc/unittest_mpcollectiondatamodel.h Thu Sep 02 20:24:03 2010 +0300
@@ -23,6 +23,7 @@
class QTranslator;
class MpCollectionDataModel;
class MpMpxCollectionData;
+class MpPlaybackData;
class TestHelper;
class TestMpCollectionDataModel : public QObject
@@ -76,12 +77,14 @@
void testMimeData();
void testDropMimeData();
void testSetContext();
+ void testFileCorrupted();
private:
MpCollectionDataModel *mTest;
TestHelper *mHelper;
MpMpxCollectionData *mStubData;
+ MpPlaybackData *mStubPlaybackData;
QTranslator *mMpTranslator; // Own
};
--- a/mpdata/tsrc/unittest_mpcollectiondatamodel/src/unittest_mpcollectiondatamodel.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/tsrc/unittest_mpcollectiondatamodel/src/unittest_mpcollectiondatamodel.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -30,6 +30,7 @@
#include "unittest_helper.h"
#include "stub/inc/mpcollectionalbumartmanager.h"
#include "stub/inc/mpmpxcollectiondata.h"
+#include "stub/inc/mpplaybackdata.h"
// Do this so we can access all member variables.
#define private public
@@ -58,6 +59,7 @@
: mTest(0),
mHelper(0),
mStubData(0),
+ mStubPlaybackData(0),
mMpTranslator(0)
{
}
@@ -67,6 +69,7 @@
delete mTest;
delete mHelper;
delete mStubData;
+ delete mStubPlaybackData;
delete mMpTranslator;
}
@@ -86,6 +89,7 @@
}
mStubData = new MpMpxCollectionData();
+ mStubPlaybackData = new MpPlaybackData(this);
mHelper = new TestHelper();
}
@@ -96,6 +100,8 @@
{
delete mStubData;
mStubData = 0;
+ delete mStubPlaybackData;
+ mStubPlaybackData = 0;
delete mHelper;
mHelper = 0;
}
@@ -105,7 +111,7 @@
*/
void TestMpCollectionDataModel::init()
{
- mTest = new MpCollectionDataModel(mStubData);
+ mTest = new MpCollectionDataModel(mStubData, mStubPlaybackData);
MpMpxCollectionData::resetItemDataCounter();
mTest->mCollectionData->mItemDataReturn = true;
mTest->mCollectionData->mCollectionTitleReturn = true;
@@ -966,4 +972,13 @@
QCOMPARE(mTest->mAlbumIndexOffset, 0);
}
+/*!
+ Tests fileCorrupted()
+ */
+void TestMpCollectionDataModel::testFileCorrupted()
+{
+
+
+}
+
// End of file
--- a/mpdata/tsrc/unittest_mpcollectiondatamodel/stub/inc/mpmpxcollectiondata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/tsrc/unittest_mpcollectiondatamodel/stub/inc/mpmpxcollectiondata.h Thu Sep 02 20:24:03 2010 +0300
@@ -19,6 +19,7 @@
#define MPMPXCOLLECTIONDATA_H
#include <QObject>
+#include <QAbstractListModel>
#include "mpmpxcollectionviewdefs.h"
@@ -36,6 +37,11 @@
Count,
AlbumArtUri
};
+
+ enum DataProperty {
+ Corrupted,
+ DrmExpired
+ };
// Test utility functions
static int getInitCounter();
@@ -57,6 +63,8 @@
int count() const;
QString collectionTitle() const;
QString itemData( int index, MpMpxCollectionData::DataType type ) const;
+ bool hasItemProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
+ bool hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
int containerId();
int itemId(int index);
@@ -65,6 +73,9 @@
void insertCachedItem(int index);
void setContext( TCollectionContext context );
+ QList<int> songIndex( int songUniqueId );
+ void setCorruptValue(QModelIndex index, bool tBone );
+ void setReloadAlbumContent( bool reloadAlbum );
signals:
--- a/mpdata/tsrc/unittest_mpcollectiondatamodel/stub/src/mpmpxcollectiondata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/tsrc/unittest_mpcollectiondatamodel/stub/src/mpmpxcollectiondata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -195,6 +195,14 @@
/*!
Stub function.
*/
+bool MpMpxCollectionData::hasItemProperty( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+
+}
+
+/*!
+ Stub function.
+ */
int MpMpxCollectionData::containerId()
{
return 65535;
@@ -246,3 +254,27 @@
return ;
}
+/*!
+ Stub function.
+ */
+QList<int> MpMpxCollectionData::songIndex( int songUniqueId )
+ {
+
+ }
+
+/*!
+ Stub function.
+ */
+void MpMpxCollectionData::setCorruptValue(QModelIndex index, bool tBone )
+ {
+
+ }
+
+/*!
+ Stub function.
+ */
+void MpMpxCollectionData::setReloadAlbumContent( bool reloadAlbum )
+ {
+
+ }
+
--- a/mpdata/tsrc/unittest_mpmpxcollectiondata/inc/unittest_mpmpxcollectiondata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/tsrc/unittest_mpmpxcollectiondata/inc/unittest_mpmpxcollectiondata.h Thu Sep 02 20:24:03 2010 +0300
@@ -62,6 +62,9 @@
void testSetAlbumContent();
void testSetCurrentAlbum();
void testAlbumSongData();
+ void testHasItemProperty();
+ void testHasAlbumSongProperty();
+
private:
--- a/mpdata/tsrc/unittest_mpmpxcollectiondata/src/unittest_mpmpxcollectiondata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpdata/tsrc/unittest_mpmpxcollectiondata/src/unittest_mpmpxcollectiondata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -21,6 +21,7 @@
#include <apacmdln.h>
#include <mpxmediamusicdefs.h>
#include <mpxmediacontainerdefs.h>
+#include <mpxmediageneraldefs.h>
#include <mpxmedia.h>
#include <mpxmediaarray.h>
#include <mpxcollectionpath.h>
@@ -656,7 +657,7 @@
TCollectionContext context = qvariant_cast<TCollectionContext>(spy.at(0).at(0));
QCOMPARE(context, ECollectionContextPlaylistSongs);
QCOMPARE(mTestPrivate->iContext, ECollectionContextPlaylistSongs);
- QVERIFY(mTestPrivate->albumIdIndexMapping.isEmpty());
+ QVERIFY(mTestPrivate->iAlbumIdIndexMapping.isEmpty());
}
/*!
@@ -692,12 +693,12 @@
TCollectionContext context = qvariant_cast<TCollectionContext>(spy.at(0).at(0));
QCOMPARE(context, ECollectionContextAlbumsMediaWall);
QCOMPARE(mTestPrivate->iContext, ECollectionContextAlbumsMediaWall);
- QVERIFY(!mTestPrivate->albumIdIndexMapping.isEmpty());
+ QVERIFY(!mTestPrivate->iAlbumIdIndexMapping.isEmpty());
for (TInt i =0; i < count; i++) {
QCOMPARE(mTest->itemIndex(KAllSongsTestData[i].GeneralId),i);
}
mTest->setContext(ECollectionContextPlaylistSongs);
- QVERIFY(mTestPrivate->albumIdIndexMapping.isEmpty());
+ QVERIFY(mTestPrivate->iAlbumIdIndexMapping.isEmpty());
CleanupStack::PopAndDestroy(array);
}
@@ -860,3 +861,115 @@
mTestPrivate->iMediaArray = NULL;
CleanupStack::PopAndDestroy(array);
}
+
+/*!
+ Tests hasAlbumSongProperty().
+ */
+void TestMpMpxCollectionData::testHasItemProperty()
+{
+ CMPXMediaArray* array = CMPXMediaArray::NewL();
+ CleanupStack::PushL(array);
+ mTestPrivate->iMediaArray = array;
+
+ TInt count = sizeof(KAllSongsTestData)/sizeof(TTestAttrs);
+ for (TInt i =0; i < count; i++) {
+
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+ media->SetTextValueL(KMPXMediaGeneralTitle, TPtrC(reinterpret_cast<const TUint16*>(KAllSongsTestData[i].GeneralTitle)));
+ media->SetTextValueL(KMPXMediaMusicArtist, TPtrC(reinterpret_cast<const TUint16*>(KAllSongsTestData[i].MusicArtist)));
+ media->SetTObjectValueL<TInt>(KMPXMediaGeneralCount, KAllSongsTestData[i].GeneralCount);
+ media->SetTextValueL(KMPXMediaMusicAlbumArtFileName, TPtrC(reinterpret_cast<const TUint16*>(KAllSongsTestData[i].MusicAlbumArtFileName)));
+ array->AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ mTestPrivate->iMediaArray = array;
+
+ const TDesC& title = TPtrC(reinterpret_cast<const TUint16*>(KAllSongsTestData[i].GeneralTitle));
+ QCOMPARE(mTest->itemData( i, MpMpxCollectionData::Title), QString::fromUtf16( title.Ptr(), title.Length()));
+
+ const TDesC& artist = TPtrC(reinterpret_cast<const TUint16*>(KAllSongsTestData[i].MusicArtist));
+ QCOMPARE(mTest->itemData( i, MpMpxCollectionData::Artist), QString::fromUtf16( artist.Ptr(), artist.Length()));
+
+ QCOMPARE(mTest->itemData( i, MpMpxCollectionData::Count), QString().setNum(1));
+
+ const TDesC& albumArtUri = TPtrC(reinterpret_cast<const TUint16*>(KAllSongsTestData[i].MusicAlbumArtFileName));
+ QCOMPARE(mTest->itemData( i, MpMpxCollectionData::AlbumArtUri), QString::fromUtf16( albumArtUri.Ptr(), albumArtUri.Length()));
+
+ }
+ mTestPrivate->iMediaArray = array;
+
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+ array->AppendL(*media);
+ mTestPrivate->iMediaArray = array;
+ media->SetTextValueL(KMPXMediaGeneralTitle,KNullDesC );
+ media->SetTextValueL(KMPXMediaMusicArtist, KNullDesC);
+ media->SetTObjectValueL<TInt>(KMPXMediaGeneralCount, 0);
+ media->SetTextValueL(KMPXMediaMusicAlbumArtFileName, KNullDesC);
+ array->AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ mTestPrivate->iMediaArray = array;
+
+ //Media without attributes.
+ QVERIFY(mTest->itemData( count, MpMpxCollectionData::Title).isNull());
+ QVERIFY(mTest->itemData( count, MpMpxCollectionData::Artist).isNull());
+ QCOMPARE(mTest->itemData( count, MpMpxCollectionData::Count), QString().setNum(0));
+ QVERIFY(mTest->itemData( count, MpMpxCollectionData::AlbumArtUri).isNull());
+
+ //Media with empty attributes.
+ QVERIFY(mTest->itemData( count + 1, MpMpxCollectionData::Title).isNull());
+ QVERIFY(mTest->itemData( count + 1, MpMpxCollectionData::Artist).isNull());
+ QCOMPARE(mTest->itemData( count + 1, MpMpxCollectionData::Count), QString().setNum(0));
+ QVERIFY(mTest->itemData( count + 1, MpMpxCollectionData::AlbumArtUri).isNull());
+
+ // Test Attributes that are not implemented yet:
+ // Uri, Duration, Album, Genre, Rating
+ QVERIFY(mTest->itemData( 0, MpMpxCollectionData::Uri).isNull());
+ QVERIFY(mTest->itemData( 0, MpMpxCollectionData::Duration).isNull());
+ QVERIFY(mTest->itemData( 0, MpMpxCollectionData::Album).isNull());
+ QVERIFY(mTest->itemData( 0, MpMpxCollectionData::Genre).isNull());
+ QVERIFY(mTest->itemData( 0, MpMpxCollectionData::Rating).isNull());
+
+ CleanupStack::PopAndDestroy(array);
+ mTestPrivate->iMediaArray = NULL;
+
+}
+
+/*!
+ Tests hasAlbumSongProperty().
+ */
+void TestMpMpxCollectionData::testHasAlbumSongProperty()
+{
+ // Populate the media (album) with songs. This is basically
+ // simulating setAlbumContent().
+ CMPXMediaArray* array = CMPXMediaArray::NewL();
+ CleanupStack::PushL(array);
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+ CMPXMediaArray* songArray = CMPXMediaArray::NewL();
+ CleanupStack::PushL(songArray);
+ CMPXMedia* song = CMPXMedia::NewL();
+ CleanupStack::PushL(song);
+ song->SetTObjectValueL<TUint>( KMPXMediaGeneralFlags,KMPXMediaGeneralFlagsIsCorrupted );
+ songArray->AppendL(*song);
+ CleanupStack::PopAndDestroy(song);
+ CMPXMedia* song1 = CMPXMedia::NewL();
+ CleanupStack::PushL(song1);
+ song1->SetTObjectValueL<TUint>( KMPXMediaGeneralFlags,KMPXMediaGeneralFlagsIsDrmLicenceInvalid );
+ songArray->AppendL(*song1);
+ CleanupStack::PopAndDestroy(song1);
+
+ media->SetCObjectValueL(KMPXMediaArrayContents, songArray);
+ array->AppendL(*media);
+
+ mTestPrivate->iMediaArray = array;
+ mTestPrivate->iCurrentAlbumIndex = 0;
+
+ QCOMPARE(mTest->hasAlbumSongProperty( 0, MpMpxCollectionData::Corrupted), true);
+ QCOMPARE(mTest->hasAlbumSongProperty( 1, MpMpxCollectionData::DrmExpired), true);
+
+ CleanupStack::PopAndDestroy(songArray);
+ CleanupStack::PopAndDestroy(media);
+ mTestPrivate->iMediaArray = NULL;
+ CleanupStack::PopAndDestroy(array);
+}
--- a/mpengine/bwins/mpengineu.def Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/bwins/mpengineu.def Thu Sep 02 20:24:03 2010 +0300
@@ -138,4 +138,5 @@
?reorderPlaylist@MpEngine@@QAEXHHHH@Z @ 137 NONAME ; void MpEngine::reorderPlaylist(int, int, int, int)
?scanFinished@MpSongScanner@@IAEXHH@Z @ 138 NONAME ; void MpSongScanner::scanFinished(int, int)
?setLoudness@MpEngine@@QAEX_N@Z @ 139 NONAME ; void MpEngine::setLoudness(bool)
+ ?corruptedStop@MpEngine@@IAEXXZ @ 140 NONAME ; void MpEngine::corruptedStop(void)
--- a/mpengine/eabi/mpengineu.def Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/eabi/mpengineu.def Thu Sep 02 20:24:03 2010 +0300
@@ -138,4 +138,5 @@
_ZTV13MpSongScanner @ 137 NONAME
_ZTV15MpEngineFactory @ 138 NONAME
_ZTV8MpEngine @ 139 NONAME
+ _ZN8MpEngine13corruptedStopEv @ 140 NONAME
--- a/mpengine/inc/mpmpxplaybackframeworkwrapper.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/inc/mpmpxplaybackframeworkwrapper.h Thu Sep 02 20:24:03 2010 +0300
@@ -50,7 +50,9 @@
signals:
- void volumePropertyChanged( MpCommon::MpVolumeProperty property, int value );
+ void volumePropertyChanged( MpCommon::MpVolumeProperty property, int value );
+ void corruptedStop();
+ void fileCorrupted(int fileId);
public slots:
--- a/mpengine/inc/mpmpxplaybackframeworkwrapper_p.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/inc/mpmpxplaybackframeworkwrapper_p.h Thu Sep 02 20:24:03 2010 +0300
@@ -87,6 +87,7 @@
void DoPlayL( QString aFilename );
void DoPlayL( const XQSharableFile& file );
void DoHandlePlaybackMessageL( const CMPXMessage& aMessage );
+ void DoHandlePlaybackErrorL( const TInt aError );
void ForceStopL();
void UpdateStateL();
void DoRetrieveSongDetailsL( bool detailsRequest );
--- a/mpengine/src/mpengine.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/src/mpengine.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -188,6 +188,12 @@
such as EPbPropertyVolume, EPbPropertyMaxVolume, EPbPropertyMute.
*/
+/*!
+ \fn void corruptedStop();
+
+ This signal is emitted when framework determines the corrupted song is the last
+ song of the playlist.
+*/
/*!
Constructs music player engine.
@@ -199,7 +205,7 @@
mMpxPlaybackWrapper(0),
mAudioEffectsWrapper(0),
mEqualizerWrapper(0),
- mCurrentPresetIndex(KEqualizerPresetNone),
+ mCurrentPresetIndex(0),
mSongData(0),
mUsbBlockingState(USB_NotConnected),
mPreviousUsbState(USB_NotConnected),
@@ -289,7 +295,9 @@
mMpxPlaybackWrapper = new MpMpxPlaybackFrameworkWrapper( mHostUid, mSongData );
connect( this, SIGNAL( libraryUpdated() ),
mMpxPlaybackWrapper, SLOT( closeCurrentPlayback() ) );
- connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
+ connect( mMpxPlaybackWrapper, SIGNAL ( corruptedStop() ),
+ this, SIGNAL( corruptedStop() ));
+ connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
this, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ) );
// AudioEffects wrapper
@@ -326,7 +334,9 @@
mMpxPlaybackWrapper = new MpMpxPlaybackFrameworkWrapper( mHostUid, 0 );
connect( this, SIGNAL( libraryUpdated() ),
mMpxPlaybackWrapper, SLOT( closeCurrentPlayback() ) );
- connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
+ connect( mMpxPlaybackWrapper, SIGNAL ( corruptedStop() ),
+ this, SIGNAL( corruptedStop() ));
+ connect( mMpxPlaybackWrapper, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ),
this, SIGNAL( volumePropertyChanged( MpCommon::MpVolumeProperty, int ) ) );
}
@@ -1122,9 +1132,9 @@
{
TX_ENTRY
- mCurrentPresetIndex = KEqualizerPresetNone;
+ mCurrentPresetIndex = 0;
// Store in CenRep file
- MpSettingsManager::setPreset( mCurrentPresetIndex );
+ MpSettingsManager::setPreset( KEqualizerPresetNone );
// Notify playback framework of the change.
mMpxPlaybackWrapper->applyEqualizer();
@@ -1175,9 +1185,7 @@
// Get preset id from cenrep
TInt presetKey( MpSettingsManager::preset() );
- //Set the current preset index. 1 is added to index because index 0 represent "Off" at UI level.
mCurrentPresetIndex = mEqualizerWrapper->getPresetIndex( presetKey );
- mCurrentPresetIndex++;
emit equalizerReady();
TX_EXIT
--- a/mpengine/src/mpequalizerframeworkwrapper_p.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/src/mpequalizerframeworkwrapper_p.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -120,14 +120,15 @@
{
TX_ENTRY_ARGS( "Preset Name Key = " << presetNameKey);
- int presetIndex = KEqualizerPresetNone;
+ int presetIndex = 0;
if ( mEqualizerUtility && presetNameKey != KEqualizerPresetNone ) {
TArray<TEfAudioEqualizerUtilityPreset> presetArray = mEqualizerUtility->Presets();
for ( TInt i = 0; i < presetArray.Count(); i++ ) {
TX_LOG_ARGS("presetArray[" << i << "].iPresetNameKey ("
<< presetArray[i].iPresetNameKey << ") vs presetId (" <<presetNameKey << ")");
if ( presetArray[i].iPresetNameKey == static_cast<TUint32>( presetNameKey ) ) {
- presetIndex = i;
+ //Set the current preset index. 1 is added to index because index 0 represent "Off" at UI level.
+ presetIndex = i+1;
break;
}
}
--- a/mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/src/mpmpxcollectionframeworkwrapper_p.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -59,9 +59,8 @@
#include "mpsettingsmanager.h"
#include "mpsongdata.h"
-const TInt KIncrementalDelayNone = 0;
-const TInt KIncrementalDelayHalfSecond = 500000;
-const TInt KIncrementalFetchBlockSize = 400;
+const TInt KIncrementalDelay = 0;
+const TInt KIncrementalFetchBlockSize = 1000;
const TInt KMPXChunkSize = 100; // number of songs added in each chunk, IncAddL
_LIT( KPlaylistPath, "C:\\Data\\Playlists\\" ); // Todo
@@ -452,13 +451,15 @@
iFirstIncrementalOpen = EFalse;
if( iShuffleAll ) {
iShuffleAll = EFalse;
- TX_ENTRY_ARGS( "Path is ready" );
+ TX_LOG_ARGS( "Path is ready" );
DoPlayAllSongsPlaylistL();
-
}
iCollectionData->setMpxMedia( aEntries, iReopen );
iReopen = EFalse;
}
+ else {
+ iCollectionData->incrementalOpenUpdate();
+ }
}
else {
TX_LOG_ARGS( "Error: " << aError << "; should never get here." );
@@ -749,10 +750,9 @@
RArray<TMPXAttribute> attrs;
CleanupClosePushL( attrs );
TArray<TMPXAttribute> ary = attrs.Array();
- iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
+ iIncrementalOpenUtil->SetDelay( KIncrementalDelay );
iIncrementalOpenUtil->StartL( ary, KIncrementalFetchBlockSize,
- KErrNotFound, CMPXCollectionOpenUtility::EFetchDown );
- iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
+ 0, CMPXCollectionOpenUtility::EFetchDown );
CleanupStack::PopAndDestroy( &attrs );
TX_EXIT
}
--- a/mpengine/src/mpmpxisolatedcollectionhelper.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/src/mpmpxisolatedcollectionhelper.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -21,14 +21,10 @@
#include <mpxcollectionopenutility.h>
#include "mpmpxisolatedcollectionhelper.h"
-#include "mpxlog.h"
-
-
+#include "mptrace.h"
-const TInt KIncrementalDelayNone = 0;
-const TInt KIncrementalDelayHalfSecond = 1000000;
-const TInt KIncrementalFetchBlockSize = 20;
-
+const TInt KIncrementalDelay = 0;
+const TInt KIncrementalFetchBlockSize = 1000;
/*!
@@ -42,44 +38,45 @@
\internal
Two-phased constructor.
*/
-CMpMpxIsolatedCollectionHelper* CMpMpxIsolatedCollectionHelper::NewL(
+CMpMpxIsolatedCollectionHelper* CMpMpxIsolatedCollectionHelper::NewL(
MMpMpxIsolatedCollectionHelperObserver* aObserver )
- {
+{
CMpMpxIsolatedCollectionHelper* self = NewLC( aObserver );
CleanupStack::Pop( self );
return self;
- }
+}
/*!
\internal
Two-phased constructor.
*/
-CMpMpxIsolatedCollectionHelper* CMpMpxIsolatedCollectionHelper::NewLC(
+CMpMpxIsolatedCollectionHelper* CMpMpxIsolatedCollectionHelper::NewLC(
MMpMpxIsolatedCollectionHelperObserver* aObserver )
- {
+{
CMpMpxIsolatedCollectionHelper* self =
new ( ELeave ) CMpMpxIsolatedCollectionHelper( aObserver );
CleanupStack::PushL( self );
self->ConstructL();
return self;
- }
+}
/*!
\internal
Destructor
*/
CMpMpxIsolatedCollectionHelper::~CMpMpxIsolatedCollectionHelper()
- {
+{
delete iIncrementalOpenUtil;
- }
-
+}
+
/*!
\internal
Opens an isolated collection with the /a path.
*/
void CMpMpxIsolatedCollectionHelper::OpenCollectionL( CMPXCollectionPath& aPath, TInt aIndex, MpOpenMode aMode )
- {
+{
+ TX_ENTRY
//Using incremental open to open the collection.
iOpenMode = aMode;
// Cancel any reads
@@ -90,12 +87,12 @@
RArray<TMPXAttribute> attrs;
CleanupClosePushL( attrs );
TArray<TMPXAttribute> ary = attrs.Array();
- iIncrementalOpenUtil->SetDelay( KIncrementalDelayNone );
+ iIncrementalOpenUtil->SetDelay( KIncrementalDelay );
iIncrementalOpenUtil->StartL( aPath, ary, KIncrementalFetchBlockSize,
- aIndex, CMPXCollectionOpenUtility::EFetchNormal );
- iIncrementalOpenUtil->SetDelay( KIncrementalDelayHalfSecond );
+ aIndex, CMPXCollectionOpenUtility::EFetchDown );
CleanupStack::PopAndDestroy( &attrs );
- }
+ TX_EXIT
+}
/*!
\internal
@@ -105,79 +102,84 @@
: iObserver( aObserver ),
iIncrementalOpenUtil( 0 ),
iFirstIncrementalOpen( EFalse )
- {
- }
+{
+}
/*!
\internal
Leaving constructor
*/
void CMpMpxIsolatedCollectionHelper::ConstructL()
- {
+{
iIncrementalOpenUtil = CMPXCollectionOpenUtility::NewL( this, KMcModeIsolated );
-
- }
+}
/*!
\internal
reimp
*/
-void CMpMpxIsolatedCollectionHelper::HandleOpenL(
+void CMpMpxIsolatedCollectionHelper::HandleOpenL(
const CMPXMedia& aEntries,
- TInt /*aIndex*/,
- TBool /*aComplete*/,
+ TInt aIndex,
+ TBool aComplete,
TInt aError )
- {
- if ( iFirstIncrementalOpen )
- {
+{
+ Q_UNUSED( aIndex );
+ Q_UNUSED( aComplete );
+ TX_ENTRY_ARGS( "aError=" << aError << "aComplete=" << aComplete );
+ if ( iFirstIncrementalOpen ) {
CMPXCollectionPath* cPath = NULL;
iFirstIncrementalOpen = EFalse;
switch( iOpenMode ) {
- case RestorePathMode:
- cPath = iIncrementalOpenUtil->PathL();
- CleanupStack::PushL( cPath );
- iObserver->HandleIsolatedOpenRestorePathL( *cPath, aError );
- CleanupStack::PopAndDestroy( cPath );
-
- break;
- case DefaultMode:
- default:
- iObserver->HandleIsolatedOpenL( aEntries, aError );
- break;
- }
-
- }
+ case RestorePathMode:
+ cPath = iIncrementalOpenUtil->PathL();
+ CleanupStack::PushL( cPath );
+ iObserver->HandleIsolatedOpenRestorePathL( *cPath, aError );
+ CleanupStack::PopAndDestroy( cPath );
+ break;
+ case DefaultMode:
+ default:
+ iObserver->HandleIsolatedOpenL( aEntries, aError );
+ break;
+ }
}
+ TX_EXIT
+}
/*!
\internal
reimp
*/
-void CMpMpxIsolatedCollectionHelper::HandleOpenL(
- const CMPXCollectionPlaylist& /*aPlaylist*/,
- TInt /*aError*/ )
- {
- }
+void CMpMpxIsolatedCollectionHelper::HandleOpenL(
+ const CMPXCollectionPlaylist& aPlaylist,
+ TInt aError )
+{
+ Q_UNUSED( aPlaylist );
+ Q_UNUSED( aError );
+}
/*!
\internal
reimp
*/
-void CMpMpxIsolatedCollectionHelper::HandleCollectionMessage(
- CMPXMessage* /*aMsg*/,
- TInt /*aErr*/ )
- {
- }
+void CMpMpxIsolatedCollectionHelper::HandleCollectionMessage(
+ CMPXMessage* aMsg,
+ TInt aErr )
+{
+ Q_UNUSED( aMsg );
+ Q_UNUSED( aErr );
+}
/*!
\internal
reimp
*/
-void CMpMpxIsolatedCollectionHelper::HandleCollectionMediaL(
- const CMPXMedia& /*aMedia*/,
- TInt /*aError*/ )
- {
- }
-
-//EOF
+void CMpMpxIsolatedCollectionHelper::HandleCollectionMediaL(
+ const CMPXMedia& aMedia,
+ TInt aError )
+{
+ Q_UNUSED( aMedia );
+ Q_UNUSED( aError );
+}
+
--- a/mpengine/src/mpmpxplaybackframeworkwrapper.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/src/mpmpxplaybackframeworkwrapper.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -36,6 +36,19 @@
*/
/*!
+ \fn void corruptedStop();
+
+ This signal is emitted when a courrpted song is discovered and is the last song of
+ the playlist
+ */
+
+/*!
+ \fn void fileCorrupted(int fileId);
+
+ This signal is emitted when a courrpted song is discovered with fileId.
+ */
+
+/*!
Constructs the utility wrapper.
*/
MpMpxPlaybackFrameworkWrapper::MpMpxPlaybackFrameworkWrapper( TUid hostUid, MpSongData *songData, QObject *parent )
--- a/mpengine/src/mpmpxplaybackframeworkwrapper_p.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/src/mpmpxplaybackframeworkwrapper_p.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -28,6 +28,7 @@
#include <mpxplaybackframeworkdefs.h>
#include <hbglobal.h>
#include <xqsharablefile.h>
+#include <mpxcollectionplaylist.h>
#include "mpmpxplaybackframeworkwrapper_p.h"
#include "mpmpxplaybackframeworkwrapper.h"
@@ -36,6 +37,7 @@
#include "mptrace.h"
#include "mpxaudioeffectengine.h"
#include "mpsongdata.h"
+#include "mpxcollectionpath.h"
_LIT(KMPXPnRealAudioMimeType, "audio/x-pn-realaudio");
_LIT(KMPXRealAudioMimeType, "audio/x-realaudio");
@@ -456,6 +458,9 @@
if ( aError == KErrNone && aMessage ) {
TRAP_IGNORE( DoHandlePlaybackMessageL(*aMessage) );
}
+ else{
+ TRAP_IGNORE( DoHandlePlaybackErrorL(aError) );
+ }
TX_EXIT
}
@@ -726,6 +731,39 @@
/*!
\internal
*/
+void MpMpxPlaybackFrameworkWrapperPrivate::DoHandlePlaybackErrorL( const TInt aError )
+{
+ TX_ENTRY
+ switch ( aError ) {
+ case KErrCorrupt:{
+ MMPXSource* source( iPlaybackUtility->Source() );
+ if ( source ){
+ CMPXCollectionPlaylist* playlist( source->PlaylistL() );
+ if ( playlist ){
+ MpPlaybackData* pData = playbackData();
+ pData->setCorrupted( playlist->Path().IdOfIndex( playlist->Index() ).iId2 );
+
+ if ( playlist->Index() == ( playlist->Count()-1 ) ){
+ //reach the end of list, pop up corrupt notification
+ emit q_ptr->corruptedStop();
+ }
+ else{
+ //corrupted song, skip to next song
+ skipForward();
+ }
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ TX_EXIT
+}
+
+/*!
+ \internal
+ */
void MpMpxPlaybackFrameworkWrapperPrivate::ForceStopL()
{
TX_ENTRY
--- a/mpengine/tsrc/unittest_mpengine/src/unittest_mpengine.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpengine/src/unittest_mpengine.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -525,7 +525,7 @@
mTest = MpEngineFactory::createIsolatedEngine( MpEngine::StandAlone );
mTest->disableEqualizer();
- QCOMPARE( mTest->mCurrentPresetIndex, KEqualizerPresetNone );
+ QCOMPARE( mTest->mCurrentPresetIndex, 0 );
}
/*!
@@ -557,7 +557,7 @@
QSignalSpy spy( mTest, SIGNAL( equalizerReady() ) );
mTest->handleEqualizerReady();
- QCOMPARE( mTest->mCurrentPresetIndex, 1 );
+ QCOMPARE( mTest->mCurrentPresetIndex, 0 );
QVERIFY( spy.count() == 1 );
}
--- a/mpengine/tsrc/unittest_mpequalizerframeworkwrapper/src/unittest_mpequalizerframeworkwrapper.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpequalizerframeworkwrapper/src/unittest_mpequalizerframeworkwrapper.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -133,21 +133,21 @@
// When EqualizerUtility is not ready
presetIndex = mTestPrivate->getPresetIndex(0x0B);
- QVERIFY(presetIndex == KEqualizerPresetNone);
+ QVERIFY(presetIndex == 0);
mTestPrivate->MapcInitComplete(KErrNone, 0);
//When a valid preset is currently set
presetIndex = mTestPrivate->getPresetIndex(0x0B);
- QVERIFY(presetIndex == 1);
+ QVERIFY(presetIndex == 2);
//When there is no any preset set
presetIndex = mTestPrivate->getPresetIndex(KEqualizerPresetNone);
- QVERIFY(presetIndex == KEqualizerPresetNone);
+ QVERIFY(presetIndex == 0);
//When an invalid preset is currently set
presetIndex = mTestPrivate->getPresetIndex(0xFF);
- QVERIFY(presetIndex == KEqualizerPresetNone);
+ QVERIFY(presetIndex == 0);
}
/*!
--- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/src/unittest_mpmpxcollectionframeworkwrapper.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/src/unittest_mpmpxcollectionframeworkwrapper.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -400,11 +400,11 @@
void TestMpMpxCollectionFrameworkWrapper::testDoIncrementalOpen()
{
mTestPrivate->DoIncrementalOpenL();
- QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDelay, KIncrementalDelayHalfSecond);
+ QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDelay, KIncrementalDelay);
QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iStop,TBool(ETrue));
QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iStart,TBool(ETrue));
QCOMPARE(mTestPrivate->iFirstIncrementalOpen,TBool(ETrue));
- QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDirection,CMPXCollectionOpenUtility::EFetchNormal);
+ QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDirection,CMPXCollectionOpenUtility::EFetchDown);
QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iChunkSize, KIncrementalFetchBlockSize);
}
@@ -770,13 +770,13 @@
testMessage->SetTObjectValueL<TInt>(KMPXMessageGeneralData,EMcContainerOpened);
mTestPrivate->DoHandleCollectionMessageL(*testMessage);
//mTestPrivate->HandleCollectionMessage(*testMessage, KErrNone);
- QCOMPARE(mTestPrivate->iCollectionUtility->iOpen,TBool(EFalse));
-
- QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDelay, KIncrementalDelayHalfSecond);
+ QCOMPARE(mTestPrivate->iCollectionUtility->iOpen,TBool(EFalse));
+
+ QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDelay, KIncrementalDelay);
QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iStop,TBool(ETrue));
QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iStart,TBool(ETrue));
QCOMPARE(mTestPrivate->iFirstIncrementalOpen,TBool(ETrue));
- QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDirection,CMPXCollectionOpenUtility::EFetchNormal);
+ QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iDirection,CMPXCollectionOpenUtility::EFetchDown);
QCOMPARE(mTestPrivate->iIncrementalOpenUtil->iChunkSize, KIncrementalFetchBlockSize);
//Opened a song
--- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/inc/mpmpxcollectiondata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/inc/mpmpxcollectiondata.h Thu Sep 02 20:24:03 2010 +0300
@@ -54,6 +54,7 @@
int currentAlbumIndex() const;
void setMpxMedia( const CMPXMedia& entries, bool reopen=false );
+ void incrementalOpenUpdate();
const CMPXMedia& containerMedia();
void setAlbumContent( const CMPXMedia& albumContent );
--- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpmpxcollectiondata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpmpxcollectiondata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -120,6 +120,13 @@
/*!
Stub function.
+ */
+void MpMpxCollectionData::incrementalOpenUpdate()
+{
+}
+
+/*!
+ Stub function.
*/
const CMPXMedia& MpMpxCollectionData::containerMedia()
{
--- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpxcollectionopenutility.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpxcollectionopenutility.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -27,9 +27,9 @@
Stub function.
*/
CMPXCollectionOpenUtility::CMPXCollectionOpenUtility():iDelay(0),
- iStart(EFalse),
+ iChunkSize(0),
iStop(EFalse),
- iChunkSize(0),
+ iStart(EFalse),
iDirection(EFetchDown)
{
--- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpxcollectionuihelper.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpxcollectionuihelper.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -23,7 +23,6 @@
#include <e32debug.h>
#include "stub/inc/mpxcollectionuihelper.h"
-const TInt KMPXAllSongsViewIndex = 0;
const TInt KMPXPlaylistViewIndex = 1;
@@ -33,10 +32,10 @@
MMPXCollectionUiHelper::MMPXCollectionUiHelper():iIncAdd(EFalse),
iDelete(EFalse),
iCancel(EFalse),
+ iMedia(0),
iValidRename(EFalse),
- iValidReorder(EFalse),
- iMedia(0)
-{
+ iValidReorder(EFalse)
+{
}
/*!
--- a/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpxcollectionutility.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxcollectionframeworkwrapper/stub/src/mpxcollectionutility.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -30,7 +30,6 @@
#include <e32debug.h>
#include "stub/inc/mpxcollectionutility.h"
-const TInt KMPXAllSongsViewIndex = 0;
const TInt KMPXPlaylistViewIndex = 1;
/*!
@@ -39,14 +38,13 @@
MMPXCollectionUtility::MMPXCollectionUtility():iBack(EFalse),
iOpen(EFalse),
iMedia(EFalse),
- iIndex(0),
iOpenCount(0),
iCountPath(0),
+ iIndex(0),
iPlaylists(0),
iAlbumSongs(0),
iAsynchFindResult(0)
{
-
}
/*!
@@ -114,7 +112,8 @@
aCriteria.IsSupported(KMPXMediaGeneralCategory) && EMPXSong == aCriteria.ValueTObjectL<TMPXGeneralCategory>(KMPXMediaGeneralCategory) &&
aCriteria.IsSupported(KMPXMediaGeneralId) && iAlbumSongs &&
//it is assumed that album ID matches index on the media array, just to make test logic more simple.
- TUint32(aCriteria.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId)) >= 0 && TUint32(aCriteria.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId)) < iAlbumSongs->Count())
+ aCriteria.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId).iId2 &&
+ (aCriteria.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId).iId2 < iAlbumSongs->Count()) )
{
return CMPXMedia::NewL(*iAlbumSongs->AtL(aCriteria.ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId)));
}
--- a/mpengine/tsrc/unittest_mpmpxisolatedcollectionhelper/src/unittest_mpmpxisolatedcollectionhelper.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxisolatedcollectionhelper/src/unittest_mpmpxisolatedcollectionhelper.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -108,7 +108,7 @@
{
CMPXCollectionPath* path = CMPXCollectionPath::NewL();
mTest->OpenCollectionL(*path);
- QCOMPARE(mTest->iIncrementalOpenUtil->iDelay, KIncrementalDelayHalfSecond);
+ QCOMPARE(mTest->iIncrementalOpenUtil->iDelay, KIncrementalDelay);
QCOMPARE(mTest->iIncrementalOpenUtil->iStop,TBool(ETrue));
QCOMPARE(mTest->iIncrementalOpenUtil->iStart,TBool(ETrue));
QCOMPARE(mTest->iFirstIncrementalOpen,TBool(ETrue));
@@ -118,7 +118,7 @@
QCOMPARE(mTest->iOpenMode, CMpMpxIsolatedCollectionHelper::DefaultMode );
mTest->OpenCollectionL(*path,0,CMpMpxIsolatedCollectionHelper::RestorePathMode);
- QCOMPARE(mTest->iIncrementalOpenUtil->iDelay, KIncrementalDelayHalfSecond);
+ QCOMPARE(mTest->iIncrementalOpenUtil->iDelay, KIncrementalDelay);
QCOMPARE(mTest->iIncrementalOpenUtil->iStop,TBool(ETrue));
QCOMPARE(mTest->iIncrementalOpenUtil->iStart,TBool(ETrue));
QCOMPARE(mTest->iFirstIncrementalOpen,TBool(ETrue));
--- a/mpengine/tsrc/unittest_mpmpxisolatedcollectionhelper/stub/src/mpxcollectionopenutility.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxisolatedcollectionhelper/stub/src/mpxcollectionopenutility.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -28,9 +28,9 @@
Stub function.
*/
CMPXCollectionOpenUtility::CMPXCollectionOpenUtility():iDelay(0),
- iStart(EFalse),
+ iChunkSize(0),
iStop(EFalse),
- iChunkSize(0),
+ iStart(EFalse),
iDirection(EFetchDown),
iMode(TUid::Null())
{
--- a/mpengine/tsrc/unittest_mpmpxplaybackframeworkwrapper/stub/inc/mpplaybackdata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxplaybackframeworkwrapper/stub/inc/mpplaybackdata.h Thu Sep 02 20:24:03 2010 +0300
@@ -58,6 +58,7 @@
bool setAlbumId( int id );
bool setId( int id );
void resetData();
+ void setCorrupted( int id );
public:
--- a/mpengine/tsrc/unittest_mpmpxplaybackframeworkwrapper/stub/src/mpplaybackdata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpengine/tsrc/unittest_mpmpxplaybackframeworkwrapper/stub/src/mpplaybackdata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -279,4 +279,13 @@
mId = 0;
mRealAudio = false;
}
+
+/*!
+ Stub function.
+*/
+void MpPlaybackData::setCorrupted( int id )
+{
+
+}
+
//end of file
--- a/mpserviceplugins/mpxsqlitedbcommon/src/mpxdbcommonutil.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbcommon/src/mpxdbcommonutil.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -329,7 +329,8 @@
extractPos = KMCPathStartPos; // c:\..., include first '\' of the path
}
- TBuf<KMaxFileName+KMCIntegerLen> fileName;
+ HBufC* fileNameBuf = HBufC::NewLC(aName.Length()+KMCIntegerLen);
+ TPtr fileName(fileNameBuf->Des());
if( extractPos )
{
// append volume's unique Id to path to maintain uniqueness
@@ -357,7 +358,7 @@
TInt narrowFileLen(0);
TPtrC8 narrowFileName;
#if defined(_UNICODE)
- narrowFileLen = fileName.Length() * 2;
+ narrowFileLen = fileNameBuf->Des().Length() * 2;
narrowFileName.Set((TUint8*)fileName.Ptr(), narrowFileLen);
#else
narrowFileLen = fileName.Length();
@@ -375,6 +376,9 @@
TUint32 uniqueId(0);
uniqueId = aTableId << 28;
uniqueId |= (ptr[3]&0x0F)<<24 | (ptr[2]<<16) | (ptr[1]<<8) | ptr[0];
+
+ CleanupStack::PopAndDestroy(fileNameBuf);
+
return uniqueId;
}
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxcollectiondbdef.h Thu Sep 02 20:24:03 2010 +0300
@@ -28,12 +28,13 @@
// Db filename
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
-_LIT(KMCDbFile, "mpxv3_1.db");
-_LIT(KMCDbFileEMMC, "mpxv3_1i.db");
-#else
-_LIT(KMCDbFile, "mpxv3_1n.db");
-_LIT(KMCDbFileEMMC, "mpxv3_1in.db");
+_LIT(KMCDbFile, "mpxv3_2.db");
+_LIT(KMCDbFileEMMC, "mpxv3_2i.db");
+#else
+_LIT(KMCDbFile, "mpxv3_2n.db");
+_LIT(KMCDbFileEMMC, "mpxv3_2in.db");
#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
// Collection Db resource file
_LIT(KMPXCollectionDbResourceFile, "mpxcollectiondbhgres.rsc");
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbalbum.h Thu Sep 02 20:24:03 2010 +0300
@@ -29,8 +29,6 @@
class MMPXDbAlbumObserver
{
public:
- virtual TInt HandleIsUnknownArtistL(TUint32 aId) = 0;
- virtual HBufC* HandleArtistForAlbumL( const TUint32 aId ) = 0;
/**
* HandleAlbumartForAlbumL.
* @param aId, The album ID.
@@ -38,6 +36,24 @@
* @returns alternative albumart retrieved in the specified Album.
*/
virtual HBufC* HandleAlbumartForAlbumL( const TUint32 aId, TPtrC aArt ) = 0;
+
+ /**
+ * Called when album artist is removed from an album
+ * @param aCategoryId category item ID
+ * @param aDrive drive the category item is on
+ * @param aItemChangedMessages changed mesages array to be updated or NULL
+ */
+ virtual void DeleteAlbumForArtistL(TUint32 aCategoryId,
+ TInt aDrive, CMPXMessageArray* aItemChangedMessages) = 0;
+
+ /**
+ * Called when album artist is added to an album
+ * @param aName name string
+ * @param aArt Album art path
+ * @param aDriveId drive to add the category to
+ * @return the ID of the category item (new or existing)
+ */
+ virtual TUint32 AddAlbumArtistL(const TDesC& aName, const TDesC& aArt, TInt aDriveId) = 0;
};
/**
* Responsible for managing all music databases
@@ -74,11 +90,11 @@
virtual ~CMPXDbAlbum();
public:
-
/**
- * Add a category item. If the record already exists, its counter will
+ * Add an album item. If the record already exists, its counter will
* be incremented.
- * @param aName: This is the name to be entered into the row
+ * @param aCategory category type
+ * @param aMedia: The media object
* @param aDriveId: The Drive Id the name (category) belongs
* @param aNewRecord: indicates to the caller if a new record is created.
* ETrue if a new row is created in the table; otherwise EFalse.
@@ -86,7 +102,7 @@
* into consideration when generating the unique row id
* @return The unique id of the row added.
*/
- TUint32 AddItemL(const TDesC& aName, const TDesC& aArtistName, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord,
+ virtual TUint32 AddItemL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia, TInt aDriveId, TBool& aNewRecord,
TBool aCaseSensitive = ETrue);
/**
@@ -102,11 +118,10 @@
* category was deleted
* @param aItemExist Out parameter, ETrue if the category is not deleted after the delete,
* EFalse otherwise
- * @param aArtist: The ID of the artist
* @param aArt: The albumart uri
*/
- void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId,
- CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, const TUint32 aArtist, const TDesC& aArt );
+ void DecrementSongsForAlbumL(TUint32 aId, TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, const TDesC& aArt );
/**
* Gets the details for all category items.
@@ -125,6 +140,18 @@
CMPXMediaArray& aMediaArray);
/**
+ * Gets details for the category items under a parent category item.
+ * This applies to albums for a given artist. The method panics if the
+ * category or parent category are invalid.
+ * @param aParentCategory identifies the parent category
+ * @param aParentId identifies the parent item
+ * @param aAttrs attributes to be returned
+ * @param aMediaArray returns the requested attributes for all items
+ */
+ virtual void GetSubCategoryItemsL(TMPXGeneralCategory aParentCategory, TUint32 aParentId,
+ const TArray<TMPXAttribute>& aAttrs, CMPXMediaArray& aMediaArray);
+
+ /**
* Update a category item.
* @param aId: The ID of the category to update
* @param aMedia: The media data
@@ -134,19 +161,29 @@
*/
void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages);
- public:
- /**
- * Get albums count for a specified artist
- * @param aId: The ID of the artist
- */
- TInt GetAlbumsCountForArtistL(TUint32 aArtistId);
-
+ public:
/**
* 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);
+ /**
+ * Check if the specified album ID is an unknown album.
+ * An “Unknown album” is one where the album name and album artist are unknown.
+ * @param aId: The ID of the album
+ * @return ETrue if it's an unknown album
+ */
+ TBool IsUnknownAlbumL(const TUint32 aId);
+
+ /**
+ * Generate Unique ID for Album
+ * @param aMedia media object
+ * @param aCaseSensitive indicates whether case sensitivity should be taken
+ * into consideration when generating the unique row id
+ * @return the ID of album
+ */
+ TUint32 GenerateUniqueIdL(const CMPXMedia& aMedia);
private:
/**
@@ -167,16 +204,7 @@
*/
void GenerateAlbumFieldsValuesL(const CMPXMedia& aMedia,
CDesCArray& aFields, CDesCArray& aValues);
-
-
- TBool IsUnknownArtistL(TUint32 aId);
-
- /**
- * Get the ArtistName of song which belongs to the specified Album.
- * @param aId The ID of the album
- * @returns alternative artistname retrieved in the specified Album.
- */
- HBufC* ArtistForAlbumL(const TUint32 aId);
+
/**
* Get the Albumart of song which belongs to the specified Album.
* @param aId The ID of the album
@@ -184,7 +212,51 @@
* @returns alternative albumart retrieved in the specified Album.
*/
HBufC* AlbumartForAlbumL(const TUint32 aId, TPtrC aArt);
+
+ /**
+ * Processes a recordset by constructing media instances and adding them
+ * to the specified array.
+ * @param aAttrs attributes to be returned
+ * @param aRecordset recordset to be processed
+ * @param aMediaArray returns the media instances
+ */
+ void ProcessAlbumRecordSetL(const TArray<TMPXAttribute>& aAttrs,
+ RSqlStatement& aRecordset, CMPXMediaArray& aMediaArray);
+
+ /**
+ * Processes a recordset by constructing media instances and adding them
+ * to the specified array.
+ * @param aAttrs attributes to be returned
+ * @param aRecordset recordset to be processed
+ * @param aMediaArray returns the media instances
+ */
+ void ProcessMediaWallAlbumRecordSetL(const TArray<TMPXAttribute>& aAttrs,
+ RSqlStatement& aRecordset, CMPXMediaArray& aMediaArray);
+
+ /**
+ * Retrieve AlbumArtist name from media object
+ * @param aMedia media object
+ * @param aName returned name
+ * @return ETrue if name is available
+ */
+ TBool RetrieveAlbumArtistL(const CMPXMedia& aMedia, TPtrC& aName);
+ /**
+ * Retrieve Artist name from media object
+ * @param aMedia media object
+ * @param aName returned name
+ */
+ void RetrieveArtist(const CMPXMedia& aMedia, TPtrC& aName);
+
+ /**
+ * Check if Art needs to be updated
+ * @param aDeletedSongArt deleted song's art
+ * @param aCurrentAlbumArt Album's current art
+ * @return ETrue if aDeletedSongArt is not non-embedded album art and
+ * aDeleteSongArt and aCurrentAlbumArt are the same and known
+ */
+ TBool NeedToUpdateArt(const TDesC& aDeletedSongArt, const TDesC& aCurrentAlbumArt);
+
private: // from MMPXTable
/**
@@ -219,16 +291,20 @@
enum TAlbumColumns
{
EAlbumUniqueId = KMPXTableDefaultIndex,
- EAlbumArtistName,
EAlbumName,
EAlbumSongCount,
+ EAlbumArtist,
+ EAlbumArtistName,
EAlbumArt,
EAlbumFieldCount
};
private: // Data
MMPXDbAlbumObserver& iObserver;
+ RPointerArray<CMPXMedia> iUnknownArtists;
+ RPointerArray<CMPXMedia> iUnknownAlbums;
};
+
#endif // MPXDBALBUM_H
// End of File
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbartist.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbartist.h Thu Sep 02 20:24:03 2010 +0300
@@ -24,11 +24,6 @@
#include "mpxdbcategory.h"
// CLASS DECLARATION
-class MMPXDbArtistObserver
- {
- public:
- virtual TInt HandleGetAlbumsCountForArtistL(TUint32 aId) = 0;
- };
/**
* Responsible for managing all music databases
@@ -47,7 +42,7 @@
* @return New CMPXDbArtist instance.
*/
static CMPXDbArtist* NewL(CMPXDbManager& aDbManager,
- TMPXGeneralCategory aCategory, MMPXDbArtistObserver& aObserver);
+ TMPXGeneralCategory aCategory);
/**
* Two-phased constructor.
@@ -56,8 +51,8 @@
* @return New CMPXDbArtist instance on the cleanup stack.
*/
static CMPXDbArtist* NewLC(CMPXDbManager& aDbManager,
- TMPXGeneralCategory aCategory, MMPXDbArtistObserver& aObserver);
-
+ TMPXGeneralCategory aCategory);
+
/**
* Destructor
*/
@@ -65,17 +60,16 @@
public:
/**
- * Add a category item. If the record already exists, its counter will
+ * Add a artist item. If the record already exists, its counter will
* be incremented.
- * @param aName: This is the name to be entered into the row
+ * @param aCategory category type
+ * @param aMedia: This is the media object
* @param aDriveId: The Drive Id the name (category) belongs
* @param aNewRecord: indicates to the caller if a new record is created.
* ETrue if a new row is created in the table; otherwise EFalse.
- * @param aCaseSensitive indicates whether case sensitivity should be taken
- * into consideration when generating the unique row id
* @return The unique id of the row added.
*/
- TUint32 AddItemL(const TDesC& aName, const TDesC& aArt, TInt aDriveId, TBool& aNewRecord,
+ virtual TUint32 AddItemL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia, TInt aDriveId, TBool& aNewRecord,
TBool aCaseSensitive = ETrue);
/**
@@ -94,14 +88,54 @@
* @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);
+ virtual void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages);
+
+ /**
+ * Decrement the number of songs for the item. If the song and album count gets to 0,
+ * remove the item.
+ * @param aId: The ID of the category to delete.
+ * @param aDriveId: The drive Id the name (category) belongs to. Songs on different
+ * drives may belong to the same album or artist; consequently, one
+ * row for each artist/album id and drive ID pair will exist in the
+ * lookup table with a count existing for each row that tracks the
+ * number number of songs on that drive with that album/artist.
+ * @param aItemChangedMessages if valid on return contains a deleted message if the
+ * category was deleted
+ * @param aItemExist Out parameter, ETrue if the category is not deleted after the delete,
+ * EFalse otherwise
+ */
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+ virtual void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, TBool aMtpInUse = EFalse);
+#else
+ virtual void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages, TBool& aItemExist);
+#endif //ABSTRACTAUDIOALBUM_INCLUDED
- /*
- * Checks if the specified artist item is unknown
- * @param aId identifies the artist item
- * @return ETrue if it is unknown, EFalse otherwise
+ /**
+ * Add a AlbumArtist. If the record already exists, its counter will
+ * be incremented.
+ * @param aName: This is the name to be entered into the row
+ * @param aArt: Album art
+ * @param aDriveId: The Drive Id the name (category) belongs
+ * @return The unique id of the row added.
*/
- TBool IsUnknownArtistL(TUint32 aId);
+ TUint32 AddAlbumArtistL(const TDesC& aName, const TDesC& aArt, TInt aDriveId);
+
+ /**
+ * Decrement the number of albums for the item. If the song and album count gets to 0,
+ * remove the item.
+ * @param aId: The ID of the category to delete.
+ * @param aDriveId: The drive Id the name (category) belongs to. Songs on different
+ * drives may belong to the same album or artist; consequently, one
+ * row for each artist/album id and drive ID pair will exist in the
+ * lookup table with a count existing for each row that tracks the
+ * number number of songs on that drive with that album/artist.
+ * @param aItemChangedMessages if valid on return contains a deleted message if the
+ * category was deleted
+ */
+ void DecrementAlbumsForArtistL(TUint32 aId, TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages);
private:
@@ -123,14 +157,16 @@
*/
void GenerateArtistFieldsValuesL(const CMPXMedia& aMedia,
CDesCArray& aFields, CDesCArray& aValues);
-
+
/**
- * Gets the Album counts for a Artist item
+ * Gets the Songs count and Albums count for a Artist item
+ * @param aDrivceId The Drive Id the name (category) belongs
* @param aId identifies the Artist item
- * @return value of the Album counts
+ * @param aSongsCount songs count
+ * @param aAlbumsCount albums count
*/
- TInt GetAlbumsCountL(TUint32 aId);
-
+ void GetSongsAndAlbumsCountL(TInt aDriveId, TUint32 aId, TInt& aSongsCount, TInt& aAlbumsCount);
+
private: // from MMPXTable
/**
@@ -150,7 +186,7 @@
* @param aDbManager database manager to use for database interactions
* @param aCategory identifies the category
*/
- CMPXDbArtist(CMPXDbManager& aDbManager, TMPXGeneralCategory aCategory, MMPXDbArtistObserver& aObserver);
+ CMPXDbArtist(CMPXDbManager& aDbManager, TMPXGeneralCategory aCategory);
/**
* Second phase constructor.
@@ -167,13 +203,12 @@
EArtistUniqueId = KMPXTableDefaultIndex,
EArtistName,
EArtistSongCount,
+ EArtistAlbumCount,
EArtistArt,
EArtistFieldCount
};
-
- private: // Data
- MMPXDbArtistObserver& iObserver;
};
+
#endif // MPXDBARTIST_H
// End of File
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbcategory.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbcategory.h Thu Sep 02 20:24:03 2010 +0300
@@ -53,7 +53,8 @@
/**
* Add a category item. If the record already exists, its counter will
* be incremented.
- * @param aName: This is the name to be entered into the row
+ * @param aCategory category type
+ * @param aMedia: This is the media object to be entered into the row
* @param aDriveId: The Drive Id the name (category) belongs
* @param aNewRecord: indicates to the caller if a new record is created.
* ETrue if a new row is created in the table; otherwise EFalse.
@@ -61,13 +62,8 @@
* into consideration when generating the unique row id
* @return The unique id of the row added.
*/
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED
- virtual TUint32 AddItemL(const TDesC& aName, TInt aDriveId, TBool& aNewRecord,
+ virtual TUint32 AddItemL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia, TInt aDriveId, TBool& aNewRecord,
TBool aCaseSensitive = ETrue);
-#else
- TUint32 AddItemL(const TDesC& aName, TInt aDriveId, TBool& aNewRecord,
- TBool aCaseSensitive = ETrue);
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
/**
* Get the name field for a given ID.
@@ -109,7 +105,7 @@
virtual void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId,
CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, TBool aMtpInUse = EFalse);
#else
- void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId,
+ virtual void DecrementSongsForCategoryL(TUint32 aId, TInt aDriveId,
CMPXMessageArray* aItemChangedMessages, TBool& aItemExist);
#endif // ABSTRACTAUDIOALBUM_INCLUDED
/**
@@ -157,7 +153,7 @@
* @param aAttrs attributes to be returned
* @param aMediaArray returns the requested attributes for all items
*/
- void GetSubCategoryItemsL(TMPXGeneralCategory aParentCategory, TUint32 aParentId,
+ virtual void GetSubCategoryItemsL(TMPXGeneralCategory aParentCategory, TUint32 aParentId,
const TArray<TMPXAttribute>& aAttrs, CMPXMediaArray& aMediaArray);
/**
@@ -183,8 +179,8 @@
* @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);
+ */
+ virtual void UpdateItemL(TUint32 aId, const CMPXMedia& aMedia, TInt aDriveId, CMPXMessageArray* aItemChangedMessages);
protected:
@@ -222,6 +218,15 @@
void ProcessRecordsetL(const TArray<TMPXAttribute>& aAttrs,
RSqlStatement& aRecordset, CMPXMediaArray& aMediaArray);
+ private:
+ /**
+ * Retrieve name from media object based on category
+ * @param aCategory the category to retrieve name
+ * @param aMedia media object
+ * @return name
+ */
+ TPtrC ItemNameL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia);
+
private: // from MMPXTable
/**
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbhandler.h Thu Sep 02 20:24:03 2010 +0300
@@ -65,7 +65,6 @@
class CMPXDbHandler :
public CBase,
public MMPXDbMusicObserver,
- public MMPXDbArtistObserver,
public MMPXDbAlbumObserver,
public MMPXDbPlaylistObserver
{
@@ -1017,39 +1016,30 @@
private: // From MMPXDbMusicObserver
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED
/**
* @see MMPXDbMusicObserver
*/
- virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory,
- const TDesC& aName,
- TInt aDriveId,
- CMPXMessageArray* aItemChangedMessages, TBool& aItemExist,
- const TDesC& aUri,
- const TDesC& aAlbumArtist=KNullDesC);
-#else
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+ virtual TUint32 AddAbstractAlbumItemL(const TDesC& aName,
+ TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist,
+ const TDesC& aUri, const TDesC& aAlbumArtist=KNullDesC);
+#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
+ virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia,
+ TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist);
+
+ virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
+ const CMPXMedia& aMedia, TInt aDrive, CMPXMessageArray* aItemChangedMessages);
+
+ virtual TUint32 GenerateUniqueIdForAlbumL(const CMPXMedia& aMedia);
+
+ virtual TBool IsUnknownAlbumL(const TUint32 aId);
/**
* @see MMPXDbMusicObserver
*/
- virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory,
- const TDesC& aName, TInt aDriveId,
- CMPXMessageArray* aItemChangedMessages, TBool& aItemExist);
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
-
- virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName,
- const TDesC& aArtistName, const TDesC& aArt,
- TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist);
-
- virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
- const CMPXMedia& aMedia, TInt aDrive, CMPXMessageArray* aItemChangedMessages);
-
- /**
- * @see MMPXDbMusicObserver
- */
- virtual void DeleteSongForCategoryL(TMPXGeneralCategory aCategory,
- TUint32 aCategoryId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages,
- TBool& aItemExist);
+ virtual void DeleteSongForCategoryL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
+ TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, const TDesC& aArt = KNullDesC);
/**
* @see MMPXDbMusicObserver
@@ -1066,37 +1056,32 @@
*/
virtual HBufC* HandleGetAlbumNameFromIdL(TUint32 aId);
#endif // ABSTRACTAUDIOALBUM_INCLUDED
- private: // From MMPXDbArtistObserver
- /**
- * @see MMPXDbArtistObser
- */
- virtual TInt HandleGetAlbumsCountForArtistL(TUint32 aArtistId);
+
+ private: // From MMPXDbAlbumObserver
+ /**
+ * Get the Albumart of song which belongs to the specified Album.
+ * @param aId, The Album ID.
+ * @param aArt, the AlbumArt uri.
+ * @returns alternative albumart retrieved in the specified Album.
+ */
+ virtual HBufC* HandleAlbumartForAlbumL(const TUint32 aAlbumId, TPtrC aArt);
+
+ /**
+ * @see MMPXDbAlbumObserver
+ */
+ virtual void DeleteAlbumForArtistL(TUint32 aCategoryId,
+ TInt aDrive, CMPXMessageArray* aItemChangedMessages);
- private: // From MMPXDbAlbumObserver
- /**
- * @see MMPXDbAlbumObserver
- */
- virtual TBool HandleIsUnknownArtistL(TUint32 aArtistId);
- /**
- * Get the Artistname of song which belongs to the specified Album.
- * @param aId, The Album ID.
- * @returns alternative artistname retrieved in the specified Album.
- */
- virtual HBufC* HandleArtistForAlbumL(const TUint32 aAlbumId);
-
- /**
- * Get the Albumart of song which belongs to the specified Album.
- * @param aId, The Album ID.
- * @param aArt, the AlbumArt uri.
- * @returns alternative albumart retrieved in the specified Album.
- */
- virtual HBufC* HandleAlbumartForAlbumL(const TUint32 aAlbumId, TPtrC aArt);
+ /**
+ * @see MMPXDbAlbumObserver
+ */
+ virtual TUint32 AddAlbumArtistL(const TDesC& aName, const TDesC& aArt, TInt aDriveId);
private: // From MMPXDbPlaylistObserver
- /**
- * @see MMPXDbPlaylistObserver
- */
- virtual TInt HandlePlaylistDurationL(TUint32 aPlaylistId);
+ /**
+ * @see MMPXDbPlaylistObserver
+ */
+ virtual TInt HandlePlaylistDurationL(TUint32 aPlaylistId);
virtual void HandlePlaylistInfoL(TUint32 aPlaylistId, TInt& aCount, TInt& aDuration);
private:
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbmusic.h Thu Sep 02 20:24:03 2010 +0300
@@ -51,37 +51,33 @@
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
/**
* Called when a new category item has to be added to a category table.
- * @param aCategory category type
- * @param aName name string
+ * @param aName Abstract Album art name
* @param aDrive drive to add the category to
* @param aItemChangedMessages changed mesages array to be updated or NULL
* @param aItemExist Out parameter, ETrue if the item already exist before the add,
* EFalse otherwise
+ * @param aUri Abstract Album art Uri
* @param aAlbumArtist AlbumArtist string
- * @param aGenre Genre string
* @return the ID of the category item (new or existing)
*/
- virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName,
- TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, const TDesC& aAlbumArtist=KNullDesC,
- const TDesC& aGenre=KNullDesC) = 0;
-#else
+ virtual TUint32 AddAbstractAlbumItemL(const TDesC& aName,
+ TInt aDriveId, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist,
+ const TDesC& aUri, const TDesC& aAlbumArtist=KNullDesC) = 0;
+#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
/**
* Called when a new category item has to be added to a category table.
* @param aCategory category type
- * @param aName name string
+ * @param aMedia media object
* @param aDrive drive to add the category to
* @param aItemChangedMessages changed mesages array to be updated or NULL
* @param aItemExist Out parameter, ETrue if the item already exist before the add,
* EFalse otherwise
* @return the ID of the category item (new or existing)
*/
- virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName,
+ virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia,
TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist) = 0;
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
- // for Album and Artist table
- virtual TUint32 AddCategoryItemL(TMPXGeneralCategory aCategory, const TDesC& aName,
- const TDesC& aArtistName, const TDesC& aArt,
- TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist) = 0;
+
/**
* Called when the ID of a category item changed for a Music record, for example when
* the artist name changed for a song. The implementation is supposed to update the
@@ -92,9 +88,13 @@
* @param aItemChangedMessages changed mesages array to be updated or NULL
* @param aItemExist Out parameter, ETrue if the category is not deleted after the delete,
* EFalse otherwise
+ * @param aArt Art of the music record.
+ * Art needs to be given so that the cateogry can switch over to different art
+ * if necessary
+ *
*/
virtual void DeleteSongForCategoryL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
- TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist) = 0;
+ TInt aDrive, CMPXMessageArray* aItemChangedMessages, TBool& aItemExist, const TDesC& aArt = KNullDesC) = 0;
/**
* Called when the play count attribute of a song is changed. Should add an item changed
@@ -121,6 +121,7 @@
*/
virtual void UpdateCategoryItemL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
const CMPXMedia& aMedia, TInt aDrive, CMPXMessageArray* aItemChangedMessages) = 0;
+
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
/**
* Get title from the Id
@@ -128,8 +129,24 @@
* @return name matching the ID
*/
virtual HBufC* HandleGetAlbumNameFromIdL( TUint32 aId ) = 0;
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
- };
+#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
+ /**
+ * Generate Unique ID for Album
+ * @param aMedia media object
+ * @param aCaseSensitive indicates whether case sensitivity should be taken
+ * into consideration when generating the unique row id
+ * @return the ID of album
+ */
+ virtual TUint32 GenerateUniqueIdForAlbumL(const CMPXMedia& aMedia) = 0;
+
+ /**
+ * Check if the specified album ID is Unknown album
+ * @param aId: The ID of the album
+ * @return ETrue if it's Unknown album
+ */
+ virtual TBool IsUnknownAlbumL(const TUint32 aId) = 0;
+ };
/**
* Responsible for managing the Music table
@@ -501,11 +518,13 @@
* @param aAttrs the attributes to include for the artist(s) matching the
* selection criteria
* @param aMediaArray returns the songs
- */
+ * @param aSortByTrackOrder if TRUE sorts tracks according to their track numbers,
+ * if FALSE using track titles or filename
+ */
void FindSongsL(TUint32 aGeneralId, TUint32 aContainerId, TMPXGeneralType aType,
const CMPXMedia& aCriteria, const TArray<TMPXAttribute>& aAttrs,
- CMPXMediaArray& aMediaArray);
-
+ CMPXMediaArray& aMediaArray, TBool aSortByTrackOrder = EFalse);
+
/**
* Returns the track count for a given drive
* @param aDrive drive
@@ -523,12 +542,6 @@
*/
void GetMusicUriArrayL(TInt aDrive, TInt aFromID, TInt aRecords,
CDesCArray& aUriArr, TInt& aLastID);
-
- /**
- * Get the ID of Artist which belongs to the specified Album
- * @param aId, the ID of Album
- */
- TUint32 ArtistForAlbumL(const TUint32 aId);
/**
* Get the Albumart of song which belongs to the specified Album
@@ -672,13 +685,12 @@
HBufC* ConstructUriL(RSqlStatement& aMusicTable, TUint32 aMediaId);
/**
- * Checks if the specified category field (artist/album/genre/composer)
+ * Checks if the specified category field (artist/genre/composer/abstractalbum)
* will change and notifies the observer if so.
* @param aCategory identifies the category
* @param aMedia contains the new record attributes
* @param aAttribute corresponding attribute in the media parameter
- * @param aColumnIndex column index in the recordset
- * @param aMusicTable current record in the music table or NULL if this is an insert
+ * @param aOldId the current category item ID
* @param aDriveId drive ID the update is for
* @param aItemChangedMessages item changed messages to append to
* @param aItemId returns the category item ID
@@ -686,9 +698,25 @@
*/
TBool UpdateCategoryFieldL(TMPXGeneralCategory aCategory, const CMPXMedia& aMedia,
const TMPXAttribute& aAttribute, TUint32 aOldId, TInt aDriveId,
- CMPXMessageArray* aItemChangedMessages, TUint32& aItemId);
+ CMPXMessageArray* aItemChangedMessages, TUint32& aItemId, const TDesC& aArt = KNullDesC);
/**
+ * Checks if album will change and notifies the observer if so.
+ * @param aMedia contains the new record attributes
+ * @param aAttribute corresponding attribute in the media parameter
+ * @param aOldId the current category item ID
+ * @param aDriveId drive ID the update is for
+ * @param aItemChangedMessages item changed messages to append to
+ * @param aItemId returns the album item ID
+ * @param aArt old art of the music record
+ * @param aCaseSensitive indicates whether case sensitivity should be taken
+ * @return ETrue if the field was modified
+ */
+ TBool UpdateCategoryFieldForAlbumL(const CMPXMedia& aMedia,
+ const TMPXAttribute& aAttribute, TUint32 aOldId, TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages, TUint32& aItemId, const TDesC& aArt = KNullDesC);
+
+ /**
* Checks if extra attributes are required. The "standard attribute set includes:
* EMPXMediaGeneralId, EMPXMediaGeneralType, EMPXMediaGeneralCategory,
* EMPXMediaGeneralTitle, EMPXMediaGeneralUri, and EMPXMediaGeneralFlags
--- a/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/inc/mpxdbpluginqueries.h Thu Sep 02 20:24:03 2010 +0300
@@ -147,8 +147,10 @@
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
_LIT(KQueryMusicGetAllSongsMinimum, "SELECT Music.UniqueId,Music.DbFlag,Music.VolumeId,Music.Title,0,Music.Art,Music.Deleted,Music.Location,0,0,'','',0,0,0,0,0,0,0,0,'','','',0,0,0,0,0,0,'',0,'',0,0,Artist.Name FROM :dbname.Music,:dbname.Artist WHERE Deleted=0 AND Music.Artist=Artist.UniqueId ORDER BY MUSIC.Title");
+_LIT(KQueryMusicGetAllSongsMinimumLimited, "SELECT Music.UniqueId,Music.DbFlag,Music.VolumeId,Music.Title,0,Music.Art,Music.Deleted,Music.Location,0,0,'','',0,0,0,0,0,0,0,0,'','','',0,0,0,0,0,0,'',0,'',0,0,Artist.Name FROM :dbname.Music,:dbname.Artist WHERE Deleted=0 AND Music.Artist=Artist.UniqueId ORDER BY MUSIC.Title LIMIT %u");
#else
_LIT(KQueryMusicGetAllSongsMinimum, "SELECT Music.UniqueId,Music.DbFlag,Music.VolumeId,Music.Title,0,Music.Art,Music.Deleted,Music.Location,0,0,'','',0,0,0,0,0,0,0,0,'','','',0,0,0,0,0,0,'',0,Artist.Name FROM :dbname.Music,:dbname.Artist WHERE Deleted=0 AND Music.Artist=Artist.UniqueId ORDER BY MUSIC.Title");
+_LIT(KQueryMusicGetAllSongsMinimumLimited, "SELECT Music.UniqueId,Music.DbFlag,Music.VolumeId,Music.Title,0,Music.Art,Music.Deleted,Music.Location,0,0,'','',0,0,0,0,0,0,0,0,'','','',0,0,0,0,0,0,'',0,Artist.Name FROM :dbname.Music,:dbname.Artist WHERE Deleted=0 AND Music.Artist=Artist.UniqueId ORDER BY MUSIC.Title LIMIT %u");
#endif
_LIT(KQueryMusicGetAllSongs, "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.Album=Album.UniqueId AND Music.Artist=Artist.UniqueId AND Music.Genre=Genre.UniqueId AND Music.Composer=Composer.UniqueId ORDER BY 4");
@@ -207,11 +209,11 @@
_LIT(KQueryMusicGetMusicUrisFrom, "SELECT UniqueId,Location FROM :dbname.Music WHERE Deleted=0 AND UniqueId > %u ORDER BY UniqueId ASC LIMIT %u");
_LIT(KQueryMusicCount, "SELECT count(*) FROM :dbname.Music WHERE Deleted=0");
-_LIT(KQueryMusicAlbum, "SELECT DISTINCT Album FROM :dbname.Music WHERE Deleted=0 AND Artist=%u ORDER BY Album");
+_LIT(KQueryMusicAlbum, "SELECT DISTINCT Album FROM :dbname.Music WHERE Deleted=0 AND Artist=%u ORDER BY Album"); // deprecated, not maintained
_LIT(KQueryMusicVolume, "SELECT VolumeId FROM :dbname.Music WHERE Deleted=0 AND UniqueId=%u");
_LIT(KQueryMusicVolumeAll, "SELECT VolumeId FROM :dbname.Music WHERE UniqueId=%u");
_LIT(KQueryMusicInfo, "SELECT * FROM :dbname.Music WHERE Deleted=0 AND UniqueId=%u");
-_LIT(KQueryOtherSongsInArtistAlbum, "SELECT count(*) FROM :dbname.Music WHERE Deleted=0 AND UniqueId<>%u AND Artist=%u AND Album=%u");
+_LIT(KQueryOtherSongsInArtistAlbum, "SELECT count(*) FROM :dbname.Music WHERE Deleted=0 AND UniqueId<>%u AND Artist=%u AND Album=%u"); // deprecated, not maintained
_LIT(KQueryMusicDurationAll, "SELECT sum(Duration) FROM :dbname.Music WHERE Deleted=0");
_LIT(KQueryMusicDurationArtist, "SELECT sum(Duration) FROM :dbname.Music WHERE Deleted=0 AND Artist=%u");
@@ -228,7 +230,7 @@
_LIT(KQueryMusicGetDurationRecentlyAdded, "SELECT Duration FROM :dbname.Music WHERE Deleted=0 AND (julianday(TimeAdded) > julianday('now','-7 days'))");
// 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");
+_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"); // deprecated, not maintained
#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
@@ -236,6 +238,7 @@
#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");
+_LIT(KQueryMusicGetAlbumsforArtist, "SELECT Album.* FROM :dbname.Album,:dbname.Music WHERE Music.Deleted=0 AND Music.Artist=%u AND Album.UniqueId=Music.Album ORDER BY Name, UniqueId");
_LIT(KQueryMusicGetAlbumartForAlbum, "SELECT Art FROM :dbname.Music WHERE Music.Deleted=0 AND Music.Album=%u");
// == Category table queries ==================================================
//
@@ -259,7 +262,6 @@
_LIT(KQueryCategoryAll, "SELECT * FROM :dbname.##table## ORDER BY Name");
_LIT(KQueryCategoryItems, "SELECT * FROM :dbname.##table## WHERE %S ORDER BY Name ASC");
_LIT(KQueryCategorySongCount, "SELECT SongCount FROM :dbname.##table## WHERE UniqueId=%u");
-_LIT(KQueryCategorySubcategoryItems, "SELECT Album.* FROM :dbname.Album,:dbname.Music WHERE Music.Deleted=0 AND Music.Artist=%u AND Album.UniqueId=Music.Album ORDER BY Name");
_LIT(KQueryCategoryIncrementSongCount, "UPDATE :dbname.##table## SET SongCount=SongCount+1 WHERE UniqueId=%u");
_LIT(KQueryCategoryDecrementSongCount, "UPDATE :dbname.##table## SET SongCount=SongCount-1 WHERE UniqueId=%u");
@@ -277,9 +279,9 @@
_LIT(KAuxiliaryDropTable,"DROP TABLE Auxiliary");
_LIT(KAuxiliaryCheckTable, "SELECT Id,Version,TimeRefreshed,TimeSynced,Corrupt,SaveDeletedRecordCount FROM AUXILIARY");
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
-_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.7.0',%u)");
+_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.8.0',%u)");
#else
-_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.7.1',%u)");
+_LIT(KQueryAuxiliaryInsert, "INSERT INTO Auxiliary(Id,Version,Corrupt) VALUES(0,'6.8.1',%u)");
#endif // ABSTRACTAUDIOALBUM_INCLUDED
_LIT(KQueryAuxiliarySetTime, "UPDATE :dbname.Auxiliary SET TimeRefreshed='%S', Corrupt=0");
_LIT(KQueryAuxiliaryGetTime, "SELECT TimeRefreshed FROM :dbname.Auxiliary");
@@ -434,19 +436,19 @@
//
_LIT(KAlbumCreateTable,"CREATE TABLE Album("
L"UniqueId INTEGER PRIMARY KEY,"
- L"ArtistName TEXT COLLATE NOCASE,"
L"Name TEXT COLLATE NOCASE,"
L"SongCount INTEGER,"
- L"Art TEXT)");
+ L"Artist INTEGER,"
+ L"ArtistName TEXT COLLATE NOCASE,"
+ L"Art TEXT)");
-_LIT(KAlbumCheckTable,"SELECT UniqueId,ArtistName,Name,SongCount,Art FROM Album");
+_LIT(KAlbumCheckTable,"SELECT UniqueId,Name,SongCount,Artist,ArtistName,Art FROM Album");
-_LIT(KQueryAlbumInsert, "INSERT INTO :dbname.Album(UniqueId,ArtistName,Name,SongCount,Art) VALUES(%u,'%S','%S',%u,'%S')");
+_LIT(KQueryAlbumInsert, "INSERT INTO :dbname.Album(UniqueId,Name,SongCount,Artist,ArtistName,Art) VALUES(%u,'%S',%u,%u,'%S','%S')");
_LIT(KQueryAlbumUpdate, "UPDATE :dbname.Album SET %S WHERE UniqueId=%u");
-_LIT(KQueryAlbumItem, "SELECT Album.*,Artist.Name FROM :dbname.Album,:dbname.Artist WHERE Album.Artist=Artist.UniqueId AND UniqueId=%u");
-_LIT(KQueryAlbumAll, "SELECT Album.* FROM :dbname.Album ORDER BY Name");
-_LIT(KQueryAlbumAllMediaWall, "SELECT Album.* FROM :dbname.Album ORDER BY ArtistName");
+_LIT(KQueryAlbumAll, "SELECT Album.* FROM :dbname.Album ORDER BY Name, ArtistName");
+_LIT(KQueryAlbumAllMediaWall, "SELECT Album.* FROM :dbname.Album ORDER BY ArtistName, Name");
_LIT(KCriterionArtistName, "ArtistName='%S'");
_LIT(KCriterionArt, "Art='%S'");
@@ -456,16 +458,22 @@
L"UniqueId INTEGER PRIMARY KEY,"
L"Name TEXT COLLATE NOCASE,"
L"SongCount INTEGER,"
+ L"AlbumCount INTEGER,"
L"Art TEXT)");
-_LIT(KArtistCheckTable,"SELECT UniqueId,Name,SongCount,Art FROM Artist");
+_LIT(KArtistCheckTable,"SELECT UniqueId,Name,SongCount,AlbumCount,Art FROM Artist");
-_LIT(KQueryArtistInsert, "INSERT INTO :dbname.Artist(UniqueId,Name,SongCount,Art) VALUES(%u,'%S',%u,'%S')");
+_LIT(KQueryArtistInsert, "INSERT INTO :dbname.Artist(UniqueId,Name,SongCount,AlbumCount,Art) VALUES(%u,'%S',%u,%u,'%S')");
_LIT(KQueryArtistUpdate, "UPDATE :dbname.Artist SET %S WHERE UniqueId=%u");
-_LIT(KQueryArtistAll, "SELECT Artist.* FROM :dbname.Artist ORDER BY 2");
+_LIT(KQueryArtistAll, "SELECT Artist.* FROM :dbname.Artist WHERE SongCount > 0 ORDER BY 2");
_LIT(KQueryArtistName, "SELECT Artist.Name FROM :dbname.Artist WHERE UniqueId=%u");
+_LIT(KQueryArtistIncrementAlbumCount, "UPDATE :dbname.Artist SET AlbumCount=AlbumCount+1 WHERE UniqueId=%u");
+_LIT(KQueryArtistDecrementAlbumCount, "UPDATE :dbname.Artist SET AlbumCount=AlbumCount-1 WHERE UniqueId=%u");
+_LIT(KQueryArtistGetSongCountAndAlbumCount, "SELECT SongCount,AlbumCount FROM :dbname.Artist WHERE UniqueId=%u");
+_LIT(KQueryArtistItems, "SELECT * FROM :dbname.Artist WHERE %S AND SongCount > 0 ORDER BY Name ASC");
+
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
// == AbstractAlbum table queries ==========================================
//
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbalbum.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -37,6 +37,11 @@
_LIT( KAbstractAlbumExt, ".alb" );
#endif // ABSTRACTAUDIOALBUM_INCLUDED
+_LIT( KAlbumAlbumArtistSeperator, "\t1");
+_LIT( KAlbumArtistSeperator, "\t2");
+
+const TInt KUnknownAlbumsGranularity = 250;
+
// ============================ MEMBER FUNCTIONS ==============================
// ----------------------------------------------------------------------------
@@ -79,6 +84,9 @@
CMPXDbAlbum::~CMPXDbAlbum()
{
MPX_FUNC("CMPXDbAlbum::~CMPXDbAlbum");
+
+ iUnknownArtists.ResetAndDestroy();
+ iUnknownAlbums.ResetAndDestroy();
}
// ----------------------------------------------------------------------------
@@ -90,7 +98,9 @@
TMPXGeneralCategory aCategory,
MMPXDbAlbumObserver& aObserver) :
CMPXDbCategory(aDbManager, aCategory),
- iObserver(aObserver)
+ iObserver(aObserver),
+ iUnknownArtists(KUnknownAlbumsGranularity),
+ iUnknownAlbums(KUnknownAlbumsGranularity)
{
MPX_FUNC("CMPXDbAlbum::CMPXDbAlbum");
}
@@ -111,77 +121,81 @@
// ----------------------------------------------------------------------------
//
TUint32 CMPXDbAlbum::AddItemL(
- const TDesC& aName,
- const TDesC& aArtistName,
- const TDesC& aArt,
+ TMPXGeneralCategory /*aCategory*/,
+ const CMPXMedia& aMedia,
TInt aDriveId,
TBool& aNewRecord,
TBool aCaseSensitive)
{
MPX_FUNC("CMPXDbAlbum::AddItemL");
+ TPtrC album(KNullDesC);
+ TPtrC albumArtist(KNullDesC);
+ TPtrC artist(KNullDesC);
+ TPtrC albumArt(KNullDesC);
+
// 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);
- HBufC* artistname = MPXDbCommonUtil::ProcessSingleQuotesLC(aArtistName);
- HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(aArt);
-
- iDbManager.ExecuteQueryL(aDriveId, *query, rowId, artistname, name, 1, art);
-
- CleanupStack::PopAndDestroy(art);
- CleanupStack::PopAndDestroy(artistname);
- CleanupStack::PopAndDestroy(name);
- CleanupStack::PopAndDestroy(query);
- }
- else
+ TUint32 rowId(GenerateUniqueIdL(aMedia));
+
+ // retrieve the existing record
+ HBufC* query = PreProcessStringLC(KQueryCategoryItem);
+ RSqlStatement recordset(
+ iDbManager.ExecuteSelectQueryL(aDriveId, *query, rowId));
+ CleanupStack::PopAndDestroy(query);
+ CleanupClosePushL(recordset);
+
+ TInt result = recordset.Next();
+ if (result == KSqlAtEnd)
{
- // retrieve the existing record
- HBufC* query = NULL;
- query = PreProcessStringLC(KQueryCategoryItem);
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, rowId));
- CleanupStack::PopAndDestroy(query);
-
- CleanupClosePushL(recordset);
-
- if (recordset.Next() != KSqlAtRow)
+ aNewRecord = result;
+
+ // check Album attribute
+ if (aMedia.IsSupported(KMPXMediaMusicAlbum))
{
- User::Leave(KErrNotFound);
- }
-
- // Artist
- TPtrC artistname(KNullDesC);
- artistname.Set(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName));
-
- // the current one is Unknown and the new one is Not Unknown.
- if ( artistname == KNullDesC && aArtistName!= KNullDesC )
+ album.Set(aMedia.ValueText(KMPXMediaMusicAlbum).Left(KMCMaxTextLen));
+ }
+
+ // check AlbumArt attirbute
+ if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
{
- HBufC* artistnameReplaceSingleQuote =
- MPXDbCommonUtil::ProcessSingleQuotesLC( aArtistName );
- TPtrC criteria(KCriterionArtistName);
- HBufC* setStr = HBufC::NewLC(criteria.Length() + artistnameReplaceSingleQuote->Length());
- setStr->Des().Format( KCriterionArtistName, artistnameReplaceSingleQuote );
-
- iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, rowId);
- CleanupStack::PopAndDestroy(setStr);
- CleanupStack::PopAndDestroy(artistnameReplaceSingleQuote);
+ albumArt.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
}
- // Album Art
+ // insert new
+ HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(album);
+ TUint32 artistId(0);
+ HBufC* artistName = NULL;
+ if (RetrieveAlbumArtistL(aMedia, albumArtist))
+ {
+ artistId = iObserver.AddAlbumArtistL(albumArtist, albumArt, aDriveId);
+ artistName = MPXDbCommonUtil::ProcessSingleQuotesLC(albumArtist);
+ }
+ else
+ {
+ RetrieveArtist(aMedia, artist);
+ artistId = iObserver.AddAlbumArtistL(artist, albumArt, aDriveId);
+ artistName = MPXDbCommonUtil::ProcessSingleQuotesLC(artist);
+ }
+
+ HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(albumArt);
+
+ iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumInsert, rowId, name, 1, artistId, artistName,art);
+
+ CleanupStack::PopAndDestroy(art);
+ CleanupStack::PopAndDestroy(artistName);
+ CleanupStack::PopAndDestroy(name);
+ }
+ else if (result == KSqlAtRow)
+ {
+ // retrieve Art from Album table
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 )
+ if ( art == KNullDesC && albumArt != KNullDesC )
{
HBufC* artReplaceSingleQuote =
- MPXDbCommonUtil::ProcessSingleQuotesLC( aArt );
+ MPXDbCommonUtil::ProcessSingleQuotesLC( albumArt );
TPtrC criteria(KCriterionArt);
HBufC* setStr = HBufC::NewLC(criteria.Length() + artReplaceSingleQuote->Length());
@@ -192,35 +206,57 @@
CleanupStack::PopAndDestroy(artReplaceSingleQuote);
}
- CleanupStack::PopAndDestroy(&recordset);
-
// increment the number of songs for the category
query = PreProcessStringLC(KQueryCategoryIncrementSongCount);
iDbManager.ExecuteQueryL(aDriveId, *query, rowId);
CleanupStack::PopAndDestroy(query);
+ } // existing record
+ else
+ {
+ MPX_DEBUG2("SQL error %d", result);
+ User::Leave(result);
}
+ CleanupStack::PopAndDestroy(&recordset);
+
return rowId;
}
// ----------------------------------------------------------------------------
-// CMPXDbAlbum::DecrementSongsForCategoryL
+// CMPXDbAlbum::DecrementSongsForAlbumL
// ----------------------------------------------------------------------------
//
-void CMPXDbAlbum::DecrementSongsForCategoryL(
+void CMPXDbAlbum::DecrementSongsForAlbumL(
const TUint32 aId,
TInt aDriveId,
CMPXMessageArray* aItemChangedMessages,
TBool& aItemExist,
- const TUint32 aArtist,
- const TDesC& aArt)
+ const TDesC& aArt)
{
- MPX_FUNC("CMPXDbAlbum::DecrementSongsForCategoryL");
+ MPX_FUNC("CMPXDbAlbum::DecrementSongsForAlbumL");
+
+ // 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);
+ }
// if just one song uses this category. Use <= just in case
- if (GetSongsCountL(aDriveId, aId) <= 1)
+ if (recordset.ColumnInt64(EAlbumSongCount) <= 1)
{
aItemExist = EFalse;
+
+ // Decrement albums count on artist
+ TUint32 albumArtistId = recordset.ColumnInt64(EAlbumArtist);
+ iObserver.DeleteAlbumForArtistL(albumArtistId, aDriveId, aItemChangedMessages);
+ CleanupStack::PopAndDestroy(&recordset);
+
// delete the category
DeleteCategoryL(aId, aDriveId);
@@ -235,63 +271,10 @@
{
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);
- }
-
TBool itemModified = EFalse;
- TPtrC artistname(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName));
- TUint32 artistId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXArtist,
- artistname, ETrue);
-
- // the current artist is equal to deleted song's artist
- if ( artistId == aArtist )
- {
- HBufC* newArtistname = ArtistForAlbumL(aId);
-
- CleanupStack::PushL(newArtistname);
- if (newArtistname && newArtistname->CompareF(artistname)!=0)
- {
- HBufC* artistnameReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( *newArtistname );
- TPtrC criteria(KCriterionArtistName);
- HBufC* setStr = HBufC::NewLC(criteria.Length() + artistnameReplaceSingleQuote->Length());
- setStr->Des().Format( KCriterionArtistName, artistnameReplaceSingleQuote );
-
- iDbManager.ExecuteQueryL(aDriveId, KQueryAlbumUpdate, setStr, aId);
- CleanupStack::PopAndDestroy(setStr);
- CleanupStack::PopAndDestroy(artistnameReplaceSingleQuote);
- itemModified = ETrue;
- }
- CleanupStack::PopAndDestroy(newArtistname);
- }
-
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED
- TBool nonEmbeddedArt = EFalse;
- if (aArt.Length()>0)
- {
- TParsePtrC parse(aArt);
- 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)
- {
- nonEmbeddedArt = ETrue;
- }
- }
- if (!nonEmbeddedArt)
- {
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
- TPtrC art(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArt));
- // the current art is equal to deleted song's art
- if(aArt.Length()>0 && art.Length()>0 && aArt.CompareF(art) ==0 )
+
+ TPtrC art(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArt));
+ if (NeedToUpdateArt(aArt, art))
{
MPX_DEBUG2("AlbumArt of the Song to be deleted is [%S]", &aArt);
@@ -302,7 +285,7 @@
//update Album table only if alternative albumart found
if (newArt)
{
- MPX_DEBUG1("CMPXDbAlbum::DecrementSongsForCategoryL, get newArt");
+ MPX_DEBUG1("CMPXDbAlbum::DecrementSongsForAlbumL, get newArt");
HBufC* artReplaceSingleQuote = MPXDbCommonUtil::ProcessSingleQuotesLC( *newArt );
TPtrC criteria(KCriterionArt);
HBufC* setStr = HBufC::NewLC(criteria.Length() + artReplaceSingleQuote->Length());
@@ -313,17 +296,15 @@
CleanupStack::PopAndDestroy(artReplaceSingleQuote);
itemModified = ETrue;
}
- CleanupStack::PopAndDestroy(newArt);
- }
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED
- }
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
+ CleanupStack::PopAndDestroy(newArt);
+ }
+
if (aItemChangedMessages && itemModified)
- {
- // add the item changed message
- MPXDbCommonUtil::AddItemAlbumChangedMessageL(*aItemChangedMessages, aId, EMPXItemModified,
- EMPXAlbum, KDBPluginUid, ETrue, 0 );
- }
+ {
+ // add the item changed message
+ MPXDbCommonUtil::AddItemAlbumChangedMessageL(*aItemChangedMessages, aId, EMPXItemModified,
+ EMPXAlbum, KDBPluginUid, ETrue, 0 );
+ }
CleanupStack::PopAndDestroy(&recordset);
// decrement the number of songs for the category
@@ -343,12 +324,17 @@
{
MPX_FUNC("CMPXDbAlbum::GetAllCategoryItemsL");
- HBufC* query = PreProcessStringLC(KQueryAlbumAll);
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query));
- CleanupStack::PopAndDestroy(query);
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryAlbumAll));
CleanupClosePushL(recordset);
- ProcessRecordsetL(aAttrs, recordset, aMediaArray);
+ TRAPD(err, ProcessAlbumRecordSetL(aAttrs, recordset, aMediaArray));
+ if (err != KErrNone)
+ {
+ iUnknownArtists.ResetAndDestroy();
+ iUnknownAlbums.ResetAndDestroy();
+
+ User::LeaveIfError(err);
+ }
CleanupStack::PopAndDestroy(&recordset);
}
@@ -362,14 +348,44 @@
{
MPX_FUNC("CMPXDbAlbum::GetAllCategoryItemsL");
- HBufC* query = PreProcessStringLC(KQueryAlbumAllMediaWall);
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query));
- CleanupStack::PopAndDestroy(query);
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryAlbumAllMediaWall));
CleanupClosePushL(recordset);
- ProcessRecordsetL(aAttrs, recordset, aMediaArray);
+ TRAPD(err, ProcessMediaWallAlbumRecordSetL(aAttrs, recordset, aMediaArray));
+ if (err != KErrNone)
+ {
+ iUnknownArtists.ResetAndDestroy();
+ iUnknownAlbums.ResetAndDestroy();
+
+ User::LeaveIfError(err);
+ }
CleanupStack::PopAndDestroy(&recordset);
}
+
+// ----------------------------------------------------------------------------
+// CMPXDbCategory::GetSubCategoryItemsL
+// ----------------------------------------------------------------------------
+//
+void CMPXDbAlbum::GetSubCategoryItemsL(
+ TMPXGeneralCategory aParentCategory,
+ TUint32 aParentId,
+ const TArray<TMPXAttribute>& aAttrs,
+ CMPXMediaArray& aMediaArray)
+ {
+ MPX_FUNC("CMPXDbCategory::GetSubCategoryItemsL");
+
+ // this is only valid for albums belonging to an artist
+ ASSERT((iCategory == EMPXAlbum) && (aParentCategory == EMPXArtist));
+
+ // to handle the UREL warning
+ (void)aParentCategory;
+
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetAlbumsforArtist, aParentId));
+ CleanupClosePushL(recordset);
+ ProcessAlbumRecordSetL(aAttrs, recordset, aMediaArray);
+ CleanupStack::PopAndDestroy(&recordset);
+ }
+
// ----------------------------------------------------------------------------
// CMPXDbAlbum::UpdateItemL
// ----------------------------------------------------------------------------
@@ -407,39 +423,6 @@
}
// ----------------------------------------------------------------------------
-// CMPXDbAlbum::GetAlbumsCountForArtistL
-// ----------------------------------------------------------------------------
-//
-TInt CMPXDbAlbum::GetAlbumsCountForArtistL(TUint32 aArtistId)
- {
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryCategorySubcategoryItems, aArtistId));
-
- TInt prevId(0);
- TInt count(0);
- TInt err(KErrNone);
-
- while ((err = recordset.Next()) == KSqlAtRow)
- {
- TUint32 rowId(recordset.ColumnInt64(EAlbumUniqueId));
- if (prevId == rowId)
- {
- continue;
- }
-
- count++;
- prevId = rowId;
- }
-
- if (err != KSqlAtEnd)
- {
- User::Leave(err);
- }
-
- return count;
-
- }
-
-// ----------------------------------------------------------------------------
// CMPXDbAlbum::GetSongsCountInAlbumMatchingArtistL
// ----------------------------------------------------------------------------
//
@@ -501,14 +484,7 @@
{
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));
- }
-
+ TPtrC artistName(MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumArtistName));
aMedia.SetTextValueL(KMPXMediaMusicArtist, artistName);
MPX_DEBUG2(" Artist[%S]", &artistName);
}
@@ -534,14 +510,7 @@
{
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));
- }
-
+ TPtrC art(MPXDbCommonUtil::GetColumnTextL(aRecord, EAlbumArt));
aMedia.SetTextValueL(KMPXMediaMusicAlbumArtFileName, art);
MPX_DEBUG2(" Art[%S]", &art);
}
@@ -562,34 +531,10 @@
{
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);
- MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCAlbumArtistName, artistName);
- }
+ }
}
// ----------------------------------------------------------------------------
-// CMPXDbAlbum::IsUnknownArtistL
-// ----------------------------------------------------------------------------
-//
-TBool CMPXDbAlbum::IsUnknownArtistL(TUint32 aId)
- {
- return iObserver.HandleIsUnknownArtistL(aId);
- }
-
-// ----------------------------------------------------------------------------
-// CMPXDbAlbum::ArtistForAlbumL
-// ----------------------------------------------------------------------------
-//
-HBufC* CMPXDbAlbum::ArtistForAlbumL(const TUint32 aId)
- {
- return iObserver.HandleArtistForAlbumL(aId);
- }
-
-// ----------------------------------------------------------------------------
// CMPXDbAlbum::AlbumartForAlbumL
// ----------------------------------------------------------------------------
//
@@ -599,6 +544,559 @@
}
// ----------------------------------------------------------------------------
+// CMPXDbAlbum::ProcessAlbumRecordSetL
+// Unknown album or Unknown artist are stored in the database as NULL (Name field and ArtistName field).
+// The available unknown artist is saved for later and will be appended to the array
+// as the last item among items which have the same artist.
+// The available unknown albums are saved for later and will be appended to the array
+// as the last items after all known albums are appended.
+// The unknown album and unknown artist is saved for later and will be appended to the array
+// as the last item.
+//
+// NOTE: putting unknown album to the end of the array only takes place when title
+// field is requested. normal sorting algorithm occurs if title isn't
+// requested.
+//
+// Example:
+// Album X of artist A
+// Album X of artist B
+// Album X of unknown artist
+// Album Y of artist A
+// Album Y of unknown artist
+// Unknown album of artist A
+// Unknown album of artist B
+// Unknown album of unknown artist
+// ----------------------------------------------------------------------------
+//
+void CMPXDbAlbum::ProcessAlbumRecordSetL(
+ const TArray<TMPXAttribute>& aAttrs,
+ RSqlStatement& aRecordset,
+ CMPXMediaArray& aMediaArray)
+ {
+ // populate the array
+ TBool firstRecord(ETrue);
+ CMPXMedia* unknownAlbumUnknownArtistMedia(NULL);
+ CMPXMedia* unknownMedia(NULL);
+ TUint32 prevId(0);
+ TUint32 albumId(0);
+ TUint32 prevAlbumId(0);
+ TInt count(0);
+ TInt err(KErrNone);
+
+ // Reset array for unknown artists
+ if (iUnknownArtists.Count() > 0)
+ {
+ iUnknownArtists.ResetAndDestroy();
+ }
+
+ // Reset array for unknown albums
+ if (iUnknownAlbums.Count() > 0)
+ {
+ iUnknownAlbums.ResetAndDestroy();
+ }
+
+ TInt pPath(0);
+ if (aMediaArray.Count())
+ {
+ CMPXMedia* pMedia = aMediaArray[0];
+ if (pMedia->IsSupported(KMPXMediaGeneralValue))
+ { // Query excuted by OpenL
+ pPath = pMedia->ValueTObjectL<TInt>(KMPXMediaGeneralValue);
+ MPX_ASSERT(pPath);
+ }
+ }
+
+ RArray<TMPXItemId> ids;
+ CleanupClosePushL(ids);
+
+ while ((err = aRecordset.Next()) == KSqlAtRow)
+ {
+ TUint32 rowId(aRecordset.ColumnInt64(EAlbumUniqueId));
+ if (prevId == rowId)
+ {
+ continue;
+ }
+
+ prevId = rowId;
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(aRecordset, aAttrs, *media);
+
+ albumId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXAlbum,
+ MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumName), ETrue);
+
+ // Append Known album and Unknown artists
+ count = iUnknownArtists.Count();
+ if ( prevAlbumId != albumId && count > 0)
+ {
+ unknownMedia = NULL;
+
+ for (TInt i = 0; i < count; i++)
+ {
+ unknownMedia = iUnknownArtists[i];
+ if (unknownMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.Append(unknownMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownMedia);
+ }
+
+ iUnknownArtists.ResetAndDestroy();
+ }
+
+ // for Unknown album and Unknown artist
+ if (firstRecord && (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumArtistName).Length() == 0) &&
+ (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumName).Length() == 0))
+ {
+ unknownAlbumUnknownArtistMedia = media;
+ }
+ // for Unknown albums and Known artists
+ else if (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumName).Length() == 0)
+ {
+ iUnknownAlbums.Append(media);
+ CleanupStack::Pop(media);
+ }
+ // for Known album and Unknown artist
+ else if (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumArtistName).Length() == 0)
+ {
+ iUnknownArtists.Append(media);
+ CleanupStack::Pop(media);
+
+ prevAlbumId = albumId;
+ }
+ else
+ {
+ if (media->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.AppendL(media->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ }
+
+ firstRecord = EFalse;
+ } // end while
+
+ if (err != KSqlAtEnd)
+ {
+ User::LeaveIfError(err);
+ }
+
+ // Append Known artist and Unknown albums
+ count = iUnknownArtists.Count();
+ if ( count > 0)
+ {
+ unknownMedia = NULL;
+
+ for (TInt i = 0; i < count; i++)
+ {
+ unknownMedia = iUnknownArtists[i];
+ if (unknownMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.Append(unknownMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownMedia);
+ }
+
+ iUnknownArtists.ResetAndDestroy();
+ }
+
+ // Append Unknown artists to MediaArray
+ count = iUnknownAlbums.Count();
+ if ( count > 0)
+ {
+ CMPXMedia* unknownMedia = NULL;
+
+ for (TInt i = 0; i < count; i++)
+ {
+ unknownMedia = iUnknownAlbums[i];
+ if (unknownMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.Append(unknownMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownMedia);
+ }
+
+ iUnknownAlbums.ResetAndDestroy();
+ }
+
+ // the last item in the list
+ if (unknownAlbumUnknownArtistMedia)
+ {
+ if (unknownAlbumUnknownArtistMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.AppendL(unknownAlbumUnknownArtistMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownAlbumUnknownArtistMedia);
+ CleanupStack::PopAndDestroy(unknownAlbumUnknownArtistMedia);
+ }
+
+ // Append ids to the returned path
+ if (pPath)
+ {
+ ((CMPXCollectionPath*)pPath)->AppendL(ids.Array());
+ }
+ CleanupStack::PopAndDestroy(&ids);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbAlbum::ProcessMediaWallAlbumRecordSetL
+// Unknown album or Unknown artist are stored in the database as NULL (Name field and ArtistName field).
+// The available unknown album is saved for later and will be appended to the array
+// as the last item among items which have the same artist.
+// The available unknown artists are saved for later and will be appended to the array
+// as the last items after all known artists are appended.
+// The unknown album and unknown artist is saved for later and will be appended to the array
+// as the last item.
+//
+// NOTE: putting unknown album to the end of the array only takes place when title
+// field is requested. normal sorting algorithm occurs if title isn't
+// requested.
+//
+// Example:
+// Album X of artist A
+// Album Y of artist A
+// Unknown album of artist A
+// Album X of artist B
+// Album Z of artist B
+// Unknown album of artist B
+// Album X of unknown artist
+// Album Y of unknown artist
+// Unknown album of unknown artist
+// ----------------------------------------------------------------------------
+//
+//
+void CMPXDbAlbum::ProcessMediaWallAlbumRecordSetL(
+ const TArray<TMPXAttribute>& aAttrs,
+ RSqlStatement& aRecordset,
+ CMPXMediaArray& aMediaArray)
+ {
+ // populate the array
+ TBool firstRecord(ETrue);
+ CMPXMedia* unknownAlbumUnknownArtistMedia(NULL);
+ CMPXMedia* unknownMedia(NULL);
+ TUint32 prevId(0);
+ TUint32 artistId(0);
+ TUint32 prevArtistId(0);
+ TInt count(0);
+ TInt err(KErrNone);
+
+ // Reset array for unknown artists
+ if (iUnknownArtists.Count() > 0)
+ {
+ iUnknownArtists.ResetAndDestroy();
+ }
+
+ // Reset array for unknown albums
+ if (iUnknownAlbums.Count() > 0)
+ {
+ iUnknownAlbums.ResetAndDestroy();
+ }
+
+ TInt pPath(0);
+ if (aMediaArray.Count())
+ {
+ CMPXMedia* pMedia = aMediaArray[0];
+ if (pMedia->IsSupported(KMPXMediaGeneralValue))
+ { // Query excuted by OpenL
+ pPath = pMedia->ValueTObjectL<TInt>(KMPXMediaGeneralValue);
+ MPX_ASSERT(pPath);
+ }
+ }
+
+ RArray<TMPXItemId> ids;
+ CleanupClosePushL(ids);
+
+ while ((err = aRecordset.Next()) == KSqlAtRow)
+ {
+ TUint32 rowId(aRecordset.ColumnInt64(EAlbumUniqueId));
+ if (prevId == rowId)
+ {
+ continue;
+ }
+
+ prevId = rowId;
+ CMPXMedia* media = CMPXMedia::NewL();
+ CleanupStack::PushL(media);
+
+ UpdateMediaL(aRecordset, aAttrs, *media);
+
+ artistId = aRecordset.ColumnInt64(EAlbumArtist);
+
+ // Append Known artist and Unknown albums
+ count = iUnknownAlbums.Count();
+ if (prevArtistId != artistId && count > 0)
+ {
+ unknownMedia = NULL;
+
+ for (TInt i = 0; i < count; i++)
+ {
+ unknownMedia = iUnknownAlbums[i];
+ if (unknownMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.Append(unknownMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownMedia);
+ }
+
+ iUnknownAlbums.ResetAndDestroy();
+ }
+
+ // for Unknown artist and Unknown album
+ if (firstRecord && (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumName).Length() == 0) &&
+ (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumArtistName).Length() == 0))
+ {
+ unknownAlbumUnknownArtistMedia = media;
+ }
+ // for Unknown artists and Known albums
+ else if (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumArtistName).Length() == 0)
+ {
+ iUnknownArtists.Append(media);
+ CleanupStack::Pop(media);
+ }
+ // for Known artist and Unknown album
+ else if (MPXDbCommonUtil::GetColumnTextL(aRecordset, EAlbumName).Length() == 0)
+ {
+ iUnknownAlbums.Append(media);
+ CleanupStack::Pop(media);
+ prevArtistId = artistId;
+ }
+ else
+ {
+ if (media->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.AppendL(media->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*media);
+ CleanupStack::PopAndDestroy(media);
+ }
+
+ firstRecord = EFalse;
+ } // end while
+
+ if (err != KSqlAtEnd)
+ {
+ User::LeaveIfError(err);
+ }
+
+ // Append Known artist and Unknown albums
+ count = iUnknownAlbums.Count();
+ if ( count > 0)
+ {
+ unknownMedia = NULL;
+
+ for (TInt i = 0; i < count; i++)
+ {
+ unknownMedia = iUnknownAlbums[i];
+ if (unknownMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.Append(unknownMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownMedia);
+ }
+
+ iUnknownAlbums.ResetAndDestroy();
+ }
+
+ // Append Unknown artists to MediaArray
+ count = iUnknownArtists.Count();
+ if ( count > 0)
+ {
+ CMPXMedia* unknownMedia = NULL;
+
+ for (TInt i = 0; i < count; i++)
+ {
+ unknownMedia = iUnknownArtists[i];
+ if (unknownMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.Append(unknownMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownMedia);
+ }
+
+ iUnknownArtists.ResetAndDestroy();
+ }
+
+ // the last item in the list
+ if (unknownAlbumUnknownArtistMedia)
+ {
+ if (unknownAlbumUnknownArtistMedia->IsSupported(KMPXMediaGeneralId) && pPath)
+ {
+ ids.AppendL(unknownAlbumUnknownArtistMedia->ValueTObjectL<TMPXItemId>(KMPXMediaGeneralId));
+ }
+ aMediaArray.AppendL(*unknownAlbumUnknownArtistMedia);
+ CleanupStack::PopAndDestroy(unknownAlbumUnknownArtistMedia);
+ }
+
+ // Append ids to the returned path
+ if (pPath)
+ {
+ ((CMPXCollectionPath*)pPath)->AppendL(ids.Array());
+ }
+ CleanupStack::PopAndDestroy(&ids);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbAlbum::GenerateUniqueIdL
+// ----------------------------------------------------------------------------
+//
+TUint32 CMPXDbAlbum::GenerateUniqueIdL(const CMPXMedia& aMedia)
+ {
+ TPtrC album(KNullDesC);
+ TPtrC albumArtist(KNullDesC);
+ TPtrC artist(KNullDesC);
+
+ // check Album attirbute
+ if (aMedia.IsSupported(KMPXMediaMusicAlbum))
+ {
+ album.Set(aMedia.ValueText(KMPXMediaMusicAlbum).Left(KMCMaxTextLen));
+ }
+
+ HBufC* buf(NULL);
+ if (RetrieveAlbumArtistL(aMedia, albumArtist))
+ {
+ buf = HBufC::NewLC(album.Length() + albumArtist.Length() + KAlbumAlbumArtistSeperator().Length());
+
+ buf->Des().Append(album);
+ buf->Des().Append(KAlbumAlbumArtistSeperator);
+ buf->Des().Append(albumArtist);
+ }
+ else
+ {
+ RetrieveArtist(aMedia, artist);
+
+ buf = HBufC::NewLC(album.Length() + artist.Length() + KAlbumArtistSeperator().Length());
+
+ buf->Des().Append(album);
+ buf->Des().Append(KAlbumArtistSeperator);
+ buf->Des().Append(artist);
+ }
+
+ // try to find the item first
+ TUint32 id(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXAlbum,
+ *buf, ETrue));
+ CleanupStack::PopAndDestroy(buf);
+
+ return id;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbAlbum::IsUnknownAlbumL
+// ----------------------------------------------------------------------------
+//
+TBool CMPXDbAlbum::IsUnknownAlbumL(const TUint32 aId)
+ {
+ HBufC* query = PreProcessStringLC(KQueryCategoryItem);
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, aId));
+ CleanupStack::PopAndDestroy(query);
+ CleanupClosePushL(recordset);
+
+ if (recordset.Next() != KSqlAtRow)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ TPtrC album(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumName));
+ TPtrC artistName(MPXDbCommonUtil::GetColumnTextL(recordset, EAlbumArtistName));
+
+ TBool ret = EFalse;
+ if (album.Length() == 0 || artistName.Length() == 0)
+ {
+ ret = ETrue;
+ }
+ else
+ {
+ ret = EFalse;
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbAlbum::RetrieveAlbumArtistL
+// ----------------------------------------------------------------------------
+//
+TBool CMPXDbAlbum::RetrieveAlbumArtistL(const CMPXMedia& aMedia, TPtrC& aName)
+ {
+ // check AlbumArtist attribute
+ if (aMedia.IsSupported(KMPXMediaMusicAlbumArtist))
+ {
+ aName.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtist).Left(KMCMaxTextLen));
+ }
+ else
+ {
+ aName.Set(KNullDesC);
+ }
+
+ if (aName.Length() > 0 )
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbAlbum::RetrieveArtist
+// ----------------------------------------------------------------------------
+//
+void CMPXDbAlbum::RetrieveArtist(const CMPXMedia& aMedia, TPtrC& aName)
+ {
+ // check Artist attribute
+ if (aMedia.IsSupported(KMPXMediaMusicArtist))
+ {
+ aName.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen));
+ }
+ else
+ {
+ aName.Set(KNullDesC);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbAlbum::NeedToUpdateArt
+// ----------------------------------------------------------------------------
+//
+TBool CMPXDbAlbum::NeedToUpdateArt(const TDesC& aDeletedSongArt, const TDesC& aCurrentAlbumArt)
+ {
+ if (aDeletedSongArt.Length() == 0)
+ {
+ // Deleted song's art has default album art
+ return EFalse;
+ }
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+ else
+ if (aDeletedSongArt.Length() > 0)
+ {
+ TParsePtrC parse(aDeletedSongArt);
+ 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)
+ {
+ // Deleted song's art is Non-embedded album art
+ return EFalse;
+ }
+ }
+ else
+#endif
+ if (aDeletedSongArt.Length() > 0 && aCurrentAlbumArt.Length() > 0 && aDeletedSongArt.CompareF(aCurrentAlbumArt) == 0)
+ {
+ // Deleted song's art is Embedded album art and it is the same as Album's current art
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// ----------------------------------------------------------------------------
// CMPXDbAlbum::CreateTableL
// ----------------------------------------------------------------------------
//
@@ -609,9 +1107,7 @@
MPX_FUNC("CMPXDbCategory::CreateTableL");
// create the table
- HBufC* query = PreProcessStringLC(KAlbumCreateTable);
- User::LeaveIfError(aDatabase.Exec(*query));
- CleanupStack::PopAndDestroy(query);
+ User::LeaveIfError(aDatabase.Exec(KAlbumCreateTable));
// do not create an index on the Name field
// as it only slows down the insert/update queries overall
@@ -626,9 +1122,7 @@
{
MPX_FUNC("CMPXDbCategory::CheckTableL");
- HBufC* query = PreProcessStringLC(KAlbumCheckTable);
- TBool check(DoCheckTable(aDatabase, *query));
- CleanupStack::PopAndDestroy(query);
+ TBool check(DoCheckTable(aDatabase, KAlbumCheckTable));
return check;
}
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbartist.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbartist.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -42,12 +42,11 @@
//
CMPXDbArtist* CMPXDbArtist::NewL(
CMPXDbManager& aDbManager,
- TMPXGeneralCategory aCategory,
- MMPXDbArtistObserver& aObserver)
+ TMPXGeneralCategory aCategory)
{
MPX_FUNC("CMPXDbArtist::NewL");
- CMPXDbArtist* self = CMPXDbArtist::NewLC(aDbManager, aCategory, aObserver);
+ CMPXDbArtist* self = CMPXDbArtist::NewLC(aDbManager, aCategory);
CleanupStack::Pop(self);
return self;
}
@@ -58,12 +57,11 @@
//
CMPXDbArtist* CMPXDbArtist::NewLC(
CMPXDbManager& aDbManager,
- TMPXGeneralCategory aCategory,
- MMPXDbArtistObserver& aObserver)
+ TMPXGeneralCategory aCategory)
{
MPX_FUNC("CMPXDbArtist::NewLC");
- CMPXDbArtist* self = new (ELeave) CMPXDbArtist(aDbManager, aCategory, aObserver);
+ CMPXDbArtist* self = new (ELeave) CMPXDbArtist(aDbManager, aCategory);
CleanupStack::PushL(self);
self->ConstructL();
return self;
@@ -84,10 +82,8 @@
//
CMPXDbArtist::CMPXDbArtist(
CMPXDbManager& aDbManager,
- TMPXGeneralCategory aCategory,
- MMPXDbArtistObserver& aObserver) :
- CMPXDbCategory(aDbManager, aCategory),
- iObserver(aObserver)
+ TMPXGeneralCategory aCategory) :
+ CMPXDbCategory(aDbManager, aCategory)
{
MPX_FUNC("CMPXDbArtist::CMPXDbArtist");
}
@@ -108,58 +104,63 @@
// ----------------------------------------------------------------------------
//
TUint32 CMPXDbArtist::AddItemL(
- const TDesC& aName,
- const TDesC& aArt,
+ TMPXGeneralCategory /*aCategory*/,
+ const CMPXMedia& aMedia,
TInt aDriveId,
TBool& aNewRecord,
TBool aCaseSensitive)
{
MPX_FUNC("CMPXDbArtist::AddItemL");
+ TPtrC artist(KNullDesC);
+ TPtrC albumArt(KNullDesC);
+
+ if (aMedia.IsSupported(KMPXMediaMusicArtist))
+ {
+ artist.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen));
+ }
+
+ if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
+ {
+ albumArt.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
+ }
+
// try to find the item first
TUint32 rowId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), iCategory,
- aName, aCaseSensitive));
- aNewRecord = !CategoryItemExistsL(aDriveId, rowId);
+ artist, aCaseSensitive));
- if (aNewRecord)
+ HBufC* query = PreProcessStringLC(KQueryCategoryItem);
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aDriveId, *query, rowId));
+ CleanupStack::PopAndDestroy(query);
+ CleanupClosePushL(recordset);
+
+ TInt result(recordset.Next());
+ if (result == KSqlAtEnd)
{
+ aNewRecord = result;
+
// insert new
- HBufC* query = PreProcessStringLC(KQueryArtistInsert);
- HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName);
- HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(aArt);
+ HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(artist);
+ HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(albumArt);
- iDbManager.ExecuteQueryL(aDriveId, *query, rowId, name, 1, art);
+ iDbManager.ExecuteQueryL(aDriveId, KQueryArtistInsert, rowId, name, 1, 0, art);
CleanupStack::PopAndDestroy(art);
CleanupStack::PopAndDestroy(name);
- CleanupStack::PopAndDestroy(query);
}
- else
+ else if (result == KSqlAtRow)
{
- // retrieve the existing record
- HBufC* query = NULL;
- query = PreProcessStringLC(KQueryCategoryItem);
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, rowId));
- CleanupStack::PopAndDestroy(query);
-
- CleanupClosePushL(recordset);
-
- if (recordset.Next() != KSqlAtRow)
- {
- User::Leave(KErrNotFound);
- }
-
- // Album Art
+ // retrieve Art from Artist table
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 )
+ if ( art == KNullDesC && albumArt != KNullDesC )
{
HBufC* artReplaceSingleQuote =
- MPXDbCommonUtil::ProcessSingleQuotesLC( aArt );
+ MPXDbCommonUtil::ProcessSingleQuotesLC( albumArt );
_LIT( KFormatArt, "Art=\'%S\'" );
- HBufC* setStr = HBufC::NewLC(256);
+ HBufC* setStr = HBufC::NewLC(KMaxFileName);
setStr->Des().Format( KFormatArt, artReplaceSingleQuote );
iDbManager.ExecuteQueryL(aDriveId, KQueryArtistUpdate, setStr, rowId);
@@ -167,35 +168,68 @@
CleanupStack::PopAndDestroy(artReplaceSingleQuote);
}
- CleanupStack::PopAndDestroy(&recordset);
-
// increment the number of songs for the category
query = PreProcessStringLC(KQueryCategoryIncrementSongCount);
iDbManager.ExecuteQueryL(aDriveId, *query, rowId);
CleanupStack::PopAndDestroy(query);
}
-
+ else
+ {
+ MPX_DEBUG2("SQL error %d", result);
+ User::Leave(result);
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+
return rowId;
}
-
+
// ----------------------------------------------------------------------------
-// CMPXDbArtist::IsUnknownArtistL
+// CMPXDbArtist::DecrementSongsForCategoryL
// ----------------------------------------------------------------------------
//
-TBool CMPXDbArtist::IsUnknownArtistL(TUint32 aId)
+void CMPXDbArtist::DecrementSongsForCategoryL(
+ const TUint32 aId,
+ TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages,
+ TBool& aItemExist
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+ ,
+ TBool /*aMTPInUse*/
+#endif //ABSTRACTAUDIOALBUM_INCLUDED
+ )
{
- MPX_FUNC("CMPXDbArtist::IsUnknownArtistL");
-
- HBufC* name = GetNameL(aId);
+ MPX_FUNC("CMPXDbArtist::DecrementSongsForCategoryL");
+
+ TInt songsCount(0);
+ TInt albumsCount(0);
+
+ GetSongsAndAlbumsCountL(aDriveId, aId, songsCount, albumsCount);
+
+ MPX_DEBUG4("id %d, songsCount %d, albumsCount %d", aId, songsCount, albumsCount);
+
+ // if just one song uses this category. Use <= just in case
+ if (songsCount <= 1 && albumsCount == 0)
+ {
+ aItemExist = EFalse;
+ // delete the category
+ DeleteCategoryL(aId, aDriveId);
- TInt ret = EFalse;
- if (*name == KNullDesC)
- {
- ret = ETrue;
- }
- delete name;
-
- return ret;
+ if (aItemChangedMessages)
+ {
+ // add the item changed message
+ MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aId, EMPXItemDeleted,
+ iCategory, KDBPluginUid);
+ }
+ }
+ else if (songsCount > 0)
+ {
+ aItemExist = ETrue;
+ // decrement the number of songs for the category
+ HBufC* query = PreProcessStringLC(KQueryCategoryDecrementSongCount);
+ iDbManager.ExecuteQueryL(aDriveId, *query, aId);
+ CleanupStack::PopAndDestroy(query);
+ }
}
// ----------------------------------------------------------------------------
@@ -237,10 +271,6 @@
}
if (attributeId & EMPXMediaGeneralCount)
{
-// TInt albumCount = GetAlbumsCountL(aRecord.ColumnInt64(EArtistUniqueId));
-// aMedia.SetTObjectValueL<TInt>(KMPXMediaGeneralCount,albumCount);
-// MPX_DEBUG1(" EMPXMediaGeneralCount");
-// MPX_DEBUG2(" AlbumCount[%d]", albumCount);
// get songs count from all drives
TInt songCount = GetSongsCountL( KDbManagerAllDrives,
aRecord.ColumnInt64( EArtistUniqueId ) );
@@ -281,17 +311,6 @@
}
// ----------------------------------------------------------------------------
-// CMPXDbArtist::GetAlbumsCountL
-// ----------------------------------------------------------------------------
-//
-TInt CMPXDbArtist::GetAlbumsCountL(TUint32 aId)
- {
- MPX_FUNC("CMPXDbArtist::GetAlbumsCountL");
-
- return iObserver.HandleGetAlbumsCountForArtistL(aId);
- }
-
-// ----------------------------------------------------------------------------
// CMPXDbArtist::GetAllCategoryItemsL
// ----------------------------------------------------------------------------
//
@@ -300,9 +319,7 @@
CMPXMediaArray& aMediaArray)
{
MPX_FUNC("CMPXDbArtist::GetAllCategoryItemsL");
- HBufC* query = PreProcessStringLC(KQueryArtistAll);
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query));
- CleanupStack::PopAndDestroy(query);
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryArtistAll()));
CleanupClosePushL(recordset);
ProcessRecordsetL(aAttrs, recordset, aMediaArray);
CleanupStack::PopAndDestroy(&recordset);
@@ -343,37 +360,169 @@
CleanupStack::PopAndDestroy(values);
CleanupStack::PopAndDestroy(fields);
}
+
// ----------------------------------------------------------------------------
-// CMPXDbAlbum::CreateTableL
+// CMPXDbArtist::AddAlbumArtistL
+// ----------------------------------------------------------------------------
+//
+TUint32 CMPXDbArtist::AddAlbumArtistL(
+ const TDesC& aName,
+ const TDesC& aArt,
+ TInt aDriveId)
+ {
+ MPX_FUNC("CMPXDbArtist::AddAlbumArtistL");
+
+ // try to find the item first
+ TUint32 rowId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), iCategory,
+ aName, ETrue));
+ HBufC* query = PreProcessStringLC(KQueryCategoryItem);
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(aDriveId, *query, rowId));
+ CleanupStack::PopAndDestroy(query);
+ CleanupClosePushL(recordset);
+
+ TInt result(recordset.Next());
+ if (result == KSqlAtEnd)
+ {
+ // insert new
+ HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName);
+ HBufC* art = MPXDbCommonUtil::ProcessSingleQuotesLC(aArt);
+
+ iDbManager.ExecuteQueryL(aDriveId, KQueryArtistInsert, rowId, name, 0, 1, art);
+
+ CleanupStack::PopAndDestroy(art);
+ CleanupStack::PopAndDestroy(name);
+ }
+ else if (result == KSqlAtRow)
+ {
+ // retrieve Art from Artist table
+ 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 )
+ {
+ HBufC* artReplaceSingleQuote =
+ MPXDbCommonUtil::ProcessSingleQuotesLC( aArt );
+ _LIT( KFormatArt, "Art=\'%S\'" );
+ HBufC* setStr = HBufC::NewLC(KMaxFileName);
+ setStr->Des().Format( KFormatArt, artReplaceSingleQuote );
+
+ iDbManager.ExecuteQueryL(aDriveId, KQueryArtistUpdate, setStr, rowId);
+ CleanupStack::PopAndDestroy(setStr);
+ CleanupStack::PopAndDestroy(artReplaceSingleQuote);
+ }
+
+ // increment the number of songs for the category
+ iDbManager.ExecuteQueryL(aDriveId, KQueryArtistIncrementAlbumCount, rowId);
+ }
+ else
+ {
+ MPX_DEBUG2("SQL error %d", result);
+ User::Leave(result);
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+
+ return rowId;
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbArtist::DecrementAlbumsForArtistL
+// ----------------------------------------------------------------------------
+//
+void CMPXDbArtist::DecrementAlbumsForArtistL(
+ const TUint32 aId,
+ TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages
+ )
+ {
+ MPX_FUNC("CMPXDbArtist::DecrementAlbumsForCategoryL");
+
+ TInt songsCount(0);
+ TInt albumsCount(0);
+
+ GetSongsAndAlbumsCountL(aDriveId, aId, songsCount, albumsCount);
+
+ MPX_DEBUG4("id %d, songsCount %d, albumsCount %d", aId, songsCount, albumsCount);
+
+ // if just one album uses this category. Use <= just in case
+ if (songsCount == 0 && albumsCount <= 1)
+ {
+ // delete the category
+ DeleteCategoryL(aId, aDriveId);
+
+ if (aItemChangedMessages)
+ {
+ // add the item changed message
+ MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aId, EMPXItemDeleted,
+ iCategory, KDBPluginUid);
+ }
+ }
+ else if (albumsCount > 0)
+ {
+ // decrement the number of albums for the category
+ iDbManager.ExecuteQueryL(aDriveId, KQueryArtistDecrementAlbumCount, aId);
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbArtist::GetSongsAndAlbumsCountL
+// ----------------------------------------------------------------------------
+//
+void CMPXDbArtist::GetSongsAndAlbumsCountL(
+ TInt aDriveId,
+ TUint32 aId,
+ TInt& aSongCount,
+ TInt& aAlbumCount)
+ {
+ MPX_FUNC("CMPXDbArtist::GetSongsAndAlbumsCountL");
+
+ RSqlStatement recordset(
+ iDbManager.ExecuteSelectQueryL(aDriveId, KQueryArtistGetSongCountAndAlbumCount, aId));
+ CleanupClosePushL(recordset);
+
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
+ {
+ aSongCount += recordset.ColumnInt(KMPXTableDefaultIndex);
+ aAlbumCount += recordset.ColumnInt(KMPXTableDefaultIndex+1);
+ }
+
+ if (err != KSqlAtEnd)
+ {
+ User::Leave(err);
+ }
+
+ CleanupStack::PopAndDestroy(&recordset);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbArtist::CreateTableL
// ----------------------------------------------------------------------------
//
void CMPXDbArtist::CreateTableL(
RSqlDatabase& aDatabase,
TBool /* aCorruptTable */)
{
- MPX_FUNC("CMPXDbCategory::CreateTableL");
+ MPX_FUNC("CMPXDbArtist::CreateTableL");
// create the table
- HBufC* query = PreProcessStringLC(KArtistCreateTable);
- User::LeaveIfError(aDatabase.Exec(*query));
- CleanupStack::PopAndDestroy(query);
+ User::LeaveIfError(aDatabase.Exec(KArtistCreateTable));
// do not create an index on the Name field
// as it only slows down the insert/update queries overall
}
// ----------------------------------------------------------------------------
-// CMPXDbAlbum::CheckTableL
+// CMPXDbArtist::CheckTableL
// ----------------------------------------------------------------------------
//
TBool CMPXDbArtist::CheckTableL(
RSqlDatabase& aDatabase)
{
- MPX_FUNC("CMPXDbCategory::CheckTableL");
+ MPX_FUNC("CMPXDbArtist::CheckTableL");
- HBufC* query = PreProcessStringLC(KArtistCheckTable);
- TBool check(DoCheckTable(aDatabase, *query));
- CleanupStack::PopAndDestroy(query);
+ TBool check(DoCheckTable(aDatabase, KArtistCheckTable));
return check;
}
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcategory.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbcategory.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -30,6 +30,7 @@
#include "mpxdbpluginqueries.h"
#include "mpxdbutil.h"
#include "mpxdbcategory.h"
+#include "mpxmediamusicdefs.h"
// CONSTANTS
@@ -79,23 +80,26 @@
// ----------------------------------------------------------------------------
//
TUint32 CMPXDbCategory::AddItemL(
- const TDesC& aName,
+ TMPXGeneralCategory aCategory,
+ const CMPXMedia& aMedia,
TInt aDriveId,
TBool& aNewRecord,
TBool aCaseSensitive)
{
MPX_FUNC("CMPXDbCategory::AddItemL");
+ TPtrC itemName(ItemNameL(aCategory, aMedia));
+
// try to find the item first
TUint32 rowId(MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), iCategory,
- aName, aCaseSensitive));
+ itemName, aCaseSensitive));
aNewRecord = !CategoryItemExistsL(aDriveId, rowId);
if (aNewRecord)
{
// insert new
HBufC* query = PreProcessStringLC(KQueryCategoryInsert);
- HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(aName);
+ HBufC* name = MPXDbCommonUtil::ProcessSingleQuotesLC(itemName);
iDbManager.ExecuteQueryL(aDriveId, *query, rowId, name, 1);
@@ -112,7 +116,7 @@
return rowId;
}
-
+
// ----------------------------------------------------------------------------
// CMPXDbCategory::GetNameL
// ----------------------------------------------------------------------------
@@ -240,20 +244,37 @@
}
// construct criteria string
- HBufC* criteriaStr = MPXDbCommonUtil::StringFromArrayLC(*criteriaArray, KMCAndKeyword);
+ HBufC* criteriaStr = NULL;
+ if (criteriaArray->Count() > 0)
+ {
+ criteriaStr = MPXDbCommonUtil::StringFromArrayLC(*criteriaArray, KMCAndKeyword);
+ }
+ else
+ {
+ _LIT(KCriteriaTrue, "1");
+ criteriaStr = KCriteriaTrue().AllocLC();
+ }
+
+ RSqlStatement recordset;
+ if (iCategory == EMPXArtist)
+ {
+ recordset = iDbManager.ExecuteSelectQueryL(KQueryArtistItems, criteriaStr);
+ CleanupStack::PopAndDestroy(2, criteriaArray); //criteriaStr, criteriaArray
+ }
+ else
+ {
+ HBufC* query = PreProcessStringLC(KQueryCategoryItems);
+ recordset = iDbManager.ExecuteSelectQueryL(*query, criteriaStr);
+ CleanupStack::PopAndDestroy(3, criteriaArray); //query, criteriaStr, criteriaArray
+ }
- // either get all items or items filtered based on criteria
- HBufC* query = PreProcessStringLC(criteriaStr->Length() ?
- KQueryCategoryItems() : KQueryCategoryAll());
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(*query, criteriaStr));
- CleanupStack::PopAndDestroy(3, criteriaArray); // query, criteriaStr, criteriaArray
CleanupClosePushL(recordset);
// process the results
ProcessRecordsetL(aAttrs, recordset, aMediaArray);
CleanupStack::PopAndDestroy(&recordset);
}
-
+
// ----------------------------------------------------------------------------
// CMPXDbCategory::DecrementSongsForCategoryL
// ----------------------------------------------------------------------------
@@ -409,16 +430,6 @@
{
MPX_FUNC("CMPXDbCategory::GetSubCategoryItemsL");
- // this is only valid for albums belonging to an artist
- ASSERT((iCategory == EMPXAlbum) && (aParentCategory == EMPXArtist));
-
- // to handle the UREL warning
- (void)aParentCategory;
-
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryCategorySubcategoryItems, aParentId));
- CleanupClosePushL(recordset);
- ProcessRecordsetL(aAttrs, recordset, aMediaArray);
- CleanupStack::PopAndDestroy(&recordset);
}
// ----------------------------------------------------------------------------
@@ -486,7 +497,9 @@
TInt /*aDriveId*/,
CMPXMessageArray* /*aItemChangedMessages*/)
{
- // nothing
+ MPX_FUNC("CMPXDbCategory::UpdateItemL");
+
+ // do nothing
}
// ----------------------------------------------------------------------------
@@ -574,7 +587,7 @@
// ----------------------------------------------------------------------------
// CMPXDbCategory::ProcessRecordsetL
-// Unknown item is stored in the database as NULL (name field). This ensures the
+// Unknown item is stored in the database as empty string (name field). This ensures the
// unknown item to be the 1st found record if it exists. This will save time in
// searching for the unknown record among the results and avoid performing
// descriptor comparison. If the 1st record is the unknown item, it won't be
@@ -666,6 +679,46 @@
}
// ----------------------------------------------------------------------------
+// CMPXDbCategory::ItemNameL
+// ----------------------------------------------------------------------------
+//
+TPtrC CMPXDbCategory::ItemNameL(
+ TMPXGeneralCategory aCategory,
+ const CMPXMedia& aMedia)
+ {
+ MPX_FUNC("CMPXDbCategory::ItemNameL");
+
+ TMPXAttribute attribute;
+ switch(aCategory)
+ {
+ case EMPXGenre:
+ {
+ attribute = KMPXMediaMusicGenre;
+ break;
+ }
+ case EMPXComposer:
+ {
+ attribute = KMPXMediaMusicComposer;
+ break;
+ }
+ default:
+ {
+ User::Leave(KErrArgument);
+ break;
+ }
+ }
+
+ if (aMedia.IsSupported(attribute))
+ {
+ return aMedia.ValueText(attribute).Left(KMCMaxTextLen);
+ }
+ else
+ {
+ return KNullDesC();
+ }
+ }
+
+// ----------------------------------------------------------------------------
// CMPXDbCategory::CreateTableL
// ----------------------------------------------------------------------------
//
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbhandler.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -174,7 +174,7 @@
//
iDbMusic = CMPXDbMusic::NewL(*iDbManager, iResource, *this);
iDbPlaylist = CMPXDbPlaylist::NewL(*iDbManager, *this);
- iDbArtist = CMPXDbArtist::NewL(*iDbManager, EMPXArtist, *this);
+ iDbArtist = CMPXDbArtist::NewL(*iDbManager, EMPXArtist);
iDbAlbum = CMPXDbAlbum::NewL(*iDbManager, EMPXAlbum, *this);
iDbGenre = CMPXDbGenre::NewL(*iDbManager, EMPXGenre);
iDbComposer = CMPXDbComposer::NewL(*iDbManager, EMPXComposer);
@@ -2160,7 +2160,7 @@
// Update the category records
TBool categoryExist( EFalse );
iDbArtist->DecrementSongsForCategoryL(artistID, drive, &aItemChangedMessages, categoryExist);
- iDbAlbum->DecrementSongsForCategoryL(albumID, drive, &aItemChangedMessages, categoryExist, artistID, *art);
+ iDbAlbum->DecrementSongsForAlbumL(albumID, drive, &aItemChangedMessages, categoryExist, *art);
iDbGenre->DecrementSongsForCategoryL(genreID, drive, &aItemChangedMessages, categoryExist);
iDbComposer->DecrementSongsForCategoryL(composerID, drive, &aItemChangedMessages, categoryExist);
CleanupStack::PopAndDestroy(art);
@@ -2563,7 +2563,16 @@
//////////////////////////////////////////////////////////////////////
else
{
- iDbMusic->FindSongsL(id, containerId, type, aCriteria, aAttrs, aMediaArray);
+ TBool sortByTrackOrder = EFalse;
+
+ // construct the sort order depending on category. Albums are always sorted by track,
+ // then name, except for unknown album. Songs are sorted by name for unknown album.
+ // NULL track number is stored as KMaxTInt so that they will be sorted to the end
+ if ((type == EMPXGroup) && (MPX_ITEM_CATEGORY(id) == EMPXAlbum) && !iDbAlbum->IsUnknownAlbumL(id))
+ {
+ sortByTrackOrder = ETrue;
+ }
+ iDbMusic->FindSongsL(id, containerId, type, aCriteria, aAttrs, aMediaArray, sortByTrackOrder);
}
}
@@ -3049,103 +3058,63 @@
#endif // RD_MULTIPLE_DRIVE
// ----------------------------------------------------------------------------
+// CMPXDbHandler::AddAbstractAlbumItemL
+// ----------------------------------------------------------------------------
+//
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+TUint32 CMPXDbHandler::AddAbstractAlbumItemL(
+ const TDesC& aName,
+ TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages,
+ TBool& aItemExist,
+ const TDesC& aUri,
+ const TDesC& aAlbumArtist
+ )
+ {
+ MPX_FUNC("CMPXDbHandler::AddAbstractAlbumItemL()");
+
+ MPX_PERF_START(CMPXDbHandler_AddAbstractAlbumItemL);
+
+ TBool newRecord(EFalse);
+ TUint32 id(0);
+
+ //AbstractAlbum is not case sensitive
+ id = iDbAbstractAlbum->AddItemL(aUri, aName, aAlbumArtist, aDriveId, newRecord, EFalse);
+ MPX_PERF_END(CMPXDbHandler_AddAbstractAlbumItemL);
+
+ return id;
+ }
+#endif
+
+// ----------------------------------------------------------------------------
// CMPXDbHandler::AddCategoryItemL
// ----------------------------------------------------------------------------
//
TUint32 CMPXDbHandler::AddCategoryItemL(
TMPXGeneralCategory aCategory,
- const TDesC& aName,
+ const CMPXMedia& aMedia,
TInt aDriveId,
CMPXMessageArray* aItemChangedMessages,
- TBool& aItemExist
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED
- ,const TDesC& aUri
- ,const TDesC& aAlbumArtist
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
- )
+ TBool& aItemExist)
{
MPX_FUNC("CMPXDbHandler::AddCategoryItemL()");
-
+
MPX_PERF_START(CMPXDbHandler_AddCategoryItemL);
+ ASSERT(aCategory != EMPXAbstractAlbum);
+
TBool newRecord(EFalse);
-#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(aUri, aName, aAlbumArtist, aDriveId, newRecord, caseSensitive);
- }
- else
- {
- id = DbCategoryL(aCategory)->AddItemL(aName, aDriveId, newRecord, caseSensitive);
-#else
- TUint32 id(DbCategoryL(aCategory)->AddItemL(aName, aDriveId, newRecord, (aCategory != EMPXGenre)));
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
+ TUint32 id = DbCategoryL(aCategory)->AddItemL(aCategory, aMedia, aDriveId, newRecord, aCategory != EMPXGenre);
if (newRecord && aItemChangedMessages)
{
MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemInserted,
aCategory, KDBPluginUid);
}
- // when the added item's category is Genre or Composer,
- // and it is NOT a new record,
+ // when the added item's category is Genre, Composer or Artist, and it is NOT a new record,
// we should send the item number changed message
- else if ( ( aCategory == EMPXGenre || aCategory == EMPXComposer ) &&
- !newRecord && aItemChangedMessages )
- {
- MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemModified,
- aCategory, KDBPluginUid);
- }
- aItemExist = !newRecord;
-#ifdef ABSTRACTAUDIOALBUM_INCLUDED
- }
-#endif // ABSTRACTAUDIOALBUM_INCLUDED
- MPX_PERF_END(CMPXDbHandler_AddCategoryItemL);
- return id;
- }
-
-TUint32 CMPXDbHandler::AddCategoryItemL(
- TMPXGeneralCategory aCategory,
- const TDesC& aName,
- const TDesC& aArtistName,
- const TDesC& aArt,
- TInt aDriveId,
- CMPXMessageArray* aItemChangedMessages,
- TBool& aItemExist)
- {
- MPX_FUNC("CMPXDbHandler::AddCategoryItemL()");
-
- MPX_PERF_START(CMPXDbHandler_AddCategoryItemL);
-
- TBool newRecord(EFalse);
-
- TUint32 id = 0;
- if(aCategory == EMPXAlbum)
- {
- id = iDbAlbum->AddItemL(aName, aArtistName, aArt, aDriveId, newRecord, (aCategory != EMPXGenre));
- }
- else
- {
- id = iDbArtist->AddItemL(aName, aArt, aDriveId, newRecord, (aCategory != EMPXGenre));
- }
-
- if (newRecord && aItemChangedMessages)
- {
- MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemInserted,
- aCategory, KDBPluginUid);
- }
- // when the added item's category is Artist, and it is NOT a new record,
- // we should send the item number changed message
- else if ( aCategory == EMPXArtist &&
+ else if ( ( aCategory == EMPXGenre || aCategory == EMPXComposer || aCategory == EMPXArtist) &&
!newRecord && aItemChangedMessages )
{
MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, id, EMPXItemModified,
@@ -3154,31 +3123,23 @@
aItemExist = !newRecord;
MPX_PERF_END(CMPXDbHandler_AddCategoryItemL);
- return id;
+ return id;
}
+// ----------------------------------------------------------------------------
+// CMPXDbHandler::UpdateCategoryItemL
+// ----------------------------------------------------------------------------
+//
void CMPXDbHandler::UpdateCategoryItemL(
- TMPXGeneralCategory aCategory,
- TUint32 aCategoryId,
- const CMPXMedia& aMedia,
- TInt aDrive,
- CMPXMessageArray* aItemChangedMessages)
+ 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:
- DbCategoryL(aCategory)->UpdateItemL(aCategoryId, aMedia, aDrive, aItemChangedMessages);
- break;
- }
+ DbCategoryL(aCategory)->UpdateItemL(aCategoryId, aMedia, aDrive, aItemChangedMessages);
}
+
// ----------------------------------------------------------------------------
// CMPXDbHandler::DeleteSongForCategoryL
// ----------------------------------------------------------------------------
@@ -3188,11 +3149,21 @@
TUint32 aCategoryId,
TInt aDriveId,
CMPXMessageArray* aItemChangedMessages,
- TBool& aItemExist)
+ TBool& aItemExist,
+ const TDesC& aArt
+ )
{
MPX_FUNC("CMPXDbHandler::DeleteSongForCategoryL");
- DbCategoryL(aCategory)->DecrementSongsForCategoryL(aCategoryId, aDriveId,
- aItemChangedMessages, aItemExist);
+ switch(aCategory)
+ {
+ case EMPXAlbum:
+ iDbAlbum->DecrementSongsForAlbumL(aCategoryId, aDriveId, aItemChangedMessages, aItemExist, aArt);
+ break;
+ default:
+ DbCategoryL(aCategory)->DecrementSongsForCategoryL(aCategoryId, aDriveId,
+ aItemChangedMessages, aItemExist);
+ break;
+ }
}
// ----------------------------------------------------------------------------
@@ -3233,7 +3204,6 @@
SetTObjectValueL<TMPXItemId>(KMPXMessageMediaDeprecatedId, plId);
}
-
// ---------------------------------------------------------------------------
// CMPXDbHandler::IsRemoteDrive
// ---------------------------------------------------------------------------
@@ -3279,28 +3249,6 @@
CleanupStack::PopAndDestroy(&attributes);
}
-TInt CMPXDbHandler::HandleGetAlbumsCountForArtistL(TUint32 aArtistId)
- {
- return iDbAlbum->GetAlbumsCountForArtistL(aArtistId);
- }
-
-TBool CMPXDbHandler::HandleIsUnknownArtistL(TUint32 aArtistId)
- {
- return iDbArtist->IsUnknownArtistL(aArtistId);
- }
-
-// ---------------------------------------------------------------------------
-// CMPXDbHandler::HandleArtistForAlbumL
-// ---------------------------------------------------------------------------
-//
-HBufC* CMPXDbHandler::HandleArtistForAlbumL(const TUint32 aAlbumId)
- {
-
- TUint32 artistId = iDbMusic->ArtistForAlbumL(aAlbumId);
- HBufC* artistname = GetNameMatchingIdL(artistId);
- return artistname;
- }
-
// ---------------------------------------------------------------------------
// CMPXDbHandler::HandleAlbumartForAlbumL
// ---------------------------------------------------------------------------
@@ -3309,6 +3257,7 @@
{
return iDbMusic->AlbumartForAlbumL(aAlbumId, aArt);
}
+
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
// ----------------------------------------------------------------------------------------------------------
// CMPXDbHandler::HandleGetAlbumNameForSongL
@@ -3319,4 +3268,43 @@
return iDbAbstractAlbum->GetUriL(aId);
}
#endif // ABSTRACTAUDIOALBUM_INCLUDED
+
+// ----------------------------------------------------------------------------
+// CMPXDbHandler::DeleteAlbumForArtistL
+// ----------------------------------------------------------------------------
+//
+void CMPXDbHandler::DeleteAlbumForArtistL(TUint32 aCategoryId,
+ TInt aDrive, CMPXMessageArray* aItemChangedMessages)
+ {
+ MPX_FUNC("CMPXDbHandler::DeleteAlbumForArtistL");
+ iDbArtist->DecrementAlbumsForArtistL(aCategoryId, aDrive, aItemChangedMessages);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbHandler::AddAlbumArtistL
+// ----------------------------------------------------------------------------
+//
+TUint32 CMPXDbHandler::AddAlbumArtistL(const TDesC& aName, const TDesC& aArt, TInt aDriveId)
+ {
+ MPX_FUNC("CMPXDbHandler::AddAlbumArtistL");
+ return iDbArtist->AddAlbumArtistL(aName, aArt, aDriveId);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbHandler::GenerateUniqueIdForAlbumL
+// ----------------------------------------------------------------------------
+//
+TUint32 CMPXDbHandler::GenerateUniqueIdForAlbumL(const CMPXMedia& aMedia)
+ {
+ return iDbAlbum->GenerateUniqueIdL(aMedia);
+ }
+
+// ----------------------------------------------------------------------------
+// CMPXDbHandler::IsUnknownAlbumL
+// ----------------------------------------------------------------------------
+//
+TBool CMPXDbHandler::IsUnknownAlbumL(const TUint32 aId)
+ {
+ return iDbAlbum->IsUnknownAlbumL(aId);
+ }
// End of file
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -42,12 +42,6 @@
// CONSTANTS
-// This is what KNullDesC album computes to for the hash
-// to-do: generate this Id through
-// MPXDbUtil::GenerateUniqueIdL(EMPXAlbum, KNullDesC, EFalse)
-// instead of hard-coding the number so if GenerateUniqueIdL
-// is modified, this constant doesn't need to be redefined
-const TInt KUnknownAlbumID = 1770790356;
// UniqueID column in Uris requests
const TInt KColUniqueID = 0;
// URI column in Uris requests
@@ -254,22 +248,25 @@
User::Leave(KErrNotFound);
}
+#ifdef ABSTRACTAUDIOALBUM_INCLUDED
+ iArtNeedUpdated = ETrue; // reset flag
+#endif
TDriveUnit driveUnit(MPXDbCommonUtil::GetDriveIdMatchVolIdL(iDbManager.Fs(),
recordset.ColumnInt64(EMusicVolumeId)));
visible = DoUpdateSongL(aSongId, aMedia, driveUnit, aItemChangedMessages,
recordset);
-
+
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
if(iArtNeedUpdated)
{
#endif // ABSTRACTAUDIOALBUM_INCLUDED
// Update Album table
- if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName) || aMedia.IsSupported(KMPXMediaMusicArtist))
+ if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
{
TUint32 albumId = recordset.ColumnInt64(EMusicAlbum);
iObserver.UpdateCategoryItemL(EMPXAlbum, albumId, aMedia, driveUnit, aItemChangedMessages);
}
-
+
// Update Artist table
if ( aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName) )
{
@@ -278,7 +275,6 @@
}
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
}
- iArtNeedUpdated = ETrue; //reset flag
#endif // ABSTRACTAUDIOALBUM_INCLUDED
CleanupStack::PopAndDestroy(&recordset);
}
@@ -685,22 +681,18 @@
{
MPX_FUNC("CMPXDbMusic::GetAllSongsLimitedL");
- // Reset and create a cache for the query results.
+ // Reset the previous query results. This will cause creation of query result
+ // cache during actual incremental open stage (i.e. GetSongsAtOffsetL).
if (iAllSongsQueryResult.Count())
{
iAllSongsQueryResult.ResetAndDestroy();
}
- ExecuteQueryAllSongsL(aAttrs);
-
- TInt limit = aLimit > iAllSongsQueryResult.Count() ?
- iAllSongsQueryResult.Count() : aLimit;
-
- for ( TInt i=0; i < limit; i++ )
- {
- CMPXMedia* m = iAllSongsQueryResult[i];
- aMediaArray.AppendL(*m);
- }
+ // Gets a subset of the data from all songs ordered by title
+ HBufC* query = HBufC::NewLC( KQueryMusicGetAllSongsMinimumLimited().Length() + KMCIntegerLen );
+ query->Des().Format( KQueryMusicGetAllSongsMinimumLimited, aLimit );
+ ExecuteMediaQueryL(aAttrs, aMediaArray, *query);
+ CleanupStack::PopAndDestroy( query );
}
// ----------------------------------------------------------------------------
@@ -712,7 +704,7 @@
// Run query and add result media objects to the cache array.
MPX_FUNC("CMPXDbMusic::ExecuteQueryAllSongsL");
- RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetAllSongsMinimum));
+ RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetAllSongsMinimum()));
CleanupClosePushL(recordset);
TInt err(KErrNone);
@@ -732,6 +724,7 @@
}
}
+
// ----------------------------------------------------------------------------
// CMPXDbMusic::GetSongsInBlockL
// ----------------------------------------------------------------------------
@@ -812,7 +805,7 @@
MPX_FUNC("CMPXDbMusic::GetSongsForAlbumL");
TPtrC query;
- if (aAlbumId == KUnknownAlbumID)
+ if (iObserver.IsUnknownAlbumL(aAlbumId))
{
query.Set(ExtraFieldsRequired(aAttrs) ? KQueryMusicGetSongsForUnknownAlbum() :
KQueryMusicGetSongsForUnknownAlbumNoCategories());
@@ -993,7 +986,9 @@
TMPXGeneralType aType,
const CMPXMedia& aCriteria,
const TArray<TMPXAttribute>& aAttrs,
- CMPXMediaArray& aMediaArray)
+ CMPXMediaArray& aMediaArray,
+ TBool aSortByTrackOrder
+ )
{
MPX_FUNC("CMPXDbMusic::FindSongsL");
@@ -1001,12 +996,8 @@
HBufC* criteriaStr = GenerateMusicMatchingCriteriaLC(aGeneralId, aContainerId, aType,
aCriteria);
- // construct the sort order depending on category. Albums are always sorted by track,
- // then name, except for unknown album. Songs are sorted by name for unknown album.
- // NULL track number is stored as KMaxTInt so that they will be sorted to the end
- TPtrC sortOrder;
- if ((aType == EMPXGroup) && (MPX_ITEM_CATEGORY(aGeneralId) == EMPXAlbum) &&
- (aGeneralId != MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), EMPXAlbum, KNullDesC, EFalse)))
+ TPtrC sortOrder;
+ if (aSortByTrackOrder)
{
sortOrder.Set(KQueryMusicFindAllSortOrderTrack);
}
@@ -1014,7 +1005,7 @@
{
sortOrder.Set(KQueryMusicFindAllSortOrderTitle);
}
-
+
// construct the query
HBufC* query = HBufC::NewLC(KQueryMusicFindAll().Length() + criteriaStr->Length() +
sortOrder.Length());
@@ -1099,37 +1090,19 @@
}
// ----------------------------------------------------------------------------
-// CMPXDbMusic::ArtistForAlbumL
-// ----------------------------------------------------------------------------
-//
-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;
- }
-
-// ----------------------------------------------------------------------------
// CMPXDbMusic::AlbumartForAlbumL
// ----------------------------------------------------------------------------
//
HBufC* CMPXDbMusic::AlbumartForAlbumL(const TUint32 aAlbumId, TPtrC aArt)
{
- MPX_FUNC("CMPXDbMusic::AlbumartForAlbumL");
+ MPX_FUNC("CMPXDbMusic::AlbumartForAlbumL");
+
RSqlStatement recordset(iDbManager.ExecuteSelectQueryL(KQueryMusicGetAlbumartForAlbum, aAlbumId));
HBufC* albumart(NULL);
CleanupClosePushL(recordset);
- while ( recordset.Next() == KSqlAtRow )
+ TInt err(KErrNone);
+ while ((err = recordset.Next()) == KSqlAtRow)
{
TPtrC art(MPXDbCommonUtil::GetColumnTextL(recordset, KMPXTableDefaultIndex));
if (art.Length()>0 && art.Compare(KNullDesC)!=0 && art.CompareF(aArt)!=0 )
@@ -2122,6 +2095,8 @@
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
TUint32 abstractAlbumId(0);
#endif // ABSTRACTAUDIOALBUM_INCLUDED
+ //need to get song art for updating art field in Album and Artist tables
+ TPtrC art(KNullDesC);
if (aMusicTable)
{
artistId = aMusicTable->ColumnInt64(EMusicArtist);
@@ -2131,21 +2106,23 @@
#ifdef ABSTRACTAUDIOALBUM_INCLUDED
abstractAlbumId = aMusicTable->ColumnInt64(EMusicAbstractAlbum);
#endif // ABSTRACTAUDIOALBUM_INCLUDED
+ art.Set(MPXDbCommonUtil::GetColumnTextL(*aMusicTable, EMusicArt));
}
// update the artist field
TUint32 id(0);
if (UpdateCategoryFieldL(EMPXArtist, aMedia, KMPXMediaMusicArtist, artistId,
- aDrive, aItemChangedMessages, id))
+ aDrive, aItemChangedMessages, id, art))
{
MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArtist, id);
metaDataModified = (aMusicTable != NULL);
visibleChange = CMPXDbActiveTask::EAllVisible;
+ iArtNeedUpdated = EFalse;
}
// update the album field
if (UpdateCategoryFieldL(EMPXAlbum, aMedia, KMPXMediaMusicAlbum, albumId,
- aDrive, aItemChangedMessages, id))
+ aDrive, aItemChangedMessages, id, art))
{
MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicAlbum, id);
metaDataModified = (aMusicTable != NULL);
@@ -2166,6 +2143,7 @@
MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, albumId,
EMPXItemInserted, EMPXAlbum, KDBPluginUid);
}
+ iArtNeedUpdated = EFalse;
}
// update the genre field
@@ -2472,8 +2450,17 @@
TUint32 aOldId,
TInt aDriveId,
CMPXMessageArray* aItemChangedMessages,
- TUint32& aItemId)
+ TUint32& aItemId,
+ const TDesC& aArt)
{
+ MPX_FUNC("CMPXDbMusic::UpdateCategoryFieldL");
+
+ if (aCategory == EMPXAlbum)
+ {
+ return UpdateCategoryFieldForAlbumL(aMedia, aAttribute, aOldId,
+ aDriveId, aItemChangedMessages, aItemId, aArt);
+ }
+
TBool updated(EFalse);
TBool itemNotRemoved( EFalse );
TBool itemAdded( EFalse );
@@ -2500,7 +2487,6 @@
aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory,
name, caseSensitive);
-
#else
// only genre is not case sensitive
aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory,
@@ -2515,8 +2501,8 @@
{
if (aMedia.ValueTObjectL<TMPXGeneralCategory>(KMPXMediaGeneralCategory) == EMPXSong )
{
- iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId,
- aItemChangedMessages, itemAdded, name, KNullDesC);
+ iObserver.AddAbstractAlbumItemL(KNullDesC, aDriveId,
+ aItemChangedMessages, itemAdded, name, KNullDesC);
}
else
{
@@ -2527,42 +2513,40 @@
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);
+ {
+ abstractAlbumName.Set(aMedia.ValueText(KMPXMediaGeneralTitle).Left(KMCMaxTextLen));
+ MPX_DEBUG2(" abstractAlbumName[%S]", &abstractAlbumName);
+ }
+
+ // ignore the return value
+ iObserver.AddAbstractAlbumItemL(abstractAlbumName, aDriveId,
+ aItemChangedMessages, itemAdded, name, albumartist);
}
}
else
#endif // ABSTRACTAUDIOALBUM_INCLUDED
- if (aCategory == EMPXArtist || aCategory == EMPXAlbum)
+ if (aCategory == EMPXArtist)
{
- TPtrC art(KNullDesC);
- TPtrC artistname(KNullDesC);
-
- if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
+ //for the update case, need to maintain art field for Artist/Album table.
+ if (aOldId && (aOldId != aItemId))
{
- art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
+ CMPXMedia* media = CMPXMedia::NewL(aMedia);
+ CleanupStack::PushL(media);
+ media->SetTextValueL(KMPXMediaMusicAlbumArtFileName, aArt);
+ iObserver.AddCategoryItemL(aCategory, *media, aDriveId, aItemChangedMessages, itemAdded);
+ CleanupStack::PopAndDestroy(media);
+ }
+ else
+ {
+ iObserver.AddCategoryItemL(aCategory, aMedia, aDriveId, aItemChangedMessages, itemAdded);
}
- if (aCategory == EMPXAlbum)
- {
- if (aMedia.IsSupported(KMPXMediaMusicArtist))
- {
- artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen));
- }
- }
- iObserver.AddCategoryItemL(aCategory, name, artistname, art, aDriveId, aItemChangedMessages, itemAdded);
}
else
{
// ignore the return value
- iObserver.AddCategoryItemL(aCategory, name, aDriveId,
+ iObserver.AddCategoryItemL(aCategory, aMedia, aDriveId,
aItemChangedMessages, itemAdded);
}
updated = ETrue;
@@ -2590,37 +2574,18 @@
TPtrC abstractAlbumName(aMedia.ValueText(KMPXMediaGeneralTitle).Left(KMCMaxTextLen));
MPX_DEBUG2(" Music abstractAlbumName[%S]", &abstractAlbumName);
// ignore the return value
- iObserver.AddCategoryItemL(aCategory, abstractAlbumName, aDriveId,
- aItemChangedMessages, itemAdded, KNullDesC, albumartist);
+ iObserver.AddAbstractAlbumItemL(abstractAlbumName, aDriveId,
+ aItemChangedMessages, itemAdded, KNullDesC, albumartist);
}
else
#endif // ABSTRACTAUDIOALBUM_INCLUDED
- if (aCategory == EMPXArtist || aCategory == EMPXAlbum)
- {
- TPtrC art(KNullDesC);
- TPtrC artistname(KNullDesC);
- if (aMedia.IsSupported(KMPXMediaMusicAlbumArtFileName))
- {
- art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen));
- }
- if (aCategory == EMPXAlbum)
- {
- if (aMedia.IsSupported(KMPXMediaMusicArtist))
- {
- artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).Left(KMCMaxTextLen));
- }
- }
- iObserver.AddCategoryItemL(aCategory, KNullDesC, artistname, art, aDriveId,
- aItemChangedMessages, itemAdded);
- }
- else
{
// ignore the return value
- iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId,
- aItemChangedMessages, itemAdded);
- }
- updated = ETrue;
- }
+ iObserver.AddCategoryItemL(aCategory, aMedia, aDriveId,
+ aItemChangedMessages, itemAdded);
+ }
+ updated = ETrue;
+ }
}
if (aOldId && (aOldId != aItemId))
@@ -2686,7 +2651,6 @@
return updated;
}
-
// ----------------------------------------------------------------------------
// CMPXDbMusic::ExtraFieldsRequired
// ----------------------------------------------------------------------------
@@ -2767,4 +2731,120 @@
;
}
+// ----------------------------------------------------------------------------
+// CMPXDbMusic::UpdateCategoryFieldForAlbumL
+// ----------------------------------------------------------------------------
+//
+TBool CMPXDbMusic::UpdateCategoryFieldForAlbumL(
+ const CMPXMedia& aMedia,
+ const TMPXAttribute& aAttribute,
+ TUint32 aOldId,
+ TInt aDriveId,
+ CMPXMessageArray* aItemChangedMessages,
+ TUint32& aItemId,
+ const TDesC& aArt)
+ {
+ MPX_FUNC("CMPXDbMusic::UpdateCategoryFieldForAlbumL");
+
+ TBool updated(EFalse);
+ TBool itemNotRemoved( EFalse );
+ TBool itemAdded( EFalse );
+
+ // update category table and add category Id to the music table
+ if (!aOldId || aMedia.IsSupported(aAttribute))
+ {
+ TInt changeMsgCount( 0 );
+ if( aItemChangedMessages )
+ {
+ changeMsgCount = aItemChangedMessages->Count();
+ }
+
+ // construct the new ID for the category record
+ aItemId = iObserver.GenerateUniqueIdForAlbumL(aMedia);
+
+ if (!aOldId || (aOldId != aItemId))
+ {
+ // only add if the ID changed,
+ // otherwise the song was updated but the artist name was not
+
+ //for the update case, need to maitain art field for Artist/Album table.
+ if (aOldId && (aOldId != aItemId))
+ {
+ CMPXMedia* media = CMPXMedia::NewL(aMedia);
+ CleanupStack::PushL(media);
+ media->SetTextValueL(KMPXMediaMusicAlbumArtFileName, aArt);
+
+ iObserver.AddCategoryItemL(EMPXAlbum, *media, aDriveId, aItemChangedMessages, itemAdded);
+ CleanupStack::PopAndDestroy(media);
+ }
+ else // !aOldId
+ {
+ iObserver.AddCategoryItemL(EMPXAlbum, aMedia, aDriveId, aItemChangedMessages, itemAdded);
+ }
+ updated = ETrue;
+ }
+
+ if (aOldId && (aOldId != aItemId))
+ {
+ iObserver.DeleteSongForCategoryL(EMPXAlbum, aOldId, aDriveId,
+ aItemChangedMessages, itemNotRemoved, aArt);
+ updated = ETrue;
+ }
+
+ // Special case where the item(s) has been renamed.
+ // In this case, a new category is created +1 change msg
+ // a old category is removed +1 change msg
+ // We merge these 2 change messages into one using the deprecated ID
+ //
+ if( aItemChangedMessages )
+ {
+ TInt newChangeMsgCount( aItemChangedMessages->Count() );
+ if( newChangeMsgCount - changeMsgCount > 0 )
+ {
+ TInt oldId = KErrNotFound;
+ TInt newId = KErrNotFound;
+ for( TInt i=0; i<newChangeMsgCount; ++i )
+ {
+ CMPXMessage& msg = *(*aItemChangedMessages)[i];
+
+ TMPXItemId id = msg.ValueTObjectL<TMPXItemId>(KMPXMessageMediaGeneralId);
+ TMPXChangeEventType changeType = msg.ValueTObjectL<TMPXChangeEventType>(KMPXMessageChangeEventType);
+
+ // Look for the added and deleted category IDs
+ //
+ if( id == aOldId && changeType == EMPXItemDeleted )
+ {
+ oldId = i;
+ }
+ else if( id == aItemId && changeType == EMPXItemInserted )
+ {
+ newId = i;
+ }
+ }// for
+
+ if( oldId != KErrNotFound &&
+ newId != KErrNotFound )
+ {
+ aItemChangedMessages->Remove(oldId); // category removed
+ aItemChangedMessages->Remove(newId); // category added
+ MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aItemId, EMPXItemModified,
+ EMPXAlbum, KDBPluginUid, aOldId );
+ }
+ else if ( oldId !=KErrNotFound && itemAdded ) // old item removed, new item already exist
+ {
+ MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aItemId, EMPXItemModified,
+ EMPXAlbum, KDBPluginUid, aOldId );
+ }
+ else if ( newId !=KErrNotFound && itemNotRemoved ) // new item added, old item still exist
+ {
+ MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, aOldId, EMPXItemModified,
+ EMPXAlbum, KDBPluginUid, aItemId );
+ }
+ }
+ }// aItemChangedMessages
+ }// if (!aOldId || aMedia.IsSupported(aAttribute))
+
+ return updated;
+ }
+
// End of File
--- a/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpserviceplugins/mpxsqlitedbhgplugin/src/mpxdbplugin.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -59,7 +59,7 @@
#include "mpxdbplugin.h"
// CONSTANTS
-const TInt KFirstFetchCount = 400;
+const TInt KFirstFetchCount = 100;
const TUid KCRUIDMusicPlayerFeatures = { 0x101FFCD0 };
const TInt KMusicPlayerFeatures = 1;
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainer.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainer.h Thu Sep 02 20:24:03 2010 +0300
@@ -30,6 +30,7 @@
class HbDocumentLoader;
class MpCollectionDataModel;
class MpMpxCollectionData;
+class HbGroupBox;
class MpCollectionContainer : public HbWidget
{
@@ -62,6 +63,7 @@
protected:
+ HbGroupBox *mInfoBar;
HbDocumentLoader *mDocumentLoader; // Not own
MpCollectionDataModel *mDataModel; // Not own
MpMpxCollectionData *mCollectionData; // Not own
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontaineralbums.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontaineralbums.h Thu Sep 02 20:24:03 2010 +0300
@@ -20,7 +20,6 @@
#include "mpcollectionlistcontainer.h"
-class HbGroupBox;
class HgMediawall;
class MpCollectionTBoneListDataModel;
@@ -49,8 +48,7 @@
void setupContainer();
private:
-
- HbGroupBox *mInfoBar; // Own
+
HgMediawall *mTBone; // Own
MpCollectionTBoneListDataModel *mTBoneListModel; // Own
int mCurrentAlbumIndex;
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerallsongs.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerallsongs.h Thu Sep 02 20:24:03 2010 +0300
@@ -20,8 +20,6 @@
#include "mpcollectionlistcontainer.h"
-class HbGroupBox;
-
class MpCollectionContainerAllSongs : public MpCollectionListContainer
{
Q_OBJECT
@@ -39,10 +37,6 @@
void setupContainer();
-private:
-
- HbGroupBox *mInfoBar; // Own
-
};
#endif // MPCOLLECTIONCONTAINERALLSONGS_H
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerartists.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerartists.h Thu Sep 02 20:24:03 2010 +0300
@@ -20,7 +20,6 @@
#include "mpcollectionlistcontainer.h"
-class HbGroupBox;
class HgMediawall;
class MpCollectionTBoneListDataModel;
@@ -49,8 +48,7 @@
void setupContainer();
private:
-
- HbGroupBox *mInfoBar; // Own
+
HgMediawall *mTBone; // Own
MpCollectionTBoneListDataModel *mTBoneListModel; // Own
int mCurrentArtistIndex;
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerplaylists.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectioncontainerplaylists.h Thu Sep 02 20:24:03 2010 +0300
@@ -20,7 +20,6 @@
#include "mpcollectionlistcontainer.h"
-class HbGroupBox;
class MpCollectionContainerPlaylists : public MpCollectionListContainer
{
@@ -43,8 +42,6 @@
void setupContainer();
private:
-
- HbGroupBox *mInfoBar; // Own
int mCurrentPlaylistIndex;
};
--- a/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/inc/mpcollectionview.h Thu Sep 02 20:24:03 2010 +0300
@@ -52,7 +52,6 @@
void initializeView();
void activateView();
void deactivateView();
- void setDefaultView();
bool isActivated();
void openItem( int index );
void showItemDetails( int index );
@@ -122,6 +121,7 @@
int generateShuffleIndex();
void startContainerTransition( TCollectionContext contextFrom, TCollectionContext contextTo );
void closeActiveDialog( bool onlyContextMenu = false );
+ void showCorruptedNote();
private:
--- a/mpviewplugins/mpcollectionviewplugin/resources/musiccollection.docml Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/resources/musiccollection.docml Thu Sep 02 20:24:03 2010 +0300
@@ -1,14 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<hbdocument version="0.9">
<widget name="mainContainer" type="HbWidget">
+ <widget name="infoBar" type="HbGroupBox">
+ <sizehint type="PREFERRED" height="0.0" width="var(hb-param-screen-width)"/>
+ </widget>
<widget name="nowPlaying" type="MpNowPlayingWidget">
- <sizehint type="MAXIMUM" height="0.0" />
+ <sizehint type="PREFERRED" height="0.0" width="var(hb-param-screen-width)"/>
</widget>
<widget name="container" type="HbWidget">
<sizehint height="expr(var(hb-param-screen-height) - var(hb-param-widget-chrome-height) - var(hb-param-widget-toolbar-height))" type="PREFERRED" width="var(hb-param-screen-width)"/>
</widget>
<layout orientation="Vertical" spacing="0un" type="linear">
<contentsmargins bottom="0.0un" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0un"/>
+ <linearitem itemname="infoBar" spacing="0.0un" />
<linearitem itemname="container" spacing="0.0un"/>
<linearitem itemname="nowPlaying" spacing="0.0un"/>
</layout>
@@ -16,32 +20,39 @@
<section name="showBanner">
<widget name="nowPlaying">
- <sizehint type="MAXIMUM" height="expr(2*var(hb-param-margin-gene-middle-vertical) + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary))" />
- <sizehint type="MINIMUM" height="expr(2*var(hb-param-margin-gene-middle-vertical) + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary))" />
- <sizehint type="PREFERRED" height="expr(2*var(hb-param-margin-gene-middle-vertical) + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary))" />
+ <sizehint type="PREFERRED" height="expr(2*var(hb-param-margin-gene-middle-vertical) + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary))" />
+ <bool name="visible" value="TRUE" />
</widget>
</section>
<section name="hideBanner">
<widget name="nowPlaying">
- <sizehint type="MAXIMUM" height="0.0" />
- <sizehint type="MINIMUM" height="0.0" />
- <sizehint type="PREFERRED" height="0.0" />
+ <sizehint type="PREFERRED" height="0.0" />
+ <bool name="visible" value="FALSE" />
+ </widget>
+ </section>
+
+ <section name="showInfoBar">
+ <widget name="infoBar">
+ <sizehint type="PREFERRED" height="expr(2*var(hb-param-margin-gene-middle-vertical) + var(hb-param-text-height-primary))" />
+ <bool name="visible" value="TRUE"/>
+ </widget>
+ </section>
+
+ <section name="hideInfoBar">
+ <widget name="infoBar">
+ <sizehint type="PREFERRED" height="0.0" />
+ <bool name="visible" value="FALSE" />
</widget>
</section>
<section name="allSongs">
<widget name="container">
- <widget name="allSongsDetail" type="HbGroupBox">
- <bool name="collapsable" value="FALSE"/>
- <real name="z" value="1.0"/>
- </widget>
<widget name="allSongsList" type="HbListView">
<sizehint height="expr(var(hb-param-screen-height) - var(hb-param-widget-chrome-height) - var(hb-param-widget-toolbar-height))" type="PREFERRED" width="var(hb-param-screen-width)"/>
</widget>
<layout orientation="Vertical" spacing="0un" type="linear">
<contentsmargins bottom="0.0" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0"/>
- <linearitem itemname="allSongsDetail" spacing="0.0"/>
<linearitem itemname="allSongsList" spacing="0.0"/>
</layout>
</widget>
@@ -61,13 +72,8 @@
<section name="artistAlbums">
<widget name="container">
- <widget name="artistDetail" type="HbGroupBox">
- <bool name="collapsable" value="FALSE"/>
- <real name="z" value="1.0"/>
- </widget>
<layout orientation="Vertical" spacing="0un" type="linear">
<contentsmargins bottom="0.0" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0"/>
- <linearitem itemname="artistDetail" spacing="0.0"/>
<linearitem itemname="artistsList" spacing="0.0"/>
</layout>
</widget>
@@ -91,10 +97,6 @@
<section name="artistAlbumTBoneFetcher">
<widget name="container">
- <widget name="artistDetail" type="HbGroupBox">
- <bool name="collapsable" value="FALSE"/>
- <real name="z" value="1.0"/>
- </widget>
<widget name="artistAlbumWall" type="HgMediawall">
<sizehint height="expr(var(hb-param-margin-gene-screen) + 24.5un + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary) + (2*var(hb-param-margin-gene-middle-vertical)) + 1.5un)" type="MAXIMUM" width="var(hb-param-screen-width)"/>
<sizehint height="expr(var(hb-param-margin-gene-screen) + 24.5un + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary) + (2*var(hb-param-margin-gene-middle-vertical)) + 1.5un)" type="PREFERRED" width="var(hb-param-screen-width)"/>
@@ -103,7 +105,6 @@
</widget>
<layout orientation="Vertical" spacing="var(hb-param-margin-gene-middle-vertical)" type="linear">
<contentsmargins bottom="0.0" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0"/>
- <linearitem itemname="artistDetail" spacing="0.0"/>
<linearitem itemname="artistAlbumWall"/>
<linearitem itemname="artistsList"/>
</layout>
@@ -140,10 +141,6 @@
<section name="albumTBoneFetcher">
<widget name="container">
- <widget name="albumTBoneDetail" type="HbGroupBox">
- <bool name="collapsable" value="FALSE"/>
- <real name="z" value="1.0"/>
- </widget>
<widget name="albumWall" type="HgMediawall">
<sizehint height="expr(var(hb-param-margin-gene-screen) + 24.5un + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary) + (2*var(hb-param-margin-gene-middle-vertical)) + 1.5un)" type="MAXIMUM" width="var(hb-param-screen-width)"/>
<sizehint height="expr(var(hb-param-margin-gene-screen) + 24.5un + var(hb-param-text-height-primary) + var(hb-param-text-height-secondary) + (2*var(hb-param-margin-gene-middle-vertical)) + 1.5un)" type="PREFERRED" width="var(hb-param-screen-width)"/>
@@ -152,7 +149,6 @@
</widget>
<layout orientation="Vertical" spacing="var(hb-param-margin-gene-middle-vertical)" type="linear">
<contentsmargins bottom="0.0" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0"/>
- <linearitem itemname="albumTBoneDetail" spacing="0.0"/>
<linearitem itemname="albumWall"/>
<linearitem itemname="albumsList"/>
</layout>
@@ -173,12 +169,8 @@
<section name="playlistSongs">
<widget name="container">
- <widget name="playlistSongsDetail" type="HbGroupBox">
- <bool name="collapsable" value="FALSE"/>
- </widget>
<layout orientation="Vertical" spacing="0un" type="linear">
<contentsmargins bottom="0.0" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0"/>
- <linearitem itemname="playlistSongsDetail" spacing="0.0"/>
<linearitem itemname="playlistsList" spacing="0.0"/>
</layout>
</widget>
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainer.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainer.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -18,7 +18,9 @@
#include <QtCore>
#include <hbabstractviewitem.h>
+#include <hbgroupbox.h>
+#include "mpcollectiondocumentloader.h"
#include "mpcollectioncontainer.h"
#include "mpcollectiondatamodel.h"
#include "mpmpxcollectiondata.h"
@@ -60,7 +62,9 @@
mDocumentLoader(loader),
mViewMode(MpCommon::DefaultView)
{
- TX_LOG
+ TX_ENTRY
+ mInfoBar = qobject_cast<HbGroupBox*>(mDocumentLoader->findWidget(QString( "infoBar")));
+ TX_EXIT
}
/*!
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontaineralbums.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontaineralbums.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -29,6 +29,7 @@
#include "mpcollectiondatamodel.h"
#include "mpcollectiontbonelistdatamodel.h"
#include "mptrace.h"
+#include "mpenginefactory.h"
/*!
\class MpCollectionContainerAlbums
@@ -50,7 +51,6 @@
*/
MpCollectionContainerAlbums::MpCollectionContainerAlbums( HbDocumentLoader *loader, QGraphicsItem *parent )
: MpCollectionListContainer(loader, parent),
- mInfoBar(0),
mTBone(0),
mTBoneListModel(0),
mCurrentAlbumIndex(0)
@@ -65,8 +65,7 @@
MpCollectionContainerAlbums::~MpCollectionContainerAlbums()
{
TX_ENTRY
- delete mInfoBar;
- delete mTBone;
+ delete mTBone;
delete mList;
delete mTBoneListModel;
TX_EXIT
@@ -92,7 +91,7 @@
mTBone->setModel(dataModel);
mTBone->scrollTo( dataModel->index(mCurrentAlbumIndex, 0) );
if ( mTBoneListModel == 0 ) {
- mTBoneListModel = new MpCollectionTBoneListDataModel(mCollectionData);
+ mTBoneListModel = new MpCollectionTBoneListDataModel(mCollectionData, MpEngineFactory::sharedEngine()->playbackData());
connect( mTBoneListModel, SIGNAL(albumDataChanged()), this, SLOT(albumDataChanged()) );
connect( mTBoneListModel, SIGNAL(albumDataAvailable()), this, SLOT(albumDataAvailable()) );
}
@@ -247,6 +246,9 @@
void MpCollectionContainerAlbums::setupContainer()
{
TX_ENTRY_ARGS("mCollectionContext=" << mCollectionContext);
+
+ mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "showInfoBar");
+
if ( mCollectionData->count() ) {
bool ok = false;
QGraphicsWidget *widget;
@@ -262,14 +264,13 @@
mIndexFeedback->setItemView(mList);
initializeList();
}
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
if ( mTBone ) {
delete mTBone;
mTBone = 0;
}
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_albums_1l").arg(mCollectionData->count()));
+
}
else if ( mCollectionContext == ECollectionContextAlbumsTBone ) {
if ( mViewMode == MpCommon::FetchView ) {
@@ -278,9 +279,8 @@
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerAlbums::setupContainer", "invalid xml file");
}
- widget = mDocumentLoader->findWidget(QString("albumTBoneDetail"));
- mInfoBar = qobject_cast<HbGroupBox*>(widget);
- mInfoBar->setHeading( hbTrId("txt_mus_subtitle_select_a_song") );
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subtitle_select_song"));
}
else {
mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "albumTBone", &ok);
@@ -288,6 +288,9 @@
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerAlbums::setupContainer", "invalid xml file");
}
+
+ mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "hideInfoBar");
+
}
widget = mDocumentLoader->findWidget(QString("albumWall"));
mTBone = qobject_cast<HgMediawall*>(widget);
@@ -302,14 +305,13 @@
}
else {
// Must delete widgets when last song is deleted and view is reloaded.
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
if ( mTBone ) {
delete mTBone;
mTBone = 0;
}
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_albums_1l").arg(0));
+
// Call empty list from base class
setupEmptyListContainer();
}
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerallsongs.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerallsongs.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -41,8 +41,7 @@
Constructs the collection container.
*/
MpCollectionContainerAllSongs::MpCollectionContainerAllSongs( HbDocumentLoader *loader, QGraphicsItem *parent )
- : MpCollectionListContainer(loader, parent),
- mInfoBar(0)
+ : MpCollectionListContainer(loader, parent)
{
TX_LOG
mCollectionContext = ECollectionContextAllSongs;
@@ -54,7 +53,6 @@
MpCollectionContainerAllSongs::~MpCollectionContainerAllSongs()
{
TX_ENTRY
- delete mInfoBar;
delete mList;
TX_EXIT
}
@@ -91,16 +89,18 @@
void MpCollectionContainerAllSongs::setupContainer()
{
TX_ENTRY
+
+ mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "showInfoBar");
+
if ( mCollectionData->count() ) {
bool ok = false;
+ QGraphicsWidget *widget;
+
mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "allSongs", &ok);
if ( !ok ) {
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerAllSongs::setupContainer", "invalid xml file");
}
- QGraphicsWidget *widget;
- widget = mDocumentLoader->findWidget(QString("allSongsDetail"));
- mInfoBar = qobject_cast<HbGroupBox*>(widget);
widget = mDocumentLoader->findWidget(QString("allSongsList"));
mList = qobject_cast<HbListView*>(widget);
@@ -109,15 +109,16 @@
QString details;
if ( mViewMode == MpCommon::FetchView ) {
- details = hbTrId("txt_mus_subtitle_select_a_song");
+ details = hbTrId("txt_mus_subtitle_select_song");
}
else {
- int count = mCollectionData->count();
- details = hbTrId("txt_mus_subhead_songs_l1").arg( count );
+ details = hbTrId("txt_mus_subhead_songs_l1").arg(mCollectionData->count());
}
mInfoBar->setHeading(details);
}
else {
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_songs_l1").arg(0));
+
// Call empty list from base class
setupEmptyListContainer();
}
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerartists.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerartists.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -30,6 +30,7 @@
#include "mpcollectiondatamodel.h"
#include "mpcollectiontbonelistdatamodel.h"
#include "mptrace.h"
+#include "mpenginefactory.h"
/*!
\class MpCollectionContainerArtists
@@ -53,7 +54,6 @@
*/
MpCollectionContainerArtists::MpCollectionContainerArtists( HbDocumentLoader *loader, QGraphicsItem *parent )
: MpCollectionListContainer(loader, parent),
- mInfoBar(0),
mTBone(0),
mTBoneListModel(0),
mCurrentArtistIndex(0),
@@ -69,7 +69,6 @@
MpCollectionContainerArtists::~MpCollectionContainerArtists()
{
TX_ENTRY
- delete mInfoBar;
delete mTBone;
delete mList;
delete mTBoneListModel;
@@ -135,7 +134,7 @@
mTBone->setModel(dataModel);
mTBone->scrollTo( dataModel->index(mCurrentAlbumIndex - mAlbumIndexOffset, 0) );
if ( mTBoneListModel == 0 ) {
- mTBoneListModel = new MpCollectionTBoneListDataModel(mCollectionData);
+ mTBoneListModel = new MpCollectionTBoneListDataModel(mCollectionData, MpEngineFactory::sharedEngine()->playbackData());
connect( mTBoneListModel, SIGNAL(albumDataChanged()), this, SLOT(albumDataChanged()) );
connect( mTBoneListModel, SIGNAL(albumDataAvailable()), this, SLOT(albumDataAvailable()) );
}
@@ -314,6 +313,9 @@
void MpCollectionContainerArtists::setupContainer()
{
TX_ENTRY_ARGS("mCollectionContext=" << mCollectionContext);
+
+ mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "showInfoBar");
+
if ( mCollectionData->count() ) {
bool ok = false;
QGraphicsWidget *widget;
@@ -331,14 +333,13 @@
mIndexFeedback->setItemView(mList);
initializeList();
}
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
if ( mTBone ) {
delete mTBone;
mTBone = 0;
}
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_artist_1l").arg(mCollectionData->count()));
+
break;
case ECollectionContextArtistAlbums:
mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "artistAlbums", &ok);
@@ -346,8 +347,6 @@
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerArtists::setupContainer", "invalid xml file");
}
- widget = mDocumentLoader->findWidget(QString("artistDetail"));
- mInfoBar = qobject_cast<HbGroupBox*>(widget);
artist = mCollectionData->collectionTitle();
if ( artist.isEmpty() ) {
@@ -367,9 +366,8 @@
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerAlbums::setupContainer", "invalid xml file");
}
- widget = mDocumentLoader->findWidget(QString("artistDetail"));
- mInfoBar = qobject_cast<HbGroupBox*>(widget);
- mInfoBar->setHeading( hbTrId("txt_mus_subtitle_select_a_song") );
+
+ mInfoBar->setHeading( hbTrId("txt_mus_subtitle_select_song") );
}
else {
mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "artistAlbumTBone", &ok);
@@ -377,10 +375,9 @@
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerAlbums::setupContainer", "invalid xml file");
}
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
+
+ mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "hideInfoBar");
+
}
widget = mDocumentLoader->findWidget(QString("artistAlbumWall"));
mTBone = qobject_cast<HgMediawall*>(widget);
@@ -397,7 +394,7 @@
// No need to load anything. Just reuse the section "artistAlbums" loaded
// in ECollectionContextArtistAlbums context.
if ( mViewMode == MpCommon::FetchView ) {
- mInfoBar->setHeading( hbTrId("txt_mus_subtitle_select_a_song") );
+ mInfoBar->setHeading( hbTrId("txt_mus_subtitle_select_song") );
}
else {
artist = mCollectionData->collectionTitle();
@@ -415,15 +412,14 @@
}
}
else {
- // Must delete widgets when last song is deleted and view is reloaded.
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
+ // Must delete widget when last song is deleted and view is reloaded.
if ( mTBone ) {
delete mTBone;
mTBone = 0;
}
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_artist_1l").arg(0));
+
// Call empty list from base class
setupEmptyListContainer();
}
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerplaylists.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectioncontainerplaylists.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -49,7 +49,6 @@
*/
MpCollectionContainerPlaylists::MpCollectionContainerPlaylists( HbDocumentLoader *loader, QGraphicsItem *parent )
: MpCollectionListContainer(loader, parent),
- mInfoBar(0),
mCurrentPlaylistIndex(0)
{
TX_LOG
@@ -63,7 +62,6 @@
MpCollectionContainerPlaylists::~MpCollectionContainerPlaylists()
{
TX_ENTRY
- delete mInfoBar;
delete mList;
TX_EXIT
}
@@ -130,6 +128,9 @@
void MpCollectionContainerPlaylists::setupContainer()
{
TX_ENTRY_ARGS("mCollectionContext=" << mCollectionContext);
+
+ mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "showInfoBar");
+
if ( mCollectionData->count() ) {
bool ok = false;
QGraphicsWidget *widget;
@@ -144,10 +145,8 @@
mList = qobject_cast<HbListView*>(widget);
initializeList();
}
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_playlists_1l").arg(mCollectionData->count()));
}
else if ( mCollectionContext == ECollectionContextPlaylistSongs ) {
mDocumentLoader->load(QString(":/docml/musiccollection.docml"), "playlistSongs", &ok);
@@ -155,16 +154,13 @@
TX_LOG_ARGS("Error: invalid xml file.");
Q_ASSERT_X(ok, "MpCollectionContainerPlaylists::setupContainer", "invalid xml file");
}
-
- widget = mDocumentLoader->findWidget(QString("playlistSongsDetail"));
- mInfoBar = qobject_cast<HbGroupBox*>(widget);
-
+
QString details;
if ( mViewMode == MpCommon::FetchView ) {
- details = hbTrId("txt_mus_subtitle_select_a_song");
+ details = hbTrId("txt_mus_subtitle_select_song");
}
else {
- details = mCollectionData->collectionTitle();
+ details = hbTrId("txt_mus_subhead_1_2l").arg(mCollectionData->collectionTitle()).arg(mCollectionData->count());
}
mInfoBar->setHeading(details);
}
@@ -174,11 +170,10 @@
}
}
else {
- if ( mInfoBar ) {
- delete mInfoBar;
- mInfoBar = 0;
- }
- // Call empty list from base class
+
+ mInfoBar->setHeading(hbTrId("txt_mus_subhead_1_2l").arg(mCollectionData->collectionTitle()).arg(0));
+
+ // Call empty list from base class
setupEmptyListContainer();
}
TX_EXIT
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -367,6 +367,7 @@
MpCollectionDataModel *collectionDataModel;
collectionDataModel = new MpCollectionDataModel( collectionData );
collectionDataModel->refreshModel();
+ mPermanentData->mAbstractItemModel = collectionDataModel;
getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), collectionDataModel,
SLOT( handleAddToCurrentPlaylist( HbAction* ) ) );
@@ -642,9 +643,14 @@
}
}
- //Dialog is using CollectionView main model, avoid dialog destructor to alter it.
- dialog->setModel( 0 );
-
+ //Dialog won't use CollectionView main model any more, return it to its original layout.
+ MpCollectionDataModel *mpModel = qobject_cast<MpCollectionDataModel *>( dialog->model() );
+ if ( mpModel ) {
+ //setLayout() only applies for MpCollectionDataModel where we need to
+ //decide which layout to use for the secondary text.
+ //MpCollectionTBoneListDataModel doesn't have secondary text.
+ mpModel->setLayout( ECollectionListView );
+ }
TX_EXIT
}
@@ -672,9 +678,14 @@
}
}
- //Dialog is using CollectionView main model, avoid dialog destructor to alter it.
- dialog->setModel( 0 );
-
+ //Dialog won't use CollectionView main model any more, return it to its original layout.
+ MpCollectionDataModel *mpModel = qobject_cast<MpCollectionDataModel *>( dialog->model() );
+ if ( mpModel ) {
+ //setLayout() only applies for MpCollectionDataModel where we need to
+ //decide which layout to use for the secondary text.
+ //MpCollectionTBoneListDataModel doesn't have secondary text.
+ mpModel->setLayout( ECollectionListView );
+ }
TX_EXIT
}
@@ -703,10 +714,7 @@
}
}
- //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 );
-
+ //Dialog is using an isolated model which will be deleted, no need to change its layout.
mPermanentData->clear();
TX_EXIT
@@ -774,8 +782,7 @@
}
}
- dialog->setModel( 0 );
-
+ //Dialog is using an isolated model which will be deleted, no need to change its layout.
mPermanentData->clear();
TX_EXIT
@@ -833,7 +840,7 @@
}
}
else if (context != ECollectionContextPlaylists ) { //no progress dialog for delete playlist
- launchProgressDialog( "txt_mus_info_deleting" );
+ launchProgressDialog( "txt_common_info_deleting" );
}
TX_EXIT
}
@@ -1021,6 +1028,13 @@
HbSelectionDialog *dialog = new HbSelectionDialog();
dialog->setHeadingWidget( new HbLabel( label ) );
dialog->setSelectionMode( HbAbstractItemView::MultiSelection );
+ MpCollectionDataModel *mpModel = qobject_cast<MpCollectionDataModel *>( model );
+ if ( mpModel ) {
+ //setLayout() only applies for MpCollectionDataModel where we need to
+ //decide which layout to use for the secondary text.
+ //MpCollectionTBoneListDataModel doesn't have secondary text.
+ mpModel->setLayout( ECollectionSelectionDialog );
+ }
dialog->setModel( model );
dialog->clearActions();
action = new HbAction( hbTrId( "txt_common_button_ok" ) );
@@ -1055,12 +1069,19 @@
listView->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded);
MpCollectionDataModel *model;
//Ownership of the model is passed to the listView as a child object.
- model = new MpCollectionDataModel( mMpEngine->collectionData() , listView );
+ model = new MpCollectionDataModel( mMpEngine->collectionData() , mMpEngine->playbackData(), listView );
model->refreshModel();
connect( model,
SIGNAL( orderChanged( int, int, int, int ) ),
mMpEngine,
SLOT( reorderPlaylist( int, int, int, int ) ) );
+ MpCollectionDataModel *mpModel = qobject_cast<MpCollectionDataModel *>( model );
+ if ( mpModel ) {
+ //setLayout() only applies for MpCollectionDataModel where we need to
+ //decide which layout to use for the secondary text.
+ //MpCollectionTBoneListDataModel doesn't have secondary text.
+ mpModel->setLayout( ECollectionArrangeSongsDialog );
+ }
listView->setModel( model );
listView->setArrangeMode( true );
HbDialog *dialog = new HbDialog();
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionview.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -182,7 +182,7 @@
connect( mCollectionData, SIGNAL( contextChanged( TCollectionContext ) ),
this, SLOT( setContext( TCollectionContext ) ),
Qt::QueuedConnection );
- mCollectionDataModel = new MpCollectionDataModel( mCollectionData );
+ mCollectionDataModel = new MpCollectionDataModel( mCollectionData , mMpEngine->playbackData());
connect( mCollectionDataModel, SIGNAL( dataReloaded() ),
this, SLOT( containerDataChanged() ) );
@@ -293,21 +293,6 @@
}
/*!
- Sets the default collection - AllSongs
- */
-void MpCollectionView::setDefaultView()
-{
- TX_ENTRY
- if ( mCollectionContext != ECollectionContextAllSongs ) {
- // Open 'All Songs' by default
- mMpEngine->openCollection( ECollectionContextAllSongs );
- }
-
-
- TX_EXIT
-}
-
-/*!
Returns view activation status.
*/
bool MpCollectionView::isActivated()
@@ -458,14 +443,24 @@
case ECollectionContextArtistAllSongs:
case ECollectionContextPlaylistSongs:
doOpen = false;
- songUri = mCollectionData->itemData( index, MpMpxCollectionData::Uri );
- emit songSelected( songUri );
+ if (!mCollectionData->hasItemProperty(index, MpMpxCollectionData::Corrupted)) {
+ songUri = mCollectionData->itemData( index, MpMpxCollectionData::Uri );
+ emit songSelected( songUri );
+ }
+ else {
+ showCorruptedNote();
+ }
break;
case ECollectionContextArtistAlbumsTBone:
case ECollectionContextAlbumsTBone:
doOpen = false;
- songUri = mCollectionData->albumSongData( index, MpMpxCollectionData::Uri );
- emit songSelected( songUri );
+ if (!mCollectionData->hasAlbumSongProperty(index, MpMpxCollectionData::Corrupted)) {
+ songUri = mCollectionData->albumSongData( index, MpMpxCollectionData::Uri );
+ emit songSelected( songUri );
+ }
+ else {
+ showCorruptedNote();
+ }
break;
default:
break;
@@ -489,8 +484,23 @@
mCollectionData->setContext( ECollectionContextAlbumsTBone );
}
else {
- // Real open. Forward it to the engine.
- mMpEngine->openCollectionItem( index );
+ switch ( mCollectionContext ) {
+ case ECollectionContextAllSongs:
+ case ECollectionContextArtistAllSongs:
+ case ECollectionContextPlaylistSongs:
+ if (!mCollectionData->hasItemProperty(index, MpMpxCollectionData::Corrupted)) {
+ mMpEngine->openCollectionItem( index );
+ }
+ else {
+ showCorruptedNote();
+ }
+ break;
+ case ECollectionContextArtists:
+ case ECollectionContextPlaylists:
+ mMpEngine->openCollectionItem( index );
+ default:
+ break;
+ }
}
}
TX_EXIT
@@ -514,7 +524,12 @@
void MpCollectionView::playAlbumSongs( int albumIndex, int songIndex )
{
TX_ENTRY_ARGS( "albumIndex=" << albumIndex << "songIndex=" << songIndex );
- mMpEngine->playAlbumSongs(albumIndex, songIndex);
+ if (!mCollectionData->hasAlbumSongProperty(songIndex, MpMpxCollectionData::Corrupted)) {
+ mMpEngine->playAlbumSongs(albumIndex, songIndex);
+ }
+ else {
+ showCorruptedNote();
+ }
TX_EXIT
}
@@ -620,6 +635,7 @@
*/
void MpCollectionView::shufflePlayAll()
{
+ TX_ENTRY
mMpEngine->setShuffle( true );
MpSettingsManager::setShuffle( true );
int index = generateShuffleIndex();
@@ -632,6 +648,7 @@
openIndex( index );
break;
}
+ TX_EXIT
}
/*!
@@ -795,10 +812,16 @@
}
else {
closeActiveDialog();
-
- //Update cache, even if collection is in background.
- //Library refreshing could be triggered at any point due USB/MMC events.
- mMpEngine->reopenCollection();
+
+ // Update cache, even if collection is in background.
+ // Library refreshing could be triggered at any point due USB/MMC events.
+ if ( mCollectionContext == ECollectionContextAllSongs ) {
+ mMpEngine->reopenCollection();
+ }
+ // We force to go to the all songs collection when the refresh is finished.
+ else{
+ openSongs();
+ }
}
TX_EXIT
}
@@ -1176,11 +1199,9 @@
bool ok = false;
if ( visible ) {
mDocumentLoader->load( MUSIC_COLLECTION_DOCML, "showBanner", &ok );
- mNowPlayingBanner->show();
}
else {
mDocumentLoader->load( MUSIC_COLLECTION_DOCML, "hideBanner", &ok );
- mNowPlayingBanner->hide();
}
if ( !ok ) {
@@ -1191,27 +1212,54 @@
/*!
\internal
- Generates a random index for shuffle all.
+ Generates a random index for shuffle all. In case of All Songs, due to incremental open
+ delay, the chosen index may not be available yet. In such case, narrow down the upper limit
+ and regenerate until a valid index is found.
*/
int MpCollectionView::generateShuffleIndex()
{
int low = 0;
int high = 0;
+ bool tbone;
switch ( mCollectionContext ) {
case ECollectionContextArtistAlbumsTBone:
case ECollectionContextAlbumsTBone:
+ tbone = true;
high = mCollectionData->albumSongsCount();
break;
default:
+ tbone = false;
high = mCollectionData->count();
break;
}
+ bool validIndex = false;
+ int index = 0;
+ int songId;
time_t seconds;
- time( &seconds );
- srand( ( unsigned int ) seconds );
+ while ( !validIndex ) {
+ time( &seconds );
+ srand( ( unsigned int ) seconds );
+ index = rand() % ( high - low + 1 ) + low;
+
+ if ( tbone ) {
+ songId = mCollectionData->albumSongId(index);
+ }
+ else {
+ songId = mCollectionData->itemId(index);
+ }
- int index = rand() % ( high - low + 1 ) + low;
+ if ( songId != -1 ) {
+ // Got a valid index; exit the loop.
+ validIndex = true;
+ }
+ else {
+ // Invalid index; re-select an index, but narrow down the
+ // upper range to increase the change of hitting a valid index.
+ high = index;
+ }
+ TX_LOG_ARGS( "index=" << index << "valid=" << validIndex );
+ }
return index;
}
@@ -1279,3 +1327,16 @@
menu()->close();
}
+/*!
+ \internal
+ Shows Corrupted Note in collection view
+ */
+void MpCollectionView::showCorruptedNote()
+{
+ TX_ENTRY
+ HbMessageBox *messageBox = new HbMessageBox( hbTrId( "txt_mus_info_file_is_corrupt" ), HbMessageBox::MessageTypeInformation );
+ messageBox->setAttribute( Qt::WA_DeleteOnClose );
+ messageBox->setIcon( HbIcon( QString("qtg_small_fail") ) );
+ messageBox->show();
+ TX_EXIT
+}
--- a/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/src/unittest_mpcollectioncontainers.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpcollectionviewplugin/tsrc/unittest_mpcollectioncontainers/src/unittest_mpcollectioncontainers.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -260,7 +260,7 @@
MpCollectionContainerAllSongs *allSongs = static_cast<MpCollectionContainerAllSongs*>(mTest);
// Fetcher mode.
- QCOMPARE(allSongs->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_a_song"));
+ QCOMPARE(allSongs->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_song"));
}
/*!
@@ -409,7 +409,7 @@
QVERIFY(artists->mTBoneListModel != 0);
QVERIFY(artists->mAlbumIndexOffset == 0);
QCOMPARE(spy.count(), 1);
- QCOMPARE(artists->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_a_song"));
+ QCOMPARE(artists->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_song"));
// User selects back - navigate back to artists
mCollectionData->mContext = ECollectionContextArtists;
@@ -434,7 +434,7 @@
QCOMPARE(artists->mCollectionContext, ECollectionContextArtistAllSongs);
QVERIFY(artists->mList != 0);
QVERIFY(artists->mInfoBar != 0);
- QCOMPARE(artists->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_a_song"));
+ QCOMPARE(artists->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_song"));
}
/*!
@@ -529,7 +529,7 @@
QCOMPARE(albums->mTBone->reflectionsEnabled(), false);
// We set mCurrentAlbumAvailable to true, so no signal should emit.
QCOMPARE(spy.count(), 0);
- QCOMPARE(albums->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_a_song"));
+ QCOMPARE(albums->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_song"));
// User selects back - navigate back to albums
mCollectionData->mContext = ECollectionContextAlbums;
@@ -620,7 +620,7 @@
QVERIFY(playlists->mList != 0);
QVERIFY(playlists->mInfoBar != 0);
QVERIFY(playlists->mNoMusic == 0);
- QCOMPARE(playlists->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_a_song"));
+ QCOMPARE(playlists->mInfoBar->heading(), hbTrId("txt_mus_subtitle_select_song"));
// User selects back - navigate back to playlists
mCollectionData->mContext = ECollectionContextPlaylists;
--- a/mpviewplugins/mpdetailsviewplugin/inc/mpdetailsview.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpdetailsviewplugin/inc/mpdetailsview.h Thu Sep 02 20:24:03 2010 +0300
@@ -87,12 +87,11 @@
void handleInspireMeGroupBoxToggled( bool state );
void renderInspireMeMetadata();
void renderInspireMeAlbumArts();
- void abortInspireMeProcess();
+ void abortInspireMeProcess();
private:
void startInspireMe();
bool isMetadata() const;
- void setupMenu();
void saveGroupBoxStates();
private:
--- a/mpviewplugins/mpdetailsviewplugin/inc/mpquerymanager.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpdetailsviewplugin/inc/mpquerymanager.h Thu Sep 02 20:24:03 2010 +0300
@@ -26,6 +26,7 @@
#include "mpviewbase.h"
class QNetworkAccessManager;
+class QSignalMapper;
class ThumbnailManager;
/*!
@@ -46,10 +47,9 @@
public:
void reset();
- void queryLocalMusicStore( QString mArtist,QString mAlbum,QString mTitle );
void queryInspireMeItems( QString mArtist,QString mAlbum,QString mTitle );
void queryLocalMusicStore();
- bool isLocalMusicStore() const;
+ bool isLocalMusicStore();
int recommendationsCount() const;
QString recommendedSong(int index) const;
@@ -60,15 +60,12 @@
void retrieveInformationFinished( QNetworkReply* reply );
void retrieveInformationNetworkError( QNetworkReply::NetworkError error );
void retrieveInformationSslErrors( const QList<QSslError> &error );
- void albumArtDownloaded( QNetworkReply* reply );
- void setAlbumArtUri( const QString &albumArtUri, const QString &albumArtName );
- void thumbnailReady( const QPixmap pixmap, void *data, int id, int error );
+ void albumArtDownloaded( int index );
private:
- void clearThumbnails();
void clearRecommendations();
void clearNetworkReplies();
- void signalError();
+ void signalError();
void constructRequest( QString &uri );
// retrieve URI from Ovi music server
void retrieveInformation( const QString &urlEncoded );
@@ -76,7 +73,6 @@
QString keyValues( QStringList keys, QStringList values ) const;
void handleParsedXML();
- bool writeImageToFile( const QByteArray &aImageData, const QString &aImageFileName );
signals:
void inspireMeItemAlbumArtReady();
@@ -95,14 +91,12 @@
QList<QNetworkReply *> mReplys;
QList<int> mThumbnailRequests;
- QDomDocument mDomDocument;
- ThumbnailManager *mThumbnailManager; //owned
+ QDomDocument mDomDocument;
QString mArtist;
QString mAlbum;
QString mTitle;
QString mMusicStore;
- QStringList mRecommendationAlbumArtsName;
QStringList mRecommendationSongs;
QStringList mRecommendationArtists;
@@ -115,6 +109,8 @@
RequestType mRequestType;
int mRecommendationCount;
+ QSignalMapper *mDownloadSignalMapper;
+
};
#endif /* MPQUERYMANAGER_H_ */
--- a/mpviewplugins/mpdetailsviewplugin/src/mpdetailsview.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpdetailsviewplugin/src/mpdetailsview.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -176,9 +176,6 @@
mMpEngine = MpEngineFactory::sharedEngine();
mSongData = mMpEngine->songData();
-
- // TODO: might need later
- setupMenu();
mMpQueryManager = new MpQueryManager();
connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) );
@@ -191,7 +188,7 @@
connect( mMpQueryManager, SIGNAL(inspireMeItemsMetadataRetrieved()), this, SLOT(renderInspireMeMetadata()));
connect( mMpQueryManager, SIGNAL(inspireMeItemAlbumArtReady()), this, SLOT(renderInspireMeAlbumArts()));
connect( mMpQueryManager, SIGNAL(localMusicStoreRetrieved(bool)), this, SLOT(queryInspireMe(bool)), Qt::QueuedConnection);
- connect( mMpQueryManager, SIGNAL(localMusicStoreRetrievalError()), this, SLOT(abortInspireMeProcess()));
+ connect( mMpQueryManager, SIGNAL(localMusicStoreRetrievalError()), this, SLOT(abortInspireMeProcess()));
connect( mMpQueryManager, SIGNAL(inspireMeItemsRetrievalError()), this, SLOT(queryLocalMusicStore()), Qt::QueuedConnection);
TX_EXIT
@@ -253,16 +250,6 @@
}
/*!
- Setup the menu.
- */
-void MpDetailsView::setupMenu()
-{
- TX_ENTRY
-
- TX_EXIT
-}
-
-/*!
Slot to handle back command from softkey.
*/
void MpDetailsView::back()
@@ -287,7 +274,7 @@
/*!
Slot to handle network error.
*/
-void MpDetailsView::abortInspireMeProcess()
+void MpDetailsView::abortInspireMeProcess( )
{
TX_ENTRY
mInspireMeProgressBar->hide();
--- a/mpviewplugins/mpdetailsviewplugin/src/mpquerymanager.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpdetailsviewplugin/src/mpquerymanager.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -16,7 +16,6 @@
*/
#include "mpquerymanager.h"
-#include <QDebug>
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkDiskCache>
@@ -25,58 +24,31 @@
#include <QNetworkSession>
#include <QDomElement>
#include <QList>
-#include <QFile>
#include <QUrl>
#include <QSslError>
-#include <QDir>
-#include <QCoreApplication>
#include <XQSysInfo>
-
-#include <thumbnailmanager_qt.h>
-#include <thumbnaildata.h>
-#include <thumbnailobjectsource.h>
+#include <QSignalMapper>
+#include <QSettings>
#include "mptrace.h"
-const int KUndefined = -1;
const int KRecommendationCount = 2;
MpQueryManager::MpQueryManager()
: mManager(0),
mAlbumArtDownloader(0),
- mThumbnailManager(0),
mDefaultRecommendationAlbumArt("qtg_large_album_art"),
mRequestType(NoRequest),
- mRecommendationCount(0)
-
+ mRecommendationCount(0)
{
TX_ENTRY
-
- QString privatePathQt( QCoreApplication::applicationDirPath() );
- TX_LOG_ARGS( "Private path: " << privatePathQt );
- QDir dir( privatePathQt );
- QString newDir = "detailsview";
- bool res = dir.mkdir( newDir );
- TX_LOG_ARGS( "New dir creation result: " << res);
+ mManager = new QNetworkAccessManager( this );
+ // A second intance is necessary to reduce complexity.
+ // Otherwise, we would have to shoot async events when we want to receive inspire me items' album art
+ // and that may not always work.
+ mAlbumArtDownloader = new QNetworkAccessManager( this );
- // TODO: Instead of writing the album art to a file,
- // then using Thumbnail Manager to convert it, etc.
- // have you considered just loading it directly into QPixmap?
- // QPixmap provides a loadFromData() that can load from QByteArray.
- // This would not only make the availability of the album art immediate,
- // but also save a lot of cleanup in file system, thumbnail manager, etc.
- privatePathQt = privatePathQt + "/detailsview";
- QString albumArt1( privatePathQt + "/albumOne.png" );
- QString albumArt2( privatePathQt + "/albumTwo.png" );
- mRecommendationAlbumArtsName << albumArt1 << albumArt2;
- TX_LOG_ARGS( "recommendation album art names: " << mRecommendationAlbumArtsName );
-
- mManager = new QNetworkAccessManager( this );
- mAlbumArtDownloader = new QNetworkAccessManager( this ); // TODO: check if we can only use mManager
- mThumbnailManager = new ThumbnailManager( this );
- mThumbnailManager->setQualityPreference( ThumbnailManager::OptimizeForQuality );
- mThumbnailManager->setThumbnailSize( ThumbnailManager::ThumbnailSmall );
-
+ mDownloadSignalMapper = new QSignalMapper(this);
TX_EXIT
}
@@ -90,9 +62,7 @@
if ( mAlbumArtDownloader ) {
mAlbumArtDownloader->deleteLater();
}
- if( mThumbnailManager ) {
- mThumbnailManager->deleteLater();
- }
+ delete mDownloadSignalMapper;
TX_EXIT
}
@@ -115,21 +85,6 @@
TX_EXIT
}
-
-void MpQueryManager::queryLocalMusicStore(QString artist,QString album,QString title)
-{
- TX_ENTRY
- mArtist=artist;
- mAlbum=album;
- mTitle=title;
- // TODO: country information handling, MCC
- QString queryURI("http://api.music.ovi.com/1.0/ru/?");
- constructRequest( queryURI );
- TX_LOG_ARGS( "queryURI : " << queryURI );
- retrieveInformation( queryURI );
- mRequestType = LocalStoreRequest;
- TX_EXIT
-}
void MpQueryManager::queryInspireMeItems(QString artist,QString album,QString title)
{
@@ -140,7 +95,6 @@
// start querying inspire me items
QString queryRecommendation("http://api.music.ovi.com/1.0/" + mMusicStore + "/releases/recommend/?");
constructRequest( queryRecommendation );
- // TODO: Store the token to a cenrep key
// TODO: Tokens change per new ovi api release.
// Need to figure out a way to get them updated on the fly
queryRecommendation.append("&Token=03574704-e3d1-4466-9691-e0b34c7abfff");
@@ -161,13 +115,6 @@
mRecommendationArtists.clear();
mRecommendationAlbumArtsLink.clear();
mRecommendationAlbumArtsMap.clear();
- for ( int i = 0; i < mRecommendationAlbumArtsName.count(); ++i ) {
- QFile file( mRecommendationAlbumArtsName.at( i ) );
- TX_LOG_ARGS( "File " << file.fileName() << " exists: " << file.exists() );
- if ( file.exists() && file.remove() ) {
- TX_LOG_ARGS( "File " << file.fileName() << " removed");
- }
- }
TX_EXIT
}
@@ -284,7 +231,6 @@
void MpQueryManager::retrieveInformationNetworkError( QNetworkReply::NetworkError error )
{
TX_ENTRY_ARGS( "Network error for retrieving Information" << error);
- // TODO: agree on error handling
Q_UNUSED(error)
@@ -298,7 +244,6 @@
*/
void MpQueryManager::retrieveInformationSslErrors( const QList<QSslError> &/*error*/ )
{
- // TODO: agree on error handling
TX_ENTRY_ARGS( "SSL error for retrieving Information" );
disconnect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) );
signalError();
@@ -308,91 +253,47 @@
/*!
Slot to call when downloading finished
*/
-void MpQueryManager::albumArtDownloaded( QNetworkReply* reply )
+void MpQueryManager::albumArtDownloaded( int index )
{
- TX_ENTRY_ARGS( "mDownloadedAlbumArts = " << mDownloadedAlbumArts );
- TX_ENTRY_ARGS( "QNetworkReply obj " << reply);
+ TX_ENTRY_ARGS( "mDownloadedAlbumArts = " << mDownloadedAlbumArts << "index = " << index);
+ QNetworkReply* reply = qobject_cast<QNetworkReply*> ( qobject_cast<QSignalMapper*>( sender() )->mapping( index ) );
// It seems we get several finished signals for the same reply obj
// do nothing if we get a second signal
if( mReplys.indexOf(reply) == -1 ) {
TX_LOG_ARGS("Warning: QNetworkReply AA request may have been processed in previous call: " << reply );
return;
}
-
+
if ( reply->error() == QNetworkReply::NoError ) {
-
- QString fileName = mRecommendationAlbumArtsName.at( mDownloadedAlbumArts );
- QByteArray imageData = reply->readAll();
- bool ret = writeImageToFile( imageData, fileName );
+ QPixmap albumart;
+ bool result = albumart.loadFromData( reply->readAll() );
+ if ( result ) {
+ mRecommendationAlbumArtsMap.insert( mRecommendationAlbumArtsLink.at( index ), HbIcon( QIcon( albumart ) ) );
- // If file writing went OK, emit a signal with the real filename
- // If it failed, use empty filename (since file was removed in any case)
- if ( ret ) {
- // TODO: If album album arts come in different order than they have been asked,
- // then inspire me items will use swapped album arts. Correct
- setAlbumArtUri( mRecommendationAlbumArtsLink.at( mDownloadedAlbumArts),
- mRecommendationAlbumArtsName.at( mDownloadedAlbumArts ) );
+ } else {
+ mRecommendationAlbumArtsMap.insert( mRecommendationAlbumArtsLink.at( index ), mDefaultRecommendationAlbumArt );
}
- else {
- setAlbumArtUri(mRecommendationAlbumArtsLink.at( mDownloadedAlbumArts), "");
- }
+
++mDownloadedAlbumArts;
mReplys.removeAll(reply); // remove it so that we wont process it again
reply->deleteLater(); // make sure reply is deleted, as we longer care about it
}
else {
TX_LOG_ARGS( "Error: Downloading album art failed! Will keep using the default AA" );
+ mRecommendationAlbumArtsMap.insert( mRecommendationAlbumArtsLink.at( index ), mDefaultRecommendationAlbumArt );
}
+ mDownloadSignalMapper->removeMappings( reply );
if( mDownloadedAlbumArts == mRecommendationCount) {
// no need to be informed anymore
- mAlbumArtDownloader->disconnect(this);
+ mDownloadSignalMapper->disconnect(this);
+ emit inspireMeItemAlbumArtReady();
}
TX_EXIT
}
-/*!
- Write the image data to a file with the given filename.
- If writing operation fails for any reason (e.g. OOD),
- returns false, otherwise true.
- */
-bool MpQueryManager::writeImageToFile(const QByteArray &aImageData, const QString &aImageFileName )
-{
- bool ret( false );
- TX_ENTRY_ARGS( "imagefile: " << aImageFileName );
- if ( aImageFileName.isEmpty() ) {
- TX_LOG_ARGS( "Only store two album arts" );
- }
- else {
- QFile file( aImageFileName );
- if ( !file.open( QIODevice::ReadWrite ) ) {
- TX_LOG_ARGS( "Unable to open file" );
- }
- else {
- qint64 writtenBytes = file.write( aImageData );
- // Verify file write status
- if ( writtenBytes < aImageData.size() ) {
- // If write succeeded only partially, or completely failed,
- // remove the file from filesystem to remove risk of corruption
- TX_LOG_ARGS( "Wrote only " << writtenBytes << " bytes, aborting operation!" );
- file.close();
- QFile::remove( mRecommendationAlbumArtsName.at( mDownloadedAlbumArts ) );
- }
- else {
- // If write fully succeeded, flush contents
- TX_LOG_ARGS( "Wrote all the bytes (" << writtenBytes << "), flushing and closing!");
- file.flush();
- file.close();
- ret = true;
- }
- }
- }
- TX_LOG_ARGS( "Returning with value: " << ret );
- TX_EXIT
- return ret;
-}
/*!
Get Atom response from Ovi server based on query
@@ -428,7 +329,6 @@
while ( !link.isNull() ) {
if ( link.attribute( "title" ) == "albumart100" ) {
mRecommendationAlbumArtsLink.append( link.attribute( "href" ) );
- // TODO: This may get called twice for one inspire me item. Investigate why
mRecommendationAlbumArtsMap.insert( link.attribute( "href" ), mDefaultRecommendationAlbumArt );
break;
}
@@ -457,12 +357,15 @@
if ( mRecommendationAlbumArtsLink.at( i ).contains( "http", Qt::CaseInsensitive ) ) {
reply = mAlbumArtDownloader->get( QNetworkRequest( QUrl( mRecommendationAlbumArtsLink.at(i) ) ) );
mReplys.append( reply );
+ connect( reply, SIGNAL( finished() ), mDownloadSignalMapper, SLOT( map() ) );
+ mDownloadSignalMapper->setMapping( reply, i );
+
connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( retrieveInformationNetworkError( QNetworkReply::NetworkError ) ) );
connect( reply, SIGNAL( sslErrors( QList<QSslError> ) ), this, SLOT( retrieveInformationSslErrors( QList<QSslError> ) ) );
}
}
// we have queried for album arts for inspire me items. Now, time to wait for a response
- connect( mAlbumArtDownloader, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( albumArtDownloaded( QNetworkReply * ) ) );
+ connect( mDownloadSignalMapper, SIGNAL( mapped( int ) ), this, SLOT( albumArtDownloaded( int ) ) );
}
else if ( rootElement.attribute( "type" ) == "storeList" ) {
@@ -470,10 +373,15 @@
QDomElement entry = rootElement.firstChildElement( "workspace" );
QString previousMusicStore = mMusicStore;
mMusicStore = entry.attribute( "countryCode" );
- if(!mMusicStore.isEmpty()) {
- bool musicStoreUpdated = (previousMusicStore != mMusicStore);
- TX_LOG_ARGS("Music Store" << mMusicStore );
- emit localMusicStoreRetrieved(musicStoreUpdated);
+ if( !mMusicStore.isEmpty() ) {
+ bool musicStoreUpdated = ( previousMusicStore != mMusicStore );
+ TX_LOG_ARGS("Music Store" << mMusicStore );
+ emit localMusicStoreRetrieved( musicStoreUpdated );
+ if( musicStoreUpdated ) {
+ QSettings settings;
+ TX_LOG_ARGS( "Storing music store value: " << mMusicStore );
+ settings.setValue( "LocalMusicStore", QVariant( mMusicStore ) );
+ }
}
else {
emit localMusicStoreRetrievalError();
@@ -485,28 +393,14 @@
TX_EXIT
}
-void MpQueryManager::clearThumbnails()
-{
- TX_ENTRY
- for(int i = 0; i < mThumbnailRequests.count(); ++i ) {
- mThumbnailManager->cancelRequest(mThumbnailRequests.at(i));
- }
- mThumbnailRequests.clear();
- for(int i = 0; i < mRecommendationAlbumArtsName.count(); ++i) {
- mThumbnailManager->deleteThumbnails(mRecommendationAlbumArtsName.at(i)); // async, returns immidiately
- }
- TX_EXIT
-}
void MpQueryManager::reset()
{
TX_ENTRY
mManager->disconnect(this);
mAlbumArtDownloader->disconnect(this);
- mThumbnailManager->disconnect(this);
clearNetworkReplies();
clearRecommendations();
- clearThumbnails();
mRecommendationAlbumArtsMap.clear();
TX_EXIT
}
@@ -521,8 +415,8 @@
QStringList keys;
keys << "artist" << "albumtitle" << "tracktitle" << "orderby";
- // TODO: need to clarify which crition to use for sort, currently hard code to "relevancy"
- // order can be relevancy, alltimedownloads, streetreleasedate, sortname, recentdownloads
+ // "relevancy" is the selected sort order
+ // sort order types can be relevancy, alltimedownloads, streetreleasedate, sortname, recentdownloads
QStringList values;
values << mArtist << mAlbum << mTitle << QString("relevancy");
TX_LOG_ARGS( "Artist: " << mArtist );
@@ -558,71 +452,14 @@
return str.left( str.length() - 1 );
}
-/*!
- Sets recommendation album art
-*/
-void MpQueryManager::setAlbumArtUri( const QString &albumArtUri, const QString &albumArtName )
+bool MpQueryManager::isLocalMusicStore()
{
- // TODO: rename this function. Doing too many things
- TX_ENTRY_ARGS( "albumArtUri = " << albumArtUri )
- TX_LOG_ARGS( "albumArtName = " << albumArtName )
- if ( !albumArtUri.isEmpty() && !albumArtName.isEmpty() ) {
- // TODO: this is no good to pass the address of the albumArtUri. It is an item in the list, which can cleaned
- int id = mThumbnailManager->getThumbnail( albumArtName, reinterpret_cast<void *>( const_cast<QString *>( &albumArtUri ) ) );
- if ( id == KUndefined ) {
- // Request failed. Set default album art
- mRecommendationAlbumArtsMap.insert( albumArtUri, mDefaultRecommendationAlbumArt );
- }
- else {
- // Async request went throu
- TX_LOG_ARGS("Request to thumbnail manager made. Id: " << id)
- mThumbnailRequests.append(id);
- mThumbnailManager->disconnect( this ); // to prevent multiple same connections with thumbnailmanager
- QObject::connect( mThumbnailManager, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ),
- this, SLOT( thumbnailReady( QPixmap , void * , int , int ) ) );
- }
- }
- else {
- // No album art uri. Set default album art.
- mRecommendationAlbumArtsMap.insert( albumArtUri, mDefaultRecommendationAlbumArt );
+ if( mMusicStore.isEmpty() ) {
+ QSettings settings;
+ QVariant settingsvariant = settings.value( "LocalMusicStore", "" );
+ mMusicStore = settingsvariant.toString();
+ TX_LOG_ARGS( "Got local music store from settings:" << mMusicStore );
}
- TX_EXIT
-}
-
-/*!
- Slot to handle the recommendation album art
-*/
-void MpQueryManager::thumbnailReady(
- const QPixmap pixmap,
- void *data,
- int id,
- int error )
-{
- TX_ENTRY
-
- if( mThumbnailRequests.indexOf(id) == -1 ) {
- TX_LOG_ARGS("Warning: some old thumbnail request from previous song. Ignoring")
- return;
- }
-
- // TODO: Using data from array, which can be reset. There must be a safer way
- QString uri = *( reinterpret_cast<QString *>( data ) );
- TX_LOG_ARGS( "Uri: " << uri );
-
- if ( error == 0 ) {
- TX_LOG_ARGS( "album art link: " << uri );
- mRecommendationAlbumArtsMap.insert( uri, HbIcon(QIcon(pixmap)) );
- }
- else {
- mRecommendationAlbumArtsMap.insert( uri, mDefaultRecommendationAlbumArt );
- }
-
- emit inspireMeItemAlbumArtReady();
- TX_EXIT
-}
-
-bool MpQueryManager::isLocalMusicStore() const
-{
TX_LOG_ARGS( "isLocalMusicStore = " << !mMusicStore.isEmpty() )
return !mMusicStore.isEmpty();
}
--- a/mpviewplugins/mpmediawallviewplugin/src/mpmediawallview.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/src/mpmediawallview.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -26,6 +26,8 @@
#include <hbtoolbutton.h>
#include <hblistview.h>
#include <hbstyleloader.h>
+#include <hbmessagebox.h>
+
#include <hgmediawall.h>
@@ -148,7 +150,7 @@
mEngine = MpEngineFactory::createIsolatedEngine( MpEngine::MediaBrowsing );
mCollectionData = mEngine->collectionData();
- mModel = new MpCollectionDataModel( mCollectionData, this );
+ mModel = new MpCollectionDataModel( mCollectionData, mPlaybackData, this );
connect( mCollectionData, SIGNAL( contextChanged( TCollectionContext ) ),
this, SLOT( contextOpened( TCollectionContext ) ) );
@@ -170,7 +172,9 @@
mTrackList = new MpTrackListWidget( this );
mTrackList->setGraphicsEffect( new MpReflectionEffect(mTrackList) );
- mTrackList->list()->setModel( new MpCollectionTBoneListDataModel(mCollectionData, mPlaybackData, mTrackList ) );
+ MpCollectionTBoneListDataModel *model = new MpCollectionTBoneListDataModel(mCollectionData, mPlaybackData, mTrackList );
+ model->enablePlaybackIndicatorEnable(true);
+ mTrackList->list()->setModel( model );
mTrackList->hide();
connect(mAlbumCover,SIGNAL(clicked()),this, SLOT(hideTracksList()));
@@ -392,10 +396,19 @@
*/
void MpMediaWallView::listItemActivated( const QModelIndex &index )
{
- int albumIndex = mMediaWallWidget->currentIndex().row();
- //We are playing on the shared engine, but we pass the collection data that
- //points to albums on media wall, this is used to construct the playlist.
- MpEngineFactory::sharedEngine()->playAlbumSongs( albumIndex, index.row(), mCollectionData );
+ if (!mCollectionData->hasAlbumSongProperty(index.row(), MpMpxCollectionData::Corrupted)) {
+ int albumIndex = mMediaWallWidget->currentIndex().row();
+ //We are playing on the shared engine, but we pass the collection data that
+ //points to albums on media wall, this is used to construct the playlist.
+ MpEngineFactory::sharedEngine()->playAlbumSongs( albumIndex, index.row(), mCollectionData );
+ }
+ else{
+ //pop up corrupted note
+ HbMessageBox *messageBox = new HbMessageBox( hbTrId( "txt_mus_info_file_is_corrupt" ), HbMessageBox::MessageTypeInformation );
+ messageBox->setAttribute( Qt::WA_DeleteOnClose );
+ messageBox->setIcon( HbIcon( QString("qtg_small_fail") ) );
+ messageBox->show();
+ }
}
/*!
--- a/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/inc/mpcollectiondatamodel.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/inc/mpcollectiondatamodel.h Thu Sep 02 20:24:03 2010 +0300
@@ -23,6 +23,7 @@
class MpMpxCollectionData;
class MpCollectionAlbumArtManager;
+class MpPlaybackData;
class MpCollectionDataModel : public QAbstractListModel
@@ -31,7 +32,7 @@
public:
- explicit MpCollectionDataModel( MpMpxCollectionData *data, QObject *parent=0 );
+ explicit MpCollectionDataModel( MpMpxCollectionData *data, MpPlaybackData *playbackData = 0, QObject *parent=0 );
virtual ~MpCollectionDataModel();
int rowCount(const QModelIndex &parent=QModelIndex()) const;
--- a/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/inc/mpcollectiontbonelistdatamodel.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/inc/mpcollectiontbonelistdatamodel.h Thu Sep 02 20:24:03 2010 +0300
@@ -36,6 +36,11 @@
int rowCount(const QModelIndex &parent=QModelIndex()) const;
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const;
+ void enablePlaybackIndicatorEnable(bool enable);
+
+public slots:
+
+ void fileCorrupted(int songId);
};
--- a/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/inc/mpmpxcollectiondata.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/inc/mpmpxcollectiondata.h Thu Sep 02 20:24:03 2010 +0300
@@ -39,6 +39,11 @@
Rating,
AlbumArtUri
};
+
+ enum DataProperty {
+ Corrupted,
+ DrmExpired
+ };
// Stub functions
explicit MpMpxCollectionData( QObject *parent=0 );
@@ -53,6 +58,7 @@
void setContext( TCollectionContext context );
int itemIndex( int itemUniqueId );
bool setCurrentAlbum( int index );
+ bool hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const;
const CMPXMedia& containerMedia();
--- a/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/src/mpcollectiondatamodel.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/src/mpcollectiondatamodel.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -19,15 +19,17 @@
#include "stub/inc/mpcollectiondatamodel.h"
#include "stub/inc/mpmpxcollectiondata.h"
+#include "stub/inc/mpplaybackdata.h"
/*!
Stub function
*/
-MpCollectionDataModel::MpCollectionDataModel( MpMpxCollectionData *data, QObject *parent )
+MpCollectionDataModel::MpCollectionDataModel( MpMpxCollectionData *data, MpPlaybackData *playbackData, QObject *parent )
: QAbstractListModel(parent)
{
Q_UNUSED(data);
+ Q_UNUSED(playbackData);
}
/*!
--- a/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/src/mpcollectiontbonelistdatamodel.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/src/mpcollectiontbonelistdatamodel.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -57,3 +57,18 @@
return QVariant();;
}
+/*!
+ Stub function
+ */
+void MpCollectionTBoneListDataModel::enablePlaybackIndicatorEnable(bool enable)
+{
+ Q_UNUSED(enable);
+}
+
+/*!
+ Stub function
+ */
+void MpCollectionTBoneListDataModel::fileCorrupted(int songId)
+{
+ Q_UNUSED(songId);
+}
--- a/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/src/mpmpxcollectiondata.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpmediawallviewplugin/tsrc/unittest_mpmediawallview/stub/src/mpmpxcollectiondata.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -97,6 +97,14 @@
/*!
Stub function.
*/
+bool MpMpxCollectionData::hasAlbumSongProperty( int index, MpMpxCollectionData:: DataProperty type ) const
+{
+
+}
+
+/*!
+ Stub function.
+*/
const CMPXMedia& MpMpxCollectionData::containerMedia()
{
return *mContainerMedia;
--- a/mpviewplugins/mpplaybackviewplugin/inc/mpequalizerwidget.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/inc/mpequalizerwidget.h Thu Sep 02 20:24:03 2010 +0300
@@ -51,7 +51,7 @@
MpEngine *mMpEngine; // Own
HbRadioButtonList *mPresetsList; //owned
- int mOriginalPreset;
+ int mOriginalPresetIndex;
Q_DISABLE_COPY(MpEqualizerWidget)
--- a/mpviewplugins/mpplaybackviewplugin/inc/mpplaybackview.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/inc/mpplaybackview.h Thu Sep 02 20:24:03 2010 +0300
@@ -80,6 +80,7 @@
void endForward();
void connectButtons();
+ void showCorruptedNote();
private:
--- a/mpviewplugins/mpplaybackviewplugin/resources/playbackwidget.docml Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/resources/playbackwidget.docml Thu Sep 02 20:24:03 2010 +0300
@@ -1,42 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
-<hbdocument version="0.9">
-
+<hbdocument version="1.2">
<widget name="playbackWidgetContainer" type="HbWidget">
- <widget name="albumText" type="HbLabel">
- <enums name="alignment" value="AlignVCenter|AlignHCenter"/>
- <fontspec name="fontSpec" role="Secondary"/>
+ <widget name="albumArt" type="MpAlbumCoverWidget">
+ <sizehint height="var(hb-param-screen-width)" type="FIXED" width="var(hb-param-screen-width)"/>
+ <sizepolicy horizontalPolicy="Fixed" verticalPolicy="Fixed" />
</widget>
<widget name="artistRow" type="HbWidget">
- <widget name="realAudio" type="HbLabel">
- <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Fixed" verticalStretch="0"/>
- <sizehint height="var(hb-param-graphic-size-primary-small)" type="FIXED" width="var(hb-param-graphic-size-primary-small)"/>
- <icon iconName="qtg_large_realplayer" name="icon"/>
- </widget>
- <widget name="artistText" type="HbLabel">
- <enums name="alignment" value="AlignVCenter|AlignHCenter"/>
- <fontspec name="fontSpec" role="Secondary"/>
- </widget>
- <widget name="repeatIcon" type="HbLabel">
- <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Fixed" verticalStretch="0"/>
- <sizehint height="var(hb-param-graphic-size-primary-small)" type="FIXED" width="var(hb-param-graphic-size-primary-small)"/>
- <icon iconName="qtg_small_repeat" name="icon"/>
- </widget>
-
- <layout type="anchor">
- <anchoritem dst="realAudio" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)" src="" srcEdge="LEFT"/>
- <anchoritem dst="realAudio" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" src="" srcEdge="TOP"/>
-
- <anchoritem dst="artistText" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)" src="realAudio" srcEdge="RIGHT"/>
- <anchoritem dst="artistText" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" src="repeatIcon" srcEdge="LEFT"/>
- <anchoritem dst="artistText" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" src="" srcEdge="TOP"/>
-
- <anchoritem dst="repeatIcon" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" src="" srcEdge="RIGHT"/>
- <anchoritem dst="repeatIcon" dstEdge="TOP" spacing="var(hb-param-margin-gene-middle-vertical)" src="" srcEdge="TOP"/>
- </layout>
+ <sizehint type="FIXED" width="expr(var(hb-param-screen-width) -2*var(hb-param-margin-gene-screen))"/>
+ <sizepolicy horizontalPolicy="Fixed" />
+
+ <widget name="realAudio" type="HbLabel">
+ <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Fixed" verticalStretch="0"/>
+ <sizehint height="var(hb-param-graphic-size-primary-small)" type="FIXED" width="var(hb-param-graphic-size-primary-small)"/>
+ <bool name="visible" value="FALSE"/>
+ <!-- resource name is correct, but does not show up -->
+ <icon iconName="qtg_large_realplayer" name="icon"/>
+ </widget>
+
+ <widget name="artistText" type="HbLabel">
+ <enums name="alignment" value="AlignVCenter|AlignHCenter"/>
+ <fontspec name="fontSpec" role="Secondary"/>
+ <sizehint type="FIXED" width="expr(var(hb-param-screen-width)-2*(var(hb-param-margin-gene-screen)+var(hb-param-graphic-size-primary-small)+var(hb-param-margin-gene-middle-horizontal)))"/>
+ <sizepolicy horizontalPolicy="Fixed" />
+ </widget>
+
+ <widget name="repeatIcon" type="HbLabel">
+ <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Fixed" verticalStretch="0"/>
+ <sizehint height="var(hb-param-graphic-size-primary-small)" type="FIXED" width="var(hb-param-graphic-size-primary-small)"/>
+ <icon iconName="qtg_small_repeat" name="icon"/>
+ </widget>
+
+ <layout type="anchor">
+ <anchoritem dst="realAudio" dstEdge="LEFT" spacing="0" src="" srcEdge="LEFT"/>
+ <anchoritem dst="realAudio" dstEdge="TOP" spacing="0" src="" srcEdge="TOP"/>
+
+ <anchoritem dst="artistText" dstEdge="LEFT" spacing="var(hb-param-margin-gene-middle-horizontal)" src="realAudio" srcEdge="RIGHT"/>
+ <anchoritem dst="artistText" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-middle-horizontal)" src="repeatIcon" srcEdge="LEFT"/>
+ <anchoritem dst="artistText" dstEdge="CENTERV" spacing="0" src="" srcEdge="CENTERV"/>
+
+ <anchoritem dst="repeatIcon" dstEdge="RIGHT" spacing="0" src="" srcEdge="RIGHT"/>
+ <anchoritem dst="repeatIcon" dstEdge="TOP" spacing="0" src="" srcEdge="TOP"/>
+ </layout>
+
</widget>
<widget name="songText" type="HbLabel">
@@ -44,38 +53,31 @@
<fontspec name="fontSpec" role="Primary"/>
</widget>
- <widget name="albumArt" type="MpAlbumCoverWidget"/>
+ <widget name="albumText" type="HbLabel">
+ <enums name="alignment" value="AlignVCenter|AlignHCenter"/>
+ <fontspec name="fontSpec" role="Secondary"/>
+ </widget>
<widget name="progressBar" type="HbProgressSlider">
<fontspec name="fontSpec" role="PrimarySmall"/>
+ <contentsmargins top="1.0un"/>
</widget>
- <widget name="textContainer" type="HbWidget"/>
-
- <bool name="visible" value="TRUE"/>
-
- </widget>
-
- <widget name="albumArt">
- <sizehint height="var(hb-param-screen-width)" type="MAXIMUM" width="var(hb-param-screen-width)"/>
- <sizehint height="var(hb-param-screen-width)" type="PREFERRED" width="var(hb-param-screen-width)"/>
- <sizehint height="var(hb-param-screen-width)" type="FIXED" width="var(hb-param-screen-width)"/>
- <sizehint height="var(hb-param-screen-width)" type="MINIMUM" width="var(hb-param-screen-width)"/>
- <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Fixed" verticalStretch="0"/>
- </widget>
+ <widget name="textContainer" type="HbWidget">
+ <layout type="linear" orientation="Vertical" spacing="var(hb-param-margin-gene-middle-vertical)" >
+ <contentsmargins bottom="var(hb-param-margin-gene-screen)" left="var(hb-param-margin-gene-screen)" right="var(hb-param-margin-gene-screen)" top="0.0un"/>
+ <linearitem itemname="artistRow"/>
+ <linearitem itemname="songText"/>
+ <linearitem itemname="albumText"/>
+ <linearitem itemname="progressBar"/>
+ </layout>
+ </widget>
- <layout type="linear" orientation="Vertical" spacing="var(hb-param-margin-gene-middle-vertical)" widget="textContainer">
- <contentsmargins bottom="var(hb-param-margin-gene-screen)" left="var(hb-param-margin-gene-screen)" right="var(hb-param-margin-gene-screen)" top="0.0un"/>
- <linearitem itemname="artistRow"/>
- <linearitem itemname="songText"/>
- <linearitem itemname="albumText"/>
- <linearitem itemname="progressBar"/>
- </layout>
+ <layout orientation="Vertical" spacing="var(hb-param-margin-gene-middle-vertical)" type="linear" >
+ <contentsmargins bottom="var(hb-param-margin-view-bottom)" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="var(hb-param-margin-view-top)"/>
+ <linearitem itemname="albumArt"/>
+ <linearitem itemname="textContainer"/>
+ </layout>
- <layout orientation="Vertical" spacing="var(hb-param-margin-gene-middle-vertical)" type="linear" widget="playbackWidgetContainer">
- <contentsmargins bottom="0.0un" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="0.0un"/>
- <linearitem itemname="albumArt"/>
- <linearitem itemname="textContainer"/>
- </layout>
-
+ </widget>
</hbdocument>
\ No newline at end of file
--- a/mpviewplugins/mpplaybackviewplugin/src/mpequalizerwidget.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/src/mpequalizerwidget.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -39,7 +39,7 @@
MpEqualizerWidget::MpEqualizerWidget() :
mMpEngine(0),
mPresetsList(0),
- mOriginalPreset(KEqualizerPresetNone)
+ mOriginalPresetIndex(0)
{
TX_ENTRY
@@ -82,7 +82,7 @@
setFrameType(HbPopup::Strong);
setHeadingWidget(new HbLabel(hbTrId("txt_mus_title_select_preset")));
- mOriginalPreset = mMpEngine->activePreset();
+ mOriginalPresetIndex = mMpEngine->activePreset();
QStringList listItems;
QStringList presetNames = mMpEngine->presetNames();
for ( int i=0; i<presetNames.count(); i++ ) {
@@ -98,15 +98,8 @@
}
listItems.prepend(hbTrId("txt_mus_list_off"));
TX_LOG_ARGS( "PresetNames=" << listItems);
- int presetSelected;
- if (mOriginalPreset == KEqualizerPresetNone) {
- presetSelected = 0; //First list item corresponds to "OFF"
- }
- else {
- presetSelected = mOriginalPreset;
- }
-
- mPresetsList = new HbRadioButtonList(listItems, presetSelected, HbRadioButtonList::NoPreview, this);
+
+ mPresetsList = new HbRadioButtonList(listItems, mOriginalPresetIndex, HbRadioButtonList::NoPreview, this);
setContentWidget( mPresetsList ); //mPresetsList now owned by HbDialog
connect( mPresetsList,
@@ -154,14 +147,14 @@
if (mMpEngine && mPresetsList) {
// Return to the original Preset
- if (mOriginalPreset != mMpEngine->activePreset()) {
- if (mOriginalPreset == KEqualizerPresetNone) {
+ if (mOriginalPresetIndex != mMpEngine->activePreset()) {
+ if (mOriginalPresetIndex == 0) {
mMpEngine->disableEqualizer();
mPresetsList->setSelected( 0 ); //First list item corresponds to "OFF"
}
else {
- mMpEngine->applyPreset( mOriginalPreset );
- mPresetsList->setSelected( mOriginalPreset );
+ mMpEngine->applyPreset( mOriginalPresetIndex );
+ mPresetsList->setSelected( mOriginalPresetIndex );
}
}
}
@@ -179,7 +172,7 @@
//Update original preset
if (mMpEngine) {
- mOriginalPreset = mMpEngine->activePreset();
+ mOriginalPresetIndex = mMpEngine->activePreset();
}
TX_EXIT
--- a/mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -24,6 +24,7 @@
#include <hbtoolbutton.h>
#include <hbaction.h>
#include <hbicon.h>
+#include <hbmessagebox.h>
#include "mpplaybackview.h"
#include "mpplaybackwidget.h"
@@ -102,6 +103,7 @@
connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) );
mMpEngine = MpEngineFactory::sharedEngine();
+ connect( mMpEngine, SIGNAL( corruptedStop() ), this, SLOT(showCorruptedNote() ));
mPlaybackData = mMpEngine->playbackData();
connect( mPlaybackData, SIGNAL( playbackStateChanged() ),
this, SLOT( playbackStateChanged() ) );
@@ -563,6 +565,19 @@
}
/*!
+ Slot to be called to show corrupted message box.
+ */
+void MpPlaybackView::showCorruptedNote()
+{
+ mMpEngine->stop();
+ HbMessageBox *messageBox = new HbMessageBox( hbTrId( "txt_mus_info_unable_to_play_selection" ), HbMessageBox::MessageTypeWarning );
+ messageBox->setAttribute( Qt::WA_DeleteOnClose );
+ messageBox->setIcon( HbIcon( QString("qtg_small_fail") ) );
+ connect (messageBox, SIGNAL( aboutToClose() ), this, SLOT( back() ) );
+ messageBox->show();
+}
+
+/*!
Slot to be called to activate equalizer dialog.
*/
void MpPlaybackView::showEqualizerDialog()
--- a/mpviewplugins/mpplaybackviewplugin/src/mpplaybackwidget.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/src/mpplaybackwidget.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -84,7 +84,6 @@
mAlbumArt->setDefaultIcon( HbIcon( "qtg_large_album_art" ) );
tmpWidgetPtr = mDocumentLoader->findWidget(QString("realAudio"));
mRealAudioIndicator = qobject_cast<HbLabel*>(tmpWidgetPtr);
- mRealAudioIndicator->hide();
tmpWidgetPtr = mDocumentLoader->findWidget(QString("repeatIcon"));
mRepeatIndicator = qobject_cast<HbLabel*>(tmpWidgetPtr);
@@ -142,9 +141,25 @@
void MpPlaybackWidget::playbackInfoChanged( )
{
TX_ENTRY
+ //Title
mSongTitle->setPlainText( mPlaybackData->title() );
- mArtistName->setPlainText( mPlaybackData->artist() );
- mAlbumName->setPlainText( mPlaybackData->album() );
+ // Artist
+ QString data = mPlaybackData->artist();
+ if ( !data.isEmpty() ) {
+ mArtistName->setPlainText( data );
+ }
+ else {
+ mArtistName->setPlainText( hbTrId( "txt_mus_other_unknown3" ) );
+ }
+ // Album
+ data = mPlaybackData->album();
+ if ( !data.isEmpty() ) {
+ mAlbumName->setPlainText( data );
+ }
+ else {
+ mAlbumName->setPlainText( hbTrId( "txt_mus_other_unknown4" ) );
+ }
+ // RealAudioIcon
mRealAudioIndicator->setVisible( mPlaybackData->realAudio() );
emit signalPlaybackInfoChanged();
TX_EXIT
--- a/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/src/unittest_mpequalizerwidget.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/src/unittest_mpequalizerwidget.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -122,7 +122,7 @@
void TestMpEqualizerWidget::testPrepareDialog()
{
mTest->prepareDialog();
- QVERIFY(mTest->mOriginalPreset == -1 );
+ QVERIFY(mTest->mOriginalPresetIndex == 0 );
QVERIFY(mTest->timeout() == HbDialog::NoTimeout);
QVERIFY(mTest->dismissPolicy() == HbDialog::NoDismiss);
QVERIFY(mTest->frameType() == HbPopup::Strong);
@@ -165,25 +165,25 @@
//When Original Preset == -1 "Off"
mTest->mMpEngine->mActivePreset = 4;
- mTest->mOriginalPreset = -1;
+ mTest->mOriginalPresetIndex = 0;
mTest->cancelSelected(true);
QVERIFY(mTest->mMpEngine->mDisableEquqlizerCount == 1);
- QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPreset);
+ QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPresetIndex);
//When Original Preset != -1 "Any other different than Off"
mTest->mMpEngine->mActivePreset = 4;
- mTest->mOriginalPreset = 2;
+ mTest->mOriginalPresetIndex = 2;
mTest->cancelSelected(true);
QVERIFY(mTest->mMpEngine->mApplyPresetCount == 1);
- QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPreset);
+ QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPresetIndex);
//Cancel, when Current preset selected == Original Preset
mTest->mMpEngine->mActivePreset = 3;
- mTest->mOriginalPreset = 3;
+ mTest->mOriginalPresetIndex = 3;
mTest->cancelSelected(true);
QVERIFY(mTest->mMpEngine->mApplyPresetCount == 1);
QVERIFY(mTest->mMpEngine->mDisableEquqlizerCount == 1);
- QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPreset);
+ QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPresetIndex);
}
/*!
@@ -192,9 +192,9 @@
void TestMpEqualizerWidget::testOkSelected()
{
mTest->mMpEngine->mActivePreset = 2;
- mTest->mOriginalPreset = -1;
+ mTest->mOriginalPresetIndex = -1;
mTest->okSelected(true);
- QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPreset);
+ QCOMPARE(mTest->mMpEngine->mActivePreset, mTest->mOriginalPresetIndex);
}
/*!
--- a/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/stub/src/mpengine.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpequalizerwidget/stub/src/mpengine.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -21,7 +21,7 @@
MpEngine::MpEngine()
- : mActivePreset(-1),
+ : mActivePreset(0),
mApplyPresetCount(0),
mDisableEquqlizerCount(0)
{
@@ -53,7 +53,7 @@
void MpEngine::disableEqualizer()
{
mDisableEquqlizerCount++;
- mActivePreset = -1;
+ mActivePreset = 0;
}
/*!
--- a/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpplaybackview/stub/inc/mpviewbase.h Wed Aug 18 09:46:20 2010 +0300
+++ b/mpviewplugins/mpplaybackviewplugin/tsrc/unittest_mpplaybackview/stub/inc/mpviewbase.h Thu Sep 02 20:24:03 2010 +0300
@@ -30,7 +30,6 @@
void setViewMode(MpCommon::MpViewMode viewMode) { mViewMode = viewMode; }
MpCommon::MpViewMode viewMode() { return mViewMode; }
- virtual void setDefaultView() { }
signals:
--- a/tsrc/mpfetchertestapp/mpfetchertestapp.pro Wed Aug 18 09:46:20 2010 +0300
+++ b/tsrc/mpfetchertestapp/mpfetchertestapp.pro Thu Sep 02 20:24:03 2010 +0300
@@ -17,7 +17,10 @@
TARGET = mpfetchertestapp
CONFIG += hb
-LIBS += -lxqservice -lxqserviceutil
+LIBS += -lxqservice \
+ -lxqserviceutil \
+ -lapgrfx \
+ -lcone
HEADERS += inc/mpfetchertestappview.h
--- a/utilities/mpnowplayingbanner/src/mpnowplayingwidget_p.cpp Wed Aug 18 09:46:20 2010 +0300
+++ b/utilities/mpnowplayingbanner/src/mpnowplayingwidget_p.cpp Thu Sep 02 20:24:03 2010 +0300
@@ -301,7 +301,13 @@
mPrimaryText->setPlainText( mPlaybackData->title() );
mPrimaryText->setProperty( "state", mPrimaryText->property("state").toString() );
- mSecondaryText->setPlainText( mPlaybackData->artist() );
+ QString data = mPlaybackData->artist();
+ if ( !data.isEmpty() ) {
+ mSecondaryText->setPlainText( data );
+ }
+ else {
+ mSecondaryText->setPlainText( hbTrId( "txt_mus_other_unknown" ) );
+ }
mSecondaryText->setProperty( "state", mSecondaryText->property("state").toString() );
}