diff -r 839377eedc2b -r befca0ec475f videoplayerapp/lwplayer/src/lwplayerappui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoplayerapp/lwplayer/src/lwplayerappui.cpp Wed Sep 01 12:30:28 2010 +0100 @@ -0,0 +1,528 @@ +/* +* Copyright (c) 2008 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: Implementation of CLWPLayerAppUi + * +*/ + +// Version : %version: 8 % + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lwplayerappui.h" +#include "lwpuids.hrh" +#include "mpxvideo_debug.h" + +const TInt KEVENTBLOCKTIMEOUT = 1000000; + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLWPlayerAppUi::ConstructL() +{ + MPX_DEBUG(_L("CLWPlayerAppUi::ConstructL()")); + + BaseConstructL( EAknEnableSkin ); + + iEmbeddedMPCreated = EFalse; + + iAllowEvents = ETrue; + + iCloseAO = CIdle::NewL( CActive::EPriorityStandard ); + + iBlockEventsTimer = CPeriodic::NewL( CActive::EPriorityStandard ); +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::~CLWPlayerAppUi() +// Destructor +// Frees reserved resources +// ----------------------------------------------------------------------------- +// +CLWPlayerAppUi::~CLWPlayerAppUi() +{ + MPX_DEBUG(_L("CLWPlayerAppUi::~CLWPlayerAppUi()")); + + delete iDocHandler; + + if ( iCloseAO ) + { + delete iCloseAO; + iCloseAO = NULL; + } + + if ( iBlockEventsTimer ) + { + iBlockEventsTimer->Cancel(); + delete iBlockEventsTimer; + iBlockEventsTimer = NULL; + } +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::HandleCommandL +// ----------------------------------------------------------------------------- +// +void CLWPlayerAppUi::HandleCommandL(TInt aCommand) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::HandleCommandL(%d)"), aCommand); + + switch ( aCommand ) + { + case EAknSoftkeyBack: + case EEikCmdExit: + Exit(); + break; + default: + break; + } +} + +// ----------------------------------------------------------------------------- +// New Methods added for Progressive Download +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::ProcessCommandParametersL +// +// When Prog Download is started, RApaLsSession creates +// this Document and calls ProcessCommandParametersL. +// ----------------------------------------------------------------------------- +// +TBool CLWPlayerAppUi::ProcessCommandParametersL( CApaCommandLine& aCommandLine ) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::ProcessCommandParametersL()")); + + // + // Since download manager can send multiple events with the same data + // Block events from Download Manager for a short time + // + BlockEvents(); + + // + // Convert aFilename to 8-bit and convert to generic params + // + TPtrC param = aCommandLine.DocumentName(); + + if ( param.Length() ) + { + HBufC8* param8 = HBufC8::NewLC( param.Length() ); + param8->Des().Copy( param ); + ExtractGenericParamsL( *param8 ); + CleanupStack::PopAndDestroy( param8 ); + } + + return ETrue; +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::HandleMessageL +// ----------------------------------------------------------------------------- +// +MCoeMessageObserver::TMessageResponse +CLWPlayerAppUi::HandleMessageL( TUint32 aClientHandleOfTWG, + TUid aMessageUid, + const TDesC8& aMessageParameters ) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::HandleMessageL()")); + + if ( iAllowEvents && iEmbeddedMPCreated ) + { + // + // pass the message to Media Player + // + SendMessageL( aMessageParameters ); + + // + // Since download manager can send multiple events with the same data + // Block events from Download Manager for a short time + // + BlockEvents(); + } + + return CAknAppUi::HandleMessageL( aClientHandleOfTWG, + aMessageUid, + aMessageParameters ); +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::ExtractGenericParamsL +// ----------------------------------------------------------------------------- +// +void CLWPlayerAppUi::ExtractGenericParamsL( const TDesC8& aParams ) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::ExtractGenericParamsL()")); + + CBufFlat* paramBuf = CBufFlat::NewL( /*anExpandSize*/1 ); + CleanupStack::PushL( paramBuf ); + paramBuf->InsertL( 0, aParams ); + RBufReadStream readStream( *paramBuf ); + + CAiwGenericParamList* genParList = CAiwGenericParamList::NewLC(readStream); + + TInt index = 0; + + // + // Unpack fileName + // + const TAiwGenericParam* paramFileName = + genParList->FindFirst( index, EGenericParamFile, EVariantTypeDesC ); + + TPtrC fileName; + + // + // If the parameter was not found, KErrNotFound is returned + // + if ( index == KErrNotFound ) + { + // + // Invalid parameter listing. Set error so message will + // be displayed and LWP will exit + // + HandleErrorL( KErrArgument ); + } + else + { + fileName.Set( paramFileName->Value().AsDes() ); + + MPX_DEBUG(_L(" filename = %S"), &fileName); + + if ( ! iEmbeddedMPCreated ) + { + // + // Launch the Media Player for ProgDL playback + // Ignore the errors since the Media Player is + // responsible for all error messages once launched. + // + MPX_TRAPD( err, LaunchMediaPlayerL( fileName, genParList ) ); + + if ( err != KErrNone ) + { + ActivateClosePlayerActiveObject(); + } + } + } + + CleanupStack::PopAndDestroy( genParList ); + CleanupStack::PopAndDestroy( paramBuf ); +} + +TInt +CLWPlayerAppUi::LaunchMediaPlayerL( const TDesC& afilename, + const CAiwGenericParamList* aparamList ) +{ + MPX_ENTER_EXIT(_L("CLWPlayerAppUi::LaunchMediaPlayerL()"), + _L("afilename = %S"), &afilename ); + + // + // The download manager has already performed recognition on the file + // using the cenrep keys. The LW Player should always launch the MP in + // embedded mode. Using the MP UID to ensure that it is used. + // + TDataType datatype( KFUSIONPLAYERUID ); + + CDocumentHandler& handler = DocumentHandlerL(); + + RFile file; + + // + // Call the document handler to open the file + // It will leave if the filename is not present + // + MPX_TRAPD( err, handler.OpenTempFileL( afilename, file )); + + if ( err == KErrNotFound ) + { + HandleErrorL( err ); + } + else if ( err != KErrNone ) + { + User::Leave( err ); + } + else + { + CleanupClosePushL( file ); + + MPX_TRAPD( err, handler.OpenFileEmbeddedL( file, datatype, *aparamList ) ); + + // + // ignore some document handler errors + // + if ( err == KErrServerTerminated ) + { + // + // Document handler leaves with -15 if end key is pressed when + // embedded application is not fully started or embedded + // application panics in start up. So we can only close the + // App in this point and hope that user is press end key + // + ActivateClosePlayerActiveObject(); + } + else if ( err != KErrNone ) + { + // Reset error since it was handled here and + // the program will exit + // + User::Leave( err ); + } + + iEmbeddedMPCreated = ETrue; + + CleanupStack::PopAndDestroy( &file ); // file.Close() + } + + return KErrNone; +} + +CDocumentHandler& CLWPlayerAppUi::DocumentHandlerL() +{ + MPX_DEBUG(_L("CLWPlayerAppUi::DocumentHandlerL()")); + + if ( !iDocHandler ) + { + iDocHandler = CDocumentHandler::NewL(); + } + + iDocHandler->SetExitObserver( this ); + + return *iDocHandler; +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::NotifyExit +// Called when user exits +// ----------------------------------------------------------------------------- +// +void CLWPlayerAppUi::HandleServerAppExit(TInt aReason) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::HandleServerAppExit(%d)"), aReason); + + // + // should exit here - MP terminated, if MP BACK it will bring up Browser + // + ActivateClosePlayerActiveObject(); +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::SendMessageL +// ----------------------------------------------------------------------------- +// +TInt CLWPlayerAppUi::SendMessageL(const TDesC8& aMessageParameters) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::SendMessageL()")); + + TInt ret = KErrNone; + + // + // find the task number of the Media Player which is playing + // the ProgDL + // + RArray wgs; + User::LeaveIfError(iCoeEnv->WsSession().WindowGroupList(0, &wgs)); + TBool progDLWindowGroup = EFalse; + TInt count = wgs.Count(); + TInt LWPwgId=0; + + CApaWindowGroupName::FindByAppUid( KLWPLAYERUID , + iCoeEnv->WsSession(), + LWPwgId ); + + TApaTask task( iCoeEnv->WsSession() ); + + // + // initialise task to non-existant task + // + task.SetWgId( 0 ); + + // + // wgId = 0 tells FindAppByUid to start looking for apps + // + TInt wgId = 0; + + while ( ( wgId != KErrNotFound ) && ! progDLWindowGroup ) + { + CApaWindowGroupName::FindByAppUid( KFUSIONPLAYERUID, + iCoeEnv->WsSession(), + wgId ); + + for ( TInt i=0 ; iExecuteLD( text->Des() ); + CleanupStack::PopAndDestroy(text); + + // + // After the error message, Exit the Light Weight Player + // + ActivateClosePlayerActiveObject(); +} + +// ------------------------------------------------------------------------------------------------- +// CLWPlayerAppUi::ActivateClosePlayerActiveObject +// ------------------------------------------------------------------------------------------------- +// +void CLWPlayerAppUi::ActivateClosePlayerActiveObject() +{ + MPX_ENTER_EXIT(_L("CLWPlayerAppUi::ActivateClosePlayerActiveObject()")); + + if ( ! iCloseAO->IsActive() ) + { + iCloseAO->Start( TCallBack( CLWPlayerAppUi::CloseLWPlayerL, this ) ); + } +} + +// ----------------------------------------------------------------------------- +// CLWPlayerAppUi::ClosePlayerL +// ----------------------------------------------------------------------------- +// +TInt CLWPlayerAppUi::CloseLWPlayerL( TAny* aPtr ) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::ClosePlayerL()")); + + static_cast(aPtr)->DoCloseLWPlayerL(); + return KErrNone; +} + +// ------------------------------------------------------------------------------------------------- +// CLWPlayerAppUi::DoClosePlayerL +// ------------------------------------------------------------------------------------------------- +// +void CLWPlayerAppUi::DoCloseLWPlayerL() +{ + MPX_ENTER_EXIT(_L("CLWPlayerAppUi::DoClosePlayerL()")); + + HandleCommandL( EEikCmdExit ); +} + +// ------------------------------------------------------------------------------------------------- +// CLWPlayerAppUi::HandleBlockEventsTimeout +// ------------------------------------------------------------------------------------------------- +// +TInt CLWPlayerAppUi::HandleBlockEventsTimeout( TAny* aPtr ) +{ + MPX_DEBUG(_L("CLWPlayerAppUi::HandleEventBlockTimeout()")); + + static_cast(aPtr)->UnblockEvents(); + + return KErrNone; +} + +// ------------------------------------------------------------------------------------------------- +// CLWPlayerAppUi::BlockEvents +// ------------------------------------------------------------------------------------------------- +// +void CLWPlayerAppUi::BlockEvents() +{ + MPX_DEBUG(_L("CLWPlayerAppUi::BlockEvents()")); + + // + // Message received from Browser + // Block other messages for 1 second to prevent double click errors + // + iAllowEvents = EFalse; + + if ( iBlockEventsTimer->IsActive() ) + { + iBlockEventsTimer->Cancel(); + } + + iBlockEventsTimer->Start( KEVENTBLOCKTIMEOUT, + 0, + TCallBack( CLWPlayerAppUi::HandleBlockEventsTimeout, this ) ); +} + +// ------------------------------------------------------------------------------------------------- +// CLWPlayerAppUi::UnblockEvents +// ------------------------------------------------------------------------------------------------- +// +void CLWPlayerAppUi::UnblockEvents() +{ + MPX_DEBUG(_L("CLWPlayerAppUi::UnblockEvents()")); + + iAllowEvents = ETrue; + + if ( iBlockEventsTimer->IsActive() ) + { + iBlockEventsTimer->Cancel(); + } +} + +// End of File