diff -r 000000000000 -r 7f85d04be362 upnpframework/upnpcommand/src/upnpshowtask.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpframework/upnpcommand/src/upnpshowtask.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,381 @@ +/* +* 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: Source file for CUpnpShowTask class. +* +*/ + + +// INCLUDE FILES +// upnp stack api +#include // CUpnpItem +#include // CUpnpObject (cast) + +// upnpframework / avcontroller api +#include "upnpavcontroller.h" // MUPnPAVController +#include "upnpavrenderingsession.h" // MUPnPAVRenderingSession +#include "upnpavsessionobserverbase.h" + +// upnpframework / avcontroller helper api +#include "upnpconstantdefs.h" // KFilterCommon, KClassVideo +#include "upnpitemresolver.h" // MUPnPItemResolver +#include "upnpitemresolverobserver.h" // MUPnPItemResolverObserver +#include "upnpitemresolverfactory.h" // UPnPItemResolverFactory +#include "upnpitemutility.h" // UPnPItemUtility::BelongsToClass + +// upnpframework / commonui +#include "upnpcommonui.h" + +// command internal +#include "upnpfilepipe.h" // CUpnpFilePipe +#include "upnptaskhandler.h" // MUpnpTaskHandler +#include "upnptaskresourceallocator.h" // CUpnpTaskResourceAllocator +#include "upnpimagerenderingengine.h" // CUpnpImageRenderingEngine +#include "upnpshowtask.h" +#include "upnpcommand.h" +#include "upnpnotehandler.h" // CUpnpNoteHandler + +_LIT( KComponentLogfile, "upnpcommand.log"); +#include "upnplog.h" + + +// -------------------------------------------------------------------------- +// CUpnpShowTask::NewL +// Creates an instance of the implementation. +// -------------------------------------------------------------------------- +// +CUpnpTask* CUpnpShowTask::NewL() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::NewL" ); + + // Create instance + CUpnpShowTask* self = new (ELeave) CUpnpShowTask(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CUpnpShowTask::CUpnpShowTask +// First phase construction. +// -------------------------------------------------------------------------- +// +CUpnpShowTask::CUpnpShowTask() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::Constructor" ); + + // Initialise member variables + iCommonUI = NULL; + iPlayingVideo = EFalse; + iRenderingSession = NULL; + iVideoRenderingSession = NULL; + iResourceAllocator = NULL; + iRenderingEngine = NULL; + } + +// -------------------------------------------------------------------------- +// Destructor. +// -------------------------------------------------------------------------- +// +CUpnpShowTask::~CUpnpShowTask() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::Destructor" ); + + Cleanup(); + } + +// -------------------------------------------------------------------------- +// CUpnpShowTask::Cleanup +// -------------------------------------------------------------------------- +// +void CUpnpShowTask::Cleanup() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::Cleanup" ); + + if ( iRenderingEngine ) + { + delete iRenderingEngine; + iRenderingEngine = NULL; + } + + // delete the resource allocator + // Local mediaserver and AVController resources will be freed. + delete iResourceAllocator; + iResourceAllocator = NULL; + + iRenderingSession = NULL; + iVideoRenderingSession = NULL; + + delete iCommonUI; + iCommonUI = NULL; + + __LOG( "[UpnpCommand]\t CUpnpShowTask::Cleanup - end" ); + } + +// -------------------------------------------------------------------------- +// CUpnpShowTask::ConstructL +// Perform the second phase of two phase construction. Reserves the Upnp Fw +// resources (they are released when the task is destroyed). +// -------------------------------------------------------------------------- +// +void CUpnpShowTask::ConstructL() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::ConstructL" ); + + // create common UI + iCommonUI = CUPnPCommonUI::NewL(); + + // create the resource allocator + iResourceAllocator = CUpnpTaskResourceAllocator::NewL( + *iCommonUI, + CUpnpTaskResourceAllocator::EResourceAvController | + CUpnpTaskResourceAllocator::EResourceLocalMediaServer | + CUpnpTaskResourceAllocator::EResourceSelectImageRenderer ); + + iShowPlaybackFailedNote = ETrue; + } + +// -------------------------------------------------------------------------- +// CUpnpShowTask::AllocateResourcesL +// Allocates the Upnp Fw resources. +// -------------------------------------------------------------------------- +// +void CUpnpShowTask::AllocateResourcesL() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::AllocateResourcesL" ); + + iResourceAllocator->SetNoteHandlerL( NoteHandler() ); + + NoteHandler()->ResetDrmNoteCount(); + + // now allocate! + iResourceAllocator->AllocateL(); + + // start a rendering session + iRenderingSession = + &iResourceAllocator->AVController().StartRenderingSessionL( + iResourceAllocator->SelectedDevice() ); + + // create image rendering engine + iRenderingEngine = CUpnpImageRenderingEngine::NewL( + iResourceAllocator->AVController(), + *iRenderingSession, + *this ); + } + + + +// -------------------------------------------------------------------------- +// CUpnpShowTask::ExecuteL +// Executes the task. +// -------------------------------------------------------------------------- +// +void CUpnpShowTask::ExecuteL() + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::ExecuteL" ); + // assert that required resources exist + __ASSERTD( iRenderingEngine, __FILE__, __LINE__ ); + + + if( iPlayingVideo ) + { + // if videoplayerdlg is active, we cannot start rendering new file + // before user closes the dialog + __LOG( "[UpnpCommand]\t CUpnpShowTask::ExecuteL\ + video already playing, do nothing" ); + } + else + { + // start rendering process on the engine + iRenderingEngine->PlayL(); + } + } + + +// -------------------------------------------------------------------------- +// CUpnpShowTask::GetMedia +// provide media to be played back +// -------------------------------------------------------------------------- +MUPnPItemResolver* CUpnpShowTask::GetMedia() + { + __ASSERTD( FilePipe(), __FILE__, __LINE__ ); + + MUPnPItemResolver* resolver = 0; + + if ( FilePipe()->Count() > 0 ) + { + const TDesC& filename = FilePipe()->FileAt( 0 ); + __LOG1( "[UpnpCommand]\t CUpnpShowTask::GetMedia: %S", &filename ); + TRAP_IGNORE ( + resolver = + UPnPItemResolverFactory::NewLocalItemResolverL( + filename, + iResourceAllocator->AVController(), + iSelector, + UPnPItemResolverFactory::EOmitLocalMSStart ); + ); + } + + return resolver; + } + +// -------------------------------------------------------------------------- +// CUpnpShowTask::RenderAck +// Callback from image rendering engine. +// -------------------------------------------------------------------------- +TInt CUpnpShowTask::RenderAck( + TInt aError, + const CUpnpItem* aItem ) + { + __LOG1( "[UpnpCommand]\t CUpnpShowTask::RenderAck aError %D", aError ); + if ( aError == KErrNotSupported && aItem && + UPnPItemUtility::BelongsToClass( *aItem, KClassVideo ) ) + { + // NOTE! + // This is a special case. For video playback we use the image + // rendering engine for resolving, and then it fails with + // KErrNotSupported, because it is not an image. Now we catch the + // error here and play the resolved item. Why that complicated ? + // - to keep image rendering engine for image rendering ONLY + // and not to mix video UI stuff in there + // - to enable image rendering engine reuse in the future + // - so that we do not have to rewrite the resolving code in + // another place, it already exists in image rendering engine. + aError = PlayVideo( *aItem ); + } + + if ( aError != KErrDisconnected ) + { + // disconnect message is handled in EngineShutdown + // other errors are handled here + if ( aError == KErrNotSupported || aError == KErrPermissionDenied ) + { + TRAP_IGNORE( NoteHandler()->ShowDrmNoteL() ); + } + else if( aError != KErrNone && iShowPlaybackFailedNote ) + { + // note is shown only once per session + TRAP_IGNORE( NoteHandler()->ShowPlaybackFailedNoteL() ); + iShowPlaybackFailedNote = EFalse; + } + + // inform observer + CommandEvent( UpnpCommand::EEventComplete, aError ); + } + __LOG1( "[UpnpCommand]\t CUpnpShowTask::RenderAck end, resp=%d", aError ); + return aError; + } + +// -------------------------------------------------------------------------- +// CUpnpShowTask::EngineShutdown +// Callback from image rendering engine. +// -------------------------------------------------------------------------- +void CUpnpShowTask::EngineShutdown( + TInt aError ) + { + __ASSERTD( iRenderingEngine, __FILE__, __LINE__ ); + + if ( iPlayingVideo ) + { + __LOG1( "[UpnpCommand]\t CUpnpShowTask::EngineShutdown(%d)\ +while video playing", + aError ); + TRAP_IGNORE( iCommonUI->DismissDialogL( aError ) ); + } + else + { + __LOG1( "[UpnpCommand]\t CUpnpShowTask::EngineShutdown(%d)", + aError ); + + if( aError == KErrDisconnected ) + { + // check from rendering engine if wlan is active + // note shown only in device disappeared cases + if( iRenderingEngine->IsWlanActive() ) + { + TRAP_IGNORE( NoteHandler()->ShowConnectionLostNoteL() ); + } + } + + + // Inform the observer + __ASSERTD( TaskHandler(), __FILE__, __LINE__ ); + + CommandEvent( UpnpCommand::EEventComplete, aError); + } + __LOG( "[UpnpCommand]\t CUpnpShowTask::EngineShutdown END" ); + } + + + +// -------------------------------------------------------------------------- +// CUpnpShowTask::PlayVideo +// Launches the video player dialog for playing a video file on remote +// -------------------------------------------------------------------------- +TInt CUpnpShowTask::PlayVideo( const CUpnpItem& aItem ) + { + __LOG( "[UpnpCommand]\t CUpnpShowTask::CUpnpShowTask::PlayVideo start" ); + + TInt videoPlayerError = KErrNone; + TInt videoStatus = KErrNone; + + // Update the state + iPlayingVideo = ETrue; + + + // Launch the video player dialog to render the item. + TRAP( videoPlayerError, + + // start a rendering session ( used only for video playing ) + if( !iVideoRenderingSession ) + { + iVideoRenderingSession = + &iResourceAllocator->AVController().StartRenderingSessionL( + iResourceAllocator->SelectedDevice() ); + } + + // inform observer that we are launching dialog + __LOG( "[UpnpCommand]\t CUpnpShowTask::CUpnpShowTask::PlayVideo \ +launching videoplayerdialog" ); + CommandEvent( UpnpCommand::EEventProgress, + UpnpCommand::KUpnpCommandStatusStartPlayVideo, EFalse ); + + // plays video + videoStatus = iCommonUI->ExecuteVideoPlayerL( + *iVideoRenderingSession, aItem ); + ) + + // Update the state + iPlayingVideo = EFalse; + + // Fix UpnpCommonUi's return value + if( videoStatus > 0 ) + { + videoStatus = KErrNone; + } + + if( videoPlayerError != KErrNone && + videoStatus == KErrNone ) + { + videoStatus = videoPlayerError; + } + + __LOG( "[UpnpCommand]\t CUpnpShowTask::CUpnpShowTask::PlayVideo end" ); + + // Inform the observer, no matter if the playing succeeded or failed. + return videoStatus; + } + + +// End of File