upnpframework/upnpmusicadapter/src/upnpmusicadapter.cpp
author samhuttu
Mon, 01 Nov 2010 12:37:49 +0200
branchnew development branch with rendering state machine and other goodies
changeset 38 5360b7ddc251
parent 0 7f85d04be362
permissions -rw-r--r--
New development branch with e.g. rendering state machine and a simple Qt example application using it.

/*
* 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
*
*/


// INCLUDE FILES
// MPX framework api
#include <mpxcommonframeworkdefs.h>
#include <mpxcollectionplaylist.h>
#include <mpxplaybackframeworkdefs.h>
#include <mpxmediaarray.h>
#include <mpxmediageneraldefs.h>
#include <mpxmediacontainerdefs.h>
#include <mpxplaybackutility.h>
#include <mpxcollectionutility.h>
#include <mpxcollectionplaylist.h>
#include <mpxplaybackmessage.h>
#include <mpxviewutility.h>
#include <mpxcollectionpath.h>
#include <mpxcollectionmessage.h>
#include <mpxmessagegeneraldefs.h>

// upnpframework / avcontroller api
#include "upnpavcontroller.h"
#include "upnpavbrowsingsession.h"
#include "upnpavdevice.h"

// musicadapter internal
#include "upnpmpxhelper.h"
#include "upnpplaylistfiller.h"
#include "upnpmusicadapter.h"

// debug
_LIT16( KComponentLogfile, "musicadapter.txt" );
#include "upnplog.h"

// constants
_LIT16( KTempPlaylistTitle, "TempPlaylist" );
const TUid KRemotePlayerUid = { 0x200075D8 }; // Remote player UID
const TUid KLocalPlayerUid = { 0x200075D9 };  // Local player UID
const TUid KHomeConnectUid = { 0x10208A0A };  // Home Connect app UID
const TUid KPlaybackDialogUid = { 0x101FFCBD }; // UPnPPlayback dialog UID

