--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpframework/upnpcommonui/src/upnpvideoplayerdialog.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,1663 @@
+/*
+* Copyright (c) 2005-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: Source file for UPnP Video player
+*
+*/
+
+
+// INCLUDE FILES
+// System
+#include <aknlists.h>
+#include <AknIconArray.h>
+#include <aknnavilabel.h>
+#include <aknnavide.h>
+#include <akntitle.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <layoutmetadata.cdl.h>
+#include <AknWaitDialog.h> // CAknWaitDialog
+#include <aknnotewrappers.h>
+#include <AknVolumePopup.h>
+#include<remconinterfaceselector.h> //for CRemConInterfaceSelector
+#include<remconcoreapitarget.h> //for CRemConCoreApiTarget
+
+// upnp stack api
+#include <upnpitem.h>
+#include <upnpstring.h>
+#include <upnpdevice.h>
+
+// upnpframework / avcontroller api
+#include "upnpavrenderingsession.h"
+#include "upnpavdevice.h"
+
+// upnpframework / avcontroller helper api
+#include "upnpitemutility.h" // ResourceFromItemL
+
+// upnpframework / internal api's
+#include "upnpcommonutils.h"
+#include "upnpcdsreselementutility.h"
+
+// commonui internal
+#include <upnpcommonui.rsg>
+#include <upnpcommonui.mbg>
+#include "upnpcommonui.h"
+#include "upnpcommonui.hrh"
+#include "upnpvideoplayerdialog.h"
+#include "upnpperiodic.h"
+
+_LIT( KComponentLogfile, "commonui.txt" );
+#include "upnplog.h"
+
+// CONSTANTS
+const TInt KMPOneSecond(1000000);
+const TInt KOneHourInSeconds(3600);
+const TInt KMaxVolume(100);
+const TInt KMiniumVolume(0);
+const TInt KGetPosInfoPlaybackInterval( 10 );
+const TInt KGetPosInfoBeforePlaybackInterval( 1 );
+const TInt KLength = 100;
+const TInt KDotLength = 3;
+const TInt KVolumeStep = 1;
+const TInt KVolumeInterval = 10;
+
+_LIT( KAknMultiViewsMbmFileName, "\\resource\\apps\\upnpcommonui.mbm" );
+_LIT( KDot, "..." );
+
+// ============================ MEMBER FUNCTIONS ============================
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::NewL
+// Alternate two-phased constructor.
+// --------------------------------------------------------------------------
+//
+CUPnPVideoPlayerDlg* CUPnPVideoPlayerDlg::NewL(
+ MUPnPAVRenderingSession& aRenderingSession,
+ const CUpnpObject& aObject,
+ CUPnPCommonUI& aCommonUI )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::NewL" );
+
+ CUPnPVideoPlayerDlg* self = NULL;
+ self = new ( ELeave ) CUPnPVideoPlayerDlg( aRenderingSession,
+ aObject,
+ aCommonUI );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ __LOG( "CUPnPVideoPlayerDlg::NewL End" );
+ return self;
+ }
+
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::ConstructL
+// Symbian 2nd phase constructor can leave.
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::ConstructL( )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::ConstructL" );
+
+ iAdjustingVolume = EFalse;
+
+ // Resolve the target device capabilities
+ ResolveTargetDeviceCapabilitiesL();
+
+ iMinSecFormatString =
+ iEikonEnv->AllocReadResourceL( R_QTN_TIME_DURAT_MIN_SEC );
+
+ iHourMinSecFormatString =
+ iEikonEnv->AllocReadResourceL( R_QTN_TIME_DURAT_LONG );
+
+ iNaviPane = static_cast<CAknNavigationControlContainer*>(
+ CEikStatusPaneBase::Current()->
+ ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+
+ iNaviPane->Pop();
+
+ iOriginalTitleText = HBufC16::NewL( KMaxFileName );
+
+ iTimer = CUPnPPeriodic::NewL( CActive::EPriorityStandard );
+
+ iCurrentVolume = KMiniumVolume; //0
+
+ //create a vertical volume controller
+ iVolumePopup = CAknVolumePopup::NewL( NULL, ETrue );
+
+ //iVolumePopup->SetObserver( this );
+
+ //set value to the volume popup
+ iVolumePopup->SetRange( KMiniumVolume , KMaxVolume );
+ iVolumePopup->SetStepSize( KVolumeStep );
+ iVolumePopup->SetDefaultValue( KMiniumVolume );
+
+ // Remote control server command repeat timer.
+ iVolumeTimer = CUPnPPeriodic::NewL( EPriorityNormal );
+
+ // Open a connection to receive Volume Key events.
+ iInterfaceSelector = CRemConInterfaceSelector::NewL();
+
+ // owned by CRemConInterfaceSelector instance
+ iCoreTarget = CRemConCoreApiTarget::NewL( *iInterfaceSelector,*this );
+ TRAPD( err, iInterfaceSelector->OpenTargetL() );
+ if( err != KErrNone )
+ {
+ __LOG1("Leave occured in OpenTargetL %d", err);
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::ConstructL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::CUPnPVideoPlayerDlg
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CUPnPVideoPlayerDlg::CUPnPVideoPlayerDlg(
+ MUPnPAVRenderingSession& aRenderingSession,
+ const CUpnpObject& aObject,
+ CUPnPCommonUI& aCommonUI ):
+ iRendSession(aRenderingSession),
+ iCommonUI(aCommonUI)
+
+
+ {
+ __LOG( "CUPnPVideoPlayerDlg::CUPnPVideoPlayerDlg" );
+ iTargetDevice = &( iRendSession.Device() );
+ iItem = &aObject;
+ iAction = CUPnPCommonUI::EUPnPNone;
+
+ __LOG( "CUPnPVideoPlayerDlg::CUPnPVideoPlayerDlg End" );
+ }
+
+// --------------------------------------------------------------------------
+// Destructor
+// --------------------------------------------------------------------------
+//
+CUPnPVideoPlayerDlg::~CUPnPVideoPlayerDlg()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::~CUPnPVideoPlayerDlg" );
+
+ if( iVolumeTimer )
+ {
+ iVolumeTimer->Cancel();
+ delete iVolumeTimer;
+ }
+
+ if( iVolumePopup )
+ {
+ iVolumePopup->CloseVolumePopup();
+ }
+
+ delete iVolumePopup;
+ delete iInterfaceSelector;
+ if( iVideoPlaybackWaitNote )
+ {
+ TRAP_IGNORE( iVideoPlaybackWaitNote->ProcessFinishedL() );
+ delete iVideoPlaybackWaitNote;
+ iVideoPlaybackWaitNote = NULL;
+ }
+
+ if( iTimer )
+ {
+ iTimer->Cancel();
+ }
+
+ delete iTimer;
+
+
+ delete iMinSecFormatString;
+ delete iHourMinSecFormatString;
+ delete iTimerNavi;
+
+ delete iNaviDecorator;
+
+ delete iOriginalTitleText;
+ TRAP_IGNORE( iRendSession.StopL() );
+ iRendSession.RemoveObserver();
+
+ __LOG( "CUPnPVideoPlayerDlg::~CUPnPVideoPlayerDlg End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::PreLayoutDynInitL();
+// called by framework before dialog is shown
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::PreLayoutDynInitL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::PreLayoutDynInitL" );
+
+
+ // Browse dialog title text
+ TUid titlePaneUid;
+ titlePaneUid.iUid = EEikStatusPaneUidTitle;
+ CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+ CEikStatusPaneBase::TPaneCapabilities titlesubPane =
+ statusPane->PaneCapabilities( titlePaneUid );
+
+
+ if( titlesubPane.IsPresent() &&
+ titlesubPane.IsAppOwned() )
+ {
+ CAknTitlePane* titlePane =
+ (CAknTitlePane*) statusPane->ControlL( titlePaneUid );
+ // Take backup of title text
+ iOriginalTitleText->Des().Copy( *titlePane->Text() );
+
+ HBufC *tmpbuf = UpnpString::ToUnicodeL( iItem->Title() );
+ CleanupStack::PushL( tmpbuf );
+ titlePane->SetTextL( *tmpbuf );
+ CleanupStack::PopAndDestroy();
+ }
+
+
+ // Start to observe the rendering session
+ iRendSession.RemoveObserver();
+ iRendSession.SetObserver( *this );
+
+ PreparePlayBackL();
+
+ StartWaitNoteL();
+
+/*
+// Temporally commented out. Will be uncommented when UpnpAvController
+// provides cancel functionaly fot SetUri action (Upnp Fw 2.5)
+ if( iExitCode == EEikBidCancel )
+ {
+ // Cancel the SetUri
+ //iRendSession.Cancel();
+ // Send Stop
+ TRAP_IGNORE( iRendSession.StopL() );
+ ClearTitleL();
+ iExitCode = KErrCancel;
+ }
+*/
+ User::LeaveIfError( iExitCode );
+
+ if ( !Layout_Meta_Data::IsLandscapeOrientation() )
+ {
+ iEikonEnv->AppUiFactory()->StatusPane()->SwitchLayoutL(
+ R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+ }
+ // Volume level to 0
+ iCurrentVolume = KMiniumVolume;
+
+ // try to get volume level from renderer
+ TRAPD( err, iRendSession.GetVolumeL() );
+ if( !err )
+ {
+ iAdjustingVolume = ETrue;
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::PreLayoutDynInitL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::OkToExitL(TInt aButtonId)
+// called by framework when the softkey is pressed
+// may leave without trap(System error)
+// --------------------------------------------------------------------------
+//
+TBool CUPnPVideoPlayerDlg::OkToExitL( TInt aButtonId )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::OkToExitL" );
+
+ TBool retval = EFalse;
+ TInt error = KErrNone;
+
+ switch ( aButtonId )
+ {
+ case KErrSessionClosed: //either MS or MR disappears
+ case KErrDisconnected: //fall through
+ {
+ // Connection failed so we have to close player
+ TRAP_IGNORE( ClearTitleL() );
+ return ETrue;
+ }
+ case EUPnPPauseCmd:
+ {
+ iAction = CUPnPCommonUI::EUPnPShow;
+ TRAP( error, iRendSession.PauseL() );
+ if ( KErrNone != error )
+ {
+
+ __LOG1( "CUPnPVideoPlayerDialog::OkToExitL:Pause %d",
+ error );
+ }
+ break;
+ }
+ case EUPnPReplayCmd:
+ {
+ iAction = CUPnPCommonUI::EUPnPShow;
+
+ PreparePlayBackL();
+ iExitCode = KErrNone;
+ StartWaitNoteL();
+/*
+// Temporally commented out. Will be uncommented when UpnpAvController
+// provides cancel functionaly fot SetUri action (Upnp Fw 2.5)
+
+ if( iExitCode == EEikBidCancel ||
+ iExitCode == KErrCancel )
+ {
+ // Cancel the SetUri
+ //iRendSession.Cancel();
+ // Send Stop
+ TRAP_IGNORE( iRendSession.StopL() );
+ }
+*/
+ if( iExitCode == KErrSessionClosed ||
+ iExitCode == KErrDisconnected )
+ {
+ TryExitL( iExitCode );
+ }
+ break;
+ }
+ case EUPnPContinueCmd:
+ {
+ iAction = CUPnPCommonUI::EUPnPShow;
+ TRAP( error, iRendSession.PlayL() );
+ if ( KErrNone != error )
+ {
+ __LOG1( "CUPnPVideoPlayerDialog::\
+ OkToExitL: Continue %d", error );
+ }
+ break;
+ }
+ case EUPnPBackCmd: //quit the video player dialog
+ {
+ TRAP_IGNORE( ClearTitleL() ); //avoid system error
+ return ETrue;
+ }
+ case EUPnPStopCmd:
+ {
+ iAction = CUPnPCommonUI::EUPnPShow;
+ TRAP( error, iRendSession.StopL() );
+ if ( KErrNone != error )
+ {
+
+ __LOG1( "CUPnPVideoPlayerDialog::\
+ OkToExitL: Stop %d", error );
+ }
+ break;
+ }
+ case EAknSoftkeyOk:
+ {
+ break;
+ }
+ case EAknSoftkeyCancel:
+ case EAknSoftkeyExit:
+ case EAknCmdExit: // fall through
+ case EEikCmdExit:
+ {
+ TRAP_IGNORE( ClearTitleL() );
+ return ETrue; //back to previous dialog
+ }
+ default:
+ {
+ // ignore
+ break;
+ }
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::OkToExitL End" );
+ return retval;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::UpdateSoftkeysL
+// --------------------------------------------------------------------------
+void CUPnPVideoPlayerDlg::UpdateSoftkeysL( TInt aState )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::UpdateSoftkeysL" );
+
+
+ if ( aState == EUPnPVideoPlay &&
+ iPauseCapability )
+ {
+ ButtonGroupContainer().SetCommandSetL(
+ R_UPNPCOMMONUI_SOFTKEYS_PAUSE_STOP );
+ ButtonGroupContainer().DrawDeferred();
+ }
+ else if ( aState == EUPnPVideoPlay &&
+ !iPauseCapability )
+ {
+ ButtonGroupContainer().SetCommandSetL(
+ R_UPNPCOMMONUI_SOFTKEYS_EMPTY_STOP );
+ ButtonGroupContainer().DrawDeferred();
+ }
+ else if ( aState == EUPnPVideoPause )
+ {
+ ButtonGroupContainer().SetCommandSetL(
+ R_UPNPCOMMONUI_SOFTKEYS_CONTINUE_STOP );
+ ButtonGroupContainer().DrawDeferred();
+ }
+ else if ( aState == EUPnPVideoStop )
+ {
+ ButtonGroupContainer().SetCommandSetL(
+ R_UPNPCOMMONUI_SOFTKEYS_REPLAY_BACK );
+ ButtonGroupContainer().DrawDeferred();
+ }
+ __LOG( "CUPnPVideoPlayerDlg::UpdateSoftkeysL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::OfferKeyEventL
+// --------------------------------------------------------------------------
+//
+TKeyResponse CUPnPVideoPlayerDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::OfferKeyEventL" );
+
+ TKeyResponse response = EKeyWasConsumed;
+ TInt error = KErrNone;
+ if ( aType == EEventKeyUp )
+ {
+ if ( aKeyEvent.iScanCode == EStdKeyLeftArrow )
+ {
+ // Adjust volume if the target rendering device supports the
+ // feature, and we are not waiting for a response for a previous
+ // set volume action.
+
+ iVolumeUp = EFalse;
+ ChangeVolume( this );
+ }
+ else if ( aKeyEvent.iScanCode == EStdKeyRightArrow )
+ {
+ // Adjust volume if the target rendering device supports the
+ // feature, and we are not waiting for a response for a previous
+ // set volume action.
+ iVolumeUp = ETrue;
+ ChangeVolume( this );
+ }
+
+ if( KErrNotReady == error ||
+ KErrDisconnected == error )
+ {
+ TryExitL( error );
+ }
+ }
+ else if( aType == EEventKey && aKeyEvent.iCode == EKeyEscape )
+ {
+ CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+ }
+ __LOG( "CUPnPVideoPlayerDlg::OfferKeyEventL End" );
+ return response;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::ShowVolumeIndicatorL
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::ShowVolumeIndicatorL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::ShowVolumeIndicatorL" );
+
+ if ( iCurrentVolume >= KMiniumVolume && iCurrentVolume <= KMaxVolume )
+ {
+ __LOG( " - display volume popup indicator" );
+ if ( iVolumePopup )
+ {
+ iVolumePopup->SetValue( iCurrentVolume );
+ iVolumePopup->ShowVolumePopupL(); // will close after 1s
+ }
+ }
+ else
+ {
+ HideVolumeIdicator( this );
+ }
+ __LOG( "CUPnPVideoPlayerDlg::ShowVolumeIndicatorL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::HideVolumeIdicator
+// --------------------------------------------------------------------------
+//
+TInt CUPnPVideoPlayerDlg::HideVolumeIdicator( TAny* aPtr )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::HideVolumeIdicator" );
+
+ CUPnPVideoPlayerDlg* self =
+ static_cast<CUPnPVideoPlayerDlg*>( aPtr );
+
+ if ( self->iVolumePopup )
+ {
+ self->iVolumePopup->CloseVolumePopup();
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::HideVolumeIdicator End" );
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::TimerIndicatorL
+// --------------------------------------------------------------------------
+//
+TInt CUPnPVideoPlayerDlg::TimerIndicatorL( TAny* aPtr )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::TimerIndicatorL" );
+ CUPnPVideoPlayerDlg* self =
+ static_cast<CUPnPVideoPlayerDlg*>(aPtr);
+
+ if( self->iTotalLengthInSeconds > 0)
+ {
+ if( self->iPlaybackPosInSeconds >= self->iTotalLengthInSeconds )
+ {
+ self->iTimer->Cancel();
+ self->iRendererPlaying = EFalse;
+ self->iPlaybackPosInSeconds = 0;
+ self->iTotalLengthInSeconds = 0;
+ return KErrNone;
+ }
+ }
+
+ // Increase the count of timer expirations
+ self->iTimerRefresh++;
+
+ // Increase the elapsed time by one (this timer elapses once a second).
+ if ( self->iRendererPlaying && !self->iPause )
+ {
+ self->iPlaybackPosInSeconds++;
+ }
+
+ self->UpdateNaviPaneL();
+
+ // Refresh the position after every KGetPosInfoPlaybackInterval
+ // secs from the beginning of play if necessary
+ // (total length not set set at that moment)
+ if( self->iTimerRefresh >= self->iGetPositionInfoInterval )
+ {
+ self->iTimerRefresh = 0;
+ TRAPD( err, self->iRendSession.GetPositionInfoL() );
+ if ( err )
+ {
+ __LOG1( "TimerIndicatorL GetPositionInfoL err: %d", err );
+ }
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::TimerIndicatorL End" );
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::ClearTitleL
+// Sets title back to default.
+// --------------------------------------------------------------------------
+void CUPnPVideoPlayerDlg::ClearTitleL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::ClearTitleL" );
+
+ TUid titlePaneUid;
+ titlePaneUid.iUid = EEikStatusPaneUidTitle;
+ CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+ CEikStatusPaneBase::TPaneCapabilities titlesubPane =
+ statusPane->PaneCapabilities( titlePaneUid );
+
+ CAknTitlePane* titlePane =
+ ( CAknTitlePane* ) statusPane->ControlL( titlePaneUid );
+ // Set original text
+ titlePane->SetTextL( *iOriginalTitleText );
+ iNaviPane->Pop();
+ __LOG( "CUPnPVideoPlayerDlg::ClearTitleL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerView::UpdateNaviPaneL()
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::UpdateNaviPaneL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::UpdateNaviPaneL" );
+
+ TTime posTime = TTime( ( iPlaybackPosInSeconds )*KMPOneSecond );
+ TTime durTime = TTime( iTotalLengthInSeconds*KMPOneSecond );
+
+ TBuf<16> pos;
+ TBuf<16> dur;
+
+ if ( iTotalLengthInSeconds > 0 &&
+ iTotalLengthInSeconds < KOneHourInSeconds )
+ {
+ // Format time to user readable format. (min:sec)
+ posTime.FormatL( pos, *iMinSecFormatString );
+ durTime.FormatL( dur, *iMinSecFormatString );
+ }
+ else
+ {
+ // Format time to user readable format. (hour:min:sec)
+ posTime.FormatL( pos, *iHourMinSecFormatString );
+ durTime.FormatL( dur, *iHourMinSecFormatString );
+ }
+ if ( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
+ {
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( pos );
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( dur );
+ }
+ // if duration greated than 0, show postion in 00:00/00:00 format
+ if ( iTotalLengthInSeconds > 0 )
+ {
+ CDesCArrayFlat* strings = new (ELeave) CDesCArrayFlat(2);
+ CleanupStack::PushL( strings );
+ strings->AppendL( pos ); //First string (position)
+ strings->AppendL( dur ); //Second string (duration)
+ delete iTimerNavi; iTimerNavi = NULL;
+ iTimerNavi = StringLoader::LoadL( R_UPNPCOMMONUI_VIDEO_NAVI_TIME,
+ *strings,
+ iEikonEnv );
+
+ SetNaviLabelL( *iTimerNavi );
+
+ CleanupStack::PopAndDestroy( strings ); // strings & stringholder
+ }
+ else // show position in 00:00:00 format
+ {
+ SetNaviLabelL( pos );
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::UpdateNaviPaneL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerView::SetNaviLabelL
+// Set navigation label from descriptor.
+// (other items were commented in a header).
+// --------------------------------------------------------------------------
+void CUPnPVideoPlayerDlg::SetNaviLabelL( const TDesC& aText )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::SetNaviLabelL" );
+
+ TUid naviPaneUid;
+ naviPaneUid.iUid = EEikStatusPaneUidNavi;
+
+ // check if we can access the navi pane
+ if ( CheckStatusPaneCapabilities( naviPaneUid ) )
+ {
+ CAknNavigationControlContainer* naviPane =
+ static_cast<CAknNavigationControlContainer*>
+ ( iEikonEnv->AppUiFactory()->StatusPane()->ControlL(
+ naviPaneUid ) );
+
+ if ( iNaviDecorator &&
+ ( iNaviDecorator->ControlType() ==
+ CAknNavigationDecorator::ENaviLabel ) )
+ {
+ // Set the navi text
+ CAknNaviLabel* naviLabel = static_cast<CAknNaviLabel*>
+ ( iNaviDecorator->DecoratedControl() );
+ naviLabel->SetTextL( aText );
+ }
+ else
+ {
+ // create the navigation pane label
+ iNaviDecorator = naviPane->CreateNavigationLabelL( aText );
+ }
+ naviPane->PushL( *iNaviDecorator );
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::SetNaviLabelL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::CheckStatusPaneCapabilities
+// Check the status pane capabilities.
+// (other items were commented in a header).
+// --------------------------------------------------------------------------
+//
+TBool CUPnPVideoPlayerDlg::CheckStatusPaneCapabilities(
+ const TPaneId& aPaneId )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::CheckStatusPaneCapabilities" );
+
+ CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+
+ CEikStatusPaneBase::TPaneCapabilities subPane =
+ statusPane->PaneCapabilities( aPaneId );
+ __LOG( "CUPnPVideoPlayerDlg::CheckStatusPaneCapabilities End" );
+ // check if we can access the status pane
+ return ( subPane.IsPresent() &&
+ subPane.IsAppOwned() );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::CreateCustomControlL() const
+// Draws the display
+// --------------------------------------------------------------------------
+//
+SEikControlInfo CUPnPVideoPlayerDlg::CreateCustomControlL( TInt aControlType )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::CreateCustomControlL" );
+
+ SEikControlInfo controlInfo;
+ controlInfo.iControl = NULL;
+ controlInfo.iTrailerTextId = 0;
+ controlInfo.iFlags = 0;
+ switch ( aControlType )
+ {
+ case ECustomCtrlDlgCtCustomControl:
+ {
+ iContainer = new (ELeave) CCustomCtrlDlgCustomControl();
+ controlInfo.iControl = iContainer;
+ ( (CCustomCtrlDlgCustomControl*)controlInfo.iControl )->
+ SetRenderingSession( iRendSession );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ __LOG( "CUPnPVideoPlayerDlg::CreateCustomControlL End" );
+ return controlInfo;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::VolumeResult()
+// Video volume callback
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::VolumeResult( TInt aError, TInt aVolumeLevel,
+ TBool /*aActionResponse*/ )
+ {
+ __LOG2( "CUPnPVideoPlayerDlg::VolumeResult err=%d vol=%d",
+ aError, aVolumeLevel );
+
+ iAdjustingVolume = EFalse;
+
+ if( aError == KErrNone )
+ {
+ iCurrentVolume = aVolumeLevel;
+ }
+ else
+ {
+ // ignore error
+ }
+ TRAP_IGNORE( ShowVolumeIndicatorL() );
+ __LOG( "CUPnPVideoPlayerDlg::VolumeResult End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::InteractOperationComplete() const
+// Video operation callback
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::InteractOperationComplete(
+ TInt aError,
+ TUPnPAVInteractOperation aOperation )
+ {
+
+ __LOG1( "CUPnPVideoPlayerDlg::InteractOperationComplete %d", aError );
+ TInt error = KErrNone;
+ TRAP( error, InteractOperationCompleteL( aError, aOperation ) )
+ __LOG( "CUPnPVideoPlayerDlg::InteractOperationComplete" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::InteractOperationCompleteL() const
+// leave function to handle callback
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::InteractOperationCompleteL(
+ TInt aError,
+ TUPnPAVInteractOperation aOperation )
+ {
+
+ __LOG1( "CUPnPVideoPlayerDlg::InteractOperationCompleteL %d", aError );
+ // Show error note if there was an error
+
+ if ( aError != KErrNone )
+ {
+ FinishWaitNoteL();
+ //stop timer
+ HideVolumeIdicator( this );
+ iTimer->Cancel();
+ iRendererPlaying = EFalse;
+ UpdateSoftkeysL( EUPnPVideoStop );
+ iAction = CUPnPCommonUI::EUPnPShow;
+ HandleErrorL( aError );
+ return;
+ }
+
+ if( iExitCode == EEikBidCancel ) //if video playing is cancelled
+ {
+ iRendSession.StopL();
+ iExitCode = KErrNone;
+ }
+ switch(aOperation)
+ {
+ case EUPnPAVPlay:
+ {
+ FinishWaitNoteL();
+ ContinueAfterPauseL();
+ break;
+ }
+ case EUPnPAVPlayUser: // fall through
+ {
+ //display timer
+ StartDisplayTimer();
+ // Query the position info (track duration, position, etc.)
+ TRAP_IGNORE( iRendSession.GetPositionInfoL() );
+ ContinueAfterPauseL();
+ break;
+ }
+ case EUPnPAVPause: // fall through
+ case EUPnPAVPauseUser:
+ {
+ iPause = ETrue;
+ iRendererPlaying = EFalse;
+ iTimer->Cancel();
+ UpdateSoftkeysL( EUPnPVideoPause );
+ break;
+ }
+ case EUPnPAVStop: // fall through
+ case EUPnPAVStopUser:
+ {
+ HideVolumeIdicator( this );
+ iTimer->Cancel();
+ iRendererPlaying = EFalse;
+ iPlaybackPosInSeconds = 0;
+ iTotalLengthInSeconds = 0;
+ UpdateSoftkeysL( EUPnPVideoStop );
+ }
+ break;
+ default:
+ {
+ // unknown operation
+ __PANICD( __FILE__, __LINE__ );
+ break;
+ }
+ }
+ __LOG( "CUPnPVideoPlayerDlg::InteractOperationCompleteL" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::InteractOperationComplete() const
+// Video operation callback
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::MuteResult( TInt aError, TBool aMute,
+ TBool /*aActionResponse*/ )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::MuteResult" );
+ __LOG3( "MuteResult - aError %d aMute %d iVolume %d ",
+ aError, aMute, iCurrentVolume );
+
+ if( KErrNone == aError )
+ {
+ if( aMute )
+ {
+ iCurrentVolume = KMiniumVolume;
+ }
+ if ( iVolumePopup)
+ {
+ iVolumePopup->SetValue( iCurrentVolume );
+ // will close after 1s
+ TRAP_IGNORE( iVolumePopup->ShowVolumePopupL() );
+ }
+ }
+ else
+ {
+ HideVolumeIdicator( this );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::PositionInfoResult
+// UPnP AV Controller calls this method as a response to Position
+// Info action. The current position and the total length of the
+// track that is currently playing is returned. The results are in
+// (hh:mm:ss) format.
+// --------------------------------------------------------------------------
+void CUPnPVideoPlayerDlg::PositionInfoResult( TInt aError,
+ const TDesC8& aTrackPosition,
+ const TDesC8& aTrackLength )
+ {
+
+ __LOG1( "CUPnPVideoPlayerDlg::PositionInfoResult %d", aError );
+ if( KErrNone == aError )
+ {
+ if( aTrackPosition.Length() )
+ {
+ TLex8 lex( aTrackPosition );
+ TInt tmpint;
+ TChar ch;
+ if ( lex.Val( tmpint ) == KErrNone )
+ {
+ iPlaybackPosInSeconds = tmpint * 3600;
+ }
+ ch = lex.Get();
+ if ( lex.Val( tmpint ) == KErrNone )
+ {
+ iPlaybackPosInSeconds = iPlaybackPosInSeconds + tmpint * 60;
+ }
+ ch = lex.Get();
+ if ( lex.Val( tmpint ) == KErrNone )
+ {
+ iPlaybackPosInSeconds = iPlaybackPosInSeconds + tmpint;
+ }
+ }
+ if( aTrackLength.Length() )
+ {
+ iTotalLengthInSeconds = 0;
+ TLex8 lex1( aTrackLength );
+ TInt tmpint;
+ TChar ch;
+ if ( lex1.Val( tmpint ) == KErrNone )
+ {
+ iTotalLengthInSeconds = tmpint * 3600;
+ }
+ ch = lex1.Get();
+ if ( lex1.Val( tmpint ) == KErrNone )
+ {
+ iTotalLengthInSeconds = iTotalLengthInSeconds + tmpint * 60;
+ }
+ ch = lex1.Get();
+ if ( lex1.Val( tmpint ) == KErrNone )
+ {
+ iTotalLengthInSeconds = iTotalLengthInSeconds + tmpint;
+
+ }
+ }
+ }// if( KErrNone == aError )
+
+ if ( iPlaybackPosInSeconds > 0 )
+ {
+ // after knowing remote renderer has started to play at the first
+ // time, set GetPositonInfo frequency and update the elapsed time.
+ if ( iGetPositionInfoInterval != KGetPosInfoBeforePlaybackInterval )
+ {
+ iGetPositionInfoInterval = KGetPosInfoPlaybackInterval;
+ UpdateNaviPaneL();
+ }
+ if ( iPause )
+ {
+ iRendererPlaying = EFalse;
+ }
+ else
+ {
+ iRendererPlaying = ETrue;
+ }
+ }
+ __LOG( "CUPnPVideoPlayerDlg::PositionInfoResult End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::SetURIResult
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::SetURIResult( TInt aError )
+ {
+
+ TRAP_IGNORE( SetURIResultL( aError ) );
+ __LOG( "CUPnPVideoPlayerDlg::SetURIResult End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::ContinueAfterPauseL
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::ContinueAfterPauseL()
+ {
+ iPause = EFalse;
+ UpdateSoftkeysL( EUPnPVideoPlay );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::SetURIResultL
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::SetURIResultL( TInt aError )
+ {
+ __LOG1( "CUPnPVideoPlayerDlg::SetURIResult %d", aError );
+
+
+ if( iExitCode == EEikBidCancel )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::SetURIResult Cancelled" );
+ return;
+ }
+
+ if( KErrNone != aError )
+ {
+ FinishWaitNoteL();
+ UpdateSoftkeysL( EUPnPVideoStop );
+ iAction = CUPnPCommonUI::EUPnPShow;
+ HandleErrorL( aError );
+ }
+ else
+ {
+ iGetPositionInfoInterval = KGetPosInfoBeforePlaybackInterval;
+ iRendSession.PlayL();
+ }
+ __LOG( "CUPnPVideoPlayerDlg::SetURIResult End" );
+ }
+
+//for media server or WLAN disappeared case
+void CUPnPVideoPlayerDlg::DismissItselfL( TInt aError )
+ {
+ HandleErrorL( aError );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::MediaRendererDisappeared
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::MediaRendererDisappeared(
+ TUPnPDeviceDisconnectedReason aReason )
+ {
+ __LOG( "[UPnPCommonUI]\t CUPnPVideoPlayerDlg: \
+Source Device Dissapeared" );
+ // only for renderer disappearing
+ if( aReason == EDisconnected )
+ {
+ TRAP_IGNORE( HandleErrorL( KErrSessionClosed ) );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPMusicPlayerDlg::HandleResourceChange
+// Called by framework when resource change event detected
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::HandleResourceChange(TInt aType)
+ {
+ __LOG( "CUPnPVideoPlayerDlg::HandleResourceChange" );
+
+ CAknDialog::HandleResourceChange( aType );
+
+ if ( aType == KAknsMessageSkinChange )
+ {
+ iContainer->DrawDeferred();
+ }
+ else if ( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ if (!Layout_Meta_Data::IsLandscapeOrientation())
+ {
+ TRAP_IGNORE( iEikonEnv->AppUiFactory()->StatusPane()->
+ SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ) );
+ }
+ SizeChanged();
+ iContainer->DrawDeferred();
+ }
+ else
+ {
+ // pass
+ }
+ __LOG( "CUPnPVideoPlayerDlg::HandleResourceChange End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPMusicPlayerDlg::SizeChanged
+// Called by framework after the dialog size has been changed
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::SizeChanged()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::SizeChanged" );
+
+ if ( iContainer )
+ {
+ TRect clientRect = Rect();
+
+ iContainer->SetRect( clientRect );
+ iContainer->DrawDeferred();
+ }
+ CAknDialog::SizeChanged();
+ __LOG( "CUPnPVideoPlayerDlg::SizeChanged End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::ResolveTargetDeviceCapabilitiesL
+// Resolves the target UPnP device capabilites.
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::ResolveTargetDeviceCapabilitiesL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::ResolveTargetDeviceCapabilitiesL" );
+ if( iTargetDevice )
+ {
+ iPauseCapability = iTargetDevice->PauseCapability();
+ iVolumeCapability = iTargetDevice->VolumeCapability();
+ __LOG1( "iPauseCapability:: %d", iPauseCapability );
+ __LOG1( "iVolumeCapability:: %d", iVolumeCapability );
+
+ }
+
+ __LOG( "CUPnPVideoPlayerDlg::ResolveTargetDeviceCapabilitiesL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::HandleErrorL
+// Resolves the target UPnP device capabilites.
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::HandleErrorL( TInt aError )
+ {
+ iCommonUI.GetUpnpAction( iAction );
+ if( KErrSessionClosed == aError ||
+ KErrDisconnected == aError )
+ {
+ iExitCode = aError;
+ TRAP_IGNORE( iRendSession.StopL() );
+ if( iVideoPlaybackWaitNote )
+ {
+ TRAP_IGNORE( iVideoPlaybackWaitNote->ProcessFinishedL() );
+ delete iVideoPlaybackWaitNote;
+ iVideoPlaybackWaitNote = NULL;
+ }
+
+ // When wait note is display or playback is ongoing, if received
+ // KErrDisconnected or KErrSessionClosed, then to exit the
+ // VideoPlayerDlg.
+ TryExitL( iExitCode );
+ }
+ else //common error codes
+ {
+ iCommonUI.HandleCommonErrorL( aError, NULL );
+ iAction = CUPnPCommonUI::EUPnPNone;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::StartWaitNoteL
+// --------------------------------------------------------------------------
+//
+TInt CUPnPVideoPlayerDlg::StartWaitNoteL()
+ {
+
+ __LOG( "CUPnPVideoPlayerDlg::StartWaitNoteL" );
+
+ TInt ret = KErrNone;
+ //start preparing playback
+ if( !iVideoPlaybackWaitNote )
+ {
+ iVideoPlaybackWaitNote = new(ELeave)CAknWaitDialog(
+ ( REINTERPRET_CAST( CEikDialog**,
+ &iVideoPlaybackWaitNote ) ), ETrue );
+
+ // Register to get the responses from the dialog
+ iVideoPlaybackWaitNote->SetCallback( this );
+
+ ret = iVideoPlaybackWaitNote->ExecuteLD(
+ R_UPNPCOMMONUI_VIDEO_PLAYBACK_WAIT_NOTE_DIALOG );
+ }
+
+ __LOG1( "CUPnPVideoPlayerDlg::StartWaitNoteL %d", ret );
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::FinishWaitNoteL
+// Finish the video playback wait note
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::FinishWaitNoteL()
+ {
+ if( iVideoPlaybackWaitNote )
+ {
+ iVideoPlaybackWaitNote->ProcessFinishedL();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::DialogDismissedL
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::DialogDismissedL( TInt aButtonId )
+ {
+ if( aButtonId == EEikBidCancel )
+ {
+ iExitCode = EEikBidCancel;
+
+ __LOG( "CUPnPVideoPlayerDlg::DialogDismissedL -Cancelled" );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::PreparePlayBackL
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::PreparePlayBackL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::PreparePlayBackL" );
+ if( !iTargetDevice )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::PreLayoutDynInitL: \
+ TargetDeviceL FAILED!" );
+ User::Leave( KErrNotReady );
+ }
+ const CUpnpItem* item = static_cast<const CUpnpItem*>( iItem );
+ HBufC8* uri
+ = UPnPItemUtility::ResourceFromItemL( *item ).Value().AllocLC();
+ // Set the URI
+ iRendSession.SetURIL( *uri, *item );
+ CleanupStack::PopAndDestroy ( uri );
+
+ __LOG( "CUPnPVideoPlayerDlg::PreparePlayBackL - End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::StartDisplayTimer
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::StartDisplayTimer()
+ {
+ //display time on the navipane: 00:00/00:00(total length)
+ if ( !iTimer->IsActive() )
+ {
+ iTimer->Start(
+ 0,
+ KMPOneSecond,
+ TCallBack( CUPnPVideoPlayerDlg::TimerIndicatorL,
+ this ) );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::DoChangeVolumeL
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::DoChangeVolumeL()
+ {
+ __LOG( "CUPnPVideoPlayerDlg::DoChangeVolumeL" );
+
+ __LOG1( " iCurrentVolume = %d ", iCurrentVolume );
+
+ if( iAdjustingVolume || !iVolumeCapability )
+ {
+ return;
+ }
+
+ if( iVolumeUp )
+ {
+ iNewVolume = iCurrentVolume + KVolumeInterval;
+ if( iNewVolume > KMaxVolume )
+ {
+ iNewVolume = KMaxVolume;
+ }
+ }
+ else
+ {
+ iNewVolume = iCurrentVolume - KVolumeInterval;
+ if( iNewVolume < KMiniumVolume )
+ {
+ iNewVolume = KMiniumVolume;
+ }
+ }
+
+ iRendSession.SetVolumeL( iNewVolume );
+
+ iAdjustingVolume = ETrue;
+
+ __LOG( "CUPnPVideoPlayerDlg::DoChangeVolumeL - End" );
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::ChangeVolume
+// --------------------------------------------------------------------------
+//
+TInt CUPnPVideoPlayerDlg::ChangeVolume( TAny* aPtr )
+ {
+ CUPnPVideoPlayerDlg* self =
+ static_cast<CUPnPVideoPlayerDlg*>( aPtr );
+
+ TRAPD( err, self->DoChangeVolumeL() );
+
+ __LOG1( "CUPnPVideoPlayerDlg::DoChangeVolumeL %d", err );
+
+ if( KErrNone == err )
+ {
+ self->iCurrentVolume = self->iNewVolume;
+ }
+ else if( err == KErrSessionClosed || err == KErrDisconnected )
+ {
+ //either MS or MR disappears
+ TRAP_IGNORE( self->TryExitL( err ) );
+ }
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CUPnPVideoPlayerDlg::MrccatoCommand
+// --------------------------------------------------------------------------
+//
+void CUPnPVideoPlayerDlg::MrccatoCommand(
+ TRemConCoreApiOperationId aOperationId,
+ TRemConCoreApiButtonAction aButtonAct )
+ {
+ __LOG( "CUPnPVideoPlayerDlg::MrccatoCommand" );
+ __LOG2( "CUPnPVideoPlayerDlg::MrccatoCommand (0x%X,%d)",
+ aOperationId, aButtonAct );
+
+ switch ( aOperationId )
+ {
+ case ERemConCoreApiVolumeUp:
+ {
+ switch ( aButtonAct )
+ {
+ case ERemConCoreApiButtonPress:
+ {
+ iVolumeUp = ETrue;
+ iVolumeKeyPressHold = ETrue;
+ iVolumeTimer->Cancel();
+ iVolumeTimer->Start( KMPOneSecond,
+ KMPOneSecond,
+ TCallBack( ChangeVolume, this ) );
+ break;
+ }
+ case ERemConCoreApiButtonRelease:
+ {
+ iVolumeKeyPressHold = EFalse;
+ iVolumeTimer->Cancel();
+ break;
+ }
+ case ERemConCoreApiButtonClick:
+ {
+ iVolumeKeyPressHold = EFalse;
+ iVolumeUp = ETrue;
+ TRAP_IGNORE( DoChangeVolumeL() );
+ break;
+ }
+ default:
+ break;
+ }
+ break;
+ }
+ case ERemConCoreApiVolumeDown:
+ {
+ switch ( aButtonAct )
+ {
+ case ERemConCoreApiButtonPress:
+ {
+ iVolumeKeyPressHold = ETrue;
+ iVolumeUp = EFalse;
+ iVolumeTimer->Cancel();
+ iVolumeTimer->Start( KMPOneSecond,
+ KMPOneSecond,
+ TCallBack( ChangeVolume, this ) );
+ break;
+ }
+ case ERemConCoreApiButtonRelease:
+ {
+ iVolumeKeyPressHold = EFalse;
+ iVolumeTimer->Cancel();
+ break;
+ }
+ case ERemConCoreApiButtonClick:
+ {
+ iVolumeKeyPressHold = EFalse;
+ iVolumeUp = EFalse;
+ TRAP_IGNORE( DoChangeVolumeL() );
+ break;
+ }
+ default:
+ break;
+ }
+ break;
+ }
+
+ // Only volume keys handled
+ case ERemConCoreApiStop:
+ case ERemConCoreApiRewind:
+ case ERemConCoreApiFastForward:
+ case ERemConCoreApiPausePlayFunction:
+ case ERemConCoreApiPause:
+ default:
+ break;
+ }
+ __LOG( "CUPnPVideoPlayerDlg::MrccatoCommand - End" );
+ }
+
+// ===========================================================================
+// CCustomCtrlDlgCustomControl Implementation
+// ===========================================================================
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::CCustomCtrlDlgCustomControl
+// --------------------------------------------------------------------------
+//
+CCustomCtrlDlgCustomControl::~CCustomCtrlDlgCustomControl()
+ {
+ __LOG( "CCustomCtrlDlgCustomControl::~CCustomCtrlDlgCustomControl" );
+ delete iImage;
+ iImage = NULL;
+ __LOG( "CCustomCtrlDlgCustomControl::~CCustomCtrlDlgCustomControl End" );
+ }
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::Draw() const
+// Draws the display
+// --------------------------------------------------------------------------
+//
+void CCustomCtrlDlgCustomControl::Draw( const TRect& /*aRect*/ ) const
+ {
+ __LOG( "CCustomCtrlDlgCustomControl::Draw" );
+
+ TRect rect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
+ CWindowGc& gc=SystemGc();
+ gc.Clear( rect );
+ gc.SetClippingRect( rect );
+ gc.DrawRect( rect );
+ __LOG( "CCustomCtrlDlgCustomControl::Draw End" );
+ }
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::SizeChanged() const
+// Set window size
+// --------------------------------------------------------------------------
+//
+void CCustomCtrlDlgCustomControl::SizeChanged()
+ {
+ __LOG( "CCustomCtrlDlgCustomControl::SizeChanged" );
+
+ TRect rect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
+ rect.iTl = TPoint( 0,0 );
+ iPosition = TPoint( rect.iTl );
+
+ iImage->SetPosition( iPosition );
+ iImage->SetSize( rect.Size() );
+
+ __LOG( "CCustomCtrlDlgCustomControl::SizeChanged End" );
+ }
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::ConstructFromResourceL()
+// Set window size
+// --------------------------------------------------------------------------
+//
+void CCustomCtrlDlgCustomControl::ConstructFromResourceL(
+ TResourceReader& /*aReader*/)
+ {
+ __LOG( "CCustomCtrlDlgCustomControl::ConstructFromResourceL" );
+
+ iImage = new(ELeave) CImage( *iRendSession );
+ iImage->SetContainerWindowL( *this );
+
+ TRect rect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
+ rect.iTl = TPoint( 0,0 );
+
+ SetRect( rect );
+ ActivateL();
+ __LOG( "CCustomCtrlDlgCustomControl::ConstructFromResourceL End" );
+ }
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::CountComponentControls() const
+// Return number of components
+// --------------------------------------------------------------------------
+//
+TInt CCustomCtrlDlgCustomControl::CountComponentControls() const
+ {
+ return 1;
+ }
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::ComponentControl() const
+// return control pointer
+// --------------------------------------------------------------------------
+//
+CCoeControl* CCustomCtrlDlgCustomControl::ComponentControl(
+ TInt aIndex ) const
+ {
+ if ( aIndex==0 )
+ {
+ return iImage;
+ }
+ return NULL;
+ }
+
+// --------------------------------------------------------------------------
+// CCustomCtrlDlgCustomControl::SetRenderingSession()
+// --------------------------------------------------------------------------
+//
+void CCustomCtrlDlgCustomControl::SetRenderingSession(
+ MUPnPAVRenderingSession& aRendSession )
+ {
+ __LOG( "CCustomCtrlDlgCustomControl::SetRenderingSession" );
+ iRendSession = &aRendSession;
+ __LOG( "CCustomCtrlDlgCustomControl::SetRenderingSession End" );
+ }
+
+// ===========================================================================
+// CImage Implementation
+// ===========================================================================
+
+// --------------------------------------------------------------------------
+// CImage::CImage()
+// --------------------------------------------------------------------------
+//
+CImage::CImage( MUPnPAVRenderingSession& aRendSession):
+ iRendSession(aRendSession)
+ {
+ __LOG( "CImage::CImage" );
+
+ iBitmap = NULL;
+ iMask = NULL;
+
+ TFileName mbmFileName( KAknMultiViewsMbmFileName );
+ TFileName dllName;
+ Dll::FileName( dllName );
+ TBuf<2> drive = dllName.Left( 2 ); // Drive letter followed by ':'
+ mbmFileName.Insert( 0, drive );
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ TRAP_IGNORE( AknsUtils::CreateIconL(
+ skin,
+ KAknsIIDDefault,
+ iBitmap,
+ iMask,
+ mbmFileName,
+ EMbmUpnpcommonuiQgn_graf_upnp_ext_renderer,
+ EMbmUpnpcommonuiQgn_graf_upnp_ext_renderer_mask ) );
+ __LOG( "CImage::CImage End" );
+ }
+
+// --------------------------------------------------------------------------
+// CImage::~CImage()
+// --------------------------------------------------------------------------
+//
+CImage::~CImage()
+ {
+ __LOG( "CImage::~CImage");
+ delete iBitmap;
+ iBitmap = NULL;
+ delete iMask;
+ iMask = NULL;
+ __LOG( "CImage::~CImage End");
+ }
+
+// --------------------------------------------------------------------------
+// CImage::Draw()
+// Draw display
+// --------------------------------------------------------------------------
+//
+void CImage::Draw(const TRect& /*aRect*/) const
+ {
+ __LOG( "CImage::Draw" );
+
+ //change image size
+ TSize imageSize;
+ AknLayoutUtils::LayoutMetricsSize( AknLayoutUtils::EMainPane, imageSize );
+ AknIconUtils::SetSize( iBitmap,imageSize );
+
+ TRAPD( error,DrawL( imageSize ) );
+ if ( error )
+ {
+ __LOG1( "CImage::DrawL %d", error );
+ }
+
+ __LOG( "CImage::Draw End" );
+ }
+
+// --------------------------------------------------------------------------
+// CImage::DrawL()
+// Draw display
+// --------------------------------------------------------------------------
+//
+void CImage::DrawL( const TRect& aRect ) const
+ {
+ __LOG( "CImage::DrawL" );
+
+ CWindowGc& gc = SystemGc();
+ gc.Clear();
+ gc.DrawBitmap( aRect, iBitmap );
+
+ const CUpnpAVDevice* device = &( iRendSession.Device() );
+
+ const CFont* normalFont = iEikonEnv->NormalFont();
+ TInt baseline = ( aRect.Height() / 12 +
+ ( normalFont->AscentInPixels() / 5 ) );
+ gc.UseFont( normalFont );
+ gc.SetPenColor( KRgbBlack );
+ gc.SetBrushStyle( CGraphicsContext::ENullBrush );
+
+ // Get device friendly name and replace illegal characters.
+ HBufC8* tmpfriendlyname =
+ UPnPCommonUtils::ReplaceIllegalFilenameCharactersL(
+ ( ( CUpnpAVDevice* )device )->FriendlyName() );
+
+ CleanupStack::PushL( tmpfriendlyname );
+ TPtrC8 friendlyname = *tmpfriendlyname;
+
+ HBufC* tmpbuf = UpnpString::ToUnicodeL( friendlyname.Left( KLength ) );
+
+ //Get max number of characters fits in the screen
+ TInt num = normalFont->TextCount( *tmpbuf, aRect.Width() );
+ //if the name has the length more than the screen can have
+ if( tmpbuf->Length() > num )
+ {
+ HBufC* tmpbuf2 = HBufC::NewL( num );
+
+ tmpbuf2->Des().Copy( tmpbuf->Des().Left( num - KDotLength ) );
+ tmpbuf2->Des().Append( KDot );
+ gc.DrawText( *tmpbuf2, aRect, baseline, CGraphicsContext::ELeft );
+ delete tmpbuf2;
+ }
+ else
+ {
+ gc.DrawText( *tmpbuf, aRect, baseline, CGraphicsContext::ECenter );
+ }
+
+ delete tmpbuf;
+ CleanupStack::PopAndDestroy( tmpfriendlyname );
+
+ __LOG( "CImage::DrawL End" );
+ }
+
+// End of file