--- /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 <sdpdocument.h>
+
+
+
+
+// -----------------------------------------------------------------------------
+// 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 ");
+ }
+