--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshengine/inc/musengmcesession.h Fri Jun 11 13:36:18 2010 +0300
@@ -0,0 +1,718 @@
+/*
+* Copyright (c) 2005 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:
+*
+*/
+
+
+#ifndef MUSENGMCESESSION_H
+#define MUSENGMCESESSION_H
+
+// USER
+#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;
+class CMceAudioStream;
+class CMceVideoCodec;
+class CMceAudioCodec;
+class CMusEngSessionDurationTimer;
+class CMusSipProfileHandler;
+class CMusEngTelephoneUtils;
+class MMusEngAudioRoutingObserver;
+class MLcSessionObserver;
+
+// CONSTANTS
+
+_LIT8( KMusEngAcceptContactHeader,
+ "Accept-Contact: *;+g.3gpp.cs-voice; explicit" );
+_LIT8( KMusAcceptHeader,
+ "Accept: application/sdp" );
+_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( KMusEngSessionSdpLineBandwidthField , "b=AS:85\r\n" );
+_LIT8( KMusEngSessionSdpLineTiasLine , "b=TIAS:" );
+_LIT8( KMusPPreferredIdentity, "P-Preferred-Identity" );
+_LIT8( KMusEngNewLine , "\r\n" );
+
+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
+
+/**
+* Base class for Multimedia Sharing Engine MCE sessions, inherited by
+* CMusEngLiveSession CMusEngClipSession and CMusEngReceiveSession.
+*
+* CMusEngMceSession encapsulates CMCESession and simplifies use of
+* MCE Sessions to user interface. Also splits observers messy events
+* to simplified function calls.
+*
+* @lib musengine.lib
+*/
+class CMusEngMceSession : public CBase,
+ public MLcSession,
+ public MLcAudioControl,
+ public MMceSessionObserver,
+ public MMceInSessionObserver,
+ public MMceStreamObserver,
+ public MMceRtpObserver,
+ public MMusEngSessionDurationTimerObserver,
+ public MMusSipProfileUser,
+ public MMusEngDisplayHandler,
+ public MMusEngAudioRoutingObserver
+ {
+ public:
+
+ /**
+ * Destructor
+ */
+ ~CMusEngMceSession();
+
+
+ public: // from MMusEngDisplayHandler
+
+ /**
+ * Returns currently assigned drawing area
+ *
+ * @return TRect This session drawing area rectangle
+ */
+ TRect Rect() const;
+
+ /**
+ * Sets new drawing area
+ *
+ * @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
+ */
+ void SetSecondaryRectL( const TRect& aSecondaryRect );
+
+ /**
+ * Gets secondary rect.
+ * @return TRect This session secondary drawing area rectangle
+ */
+ virtual TRect SecondaryRect() const;
+
+ /**
+ * Returns current display orientation.
+ *
+ * @pre Session is ongoing
+ * @return Current display orientation
+ * @leave KErrNotReady if precondition is not fullfilled
+ */
+ TDisplayOrientation OrientationL();
+
+ /**
+ * Sets display orientation.
+ *
+ * @pre Session is ongoing
+ * @return Sets display orientation
+ * @leave KErrNotReady if precondition is not fullfilled
+ */
+ void SetOrientationL( TDisplayOrientation aOrientation );
+
+ /**
+ * Permission to draw on screen device.
+ *
+ * @pre Session is ongoing
+ */
+ void EnableDisplayL( TBool aEnable );
+
+ /**
+ * Implements virtual from MMusEngDisplayHandler
+ *
+ * @pre Session is ongoing
+ */
+ TBool IsDisplayEnabled();
+
+ /**
+ * Implements virtual from MMusEngDisplayHandler
+ *
+ * @pre Session is ongoing
+ */
+ 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 );
+
+ TInt ParameterValue( TInt aId );
+
+ TBool IsBackgroundStartup();
+
+ TInt SetForegroundStatus( TBool aIsForeground );
+
+ const TDesC& RemoteDetails();
+
+ void UpdateLcSessionL();
+
+ TBool SendDialTone( TChar aKey);
+
+
+ public: // From MLcAudioControl
+
+ 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();
+
+ /**
+ * Second-phase constructor
+ */
+ void ConstructL();
+
+
+ protected: // VIRTUAL HELPER FUNCTIONS
+
+ /**
+ * Function handling MCE session state changes.
+ * To be overridden in sibling classes if needed.
+ */
+ virtual void HandleSessionStateChanged( CMceSession& aSession,
+ TInt aStatusCode,
+ const TDesC8& aReasonPhrase );
+
+ /**
+ * Function handling MCE session termination.
+ */
+ virtual void HandleTermination( TInt aStatusCode,
+ const TDesC8& aReasonPhrase );
+
+ /**
+ * Sets Multimediasharing specific video codec settings. This functions
+ * gets called for every video codec in session. To be overridden in
+ * sibling classes if needed.
+ */
+ virtual void AdjustVideoCodecL( CMceVideoCodec& aVideoCodec,
+ TMceSourceType aSourceType );
+
+ /**
+ * Sets Multimediasharing specific audio codec settings like audio MMF
+ * priority and preference. This functions gets called for every audio
+ * codec in session. To be overridden in sibling classes if needed.
+ */
+ virtual void AdjustAudioCodecL( CMceAudioCodec& aAudioCodec );
+
+ /**
+ * Removes multiples of H.263 codec, prefers H263-2000 over H263-1998.
+ * Additionally selects just the one with best quality from selected mode.
+ * @param aVideoStream
+ */
+ virtual void DoCodecSelectionL( CMceVideoStream& aVideoStream );
+
+ virtual void RectChangedL();
+
+ protected: // HELPER FUNCTIONS
+
+ 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.
+ */
+ void SetSessionSdpLinesL( CMceSession& aSession,
+ TBool aForceBandwidthLine = EFalse );
+ /**
+ * Sets media specific SDP lines to media.
+ */
+ void SetMediaSdpLinesL( CMceMediaStream& aStream,
+ TBool aForceBandwidthLine = EFalse );
+
+ /**
+ * Sets the volume level of all speakers in session structure.
+ * @param aNewVolume New volume level for all speakers
+ */
+ void SetSpeakerVolumeL( TInt aNewVolume );
+
+ /**
+ * Adjusts settings of all streams. Calls AdjustVideoStreamL for every
+ * video stream and AdjustAudioStreamL for every audio stream in session.
+ */
+ void AdjustStreamsAndCodecsL();
+
+ /**
+ * Adjusts stream settings. Calls AdjustVideoCodecL for every video
+ * codec in stream.
+ */
+ void AdjustVideoStreamL( CMceVideoStream& aVideoStream );
+
+ /**
+ * Adjusts stream settings. Calls AdjustAudioCodecL for every audio
+ * codec in stream.
+ */
+ void AdjustAudioStreamL( CMceAudioStream& aAudioStream );
+
+ /*
+ * Calls CMceInSession::RejectL() inside TRAP_IGNORE
+ */
+ void Reject( CMceInSession& aSession,
+ const TDesC8& aReason = KNullDesC8(),
+ TUint32 aCode = 0 );
+
+ void SaveContactL( const TDesC8& aAddress );
+
+ protected: // from MMceInSessionObserver
+
+ /**
+ * Incoming session invitation. The CMceInSession is given to the
+ * application as a callback. This default implementation rejects
+ * session immediately.
+ * @param aSession, pointer to the incoming session. Ownership is
+ * transferred.
+ * @param aContainer, if present, holds details of
+ * transaction causing state change.
+ */
+ void IncomingSession( CMceInSession* aSession,
+ TMceTransactionDataContainer* aContainer );
+
+
+ /**
+ * Incoming session update. The new updated CMceInSession is given to the
+ * application as a callback. This default implementation rejects
+ * session immediately.
+ * @param aOrigSession, the original session to be updated. This instance
+ * cannot be used anymore, all actions done using aUpdatedSession
+ * instance.
+ * @param aUpdatedSession, pointer to the new updated session. Ownership
+ * is transferred.
+ * @param aContainer, if present, holds details of
+ * update transaction.
+ */
+ void IncomingUpdate( CMceSession& aOrigSession,
+ CMceInSession* aUpdatedSession,
+ TMceTransactionDataContainer* aContainer );
+
+
+ protected: // from MMceStreamObserver
+
+ /**
+ * The state of the stream has changed.
+ *
+ * @param aStream, the stream that has changed.
+ */
+ void StreamStateChanged( CMceMediaStream& aStream );
+
+ /**
+ * The state of the source has changed.
+ *
+ * @param aStream, the stream that uses the source.
+ * @param aSource, the source that has changed.
+ */
+ void StreamStateChanged( CMceMediaStream& aStream,
+ CMceMediaSource& aSource );
+
+ /**
+ * The state of the sink has changed.
+ *
+ * @param aStream, the stream that uses the sink.
+ * @param aSink, the sink that has changed.
+ */
+ void StreamStateChanged( CMceMediaStream& aStream,
+ CMceMediaSink& aSink );
+
+
+ private: // from MMceSessionObserver
+
+ /**
+ * The state of the session has changed.
+ *
+ * @param aSession, the session that has changed.
+ * @param aContainer, if present, holds details of
+ * transaction causing state change.
+ */
+ void SessionStateChanged( CMceSession& aSession,
+ TMceTransactionDataContainer* aContainer );
+
+ /**
+ * The state of the connection used by the session has changed.
+ *
+ * @param aSession, the session that has changed.
+ * @param aActive, ETrue if connection active, EFalse if
+ * connection inactive.
+ */
+ void SessionConnectionStateChanged( CMceSession& aSession,
+ TBool aActive );
+
+ /**
+ * An error has occurred concerning a specific session.
+ * Note, that each error causes the session state to be ETerminated.
+ *
+ * @param aSession, The session raising the error.
+ * @param aError, Error code
+ */
+ void Failed( CMceSession& aSession, TInt aError );
+
+ /**
+ * An session update has been failed concerning a specific session.
+ * Note, that each error causes the session state to be ETerminated.
+ *
+ * @param aSession, The session raising the error.
+ * @param aContainer, if present, holds details of
+ * transaction causing update.
+ */
+ void UpdateFailed( CMceSession& aSession,
+ TMceTransactionDataContainer* aContainer );
+
+
+ private: // from MMCERtpObserver
+
+ /**
+ * Callback function to indicate that an RTCP sender report
+ * has been received.
+ * @param aSession the session that has changed
+ * @param aStream the stream that has changed
+ */
+ void SRReceived( CMceSession& aSession, CMceMediaStream& aStream);
+
+ /**
+ * Callback function to indicate that an RTCP receiver report
+ * has been received.
+ * @param aSession the session that has changed
+ * @param aStream the stream that has changed
+ */
+ void RRReceived( CMceSession& aSession, CMceMediaStream& aStream);
+
+ /**
+ * Callback function to indicate inactivity timer timeout
+ * has occurred. Timer is disabled after the timeout.
+ *
+ * @param aStream, the session that has changed.
+ * @param aSource, the source that the timeout occurred.
+ */
+ void InactivityTimeout( CMceMediaStream& aStream,
+ CMceRtpSource& aSource );
+
+ /**
+ * Callback function to indicate that spesified CMceRtpSource has
+ * received RTP from a new synchronization source (SSRC).
+ * @param aStream the stream that new SSRC was added to
+ * @param aSource the source that new SSRC was added to
+ * @param aSsrc added SSRC identifier
+ */
+ void SsrcAdded( CMceMediaStream& aStream,
+ CMceRtpSource& aSource,
+ TUint aSsrc );
+
+ /**
+ * Callback function to indicate that spesified CMceRtpSource has
+ * received RTP BYE message from a spesified synchronization
+ * source (SSRC).
+ * @param aStream the stream that SSRC was removed from
+ * @param aSource the source that SSRC was removed from
+ * @param aSsrc removed SSRC identifier
+ */
+ void SsrcRemoved( CMceMediaStream& aStream,
+ CMceRtpSource& aSource,
+ TUint aSsrc );
+
+
+ private: // from MMusSipProfileUser
+
+ virtual TBool IsRoamingBetweenAPsAllowed();
+
+ virtual void ProfileRegistered();
+
+
+ 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();
+
+ /**
+ * Does actual muting or unmuting of local audio playback but does not
+ * mark speaker as explicitly muted so this function can be called also
+ * when muting speaker as a consequence of disabling or enabling
+ * bundled display sink.
+ *
+ */
+ void DoMuteSpeakerL( TBool aMute );
+
+ /**
+ * Checks if some of array items contains specific text.
+ * @param aArray
+ * @param aItem
+ * @return ETrue if array contains aItem
+ */
+ TBool ContainsText( MDesC8Array* aArray, const TDesC8& aItem );
+
+ void DoBitrateBasedRemovalL( CMceVideoStream& aVideoStream,
+ const CMceVideoCodec& aBestBitrateVideoCodec );
+
+ void DoCodecModeBasedRemovalL( CMceVideoStream& aVideoStream );
+
+ /**
+ * 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 );
+
+ /**
+ * 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
+ */
+ 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.
+ * This class provides the connection to the MCE server and
+ * provides functions
+ * for setting observers for asynchronous events.
+ * The user should create only one instance of this class.
+ */
+ CMceManager* iManager;
+
+ /**
+ * Base class for MCE sessions, inherited by both CMCEInSession and
+ * CMCEOutSession. * CMCESession represents peer-to-peer connection
+ * made with remote terminal. This connection is also known as dialog
+ * and it is set up using SIP INVITE method. The characteristics of the
+ * session are defined by user of this class by attaching media streams
+ * into the session. After the session has been succesfully established,
+ * it can be later updated and must be finally terminated. If for any
+ * reason instance of this class is deleted while in established state,
+ * session is automatically terminated by MCE server.
+ */
+ CMceSession* iSession;
+
+ /**
+ * ETrue if operator specific behavior is expected
+ */
+ TBool iOperatorVariant;
+
+ /**
+ * The handler for the SIP profile related to this session
+ */
+ CMusSipProfileHandler* iSipProfileHandler;
+
+ /**
+ * 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.
+ */
+ TMceTransactionDataContainer iTransactionDataContainer;
+
+ /**
+ * Session time. Acts simultaneously as RTCP inactivity timer.
+ */
+ TTime iStartTime;
+
+ CMusEngSessionDurationTimer* iUpdateTimer;
+
+ /**
+ * Value indicating seconds gone since last received RTCP sender or
+ * receiver report. Value 20 indicates RTCP inactivity timeout.
+ */
+ TInt iSecondsFromLastRtcpReport;
+
+ /**
+ * Value indicating if speaker is explicitly muted instead of
+ * 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 // MUSENGMCESESSION_H