/*
* 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:  MPX Video base playback view
*
*/


// Version : %version: 25 %


// This file defines the API for VideoBasePlaybackView.dll

#ifndef __VIDEOBASEPLAYBACKVIEW_H__
#define __VIDEOBASEPLAYBACKVIEW_H__

//  Include Files
#include <e32base.h>    // CBase
#include <e32std.h>     // TBuf
#include <aknview.h>
#include <mpxplaybackobserver.h>
#include <mpxviewactivationobserver.h>
#include <mpxcollectionobserver.h>

#include "mpxvideoplaybackcontrol.hrh"
#include "mpxvideoplaybackdisplayhandler.h"
#include <mpxvideoplaybackdefs.h>
#include <AknWsEventObserver.h>

//  Constants

//  Forward Declarations
class CMPXVideoPlaybackContainer;
class MMPXPlaybackUtility;
class MMPXViewUtility;
class MMPXCollectionUtility;
class CMPFileDetailsDialog;
class CMPFileDetails;

class CMPXVideoPlaybackViewFileDetails;

//  Class Definitions

class CMPXVideoBasePlaybackView : public CAknView,
                                  public MMPXPlaybackObserver,
                                  public MMPXViewActivationObserver,
                                  public MMPXPlaybackCallback,
                                  public MMPXCollectionObserver,
                                  public MAknWsEventObserver
{
    public:
        ~CMPXVideoBasePlaybackView();

        /**
        * From CAknView
        * Command handling function.
        *
        * @param aCommand Command which is handled
        */
        virtual void HandleCommandL( TInt aCommand );

        void RetrieveFileNameAndModeL( CMPXCommand* aCmd );

        void HandleWsEventL( const TWsEvent& aEvent, CCoeControl* aDestination );

    protected:

        /**
        * From CAknView
        * Processes user commands.
        *
        * @param aCommand ID of the command to respond to.
        */
        virtual void ProcessCommandL( TInt aCommand );

        /**
        * From CAknView
        * Event handler for status pane size changes.
        *
        */
        virtual void HandleStatusPaneSizeChange();

        /**
        * From CAknView
        * Handles a view activation.
        *
        * @param aPrevViewId Specifies the view previously active.
        * @param aCustomMessageId Specifies the message type.
        * @param aCustomMessage The activation message.
        */
        virtual void DoActivateL( const TVwsViewId& aPrevViewId,
                                  TUid aCustomMessageId,
                                  const TDesC8& aCustomMessage );

        /**
        * From CAknView
        * View deactivation function.
        */
        virtual void DoDeactivate();

        /**
        * From CAknView
        * Foreground event handling function.
        *
        * @param aForeground Indicates the required focus state of the control.
        */
        virtual void HandleForegroundEventL( TBool aForeground );

        /**
        * From MEikMenuObserver
        */
        virtual void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane );

        /**
        * From MMPXPlaybackObserver
        * Handle playback message
        *
        * @param aMessage Playback Message
        * @param aErr system error code.
        */
        virtual void HandlePlaybackMessage( CMPXMessage* aMessage, TInt aError );

        /*
         *  From MMPXViewActivationObserver
         *  Handle view activation.
         *
         *  @param aCurrentViewType Current view type Uid.
         *  @param aPreviousViewType Previous view type Uid.
         */
        void HandleViewActivation( const TUid& aCurrentViewType, const TUid& aPreviousViewType );

        /**
        *  From MMPXPlaybackCallback
        *  Handle playback property
        *
        *  @param aProperty the property
        *  @param aValue the value of the property
        *  @param aError error code
        */
        void HandlePropertyL( TMPXPlaybackProperty aProperty,
                              TInt aValue,
                              TInt aError );

        /**
        *  Method is called continously until aComplete=ETrue, signifying that
        *  it is done and there will be no more callbacks
        *  Only new items are passed each time
        *
        *  @param aPlayer UID of the subplayer
        *  @param aSubPlayers a list of sub players
        *  @param aComplete ETrue no more sub players. EFalse more subplayer
        *                   expected
        *  @param aError error code
        */
        inline void HandleSubPlayerNamesL( TUid /*aPlayer*/,
                                           const MDesCArray* /*aSubPlayers*/,
                                           TBool /*aComplete*/,
                                           TInt /*aError*/ )
        {}

        /**
        *  Call back of media request
        *
        *  @param aMedia media
        *  @param aError error code
        */
        void HandleMediaL( const CMPXMedia& aProperties, TInt aError );

        void UpdatePbPluginMediaL( TBool aSeek);


        /**
        *  Handle completion of a asynchronous command
        *  @param aCommandResult result of the command, NULL if error
        *  @param aError error code
        */
        void HandlePlaybackCommandComplete( CMPXCommand* /*aCommandResult*/,
                                            TInt /*aError*/);
        /*
         *  From base class MMPXCollectionMediaObserver
         *  (via MMPXCollectionObserver)
         *  Handle extended media properties
         *
         *  @param aMedia media
         *  @param aError error code
         */
        inline void HandleCollectionMediaL( const CMPXMedia& /*aMedia*/, TInt /*aError*/ ) {}

        /*
         *  From base class MMPXCollectionObserver
         */
        inline void HandleCollectionMessage( CMPXMessage* /*aMsg*/, TInt /*aErr*/ ) {}

        inline void HandleOpenL( const CMPXMedia& /*aEntries*/,
                                 TInt /*aIndex*/,
                                 TBool /*aComplete*/,
                                 TInt /*aError*/ ) {}

        inline void HandleOpenL( const CMPXCollectionPlaylist& /*aPlaylist*/, TInt /*aError*/ ) {}

    public:
        /**
        * Set property
        */
        void SetPropertyL( TMPXPlaybackProperty aProperty, TInt aValue );
        virtual void RetrievePdlInformationL();

    protected:

        virtual void CloseEmbeddedPlaybackViewL() = 0;

        /*
         *  Handle Download State Change
         *  @param  aState  new state of the download
         */
        virtual void HandlePdlStateChangeL( TInt aState ) = 0;

        /*
         *  Handle transition to the stopped state
         */
        virtual void HandleStoppedStateL() = 0;

        virtual void HandleInitializingStateL( TMPXPlaybackState aLastState ) = 0;

        virtual void HandlePluginErrorL( TInt aError );

        virtual void ClosePlaybackViewL();

        virtual void HandleBufferingStateL();

        virtual void IssuePlayCommandL();

        void InitializeVideoPlaybackViewL();
        void DisplayInfoMessageL( TInt aResourceId, TBool aWaitingDialog = EFalse );
        void DisplayErrorMessageL( TInt aResourceId );

        CMPXVideoBasePlaybackView();

        /*
         *  Activates an active object to close the player
         *  @since 5.0
         */
        void ActivateClosePlayerActiveObject();

        /*
         *  Provides the static function for the callback to close the player
         *  Called by CIdle iIdle
         *  @since 3.2
         *  @param aPtr Pointer to callback class
         *  @return KErrNone
         */
        static TInt ClosePlayerL( TAny* aPtr );

        /*
         *  Called to stop and exit the player
         *  @since 3.2
         *  @return void
         */
        virtual void DoClosePlayerL();


        virtual void HandleVideoPlaybackMessage( CMPXMessage* aMessage );

        /**
         * Returns views Implementation id.
         * @return id for this view.
         */
        virtual TUid ViewImplementationId() const = 0;

        virtual void HandleClosePlaybackViewL();

        TBool IsAppInFrontL();

        TInt RetrieveBufferingPercentageL();

        void DoHandleInitializingStateL( TMPXPlaybackState aLastState );

        TBool IsMultiItemPlaylist();

        virtual void SendWindowCommandL( TMPXVideoPlaybackCommand aCmd );

        virtual void HandlePdlReloadComplete();

        virtual void ResetPdlUserInputs();

    private:

        /**
        *  Handle playback message
        *
        *  @param aMsg playback message
        */
        virtual void DoHandlePlaybackMessageL( CMPXMessage* aMessage );

        /**
        *  Handle playback error message
        *
        *  @param aErr system error code.
        */
        void DoHandleErrorPlaybackMessageL( TInt aError );

        void SetDisplayWindowL();

        void CreateGeneralPlaybackCommandL( TMPXPlaybackCommand aCmd, TBool aDoSync = ETrue );

        void SetVideoRectL();

        void DisplayFileDetailsDialogL();

        /**
        *  Handle media properties.
        *
        *  @param aMedia media properties
        *  @param aError error code
        */
        virtual void DoHandleMediaL( const CMPXMedia& aMedia, TInt aError );

        void CreateAbortDsaCmdL();

        void CreateVideoSpecificCmdL( TMPXVideoPlaybackCommand aCmd );

        void RestartDsaL();

        void RequestMediaL();
        void RequestCollectionMediaL();
        void RequestPlaybackMediaL();

        void ParseMetaDataL( const CMPXMedia& aMedia );

        void DoHandleStateChangeL( TInt aNewState );

        void HandleGeneralPlaybackMessageL( CMPXMessage* aMessage );

        void SetAspectRatioL( TMPXVideoPlaybackCommand aCmd );

        void HandleVolumeCmdL( TMPXPlaybackCommand aCmd );

        void HandleShortPressBackwardL();

        TInt AddDllPath( TDes& aFileName );

        void ShowFileDetailsDialogL();

        void HandleDrmErrorsL( TInt aError );

        TInt OpenDrmFileHandleL( RFile& aFile );
        void LaunchDRMDetailsL();

        void HandleRealOneBitmapTimeoutL();

        TBool IsInMemoryPlugin();

#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
        TInt OpenDrmFileHandle64L( RFile64& aFile );
#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API

    protected: // data
        MMPXPlaybackUtility*                iPlaybackUtility;
        MMPXViewUtility*                    iViewUtility;
        MMPXCollectionUtility*              iCollectionUtility;
        CMPXVideoPlaybackDisplayHandler*    iDisplayHandler;
        CAknWsEventMonitor*                 iAknEventMonitor;

        TMPXPlaybackState                   iPlaybackState;

        CMPXVideoPlaybackContainer*         iContainer;

        TInt                                iVideoResourceOffset;

        CMPFileDetailsDialog*               iFileDetailsDialog;
        CMPXVideoPlaybackViewFileDetails*   iFileDetails;
        CIdle*                              iCloseAO;

        TBool                               iMediaRequested;
        TBool                               iPlaylistView;
        TBool                               iCollectionMediaRequested;
        TBool                               iPdlReloading;
        TBool                               iRealOneDelayedPlay;
        TBool                               iKeyboardInFocus;

        HBufC*                              iClipName;
        
        TBool                               iSyncClose;
};

#endif  // __VIDEOBASEPLAYBACKVIEW_H__

// EOF