// ======== MEMBER FUNCTIONS ========

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::NewL
// 1st phase constructor.
// --------------------------------------------------------------------------
//
EXPORT_C CUPnPMusicAdapter* CUPnPMusicAdapter::NewL( 
MUPnPAVController& aAVController )
    {
    __LOG( "CUPnPMusicAdapter::NewL" );
    
    CUPnPMusicAdapter* self = new(ELeave) CUPnPMusicAdapter( aAVController );
    __LOG1( "CUPnPMusicAdapter: self = %x", self );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::CUPnPMusicAdapter
// Default constructor.
// --------------------------------------------------------------------------
//
CUPnPMusicAdapter::CUPnPMusicAdapter( MUPnPAVController& aAVController )
    : iAVController( aAVController )
    {
    iTrackArray = 0;
    iPlaylist = 0;
    iState = EStateIdle;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::ConstructL
// 1st phase constructor.
// --------------------------------------------------------------------------
// 
void CUPnPMusicAdapter::ConstructL()
    {
    __LOG( "CUPnPMusicAdapter::ConstructL" );
    
    // Create playbackutility for playback comands
    iPlaybackUtility = MMPXPlaybackUtility::NewL( KHomeConnectUid, this );
    __LOG1( "iPlaybackUtility = %x", iPlaybackUtility );

    // Create collectionutility 
    iCollectionUtility = MMPXCollectionUtility::NewL( this, 
    KHomeConnectUid );
    __LOG1( "iCollectionUtility = %x", iCollectionUtility );
            
    // Get an instance of view utility
    iViewUtility = MMPXViewUtility::UtilityL();
    __LOG1( "iViewUtility = %x", iViewUtility );
    
    // internal MPX helper for some advanced operations
    iMpxHelper = CUPnPMpxHelper::NewL( KHomeConnectUid );

    __LOG( "CUPnPMusicAdapter::ConstructL - end" );
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::~CUPnPMusicAdapter
// Destructor.
// --------------------------------------------------------------------------
//
EXPORT_C CUPnPMusicAdapter::~CUPnPMusicAdapter()
    {
    __LOG( "CUPnPMusicAdapter::~CUPnPMusicAdapter()" );

    if ( iCurrentFillerState == EFillerStateFilling )
        {
        iCurrentFiller->CancelFill();
        }

    delete iMedia;
    delete iCurrentFiller;    
    delete iTrackArray;    
    delete iPlaylist;
    delete iWait;
    delete iMpxHelper;

    if( iPlaybackUtility )
        {
        iPlaybackUtility->Close();
        iPlaybackUtility = 0;
        }
        
        
    if( iCollectionUtility )
        {
        iCollectionUtility->Close();
        iCollectionUtility = 0;
        }
    
    if( iViewUtility )
        {
        iViewUtility->Close();
        iViewUtility = 0;
        }
    __LOG( "CUPnPMusicAdapter::~CUPnPMusicAdapter - End" );
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::ExecuteMusicLiteInRemoteL
// --------------------------------------------------------------------------
//
EXPORT_C TInt CUPnPMusicAdapter::ExecuteMusicLiteInRemoteL(
    CEikAppUi* aAppUi,
    MUPnPPlaylistFiller* aFiller,
    const CUpnpAVDevice& aRenderer )
    {
    __LOG( "CUPnPMusicAdapter::ExecuteMusicLiteInRemoteL" );

    InitState();
    iAppUi = aAppUi;     
    iRemotePlayer = ETrue;

    TakeOwnershipOfTheFiller( aFiller );
    iTargetDevice = &aRenderer;

    // Create and fill playlist
    CreatePlayListL();

    // show the UI
    UiShowLoopL();
 
     __LOG1( "CUPnPMusicAdapter::ExecuteMusicInRemoteL returns %d",
        iReturnCode );
    return iReturnCode;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::ExecuteMusicLiteInLocalL
// --------------------------------------------------------------------------
//
EXPORT_C TInt CUPnPMusicAdapter::ExecuteMusicLiteInLocalL(
    CEikAppUi* aAppUi,
    MUPnPPlaylistFiller* aFiller )
    {
    __LOG( "CUPnPMusicAdapter::ExecuteMusicLiteInLocalL" );

    InitState();
    iAppUi = aAppUi;
    iRemotePlayer = EFalse;
    
    TakeOwnershipOfTheFiller( aFiller );
    iTargetDevice = 0;
    
    // Create and fill playlist
    CreatePlayListL();

    // show the UI
    UiShowLoopL();

    __LOG1( "CUPnPMusicAdapter::ExecuteMusicInLocalL returns %d",
        iReturnCode );
    return iReturnCode;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::ExecuteMusicInRemoteL
// --------------------------------------------------------------------------
//
EXPORT_C TInt CUPnPMusicAdapter::ExecuteMusicInRemoteL(
    CEikAppUi* aAppUi,
    CUPnPPlayListFiller* aFiller,
    const CUpnpAVDevice& aRenderer )
    {
    __LOG( "CUPnPMusicAdapter::ExecuteMusicInRemoteL" );

    InitState();
    iAppUi = aAppUi;     
    iRemotePlayer = ETrue;

    TakeOwnershipOfTheFiller( aFiller );
    iTargetDevice = &aRenderer;

    // Create and fill playlist
    CreatePlayListL();

    // show the UI
    UiShowLoopL();
 
     __LOG1( "CUPnPMusicAdapter::ExecuteMusicInRemoteL returns %d",
        iReturnCode );
    return iReturnCode;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::ExecuteMusicInLocalL
// --------------------------------------------------------------------------
//
EXPORT_C TInt CUPnPMusicAdapter::ExecuteMusicInLocalL(
    CEikAppUi* aAppUi,
    CUPnPPlayListFiller* aFiller )
    {
    __LOG( "CUPnPMusicAdapter::ExecuteMusicInLocalL" );

    InitState();
    iAppUi = aAppUi;
    iRemotePlayer = EFalse;
    
    TakeOwnershipOfTheFiller( aFiller );
    iTargetDevice = 0;
    
    // Create and fill playlist
    CreatePlayListL();

    // show the UI
    UiShowLoopL();

    __LOG1( "CUPnPMusicAdapter::ExecuteMusicInLocalL returns %d",
        iReturnCode );
    return iReturnCode;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::Dismiss
// Dismiss the music player UI
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPMusicAdapter::Dismiss( TInt aReturnCode )
    {
    Exit( aReturnCode );
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::UiShowLoop
// Wait to show the UI
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::UiShowLoopL()
    {
    // ----------------------------------------
    // PART 1 - wait part
    // ----------------------------------------
    if ( iState == EStatePreparing )
        {
        // Not yet ready to go. Wait until signalled to proceed
        iWait = new (ELeave) CActiveSchedulerWait();
        __LOG( "UiShowLoopL: wait..." );
        iState = EStatePreparingWait;
        iWait->Start();
        delete iWait;
        iWait = 0;
        }
    else 
        {
        __LOG( "UiShowLoopL: no need to wait" );
        }

    // ----------------------------------------
    // PART 2 - action part
    // ----------------------------------------
    if ( iState == EStateInitialising )
        {
        __LOG( "Activate playback view" );  
        iViewUtility->ActivateViewL( KPlaybackDialogUid );
        iState = EStateClosing;
        }
    else if ( iState == EStateClosing )
        {
        // Exit signalled before UI was shown
        }
    else
        {
        // illegal state
        __PANICD( __FILE__, __LINE__ );
        }
    iState = EStateIdle;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::DisplayUI
// Commands the UI to show
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::DisplayUI()
    {
    __LOG1( "CUPnPMusicAdapter::DisplayUI() in state %d",
        iState );
    if ( iState == EStatePreparing )
        {
        // UiShowLoop can show UI directly - no wait
        iState = EStateInitialising;
        }
    else if ( iState == EStatePreparingWait )
        {
        // release wait loop in UiShowLoop
        __ASSERTD( iWait != 0, __FILE__, __LINE__ );
        iState = EStateInitialising;
        iWait->AsyncStop();
        }
    else
        {
        // should never be here
        __PANICD( __FILE__, __LINE__ );
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::Exit
// Performs cleanup and releases the execute thread
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::Exit( TInt aReturnCode )
    {
    __LOG2( "CUPnPMusicAdapter::Exit(%d) in state %d",
        aReturnCode, iState );
    if ( iState == EStatePreparing )
        {
        // change state - UiShowLoop will exit immediately
        iReturnCode = aReturnCode;
        iState = EStateClosing;
        }
    if ( iState == EStatePreparingWait )
        {
        // release wait loop in UiShowLoop
        __ASSERTD( iWait != 0, __FILE__, __LINE__ );
        iReturnCode = aReturnCode;
        iState = EStateClosing;
        iWait->AsyncStop();
        }
    else if ( iState == EStateInitialising ||
        iState == EStateRunning )
        {
        __ASSERTD( iViewUtility != 0, __FILE__, __LINE__ );
        iReturnCode = aReturnCode;
        iState = EStateClosing;
        // Send a close command to plugin with this error code.
        // Plugin will notify that it is not available,
        // and then the player UI will exit
        TRAP_IGNORE( iPlaybackUtility->CommandL( 
            EPbCmdClose, KMusicPluginMessageExit ) );
        }
    else if ( iState == EStateClosing )
        {
        // do nothing - already in exit process
        }
    else
        {
        // should never be here
        __PANICD( __FILE__, __LINE__ );
        }
    }


// --------------------------------------------------------------------------
// CUPnPMusicAdapter::CreatePlayList
// --------------------------------------------------------------------------
//    
void CUPnPMusicAdapter::CreatePlayListL()
    {
    __LOG( "CUPnPMusicAdapter::CreatePlayList" );
    __ASSERTD( iState == EStateIdle, __FILE__, __LINE__ );
    iState = EStatePreparing;

    // Get collection Uid
    iPlaylistCollectionId = KInMemoryCollection;
    iPlaylistCollectionId = iCollectionUtility->Collection()
        .CollectionIDL( iPlaylistCollectionId );

    // Create and fill the playlist
    iTrackArray = CMPXMediaArray::NewL();
    __LOG( "Filling object list" );
    iCurrentFiller->FillL( *this, *iTrackArray );
    if ( iCurrentFillerState == EFillerStateIdle )
        {
        iCurrentFillerState = EFillerStateFilling;
        }

    iMedia = CMPXMedia::NewL();
    // set collection id
    iMedia->SetTObjectValueL<TUid>(
        KMPXMediaGeneralCollectionId, iPlaylistCollectionId );
    // Set type
    iMedia->SetTObjectValueL<TMPXGeneralType>( 
        KMPXMediaGeneralType, EMPXItem );
    // Set category
    iMedia->SetTObjectValueL<TMPXGeneralCategory>( 
        KMPXMediaGeneralCategory, EMPXPlaylist );
    // Set title
    iMedia->SetTextValueL( 
        KMPXMediaGeneralTitle, KTempPlaylistTitle );
    // set contents
    iMedia->SetCObjectValueL( 
        KMPXMediaArrayContents, iTrackArray );  
    // set size
    __LOG1( "Set Array count=%d", iCurrentFiller->PlaylistSize() );
    iMedia->SetTObjectValueL( 
        KMPXMediaArrayCount,  iCurrentFiller->PlaylistSize() );

    __LOG( "Create collection playlist" );
    // Create collection playlist
    iMpxHelper->AddAndOpenL( KHomeConnectUid, *iMedia );

    __LOG( "CUPnPMusicAdapter::CreatePlayList - end" );
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleCollectionMessage
// From MMPXCollectionObserver.
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::HandleCollectionMessage(CMPXMessage* aMsg, 
    TInt aErr )
    {
    __LOG1( "CUPnPMusicAdapter::HandleCollectionMessage: error %d", aErr );
    if( aMsg && aErr == KErrNone )
        {        
        TInt event = KErrNotSupported;
        TInt type = KErrNotSupported;
        TInt data = KErrNotSupported;
        
        if( aMsg->IsSupported( KMPXMessageGeneralEvent ) )
            {
            event = *aMsg->Value<TInt>( KMPXMessageGeneralEvent );
            }
        if( aMsg->IsSupported( KMPXMessageGeneralType ) )
            {
            type = *aMsg->Value<TInt>( KMPXMessageGeneralType );
            }
        if( aMsg->IsSupported( KMPXMessageGeneralData ) )
            {
            data = *aMsg->Value<TInt>( KMPXMessageGeneralData );
            }

        TRAPD( error, DoHandleCollectionMessageL( event, type, data ) );
        if ( error != KErrNone )
            {
            __LOG1( "DoHandleCollectionMessageL: leave with %d", error );
            Exit( error );
            }
        }
    else
        {
        Exit( aErr );
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::DoHandleCollectionMessageL
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::DoHandleCollectionMessageL(
    TInt aEvent, TInt /*aType*/, TInt /*aData*/ )
    {
    __LOG( "CUPnPMusicAdapter::DoHandleCollectionMessageL" );

    switch ( aEvent )
        {
        case TMPXCollectionMessage::EPathChanged:
            {
            __LOG( "HandleCollectionMessageL: EPathChanged" );

            if ( iState == EStatePreparing || iState == EStatePreparingWait )
                {
                __LOG( "Pick up playlist from collection" );
                CMPXCollectionPath* path = 
                iCollectionUtility->Collection().PathL();
                CleanupStack::PushL( path );
                // select track with given index
                __LOG1( "Set selected index = %d",
                    iCurrentFiller->SelectedIndex() );
                path->Set( iCurrentFiller->SelectedIndex() );

                __LOG( "Ccreating new playlist" );
                delete iPlaylist;
                iPlaylist = NULL;
                iPlaylist = CMPXCollectionPlaylist::NewL( *path );
                __LOG1( "iPlaylist = %x", iPlaylist );
                iPlaylist->SetEmbeddedPlaylist( ETrue );
                CleanupStack::PopAndDestroy( path );

                // Disable repeat and shuffle modes
                iPlaylist->SetRepeatEnabled( EFalse );
                iPlaylist->SetShuffleEnabledL( EFalse );

                // Get subplayers if remote playback
                if( iRemotePlayer )
                    {
                    __LOG( "calling SubPlayerNamesL" );
                    iPlaybackUtility->PlayerManager().SubPlayerNamesL( *this,
                        KRemotePlayerUid );
                    }
                else // Local playback. Get subplayer is no needed.
                    {
                    __LOG( "calling SelectPlayerL(local)" );
                    iPlaybackUtility->PlayerManager().SelectPlayerL(
                        KLocalPlayerUid );
                    __LOG("calling InitL");
                    iPlaybackUtility->InitL( *iPlaylist, ETrue );          
                    }
                }
            }
            break;
        default:
            {
            } 
            break;
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleSubPlayerNamesL
// From MMPXPlaybackCallback 
// --------------------------------------------------------------------------
//  
void CUPnPMusicAdapter::HandleSubPlayerNamesL( TUid aPlayer, 
    const MDesCArray* aSubPlayers, TBool aComplete, TInt aError )
    {
    TRAPD( error, DoHandleSubPlayerNamesL(
        aPlayer, aSubPlayers, aComplete, aError ) );
    if ( error != KErrNone )
        {
        __LOG1( "HandleSubPlayerNamesL: leave with %d", error );
        Exit( error );
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::DoHandleSubPlayerNamesL
// --------------------------------------------------------------------------
//  
void CUPnPMusicAdapter::DoHandleSubPlayerNamesL( TUid /*aPlayer*/, 
    const MDesCArray* aSubPlayers, TBool /*aComplete*/, TInt aError )
    {
    __LOG( "CUPnPMusicAdapter::HandleSubPlayerNamesL" );

    if( aError == KErrNone)
        {
        // Find out Subplayer index
        TInt count = aSubPlayers->MdcaCount();
        TInt subplayerIndex = KErrNotFound; 
            
        TBuf<256> id16;
        id16.Copy( iTargetDevice->FriendlyName() );
                
        for( TInt i = 0; i < count; i++ )
            {
            // If subplayer match.
            if( !aSubPlayers->MdcaPoint(i).Compare( id16 ) )
                {
                subplayerIndex = i;
                break;
                }
            }   
            
        if( subplayerIndex != KErrNotFound )
            {
            __LOG1( "calling SelectSubPlayerL(%d)", subplayerIndex );
            iPlaybackUtility->PlayerManager().SelectSubPlayerL(
            KRemotePlayerUid, subplayerIndex );
                    
            iTargetDevice = 0; 
                                                        
            __LOG( "calling InitL" );
            iPlaybackUtility->InitL( *iPlaylist, ETrue );             
            }
       else
            {
            __LOG( "HandleSubPlayerNamesL: subplayer not found! " );
            Exit( KErrNotFound );
            } 
        }
    else // Error with SubPlayerNamesL
        {
        __LOG1( "HandleSubPlayerNamesL: Error=%d", aError );
        Exit( aError );
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandlePlaybackMessage
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::HandlePlaybackMessage(CMPXMessage* aMsg,
    TInt aErr )
    {
    __LOG1( "HandlePlaybackMessage: error %d", aErr );
    if( aMsg && aErr == KErrNone )
        {
        if (aMsg->IsSupported(KMPXMessageGeneralId))
            {
            TInt id = static_cast<TInt>(
                    *aMsg->Value<TMPXMessageId>(KMPXMessageGeneralId));
            TInt error(KErrNone);
            if ( id==KMPXMessageGeneral )
                {                    
                TInt event = KErrNotSupported;
                TInt type = KErrNotSupported;
                TInt data = KErrNotSupported;
                
                if( aMsg->IsSupported( KMPXMessageGeneralEvent ) )
                    {
                    event = *aMsg->Value<TInt>( KMPXMessageGeneralEvent );
                    }
                if( aMsg->IsSupported( KMPXMessageGeneralType ) )
                    {
                    type = *aMsg->Value<TInt>( KMPXMessageGeneralType );
                    }
                if( aMsg->IsSupported( KMPXMessageGeneralData ) )
                    {
                    data = *aMsg->Value<TInt>( KMPXMessageGeneralData );
                    }    
                    
                TRAP( error, DoHandlePlaybackMessageL( event, type, data ) );
                }
            if ( error != KErrNone )
                {
                __LOG1( "DoHandlePlaybackMessage: leave with %d", error );
                Exit( error );
                }
            } // else dummy message
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::DoHandlePlaybackMessageL
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::DoHandlePlaybackMessageL( 
    TInt aEvent, TInt /*aType*/, TInt /*aData*/ )
    {
    __LOG( "CUPnPMusicAdapter::DoHandlePlaybackMessageL" );

    switch ( aEvent )
        {
        case TMPXPlaybackMessage::EPlayerChanged:
            {
            if ( iState == EStatePreparing ||
                iState == EStatePreparingWait )
                {
                DisplayUI();
                }
            }   
            break;                  
        case TMPXPlaybackMessage::EInitializeComplete:
            {
            if ( iState == EStateInitialising )
                {
                __LOG( "Calling CommandL( EPbCmdPlay )" );
                iState = EStateRunning;
                iPlaybackUtility->CommandL( EPbCmdPlay );
                }
            }
            break;
        default:
            {
            break;
            }
        }        
    }


// --------------------------------------------------------------------------
// Unused callbacks here
// --------------------------------------------------------------------------

    
// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandlePropertyL
// From MMPXPlaybackCallback 
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::HandlePropertyL( 
    TMPXPlaybackProperty /*aProperty*/, TInt /*aValue*/, TInt /*aError*/ )
    {
    __LOG( "CUPnPMusicAdapter::HandlePropertyL - Not used." );
    // Not used.
    }


// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleMediaL
// From MMPXPlaybackCallback 
// --------------------------------------------------------------------------
// 
void CUPnPMusicAdapter::HandleMediaL( 
    const CMPXMedia& /*aProperties*/, TInt /*aError*/ )
    {
    __LOG( "CUPnPMusicAdapter::HandleMediaL - Not used" );
    // Not used.
    }



// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleCollectionMediaL
// From MMPXCollectionObserver.
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::HandleCollectionMediaL(
    const CMPXMedia& /*aMedia*/, 
    TInt /*aError*/ )
    {
    __LOG( "CUPnPMusicAdapter::HandleCollectionMediaL - Not used!" );
    // Not used
    }


// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleOpenL
// From MMPXCollectionObserver.
// Handles the collection entries being opened.
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::HandleOpenL(
    const CMPXMedia& /* aEntries */,
    TInt /* aIndex */,
    TBool /* aComplete */,
    TInt /* aError */ )
    {
    __LOG( "CUPnPMusicAdapter::HandleOpenL - not used!" );
    // Not used
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleOpenL
// From MMPXCollectionObserver.
// Handles the item being opened.
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::HandleOpenL(
    const CMPXCollectionPlaylist& /*aPlaylist*/,
    TInt /*aError*/ )
    {
    __LOG( "CUPnPMusicAdapter::HandleOpenL - not used!" );
    // Not used
    }
 
 // --------------------------------------------------------------------------
// CUPnPMusicAdapter::HandleEmbeddedOpenL
// From MMPXCHelperEmbeddedOpenObserver
// Handles errors from that occured in embedded mode
// --------------------------------------------------------------------------
//  
void CUPnPMusicAdapter::HandleCommandComplete(
    CMPXCommand* aCommandResult, TInt /*aError*/ )
    {
     __LOG( "CUPnPMusicAdapter::HandleCommandComplete - not used!" );
     delete aCommandResult;
    // Not used
    }
 
// --------------------------------------------------------------------------
// CUPnPMusicAdapter::InitState
// initialises the state before execution
// --------------------------------------------------------------------------
// 
void CUPnPMusicAdapter::InitState()
    {
    iReturnCode = KErrNone;
    if ( iState != EStateIdle )
        {
        // dispose the wait object (just in case)
        delete iWait;
        iWait = 0;
        // dispose temporary class members
        delete iTrackArray;
        iTrackArray = 0;
        delete iMedia;
        iMedia = 0;
        delete iPlaylist;
        iPlaylist = 0;
        // reset state
        iState = EStateIdle;
        }
    if ( !iViewUtility )
        {
        TInt error = KErrNone;
        TRAP( error, iViewUtility = MMPXViewUtility::UtilityL() );
	    if( error != KErrNone )
	        {
	        __LOG( "InitState: Creating viewutility leaves" );
	        Exit( error );
	        }
	    __LOG1( "iViewUtility = %x", iViewUtility );
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::TakeOwnershipOfTheFiller
// this one should be pretty self-explanatory.
// --------------------------------------------------------------------------
// 
void CUPnPMusicAdapter::TakeOwnershipOfTheFiller(
    MUPnPPlaylistFiller* aFiller )
    {
    if ( iCurrentFiller != 0 )
        {
        delete iCurrentFiller;
        iCurrentFiller = 0;
        }
    iCurrentFiller = aFiller;
    iCurrentFillerState = EFillerStateIdle;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::Complete
// Default constructor.
// --------------------------------------------------------------------------
//
void CUPnPMusicAdapter::Complete( MUPnPPlaylistFiller* aFiller )
    {
    __LOG( "CUPnPMusicAdapter::Complete" );
    if ( aFiller == iCurrentFiller )
        {
        iCurrentFillerState = EFillerStateComplete;
        }
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::AVController
// Returns the shared AVController resource
// --------------------------------------------------------------------------
//    
MUPnPAVController& CUPnPMusicAdapter::AVController()
    {
    return iAVController;
    }

// --------------------------------------------------------------------------
// CUPnPMusicAdapter::CollectionUiHelper
// --------------------------------------------------------------------------
//
TUid CUPnPMusicAdapter::PlaylistCollectionId()
    {
    return iPlaylistCollectionId;
    }

    
// --------------------------------------------------------------------------
// CUPnPMusicAdapter::CollectionUtility
// --------------------------------------------------------------------------
//
MMPXCollectionUtility& CUPnPMusicAdapter::CollectionUtility()
    {
    return *iCollectionUtility;
    }