mmappcomponents/collectionhelper/inc/mpxcollectionuihelperimp.h
changeset 0 a2952bb97e68
child 2 7a9a8e73f54b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/collectionhelper/inc/mpxcollectionuihelperimp.h	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,853 @@
+/*
+* Copyright (c) 2006 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:  Collection Ui helper implementation
+*
+*/
+
+
+#ifndef CMPX_COLLECTION_UI_HELPER_H
+#define CMPX_COLLECTION_UI_HELPER_H
+
+#include <mpxcollectionobserver.h>
+#include <mpxcollectionpath.h>
+#include <mpxtaskqueueobserver.h>
+#include <mpxcollectionuihelperobserver.h>
+#include "mpxcollectionuihelper.h"
+#include "mpxmediatorobserver.h"
+#include "mpxmoveobserver.h"
+#include "mpxharvesterutilityobserver.h"
+
+// FOWARD DECLARATION
+class MMPXCollectionUtility;
+class CMPXCollectionMediator;
+class MMPXHarvesterUtility;
+class CMPXMedia;
+class TMPXCollectionMessage;
+class CMPXActiveTaskQueue;
+class CMPXDeleteHelper;
+
+/**
+ *  CMPXCollectionUiHelper
+ *
+ *  Implementation of the collection ui helper interface
+ *  for system specific changes
+ *
+ *  @lib collectionhelper.lib
+ *  @since S60 3.0
+ */
+NONSHARABLE_CLASS( CMPXCollectionUiHelperImp ): public CBase,
+                                          public MMPXCollectionUiHelper,
+                                          public MMPXMediatorObserver,
+                                          public MMPXHarvesterUtilityObserver,
+                                          public MMPXCollectionObserver,
+                                          public MMPXTaskQueueObserver,
+                                          public MMPXMoveItemObserver,
+                                          public MMPXCHelperObserver
+
+    {
+public:
+
+    /**
+    * Standard 2-phased constructor
+    * @param aModeId collection mode id. see mpxcollectionutility.h
+    *        for details.
+    * @return new instance of the collection ui helper
+    */
+    static CMPXCollectionUiHelperImp* NewL(const TUid& aModeId);
+
+    /**
+    * Standard 2-phased constructor
+    * @param aModeId collection mode id. see mpxcollectionutility.h
+    *        for details.
+    * @return new instance of the collection ui helper
+    */
+    static CMPXCollectionUiHelperImp* NewLC(const TUid& aModeId);
+
+    /**
+    * Virtual Destructor
+    */
+    virtual ~CMPXCollectionUiHelperImp();
+
+protected:
+
+    /**
+    * From MMPXCollectionUiHelper
+    *
+    * This is an async call to create a playlist or add songs to
+    * a saved playlist. In the case of creating a new playlist,
+    * no physical playlist files will be created. This type of
+    * playlists is referred to as virtual playlists. In the case
+    * of adding songs to a saved playlist, if the playlist
+    * corresponds to a playlist file, the playlist file is NOT
+    * updated.
+    *
+    * Upon completion of this request, HandleAddCompletedL is called.
+    *
+    * To add a playlist to the collection, the media provided MUST
+    * contain the following attributes:
+    *    KMPXMediaGeneralType:
+    *       must be EMPXItem
+    *
+    *    KMPXMediaGeneralCategory:
+    *       must be EMPXPlaylist
+    *
+    *    KMPXMediaGeneralUri:
+    *       This is the path where the playlist should be located.
+    *       e.g. c:\data\playlists\ or e:\playlists\. When the playlist
+    *       is successfully added to the collection, its URI will be
+    *       generated. If client is interested its URI, client can
+    *       perform a search based on the returned Id of the playlist.
+    *       Currently only supporting local path, i.e. the path provided
+    *       must contain starts with a drive letter.
+    *
+    *    KMPXMediaGeneralTitle:
+    *       Title of the playlist is NOT enforced be unique within the
+    *       music collection.
+    *
+    *    KMPXMediaArrayCount:
+    *    KMPXMediaArrayContents:
+    *       This playlist can be an empty playlist. If this is the case,
+    *       KMPXMediaArrayContents will be a CMPXMediaArray that doesn't
+    *       contain any media and KMPXMediaArrayCount will be 0.
+    *
+    *       Each CMPXMedia contained in the media array represents
+    *       a song. Each song must contain the following attributes:
+    *           KMPXMediaGeneralType:
+    *               must be EMPXItem
+    *
+    *           KMPXMediaGeneralCategory:
+    *               must be EMPXSong
+    *
+    *       For songs that already exist in the collection, client
+    *       must provide either KMPXMediaGeneralId or KMPXMediaGeneralUri.
+    *
+    *       For songs that do not exist in the collection, client must
+    *       provide KMPXMediaGeneralUri and its metadata. These songs
+    *       will be added to the music collection when the playlist is
+    *       added. These songs added to the collection are NOT registered
+    *       with Harvester; hence, during next scan/refresh, these songs
+    *       will be scanned and updated in the collection unnecessarily
+    *       and cause scan/refresh performance degradation. If any
+    *       metadata of these songs is changed in the collection before
+    *       next scan/refresh, it will be lost after scan/refresh.
+    *
+    *       WARNING:
+    *       Client must add the songs to the collection prior to adding
+    *       the playlist.
+    *
+    *    WARNING:
+    *    This playlist is NOT registered with Harvester. If client
+    *    creates a physical playlist file, Harvester will re-parse
+    *    and update the playlist in the collection during the next
+    *    scan/refresh unnecessarily and cause scan/refresh performance
+    *    degradation. If this playlist is edited, the physical
+    *    playlist file is NOT updated to reflect the changes.
+    *
+    *    If the playlist is successfully added to the collection,
+    *    the media returned in the callback will contain the Id
+    *    of the playlist.
+    *
+    * To add songs to a saved playlist, the media provided MUST
+    * contain the following attributes:
+    *    KMPXMediaGeneralType:
+    *       must be EMPXItem
+    *
+    *    KMPXMediaGeneralCategory:
+    *       must be EMPXPlaylist
+    *
+    *    This playlist must already exist in the collection, client
+    *    must provide either KMPXMediaGeneralId or KMPXMediaGeneralUri
+    *    for locating which playlist to add the songs to.
+    *
+    *    KMPXMediaArrayCount:
+    *       indicates the number of songs to be added to the playlist
+    *
+    *    KMPXMediaArrayContents:
+    *       This contains an array of songs to be added/appended
+    *       to the playlist. Each media in the array represents
+    *       a song. Each song must contain the following attributes:
+    *           KMPXMediaGeneralType:
+    *               must be EMPXItem
+    *
+    *           KMPXMediaGeneralCategory:
+    *               must be EMPXSong
+    *
+    *       These songs must already exist in the collection. Client
+    *       must provide either KMPXMediaGeneralId or KMPXMediaGeneralUri.
+    *
+    * This method will leave with KErrArgument if any mandatory
+    * is missing.
+    *
+    * @param aMedia, a media to be added to the system
+    * @param aObserver, an observer for callback when
+    *        operation is compelte. Leaves with KErrArgument if
+    *        observer provided is NULL. The Id of playlist will
+    *        be accessible via the KMPXMediaGeneralId of the media
+    *        returned in the callback.
+    *
+    */
+    void AddL( const CMPXMedia& aMedia,
+               MMPXCHelperObserver* aObserver );
+   
+    
+    /**
+    * From MMPXCollectionUiHelper    
+    *
+    * This is exactly the same as AddL except that songs in aMedia
+    * is added incrementally (in chunks).
+    * It should accept the same input and the same output as if AddL
+    * is used.
+    * @param aMedia, a media to be added to the system
+    * @param aObserver, an observer for callback when
+    *        operation is compelte. Leaves with KErrArgument if
+    *        observer provided is NULL. The Id of playlist will
+    *        be accessible via the KMPXMediaGeneralId of the media
+    *        returned in the callback.
+    * @param aSize, the number of songs to be added in each chunk
+    */
+    void IncAddL( const CMPXMedia& aMedia,
+                  MMPXCHelperObserver* aObserver,
+                  const TInt aSize );
+
+    /**
+    * From MMPXCollectionUiHelper
+    *
+    * Asynchronously updates a media in the collection. For performance
+    * consideration, it is recommended that client only sets the attribute
+    * that needs to be updated.
+    *
+    * @param aMedia, media to be updated.
+    *
+    *        To update a song in the collection, the media provided MUST
+    *        contain the following attributes:
+    *           KMPXMediaGeneralType:
+    *               must be EMPXItem
+    *
+    *           KMPXMediaGeneralCategory:
+    *               must be EMPXSong
+    *
+    *           KMPXMediaGeneralId or KMPXMediaGeneralUri:
+    *               for identifying which song to update
+    *
+    *        Additionally, this media should provide one or more of the
+    *        following attributes for update:
+    *               KMPXMediaGeneralTitle
+    *               KMPXMediaGeneralComment
+    *               KMPXMediaGeneralSynchronized
+    *               KMPXMediaGeneralDeleted
+    *               KMPXMediaGeneralModified
+    *               KMPXMediaGeneralCopyright
+    *               KMPXMediaGeneralDuration
+    *               KMPXMediaGeneralFlags
+    *               KMPXMediaGeneralPlayCount
+    *               KMPXMediaGeneralLastPlaybackTime
+    *           KMPXMediaIdMusic:
+    *               KMPXMediaMusicArtist
+    *               KMPXMediaMusicAlbum
+    *               KMPXMediaMusicAlbumTrack
+    *               KMPXMediaMusicGenre
+    *               KMPXMediaMusicComposer
+    *               KMPXMediaMusicYear
+    *               KMPXMediaMusicRating
+    *               KMPXMediaMusicAlbumArtFileName
+    *               KMPXMediaMusicURL
+    *           KMPXMediaIdAudio:
+    *               KMPXMediaAudioSamplerate
+    *               KMPXMediaAudioBitrate
+    *               KMPXMediaAudioNumberOfChannels
+    *           KMPXMediaIdDrm:
+    *               KMPXMediaDrmType
+    *           KMPXMediaIdMTP:
+    *               KMPXMediaMTPDrmStatus
+    *
+    *        To update a playlist in the collection, the media provided MUST
+    *        contain the following attributes:
+    *           KMPXMediaGeneralType:
+    *               must be EMPXItem
+    *
+    *           KMPXMediaGeneralCategory:
+    *               must be EMPXPlaylist
+    *
+    *           KMPXMediaGeneralId or KMPXMediaGeneralUri:
+    *               for identifying which playlist to update
+    *
+    *        If the media contains KMPXMediaArrayContents attribute, the
+    *        content of the playlist will be overwritten with the new media
+    *        array. If this attribute contains a CMPXMediaArray of 0 element,
+    *        all songs in this playlist will be removed from the playlist
+    *        (songs will remain in the collection and file system).
+    *        e.g.
+    *        1) "Playlist" originally contains "Song1", "Song2", and "Song3".
+    *           If KMPXMediaArrayContents contains a CMPXMediaArray that
+    *           contains "Song3" and "Song4", "Playlist" will be updated to
+    *           contain "Song3" and "Song4".
+    *        2) "Playlist" originally contains "Song1", "Song2", and "Song3".
+    *           If KMPXMediaArrayContents contains a CMPXMediaArray that
+    *           contains 0 element, "Playlist" will be updated so that it
+    *           doesn't contain any songs. "Song1", "Song2", and "Song3"
+    *           will remain in the collection.
+    *
+    *       If the media contains any of the following attributes, the
+    *       playlist will be updated accordingly:
+    *               KMPXMediaGeneralTitle
+    *               KMPXMediaGeneralSynchronized
+    *               KMPXMediaGeneralDeleted (DEPRECATED)
+    *               KMPXMediaGeneralModified (DEPRECATED)
+    *
+    *       NOTE: If a client wishes to change the playlist title and modify
+    *             its contents (i.e. the songs it includes), client needs to
+    *             perform two separate SetL operations; one to update the
+    *             playlist title providing KMPXMediaGeneralTitle attribute
+    *             and the other to update its contents by providing
+    *             KMPXMediaArrayContents.
+    *
+    * @param aObserver, an observer for callback when operation is complete.
+    *        KErrArgument if NULL.
+    */
+    void SetL( CMPXMedia*& aMedia,
+               MMPXCHelperObserver* aObserver );
+
+    /**
+    * From MMPXCollectionUiHelper
+    *
+    * Asynchronously updates a list of medias in the collection. This is
+    * NOT currently implemented.
+    *
+    * @param aMediaArray, list of medias
+    * @param aPath, collection path
+    * @param aIndices, array of indicies to collection path
+    */
+    void SetL( TArray<CMPXMedia*>& aMediaArray,
+               CMPXCollectionPath& aPath,
+               RArray<TInt>& aIndices);
+
+    /**
+    * From MMPXCollectionUiHelper
+    *
+    * Asynchronously renames a media. This method will be DEPRECATED as client
+    * can use SetL to update the title of a song or a playlist.
+    *
+    * @param aMedia media to be renamed
+    *
+    *        Currently only supporting renaming of a playlist. This media
+    *        MUST contain the following attributes:
+    *           KMPXMediaGeneralType:
+    *               must be EMPXItem
+    *
+    *           KMPXMediaGeneralCategory:
+    *               must be EMPXPlaylist
+    *
+    *           KMPXMediaGeneralId:
+    *               for identifying which playlist to rename
+    *
+    *           KMPXMediaGeneralTitle:
+    *               new title of the playlist
+    *
+    *        This method will leave with KErrArgument if any mandatory is
+    *        missing. URI of the playlist remains unchanged when its title
+    *        is changed.
+    *
+    * @param aObserver an observer for callback when operation is complete.
+    *        KErrArgument if NULL.
+    */
+    void RenameL( const CMPXMedia& aMedia,
+                  MMPXCHelperObserver* aObserver );
+
+    /**
+    * From MMPXCollectionUiHelper
+    *
+    * Asynchronously deletes a media or medias based on the collection path.
+    * If this collection path refers to multiple medias, the referred medias
+    * are deleted one by one. If the media correlates to a file in the file
+    * system, the correlating file is deleted from the file system. If the
+    * file is in use, operation will proceed to the next media and upon
+    * operation completion, KErrInUse is returned via callback.
+    * If the file has already been deleted from the file system, operation
+    * will also proceed to the next media as normal.
+    *
+    * This operation is cancelable via Cancel(),
+    *
+    * @param aPath collection path to the media to be removed
+    * @param aObserver an observer for callback when operation is complete.
+    *        KErrArgument if NULL.
+    */
+    void DeleteL( CMPXCollectionPath& aPath,
+                  MMPXCHelperObserver* aObserver );
+
+    /**
+    * From MMPXCollectionUiHelper
+    *
+    * Move an item from one collection to another
+    *
+    * @param aMedia media to be moved.
+    * @param aNewCollection uid of the collection defined in collectionplugins.hrh
+    * @param aObserver observer for the event. if aObs is NULL, sync, not NULL async.
+    */
+    void MoveL( CMPXMedia*& aMedia,
+                TUid aNewCollection,
+                MMPXCHelperObserver* aObserver = NULL );  //lint !e1735
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Open the collection in embedded mode with a Media Object
+    * @param aHostId Host Process UID to identify this embedded instance
+    * @param aMedia Media Object to open
+    * @param aObserver observer to handle errors
+    * @param aPluginInfo additional argument to pass to the plugin resolver
+    */
+    void OpenL( const TUid& aHostId, CMPXMedia& aMedia,
+                MMPXCHelperEmbeddedOpenObserver* aObserver,
+                TInt aPluginInfo = 0 );  //lint !e1735
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Open the collection in embedded mode with a File Handle
+    * @param aHostId Host Process UID to identify this embedded instance
+    * @param aFile File handle that we have to process
+    * @param aObserver observer to handle errors
+
+    */
+    void OpenL( const TUid& aHostId, const TDesC& aFile,
+                MMPXCHelperEmbeddedOpenObserver* aObserver,
+                TInt aPluginInfo = 0 );  //lint !e1735
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Open the collection in embedded mode with a File Handle
+    * @param aFile File handle that we have to process
+    * @param aObserver, observer to the open operation
+    */
+    void OpenL( RFile& aFile, MMPXCHelperEmbeddedOpenObserver* aObserver );
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Queries about the playlist file extension of the currently selected playlist
+    * plugin
+    * @return file extension of the playlist type which includes the period
+    */
+    HBufC* PlaylistFileExtensionLC();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Export the specified playlist to a file
+    * @param aPlaylistId, id of the playlist to be exported
+    * @param aDestinationDriveAndPath, specifies where the playlist file should
+    *        be created. If the file already exists, it will be overwritten.
+    * @param aObs observer for the callback. URI of the exported playlist
+    *        will be returned as a HBufC* which client takes over the
+    *        ownership
+    */
+    void ExportPlaylistL(TMPXItemId aPlaylistId,
+                         const TDesC& aDestinationDriveAndPath,
+                         MMPXCHelperObserver* aObserver);
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Reorder a 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.
+    * @param aObs observer for the callback
+    */
+    void ReorderPlaylistL(const TMPXItemId& aPlaylistId,
+                          const TMPXItemId& aSongId,
+                          TUint aOriginalOrdinal,
+                          TUint aNewOrdinal,
+                          MMPXCHelperObserver* aObserver);
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Gets the collection path to the main music menu
+    * Call OpenL() with this path to open music menu
+    * @return CMPXCollectionPath*, ownership transferred
+    */
+    CMPXCollectionPath* MusicMenuPathL();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Gets the collection path to the podcast menu
+    * Call OpenL() with this path to open podcast menu
+    * @return CMPXCollectionPath*, ownership transferred
+    */
+    CMPXCollectionPath* PodCastMenuPathL();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Gets the collection path to the main all songs view
+    * Call OpenL() with this path to open music all songs view
+    * @return CMPXCollectionPath*, ownership transferred
+    */
+    CMPXCollectionPath* MusicAllSongsPathL();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Gets the collection path to the music playlist
+    * Call OpenL() with this path to open music playlist menu
+    * @return CMPXCollectionPath*, ownership transferred
+    */
+    CMPXCollectionPath* MusicPlaylistPathL();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Gets the collection path to the music playlist
+    * Call OpenL() with this path to open music playlist menu
+    * @param aPlaylistType type of auto playlist
+    * @return CMPXCollectionPath*, ownership transferred
+    */
+    CMPXCollectionPath* MusicPlaylistPathL(TMPXAutoPlaylistType aPlaylistType);
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Creates a default playlist path to open. Hardcoded to Music Collection / All songs
+    * @return CollectionPath*, ownership transferred.
+    */
+    CMPXCollectionPath* CreateDefaultPlaylistPathLC();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Cancels current async request
+    * NOTE: Currently only Cancelling DeleteL() is supported
+    */
+    void Cancel();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Frees this object
+    */
+    void Close();
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Test if the specified title exists in the specified category
+    * @param aCategory specifies the category for testing
+    * @param aTitle specifies the title for testing
+    * @return ETrue if the specified title exists in the specified
+    *         category; otherwise, EFalse
+    */
+    TBool TitleExistsL( TMPXGeneralCategory aCategory, 
+                        const TDesC& aTitle, TMPXGeneralType aType = EMPXItem );
+
+    /**
+    * From MMPXCollectionUiHelper
+    * Returns the file name used for virtual playlist handling
+    * @return the file name to be used to externalize collection path for the playlist
+    *         that needs to be handled. ownership transfered
+    */
+    HBufC* ExternalCollectionPathHandlingFileNameLC();
+
+private: // from base class
+
+    /**
+    * From MMPXMediatorObserver
+    * @param aMedia, properties of the object
+    * @param aOldPath, old collection path
+    */
+    void HandleMediatorPathUpdatedL( CMPXMedia*& aMedia,
+                                     TUid  aOldPath  );
+
+    /**
+    * From MMPXHarvesterUtilityObserver
+    * Handles completion of playlist export
+    * @param aMedia, media that has been exported to a playlist file
+    * @param aErr, error encountered during playlist export
+    */
+    void HandlePlaylistExportCompletedL( CMPXMedia* aMedia, TInt aErr );
+
+    /**
+    * From MMPXHarvesterUtilityObserver
+    * Handles completion of playlist import
+    * @param aMedia, media imported from a playlist file.
+    * @param aErr, error encountered during playlist import
+    */
+    void HandlePlaylistImportCompletedL( CMPXMedia* aMedia, TInt aErr );
+
+    /**
+    * From MMPXHarvesterUtilityObserver
+    * Handle asynchronous file addition by file name
+    * @param aMedia, media added to the system
+    * @param aErr, error encountered during AddL operation
+    */
+    void HandleFileAddCompletedL( CMPXMedia* aMedia, TInt aErr );
+
+    /**
+    * From MMPXHarvesterUtilityObserver
+    * Handle asynchronous file addition by file name
+    * @param aMedia, media imported from file
+    * @param aErr, error encountered during the operation
+    */
+    void HandleFileImportCompletedL( CMPXMedia* aMedia, TInt aErr  );
+
+    /**
+    * From MMPXHarvesterUtilityObserver
+    * Handle file delete completion
+    * @param aErr, error encountered during delete operation
+    */
+    void HandleDeleteCompletedL( TInt aErr );
+
+    /**
+    * From MMPXHarvesterUtilityObserver
+    * Handle media retrieving completion
+    * @param aErr, error encountered during delete operation
+    */
+    void HandleFileGetMediaCompletedL( CMPXMedia* aMedia, TInt aErr  );
+
+    /**
+    * From MMPXCollectionMediaObserver
+    *  Handle extended media properties
+    *
+    *  @param aMedia media
+    *  @param aError error code
+    */
+    void HandleCollectionMediaL(const CMPXMedia& aMedia,
+                                TInt aError);
+
+    /**
+    * From MMPXCollectionObserver
+    *  Handle collection message
+    *  @param aMessage collection message
+    *  @param aErr error
+    */
+    void HandleCollectionMessage(CMPXMessage* aMsg, TInt aErr);
+
+    /**
+    * From MMPXCollectionObserver
+    *  Handles the collection entries being opened. Typically called
+    *  when client has Open()'d a folder
+    *
+    *  @param aEntries collection entries opened
+    *  @param aIndex focused entry
+    *  @param aComplete ETrue no more entries. EFalse more entries
+    *                   expected
+    *  @param aError error code
+    */
+    void HandleOpenL(const CMPXMedia& aEntries,
+                     TInt aIndex,TBool aComplete,TInt aError);
+
+    /**
+    * From MMPXCollectionObserver
+    *  Handles the item being opened. Typically called
+    *  when client has Open()'d an item. Client typically responds by
+    *  'playing' the item via the playlist
+    *
+    *  @param aPlaylist collection playlist
+    *  @param aError error code
+    */
+    void HandleOpenL(const CMPXCollectionPlaylist& aPlaylist,TInt aError);
+
+    /**
+    * From MMPXMoveItemObserver
+    * @param aErr, error for the operation
+    */
+    void HandleMoveCompleteL( TInt aErr );
+
+    /**
+    * From MMPXCHelperObserver
+    *  Handle callback for delete operation
+    *  @param aOperation operation type that is completed
+    *  @param aErr error code for the operation
+    *  @param aArgument a pointer to any data to retun
+    */
+    void HandleOperationCompleteL( TCHelperOperation aOperation,
+                                   TInt aErr,
+                                   void* aArgument );
+
+    /**
+    * From MMPXTaskQueueObserver
+    * Execute a task
+    * @param aTask task number
+    * @param aParamData, parameter
+    * @param aPtrData, any object
+    * @param aBuf, buffer containing externalized parameters for the task.
+    * @param aCallback call back function pointer
+    * @param aCObject1 object 1 owned by task queue
+    * @param aCObject2 object 2 owned by task queue
+    */
+    void ExecuteTask(TInt aTask,
+                     TInt aParamData,
+                     TAny* aPtrData,
+                     const CBufBase& aBuf,
+                     TAny* aCallback,
+                     CBase* aCObject1,
+                     CBase* aCObject2);
+
+    /**
+    * @see MMPXTaskQueueObserver
+    */
+    void HandleTaskError(
+        TInt aTask,
+        TAny* aPtrData,
+        TAny* aCallback,
+        TInt aError);
+
+private:
+
+    /**
+    * Constructor
+    */
+    CMPXCollectionUiHelperImp();
+
+    /**
+    * 2nd-phase constructor
+    *  @param aModeId collection mode id
+    */
+    void ConstructL(const TUid& aModeId);
+
+   /**
+    * Execute a task
+    * @param aTask task number
+    * @param aBuf, externalized parameters for the task
+    * @param aCallback, callback for the task
+    */
+    void ExecuteTaskL(TInt aTask, const CBufBase& aBuf, TAny* aCallback);
+
+    /**
+    * Completes the current task
+    *
+    * @param aTask task number
+    * @param aError error code
+    */
+    void CompleteTask(TInt aTask, TInt aError);
+
+    /**
+    * Notify client of the task results
+    *
+    * @param aTask task number
+    * @param aError error code
+    */
+    void NotifyClientL(TInt aTask, TInt aError);
+
+    /**
+    * Cleanup before processing the next task
+    */
+    void Cleanup();
+
+    /**
+    * Performs AddL task from the task queue
+    */
+    void DoAddL();
+             
+    /**
+    * Performs IncAddMedialL task from the task queue
+    */
+    void DoIncAddMediaL();
+    
+    /**
+    * Performs IncAppendMedialL task from the task queue
+    */
+    void DoIncAppendMediaL();
+    
+    /**
+    * Performs SetL task from the task queue
+    */
+    void DoSetL();
+
+    /**
+    * Performs RenameL task from the task queue
+    */
+    void DoRenameL();
+
+    /**
+    * Export the specified playlist to a file
+    * @param aPlaylistId, id of the playlist to be exported
+    * @param aDestinationDriveAndPath, specifies where the playlist file should
+    *        be created. If the file already exists, it will be overwritten.
+    */
+    void DoExportPlaylistL(TMPXItemId aPlaylistId,
+                           const TDesC& aDestinationDriveAndPath);
+
+    /**
+    * Reorder a song in the playlist
+    * @param aCommand command to reorder a song in the playlist
+    */
+    void DoReorderPlaylistL(CMPXCommand& aCommand);
+
+    /**
+    * Fill in details for the playlist itself for playlist export
+    * @param aMedia, a playlist media whose information is to be
+    *        filled.
+    */
+    void FillInPlaylistDetailsL(CMPXMedia& aMedia);
+
+    /**
+    * Handles completion of playlist export
+    * @param aMedia, media that has been exported to a playlist file
+    * @param aErr, error encountered during playlist export
+    */
+    void DoHandlePlaylistExportCompletedL( CMPXMedia* aMedia, TInt aErr );
+
+    /**
+    *  Looks for collection Id from the given URI through its extension.
+    *  This method is able to determine the collection Id without the media
+    *  being in the harvester's database.
+    *  @param aUri URI of a media
+    *  @return collection Id. KErrNotFound if unable to find a collection
+    *          that supports the type of extension
+    */
+    TInt FindCollectionIdL(const TDesC& aUri);
+
+
+private:
+
+    // tasks
+    enum TMPXCollectionUiHelperTask
+        {
+        ETaskNone,
+        ETaskAddMedia,
+        ETaskAppendMedia,
+        ETaskSetMedia,
+        ETaskRemoveMedia,
+        ETaskRenameMedia,
+        ETaskExportPlaylist,
+        ETaskReorderPlaylist,
+        ETaskIncAddMedia,
+        ETaskIncAppendMedia,
+        ETaskIncFinish
+        };
+
+private: // data
+
+    MMPXCollectionUtility*              iCollection;
+    CMPXCollectionMediator*             iMediator;
+    MMPXHarvesterUtility*               iHarvester;
+    CMPXActiveTaskQueue*                iTaskQueue;
+    TInt                                iTask;
+
+    CMPXDeleteHelper*                   iDeleteHelper;
+
+    // parameters for async commands
+    CMPXMedia*                          iMedia;
+    
+    // parameters used for incremental adding of songs
+    CMPXMedia*                          iInputMedia;
+    TInt                                iRemainder;
+    TInt                                iTotalChunkNumber;
+    TInt                                iChunkNumber;  // used as ID of current chunk
+    TInt                                iChunkSize;
+    TInt                                iArrayIndex;
+
+    
+    MMPXCHelperEmbeddedOpenObserver*    iOpenObserver; // not owned, transient
+
+    MMPXCHelperObserver*                iHelperObserver;  // not owned, transient
+    // Embedded Mode handling
+    TUid                                iEmbeddedModeID;
+    TInt                                iEmbeddedPluginInfo;
+    TBool                               iInitialized;  // collection db merging
+    TBool                               iIncAdding;  // Incremental adding guard
+    };
+
+#endif // CMPX_COLLECTION_UI_HELPER_H