multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdCreateSession.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdCreateSession.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,615 @@
+/*
+* 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:    Implementation
+*
+*/
+
+
+
+#include "MCEConstants.h"
+#include "TCmdCreateSession.h"
+#include "CTcMCEContext.h"
+
+#include <sipprofile.h>
+#include "TCLog.h"
+
+#include <MCEMicSource.h>
+#include <MceRtpSink.h>
+#include <mcefilesink.h>
+#include <MCEAudioStream.h>
+#include <MceRtpSource.h>
+#include <MCESpeakerSink.h>
+#include <MceOutSession.h>
+#include <MCEEvent.h>
+#include <MCERefer.h>
+#include <MCEAMRCodec.h>	
+#include <MCECnCodec.h>
+#include <mceredcodec.h>
+#include <mcedefs.h>
+
+#include <MCEVideoStream.h>
+#include <mcecamerasource.h>
+#include <mcedisplaysink.h>
+#include <MCEVideoCodec.h>
+#include <mceh263codec.h>
+#include <mcefilesource.h>
+
+const TUint KAudioPriorityPocAudioUplink                  = 95;
+const TUint KAudioPriorityPocAudioDownlink                = 95;
+const TUint KAudioPrefPocAudioUplink                      = 0x05130001;
+const TUint KAudioPrefPocAudioDownlink                    = 0x05120001;
+
+const TUint KDtmfAudioPriority							  = 45;
+const TUint KDtmfAudioPref								  = 0x00150001;
+
+class CMceManager;
+class CTcNameValue;
+	
+_LIT8( CN, "CN" );
+_LIT8( red, "red" );
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::ExecuteL
+// ----------------------------------------------------------------------------
+//		
+void TCmdCreateSession::ExecuteL()
+	{
+	TcLog::Write( _L8("\nTCmdCreateSession::ExecuteL()") );
+	CreateOutSessionL();	
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::CreateOutSessionL
+// ----------------------------------------------------------------------------
+//	
+void TCmdCreateSession::CreateOutSessionL()
+	{
+	TcLog::Write( _L8("\nTCmdCreateSession::CreateOutSessionL()") );
+	// ---- Setup --------------------------------------------------------------
+	// Extract parameters
+	
+	TPtrC8 sessionType = ExtractTextL( KParamSessionType, EFalse );	
+	
+	TBool suppressRtcp = ExtractBooleanL( KParamSuppressRtcp, EFalse );	
+		
+	// Get profile
+	CSIPProfile* profile = 
+		reinterpret_cast<CSIPProfile*>(GetObjectForIdL(KProfileObj, EFalse));
+
+	// Get event
+	CMceEvent* event = 
+	    reinterpret_cast<CMceEvent*>(GetObjectForIdL(KEventId, EFalse));			
+
+	// Get refer
+	CMceRefer* refer = 
+	    reinterpret_cast<CMceRefer*>(GetObjectForIdL(KReferId, EFalse));	
+	   
+    // Get alternative mainStream
+	TBool mainStreamAudioOut = ExtractBooleanL( KParamMainStreamAudioOut, EFalse );	
+	
+	//get path for media file source
+	TPtrC8 pathMediaFile = ExtractTextL( KParamAudioFileSource, EFalse );
+	
+	//get path for media file sink
+	TPtrC8 mediaFileSink = ExtractTextL( KParamMediaFileSink, EFalse );
+	
+	//extract Array of codecs
+	CDesC8Array* codecsList = ExtractArrayL(KArrayCodecsList, EFalse);
+	
+	//get the inactivity timer value for rtp source
+	TInt rtpInactivityTimer = ExtractIntegerL(KParamRTPInactivityTimer, 0, EFalse);
+ 		
+    TInt keepAliveTimer = ExtractIntegerL( KParamKeepAliveValue, 0, EFalse );
+	keepAliveTimer = Max( 0, keepAliveTimer );
+	keepAliveTimer = Min( KMaxTUint8, keepAliveTimer );
+	// ---- Execution ----------------------------------------------------------
+
+	// Contruct session	
+
+	CMceSession* session = NULL;
+	
+	if ( profile ) 
+		{
+		
+		///---------------------------------------------------------------
+		// Next is used only during API change, use only first row after change
+		TPtrC8 recipient = ExtractTextL( KParamRecipient, EFalse );
+		TPtrC8 toHeader = ExtractTextL( KParamToHeader, EFalse );		
+
+		TPtrC8 recipientOrToHeader;
+		
+		if ( recipient != KNullDesC8 )
+		    {
+		    recipientOrToHeader.Set( recipient );
+		    }
+		else
+		    {
+		    recipientOrToHeader.Set( toHeader );
+		    }
+		
+		//------------------------------------------------------------------
+		
+        HBufC8* originator = HBufCParameterL(ExtractTextL( KParamOriginator, 
+                                                           EFalse));
+                                                           
+	    CleanupStack::PushL( originator );
+			
+		session = CreateSessionL( iContext.MCEManager(),	
+								  *profile, 
+								  recipientOrToHeader,
+								  originator );    
+								                             
+		CleanupStack::Pop( originator );
+		}
+	else if ( event ) 
+		{
+		session = CreateSessionL( *event );
+		}
+	else if ( refer )
+	    {
+	    session = CreateSessionL( *refer );
+	    }
+    else
+    	{
+		User::Leave( KErrNotFound );
+		}	
+	
+	CleanupStack::PushL(session);
+		
+	// Construct and bind streams
+	if ( (sessionType == KValueSessionTypeAudio) || (sessionType == KValueSessionTypeAudioVideo ))
+		{
+		CMceAudioStream* audioInStream = CMceAudioStream::NewLC();
+		
+		CMceRtpSource* rtpSource = NULL;
+		if(rtpInactivityTimer != 0)
+			rtpSource = CMceRtpSource::NewLC(KMceJitterBufferLength, KMceJitterBufferTreshold, rtpInactivityTimer * 1000);
+		else
+			rtpSource = CMceRtpSource::NewLC();
+		
+		audioInStream->SetSourceL(rtpSource);
+		CleanupStack::Pop(rtpSource);
+			
+		CMceSpeakerSink* speaker = CMceSpeakerSink::NewLC();	
+		audioInStream->AddSinkL(speaker);
+		CleanupStack::Pop(speaker);
+
+		
+		CMceAudioStream* audioOutStream = CMceAudioStream::NewLC();
+		
+		//use file stream as a source
+		if( pathMediaFile.Compare( KNullDesC8 ) != 0 )
+			{
+			// If source path was defined use the file audio specified in path
+			iSessionHelper.SetMediaFileSourceL( iContext.MCEManager(), *audioOutStream, pathMediaFile );
+			}
+		else
+			{
+			CMceMicSource* mic = CMceMicSource::NewLC();
+			audioOutStream->SetSourceL(mic);	
+			CleanupStack::Pop(mic);	
+			}
+		
+		CMceRtpSink* rtpSink = CMceRtpSink::NewL(suppressRtcp);
+		CleanupStack::PushL(rtpSink);
+		audioOutStream->AddSinkL(rtpSink);
+		CleanupStack::Pop(rtpSink);
+
+        if ( mainStreamAudioOut )
+        	{
+        	audioOutStream->BindL( audioInStream );	
+        	// Add bound streams to session 
+			session->AddStreamL( audioOutStream );
+        	}
+        else
+        	{
+        	audioInStream->BindL( audioOutStream );
+        	// Add bound streams to session
+			session->AddStreamL( audioInStream );
+        	}
+        
+		//use file as a media sink for recording the sending media
+		if( mediaFileSink.Compare( KNullDesC8 ) != 0 )
+			{
+			CMceAudioStream* audioOutStreamFile = CMceAudioStream::NewL();
+			CleanupStack::PushL( audioOutStreamFile );
+			
+			//use the same source which was used for outgoing audio stream	
+			audioOutStreamFile->SetSourceL( audioOutStream->Source() );	
+			
+			iSessionHelper.SetMediaFileSinkL(*audioOutStreamFile, mediaFileSink);
+			session->AddStreamL( audioOutStreamFile );
+			CleanupStack::Pop( audioOutStreamFile );
+		
+			if(codecsList)
+				{
+					RemoveMediaCodecsL(audioOutStreamFile, audioOutStreamFile, codecsList, EStreamAudio);
+				}
+			}
+		
+		CleanupStack::Pop( audioOutStream );			
+		CleanupStack::Pop( audioInStream );
+		
+		const RPointerArray<CMceAudioCodec>& codecsIn =  audioInStream->Codecs();
+		const RPointerArray<CMceAudioCodec>& codecsOut =  audioOutStream->Codecs();
+
+		TUint audioPriorityUplink = ExtractIntegerL(KParamSessionPriorityUplink, KAudioPriorityPocAudioUplink ,EFalse);
+		TUint audioPriorityDownlink = ExtractIntegerL(KParamSessionPriorityDownlink, KAudioPriorityPocAudioDownlink, EFalse );
+		TUint audioPrefUplink = ExtractIntegerL(KParamAudioPrefUplink, KAudioPrefPocAudioUplink, EFalse);
+		TUint audioPrefDownlink = ExtractIntegerL(KParamAudioPrefDownlink, KAudioPrefPocAudioDownlink, EFalse);
+
+ 	    //removing selected codecs from streams
+ 		if(codecsList)
+ 		{
+ 			//remove codecs which are not presented in the given list
+ 			RemoveMediaCodecsL(audioOutStream, audioInStream, codecsList, EStreamAudio);
+ 		
+ 		}
+		
+		//defined here because KMceSDPNameDtmf hasn't been defined in mce2
+		_LIT8( DTMF, "telephone-event" );
+		//deleting pcm codecs. bug work-around until selected codecs can be passed from the test case
+		for (TInt i = codecsOut.Count()-1; i >= 0;  i --)
+			{
+		 	if ( keepAliveTimer )
+ 				{
+ 				iSessionHelper.SetKeepaliveL(*codecsOut[i], keepAliveTimer);
+ 				}
+
+			if (!codecsOut[i]->SdpName().Compare(/*KMceSDPNameDtmf*/DTMF))
+				{
+				iSessionHelper.SetCodecPrioritiesL(*codecsOut[i], iSessionHelper.dtmf);
+				}
+			else
+				{
+				iSessionHelper.SetCodecPriPrefL(*codecsOut[i],audioPriorityUplink,audioPrefUplink);
+				}	
+			}
+		for (TInt i = 0; i < codecsIn.Count(); i ++)
+			{
+			if (!codecsIn[i]->SdpName().Compare(DTMF))
+				{
+				iSessionHelper.SetCodecPrioritiesL(*codecsIn[i], iSessionHelper.dtmf);
+		
+				}
+			else
+				{
+				iSessionHelper.SetCodecPriPrefL(*codecsIn[i],audioPriorityDownlink,audioPrefDownlink);
+				}		
+			}
+	    
+		AddIdResponseL( KStreamId, *audioOutStream );
+		
+		}
+	// Initializing Video stream
+	if ( (sessionType == KValueSessionTypeVideo) || (sessionType == KValueSessionTypeAudioVideo ))
+		{
+	    
+	    //TODO
+	    CMceVideoStream* videoInStream = CMceVideoStream::NewLC();
+		
+		CMceRtpSource* rtpSource = CMceRtpSource::NewLC(200, 100, 10);
+		videoInStream->SetSourceL(rtpSource);
+		CleanupStack::Pop(rtpSource);
+			
+		CMceDisplaySink* display = CMceDisplaySink::NewLC(iContext.MCEManager());
+		videoInStream->AddSinkL(display);
+		CleanupStack::Pop(display);
+		
+		//creating outgoing video stream
+		CMceVideoStream* videoOutStream = CMceVideoStream::NewLC();
+				
+		//use file stream as a source
+		if( pathMediaFile.Compare( KNullDesC8 ) != 0 )
+			{			
+			// If source path was defined use the file audio specified in path
+			iSessionHelper.SetMediaFileSourceL( iContext.MCEManager(), *videoOutStream, pathMediaFile );
+			}
+		else
+			{
+			CMceCameraSource* cam = CMceCameraSource::NewLC(iContext.MCEManager());
+			videoOutStream->SetSourceL(cam);	
+			CleanupStack::Pop(cam);	
+			}
+
+		
+		CMceRtpSink* rtpSink = CMceRtpSink::NewL(EFalse);
+		CleanupStack::PushL(rtpSink);
+		videoOutStream->AddSinkL(rtpSink);
+		CleanupStack::Pop(rtpSink);
+
+        if ( mainStreamAudioOut )
+        	{
+        	videoOutStream->BindL( videoInStream );	
+        	// Add bound streams to session 
+			session->AddStreamL( videoOutStream );
+        	}
+        else
+        	{
+        	videoInStream->BindL( videoOutStream );
+        	// Add bound streams to session
+			session->AddStreamL( videoInStream );
+        	}
+        
+		//use file as a media sink for recording the sending media
+		if( mediaFileSink.Compare( KNullDesC8 ) != 0 )
+			{
+			CMceVideoStream* videoOutStreamFile = CMceVideoStream::NewL();
+			CleanupStack::PushL( videoOutStreamFile );
+			
+			//use the same source which was used for outgoing video stream	
+			videoOutStreamFile->SetSourceL( videoOutStream->Source() );	
+			
+			iSessionHelper.SetMediaFileSinkL(*videoOutStreamFile, mediaFileSink);
+			session->AddStreamL( videoOutStreamFile );
+			CleanupStack::Pop( videoOutStreamFile );
+		
+			if(codecsList)
+				{
+					RemoveMediaCodecsL(videoOutStreamFile, videoOutStreamFile, codecsList, EStreamVideo);
+				}
+			}
+        	
+		CleanupStack::Pop( videoOutStream );			
+		CleanupStack::Pop( videoInStream );
+
+		//remove selected codecs from the streams
+		if(codecsList)
+		{
+			RemoveMediaCodecsL(videoOutStream, videoInStream, codecsList, EStreamVideo);
+		}
+ 		
+		AddIdResponseL( KStreamId, *videoOutStream );
+			
+	//	AddIdResponseL(KSessionId, session); // uses CleanupStack internally 
+		}    
+	else
+	    {
+	    // NOP   
+	    }
+	    
+	    
+	CTcStructure* structure;
+	do
+		{
+		structure = FindStructureL( KParamSessionModifier, EFalse );
+		if( structure )
+			{
+            //structure contains a list of name-value pairs
+			for (int i=0; i < structure->Count(); i++)
+				{
+				CTcNameValue* item = structure->ItemL( i );
+				session->SetModifierL( item->NameAsIntL(), item->ValueAsIntL() );
+				}
+			iContext.List().RemoveParameter( KParamSessionModifier );
+			}
+	} while( structure );
+
+	CleanupStack::Pop( session );
+	
+	
+	// ---- Response creation --------------------------------------------------
+ 
+ 	// Session must be added by pointer
+	AddIdResponseL( KSessionId, session ); // uses CleanupStack internally
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::CreateSessionL
+// ----------------------------------------------------------------------------
+//	
+CMceSession* TCmdCreateSession::CreateSessionL( CMceManager& aManager,
+                        						CSIPProfile& aProfile,
+                        						const TDesC8& aRecipient,
+												HBufC8* aOriginator  )
+	{
+ 	return CMceOutSession::NewL( aManager, aProfile, 
+							   	 aRecipient, aOriginator );	
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::CreateSessionL
+// ----------------------------------------------------------------------------
+//	
+CMceSession* TCmdCreateSession::CreateSessionL( CMceEvent& aEvent )
+	{
+ 	return CMceOutSession::NewL( aEvent );	
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::CreateSessionL
+// ----------------------------------------------------------------------------
+//	
+CMceSession* TCmdCreateSession::CreateSessionL( CMceRefer& aRefer )
+	{
+ 	return CMceOutSession::NewL( aRefer );	    
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::Match
+// ----------------------------------------------------------------------------
+//	
+TBool TCmdCreateSession::Match( const TTcIdentifier& aId )
+	{
+	return TTcMceCommandBase::Match( aId, _L8("CreateSession") );
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::CreateL
+// ----------------------------------------------------------------------------
+//	
+TTcCommandBase* TCmdCreateSession::CreateL( MTcTestContext& aContext )
+	{
+	return new( ELeave ) TCmdCreateSession( aContext );
+	}
+
+// ----------------------------------------------------------------------------
+// TCmdCreateSession::RemoveMediaCodecsL
+// ----------------------------------------------------------------------------	
+TInt TCmdCreateSession::RemoveMediaCodecsL(CMceMediaStream* aStreamOut, CMceMediaStream* aStreamIn,
+				CDesC8Array* aCodecsList, TStreamType aType)
+	{
+ 	
+	CleanupStack::PushL(aCodecsList);
+	const TInt codecsListCount = aCodecsList->Count();
+	
+	if(codecsListCount>0)
+	{
+					
+		if( aType == EStreamAudio )
+		{
+ 			CMceAudioStream* audioOutStream = dynamic_cast<CMceAudioStream*>(aStreamOut);
+ 			CMceAudioStream* audioInStream = dynamic_cast<CMceAudioStream*>(aStreamIn);
+ 			
+			const RPointerArray<CMceAudioCodec>& streamCodecsOut = 
+		    	audioOutStream->Codecs();
+			const RPointerArray<CMceAudioCodec>& streamCodecsIn = 
+		    	audioInStream->Codecs();
+						
+			if ( (*aCodecsList)[0] != KValueCodecAll )
+			{							
+				TBool found = EFalse;
+				//removing from audioOutStream
+				for(TInt iCount = streamCodecsOut.Count()-1; iCount >= 0;  iCount-- )
+				{
+					CMceAudioCodec* codecOut = streamCodecsOut[iCount];
+					found = EFalse;
+					
+					for(TInt i = 0; i < codecsListCount; i++)
+					{													
+						if(codecOut->SdpName() == (*aCodecsList)[i] ) 
+						{
+							//CN codec will get enabled
+							if( codecOut->SdpName() == CN ) 
+							{
+								codecOut->SetStateL(CMceCodec::EEnabled);
+							}
+							else if( codecOut->SdpName() == red ) 
+							{
+								codecOut->SetStateL(CMceCodec::EEnabled);
+							}
+							//setting preference
+							codecOut->SetPreferenceL( i );
+							
+							found = ETrue;
+						}
+									
+					}
+					
+					if(found == EFalse)
+						audioOutStream->RemoveCodecL(*streamCodecsOut[iCount]);
+				}
+			
+				audioOutStream->ReorderCodecsByPreferenceL(EFalse);	
+        		
+				found = EFalse;
+				//removing from audioInStream
+				for(TInt iCount = streamCodecsIn.Count()-1; iCount >= 0;  iCount-- )
+				{
+					CMceAudioCodec* codecIn = streamCodecsIn[iCount];
+					found = EFalse;
+					
+					for(TInt i = 0; i < codecsListCount; i++)
+					{
+						if( codecIn->SdpName() == (*aCodecsList)[i] ) 
+						{
+							found = ETrue;
+							//CN codec will get enabled
+							if( codecIn->SdpName() == CN ) 
+							{
+								codecIn->SetStateL(CMceCodec::EEnabled);
+							}
+							else if( codecIn->SdpName() == red ) 
+							{
+								codecIn->SetStateL(CMceCodec::EEnabled);
+							}
+							//setting preference according to the order in list
+							codecIn->SetPreferenceL( i );
+						}
+            			
+					}
+					
+					
+					if(found == EFalse)
+						audioInStream->RemoveCodecL(*streamCodecsIn[iCount]);		
+				}
+				
+				audioInStream->ReorderCodecsByPreferenceL( EFalse );
+				
+			}
+
+		} //end of audio stream
+		if( aType == EStreamVideo )
+		{
+			CMceVideoStream* videoOutStream = dynamic_cast<CMceVideoStream*>(aStreamOut);
+ 			CMceVideoStream* videoInStream = dynamic_cast<CMceVideoStream*>(aStreamIn);
+ 					
+			const RPointerArray<CMceVideoCodec>& streamCodecsOut = 
+		    	videoOutStream->Codecs();
+			const RPointerArray<CMceVideoCodec>& streamCodecsIn = 
+		    	videoInStream->Codecs();
+		
+			if ( (*aCodecsList)[0] != KValueCodecAll )
+			{		
+				
+				//removing from videoOutStream
+				for(TInt iCount = streamCodecsOut.Count()-1; iCount >= 0;  iCount-- )
+				{
+					CMceVideoCodec* codecOut = streamCodecsOut[iCount];
+					
+					TBool found = EFalse;
+					
+					for(TInt i = 0; i < codecsListCount; i++)
+					{													
+						if(codecOut->SdpName() == (*aCodecsList)[i] )
+						{
+							found = ETrue;
+							codecOut->SetPreferenceL( i );
+						}
+            					
+					}
+					
+					if(found == EFalse)
+						videoOutStream->RemoveCodecL(*streamCodecsOut[iCount]);
+
+				}
+				videoOutStream->ReorderCodecsByPreferenceL(EFalse);
+
+				//removing from videoInStream
+				for(TInt iCount = streamCodecsIn.Count()-1; iCount >= 0;  iCount-- )
+				{
+					CMceVideoCodec* codecIn = streamCodecsIn[iCount];
+					
+					TBool found = EFalse;
+					
+					for(TInt i = 0; i < codecsListCount; i++)
+					{
+						if( codecIn->SdpName() == (*aCodecsList)[i] )			
+						{
+							found = ETrue;
+							codecIn->SetPreferenceL( i );
+						}
+            			
+					}
+					
+					if(found == EFalse)
+						videoInStream->RemoveCodecL(*streamCodecsIn[iCount]);
+				}
+				videoInStream->ReorderCodecsByPreferenceL(EFalse);
+			}
+		}// end of video stream
+	} 
+	
+	CleanupStack::Pop(aCodecsList);						     
+	return 0;
+	}