mmsharing/mmshengine/inc/musengmcesession.h
branchRCL_3
changeset 22 73a1feb507fb
parent 16 ce86b6d44a6d
child 23 bc78a40cd63c
--- a/mmsharing/mmshengine/inc/musengmcesession.h	Thu Aug 19 09:51:39 2010 +0300
+++ b/mmsharing/mmshengine/inc/musengmcesession.h	Tue Aug 31 15:12:07 2010 +0300
@@ -16,22 +16,27 @@
 */
 
 
-#ifndef MUSHENGMCESESSION_H
-#define MUSHENGMCESESSION_H
+#ifndef MUSENGMCESESSION_H
+#define MUSENGMCESESSION_H
 
 // USER
-#include "musengsession.h"
 #include "musengsessiondurationtimerobserver.h"
 #include "musunittesting.h"
 #include "mussipprofileuser.h"
+#include "musengdisplayhandler.h"
+#include "musengaudioroutingobserver.h"
 
 // SYSTEM
+#include <lcsession.h>
+#include <lcaudiocontrol.h>
 #include <mcesessionobserver.h>
 #include <mceinsessionobserver.h>
 #include <mcestreamobserver.h>
 #include <mcertpobserver.h>
 #include <mcetransactiondatacontainer.h>
+#include <mcemediasource.h>
 
+// FORWARD DECLARATIONS
 class CMceManager;
 class CMceSession;
 class CMceVideoStream;
@@ -39,8 +44,10 @@
 class CMceVideoCodec;
 class CMceAudioCodec;
 class CMusEngSessionDurationTimer;
-class MMusEngSessionObserver;
 class CMusSipProfileHandler;
+class CMusEngTelephoneUtils;
+class MMusEngAudioRoutingObserver;
+class MLcSessionObserver;
 
 // CONSTANTS
 
@@ -51,14 +58,20 @@
 _LIT8( KMusEngSessionSdpLineXApplication, "a=X-application:com.nokia.rtvs\r\n" );
 _LIT8( KMusEngSessionSdpLineApplication , "a=application:com.gsma.rts\r\n" );
 _LIT8( KMusEngSessionSdpLineType, "a=type:videolive\r\n" );
-_LIT8( KMusEngSessionSdpLineBandwidthLine  , "b=AS" );
+_LIT8( KMusEngSessionSdpLineBandwidthLine  , "b=AS:" );
 _LIT8( KMusEngSessionSdpLineBandwidthField  , "b=AS:85\r\n" );
+_LIT8( KMusEngSessionSdpLineTiasLine  , "b=TIAS:" );
 _LIT8( KMusPPreferredIdentity, "P-Preferred-Identity" );
-_LIT8( KMusPrivacyHeader, "Privacy" );
-_LIT8( KMusAnonymousHeader, "\"Anonymous\" <sip:anonymous@anonymous.invalid>" );
+_LIT8( KMusEngNewLine  , "\r\n" );
 
-const TInt KMusEngMaxVolume = 10;
-const TInt KMusEngMinVolume = 0;
+const TInt KMusTiasMultiplier = 1000;
+const TUint8 KMusEngRtpKeepAliveTimer = 5;
+const TUint8 KMusEngKeepAlivePayloadTypeVideoH263 = 96;
+const TUint8 KMusEngKeepAlivePayloadTypeAudio = 97;
+const TUint8 KMusEngKeepAlivePayloadTypeVideoAvc = 98;
+
+// Value for uninitialized rect
+const TInt KMusEngRectNotInit = 1000;
 
 // CLASS DECLARATION
 
@@ -72,26 +85,18 @@
 *
 * @lib musengine.lib
 */
-class CMusEngMceSession : public CMusEngSession,
+class CMusEngMceSession : public CBase,
+                          public MLcSession,
+                          public MLcAudioControl,
                           public MMceSessionObserver,
                           public MMceInSessionObserver,
                           public MMceStreamObserver,
                           public MMceRtpObserver,
                           public MMusEngSessionDurationTimerObserver,
