mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbplaylistsongs.h
changeset 0 ff3acec5bc43
child 9 13afc0e517bd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/serviceplugins/collectionplugins/mpxsqlitedbhgplugin/inc/mpxdbplaylistsongs.h	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,327 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This class is responsible for the functionality related to
+*                playlist songs. The class operates on two tables: PlaylistSongs
+*                and PlaylistSongInfo.
+*
+*                The PlaylistSongs table contains records for all song instances in
+*                playlists. For example if a playlist contains 7 songs, there will be 7
+*                corresponding records in the PlaylistSongs table, even if one song has
+*                multiple instances in the playlist.
+*
+*                The PlaylistSongInfo table contains one record for each song included
+*                in at least one playlist. Redundant song information is stored in this
+*                table to help with songs on different drives than the playlist.
+*
+*
+*/
+
+
+#ifndef MPXDBPLAYLISTSONGS_H
+#define MPXDBPLAYLISTSONGS_H
+
+// INCLUDES
+#include "mpxdbtable.h"
+
+// CLASS FORWARDS
+class CMPXMedia;
+class CMPXMediaArray;
+
+// CLASS DECLARATION
+
+/**
+* Responsible for managing the music table
+*
+* @lib MPXDbPlugin.lib
+*/
+class CMPXDbPlaylistSongs :
+    public CMPXDbTable
+    {
+    public:
+
+        /**
+        * Two-phased constructor.
+        * @param aDbManager database manager to use for database interactions
+        * @return New CMPXDbPlaylistSongs instance.
+        */
+        static CMPXDbPlaylistSongs* NewL(CMPXDbManager& aDbManager);
+
+        /**
+        * Two-phased constructor.
+        * @param aDbManager database manager to use for database interactions
+        * @return New CMPXDbPlaylistSongs instance on the cleanup stack.
+        */
+        static CMPXDbPlaylistSongs* NewLC(CMPXDbManager& aDbManager);
+
+        /**
+        * Destructor
+        */
+        virtual ~CMPXDbPlaylistSongs();
+
+    public:
+
+        /**
+        * Add a song/songs to the given playlist
+        * @param aPlaylistId playlist id
+        * @param aMediaArray media array which contains the tracks to be added to the playlist
+        * @param aDriveId Drive Id of corresponding playlist
+        */
+        void AddSongsL(TUint32 aPlaylistId, const CMPXMediaArray& aMediaArray, TInt aDriveId);
+
+        /**
+        * Add a song to playlist songs table for the given playlist
+        * @param aPlaylistId id of the playlist to add the song to
+        * @param aDriveId drive the song is on
+        * @param aMedia song media to be added to the playlist songs table for the playlist
+        * @return song ID
+        */
+        TUint32 AddSongL(TUint32 aPlaylistId, const CMPXMedia& aMedia, TInt aDriveId);
+
+        /**
+        * Add a song to playlist songs table for the given playlist
+        * @param aPlaylistId id of the playlist to add the song to
+        * @param aOrdinal ordinal of the song to be added
+        * @param aDriveId drive the song is on
+        * @param aMedia song media to be added to the playlist songs table for the playlist
+        * @return song ID
+        */
+        TUint32 AddSongL(TUint32 aPlaylistId, TInt aOrdinal, const CMPXMedia& aMedia,
+            TInt aDriveId);
+
+        /**
+        * Update song info for a song in the playlist songs table
+        * @param aSongId identifies the song
+        * @param aMedia song information
+        * @param aResetFlags indicates whether the song db flags should be reset or just updated
+        * @param aUpdated returns ETrue if the song information has changed
+        */
+        TBool UpdateSongL(TUint32 aSongId, const CMPXMedia& aMedia, TBool aResetFlags,
+            TBool& aUpdated);
+
+        /**
+        * Update songs in a playlist to reflect playlist id change
+        * @param aPlaylistId identifies the songs in the playlist
+        * @param aNewPlaylistId specifies the new playlist id the songs should be associated with
+        */
+        void UpdateSongsL(TUint32 aPlaylistId, TUint32 aNewPlaylistId);
+
+        /**
+        * Reorder the song in the playlist
+        * @param aPlaylistId id of the playlist which contains the song to be reordered
+        * @param aSongId id of the song to be reordered
+        * @param aOriginalOrdinal the original ordinal of the song within the playlist.
+        *        Ordinal starts from 0.
+        * @param aNewOrdinal the new ordinal of the song within the playlist. Ordinal
+        *        starts from 0.
+        */
+        void ReorderSongL(const TMPXItemId& aPlaylistId, const TMPXItemId& aSongId,
+            TUint aOriginalOrdinal, TUint aNewOrdinal);
+
+        /**
+        * Remove the given song from all playlists
+        * @param aSongId ID of the song to remove
+        * @param aDriveId identifies the database to be updated
+        */
+        void DeleteSongL(TUint32 aSongId);
+
+        /**
+        * Remove a song from the playlist.
+        * @param aPlaylistId ID of the playlist to remove the song from
+        * @param aSongId Id of the song in the playlist to be removed
+        * @param aOrdinal the ordinal of the song in the playlist. This uniquely
+        *        identifies which song in the playlist to be removed; whereas song
+        *        ID doesn't because duplicate tracks in the playlist are allowed.
+        *        The position is relative to zero, i.e. zero implies that the song
+        *        at the beginning of the playlist is to be removed.
+        * @param aDriveId identifies the database to be updated
+        */
+        void DeleteSongL(TUint32 aPlaylistId, TUint32 aSongId, TInt aOrdinal, TInt aDriveId);
+
+        /**
+        * Remove all songs from the specified playlist
+        * @param aPlaylistId ID of the playlist.
+        * @param aDriveId identifies the database.
+        */
+        void DeleteSongsL(TUint32 aPlaylistId, TInt aDriveId);
+
+        /**
+        * Remove the songs for a given category from all playlists.
+        * @param aCategory identifies the category
+        * @param aCategoryId identifies the category item
+        * @param aDriveId identifies the database to be updated
+        */
+        void DeleteSongsForCategoryL(TMPXGeneralCategory aCategory, TUint32 aCategoryId,
+            TInt aDriveId);
+
+        /**
+        * Remove the songs for a given category from all playlists.
+        * @param aCategory identifies the category
+        * @param aCategoryId identifies the category item
+        * @param aDriveId identifies the database to be updated
+        */
+        void DeleteSongsForArtistAndAlbumL(TUint32 aArtistId, TUint32 aAlbumId, TInt aDriveId);
+
+        /**
+        * Remove all songs from the playlist songs table
+        */
+        void DeleteAllSongsL();
+
+        /**
+        * Get ids of all songs in a playlist
+        * @param aPlaylistId identifies the playlist
+        * @param aMediaArray returns songs' id
+        */
+        void GetSongsL(TUint32 aPlaylistId, CMPXMediaArray& aMediaArray);
+
+        /**
+        * Get ids of all songs in a playlist
+        * @param aPlaylistId identifies the playlist
+        * @param aAttrs attributes to return
+        * @param aMediaArray returns songs' id
+        */
+        TBool GetSongsL( TUint32 aPlaylistId,
+            const TArray<TMPXAttribute>& aAttrs, CMPXMediaArray& aMediaArray);
+
+        /**
+        * Get information on a song in a playlist
+        * @param aPlaylistId identifies the playlist
+        * @param aSongId identifies the song
+        * @param aAttrs attributes to return
+        * @param aMedia returns song info
+        */
+        TBool GetSongL(TUint32 aPlaylistId, TUint32 aSongId,
+            const TArray<TMPXAttribute>& aAttrs, CMPXMedia& aMedia);
+
+        /**
+        * Get information on a song
+        * @param aSongId identifies the song
+        * @param aAttrs attributes to return
+        * @param aMedia returns song info
+        */
+        TBool GetSongL(const TMPXItemId& aSongId, const TArray<TMPXAttribute>& aAttrs,
+            CMPXMedia*& aMedia);
+
+
+        /**
+        * Get the number of songs for a playlist
+        * @param aPlaylistId identifies the playlist
+        * @return number of songs
+        */
+        TInt CountL(TUint32 aPlaylistId);
+
+    private:
+
+        /**
+        * Update the media from the table
+        * @param aRecord playlist table view
+        * @param aAttrs the attributes to return
+        * @param aMedia updated with the playlist song info
+        */
+        void UpdateMediaL(RSqlStatement& aRecord, const TArray<TMPXAttribute>& aAttrs,
+            CMPXMedia& aMedia);
+
+        /**
+        * Get the number of instances of a song in a playlist
+        * @param aPlaylistId identifies the playlist
+        * @param aSongId identifies the song
+        * @return number of instances
+        */
+        TInt SongInstanceCountL(TUint32 aPlaylistId, TUint32 aSongId);
+
+        /**
+        * Get the number of instances of a song in the PlaylistSongs table.
+        * @param aSongId identifies the song
+        * @return number of instances
+        */
+        TInt SongCountL(TUint32 aSongId);
+
+        /**
+        * Checks if the specified song exists in the PlaylisySongInfo table.
+        * @param aDriveId drive to check or KDbManagerAllDrives
+        * @param aSongId identifies the song
+        * @return ETrue if it exists, EFalse otherwise
+        */
+        TBool SongInfoExistsL(TInt aDriveId, TUint32 aSongId);
+
+        /**
+        * Deletes all orphaned records in the PlaylistSongInfo table
+        * (songs not included in any playlist).
+        * @param aDriveId database to cleanup
+        */
+        void CleanupSongInfoL(TInt aDriveId);
+
+    private:    // from MMPXTable
+
+        /**
+        * @see MMPXTable
+        */
+        virtual void CreateTableL(RSqlDatabase& aDatabase, TBool aCorruptTable);
+
+        /**
+        * @see MMPXTable
+        */
+        virtual void DropTableL(RSqlDatabase& aDatabase);
+
+        /**
+        * @see MMPXTable
+        */
+        virtual TBool CheckTableL(RSqlDatabase& aDatabase);
+
+    private:
+
+        /**
+        * C++ constructor
+        * @param aDbManager database manager to use for database interactions
+        */
+        CMPXDbPlaylistSongs(CMPXDbManager& aDbManager);
+
+        /**
+        * Safely construct things that can leave
+        */
+        void ConstructL();
+
+    private:
+
+        /**
+        * Column indexes in the playlist songs query
+        */
+        enum TPlaylistSongsColumns
+            {
+            EPlaylistSongsUniqueId = KMPXTableDefaultIndex,
+            EPlaylistSongsSongId,
+            EPlaylistSongsPlaylistId,
+            EPlaylistSongsOrdinal,
+            EPlaylistSongsVolumeId,
+            EPlaylistSongsDbFlag,
+            EPlaylistSongsUri,
+            EPlaylistSongsTitle
+            };
+
+        /**
+        * Column indexes in the playlist song info table
+        */
+        enum TPlaylistSongInfoColumns
+            {
+            EPlaylistSongInfoSongId = KMPXTableDefaultIndex,
+            EPlaylistSongInfoVolumeId,
+            EPlaylistSongInfoDbFlag,
+            EPlaylistSongInfoUri,
+            EPlaylistSongInfoTitle
+            };
+
+    };
+
+#endif // MPXDBPLAYLISTSONGS_H
+
+// End of File