videoplayback/videohelix/src/mpxvideoplaybackmode.cpp
changeset 0 96612d01cf9f
child 8 ce5ada96ab30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoplayback/videohelix/src/mpxvideoplaybackmode.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,618 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This class plays local video file
+ *
+*/
+
+// Version : %version: 17 %
+
+
+
+//
+//  INCLUDE FILES
+//
+#include <mmf/server/mmffile.h>
+#include <MMFROPCustomCommandConstants.h>
+#include <mpxplaybackpluginobserver.h>
+
+#include <etel.h>    // 3G
+#include <etelmm.h>
+#include <mmtsy_names.h>
+
+#include "mpxvideoplaybackcontroller.h"
+#include "mpxvideoplaybackmode.h"
+#include "mpxvideofiledetails.h"
+#include <mpxvideoplaybackdefs.h>
+#include "mpxvideodrmhelper.h"
+
+// Constants
+const TUid KUidInterfaceMMFHelixController = {0x101F855D};
+
+_LIT8(KMMFAccessPoint,"AccessPoint:Integer = \"%d\";");
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+//  ------------------------------------------------------------------------------------------------
+//    Symbian 2nd phase constructor can leave.
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPlaybackMode::ConstructL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPlaybackMode::ConstructL()"));
+
+    iVideoPlaybackCtlr = aVideoPlaybackCtlr;
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    C++ constructor
+//  ------------------------------------------------------------------------------------------------
+//
+CMPXVideoPlaybackMode::CMPXVideoPlaybackMode()
+{
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    Destructor
+//  ------------------------------------------------------------------------------------------------
+//
+CMPXVideoPlaybackMode::~CMPXVideoPlaybackMode()
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::~CMPXVideoPlaybackMode()"));
+}
+
+//  ----------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::OpenFileL()
+//  ----------------------------------------------------------------------------
+void CMPXVideoPlaybackMode::OpenFileL( const TDesC& aMediaFile )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPlaybackMode::OpenFileL()"),
+                   _L("file = %S"), &aMediaFile );
+
+    iVideoPlaybackCtlr->iPlayer->OpenFileL( aMediaFile );
+}
+
+//  ----------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::OpenFileL()
+//  ----------------------------------------------------------------------------
+void CMPXVideoPlaybackMode::OpenFileL( const RFile& aMediaFile )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPlaybackMode::OpenFileL()"));
+
+    iVideoPlaybackCtlr->iPlayer->OpenFileL( aMediaFile );
+}
+
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+
+//  ----------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::OpenFile64L()
+//  ----------------------------------------------------------------------------
+void CMPXVideoPlaybackMode::OpenFile64L( const RFile64& aMediaFile )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPlaybackMode::OpenFile64L( RFile64 )"));
+
+    iVideoPlaybackCtlr->iPlayer->OpenFile64L( aMediaFile );
+}
+
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::ConnectToDownloadL()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPlaybackMode::ConnectToDownloadL( CMPXCommand& /*aCmd*/ )
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::ConnectToDownloadL()"));
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::GetPdlStatusL()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPlaybackMode::GetPdlStatusL( CMPXCommand& /*aCmd*/ )
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::GetPdlStatusL()"));
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::HandleOpenComplete()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPlaybackMode::HandleOpenComplete()
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::HandleOpenComplete()"));
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::UpdateSeekPosition()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPlaybackMode::UpdateSeekPosition( TInt64& aPosition )
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::UpdateSeekPosition()"));
+
+    iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent(
+        MMPXPlaybackPluginObserver::EPPositionChanged,
+        aPosition / KPbMilliMultiplier,
+        KErrNone );
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::HandlePause()
+//  ------------------------------------------------------------------------------------------------
+void CMPXVideoPlaybackMode::HandlePause()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPlaybackMode::HandlePause()"));
+
+    MPX_TRAPD( err, iVideoPlaybackCtlr->iPlayer->PauseL() );
+
+    if ( err == KErrNone )
+    {
+        iVideoPlaybackCtlr->ChangeState( EMPXVideoPaused );
+
+        iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent( MMPXPlaybackPluginObserver::EPPaused,
+                                                              0,
+                                                              err );
+    }
+    else
+    {
+        TRAP_IGNORE( iVideoPlaybackCtlr->iState->SendErrorToViewL( err ) );
+    }
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::HandleBackground()
+//  ------------------------------------------------------------------------------------------------
+void CMPXVideoPlaybackMode::HandleBackground()
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::HandleBackground()"));
+
+    if ( iVideoPlaybackCtlr->iAppInForeground )
+    {
+        if ( iVideoPlaybackCtlr->IsAlarm() ||
+             ( iVideoPlaybackCtlr->IsDisplayOff() && iVideoPlaybackCtlr->iFileDetails->iVideoEnabled ) )
+        {
+            iVideoPlaybackCtlr->iForegroundPause = ETrue;
+            iVideoPlaybackCtlr->iState->HandlePause();
+        }
+        else if ( iVideoPlaybackCtlr->IsPhoneCall() || iVideoPlaybackCtlr->IsVideoCall() )
+        {
+            iVideoPlaybackCtlr->iForegroundPause = EFalse;
+            iVideoPlaybackCtlr->iState->HandlePause();
+        }
+    }
+    else
+    {
+        iVideoPlaybackCtlr->iForegroundPause = EFalse;
+        iVideoPlaybackCtlr->iState->HandlePause();
+    }
+}
+
+//  ------------------------------------------------------------------------------------------------
+//  CMPXVideoPlaybackMode::CanPlayNow
+//  ------------------------------------------------------------------------------------------------
+TBool CMPXVideoPlaybackMode::CanPlayNow()
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::CanPlayNow"));
+    TBool playAllowed = EFalse;
+
+    if ( iVideoPlaybackCtlr->iAppInForeground && iVideoPlaybackCtlr->iAllowAutoPlay )
+    {
+        if ( iVideoPlaybackCtlr->IsVideoCall() )
+        {
+            MPX_TRAPD( err,
+                iVideoPlaybackCtlr->iState->SendErrorToViewL( KMPXVideoCallOngoingError ) );
+        }
+        else if ( iVideoPlaybackCtlr->IsDisplayOff() &&
+                  iVideoPlaybackCtlr->iFileDetails->iVideoEnabled )
+        {
+            iVideoPlaybackCtlr->iForegroundPause = ETrue;
+        }
+        else if ( ! iVideoPlaybackCtlr->iAccessoryMonitor->IsTvOutPlaybackAllowed() )
+        {
+            MPX_TRAPD( err,
+                iVideoPlaybackCtlr->iState->SendErrorToViewL( KMPXVideoTvOutPlaybackNotAllowed ) );
+        }
+        else
+        {
+            playAllowed = ETrue;
+        }
+    }
+    return playAllowed;
+}
+
+//  ------------------------------------------------------------------------------------------------
+//  CMPXVideoPlaybackMode::IsNetworkMode2GL
+//  ------------------------------------------------------------------------------------------------
+TBool CMPXVideoPlaybackMode::IsNetworkMode2GL()
+{
+    TBool networkMode2g( EFalse );
+    RMobilePhone mobilePhone;
+    RTelServer telServer;          // 3G
+
+    RTelServer::TPhoneInfo phoneInfo;
+    RMobilePhone::TMobilePhoneNetworkMode networkMode;
+
+    User::LeaveIfError( telServer.Connect() );
+    User::LeaveIfError( telServer.LoadPhoneModule( KMmTsyModuleName ) );
+
+    TInt numPhones;
+    User::LeaveIfError(telServer.EnumeratePhones( numPhones ) );
+
+    if ( numPhones <= 0 )
+    {
+        User::Leave( KErrCorrupt );
+    }
+
+    User::LeaveIfError( telServer.GetPhoneInfo( 0, phoneInfo ) );
+    User::LeaveIfError( mobilePhone.Open( telServer, phoneInfo.iName ) );
+    User::LeaveIfError( mobilePhone.Initialise() );
+
+    User::LeaveIfError( mobilePhone.GetCurrentMode( networkMode ) );
+
+    if ( networkMode == RMobilePhone::ENetworkModeGsm)
+    {
+    	networkMode2g = ETrue;
+    }
+
+    mobilePhone.Close();
+    telServer.Close();
+
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::IsNetworkMode2GL(%d)"), networkMode2g);
+
+    return networkMode2g;
+}
+
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXVideoPlaybackMode::IsTvOutAllowedL()
+//  ------------------------------------------------------------------------------------------------
+TBool CMPXVideoPlaybackMode::IsTvOutAllowedL()
+{
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::IsTvOutAllowedL()"));
+
+    TBool allowTvOut =
+        iVideoPlaybackCtlr->iDrmHelper->IsTvOutAllowedL( iVideoPlaybackCtlr->iFileHandle );
+
+    MPX_DEBUG(_L("CMPXVideoPlaybackMode::IsTvOutAllowedL(%d)"), allowTvOut);
+
+    return allowTvOut;
+}
+
+//************************************************************************************************//
+//          CMPXLocalPlaybackMode
+//************************************************************************************************//
+CMPXVideoPlaybackMode*
+CMPXLocalPlaybackMode::NewL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+   MPX_ENTER_EXIT(_L("CMPXLocalPlaybackMode::NewL()"));
+   CMPXLocalPlaybackMode* self = new( ELeave ) CMPXLocalPlaybackMode();
+   CleanupStack::PushL( self );
+   self->ConstructL(aVideoPlaybackCtlr);
+   CleanupStack::Pop();
+   return self;
+}
+
+CMPXLocalPlaybackMode::~CMPXLocalPlaybackMode()
+{
+    MPX_DEBUG(_L("CMPXLocalPlaybackMode::~CMPXLocalPlaybackMode()"));
+}
+
+//************************************************************************************************//
+//          CMPXStreamingPlaybackMode
+//************************************************************************************************//
+CMPXVideoPlaybackMode*
+CMPXStreamingPlaybackMode::NewL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+   MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::NewL()"));
+
+   CMPXStreamingPlaybackMode* self = new( ELeave ) CMPXStreamingPlaybackMode();
+   CleanupStack::PushL( self );
+   self->ConstructL(aVideoPlaybackCtlr);
+   CleanupStack::Pop();
+   return self;
+}
+
+CMPXStreamingPlaybackMode::~CMPXStreamingPlaybackMode()
+{
+    MPX_DEBUG(_L("CMPXStreamingPlaybackMode::~CMPXStreamingPlaybackMode()"));
+}
+
+//  ----------------------------------------------------------------------------
+//    CMPXStreamingPlaybackMode::OpenFileL()
+//  ----------------------------------------------------------------------------
+void CMPXStreamingPlaybackMode::OpenFileL( const TDesC& aMediaFile )
+{
+    MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::OpenFileL()"), _L("file = %S"), &aMediaFile );
+
+    iVideoPlaybackCtlr->iPlayer->OpenUrlL( aMediaFile, iVideoPlaybackCtlr->iAccessPointId );
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXStreamingPlaybackMode::HandleOpenComplete()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXStreamingPlaybackMode::HandleOpenComplete()
+{
+    MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::HandleOpenComplete()"));
+
+    // since SDP files are opened as KMmfUidFileSource type, we need to set
+    // the access point for SDP files before Prepare is called on Helix
+    //
+    // for RAM files and URLs - access point is already been set
+    // at the point of adding data source
+
+    if ( iVideoPlaybackCtlr->iMediaType == CMediaRecognizer::ELocalSdpFile )
+    {
+        const TMMFMessageDestinationPckg destinationPckg(KUidInterfaceMMFHelixController);
+        const TPckgBuf<TBool> savePckg( EFalse );
+
+        HBufC8* tempBuf = NULL;
+        TInt apMaxLen = 3;
+
+        HBufC8* accessPoint = HBufC8::NewLC( KMMFAccessPoint().Length() + apMaxLen );
+        accessPoint->Des().Format( KMMFAccessPoint, iVideoPlaybackCtlr->iAccessPointId );
+
+        tempBuf = HBufC8::NewLC( accessPoint->Length() );
+        tempBuf->Des().Copy( accessPoint->Des() );
+
+        if ( tempBuf )
+        {
+            iVideoPlaybackCtlr->iPlayer->CustomCommandSync( destinationPckg,
+                                                            EMMFROPControllerSetApplicationConfig,
+                                                            tempBuf->Des(),
+                                                            savePckg );
+        }
+
+        CleanupStack::PopAndDestroy(2);   // accessPoint, tempBuf
+    }
+}
+
+//  ------------------------------------------------------------------------------------------------
+//  CMPXStreamingPlaybackMode::CanPlayNow
+//  ------------------------------------------------------------------------------------------------
+TBool CMPXStreamingPlaybackMode::CanPlayNow()
+{
+    MPX_DEBUG(_L("CMPXStreamingPlaybackMode::CanPlayNow"));
+    TBool playAllowed = EFalse;
+
+    if ( iVideoPlaybackCtlr->iAppInForeground && iVideoPlaybackCtlr->iAllowAutoPlay )
+    {
+        if ( iVideoPlaybackCtlr->IsVideoCall() )
+        {
+            MPX_TRAPD(err,
+                      iVideoPlaybackCtlr->iState->SendErrorToViewL( KMPXVideoCallOngoingError ));
+        }
+        else if ( iVideoPlaybackCtlr->IsDisplayOff() && iVideoPlaybackCtlr->iFileDetails->iVideoEnabled )
+        {
+          //exit for live streaming
+        }
+        else
+        {
+            playAllowed = !( iVideoPlaybackCtlr->IsVoiceCall() && IsNetworkMode2GL() );
+
+            if ( !playAllowed )
+            {
+                MPX_TRAPD( err,
+                    iVideoPlaybackCtlr->iState->SendErrorToViewL(
+                        KMPXVideoPlayOver2GDuringVoiceCallError ) );
+            }
+        }
+    }
+
+    return  playAllowed;
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXStreamingPlaybackMode::IsTvOutAllowedL()
+//  ------------------------------------------------------------------------------------------------
+TBool CMPXStreamingPlaybackMode::IsTvOutAllowedL()
+{
+    MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::IsTvOutAllowedL(1)"));
+    return ETrue;
+}
+//  ------------------------------------------------------------------------------------------------
+//    CMPXStreamingPlaybackMode::HandlePause()
+//  ------------------------------------------------------------------------------------------------
+void CMPXStreamingPlaybackMode::HandlePause()
+{
+    MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::HandlePause()"));
+
+    if ( iVideoPlaybackCtlr->iFileDetails->iPausableStream )
+    {
+        MPX_TRAPD( err, iVideoPlaybackCtlr->iPlayer->PauseL() );
+
+        if ( err == KErrNone )
+        {
+            iVideoPlaybackCtlr->ChangeState( EMPXVideoPaused );
+
+            iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent( MMPXPlaybackPluginObserver::EPPaused,
+                                                                  0,
+                                                                  err );
+        }
+        else
+        {
+            TRAP_IGNORE( iVideoPlaybackCtlr->iState->SendErrorToViewL( err ) );
+        }
+    }
+    else
+    {
+        iVideoPlaybackCtlr->iPlayer->Stop();
+
+        iVideoPlaybackCtlr->ChangeState( EMPXVideoStopped );
+
+        iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent( MMPXPlaybackPluginObserver::EPStopped,
+                                                              0,
+                                                              KErrNone );
+    }
+}
+
+//************************************************************************************************//
+//          CMPXLiveStreamingPlaybackMode
+//************************************************************************************************//
+CMPXVideoPlaybackMode*
+CMPXLiveStreamingPlaybackMode::NewL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+   MPX_ENTER_EXIT(_L("CMPXLiveStreamingPlaybackMode::NewL()"));
+
+   CMPXLiveStreamingPlaybackMode* self =
+            new( ELeave ) CMPXLiveStreamingPlaybackMode();
+   CleanupStack::PushL( self );
+   self->ConstructL(aVideoPlaybackCtlr);
+   CleanupStack::Pop();
+   return self;
+}
+
+CMPXLiveStreamingPlaybackMode::~CMPXLiveStreamingPlaybackMode()
+{
+    MPX_DEBUG(_L("CMPXLiveStreamingPlaybackMode::~CMPXLiveStreamingPlaybackMode"));
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXLiveStreamingPlaybackMode::HandlePause()
+//  ------------------------------------------------------------------------------------------------
+void CMPXLiveStreamingPlaybackMode::HandlePause()
+{
+    MPX_ENTER_EXIT(_L("CMPXLiveStreamingPlaybackMode::HandlePause()"));
+
+    iVideoPlaybackCtlr->iPlayer->Stop();
+
+    iVideoPlaybackCtlr->ChangeState( EMPXVideoStopped );
+
+    iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent( MMPXPlaybackPluginObserver::EPStopped,
+                                                          0,
+                                                          KErrNone );
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXLiveStreamingPlaybackMode::HandleBackground()
+//  ------------------------------------------------------------------------------------------------
+void CMPXLiveStreamingPlaybackMode::HandleBackground()
+{
+    MPX_DEBUG(_L("CMPXLiveStreamingPlaybackMode::HandleBackground()"));
+
+    if ( iVideoPlaybackCtlr->iAppInForeground )
+    {
+        if ( iVideoPlaybackCtlr->IsPhoneCall() ||
+             iVideoPlaybackCtlr->IsVideoCall() ||
+             ( iVideoPlaybackCtlr->IsDisplayOff() && iVideoPlaybackCtlr->iFileDetails->iVideoEnabled ))
+        {
+            iVideoPlaybackCtlr->iState->HandlePause();
+        }
+    }
+    else
+    {
+        iVideoPlaybackCtlr->iState->HandlePause();
+    }
+}
+
+//************************************************************************************************//
+//          CMPXProgressiveDLPlaybackMode
+//************************************************************************************************//
+CMPXVideoPlaybackMode*
+CMPXProgressiveDLPlaybackMode::NewL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+   MPX_ENTER_EXIT(_L("CMPXProgressiveDLPlaybackMode::NewL()"));
+
+   CMPXProgressiveDLPlaybackMode* self = new( ELeave ) CMPXProgressiveDLPlaybackMode();
+   CleanupStack::PushL( self );
+   self->ConstructL( aVideoPlaybackCtlr );
+   CleanupStack::Pop();
+   return self;
+}
+
+void CMPXProgressiveDLPlaybackMode::ConstructL( CMPXVideoPlaybackController* aVideoPlaybackCtlr )
+{
+    iVideoPlaybackCtlr = aVideoPlaybackCtlr;
+
+    //
+    //  Create the Download Mgr Interface
+    //
+    iDlMgrIf = CMPXVideoDlMgrIf::NewL( iVideoPlaybackCtlr );
+}
+
+CMPXProgressiveDLPlaybackMode::~CMPXProgressiveDLPlaybackMode()
+{
+    MPX_DEBUG(_L("CMPXProgressiveDLPlaybackMode::~CMPXProgressiveDLPlaybackMode()"));
+
+    if ( iDlMgrIf )
+    {
+        delete iDlMgrIf;
+        iDlMgrIf = NULL;
+    }
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXProgressiveDLPlaybackMode::ConnectToDownloadL()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXProgressiveDLPlaybackMode::ConnectToDownloadL( CMPXCommand& aCmd )
+{
+    MPX_ENTER_EXIT(_L("CMPXProgressiveDLPlaybackMode::ConnectToDownloadL()"));
+
+    iDlMgrIf->ConnectToDownloadL( aCmd );
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXProgressiveDLPlaybackMode::HandleOpenComplete()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXProgressiveDLPlaybackMode::HandleOpenComplete()
+{
+    MPX_ENTER_EXIT(_L("CMPXProgressiveDLPlaybackMode::HandleOpenComplete()"));
+
+    //
+    //  Helix needs the download id before the prepare command has been sent
+    //  to enable PDL
+    //
+    iDlMgrIf->DoHandleOpenComplete();
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXProgressiveDLPlaybackMode::GetPdlStatusL()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXProgressiveDLPlaybackMode::GetPdlStatusL( CMPXCommand& aCmd )
+{
+    MPX_DEBUG(_L("CMPXProgressiveDLPlaybackMode::GetPdlStatusL()"));
+
+    iDlMgrIf->GetPdlStatusL( aCmd );
+}
+
+//  ------------------------------------------------------------------------------------------------
+//    CMPXProgressiveDLPlaybackMode::UpdateSeekPosition()
+//  ------------------------------------------------------------------------------------------------
+//
+void CMPXProgressiveDLPlaybackMode::UpdateSeekPosition( TInt64& aPosition )
+{
+    MPX_DEBUG(_L("CMPXProgressiveDLPlaybackMode::UpdateSeekPosition()"));
+
+    TReal duration = (TReal)iVideoPlaybackCtlr->iFileDetails->iDuration.Int64();
+    TReal playbackRatio = (TReal)aPosition / duration;
+    TReal downloadRatio = iDlMgrIf->GetDownloadRatio();
+
+    //
+    //  Limit the seek position to the downloaded part of the file
+    //
+    if ( playbackRatio > downloadRatio )
+    {
+        aPosition = downloadRatio * duration;
+    }
+
+    iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent(
+        MMPXPlaybackPluginObserver::EPPositionChanged,
+        aPosition / KPbMilliMultiplier,
+        KErrNone );
+}
+
+// End of file