-                          public MMusSipProfileUser
+                          public MMusSipProfileUser,
+                          public MMusEngDisplayHandler,
+                          public MMusEngAudioRoutingObserver
     {
-    
-    public: 
-    
-        /*
-        * Defines possible rotations 
-        */
-        enum TDisplayOrientation
-            {
-            EPortrait, // Normal
-            ELandscape // 90 degree's clockwise rotation
-            };
-        
     public:
 
         /**
@@ -99,51 +104,35 @@
         */
         ~CMusEngMceSession();
 
-
-    public: // API FUNCTIONS
-
-        /**
-        * Terminates session. 
-        *
-        * @pre Session is established
-        * @post Session is ready to be deleted
-        * @leave KErrNotReady if precondition is not fullfilled
-        */
-        IMPORT_C void TerminateL();
-
-        /**
-        * Get session time return estabilished session time
-        *
-        * @return TTime returns time if connection established else < 0
-        */
-        IMPORT_C TTimeIntervalSeconds GetSessionTime() const;
+        
+    public: //  from MMusEngDisplayHandler
 
         /**
-        * Returns current connection state
+        * Returns currently assigned drawing area
         *
-        * @return TBool returns current connection state
+        * @return TRect This session drawing area rectangle
         */
-        IMPORT_C TBool ConnectionActive() const;
-
-        /**
-        * Returns presence or absence of audio in session.
-        *
-        * @pre Session is ongoing
-        * @return ETrue if session contains audio.
-        * @leave KErrNotReady if precondition is not fullfilled
-        */
-        IMPORT_C TBool ContainsAudioL();
+        TRect Rect() const;
         
         /**
-        * Returns state of local playback meaning if playback is muted or not.
+        * Sets new drawing area
         *
-        * @pre Session is ongoing
-        * @return ETrue if session does not contain audio or contained 
-        *         audio is muted.
-        * @leave KErrNotReady if precondition is not fullfilled
+        * @param TRect This session new drawing area rectangle
+        */
+        void SetRectL( const TRect& aRect );
+        
+        /**
+        * Sets secondary rect (e.g. viewfinder in twoway session)
+        * @param TRect This session new secondary drawing area rectangle
         */
-        IMPORT_C TBool IsMutedL();
-
+        void SetSecondaryRectL( const TRect& aSecondaryRect );
+        
+        /**
+        * Gets secondary rect.
+        * @return TRect This session secondary drawing area rectangle
+        */
+        virtual TRect SecondaryRect() const;
+            
         /**
         * Returns current display orientation.
         *
@@ -151,7 +140,7 @@
         * @return Current display orientation 
         * @leave KErrNotReady if precondition is not fullfilled
         */
-        IMPORT_C TDisplayOrientation OrientationL();
+        TDisplayOrientation OrientationL();
         
         /**
         * Sets display orientation.
@@ -160,79 +149,106 @@
         * @return Sets display orientation 
         * @leave KErrNotReady if precondition is not fullfilled
         */
-        IMPORT_C void SetOrientationL( TDisplayOrientation aOrientation );
-        
-        /**
-        * Returns state of the screen device.
-        * 
-        * @pre Session is ongoing
-        */
-        IMPORT_C TBool IsDisplayEnabledL();
-
-    public: // VIRTUAL API
-
-        // No virtual api
-
-
-    public: //  from CMusEngSession  
-
-        /**
-        * Increases volume level by one
-        *
-        * @pre Session is ongoing
-        */
-        IMPORT_C void VolumeUpL();
-
-        /**
-        * Decreases volume level by one
-        *
-        * @pre Session is ongoing
-        */
-        IMPORT_C void VolumeDownL();
-        
-        /**
-        * Set volume value
-        * @pre Session is ongoing
-        * @param aVal the value of volume 
-        */
-        IMPORT_C void SetVolumeL( TInt aVal );
+        void SetOrientationL( TDisplayOrientation aOrientation );
 
         /**
         * Permission to draw on screen device.
         * 
         * @pre Session is ongoing
         */
-        IMPORT_C void EnableDisplayL( TBool aEnable );
-
+        void EnableDisplayL( TBool aEnable );
+        
         /**
-        * Implements virtual from CMusEngSession
+        * Implements virtual from MMusEngDisplayHandler
+        *
+        * @pre Session is ongoing
+        */
+        TBool IsDisplayEnabled();
+        
+        /**
+        * Implements virtual from MMusEngDisplayHandler
         *
         * @pre Session is ongoing
         */
-        IMPORT_C void MuteL();
+        TBool IsDisplayActive();
+
+        
+    public: // From MMusEngAudioRoutingObserver
+        
+        void AudioRoutingChanged();        
+        
+        
+    public: // From MLcSession
+        
+        virtual TLcSessionState LcSessionState() const;
+        
+        void SetLcSessionObserver( MLcSessionObserver* aObserver );
+
+        void SetLcUiProvider( MLcUiProvider* aUiProvider );        
+        
+        virtual MLcVideoPlayer* RemoteVideoPlayer();
+    
+        virtual MLcVideoPlayer* LocalVideoPlayer();       
+       
+        virtual const TDesC& LocalDisplayName();
+    
+        virtual const TDesC& RemoteDisplayName();
+
+        TInt SetParameter( TInt aId, TInt aValue );
 
-        /**
-        * Implements virtual from CMusEngSession
-        *
-        * @pre Session is ongoing
-        */
-        IMPORT_C void UnmuteL();
+        TInt ParameterValue( TInt aId );    
+        
+        TBool IsBackgroundStartup();
+        
+        TInt SetForegroundStatus( TBool aIsForeground );
+        
+        const TDesC& RemoteDetails();
+        
+        void UpdateLcSessionL();
+        
+        TBool SendDialTone( TChar aKey);
+        
+        
+    public: // From MLcAudioControl
         
-        void RefreshOrientationL();
+        TBool IsLcAudioMutedL();
+
+        void MuteLcAudioL( TBool aMute );       
+
+        TBool IsLcMicMutedL();    
+
+        void MuteLcMicL( TBool aMute );
+        
+        TBool IsEnablingLcLoudspeakerAllowed();
+
+        void EnableLcLoudspeakerL( TBool aEnabled );
         
+        TBool IsLcLoudspeakerEnabled();
 
+        TInt LcVolumeL();
+     
+        void SetLcVolumeL( TInt aValue );    
+    
+        void IncreaseLcVolumeL();
+        
+        void DecreaseLcVolumeL();        
+
+    public:
+        
+        MLcSessionObserver* LcSessionObserver();
+        
+        MLcUiProvider* LcUiProvider();
+        
     protected: // CONSTRUCTORS
 
         /**
         * Constructor
         *
         */
-        CMusEngMceSession( const TRect& aRect,
-                           MMusEngSessionObserver& aSessionObserver );
+        CMusEngMceSession();
 
         /**
         * Second-phase constructor
-        *
         */
         void ConstructL();
         
@@ -258,7 +274,8 @@
         * gets called for every video codec in session. To be overridden in 
         * sibling classes if needed.
         */ 
-        virtual void AdjustVideoCodecL( CMceVideoCodec& aVideoCodec );
+        virtual void AdjustVideoCodecL( CMceVideoCodec& aVideoCodec,
+                                        TMceSourceType aSourceType );
         
         /**
         * Sets Multimediasharing specific audio codec settings like audio MMF 
@@ -274,13 +291,27 @@
         */
         virtual void DoCodecSelectionL( CMceVideoStream& aVideoStream );
         
+        virtual void RectChangedL();
         
     protected: // HELPER FUNCTIONS
 
-        /**
-        *
-        */
-        void RectChangedL();
+        void InformObserverAboutSessionStateChange();
+        
+        void InformObserverAboutSessionUpdate();
+        
+        void InformObserverAboutSessionFailure( TInt aReason );
+        
+        void InformObserverAboutPlayerStateChange( MLcVideoPlayer* aPlayer );
+        
+        void InformObserverAboutPlayerUpdate( MLcVideoPlayer* aPlayer );
+        
+        void InformObserverAboutPlayerFailure( 
+            MLcVideoPlayer* aPlayer, 
+            TInt aReason );
+        
+        void InformUiProviderAboutReceivingStart();
+        
+        MLcUiProvider& LcUiProviderL();
   
         /**
         * Sets session specific SDP lines to a session.
@@ -323,15 +354,9 @@
         void Reject( CMceInSession& aSession,
                      const TDesC8& aReason = KNullDesC8(),
                      TUint32 aCode = 0 );
-
-    protected:  // from CMusEngSession
-	
-        /**
-        *
-        */
-        void VolumeChanged( TInt aVolume, TBool aAudioRouteChanged );
-             
-    
+        
+        void SaveContactL( const TDesC8& aAddress );
+            
     protected: // from MMceInSessionObserver
     
         /**
@@ -485,14 +510,30 @@
         void SsrcRemoved( CMceMediaStream& aStream,
                           CMceRtpSource& aSource,
                           TUint aSsrc );       
-                          
-	private: // from MMusSipProfileUser
+    
+        
+    private: // from MMusSipProfileUser
+        
+        virtual TBool IsRoamingBetweenAPsAllowed();
+        
+        virtual void ProfileRegistered();
+        
         
-        TBool IsRoamingBetweenAPsAllowed();
-      			
     private: // HELPER FUNCTIONS
 
         /**
+        * Adds b=AS and b=TIAS lines to the array
+        */
+        void AddSdpBandwidthAttributesL( CDesC8Array& aSdpLinesArray,
+                                         TInt aBandwidthAs );
+
+        /**
+        * Checks whether AS or TIAS bandwidth attributes present in the array 
+        */
+        TBool IsBandwidthAttributeSet( MDesC8Array* aSdpLinesArray );
+
+
+        /**
         * Callback
         */
         void UpdateTimerEvent();
@@ -518,19 +559,58 @@
                                      const CMceVideoCodec& aBestBitrateVideoCodec );
                                      
         void DoCodecModeBasedRemovalL( CMceVideoStream& aVideoStream );
