mmsharing/mmshengine/inc/musengreceivesession.h
changeset 22 496ad160a278
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshengine/inc/musengreceivesession.h	Fri Jun 11 13:36:18 2010 +0300
@@ -0,0 +1,223 @@
+/*
+* Copyright (c) 2006 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 MUSHENGREVEIVESESSION_H
+#define MUSHENGREVEIVESESSION_H
+
+// INCLUDES
+#include "musengmcesession.h"
+#include "musenguriparser.h"
+#include "musunittesting.h"
+#include <mcemediasink.h>
+
+// FORWARD DECLARATIONS
+class MMusEngReceiveSessionObserver;
+class CMceInSession;
+class CMusEngRemoteVideoPlayer;
+
+
+class CMusEngReceiveSession : 
+    public CMusEngMceSession
+    {
+    MUS_UNITTEST( UT_CMusEngMceSession )
+    MUS_UNITTEST( UT_CMusEngReceiveSession )
+    
+    public: // Contructors and destructor
+
+       /**
+        * Creates new MultimediaSharing Receive session.
+        * @return CMusEngReceiveSession* New instanse of specified class
+        */
+        static CMusEngReceiveSession* NewL();
+        
+       /**
+        * Destructor
+        *
+        * @since S60 v3.2
+        */
+        ~CMusEngReceiveSession();
+   
+    public: // From MLcSession
+        
+        TLcSessionState LcSessionState() const;
+        
+        void EstablishLcSessionL();
+        
+        void TerminateLcSessionL(); 
+        
+        MLcVideoPlayer* RemoteVideoPlayer();    
+        
+        const TDesC& RemoteDisplayName();         
+        
+    protected: // Overrides function in CMusEngMceSession
+    
+        /**
+        * The state of the session has changed.
+        *
+        * @since S60 v3.2
+        * @param aSession, the session that has changed.
+        */
+        virtual void HandleSessionStateChanged( CMceSession& aSession,
+                                                TInt aStatusCode,
+                                                const TDesC8& aReasonPhrase );
+        
+        /**
+        * Sets Multimediasharing specific video codec settings like keepalive
+        * timer. This functions gets called for every video codec in 
+        * session. This function overrides function in base class. 
+        * Function calls also overridden version.
+        */ 
+        virtual void AdjustVideoCodecL( CMceVideoCodec& aVideoCodec,
+                                        TMceSourceType aSourceType );
+        
+        /**
+        * Sets Multimediasharing specific audio codec settings like keepalive
+        * timer. This functions gets called for every audio 
+        * codec in session.  This function overrides function in base class. 
+        * Function calls also overridden version.
+        */ 
+        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.
+        * Removes all the H.263 codecs if any AVC codecs found. Prefers
+        * non-interleaved AVC over single NAL AVC
+        * @param aVideoStream
+        */
+        virtual void DoCodecSelectionL( CMceVideoStream& aVideoStream );
+        
+    protected: // from MMceInSessionObserver
+               // overrides the function in CMusEngMceSession
+
+        /**
+	    * Incoming session invitation. The CMCEInSession is given to the
+		* application as a callback.
+	    * @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.
+	    * @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, 
+             // overrides the function in CMusEngMceSession
+
+        /**
+        * The state of the stream has changed.
+        *
+        * @since S60 v3.2
+        * @param aStream, the stream that uses the source.
+        */
+        void StreamStateChanged( CMceMediaStream& aStream );
+    
+    protected: // from MMceRtpObserver
+
+        void InactivityTimeout( CMceMediaStream& aStream,
+                                CMceRtpSource& aSource );
+
+
+
+    protected: // CONSTRUCTORS
+    
+        CMusEngReceiveSession();
+
+		void ConstructL();
+		
+    protected: // HELPERS
+    
+        CMceInSession* InSession();
+        
+        void PrepareToRequire100RelL( 
+            TMceTransactionDataContainer* aContainer );
+        
+        virtual void CompleteSessionStructureL();
+        
+         /**
+         * Parse P-Asserted-Identity header. 
+         * Tries to fetch the telephone number from tel uri, 
+         * if tel uri not found it suppose that telephone number
+         * is in sip url. 
+         */
+        void ParseAssertedIdentity( TMceTransactionDataContainer* aContainer );
+        /*
+         * Checks for buffering event happened & receiving already not started
+         *      If yes, start the RTP inactivity timer and indicate to observer
+         *              about videoplayer state change.
+         *      else will not do anything. Bascially ignores the event.
+         */
+        void ReceivingStarted();
+        
+        /**
+        * Checks for receiving already started and display sink is enabled
+        *        If yes ETrue else otherwise.
+        */
+        TBool IsDisplayActive();
+        
+    protected: // DATA
+    
+        // Set to ETrue if CMceInSession::RingL has already been called
+        TBool iRingLCalled;
+        
+        // identity of originator parsed form P-Asserted-Identity field
+        TBuf8<KMaxUriLength> iIdentity;
+        
+        HBufC8* iOriginator;
+        
+        HBufC* iRemoteDisplayName;
+       
+        /// The remote video player implementing MLcVideoPlayer
+        CMusEngRemoteVideoPlayer* iRemoteVideoPlayer;
+        
+        TUint32 iReceivingInactivityTimeout;
+        
+        TUint8 iKeepaliveTimer;
+        
+    private:
+        /* Flag for whether receiving started. It will go EFalse
+         * when RTP inactivity timeout happen.
+         */
+        TBool iReceiving;               
+        /* Flag to indicate buffering event happened. This flag is for
+         * optimization purpose since buffering event is the only place 
+         * we can be sure about some packets were received.
+         */
+        TBool iBuffered;
+    };
+
+#endif
+