upnpmpxplugins/upnpplaybackplugins/inc/upnpvaluestatemachine.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) 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:      Class for retrieving and selecting media renderers
*
*/






#ifndef C_UPNPVALUESTATEMACHINE_H
#define C_UPNPVALUESTATEMACHINE_H

// INCLUDES
#include <e32base.h>
#include <mpxplaybackframeworkdefs.h>

// FORWARD DECLARATIONS
class CUPnPMusicPlayer;
class MUPnPAVRenderingSession;



/**
 * Class for handling playback state machine functionality
 *
 * @lib upnpmusicplugins.lib
 * @since S60 v3.1
 */
class CUPnPValueStateMachine : public CBase
    {

public: // construction / destruction

    /**
     * Static 1st phase constructor
     *
     * @since Series 60 3.1
     * @param aParent the parent plugin instance
     * @param aRenderingSession for playback commands
     */
    static CUPnPValueStateMachine* NewL( 
        CUPnPMusicPlayer& aParent,
        MUPnPAVRenderingSession& aRenderingSession );

    /**
     * Destructor
     *
     * @since Series 60 3.1
     */
    virtual ~CUPnPValueStateMachine();

public: // datatypes used in this class
   
    /**
     * current type of operation
     */
    enum TOperationType
        {
        EOperationNone,     // no operation going on
        EOperationValue,    // value get
        EOperationSet,      // value set
        EOperationDurationQuery, // internal duration query
        EOperationPositionQuery, // internal position query
        EOperationVolumeQuery, // internal volume query
        EOperationMute // internal mute
        };

    /**
     * An internal operation class
     */
    class TOperation
        {
        public:
        /** construction */
        TOperation( TOperationType aType )
            : iType( aType ) {}
        TOperation( TOperationType aType, TInt aValue )
            : iType( aType )
            , iValue( aValue ) {}
        TOperation( TMPXPlaybackProperty aProperty, TInt aValue )
            : iType( EOperationSet )
            , iProperty( aProperty )
            , iValue( aValue ) {}
        TOperation( TMPXPlaybackProperty aProperty )
            : iType( EOperationValue )
            , iProperty( aProperty ) {}

        /** setters */
        void operator=( TOperationType aType )
            {
            iType = aType;
            }
        void Set( TMPXPlaybackProperty aProperty, TInt aValue )
            {
            iType = EOperationSet;
            iProperty = aProperty;
            iValue = aValue;
            }
        void Set( TMPXPlaybackProperty aProperty )
            {
            iType = EOperationValue;
            iProperty = aProperty;
            }
        void Reset()
            {
            iType = EOperationNone;
            }
        /** comparision */
        TBool operator==( TOperationType aType )
            {
            return ( iType == aType );
            }
        TBool Compare( TOperationType aType, TMPXPlaybackProperty aProperty )
            {
            return ( iType == aType && iProperty == aProperty );
            }
        TBool None()
            {
            return ( iType == EOperationNone );
            }
        /** identifies the operation type */
        TOperationType iType;
        /** playback property, if op == Value or Set */
        TMPXPlaybackProperty iProperty;
        /** playback property value, if op == Set */
        TInt iValue;
        };

    /**
     * A result of validation query.
     * Indicates what to do with a Value- or a Set- call
     */
    enum TValidationResult
        {
        EHandle, // handle the call in value state machine
        EHandleStatic, // handle the call statically in v.s.m.
        EErrorNotReady, // async error (KErrNotReady)
        EErrorNotSupported, // async error (KErrNotSupported)
        EIgnore // do absolutely nothing
        };

public: // services
    
   /**
    * A method to copy some static renderer-specific values from
    * another instance of a state machine. Note that one instance is
    * track specific, so track specific cached values are NOT copied,
    * (track duration etc.) but renderer specific values are copied
    * (volume etc)
    * @param aOther another instance to copy values from
    */
    void CopyValues( const CUPnPValueStateMachine& aOther );

   /**
    * See CMPXPlaybackPlugin
    */
    void SetL( TMPXPlaybackProperty aProperty, TInt aValue );

   /**
    * See CMPXPlaybackPlugin
    */
    void ValueL( TMPXPlaybackProperty aProperty );
    
   /**
    * See MUPnPRenderiongSessionObserver
    */
    void VolumeResult( TInt aError, TInt aVolumeLevel,
        TBool aActionResponse );
    
   /**
    * See MUPnPRenderiongSessionObserver
    */
    void MuteResult( TInt aError, TBool aMute, TBool aActionResponse );
    
   /**
    * See MUPnPRenderiongSessionObserver
    */
    void PositionInfoResult( TInt aStatus, const TDesC8& aTrackPosition,
        const TDesC8& aTrackLength );

    /**
     * Initiates a duration request, which will be reported to
     * the plugin observer as a change event
     */
    void DurationQueryL();
    
    /**
     * Initiates a position request
     */
    void PositionQueryL();

    /**
     * Initiates a volume request, which will be reported to
     * the plugin observer as a change event
     */
    void VolumeQueryL();

    /**
     * Initiates an internal mute request, which will not be reported.
     * @param aMute if other than zero, mute will be activated
     */
    void MuteRequestL( TInt aMute );

    /**
     * Validates a Value- or Set- call with given property in given
     * player state. There will be a result indicating what to do with
     * the call.
     * @param aProperty the property to be either get or set
     * @param aSetting true if setting the value, false if getting
     * @param aPlayerState state of the player plugin
     * @param aIsReady is remote device to gíve playback information
     * @return result of validation
     */
    static TValidationResult ValidatePropertyInState(
        TMPXPlaybackProperty aProperty,
        TBool aSetting,
        TInt aPlayerState,
        TBool aIsReady );

    /**
     * A static version of Value query - this one is capable of handling
     * some fixed Value queries that do not need network resources
     */
    static void ValueStatic(
         TMPXPlaybackProperty aProperty,
         MMPXPlaybackPluginObserver& aPlaybackObs );

    /**
     * Cancels any ongoing operation
     * (actually it just resets the state so the result will be ignored
     * and not reported)
     */
    void Cancel();

private:

    /**
     * Private default constructor
     *
     * @since Series 60 3.1
     * @param aParent the parent plugin instance
     * @param aRenderingSession for playback commands
     */
    CUPnPValueStateMachine( 
        CUPnPMusicPlayer& aParent,
        MUPnPAVRenderingSession& aRenderingSession );

    /**
     * Checks if operations are in the queue, and executes
     */
    void CheckOperationInQueueL();
    
    /**
     * Check if given property are in queue
     * @param aProperty property to be searched
     * @return Etrue if found
     */
    TBool FoundFromQueue( TMPXPlaybackProperty aProperty );

private: // data
        
    /**
     * Parent plugin instance
     */ 
    CUPnPMusicPlayer&                   iParent;
    
    /**
     * Rendering session
     */ 
    MUPnPAVRenderingSession&            iRendererSession;
    
    /**
     * currently ongoing operation
     */
    TOperation                          iCurrentOperation;

    /**
     * queue of operations pending
     */
    RArray<TOperation>                  iOperationQueue;

    /**
     * current renderer volume level.
     * cached internally to avoid unnecessary message traffic.
     */
    TInt                                iRendererVolume;

    /**
     * current renderer muted state (1 = muted, 0 = normal)
     * cached internally to avoid unnecessary message traffic.
     */
    TInt                                iRendererMuted;

    };


#endif // C_UPNPVALUESTATEMACHINE_H