+  
         /**
-         * This function currently used to remove the AVC codec support based on
-         * cenrep encoder device uid value.
-         */
-        void DoCodecConfigurationBasedRemovalL( CMceVideoStream& aVideoStream );
-
-
-    protected: // MEMBERS
+        * Get session time return estabilished session time
+        * @return TTime returns time if connection established else < 0
+        */
+        TTimeIntervalSeconds GetSessionTime() const;        
+        
+    protected:
+        
+        /**
+        * Reads from CenRep and sets encoding device for a codec.
+        */
+        void SetEncodingDeviceL( CMceVideoCodec& aVideoCodec );
 
         /**
-        * Callback reference to session observer interface.
+        * Sets configuration key for a codec
+        */
+        void SetCodecConfigKeyL( CMceVideoCodec& aVideoCodec );
+    
+        /**
+        * Reads proper configuration key for a codec. NULL if not available.
+        * Ownership is transferred.
+        */
+        HBufC8* ReadCodecConfigKeyL( const CMceVideoCodec& aVideoCodec ) const;
+        
+        /**
+        * Constructs and stores to cenrep a concatenation of all AVC config keys.
+        */
+        void StoreEncoderConfigInfoL() const;
+        
+        /**
+        * Returns config key id for the provided codec. Ownership is transferred
         */
