upnpframework/upnpaiwengine/inc/upnpaiwengine.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/*
* Copyright (c) 2005-2007 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:  Header file for the CUPnPAiwEngine class.
*
*/


#ifndef UPNP_AIW_ENGINE_H
#define UPNP_AIW_ENGINE_H

//  INCLUDES
// System
#include <e32base.h>
#include <AknProgressDialog.h>

// avcontroller api
#include "upnpavrenderingsessionobserver.h"
#include "upnpavdeviceobserver.h"
#include "upnpitemresolverobserver.h"

// upnpframework / internal api's
#include "upnpcommonui.h"

// aiwengine internal
#include "upnpaiwengineobserver.h"
#include "upnpaiwtimerobserver.h"


// ENUMERATIONS
enum TUPnPEngineState
    {
    EUPnPEngineNotConnected = 1,
    EUPnPEngineConnectionLost,
    EUPnPEngineConnected,
    EUPnPEngineActive,
    EUPnPEngineBrowsingHomeNetwork
    };

enum TUPnPAiwEngineDeviceType
    {
    EUPnPAiwEngineTargetDeviceWithAudioSupport = 1,
    EUPnPAiwEngineTargetDeviceWithImageAndVideoSupport,
    EUPnPAiwEngineTargetDeviceWithImageSupport
    };

enum TUPnPAiwEngineTransferMode
    {
    EAiwEngineCopy = 0,
    EAiwEngineCopyPlaylist,
    EAiwEngineMove
    };    

// FORWARD DECLARATIONS
class CAknWaitDialog;
class CUPnPAiwTimer;
class MUPnPAVController;
class MUPnPAVRenderingSession;
class MUPnPAVSessionBase;

// CLASS DECLARATION

