multimediacommsengine/mmcesrv/mmceserver/src/mcestateoffering.cpp
changeset 30 4c9e1ec7a69e
parent 12 966b25fd74b5
--- a/multimediacommsengine/mmcesrv/mmceserver/src/mcestateoffering.cpp	Fri Jun 11 11:20:25 2010 +0300
+++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcestateoffering.cpp	Thu Jun 24 14:41:11 2010 +0300
@@ -43,7 +43,9 @@
 // -----------------------------------------------------------------------------
 //
 CMceStateOffering::CMceStateOffering ()
-    : CMceState( KMceStateOffering )
+    : CMceState( KMceStateOffering ),
+      iLastResponse ( 0 ),
+	  iReadyToSendACK ( ETrue )
 	{
 	}
 
@@ -264,6 +266,7 @@
     TInt status = KErrNone;
     CMceSipSession& session = aEvent.Session();
     CSIPClientTransaction& response = session.Response();
+    iLastResponse = MceSip::ResponseCode( response );
      
     session.Extensions().UpdateL( response );
     session.Actions().CheckContactIsSecureL( response );
@@ -439,14 +442,35 @@
     TInt status = KErrNone;
 	CMceSipSession& session = aEvent.Session();
     CMceSipSession::TSubState subState = session.SubState();
+    TInt currentResponse = MceSip::ResponseCode( session.Response() );
 	
+	// If media handling is ongoing while 200OK arrives with certain SDP content
+    // don't send ACK thus the UAS will retransmit 200OK untile pervious meida handling
+    // finish.
+ 
+    if ( KMceSipRinging == iLastResponse &&
+    	 KMceSipOK == currentResponse && 
+    	 MceSip::HasContent( session.Response() ) )
+    	{
+		if ( session.WaitingMediaCallback() )
+    		{
+			iReadyToSendACK = EFalse;
+			MCESRV_DEBUG("Waiting media callback, do not send ACK for this 200OK")
+    		return;
+    		}
+    	else
+    		{
+			iReadyToSendACK = ETrue;
+			MCESRV_DEBUG("Ready to send ACK")
+    		}
+    	}
     //send ACK
     session.Actions().SendACKL( session.Response() );
 	session.Actions().CheckContactIsSecureL( session.Response() );
     session.ActiveBody().AnswerType() = KMceNegotiationAnswerTypeFinal;
     
-	// Handle the answer only if the media processing is not
-	// already ongoing
+    iLastResponse = currentResponse;
+
 	if ( !session.WaitingMediaCallback() )
 	    {
 	    if ( MceSip::HasContent( session.Response() ) )
@@ -767,6 +791,11 @@
 //
 void CMceStateOffering::ExitL( TMceStateTransitionEvent& aEvent )
 	{
+	if ( !iReadyToSendACK )
+		{
+		MCESRV_DEBUG("Not ready, don't change any state");
+		return;
+		}
 	
 	if ( IsExtensionRequestEvent( aEvent ))
 		{