diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdCreateSession.cpp --- /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 +#include "TCLog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +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(GetObjectForIdL(KProfileObj, EFalse)); + + // Get event + CMceEvent* event = + reinterpret_cast(GetObjectForIdL(KEventId, EFalse)); + + // Get refer + CMceRefer* refer = + reinterpret_cast(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& codecsIn = audioInStream->Codecs(); + const RPointerArray& 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(aStreamOut); + CMceAudioStream* audioInStream = dynamic_cast(aStreamIn); + + const RPointerArray& streamCodecsOut = + audioOutStream->Codecs(); + const RPointerArray& 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(aStreamOut); + CMceVideoStream* videoInStream = dynamic_cast(aStreamIn); + + const RPointerArray& streamCodecsOut = + videoOutStream->Codecs(); + const RPointerArray& 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; + }