diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmcemediamanager/src/mceofferingmedia.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmcemediamanager/src/mceofferingmedia.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,366 @@ +/* +* 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 "mceofferingmedia.h" +#include "mcemediamanager.h" +#include "mcestartingofferersendstreams.h" +#include "mcesdpsession.h" +#include "mcecomsession.h" +#include "mcemediaobserver.h" +#include "mcesrvstreamiterator.h" +#include "mceevents.h" +#include "mcemmlogs.h" +#include + + + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::SetAsCurrentStateL +// ----------------------------------------------------------------------------- +// +void TMceOfferingMedia::SetAsCurrentStateL( CMceComSession& aSession, TBool aFromSubstate ) + { + MCEMM_DEBUG("TMceOfferingMedia::SetAsCurrentStateL() "); + + if ( !aFromSubstate ) + { + TBool signalling = aSession.SdpSession().SignallingRequired() != KMceNoSignalling || + aSession.iFcSignallingRequired || + aSession.iRequireSignalling; + + MCEMM_DEBUG_DVALUE( "TMceOfferingMedia: fc signalling required:", + aSession.iFcSignallingRequired ); + + MCEMM_DEBUG_DVALUE( "TMceOfferingMedia: signalling required:", + aSession.iRequireSignalling ); + + TBool update = MCE_NOT_NULL_PTR( aSession.Backup() ); + + if ( !update ) + { + if ( !signalling ) + //wait answer offer + { + MCEMM_DEBUG("TMceOfferingMedia: waiting answer to offer "); + TMceOfferingMedia::TMceMediaReady::SetAsCurrentStateL( aSession ); + } + else + { + //wait answer re-offer + MCEMM_DEBUG("TMceOfferingMedia: waiting answer to update "); + TMceOfferingMedia::TMceMediaUpdateReady::SetAsCurrentStateL( aSession ); + } + } + else//update + { + if ( !signalling ) + //no signalling pass through + { + MCEMM_DEBUG("TMceOfferingMedia: update - no signalling, no waiting"); + TMceStartingOffererSendStreams::SetAsCurrentStateL( aSession ); + } + else + { + MCEMM_DEBUG("TMceOfferingMedia: update - waiting answer to update "); + TMceOfferingMedia::TMceMediaUpdateReady::SetAsCurrentStateL( aSession ); + } + } + } + else + { + TMceOfferingMedia* + self = new (ELeave) TMceOfferingMedia( aSession ); + + CleanupStack::PushL( self ); + aSession.SetNegotiationStateL( self ); + CleanupStack::Pop( self ); + + } + } + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaReady::SetAsCurrentStateL +// ----------------------------------------------------------------------------- +// +void TMceOfferingMedia::TMceMediaReady::SetAsCurrentStateL( CMceComSession& aSession ) + { + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaReady::SetAsCurrentStateL() "); + + TMceOfferingMedia::TMceMediaReady* + self = new (ELeave) TMceOfferingMedia::TMceMediaReady( aSession ); + + CleanupStack::PushL( self ); + aSession.SetNegotiationStateL( self ); + CleanupStack::Pop( self ); + + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaUpdateReady::SetAsCurrentStateL +// ----------------------------------------------------------------------------- +// +void TMceOfferingMedia::TMceMediaUpdateReady::SetAsCurrentStateL( CMceComSession& aSession ) + { + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaUpdateReady::SetAsCurrentStateL() "); + + TMceOfferingMedia::TMceMediaUpdateReady* + self = new (ELeave) TMceOfferingMedia::TMceMediaUpdateReady( aSession ); + + CleanupStack::PushL( self ); + aSession.SetNegotiationStateL( self ); + CleanupStack::Pop( self ); + + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceWaitingAnswer::SetAsCurrentStateL +// ----------------------------------------------------------------------------- +// +void TMceOfferingMedia::TMceWaitingAnswer::SetAsCurrentStateL( CMceComSession& aSession ) + { + MCEMM_DEBUG("TMceOfferingMedia::TMceWaitingAnswer::SetAsCurrentStateL() "); + + TMceOfferingMedia::TMceWaitingAnswer* + self = new (ELeave) TMceOfferingMedia::TMceWaitingAnswer( aSession ); + + CleanupStack::PushL( self ); + aSession.SetNegotiationStateL( self ); + CleanupStack::Pop( self ); + + } + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceOfferingMedia +// ----------------------------------------------------------------------------- +// +TMceOfferingMedia::TMceOfferingMedia( CMceComSession& aSession ) + : TMceMediaState( aSession ) + { + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaReady::TMceMediaReady +// ----------------------------------------------------------------------------- +// +TMceOfferingMedia::TMceMediaReady::TMceMediaReady( CMceComSession& aSession ) + : TMceMediaState( aSession ) + { + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaUpdateReady::TMceMediaUpdateReady +// ----------------------------------------------------------------------------- +// +TMceOfferingMedia::TMceMediaUpdateReady::TMceMediaUpdateReady( CMceComSession& aSession ) + : TMceOfferingMedia::TMceMediaReady( aSession ) + { + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceWaitingAnswer::TMceWaitingAnswer +// ----------------------------------------------------------------------------- +// +TMceOfferingMedia::TMceWaitingAnswer::TMceWaitingAnswer( CMceComSession& aSession ) + : TMceMediaState( aSession ) + { + } + + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaReady::Callback +// ----------------------------------------------------------------------------- +// +void TMceOfferingMedia::TMceMediaReady::Callback() + { + + iSession.MediaObserver().Updated( iSession ); + + } + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaReady::EncodeL +// ----------------------------------------------------------------------------- +// +CSdpDocument* TMceOfferingMedia::TMceMediaReady::EncodeL() + { + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaReady::EncodeL, Entry "); + + CSdpDocument* sdp = iSession.SdpSession().CreateOfferL( iSession, + CMceSdpSession::EFirst ); + CleanupStack::PushL( sdp ); + iSession.SdpSession().StockMediaSessionL(); + TMceOfferingMedia::TMceWaitingAnswer::SetAsCurrentStateL( iSession ); + CleanupStack::Pop( sdp ); + + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaReady::EncodeL, Exit "); + + return sdp; + + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaUpdateReady::EncodeL +// ----------------------------------------------------------------------------- +// +CSdpDocument* TMceOfferingMedia::TMceMediaUpdateReady::EncodeL() + { + + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaUpdateReady::EncodeL, Entry "); + + CSdpDocument* sdp = iSession.SdpSession().CreateOfferL( iSession, + CMceSdpSession::EUpdate ); + + // Sdp not pushed, ownership elsewhere + TMceOfferingMedia::TMceWaitingAnswer::SetAsCurrentStateL( iSession ); + + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaUpdateReady::EncodeL, Exit "); + + return sdp; + + } + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaUpdateReady::NeedToNegotiate +// ----------------------------------------------------------------------------- +// +TBool TMceOfferingMedia::TMceMediaUpdateReady::NeedToNegotiate( CSdpDocument* /*aSdpDocument*/ ) + { + MCEMM_DEBUG("TMceOfferingMedia::TMceMediaUpdateReady::NeedToNegotiate() "); + + return ETrue; + } + + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceWaitingAnswer::CloneL +// ----------------------------------------------------------------------------- +// +TMceMediaState* TMceOfferingMedia::TMceWaitingAnswer::CloneL( CMceComSession& aSession ) const + { + TMceOfferingMedia::TMceWaitingAnswer* + state = new (ELeave) TMceOfferingMedia::TMceWaitingAnswer( aSession ); + + state->SetRole( Role() ); + state->iStackIndex = iStackIndex; + + return state; + + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceWaitingAnswer::DecodeL +// ----------------------------------------------------------------------------- +// +TMceSipWarningCode TMceOfferingMedia::TMceWaitingAnswer::DecodeL( CSdpDocument& aSdpDocument ) + { + MCEMM_DEBUG("TMceOfferingMedia::TMceWaitingAnswer::DecodeL, Entry "); + + TMceSipWarningCode status = (TMceSipWarningCode)KErrNone; + + if ( !iSession.SdpSession().ContextSwitchRequested() ) + { + status = iSession.SdpSession().DecodeAnswerL( aSdpDocument, iSession ); + TMceOfferingMedia::SetAsCurrentStateL( iSession, KFromSubstate ); + } + else + { + CMceSdpSession& forkedSdpSession = iSession.SdpSession().ForkL(); + CMceComSession& forkedSession = *forkedSdpSession.MediaSession(); + status = forkedSession.NegotiationState().DecodeL( aSdpDocument ); + } + + + MCEMM_DEBUG("TMceOfferingMedia::TMceWaitingAnswer::DecodeL, Exit "); + + return status; + + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::TMceMediaReady::NeedToNegotiate +// ----------------------------------------------------------------------------- +// +TBool TMceOfferingMedia::TMceWaitingAnswer::NeedToNegotiate( CSdpDocument* /*aSdpDocument*/ ) + { + MCEMM_DEBUG("TMceOfferingMedia::TMceWaitingAnswer::NeedToNegotiate() "); + + return ETrue; + } + +// ----------------------------------------------------------------------------- +// TMceOfferingMedia::UpdateL +// ----------------------------------------------------------------------------- +// + +void TMceOfferingMedia::UpdateL() + { + + MCEMM_DEBUG("TMceOfferingMedia::UpdateL(), Entry "); + + CMceSrvStream* stream = NULL; + + // check if non-local media was rejected, if yes then stop the stream + iSession.SdpSession().Manager().CleanupL( iSession ); + + //set remote ip address for all non stopped receive only streams (RTP keep alive) + TMceSrvStreamIterator recvonlyStreams( iSession.MccStreams(), + TMceSrvStreamIterator::EReceive ); + while( recvonlyStreams.Next( stream, CMceSrvStream::EStopped, + TMceSrvStreamIterator::ExactReverseMatch ) ) + + { + if ( stream->State() != CMceSrvStream::EInactive && + stream->Direction() == CMceComMediaStream::EReceiveOnlyStream ) + { + MCEMM_DEBUG_STREAM( "TMceOfferingMedia::UpdateL(): \ +setting remote address for downlink stream", *stream ); + iSession.SdpSession().Manager().SetRemoteAddressL( *stream ); + } + } + + //do validation & adjustments for all non stopped active send streams + TMceSrvStreamIterator sendStreams( iSession.MccStreams(), TMceSrvStreamIterator::ESend ); + while( sendStreams.Next( stream, CMceSrvStream::EStopped, + TMceSrvStreamIterator::ExactReverseMatch ) ) + + { + if ( stream->State() != CMceSrvStream::EInactive && + stream->Codec().iIsNegotiated ) + { + iSession.SdpSession().Manager().AdjustMccStreamL( *stream ); + MCEMM_DEBUG_STREAM( "TMceOfferingMedia::UpdateL(): adjusted stream", *stream ); + } + } + + + + //set next state, this state will become unusable + TMceStartingOffererSendStreams::SetAsCurrentStateL( iSession ); + + + MCEMM_DEBUG("TMceOfferingMedia::UpdateL(), Exit "); + } +