diff -r 3de6c4cf6b67 -r 2cbbefa9af78 mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp --- a/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Wed Sep 01 12:32:02 2010 +0100 +++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/src/mpxdbmusic.cpp Tue Sep 14 21:14:08 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); } @@ -712,7 +708,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); @@ -813,7 +809,7 @@ MPX_FUNC("CMPXDbMusic::GetSongsForAlbumL"); TPtrC query; - if (aAlbumId == KUnknownAlbumID) + if (iObserver.IsUnknownAlbumL(aAlbumId)) { query.Set(ExtraFieldsRequired(aAttrs) ? KQueryMusicGetSongsForUnknownAlbum() : KQueryMusicGetSongsForUnknownAlbumNoCategories()); @@ -994,7 +990,9 @@ TMPXGeneralType aType, const CMPXMedia& aCriteria, const TArray& aAttrs, - CMPXMediaArray& aMediaArray) + CMPXMediaArray& aMediaArray, + TBool aSortByTrackOrder + ) { MPX_FUNC("CMPXDbMusic::FindSongsL"); @@ -1002,12 +1000,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); } @@ -1015,7 +1009,7 @@ { sortOrder.Set(KQueryMusicFindAllSortOrderTitle); } - + // construct the query HBufC* query = HBufC::NewLC(KQueryMusicFindAll().Length() + criteriaStr->Length() + sortOrder.Length()); @@ -1100,32 +1094,13 @@ } // ---------------------------------------------------------------------------- -// 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); @@ -2134,14 +2109,13 @@ // update the artist field TUint32 id(0); - TUint32 artistIdForAlbum(artistId); if (UpdateCategoryFieldL(EMPXArtist, aMedia, KMPXMediaMusicArtist, artistId, aDrive, aItemChangedMessages, id, art)) { MPXDbCommonUtil::AppendValueL(aFields, aValues, KMCMusicArtist, id); metaDataModified = (aMusicTable != NULL); visibleChange = CMPXDbActiveTask::EAllVisible; - artistIdForAlbum = id; + iArtNeedUpdated = EFalse; } // update the album field @@ -2167,6 +2141,7 @@ MPXDbCommonUtil::AddItemChangedMessageL(*aItemChangedMessages, albumId, EMPXItemInserted, EMPXAlbum, KDBPluginUid); } + iArtNeedUpdated = EFalse; } // update the genre field @@ -2468,8 +2443,17 @@ TUint32 aOldId, TInt aDriveId, CMPXMessageArray* aItemChangedMessages, - TUint32& aItemId, const TDesC& aArt) + 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 ); @@ -2496,7 +2480,6 @@ aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, name, caseSensitive); - #else // only genre is not case sensitive aItemId = MPXDbCommonUtil::GenerateUniqueIdL(iDbManager.Fs(), aCategory, @@ -2511,8 +2494,8 @@ { if (aMedia.ValueTObjectL(KMPXMediaGeneralCategory) == EMPXSong ) { - iObserver.AddCategoryItemL(aCategory, KNullDesC, aDriveId, - aItemChangedMessages, itemAdded, name, KNullDesC); + iObserver.AddAbstractAlbumItemL(KNullDesC, aDriveId, + aItemChangedMessages, itemAdded, name, KNullDesC); } else { @@ -2523,50 +2506,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)) - { - art.Set(aMedia.ValueText(KMPXMediaMusicAlbumArtFileName).Left(KMCMaxTextLen)); - } - if (aCategory == EMPXAlbum) + //for the update case, need to maintain art field for Artist/Album table. + if (aOldId && (aOldId != aItemId)) { - if (aMedia.IsSupported(KMPXMediaMusicArtist)) - { - artistname.Set(aMedia.ValueText(KMPXMediaMusicArtist).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); } - //for the update case, need to maitain art field for Artist/Album table. - if (aOldId && (aOldId != aItemId)) - { - iObserver.AddCategoryItemL(aCategory, name, artistname, aArt, aDriveId, aItemChangedMessages, itemAdded); - } - else - { - 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; @@ -2594,37 +2567,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)) @@ -2690,7 +2644,6 @@ return updated; } - // ---------------------------------------------------------------------------- // CMPXDbMusic::ExtraFieldsRequired // ---------------------------------------------------------------------------- @@ -2771,4 +2724,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(KMPXMessageMediaGeneralId); + TMPXChangeEventType changeType = msg.ValueTObjectL(KMPXMessageChangeEventType); + + // Look for the added and deleted category IDs + // + if( id == aOldId && changeType == EMPXItemDeleted ) + { + oldId = i; + } + else if( id == aItemId && changeType == EMPXItemInserted ) + { + newId = i; + } + }// 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