diff -r ebe688cedc25 -r 7fdbb852d323 mobilemessaging/smilui/playersrc/SmilPlayerPresentationController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smilui/playersrc/SmilPlayerPresentationController.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,1636 @@ +/* +* Copyright (c) 2002-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: SmilPlayerPresentationController implementation +* +*/ + + +// INCLUDE FILES +#include "SmilPlayerPresentationController.h" + +#include +#include +#include //Wait note +#include // Confirmation dialog +#include // AknStatuspaneUtils + +#include // LAF +#include +#include +#include +#include + +#include +#include +#include + +#include +#include //SmilParser +#include //SmilEngine +#include +#include + +#include +#include +#include + +#include // Phonenumber parser +#include // for CSendUi +#include // CMessageData +#include // Mtm uids +#include // RApaLsSession for WMLBrowser launch + +#include +#include + +#include + +#include // for CPlainText +#include "SmilTextRenderer.h" +#include "SmilPlayerPanic.h" +#include "SmilPlayerPresentationControl.h" +#include "SmilPlayerDialog.h" +#include "SmilPlayerLinkParser.h" +#include "SmilPlayerIndicatorController.h" +#include "SmilPlayerSynchXmlParser.h" +#include + +#ifdef PRESCONTROLLER_DEBUG +#include "SMilPlayerLogging.h" +#endif + +// CONSTANTS +const TReal KLayoutScaleDown = 0.20; +const TReal KLayoutScaleUp = 2.00; + +const TInt KScrollModifierCode = 32769; +const TInt KScrollScanCode = 3; + +_LIT( KInternalLinkMark, "#" ); +_LIT( KSpace, " " ); // Space for WML Browser's parameter + +_LIT( KActivate, "activateEvent" ); +_LIT( KWmlBrowserParameter, "4" ); // magic number for Wml browser to open the URL + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::CSmilPlayerPresentationController +// C++ constructor. Initializes class member variables. +// ---------------------------------------------------------------------------- +// +CSmilPlayerPresentationController::CSmilPlayerPresentationController( CMDXMLDocument* aDOM, + MMediaFactoryFileInfo* aFileInfo, + CSmilPlayerDialog* aParent, + RFile& aFileHandle ) : + iDOM( aDOM ), + iFileInfo( aFileInfo ), + iParent( aParent ), + iFileHandle( aFileHandle ) + { + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ConstructL +// Symbian 2nd phase constructor. Creates indicator controller and tranfers it's ownership +// to indicator container. Also creates buffer bitmap and context for it that +// are used as a double buffer for drawing the presentation (i.e. presentation +// is first drawn to buffer and then buffer is drawn to screen). After this media +// factory (component that creates media renderers) and transition effect factory +// (component that creates transition effect filters) are created. Also presentation +// control that performs presentation drawing is created and initialized. Presentation +// parsing is done next and if everything went ok all the controls are layed out correctly. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::ConstructL( const TRect& aRect, + const TDesC& aBaseUrl, + TBool aVolumeEnabled ) + { +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_ENTERFN( "[SMILPLAYER] PresController: ConstructL" ); + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: aRect=(%d, %d) (%d, %d)"), + aRect.iTl.iX, aRect.iTl.iY, aRect.iBr.iX, aRect.iBr.iY ); +#endif + + CreateWindowL(); + SetRect( aRect ); + + // Overlap flag set to EFalse at construction time + SetPresentationOverlapped( EFalse ); + + CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane(); + CAknNavigationControlContainer* naviContainer = + static_cast( sp->ControlL( + TUid::Uid( EEikStatusPaneUidNavi ) ) ); + + // Not owned by presentation controller. + iIndicatorController = CSmilPlayerIndicatorController::NewL( naviContainer, + this, + aVolumeEnabled ); + + // iIndicatorController ownership transferred to iIndicatorContainer. + iIndicatorContainer = CAknNavigationDecorator::NewL( naviContainer, iIndicatorController ); + iIndicatorContainer->SetContainerWindowL( *naviContainer ); + iIndicatorContainer->MakeScrollButtonVisible( EFalse ); + iIndicatorContainer->SetComponentsToInheritVisibility( ETrue ); + + InitializeDoubleBufferL(); + + iMediaFactory = CSmilPlayerMediaFactory::NewL( *iCoeEnv, + iBufferContext, + iFileInfo ); + + iTransitionFactory = new(ELeave) CSmilTransitionFactory( iBufferBitmap ); + + iPresentationControl = CSmilPlayerPresentationControl::NewL( this ); + iPresentationControl->SetRect( Rect() ); + + iBaseUrl = aBaseUrl.AllocL(); + + TRAPD( error, DoParsingL() ); + if ( error == KErrNone ) + { + LayoutPresentationControl(); + + SetComponentsToInheritVisibility( ETrue ); + MakeVisible( EFalse ); + } + else + { +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: Presentation creation failed=%d"), error ); +#endif + delete iWaitDialog; + iWaitDialog = NULL; + + // All other error cases are handled on CSmilDialog::ActivateL function + if ( error == KErrNoMemory ) + { + User::Leave( error ); + } + } + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_LEAVEFN( "[SMILPLAYER] PresController: ConstructL" ); +#endif + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::NewL +// Symbian two phased constructor +// ---------------------------------------------------------------------------- +// +CSmilPlayerPresentationController* CSmilPlayerPresentationController::NewL( const TRect& aRect, + const TDesC& aBaseUrl, + MMediaFactoryFileInfo* aFileInfo, + CSmilPlayerDialog* aParent, + CMDXMLDocument* aDOM, + TBool aVolumeEnabled ) + { + RFile tempHandle; + CSmilPlayerPresentationController* self = new(ELeave) CSmilPlayerPresentationController( aDOM, + aFileInfo, + aParent, + tempHandle ); + + CleanupStack::PushL( self ); + self->ConstructL( aRect, aBaseUrl, aVolumeEnabled ); + CleanupStack::Pop( self ); + + return self; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::NewL +// Symbian two phased constructor +// ---------------------------------------------------------------------------- +// +CSmilPlayerPresentationController* CSmilPlayerPresentationController::NewL( const TRect& aRect, + const TDesC& aBaseUrl, + MMediaFactoryFileInfo* aFileInfo, + CSmilPlayerDialog* aParent, + RFile& aFileHandle, + TBool aVolumeEnabled ) + { + CSmilPlayerPresentationController* self = new(ELeave) CSmilPlayerPresentationController( NULL, + aFileInfo, + aParent, + aFileHandle ); + + CleanupStack::PushL( self ); + self->ConstructL( aRect, aBaseUrl, aVolumeEnabled ); + CleanupStack::Pop( self ); + + return self; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::~CSmilPlayerPresentationController +// Destructor +// ---------------------------------------------------------------------------- +// +CSmilPlayerPresentationController::~CSmilPlayerPresentationController() + { + delete iPresentation; + delete iMediaFactory; + delete iTransitionFactory; + delete iBufferContext; + delete iBufferDevice; + delete iBufferBitmap; + delete iPresentationControl; + delete iSendUi; + delete iIndicatorContainer; + delete iWaitDialog; + + delete iServiceHandler; + + delete iBaseUrl; + if ( iDOMInternallyOwned ) + { + delete iDOM; + } + + iFileInfo = NULL; // For Lint + iParent = NULL; // For Lint + iIndicatorController = NULL; // For Lint. Ownership transferred to decorator. + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ChangeStateL +// Changes controller state to specified one. Indicator state is change here or +// on PresentationEvent function depending which one is more approriate for this state. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::ChangeStateL( TSmilPresControllerStates aState ) + { +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_ENTERFN( "[SMILPLAYER] PresController: ChangeStateL" ); + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: aState=%d"), aState ); +#endif + + if ( !iPresentation ) + { + __ASSERT_DEBUG( EFalse, Panic( ESmilPlayerPresentationNotReady ) ); + return; + } + + switch ( aState ) + { + case EStatePlay: + { + iIndicatorController->Start(); + + if ( iPresentation->State() != CSmilPresentation::EPlaying ) + { + iPresentation->PlayL(); + } + break; + } + case EStateStop: + { + if ( iPresentation->State() != CSmilPresentation::EStopped ) + { + iPresentation->StopL(); + } + break; + } + case EStatePause: + { + if ( iPresentation->State() == CSmilPresentation::EPlaying ) + { + iPresentation->Pause(); + } + break; + } + case EStateResume: + { + if ( iPresentation->State() != CSmilPresentation::EPlaying ) + { + iPresentation->Resume(); + } + break; + } + default: + { + __ASSERT_DEBUG( EFalse, Panic( ESmilPlayerUnknownState ) ); + break; + } + } + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_LEAVEFN( "[SMILPLAYER] PresController: ChangeStateL" ); +#endif + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::StopTimer +// Stops timer indicator. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::StopTimer() + { + iIndicatorController->Stop(); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::RedrawArea +// Called by SMIL Engine. Calls presentation control to redraw given area. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::RedrawArea( const TRect& aArea ) const + { + iPresentationControl->RedrawArea( aArea ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::SetStatusPaneVisibilityL +// Controls statuspane layout. aValue is ETrue "normal" statuspane is used and +// if aValue is EFalse SMIL Player own statuspane is used. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::SetStatusPaneVisibilityL( TBool aValue ) + { + TRect newRect; + + TRect applicationWindow; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EApplicationWindow, applicationWindow ); + + TAknLayoutRect mainPane; + + if ( CSmilPlayerPresentationController::UseWidescreenStatusPane() ) + { + // select appropriate main_pane variety based on presentation overlap flag + if ( IsPresentationOverlapped() ) + mainPane.LayoutRect( applicationWindow, AknLayoutScalable_Avkon::main_pane( 4 ) ); + else + mainPane.LayoutRect( applicationWindow, AknLayoutScalable_Avkon::main_pane( 22 ) ); + } + else if ( AknStatuspaneUtils::StaconPaneActive() ) + { + mainPane.LayoutRect( applicationWindow, AknLayoutScalable_Avkon::main_pane( 4 ) ); + } + else + { + if ( aValue ) + { + mainPane.LayoutRect( applicationWindow, AknLayoutScalable_Avkon::main_pane( 5 ) ); + } + else + { + mainPane.LayoutRect( applicationWindow, AknLayoutScalable_Avkon::main_pane( 0 ) ); + } + } + + TAknLayoutRect mainSmilPane; + mainSmilPane.LayoutRect( mainPane.Rect(), AknLayoutScalable_Apps::main_smil_pane() ); + + newRect = mainSmilPane.Rect(); + + TInt notUsed( 0 ); + + if ( aValue ) + { + SwitchStatusPaneL( R_AVKON_STATUS_PANE_LAYOUT_USUAL, EFalse, notUsed ); + SetRect( newRect ); + } + else + { + SetRect( newRect ); + + TInt newStatusPaneResId = R_AVKON_STATUS_PANE_LAYOUT_SMALL; + if ( CSmilPlayerPresentationController::UseWidescreenStatusPane() ) + { + newStatusPaneResId = R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT; + } + + SwitchStatusPaneL( newStatusPaneResId, ETrue, notUsed ); + } + + iOwnStatusPaneVisible = !aValue; + + DrawNow(); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::AnchorExist +// Returns if anchor exists on presentation. Anchors are links pointing to +// internal place inside presentation or external place outside presentation +// (such as HTTP, mailto and callto links). +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::AnchorExist() const + { + TBool result( EFalse ); + CSmilObject* focused = iPresentation->FocusedObject(); + + if ( focused ) + { + CSmilAnchor* anchor = static_cast( focused )->Anchor(); + if ( anchor && anchor->Href().Length() > 0 ) + { + result = ETrue; + } + } + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::AnchorIsInternalLink +// Retuns whether anchor (i.e. link) is internal (i.e. points inside +// presentation). +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::AnchorIsInternalLink() const + { + TBool result( EFalse ); + CSmilObject* focused = iPresentation->FocusedObject(); + + if ( focused ) + { + CSmilAnchor* anchor = static_cast( focused )->Anchor(); + if ( anchor ) + { + TPtrC href = anchor->Href(); + + if( href.Length() >= KInternalLinkMark().Length() ) + { + if( href.Left( KInternalLinkMark().Length() ).MatchF( + KInternalLinkMark ) != KErrNotFound ) + { + result = ETrue; + } + } + } + } + return result; + } +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ScrollingActivationEnabled +// Returns if scrolling can be activated for given focused object. Checks +// if object is focused and it is scrollable and not already activated. +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::ScrollingActivationEnabled() const + { + TBool result( EFalse ); + #ifdef RD_SCALABLE_UI_V2 + if ( AknLayoutUtils::PenEnabled() ) + return result; + #endif + CSmilObject* focused = iPresentation->FocusedObject(); + + if ( focused ) + { + result = ( static_cast( focused )->IsScrollable() && + !iPresentation->MediaSelected() ); + } + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::FocusedObjectScrollable +// Returns if focused object is scrollable. Checks if object is focused and it is +// scrollable. +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::FocusedObjectScrollable() const + { + TBool result( EFalse ); + CSmilObject* focused = iPresentation->FocusedObject(); + + if ( focused ) + { + result = static_cast( focused )->IsScrollable(); + } + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::PrepareExitL +// Switches statuspane to the one that was used using resource ID that was +// stored on InitializeL. Sets controller also invisible and refreshes the screen +// for better drawing result. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::PrepareExitL() + { + //set layout back + TInt notUsed; + SwitchStatusPaneL( iLayoutResId, EFalse, notUsed ); + iOwnStatusPaneVisible = EFalse; + + MakeVisible( EFalse ); + DrawNow(); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerDialog::Initialize +// Initializes and activates the dialog. Switches statuspane to small statuspane. +// Also stores old statuspane resource ID. Also activates controller and sets +// it visible and refreshes the screen. This is done for better drawing result. +// Returns EFalse if presentation parsing was not successful. +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::InitializeL() + { + TBool result( EFalse ); + + if ( iPresentation ) + { + MakeVisible( ETrue ); + ActivateL(); + + TInt newStatusPaneResId = R_AVKON_STATUS_PANE_LAYOUT_SMALL; + if ( CSmilPlayerPresentationController::UseWidescreenStatusPane() ) + { + newStatusPaneResId = R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT_NO_SOFTKEYS; + } + + SwitchStatusPaneL( newStatusPaneResId, + ETrue, + iLayoutResId ); + iOwnStatusPaneVisible = ETrue; + + DrawNow(); + + result = ETrue; + } + + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ActivateScrolling +// Activates scolling. This is done by giving EKeyEnter event to the presentation. +// Also if non-internal anchor (link) exists flag is raised so that open document +// cannot be called (can panic). +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::ActivateScrollingL() + { + TKeyEvent keyEvent; + keyEvent.iCode = EKeyEnter; + keyEvent.iScanCode = KScrollScanCode; + keyEvent.iModifiers = KScrollModifierCode; + keyEvent.iRepeats = 0; + TEventCode type = EEventKey; + + if( AnchorExist() && + !AnchorIsInternalLink() ) + { + iScrollingTogglePerformedWhileLinkExist = ETrue; + } + + iPresentation->HandleKeyEventL( keyEvent, type); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::DeactivateScrollingL +// Deactivates scolling (same implementation as activate scrolling) +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::DeactivateScrollingL() + { + // The implemention is exactly as activateScrolling() + ActivateScrollingL(); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::HandleVolumeKeyEventL +// Calls DoHandleVolumeKeyL to handle volume key event. +// ---------------------------------------------------------------------------- +// +TKeyResponse CSmilPlayerPresentationController::HandleVolumeKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + return DoHandleVolumeKeyL( aKeyEvent, aType ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::HandleScrollKeyEventL +// Calls presentation to handle scroll key event if scrolling deactivation is not ongoing. +// ---------------------------------------------------------------------------- +// +TKeyResponse CSmilPlayerPresentationController::HandleScrollKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse result( EKeyWasNotConsumed ); + if ( iScrollingTogglePerformedWhileLinkExist ) + { +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: Changing scrolling mode") ); +#endif + // scrolling deactivation ongoing... + // should not do any key handling, otherwise can panic + result = EKeyWasConsumed; + } + else + { + result = iPresentation->HandleKeyEventL( aKeyEvent, aType ); + } + return result; + } + + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::HandleRCSOperation +// Call internal function to handle specified operation. Silently ignores errors. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::HandleRCSOperation( TRemConCoreApiOperationId aOperation ) + { + TRAP_IGNORE( DoHandleRCSOperationL( aOperation ) ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::DoHandleRCSOperationL +// Performs Remote Control Server operation handling. VolumeUp and VolumeDown +// events are interpreted as right/left key events. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::DoHandleRCSOperationL( TRemConCoreApiOperationId aOperation ) + { + switch ( aOperation ) + { + case ERemConCoreApiVolumeUp: + { + TKeyEvent keyEvent; + keyEvent.iCode = EKeyRightArrow; + TEventCode type = EEventKey; + + DoHandleVolumeKeyL( keyEvent, type ); + break; + } + case ERemConCoreApiVolumeDown: + { + TKeyEvent keyEvent; + keyEvent.iCode = EKeyLeftArrow; + TEventCode type = EEventKey; + + DoHandleVolumeKeyL( keyEvent, type ); + + break; + } + default: + { + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::DoHandleVolumeKeyL +// Performs volume key handling. Forwards volume key event to indicator controller +// and if key event is consumed there changes presentation volume accordingly. +// ---------------------------------------------------------------------------- +// +TKeyResponse CSmilPlayerPresentationController::DoHandleVolumeKeyL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse result( EKeyWasNotConsumed); + + if ( iPresentation ) + { + result = iIndicatorController->OfferKeyEventL( aKeyEvent, aType ); + if ( result == EKeyWasConsumed ) + { + iPresentation->SetVolume( iIndicatorController->VolumeValue() * 10 ); + } + } + + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::OpenDocumentL +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::OpenDocumentL( const TDesC& aUrl, + const CSmilAnchor* /*aAnchor*/, + const CSmilPresentation* /*aPres*/ ) + { + if ( iScrollingTogglePerformedWhileLinkExist ) + { + // used when activating/deactivating scrolling while link exists also + iScrollingTogglePerformedWhileLinkExist = EFalse; + return; + } + + SmilPlayerLinkParser::TSmilPlayerLinkType linkResult = + SmilPlayerLinkParser::LinkType( aUrl ); + + switch( linkResult ) + { + case SmilPlayerLinkParser::ESmilPlayerNotSupported: + { + // nothing to do in this case + break; + } + case SmilPlayerLinkParser::ESmilPlayerPhoneNumber: + { + // use phone client to make a call + if ( LoadTextAndConfirmL( R_SMILPLAYER_CONFIRM_CALLTO, + aUrl.Right( aUrl.Length() - KPhoneToString().Length() ) ) ) + { + CallL( aUrl.Right( aUrl.Length() - KPhoneToString().Length() ) ); + } + break; + } + case SmilPlayerLinkParser::ESmilPlayerMailAddress: + { + // open mail editor + if ( LoadTextAndConfirmL( R_SMILPLAYER_CONFIRM_MAILTO, + aUrl.Right( aUrl.Length() - KMailToString().Length() ) ) ) + { + SetStatusPaneVisibilityL( ETrue ); + + // TRAPD used to catch the case where access point not defined + // and user doesn't want to define it, and when getting back + // the StatusPane should be set invisible again + TRAP_IGNORE( SendMessageL( KSenduiMtmSmtpUid, + aUrl.Right( aUrl.Length() - KMailToString().Length() ) ) ); + SetStatusPaneVisibilityL( EFalse ); + } + break; + } + case SmilPlayerLinkParser::ESmilPlayerUrlAddress: + { + // open browser + if ( LoadTextAndConfirmL( R_SMILPLAYER_CONFIRM_OPEN, aUrl ) ) + { + GoToUrlL( aUrl ); + } + break; + } + default: + { + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::PresentationEvent +// Handles presentation event notifications from SMIL Engine. Indicator +// state is changes here or on ChangeStateL function depending which one +// is more approriate for that state. On end reached state event notifies +// SMIL Player dialog about the presetation end. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::PresentationEvent( TInt aEvent, + const CSmilPresentation* /*aPres*/, + const TDesC& /*aUrl*/ ) + { +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_ENTERFN( "[SMILPLAYER] PresController: PresentationEvent" ); + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: aEvent=%d"), aEvent ); +#endif + + switch( aEvent ) + { + case MSmilPlayer::EStarted: + case MSmilPlayer::EStopped: + { + // Do not stop indicator controller here because presentation + // end might follow that requires special handling. + break; + } + case MSmilPlayer::EPaused: + { + iIndicatorController->Pause(); + break; + } + case MSmilPlayer::EResumed: + { + iIndicatorController->Resume(); + break; + } + case MSmilPlayer::ESeeked: + case MSmilPlayer::EStalled: + case MSmilPlayer::EMediaNotFound: + { + break; + } + case MSmilPlayer::EEndReached: + { + iIndicatorController->EndReached(); + TRAP_IGNORE( iParent->PresentationStoppedL() ); + break; + } + default: + { + break; + } + } + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_LEAVEFN( "[SMILPLAYER] PresController: PresentationEvent" ); +#endif + } + + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::LayoutPresentationControl +// Sets correct layout for presentation control. Retrieves presentation root-region +// size (this is always starting from 0,0). After this calculates the top left corner +// so that presentation is centralized. +// ---------------------------------------------------------------------------- +// + void CSmilPlayerPresentationController::LayoutPresentationControl() + { + TSize presentationSize = iPresentation->RootRegionRect().Size(); + + TPoint newtopleft; + newtopleft.iX = ( Rect().Width() - presentationSize.iWidth ) / 2; + newtopleft.iY = ( Rect().Height() - presentationSize.iHeight ) / 2; + + iPresentationControl->SetRect( TRect( newtopleft, presentationSize ) ); + iPresentationRect = iPresentationControl->Rect(); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::DoParsingL +// Performs SMIL Presentation parsing. If client has not give valid DOM it is +// parsed from given file handle using XML parser. After valid DOM is present +// SMIL presentation is parsed from it. During SMIL presentation parsing +// wait note is shown if approriate. When presentation is parsed it is initialized +// with correct parameters. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::DoParsingL() + { +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_ENTERFN( "[SMILPLAYER] PresController: DoParsingL" ); +#endif + + iWaitDialog = new(ELeave) CAknWaitDialog( ( REINTERPRET_CAST( CEikDialog**, &iWaitDialog ) ) ); + iWaitDialog->SetTone( CAknNoteDialog::ENoTone ); + iWaitDialog->ExecuteLD( R_WAIT_NOTE ); + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: Wait dialog created") ); +#endif + + //dom parsing needed? + if ( !iDOM ) + { + CSmilPlayerSynchXmlParser* util = new(ELeave) CSmilPlayerSynchXmlParser; + CleanupStack::PushL( util ); + + iDOM = util->ParseL( iFileHandle ); + iDOMInternallyOwned = ETrue; + + CleanupStack::PopAndDestroy( util ); + } + + CSmilParser* parser = CSmilParser::NewL( this ); + CleanupStack::PushL( parser ); + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: Parser created") ); +#endif + + //Set layout scaling mode + parser->SetMaxDownUpScaling( static_cast( KLayoutScaleDown ), + static_cast( KLayoutScaleUp ) ); + + iPresentation = parser->ParseL( iDOM, *iBaseUrl ); + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_WRITEF( _L("[SMILPLAYER] PresController: Presentation parsed") ); +#endif + + delete iWaitDialog; + iWaitDialog = NULL; + + iPresentation->SetEndAction( CSmilPresentation::EStopAtEnd ); + iPresentation->SetStartAction( CSmilPresentation::EShowFirstFrame ); + iPresentation->SetVolume( iIndicatorController->VolumeValue() * 10 ); + + CleanupStack::PopAndDestroy( parser ); + +#ifdef PRESCONTROLLER_DEBUG + SMILPLAYERLOGGER_LEAVEFN( "[SMILPLAYER] PresController: DoParsingL" ); +#endif + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::CallL +// Creates a call to speficied number. First phone client is created if none exists. +// Then phone number is parsed from the given string and phone call is created +// using phone client. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::CallL( const TDesC& aString ) + { + + if ( !iServiceHandler ) + { + iServiceHandler = CAiwServiceHandler::NewL(); + } + + // Attach to AIW interest + iServiceHandler->AttachL ( R_SMILPLAYER_CALL_INTEREST ); + + CAiwDialData* dialData = CAiwDialData::NewLC(); + + // Set test parameters + dialData->SetPhoneNumberL( aString ); + dialData->SetCallType( CAiwDialData::EAIWVoice ); + dialData->SetWindowGroup( iCoeEnv->RootWin().WindowGroupId() ); + + CAiwGenericParamList& paramList = iServiceHandler->InParamListL(); + dialData->FillInParamListL( paramList ); + + // Execute AIW command with notification callback + iServiceHandler->ExecuteServiceCmdL( KAiwCmdCall, + paramList, + iServiceHandler->OutParamListL(), + 0, + NULL ); + + iServiceHandler->DetachL( R_SMILPLAYER_CALL_INTEREST ); + + CleanupStack::PopAndDestroy( dialData ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::SendMessageL +// Sends message (SMS, MMS or E-mail) referenced e-mail address +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::SendMessageL( const TUid& aMtmUid, + const TDesC& aString ) + { + if ( !iSendUi ) + { + iSendUi = CSendUi::NewL(); + } + + CMessageData* messageData = CMessageData::NewL(); + CleanupStack::PushL( messageData ); + + messageData->AppendToAddressL( aString ); + + iSendUi->CreateAndSendMessageL( aMtmUid, + messageData ); + + CleanupStack::PopAndDestroy( messageData ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::GoToUrlL +// Opens browser with given address, +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::GoToUrlL( const TDesC& aString ) + { + HBufC* parameters = HBufC::NewLC( aString.Length() + 2 ); + // 2 = length of the first parameter + space + + TPtr paramPtr = parameters->Des(); + paramPtr.Copy( KWmlBrowserParameter ); + paramPtr.Append( KSpace ); + paramPtr.Append( aString ); + + CBrowserLauncher* launcher = CBrowserLauncher::NewLC(); + + User::LeaveIfError( launcher->LaunchBrowserSyncEmbeddedL( *parameters ,NULL, NULL ) ); + + CleanupStack::PopAndDestroy( launcher ); + + CleanupStack::PopAndDestroy( parameters ); + + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::LoadTextAndConfirmL +// Loads correct text from given resource and shown confirmation query dialog +// by using ShowConfirmQueryL. Also forwards user answer to confirmation query +// dialog to caller. +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::LoadTextAndConfirmL( TInt aResourceId, + const TDesC& aString ) const + { + HBufC* dlgText = StringLoader::LoadLC( aResourceId, aString, iEikonEnv ); + + TBool result( ShowConfirmQueryL( R_SMILPLAYER_CONFIRM_QUERY, *dlgText ) ); + + CleanupStack::PopAndDestroy( dlgText ); + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ShowConfirmQueryL +// Shows confirmation query dialog to user by using CAknQueryDialog. Returns +// ETrue if user selected "Yes" and EFalse if "No". +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::ShowConfirmQueryL( TInt aResource, + const TDesC& aText ) const + { + TBool result( EFalse ); + + CAknQueryDialog* dialog = CAknQueryDialog::NewL(); + TInt ret = dialog->ExecuteLD( aResource, aText ); + User::LeaveIfError( ret ); + + if ( ret == EAknSoftkeyYes ) + { + result = ETrue; + } + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::CountComponentControls +// Returns number of presentation controller child controls. +// ---------------------------------------------------------------------------- +// +TInt CSmilPlayerPresentationController::CountComponentControls() const + { + // return nbr of controls inside this container + return 1; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ComponentControl +// Returns presentation control child control. +// ---------------------------------------------------------------------------- +// +CCoeControl* CSmilPlayerPresentationController::ComponentControl( TInt aIndex ) const + { + CCoeControl* result = NULL; + + switch ( aIndex ) + { + case 0: + { + result = iPresentationControl; + break; + } + default: + { + break; + } + } + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::Draw +// Draws the "borders" of the presentation. By "borders" here is meant +// areas the under statuspane that are not used by presentation. These areas +// are produced when original presentation is so small that even with maximum +// up-scaling presentation does not fill the whole available area or when +// original presentation uses different aspect ratio than playing device. +// To prevent flickering only border areas are drawn instead of whole presentation +// control rectangle. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::Draw( const TRect& /*aRect*/ ) const + { + TRect controllerRect( Rect() ); + TRect presentationRect( iPresentationControl->Rect() ); + + CWindowGc& gc = SystemGc(); + gc.SetPenStyle( CGraphicsContext::ENullPen ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetBrushColor( KRgbWhite ); + + TRect borderRect; + + // Draw the top border if neccessary + if ( controllerRect.iTl.iY < presentationRect.iTl.iY ) + { + borderRect.SetRect( controllerRect.iTl, + TPoint( controllerRect.iBr.iX, presentationRect.iTl.iY ) ); + + gc.DrawRect( borderRect ); + } + + // Draw the left border if neccessary + if ( controllerRect.iTl.iX < presentationRect.iTl.iX ) + { + borderRect.SetRect( controllerRect.iTl, + TPoint( presentationRect.iTl.iX, controllerRect.iBr.iY ) ); + + gc.DrawRect( borderRect ); + } + + // Draw the right border if neccessary + if ( controllerRect.iBr.iX > presentationRect.iBr.iX ) + { + borderRect.SetRect( TPoint( presentationRect.iBr.iX, controllerRect.iTl.iY ), + controllerRect.iBr ); + + gc.DrawRect( borderRect ); + } + + // Draw the bottom border if neccessary + if ( controllerRect.iBr.iY > presentationRect.iBr.iY ) + { + borderRect.SetRect( TPoint( controllerRect.iTl.iX, presentationRect.iBr.iY ), + controllerRect.iBr ); + + gc.DrawRect( borderRect ); + } + + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::LayoutPresentationL +// Sets correct layout for presentation control according to current LAF values. +// First flag for layout change is set and presentation existence is checked. If +// presentation does not exist then we are in the middle of presentation creation +// and layout switching is restarted when current presentation creation finishes. +// When performing the real layout change code first indicators are stopped +// if presentation is playing or paused. After this presentation controller state is +// reseted and new buffer bitmap & buffer context is created. +// This new buffer bitmap context is also updated for media factory +// so that newly created text renderers use correct buffer. Then presentation +// is parsed again so that all media regions and renderers use new corrected +// (this is currently the only way to fit SMIL engine for new layout). +// After this is done presentation control and indicator are adjusted to new +// layout and screen is updated. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::LayoutPresentationL() + { + iChangeLayout = ETrue; + + if ( iPresentation ) + { + while ( iChangeLayout ) + { + CSmilPresentation::TPresentationState presentationState( iPresentation->State() ); + + iIndicatorController->MakeVisible( EFalse ); + + if ( presentationState == CSmilPresentation::EPlaying || + presentationState == CSmilPresentation::EPaused ) + { + iIndicatorController->Stop(); + } + + Reset(); + + InitializeDoubleBufferL(); + + iMediaFactory = CSmilPlayerMediaFactory::NewL( *iCoeEnv, + iBufferContext, + iFileInfo ); + + iTransitionFactory = new( ELeave ) CSmilTransitionFactory( iBufferBitmap ); + + iPresentationControl->SetRect( Rect() ); + + iChangeLayout = EFalse; + DoParsingL(); + + if ( iChangeLayout ) + { + continue; + } + + LayoutPresentationControl(); + + iIndicatorController->SetRect( iIndicatorContainer->Rect() ); + iIndicatorController->LayoutIndicators(); + + iIndicatorController->MakeVisible( ETrue ); + + iPresentation->PlayL(); + iPresentation->StopL(); + + DrawDeferred(); + } + } + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::IsPresentationOverlapped +// Returns presentation overlap flag status +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::IsPresentationOverlapped() + { + return iPresentationOverlapped; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::SetPresentationOverlapped +// Sets flag to indicate that the presentation is overlapped. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::SetPresentationOverlapped( TBool aOverlapped ) + { + iPresentationOverlapped = aOverlapped; + return; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::LayoutOverlappedPresentation +// Sets the correct presentation layout, when a dialog (e.g. FindUi) +// is overlapping the presentation. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::LayoutOverlappedPresentation() + { + iPresentationControl->SetRect( Rect() ); + LayoutPresentationControl(); + DrawDeferred(); + } + + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::Reset +// Resets the presentation controller internal state. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::Reset() + { + delete iPresentation; + iPresentation = NULL; + + delete iMediaFactory; + iMediaFactory = NULL; + + delete iTransitionFactory; + iTransitionFactory = NULL; + + delete iBufferBitmap; + iBufferBitmap = NULL; + + delete iBufferDevice; + iBufferDevice = NULL; + + delete iBufferContext; + iBufferContext = NULL; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::SwitchStatusPaneL +// Changes statuspane to new one and possibly sets SMIL player own indicator +// for the statuspane. First checks that navigation pane is present on current +// statuspane layout and that it is application owned. These are global settings +// to all statuspane layouts and without these we cannot make any changes +// to navigation pane. If navigation pane is present and it is application owned +// it is first checked that it does not already have our own indicators as top most +// indicators. If this is true remove our own indicators. Then if our own indicators +// are wanted to be set to navigation pane this is done and after this statuspane layout +// is switched. Then last thing is to check that does this layout really contain +// navigation pane. If it does not and we have set our own indicators they are removed. +// NOTE! This is extremely sensitive function and changes to this might have really +// bad effects to visual appearance of statuspane switch. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::SwitchStatusPaneL( TInt aNewPaneResourceId, + TBool aSetOwnIndicators, + TInt& aOldPaneResourceId ) + { + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + + aOldPaneResourceId = statusPane->CurrentLayoutResId(); + + CEikStatusPaneBase::TPaneCapabilities naviCapabilities = + statusPane->PaneCapabilities( TUid::Uid( EEikStatusPaneUidNavi ) ); + + if ( naviCapabilities.IsPresent() && + naviCapabilities.IsAppOwned() ) + { + CAknNavigationControlContainer* naviContainer = + static_cast( statusPane->ControlL( + TUid::Uid( EEikStatusPaneUidNavi ) ) ); + + if ( naviContainer->Top() == iIndicatorContainer ) + { + naviContainer->Pop( iIndicatorContainer ); + iIndicatorController->MakeVisible( EFalse ); + } + + if ( aSetOwnIndicators ) + { + naviContainer->PushL( *iIndicatorContainer ); + naviContainer->MakeVisible( EFalse ); + iIndicatorController->MakeVisible( ETrue ); + } + + statusPane->SwitchLayoutL( aNewPaneResourceId ); + + naviCapabilities = statusPane->PaneCapabilities( TUid::Uid( EEikStatusPaneUidNavi ) ); + + if ( !naviCapabilities.IsInCurrentLayout() && + aSetOwnIndicators ) + { + naviContainer->Pop( iIndicatorContainer ); + iIndicatorController->MakeVisible( EFalse ); + } + else if ( aSetOwnIndicators ) + { + naviContainer->MakeVisible( ETrue ); + iIndicatorController->SetRect( iIndicatorContainer->Rect() ); + iIndicatorController->LayoutIndicators(); + } + + statusPane->ApplyCurrentSettingsL(); + statusPane->DrawNow(); + iCoeEnv->WsSession().Flush(); + } + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ActivateFocusedMediaL +// Sends an activation event to focused media object. +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::ActivateFocusedMediaL() + { + iPresentation->SubmitEventL( KActivate, iPresentation->FocusedObject() ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::PresentationTextL +// All texts inside presentation are concatenated into +// one text so that they are sepatated with two paragraph characters from each +// others. +// ---------------------------------------------------------------------------- +// +HBufC* CSmilPlayerPresentationController::PresentationTextL() + { + CRendererArray* renderers = iMediaFactory->GetRenderers(); + + if ( !renderers ) + { + return NULL; + } + + TChar PS( CEditableText::EParagraphDelimiter ); // Unicode paragraph separator + + TInt totalSize = 0; + CPlainText* textTemp; + TInt count = renderers->Count(); + + // Count the total length of all text renderers + for ( TInt current = 0; current < count ; current++ ) + { + if ( renderers->At( current )->MediaType() == EMsgMediaText || + renderers->At( current )->MediaType() == EMsgMediaXhtml ) + { + textTemp = static_cast( renderers->At( current ) )->GetText(); + TInt textSize = textTemp->DocumentLength(); + // + 2 is for two Unicode paragraph separator + totalSize = totalSize + textSize + 2; + } + } + + HBufC* resultHeap = NULL; + if ( totalSize > 0 ) + { + // Create buffer for total size of all texts + resultHeap = HBufC::NewLC( totalSize + 1 ); + HBufC* tempHeap = HBufC::NewLC( totalSize ); + TPtr ptrResultHeap = resultHeap->Des(); + TPtr ptrTempHeap = tempHeap->Des(); + + for ( TInt current = 0; current < count; current++ ) + { + if ( renderers->At( current )->MediaType() == EMsgMediaText || + renderers->At( current )->MediaType() == EMsgMediaXhtml ) + { + textTemp = static_cast( renderers->At( current ) )->GetText(); + + TInt position = textTemp->DocumentLength(); + + // Adding 2 paragragh separators and current text renderer's text. + textTemp->InsertL( position, PS ); + textTemp->InsertL( position, PS ); + + textTemp->Extract( ptrTempHeap ); + ptrResultHeap.Append( ptrTempHeap ); + } + } + + CleanupStack::PopAndDestroy( tempHeap ); + CleanupStack::Pop( resultHeap ); + } + + return resultHeap; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::PresentationContains +// Performs a check whether presentation contains specified type of renderer. +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::PresentationContains( const TMsgMediaType& aType ) const + { + CRendererArray* renderers = iMediaFactory->GetRenderers(); + + if ( !renderers ) + { + return EFalse; + } + + for ( TInt current = 0; current < renderers->Count(); current++ ) + { + if ( renderers->At( current )->MediaType() == aType ) + { + return ETrue; + } + } + return EFalse; + } + + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::PlayPauseTappedL +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::PlayPauseTappedL() + { +#ifdef RD_SCALABLE_UI_V2 + TInt state = iPresentation->State(); + if ( state == CSmilPresentation::EPlaying ) + { + iParent->PauseTappedL(); + } + else if ( state == CSmilPresentation::EPaused ) + { + iParent->PlayTappedL(); + } +#endif + } + + +#ifdef RD_SCALABLE_UI_V2 +// --------------------------------------------------------- +// CSmilPlayerPresentationController::HandlePointerEventL +// --------------------------------------------------------- +// +void CSmilPlayerPresentationController::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + if ( AknLayoutUtils::PenEnabled() ) + { + switch ( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Up: + case TPointerEvent::EButton1Down: + { + // The check needs to be here as CSmilObject is null on this state + if ( iPresentation->FocusedObject() ) + { + TRect focusedRect; + if ( iPresentation->FocusedObject()->GetRegion() ) + { + focusedRect = iPresentation->FocusedObject()->GetRegion()->GetRectangle(); + // Returned rect is relative to presentation rect, we need window relative rect + focusedRect.Move( iPresentationRect.iTl ); + } + + if ( !focusedRect.IsEmpty() && + !focusedRect.Contains( aPointerEvent.iPosition ) ) + { + // First tap on the region + // pointerevent is window related, we have to give smilengine presentation related + TPointerEvent pointerEvent( aPointerEvent ); + pointerEvent.iPosition -= iPresentationRect.iTl; + iPresentation->HandlePointerEventL( pointerEvent ); + iParent->DeactivateScrollingL(); + iTappedObject = NULL; + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + iTappedObject = iPresentation->FocusedObject(); + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Up && iTappedObject == iPresentation->FocusedObject() ) + { + iParent->HandleSelectionKeyL(); + } + } + break; + } + default: + break; + } + } + } + + +#else +void CSmilPlayerPresentationController::HandlePointerEventL( const TPointerEvent& /*aPointerEvent*/ ) + { + } +#endif // RD_SCALABLE_UI_V2 + +// --------------------------------------------------------- +// CSmilPlayerPresentationController::InitializeDoubleBufferL +// +// Initializes double buffer bitmap, device and context. +// --------------------------------------------------------- +// +void CSmilPlayerPresentationController::InitializeDoubleBufferL() + { + iBufferBitmap = new( ELeave ) CWsBitmap(); + + if ( iEikonEnv->DefaultDisplayMode() < EColor16MU ) + { + User::LeaveIfError( iBufferBitmap->Create( Size(), EColor16M ) ); + } + else + { + User::LeaveIfError( iBufferBitmap->Create( Size(), SystemGc().Device()->DisplayMode() ) ); + } + + // Sets the twip-size of the bitmap by converting the bitmaps pixel-size from pixels to twips, + // using the conversion functions in the specified graphics device map. This is needed to retrieve + // correct font from FBS server. + iBufferBitmap->SetSizeInTwips( SystemGc().Device() ); + + iBufferDevice = CFbsBitmapDevice::NewL( iBufferBitmap ); + User::LeaveIfError( iBufferDevice->CreateContext( iBufferContext ) ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::IsFocused +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::IsFocused( const TMsgMediaType& aMediaType ) const + { + TBool result( EFalse ); + CSmilObject* focused = iPresentation->FocusedObject(); + + if ( focused && focused->IsMedia() ) + { + CSmilMedia* media = static_cast( focused ); + if ( media ) + { + CSmilMediaRendererBase* renderer = static_cast( media->GetRenderer() ); + + if ( renderer && + renderer->MediaType() == aMediaType ) + { + // Media object type is the same as parameter. + result = ETrue; + } + } + } + return result; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::ActivateFocusedL +// ---------------------------------------------------------------------------- +// +void CSmilPlayerPresentationController::ActivateFocusedL() + { + CSmilObject* focused = iPresentation->FocusedObject(); + + if ( focused ) + { + CSmilMedia* media = static_cast( focused ); + CSmilMediaRendererBase* renderer = static_cast( media->GetRenderer() ); + + SetStatusPaneVisibilityL( ETrue ); + + TRAPD( error, renderer->ActivateRendererL() ); + + SetStatusPaneVisibilityL( EFalse ); + + User::LeaveIfError( error ); + } + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::OwnStatusPaneVisible +// ---------------------------------------------------------------------------- +// +TBool CSmilPlayerPresentationController::OwnStatusPaneVisible() + { + return iOwnStatusPaneVisible; + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerPresentationController::UseWidescreenStatusPane +// ---------------------------------------------------------------------------- +TBool CSmilPlayerPresentationController::UseWidescreenStatusPane() + { + return Layout_Meta_Data::IsLandscapeOrientation() && AknLayoutUtils::PenEnabled(); + } + +// End of File +