multimediacommsengine/mmcesrv/mmcemediamanager/src/mceofferingmedia.cpp
changeset 0 1bce908db942
--- /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 ");
+    }
+