diff -r ccd8e69b5392 -r 496ad160a278 mmsharing/mmshengine/inc/musengmcesession.h --- /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 +#include +#include +#include +#include +#include +#include +#include + +// 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