-        MMusEngSessionObserver& iSessionObserver;
+        const TPtrC8 ConfigKeyIdL( const CMceVideoCodec& aVideoCodec ) const;
+
+            
+    protected: // Data
+
+        /**
+        * Drawing area rect.
+        */
+        TRect iRect;
+
+        /**
+        * Telephone utilities.
+        */
+        CMusEngTelephoneUtils* iTelephoneUtils;        
+        
+        /**
+         * UID used to identify application, needed to create MCE manager
+         */
+        TUid iMceManagerUid;
         
         /**
         * Class for connecting to MCE server.
@@ -559,14 +639,44 @@
         */
         TBool iOperatorVariant;
 
-		/**
+        /**
         * The handler for the SIP profile related to this session
         */
         CMusSipProfileHandler* iSipProfileHandler;
 
-    private:
+        /**
+        * Session state for MLcSession 
+        */
+        MLcSession::TLcSessionState iLcSessionState;       
+        
+        /**
+        * If true, configuration key of current AVC codec must be written to
+        * CenRep after session establishment.
+        */
+        TBool iStoreEncoderConfigInfo;
+        
+        /**
+        * Remote details 
+        */
+        HBufC* iRemoteDetails;
+        
+    private: // New functions
+        
+        void StreamStreaming( CMceMediaStream& aStream );
+                
+    private: // Data
 
         /**
+        * The session observer, if present.
+        */
+        MLcSessionObserver* iLcSessionObserver;
+
+        /**
+        * The UI provider, if present.
+        */        
+        MLcUiProvider* iLcUiProvider;        
+        
+        /**
         * It is assumed, that user has only one instance of this class.
         * The same instance is passed between MCE and user, but the data
         * inside of this container is just updated for each event.
@@ -578,7 +688,7 @@
         */
         TTime iStartTime;
 
-        CMusEngSessionDurationTimer*   iUpdateTimer;
+        CMusEngSessionDurationTimer* iUpdateTimer;
         
         /**
         * Value indicating seconds gone since last received RTCP sender or 
@@ -591,11 +701,18 @@
         * muted as part of disabling bundled display sink 
         */
         TBool iExplicitlyMuted;
-
-
+        
+        /**
+        * Value indicates whether session was started in background mode.
+        * (see IsBackgroundStartup()). Once application comes to foreground, 
+        * iBackground is set to EFalse
+        */
+        TBool iBackground;
+        
     MUS_UNITTEST( UT_CMusEngSession )
     MUS_UNITTEST( UT_CMusEngMceSession )
     MUS_UNITTEST( UT_CMusEngReceiveSession )
+    MUS_UNITTEST( UT_CMusEngSessionManager )
     };
     
-#endif //MUSHENGMCESESSION_H
+#endif // MUSENGMCESESSION_H