diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcefcactionset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcefcactionset.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,412 @@ +/* +* 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: +* +*/ + + + +#include +#include +#include "mcefcactionset.h" +#include "mcesipsession.h" +#include "mcesipconnection.h" +#include "mcemediamanager.h" +#include "mceservercore.h" +#include "fcpluginengine.h" +#include "mceaudiostream.h" +#include "mcertpsource.h" +#include "mcecommediasource.h" +#include "mceserial.h" +#include "mcesrvlogs.h" + +_LIT8( KFCTBCP, "TBCP" ); +const TUint32 KPortZero = 0; + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::TMceFCActionSet +// ----------------------------------------------------------------------------- +// +TMceFCActionSet::TMceFCActionSet( CMceSipSession& aSession ) + : iSession ( aSession ) + { + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::UpdateFCOfferL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::UpdateFCOfferL( CSdpDocument& aOffer ) + { + MCESRV_DEBUG("TMceFCActionSet::UpdateFCOfferL, Entry"); + if ( iSession.FCSession() && iSession.UseFC() ) + { + User::LeaveIfError( iSession.Body() ? KErrNone : KErrArgument ); + User::LeaveIfError( iSession.Body()->Streams().Count() > 0 ? + KErrNone : KErrArgument ); + + CFCPlugInEngine& fc = iSession.ServerCore().FCPluginEngine(); + + if ( !fc.IsReceiverL( *iSession.FCSession() ) ) + { + fc.SetSessionPortL( *iSession.iFCSession, RTCPPort() ); + } + fc.UpdateOfferL( *iSession.iFCSession, aOffer ); + } + MCESRV_DEBUG("TMceFCActionSet::UpdateFCOfferL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::UpdateFCAnswerL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::UpdateFCAnswerL( CSdpDocument& aOffer ) + { + MCESRV_DEBUG("TMceFCActionSet::UpdateFCAnswerL, Entry"); + if ( iSession.FCSession() && iSession.UseFC() ) + { + User::LeaveIfError( iSession.Body() ? KErrNone : KErrArgument ); + User::LeaveIfError( iSession.Body()->Streams().Count() > 0 ? + KErrNone : KErrArgument ); + + CFCPlugInEngine& fc = iSession.ServerCore().FCPluginEngine(); + + if ( !fc.IsReceiverL( *iSession.FCSession() ) ) + { + fc.SetSessionPortL( *iSession.iFCSession, RTCPPort() ); + } + fc.UpdateAnswerL( *iSession.iFCSession, aOffer ); + } + MCESRV_DEBUG("TMceFCActionSet::UpdateFCAnswerL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::PeekFCDocumentL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::PeekFCDocumentL( CSdpDocument& aOffer ) + { + MCESRV_DEBUG("TMceFCActionSet::PeekFCDocumentL, Entry"); + if ( iSession.FCSession() ) + { + CFCPlugInEngine& fc = iSession.ServerCore().FCPluginEngine(); + fc.PeekDocumentL( *iSession.FCSession(), aOffer ); + } + MCESRV_DEBUG("TMceFCActionSet::PeekFCDocumentL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::StartFCL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::StartFCL() + { + MCESRV_DEBUG("TMceFCActionSet::StartFCL, Entry"); + if ( iSession.FCSession() && iSession.UseFC() ) + { + CFCPlugInEngine& fc = iSession.ServerCore().FCPluginEngine(); + fc.StartConnectionL( *iSession.FCSession() ); + } + MCESRV_DEBUG("TMceFCActionSet::StartFCL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::InitializeFCL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::InitializeFCL () + { + MCESRV_DEBUG("TMceFCActionSet::InitializeFCL, Entry"); + MCESRV_DEBUG("FC session initalization for incoming INVITE"); + + __ASSERT_ALWAYS( !iSession.FCSession(), User::Leave( KErrArgument ) ); + + iSession.iFCSession = &(iSession.ServerCore().FCPluginEngine(). + CreateNewSessionL( KFCTBCP, + iSession.SIPConnection().AccessPointId(), + KPortZero ) ); + + iSession.ServerCore(). + RegisterFCSessionL( iSession, *iSession.FCSession() ); + MCESRV_DEBUG("TMceFCActionSet::InitializeFCL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::InitializeFCL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::InitializeFCL (TMceIds& aIds, const TDesC8& aType ) + { + MCESRV_DEBUG("TMceFCActionSet::InitializeFCL, Entry"); + + TUint32 port = aIds.Get( KMceIdsIndexFCPort ); + + MCESRV_DEBUG_DVALUE("FC session initalization with port", port ); + + __ASSERT_ALWAYS( !iSession.FCSession(), User::Leave( KErrArgument ) ); + + iSession.iFCSession = &(iSession.ServerCore().FCPluginEngine(). + CreateNewSessionL( aType, + iSession.SIPConnection().AccessPointId(), + port ) ); + + iSession.ServerCore(). + RegisterFCSessionL( iSession, *iSession.FCSession() ); + + MCESRV_DEBUG("TMceFCActionSet::InitializeFCL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::UpdateFC +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::UpdateFCL( TMceIds& aIds, const TDesC8& /*aType*/ ) + { + MCESRV_DEBUG("TMceFCActionSet::UpdateFCL, Entry"); + + TUint32 port = aIds.Get( KMceIdsIndexFCPort ); + + MCESRV_DEBUG_DVALUE("FC session updating with port", port) + + __ASSERT_ALWAYS( MCE_NOT_NULL_PTR( iSession.FCSession() ) , User::Leave( KErrArgument ) ); + iSession.ServerCore().FCPluginEngine(). + UpdateSessionL( *iSession.iFCSession, port ); + + MCESRV_DEBUG("TMceFCActionSet::UpdateFCL, Exit"); + + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::Release +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::ReleaseFC() + { + MCE_DEBUG2("TMceFCActionSet::ReleaseFC", "Entry") + MCESRV_DEBUG("TMceFCActionSet::ReleaseFC, Entry"); + + if ( iSession.FCSession() ) + { + iSession.ServerCore().FCPluginEngine(). + ReleaseSession( *iSession.iFCSession); + + iSession.iFCSession = NULL; + } + MCE_DEBUG2("TMceFCActionSet::ReleaseFC", "Exit") + + MCESRV_DEBUG("TMceFCActionSet::ReleaseFC, Exit"); + + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::FCGetMediaLinesL +// ----------------------------------------------------------------------------- +// +HBufC8* TMceFCActionSet::FCGetMediaLinesL() + { + MCESRV_DEBUG("TMceFCActionSet::FCGetMediaLinesL, Entry"); + + HBufC8* returnMessage = NULL; + + RPointerArray attribs = iSession.ServerCore(). + FCPluginEngine().FormatAttributeFieldsL( *iSession.FCSession() ); + + CDesC8ArrayFlat* mediaLines = + new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity ); + CleanupStack::PushL( mediaLines ); + + for ( int i = 0; i < attribs.Count(); i++ ) + { + HBufC8* mediaLine = HBufC8::NewLC( KMceSdpMaxMediaLineLength ); + TPtr8 mediaLinePtr = mediaLine->Des(); + RDesWriteStream writeStream( mediaLinePtr ); + writeStream.PushL(); + + CSdpFmtAttributeField* field = attribs[ i ]; + field->EncodeL( writeStream ); + + TInt len = writeStream.Sink()->TellL(MStreamBuf::EWrite).Offset(); + mediaLine->Des().SetLength( len ); + mediaLines->AppendL( mediaLine->Des() ); + + CleanupStack::PopAndDestroy();//writeStream + CleanupStack::PopAndDestroy( mediaLine );//mediaLine + } + + CMceMsgTextArray* msgLines = new (ELeave) CMceMsgTextArray( *mediaLines ); + CleanupStack::PushL( msgLines ); + msgLines->EncodeL(); + + returnMessage = msgLines->EncodeBuffer().Ptr(0).AllocL(); + + CleanupStack::PopAndDestroy(msgLines); //mediaLines + CleanupStack::PopAndDestroy(mediaLines); //mediaLines + + MCESRV_DEBUG("TMceFCActionSet::FCGetMediaLinesL, Exit"); + + return returnMessage; + + } + + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::FCSetMediaLinesL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::FCSetMediaLinesL( CMceMsgBase& aMediaLines ) + { + MCESRV_DEBUG("TMceFCActionSet::FCSetMediaLinesL, Entry"); + + CMceMsgTextArray* msgLines = static_cast (&aMediaLines ); + + RPointerArray* attribs = + new (ELeave) RPointerArray; + CleanupStack::PushL( TCleanupItem( ArrayCleanup, attribs ) ); + for( int i=0;iiArray->Count();i++) + { + attribs->AppendL( + CSdpFmtAttributeField::DecodeL( msgLines->iArray->MdcaPoint(i) ) ); + } + + iSession.ServerCore().FCPluginEngine(). + SetFormatAttributeFieldsL( *iSession.FCSession(), attribs ); + CleanupStack::Pop( attribs ); //attribs + + msgLines->Close(); + + MCESRV_DEBUG("TMceFCActionSet::FCSetMediaLinesL, Exit"); + } + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::SendFCMsgL +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::SendFCMsgL ( const TDesC8& aMessage ) + { + MCESRV_DEBUG("TMceFCActionSet::SendFCMsgL, Entry"); + User::LeaveIfError( iSession.FCSession() ? KErrNone : KErrArgument ); + User::LeaveIfError( iSession.Body() ? KErrNone : KErrArgument ); + + if ( iSession.ServerCore().FCPluginEngine(). + IsReceiverL( *iSession.FCSession() ) ) + { + // Send using FC subsystem. + HBufC8* sesbuf = aMessage.AllocLC(); + + iSession.ServerCore().FCPluginEngine().SendToNetL( + *iSession.FCSession(), + sesbuf ); + CleanupStack::Pop( sesbuf ); //sesbuf + } + else + { + CMceMediaManager& mediaManager = iSession.Manager().MediaManager(); + CMceComMediaStream* stream = NULL; + // go through streams and possible bound + // streams and find first uplink stream. + TInt index = 0; + while( !stream && index < iSession.Body()->Streams().Count() ) + { + stream = iSession.Body()->Streams()[ index++ ]; + if ( stream->iType == KMceAudio ) + { + stream = stream->SendStream(); + } + else + { + stream = NULL; + } + } + + if ( stream ) + { + mediaManager.SendRTCPAnyDataL( *stream, aMessage ); + } + else + { + User::Leave( KErrNotSupported ); + } + } + MCESRV_DEBUG("TMceFCActionSet::SendFCMsgL, Exit"); + } + + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::NeedToSendOffer +// ----------------------------------------------------------------------------- +// +TBool TMceFCActionSet::NeedToSendOffer() + { + MCESRV_DEBUG("TMceFCActionSet::NeedToSendOffer, Entry"); + + TBool needToSendOffer = EFalse; + const CFCSession* fcSession = iSession.FCSession(); + + //if fc session is not in use fc will return ETrue by default + if ( fcSession && iSession.UseFC() ) + + { + CFCPlugInEngine& fc = iSession.ServerCore().FCPluginEngine(); + + + TRAPD( error, needToSendOffer = fc.UpdateNeededL( *fcSession ) ); + + if ( error != KErrNone ) + { + MCESRV_DEBUG_DVALUE("TMceFCActionSet::NeedToSendOffer, ERROR:", error ); + needToSendOffer = EFalse; + } + } + + MCESRV_DEBUG("TMceFCActionSet::NeedToSendOffer, Exit"); + return needToSendOffer; + } + + +// ----------------------------------------------------------------------------- +// TMceFCActionSet::RTCPPort +// ----------------------------------------------------------------------------- +// +TUint TMceFCActionSet::RTCPPort() + { + CMceComMediaStream* stream = NULL; + if ( iSession.BodyCandidate() ) + { + stream = iSession.BodyCandidate()->Streams()[0]; + } + else + { + stream = iSession.Body()->Streams()[0]; + } + return stream->iLocalMediaPort + 1; + } +// ----------------------------------------------------------------------------- +// TMceFCActionSet::ArrayCleanup +// ----------------------------------------------------------------------------- +// +void TMceFCActionSet::ArrayCleanup(TAny* aArray) + { + RPointerArray* array = + reinterpret_cast*>(aArray); + if (array) + { + array->ResetAndDestroy(); + array->Close(); + delete array; + } + } + + +// End of File +