/**
*  CUPnPAiwEngine
*  The class works as an engine component between the UPnP AIW, UPnP Common 
*  UI components and UPnPAVController components.
*  @since S60 3.0
*/
class CUPnPAiwEngine : public CBase,
                       public MUPnPAVRenderingSessionObserver,
                       public MUPnPAiwTimerObserver,
                       public MProgressDialogCallback,
                       public MUPnPAVDeviceObserver,
                       public MUPnPItemResolverObserver
    {

    public: // Constructors and destructor

        /**
         * Two-phased constructor.
         */
        IMPORT_C static CUPnPAiwEngine* NewL();

        /**
         * Releases the instance.
         *
         * @since S60 3.0
         */
        IMPORT_C static void ReleaseInstance();
        
        /**
         * Destructor.
         */
        virtual ~CUPnPAiwEngine();

    public: // Methods from MUPnPAVDeviceObserver

        // Unnecessary callback methods
        void UPnPDeviceDiscovered( const CUpnpAVDevice& /*aDevice*/ ) {}
        void UPnPDeviceDisappeared (const CUpnpAVDevice& /*aDevice*/ ) {}

        /**
         * Notifies that the WLAN connection has been lost. All sessions
         * are now usable and must be closed.
         *
         * @since Series 60 3.1
         * @return None
         */ 
        void WLANConnectionLost();
        
    public: // UPnP Aiw Engine call back

        /**
         * Sets the observer instance.
         *
         * @since S60 3.0
         * @param aObserver (MUPnPAiwEngineObserver*) observer instance
         */
        IMPORT_C void SetEngineObserver( MUPnPAiwEngineObserver* aObserver );

        /**
         * Removes the observer instance.
         *
         * @since S60 3.0
         */
        IMPORT_C void RemoveEngineObserver();

    public:

        /**
         * Returns the state of the UPnP AIW Engine.
         *
         * @since S60 3.0
         * @return TUPnPEngineState State of the engine
         */
        IMPORT_C TUPnPEngineState EngineState();

        /**
         * Opens the External media UI.
         *
         * Leaves if the UpnpAiwEngine is already in use, if the
         * UpnpAvController instantiation fails, or if the device selection/
         * browse dialog leaves.
         *
         * @since S60 3.0
         */
        IMPORT_C void OpenExternalMediaL();

        /**
         * Enables the showing of local media files on a remote renderer 
         * device.
         *
         * Leaves if the UpnpAiwEngine is already in use, if the
         * UpnpAvController instantiation fails, or if the device selection
         * dialog leaves.
         *
         * @since S60 3.0
         */
        IMPORT_C void EnableExternalL();

        /**
         * Disables the showing of local media files on remote renderer 
         * device.
         *
         * @since S60 3.0
         */
        IMPORT_C void DisableExternal();

        /**
         * Copies local files to a remote media server.
         *
         * @since S60 3.0
         * @param aFileNames (RPointerArray<TDesC>&) Reference to an array
         *        of TDesC objects containing the list of file names. All 
         *        files that are successfully copied are removed from the
         *        list.
         */
        IMPORT_C void CopyToExternalL( RPointerArray<TDesC>& aFileNames );

        /**
         * Copies a local playlist to a remote media server.
         *
         * @since S60 3.0
         * @param aFileNames (RPointerArray<TDesC>&) Reference to an array
         *        of TDesC objects containing the list of file names. All
         *        files that are successfully copied are removed from the 
         *        list.
         * @param aPlaylistName (const TDesC&) name of the playlist
         */
        IMPORT_C void CopyPlaylistToExternalL(
                                    const TDesC& aPlaylistName,
                                    RPointerArray<TDesC>& aFileNames );

        /**
         * Moves local files to a remote media server.
         *
         * @since S60 3.0
         * @param aFileNames (RPointerArray<TDesC>&) Reference to an array
         *        of TDesC objects containing the list of file names. All
         *        files that are successfully moved removed from the list.
         */
        IMPORT_C void MoveToExternalL( RPointerArray<TDesC>& aFileNames );

        /**
         * Plays (sends for rendering) local media file using the selected
         * UPnP Media renderer. Only image and video files are supported
         * after Upnp Fw 2.0.
         *
         * Leaves if the given filename is not valid, file is not a media
         * file, if the UpnpAiwEngine is not ready (enable external to done),
         * or if the bearer or remote upnp device is lost.
         *
         * @since S60 3.0
         * @param aFileName (const TDesC&) reference to the file name of
         *        the media file.
         */
        IMPORT_C void PlayL( const TDesC& aFileName );

        /**
         * Displays connection error if creating of control point fails.
         *
         * @since S60 3.1
         */
        IMPORT_C void ShowConnectionErrorL();

    public: // Methods to update the singleton reference counter

        /**
         * Sets the initial value of the user counter to zero.
         *
         * @since S60 3.0
         */
        void InitialiseUserCounter();

        /**
         * Increases the value of the user counter.
         *
         * @since S60 3.0
         */
        void IncreaseUserCounter();

        /**
         * Decreases the value of the user counter.
         *
         * @since S60 3.0
         */
        void DecreaseUserCounter();

        /**
         * Gets the value of the user counter.
         *
         * @since S60 3.0
         * @return TInt
         */
        TInt UserCounter() const;

        /**
         * Displays connection lost error if copying files fails.
         *
         * @since S60 3.2.3
         */
        void ShowConnectionLostCopyErrorL();

    private:

        /**
         * Transfers (copies/moves) local files/playlist to a remote media
         * server.
         *
         * Leaves if the given parameters are not valid, if the UpnpAiwEngine
         * is already in use, if user cancels the operation, or if the bearer
         * or remote upnp device is lost.
         *
         * @since S60 3.0
         * @param aMode (TUPnPAiwEngineTransferMode) transfer mode
         * @param aFileNames (RPointerArray<TDesC>&) Reference to an array
         *        of TDesC objects containing the list of file names. All
         *        files that are successfully copied are removed from the
         *        list.
         * @param aPlaylistName (const TDesC&) name of the playlist
         */
        void TransferToExternalL( TUPnPAiwEngineTransferMode aMode,
                                  RPointerArray<TDesC>& aFilePaths,
                                  const TDesC& aPlaylistName );

        /**
         * Starts a rendering session with UpnpAvController. Queries the
         * target rendering device.
         *
         * Leaves if any instantiation fails or used cancels the device
         * selection.
         *
         * @since S60 3.0
         * @param aDeviceType (TUPnPAiwEngineDeviceType) type of the device
         */
         void StartRenderingSessionL( TUPnPAiwEngineDeviceType aDeviceType );

        /**
         * Handles the UPnP device disappeared call back method.
         *
         * @since S60 3.0
         * @param aDevice (const CUpnpAVDevice&) pointer to the device info
         */
        void HandleUPnPDeviceDisappearedL( const CUpnpAVDevice& aDevice );

        /**
         * Waits for local media server file sharing activation (or user 
         * cancel).
         *
         * @since S60 3.1
         * @param aSession (MUPnPAVSessionBase*) pointer to the AVController
         *        session.
         */
        void StartLocalFileSharingL( MUPnPAVSessionBase *aSession );

    public: // Call back methods of MUPnPAVRenderingSessionObserver

        // Unused callback methods
        void VolumeResult( TInt /*aError*/,
                           TInt /*aVolumeLevel*/,
                           TBool /*aActionResponse*/ ) {}
        void MuteResult( TInt /*aError*/,
                         TBool /*aMute*/,
                         TBool /*aActionResponse*/ ) {}
        void PositionInfoResult( TInt /*aError*/,
                                 const TDesC8& /*aTrackPosition*/,
                                 const TDesC8& /*aTrackLength*/ ) {}
        void SetNextURIResult( TInt /*aError*/ ) {}

        /**
         * UPnP AV Controller calls this method to indicate that the requested
         * interaction operation (play, stop, etc.) is complete. In other
         * words, the target rendering device has changed it's state 
         * accordingly.
         *
         * @since Series 60 3.1
         * @param aError (TInt) error code
         * @param aOperation (TAVInteractOperation) operation Id
         */
        void InteractOperationComplete( TInt aError,
                                        TUPnPAVInteractOperation aOperation );

        /**
         * UPnP AV Controller calls this method as a response to SetUri
         * action.
         *
         * @since Series 60 3.1
         * @param aError (TInt) error code
         */
        void SetURIResult( TInt aError );

        /**
         * Notifies that the Media Renderer we have a session with has
         * disappeared. Session is now unusable and must be closed. 
         *
         * @since Series 60 3.1
         * @param aReason (TUPnPDeviceDisconnectedReason) reason code
         */
        void MediaRendererDisappeared(
                            TUPnPDeviceDisconnectedReason aReason );

    public: // Call back methods of MUPnPAVSessionObserverBase
    
         /**
         * Notifies that the Media Server startup has completed. 
         *
         * @since Series 60 3.1
         * @return aError (TInt) error code
         */        
        void ReserveLocalMSServicesCompleted( TInt aError );

    public: // Call back methods of MAknProgressDialogCallback

        /**
         * ProgressDialog call back method.
         * Get's called when a dialog is dismissed.
         *
         * @since S60 3.0
         * @param aButtonId (TInt) ID of the button pressed
         */
        void DialogDismissedL( TInt aButtonId );

    public: // Timer related methods

        /**
         * Starts the UPnPAiWTimer.
         *
         * @since S60 3.0
         */
        void StartTimer();

        /**
         * Stops the UPnPAiWTimer.
         *
         * @since S60 3.0
         */
        void StopTimer();

        /**
         * Callback method for the UPnPAiwTimer.
         *
         * @since S60 3.0
         */
        void TimerCallback();

    private: // Helper methods

        /**
         * Method for selecting a device.
         *
         * Leaves if the engine is not ready (UpnpAvController not 
         * instantiated), if the user cancels the operation, or if the bearer
         * is lost during the device selection.
         *
         * @since S60 3.1
         * @param aDeviceType (TUPnPDeviceTypesToSearch) type of device
         * @param aDlgTitle title used in device selection dialog
         * @return CUpnpAVDevice* selected upnp av device.
         */
        CUpnpAVDevice* SelectDeviceL( 
                TUPnPDeviceTypesToSearch aDeviceType,
                TUPnPDialogTitle aDlgTitle );
        
        /**
         * Method for releasing upnp resource.
         *
         * @since S60 3.1
         * @param none
         * @return none
         */
        void ReleaseUpnpResourceL();
        
        /**
         * Method for playing a local file
         *
         * @since S60 3.1
         * @param none
         * @return none
         */
        void InitPlayL();
        
        /**
         * Method for playing a local video
         *
         * @since S60 3.1
         * @param aFilePath file path
         * @return none
         */
        void StartVideoPlayL( const TDesC& aFileName );
        
        /**
         * Shows info note after the file transfer has been completed.
         * 
         * @since S60 5.1
         * @param aMode Type of file transfer (copy or move)
         * @param aCount Number of files copied to server
         * @param aDevice Device files were copied to
         * @return none
         */
        void ShowTransferInfoNoteL( 
                TUPnPAiwEngineTransferMode aMode,
                TInt aCount, 
                const CUpnpAVDevice& aServerName ) const;

        /**
         * creates upnpitem using helper resolve local item
         * 
         * @since S60 5.1
         * @param aFileName 
         */
        void CreateUpnpItemAndSetUriL( const TDesC& aFileName );
        
        /**
         * Helper method to create MUPnPItemResolver.
         * 
         * @since S60 5.1
         * @param aFilePath file path
         * @return Pointer to resolver instance that is put to cleanupstack.
         */
        MUPnPItemResolver* CreateResolverLC( const TDesC& aFilePath );
        
        /**
         * Static cleanup function for MUPnPItemResolver.
         * Method makes sure that MUPnPItemResolver is properly cleaned up.
         * 
         * @since S60 5.1
         * @param aResolver TAny pointer to CUPnPAiwEngine object.
         */
        static void CleanupResolver( TAny* aAiwEngine );

        /**
         * starts asynchronous CActiveSchedulerWait
         */
        void Wait();
        
        /**
         * stops asynchronous CActiveSchedulerWait
         */
        void StopWait();
        
    private: // Construction methods

        // Constructor
        CUPnPAiwEngine();

        /**
         * ConstructL.
         */
        void ConstructL();
        
    private: // from MUPnPItemResolverObserver
        
        /**
         * see MUPnPItemResolverObserver
         */
        void ResolveComplete( 
                const MUPnPItemResolver& aResolver,
                TInt aError );

    private: // Data members

        // State of the engine
        TUPnPEngineState iEngineState;

        // Reference to the AV Controller ECom plug-in
        MUPnPAVController* iAVController;                   // owned

        // Reference to the AIW Provider instance
        MUPnPAiwEngineObserver* iObserver;                  // not owned

        // File sharing activation wait note and related member vars
        CAknWaitDialog* iFileSharingActivationWaitNote;     // owned;
        TBool iLocalFileSharingActivated;
        TInt iFileSharingError;

        // CoeEnv and the resource offset (needed when loading and
        // unloading resources)
        CEikonEnv* iCoeEnv;                                 // not owned
        TInt iResFileOffset;

        // Wait note dialog
        CAknWaitDialog* iWaitNoteDialog;                    // owned

        // Timer
        CUPnPAiwTimer* iUPnPAiwTimer;                       // owned

        MUPnPAVRenderingSession* iRenderingSession;         // owned
        
        CUPnPCommonUI* iCommonUI;                            //owned 
        HBufC16*       iFileName;               

        TBool   iRenderingSessionInUse;
        TBool   iVideoPlay;
        TBool    iVideoPlayCancel;
        TBool   iVideoPlayWait;
    private: // Singleton data members

         // Counter, which maintains the number of users of this singleton
        TInt iNumberOfUsers;
        
        /**
         * For async operations
         */
        CActiveSchedulerWait             iWait;
        
        MUPnPItemResolver*               iResolver;
        
        TInt                             iResolveResult;
    };

#endif // UPNP_AIW_ENGINE_H

// End of file