upnpframework/upnpmusicadapter/inc/upnpmusicadapter.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/*
* 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:  handles music playing within UPnP framework
*
*/


#ifndef C_UPNPMUSICADAPTER_H
#define C_UPNPMUSICADAPTER_H

// INCLUDES
#include <e32base.h>
#include <mpxplaybackobserver.h> // base class
#include <mpxcollectionobserver.h> // base class

// FORWARD DECLARATIONS
class MUPnPAVController;
class CUpnpAVDevice;
class CUPnPPlayListFiller;
class MUPnPPlaylistFiller;
class CMPXCollectionPlaylist;
class CEikAppUi;
class CMPXMediaArray;
class MMPXPlaybackUtility;
class MMPXPlayerManager;
class CUpnpAVDevice;
class MMPXCollectionUtility;
class MMPXViewUtility;
class CMPXMedia;
class CUPnPMpxHelper;

// CONSTANT DEFINITIONS
// ** a message to music player to complete an immediate exit
const TInt KMusicPluginMessageExit = 3001;

/**
 * A class providing play back services for playing within UPnP framework.
 *
 * @lib upnpmusicadapter.lib
 * @since S60 v3.1
 */
class CUPnPMusicAdapter : public CBase,
                          public MMPXPlaybackObserver,
                          public MMPXPlaybackCallback,
                          public MMPXCollectionObserver
    {

public: // interface methods

    /**
     * 1st phase constructor
     *
     * @param aAVController reference to AVController resource. 
     * @since Series 60 3.1
     * @return a new CUPnPMusicAdapter instance
     */
    IMPORT_C static CUPnPMusicAdapter* NewL(
        MUPnPAVController& aAVController );

    /**
     * Destructor
     *
     * @since Series 60 3.1
     */
    IMPORT_C virtual ~CUPnPMusicAdapter();

    /**
     * Initiates music play in a remote renderer.
     * The method will block until music player exits.
     * Music adapter will take ownership of the filler in all conditions.
     *
     * @param aAppUi the app.ui in case we are displaying a view/dialog
     * @param aFiller Object that contains playlist information
     * @param aRenderer the selected renderer device
     * @return exit status / reason
     * @since Series 60 3.1
     */
    IMPORT_C TInt ExecuteMusicLiteInRemoteL(
        CEikAppUi* aParentUi,
        MUPnPPlaylistFiller* aFiller,
        const CUpnpAVDevice& aRenderer );

    /**
     * Initiates music play in the local device
     * The method will block until music player exits.
     * Music adapter will take ownership of the filler in all conditions.
     *
     * @param aAppUi the app.ui in case we are displaying a view/dialog
     * @param aFiller Object that contains playlist information
     * @return exit status / reason
     * @since Series 60 3.1
     */
    IMPORT_C TInt ExecuteMusicLiteInLocalL(
        CEikAppUi* aAppUi,
        MUPnPPlaylistFiller* aFiller );

    /**
     * Initiates music play in a remote renderer.
     * The method will block until music player exits.
     * Music adapter will take ownership of the filler in all conditions.
     *
     * @param aAppUi the app.ui in case we are displaying a view/dialog
     * @param aFiller Object that contains playlist information
     * @param aRenderer the selected renderer device
     * @return exit status / reason
     * @since Series 60 3.1
     */
    IMPORT_C TInt ExecuteMusicInRemoteL(
        CEikAppUi* aParentUi,
        CUPnPPlayListFiller* aFiller,
        const CUpnpAVDevice& aRenderer );

    /**
     * Initiates music play in the local device
     * The method will block until music player exits.
     * Music adapter will take ownership of the filler in all conditions.
     *
     * @param aAppUi the app.ui in case we are displaying a view/dialog
     * @param aFiller Object that contains playlist information
     * @return exit status / reason
     * @since Series 60 3.1
     */
    IMPORT_C TInt ExecuteMusicInLocalL(
        CEikAppUi* aAppUi,
        CUPnPPlayListFiller* aFiller );

    /**
     * Dismiss the music player UI. The Execute... method will
     * immediately return with the given return code
     *
     * @param aReturnCode Exit code for the execution thread
     * @since Series 60 3.1
     */
    IMPORT_C void Dismiss( TInt aReturnCode = KErrCancel );

public: // component internal methods

    /**
     * Called when playlist fill has completed.
     * Does not pass ownership.
     *
     * @param aFiller the object that has completed its job.
     * @since Series 60 3.1
     */
    void Complete( MUPnPPlaylistFiller* aFiller );

    /**
     * The AVController resource
     * (to be used by the fillers)
     *
     * @return reference to the AVController resource
     * @since Series 60 3.1
     */
    MUPnPAVController& AVController();

    /**
     * The Collection UID used for the playlist.
     * Accessor for the filler
     */
    TUid PlaylistCollectionId();

    
    /**
     * The MPX CollectionUtility.
     * Accessor for the filler
     */
    MMPXCollectionUtility& CollectionUtility();


protected:
    
    /** @see MMPXPlaybackObserver */
    void HandlePlaybackMessage(CMPXMessage* aMsg, TInt aErr );

    /** @see MMPXPlaybackCallback */
    void HandlePropertyL( TMPXPlaybackProperty aProperty,
                          TInt aValue, 
                          TInt aError );

    /** @see MMPXPlaybackCallback */
    void HandleSubPlayerNamesL( TUid aPlayer, 
                                const MDesCArray* aSubPlayers,
                                TBool aComplete,
                                TInt aError );

    /** @see MMPXPlaybackCallback */
    void HandleMediaL(const CMPXMedia& aProperties, TInt aError );

    /** see MMPXCollectionMediaObserver */
    void HandleCollectionMediaL( const CMPXMedia& aMedia, TInt aError );
    
    /** see MMPXCollectionObserver */
    void HandleCollectionMessage( CMPXMessage* aMsg, TInt aErr );
    
    /** see MMPXCollectionObserver */
    void HandleOpenL( const CMPXMedia& aEntries, TInt aIndex, 
        TBool aComplete, TInt aError );

    /** @see MMPXPlaybackObserver */
    void HandleOpenL( const CMPXCollectionPlaylist& aPlaylist, TInt aError );

    /** @see MMPXPlaybackObserver */
    void HandleCommandComplete( CMPXCommand* aCommandResult, TInt aError );

private:

    /**
     * Default constructor
     *
     * @param aAVController reference to AVController resource. 
     * @since Series 60 3.1
     */
    CUPnPMusicAdapter( MUPnPAVController& aAVController );

    /**
     * 2nd phase constructor
     *
     * @since Series 60 3.1
     */
    void ConstructL();

    /**
     * Initialises the state before execution
     *
     * @since Series 60 3.1
     */
    void InitState();

    /**
     * Obtains ownership of the filler pointer.
     *
     * @param aFiller the filler object to own
     * @since Series 60 3.1
     */
    void TakeOwnershipOfTheFiller( MUPnPPlaylistFiller* aFiller );
    
    /**
     * Creates play list
     * @since Series 60 3.1
     */
    void CreatePlayListL();

    /**
     * A loop to show the UI
     * @since Series 60 3.1
     */
    void UiShowLoopL();

    /**
     * Commands the UI to be shown in UiShowLoop
     * @since Series 60 3.1
     */
    void DisplayUI();

    /**
     * Causes an internal exit
     * @param aReturnCode the return code for the thread
     * @since Series 60 3.1
     */
    void Exit( TInt aReturnCode );


    /**
     * Locally handles the corresponding callback
     */
    void DoHandlePlaybackMessageL( TInt aEvent, TInt aType, TInt aData );

    /**
     * Locally handles the corresponding callback
     */
    void DoHandleCollectionMessageL( TInt aEvent, TInt aType, TInt aData );

    /**
     * Locally handles the corresponding callback
     */
    void DoHandleSubPlayerNamesL( TUid aPlayer, 
                                const MDesCArray* aSubPlayers,
                                TBool aComplete,
                                TInt aError );

public: // type definitions

    /**
     * the adapter state
     */
    enum TAdapterState
        {
        EStateIdle = 0, // not running
        EStatePreparing, // Prepare phase (No UI)
        EStatePreparingWait, // Preparing, waiting async resp
        EStateInitialising, // Initialising, UI showing
        EStateRunning, // normal run state
        EStateClosing, // UI exiting
        };

    enum TFillerState
        {
        EFillerStateIdle = 0, // created
        EFillerStateFilling, // filling
        EFillerStateComplete // fill complete
        };

private: // data

    /**
     * AVController resource
     */
    MUPnPAVController&          iAVController;

    /**
     * The renderer device we are rendering on
     * NULL, if rendering locally
     * NO OWNERSHIP
     */
    const CUpnpAVDevice*        iTargetDevice;
    
    /**
     * Pointer to host application ui.
     * NO OWNERSHIP
     */
    CEikAppUi*                  iAppUi;

    /**
     * The current playlist filler object
     */
    MUPnPPlaylistFiller*        iCurrentFiller;

    /**
     * Whether the filler is in working state
     */
    TFillerState                iCurrentFillerState;

    /**
     * The current playlist
     */
    CMPXCollectionPlaylist*     iPlaylist;
    
    /**
     * The current temp playlist 
     * Own.
     */
    CMPXMediaArray*             iTrackArray;
    
    /**
     * For playlist creation
     * Own.
     */
    CUPnPMpxHelper*             iMpxHelper;

    /**
     * Collection ID to use when communicating to MPX
     */
    TUid                        iPlaylistCollectionId;

    /**
     * For playback
     * Own.
     */
    MMPXPlaybackUtility*        iPlaybackUtility;
    
    /**
     * For collection
     * Own.
     */
    MMPXCollectionUtility*      iCollectionUtility;
    
    /**
     * View utility.
     */
    MMPXViewUtility*            iViewUtility;

    /**
     * Tells are we using remote playback 
     */
    TBool                       iRemotePlayer;

    /**
     * Exit code
     */
    TInt                        iReturnCode;

    /**
     * Scheduler wait loop
     */
    CActiveSchedulerWait*       iWait;

    /**
     * state of the adapter
     */
    TAdapterState               iState;
    
    /**
     * For media object array
     */
    CMPXMedia*                  iMedia;

    };


#endif // C_UPNPMUSICADAPTER_H