diff -r 612c4815aebe -r 4cc1412daed0 mpviewplugins/mpdetailsviewplugin/src/mpquerymanager.cpp --- a/mpviewplugins/mpdetailsviewplugin/src/mpquerymanager.cpp Fri Jul 23 17:31:12 2010 -0500 +++ b/mpviewplugins/mpdetailsviewplugin/src/mpquerymanager.cpp Fri Aug 06 16:51:36 2010 -0500 @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -30,12 +30,12 @@ #include #include #include +#include #include #include #include -#include "mpdetailssharedialog.h" #include "mptrace.h" const int KUndefined = -1; @@ -43,8 +43,11 @@ MpQueryManager::MpQueryManager() : mManager(0), - mDownloadManager(0), - mThumbnailManager(0) + mAlbumArtDownloader(0), + mThumbnailManager(0), + mDefaultRecommendationAlbumArt("qtg_large_album_art"), + mRequestType(NoRequest), + mRecommendationCount(0) { TX_ENTRY @@ -56,56 +59,57 @@ bool res = dir.mkdir( newDir ); TX_LOG_ARGS( "New dir creation result: " << res); - // We're not handling a negative result for directory creation here, - // instead it will be escalated in DownloadFinished() method. + // 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 ); - - mDownloadManager = new QNetworkAccessManager( this ); - connect( mDownloadManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( DownloadFinished( QNetworkReply * ) ) ); - + 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 ); - QObject::connect( mThumbnailManager, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ), - this, SLOT( thumbnailReady( QPixmap , void * , int , int ) ) ); - // TODO: Use the album art in provided by 10.1 wk16 platform. Current one is in the binary - mDefaultRecommendationAlbumArt = QPixmap( ":/mpdetailsviewicons/qtg_large_music_album.svg" ); - + TX_EXIT } MpQueryManager::~MpQueryManager() { TX_ENTRY + reset(); if ( mManager ) { mManager->deleteLater(); - } - if ( mDownloadManager ) { - mDownloadManager->deleteLater(); + } + if ( mAlbumArtDownloader ) { + mAlbumArtDownloader->deleteLater(); } - delete mThumbnailManager; + if( mThumbnailManager ) { + mThumbnailManager->deleteLater(); + } TX_EXIT } void MpQueryManager::clearNetworkReplies() { + mRequestType = NoRequest; disconnect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) ); TX_ENTRY_ARGS( "Reply count = " << mReplys.count() ); - for ( int i = 0; i < mReplys.count(); i++ ) { + for ( int i = 0; i < mReplys.count(); ++i ) { QNetworkReply *reply = mReplys.at( i ); disconnect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( retrieveInformationNetworkError( QNetworkReply::NetworkError ) ) ); if ( reply != NULL ) { reply->close(); reply->deleteLater(); reply = NULL; - } + } } mReplys.clear(); TX_EXIT @@ -123,6 +127,7 @@ constructRequest( queryURI ); TX_LOG_ARGS( "queryURI : " << queryURI ); retrieveInformation( queryURI ); + mRequestType = LocalStoreRequest; TX_EXIT } @@ -133,82 +138,89 @@ mAlbum=album; mTitle=title; // start querying inspire me items - QString queryRecommendation("http://api.music.ovi.com/1.0/gb/releases/recommend/?"); + QString queryRecommendation("http://api.music.ovi.com/1.0/" + mMusicStore + "/releases/recommend/?"); constructRequest( queryRecommendation ); - TX_LOG_ARGS( "queryRecommendation : " << 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"); + + TX_LOG_ARGS( queryRecommendation ); retrieveInformation( queryRecommendation ); + mRequestType = InspireMeItemsMetadataRequest; TX_EXIT } void MpQueryManager::clearRecommendations() { - TX_ENTRY + TX_ENTRY + mRecommendationCount = 0; mDownloadedAlbumArts = 0; mAlbumArtsReadyCount = 0; - for ( int i = 0; i < KRecommendationCount; i++ ) { - mRecommendationSongs.clear(); - mRecommendationArtists.clear(); - mRecommendationAlbumArtsLink.clear(); - mRecommendationAlbumArtsMap.clear(); - QFile file( mRecommendationAlbumArtsName.at( i ) ); - if ( file.exists() ) { - if ( file.remove() ) { - TX_LOG_ARGS( "File removed - " << file.fileName() ); - } - else { - TX_LOG_ARGS( "Cannot remove file - " << file.fileName() ); - } - } else { - TX_LOG_ARGS( "File doesn't exist - " << file.fileName() ); + mRecommendationSongs.clear(); + 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 } + + /*! - Return recommendation songs + Returns the Local Music Store(if available) to be used while querying "Inspire Me" Items */ -QStringList MpQueryManager::recommendationSongs() +void MpQueryManager::queryLocalMusicStore() { - TX_LOG - return mRecommendationSongs; + TX_ENTRY + QString imsi,mcc; + + XQSysInfo sysInfo( this ); + imsi = sysInfo.imsi(); + mcc= imsi.left(3); + TX_LOG_ARGS( "mcc : " << mcc ); + + QString queryLocalMusicStore("http://api.music.cq1.brislabs.com/1.0/?mcc=" + mcc + "&token=06543e34-0261-40a4-a03a-9e09fe110c1f"); + TX_LOG_ARGS( "queryLocalMusicStore : " << queryLocalMusicStore ); + retrieveInformation( queryLocalMusicStore ); + mRequestType = LocalStoreRequest; + TX_EXIT +} + + +int MpQueryManager::recommendationsCount() const +{ + TX_LOG_ARGS ("count: " << mRecommendationSongs.count()); + return mRecommendationSongs.count(); +} + +QString MpQueryManager::recommendedSong(int index) const +{ + QString result; + if( (0 <= index) && (index < mRecommendationSongs.count())) { + result = mRecommendationSongs.at(index); + } + TX_LOG_ARGS ("recommendedSong: " << result); + return result; } /*! Return recommendation artists */ -QStringList MpQueryManager::recommendationArtists() -{ - TX_LOG - return mRecommendationArtists; -} - -/*! - Return recommendation album arts links - */ -QStringList MpQueryManager::recommendationAlbumArtsLink() +QString MpQueryManager::recommendedArtist(int index) const { - TX_LOG - return mRecommendationAlbumArtsLink; -} - -/*! - Return map of name and pixmap - */ -QMap MpQueryManager::recommendationAlbumArtsMap() -{ - TX_LOG - return mRecommendationAlbumArtsMap; -} - -/*! - Insert one uri & pixmap item into map - */ -void MpQueryManager::insertMapItem( const QString &uri, const QPixmap &pixmap ) -{ - TX_ENTRY_ARGS( "Map Item URI: " << uri ); - mRecommendationAlbumArtsMap.insert( uri, pixmap ); - TX_EXIT + QString result; + if( (0 <= index) && (index < mRecommendationArtists.count())) { + result = mRecommendationArtists.at(index); + } + TX_LOG_ARGS ("recommendedArtist: " << result); + return result; } /*! @@ -221,24 +233,49 @@ int errorLine; int errorColumn; bool parsingSuccess; + + if ( reply->error() != QNetworkReply::NoError ) { + TX_LOG_ARGS("reply->error(): " << reply->error()); + signalError(); + return; + } + + parsingSuccess = mDomDocument.setContent( reply, true, &errorStr, &errorLine, &errorColumn ); + if ( !parsingSuccess ) { + TX_LOG_ARGS("Parsing Received Content Failed"); + signalError(); + return; + } + + handleParsedXML(); //CodeScanner throws a warning mis-interpreting the trailing 'L' to be a leaving function. - if ( reply->error() == QNetworkReply::NoError ) - { - parsingSuccess = mDomDocument.setContent( reply, true, &errorStr, &errorLine, &errorColumn ); - if ( parsingSuccess ) { - handleParsedXML(); //CodeScanner throws a warning mis-interpreting the trailing 'L' to be a leaving function. - } else { - // TODO: agree on error handling - TX_LOG_ARGS( "XML parsing error" ); - } + 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 + + TX_EXIT +} + +void MpQueryManager::signalError() +{ + TX_ENTRY; + switch(mRequestType) { + case InspireMeItemsMetadataRequest: + TX_LOG_ARGS("emit inspireMeItemsRetrievalError"); + emit inspireMeItemsRetrievalError(); + break; + case InspireMeItemsAlbumArtRequest: + TX_LOG_ARGS("Warning: InspireMeItemsAlbumArtRequestError, will keep using the default AA icon"); + break; + case LocalStoreRequest: + TX_LOG_ARGS("emit localMusicStoreRetrievalError"); + emit localMusicStoreRetrievalError(); + break; + case NoRequest: + default: + TX_LOG_ARGS("Warning!! Possible uninitialized mRequestType"); + break; } - else - { - // TODO: agree on error handling - TX_LOG_ARGS( "Network error in retrieving Information" ); - emit networkError(); - } - TX_EXIT + TX_EXIT } /*! @@ -246,9 +283,13 @@ */ void MpQueryManager::retrieveInformationNetworkError( QNetworkReply::NetworkError error ) { + TX_ENTRY_ARGS( "Network error for retrieving Information" << error); // TODO: agree on error handling + Q_UNUSED(error) - TX_ENTRY_ARGS( "Network error for retrieving Information" << error); + + disconnect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) ); + signalError(); TX_EXIT } @@ -256,43 +297,59 @@ Slot to call when there is ssl error */ void MpQueryManager::retrieveInformationSslErrors( const QList &/*error*/ ) -{ +{ // TODO: agree on error handling TX_ENTRY_ARGS( "SSL error for retrieving Information" ); + disconnect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) ); + signalError(); TX_EXIT } /*! Slot to call when downloading finished */ -void MpQueryManager::DownloadFinished( QNetworkReply* reply ) +void MpQueryManager::albumArtDownloaded( QNetworkReply* reply ) { TX_ENTRY_ARGS( "mDownloadedAlbumArts = " << mDownloadedAlbumArts ); - if ( reply->error() == QNetworkReply::NoError ) - { + TX_ENTRY_ARGS( "QNetworkReply obj " << reply); + + // 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 ); // 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 ) - { + 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 - { + } + else { setAlbumArtUri(mRecommendationAlbumArtsLink.at( mDownloadedAlbumArts), ""); - } } - else - { - TX_LOG_ARGS( "Downloading album art failed!" ); - emit networkError(); + ++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" ); } - mDownloadedAlbumArts++; + if( mDownloadedAlbumArts == mRecommendationCount) { + // no need to be informed anymore + mAlbumArtDownloader->disconnect(this); + } + TX_EXIT } @@ -302,48 +359,40 @@ returns false, otherwise true. */ bool MpQueryManager::writeImageToFile(const QByteArray &aImageData, const QString &aImageFileName ) - { +{ bool ret( false ); TX_ENTRY_ARGS( "imagefile: " << aImageFileName ); - if ( aImageFileName.isEmpty() ) - { + if ( aImageFileName.isEmpty() ) { TX_LOG_ARGS( "Only store two album arts" ); - } - else - { + } + else { QFile file( aImageFileName ); - - if ( !file.open( QIODevice::ReadWrite ) ) - { + if ( !file.open( QIODevice::ReadWrite ) ) { TX_LOG_ARGS( "Unable to open file" ); - } - else - { + } + else { qint64 writtenBytes = file.write( aImageData ); - // Verify file write status - if ( writtenBytes < aImageData.size() ) - { + 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 - { + } + 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 @@ -351,7 +400,7 @@ void MpQueryManager::retrieveInformation( const QString &urlEncoded ) { TX_ENTRY_ARGS( "urlEconded = " << urlEncoded) - connect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) ); + connect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ), Qt::UniqueConnection ); QNetworkReply *reply = mManager->get( QNetworkRequest( QUrl( urlEncoded ) ) ); mReplys.append( reply ); @@ -369,71 +418,99 @@ TX_ENTRY QDomElement rootElement = mDomDocument.documentElement(); - if ( rootElement.attribute( "type" ) == "search" ) { - TX_LOG_ARGS( "URI response" ) - QString result; + if ( rootElement.attribute( "type" ) == "recommendedTracks" ) { + TX_LOG_ARGS( "Recommendation response" ) QDomElement entry = rootElement.firstChildElement( "entry" ); - while ( !entry.isNull() ) - { + mRecommendationCount = 0; + while ( !entry.isNull() && mRecommendationCount < KRecommendationCount ) { if ( entry.attribute( "type" ) == "musictrack" ) { QDomElement link = entry.firstChildElement( "link" ); - while ( !link.isNull() ) - { - if ( link.attribute( "rel" ) == "alternate" - && link.attribute( "type" ) == "text/html" ) { - result = link.attribute( "href" ); - } - link = link.nextSiblingElement( "link" ); - } - } - entry = entry.nextSiblingElement( "entry" ); - } - // Signal that the url was received. Might be empty string. - emit searchUrlRetrieved( result ); - } else if ( rootElement.attribute( "type" ) == "recommendedTracks" ) { - TX_LOG_ARGS( "Recommendation response" ) - QDomElement entry = rootElement.firstChildElement( "entry" ); - QNetworkReply *reply; - int count = 0; - while ( !entry.isNull() && count < KRecommendationCount ) - { - if ( entry.attribute( "type" ) == "musictrack" ) { - QDomElement link = entry.firstChildElement( "link" ); - while ( !link.isNull() ) - { + 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; - } else { + } + else { link = link.nextSiblingElement( "link" ); - } + } } QDomElement metadata = entry.firstChildElement( "metadata" ); mRecommendationSongs.append( metadata.firstChildElement( "name" ).text() ); mRecommendationArtists.append( metadata.firstChildElement( "primaryartist" ).text() ); - count++; + ++mRecommendationCount; } entry = entry.nextSiblingElement( "entry" ); - } - - for (int i = 0; i < KRecommendationCount; i++ ) { + } + + emit inspireMeItemsMetadataRetrieved(); + + QNetworkReply *reply = 0; + // we need to channel the retrieved album arts to albumArtDownloaded slot only + disconnect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) ); + for (int i = 0; i < mRecommendationCount; i++ ) { TX_LOG_ARGS( "song name: " << mRecommendationSongs.at(i) ); TX_LOG_ARGS( "Artist name: " << mRecommendationArtists.at(i) ); TX_LOG_ARGS( "Album art link: " << mRecommendationAlbumArtsLink.at(i) ); - + mRequestType = InspireMeItemsAlbumArtRequest; if ( mRecommendationAlbumArtsLink.at( i ).contains( "http", Qt::CaseInsensitive ) ) { - reply = mDownloadManager->get( QNetworkRequest( QUrl( mRecommendationAlbumArtsLink.at(i) ) ) ); + reply = mAlbumArtDownloader->get( QNetworkRequest( QUrl( mRecommendationAlbumArtsLink.at(i) ) ) ); mReplys.append( reply ); connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( retrieveInformationNetworkError( QNetworkReply::NetworkError ) ) ); connect( reply, SIGNAL( sslErrors( QList ) ), this, SLOT( retrieveInformationSslErrors( QList ) ) ); - } + } } - } else { + // 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 * ) ) ); + + } + else if ( rootElement.attribute( "type" ) == "storeList" ) { + TX_LOG_ARGS( "Music Store List" ) + 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); + } + else { + emit localMusicStoreRetrievalError(); + } + } + else { TX_LOG_ARGS( "Not supported response" ) } 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 +} + /*! Construct the query for fetching URI & recommendations */ @@ -468,11 +545,11 @@ QString str; if ( keys.length() != values.length() ) { TX_LOG_ARGS( "Error: keys length is not equal to values length" ); - } else { + } + else { for ( int i = 0; i < keys.length(); i++ ) { QString tValue = values.at( i ); - if ( 0 != tValue.length() ) - { + if ( 0 != tValue.length() ) { str += keys.at( i ) + "=" + values.at( i ) + "&"; } } @@ -486,18 +563,28 @@ */ void MpQueryManager::setAlbumArtUri( const QString &albumArtUri, const QString &albumArtName ) { + // 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( const_cast( &albumArtUri ) ) ); if ( id == KUndefined ) { - // Request failed. Set default album art. - insertMapItem( albumArtUri, mDefaultRecommendationAlbumArt ); + // 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. - insertMapItem( albumArtUri, mDefaultRecommendationAlbumArt ); + mRecommendationAlbumArtsMap.insert( albumArtUri, mDefaultRecommendationAlbumArt ); } TX_EXIT } @@ -506,24 +593,42 @@ Slot to handle the recommendation album art */ void MpQueryManager::thumbnailReady( - const QPixmap& pixmap, + const QPixmap pixmap, void *data, - int /*id*/, + int id, int error ) { TX_ENTRY - // TODO: Hkn: use qobject_cast + + 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( data ) ); TX_LOG_ARGS( "Uri: " << uri ); if ( error == 0 ) { TX_LOG_ARGS( "album art link: " << uri ); - insertMapItem( uri, pixmap ); - } else { - insertMapItem( uri, mDefaultRecommendationAlbumArt ); + mRecommendationAlbumArtsMap.insert( uri, HbIcon(QIcon(pixmap)) ); } - if(++mAlbumArtsReadyCount == KRecommendationCount) { - emit recommendationAlbumArtsReady(); - } + else { + mRecommendationAlbumArtsMap.insert( uri, mDefaultRecommendationAlbumArt ); + } + + emit inspireMeItemAlbumArtReady(); TX_EXIT } + +bool MpQueryManager::isLocalMusicStore() const +{ + TX_LOG_ARGS( "isLocalMusicStore = " << !mMusicStore.isEmpty() ) + return !mMusicStore.isEmpty(); +} + +HbIcon MpQueryManager::recommendedAlbumArt(int index) const +{ + TX_LOG_ARGS( "index = " << index ) + return mRecommendationAlbumArtsMap.value( mRecommendationAlbumArtsLink.at( index ) ); +}