multimediacommsengine/mmcesrv/mmceserver/src/mcestateupdating.cpp
changeset 0 1bce908db942
child 13 fb1bbf85a302
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcestateupdating.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* 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 "mcestateupdating.h"
+#include "mcesipsession.h"
+#include "mceactionset.h"
+#include "mcefcactionset.h"
+#include "mceclientserver.h"
+#include "mcenatmacros.h"
+
+
+// -----------------------------------------------------------------------------
+// CMceStateUpdating::CMceStateUpdating
+// -----------------------------------------------------------------------------
+//
+CMceStateUpdating::CMceStateUpdating ()
+    : CMceState( KMceStateUpdating )
+	{
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMceStateUpdating::~CMceStateUpdating
+// -----------------------------------------------------------------------------
+//
+CMceStateUpdating::~CMceStateUpdating()
+	{
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMceStateUpdating::DoAcceptL
+// -----------------------------------------------------------------------------
+//
+TBool CMceStateUpdating::DoAcceptL( TMceStateTransitionEvent& aEvent )
+	{
+
+    User::LeaveIfError(
+      aEvent.Code() == EMceMediaUpdated ||
+      aEvent.Code() == EMceItcEnable ||
+      aEvent.Code() == EMceItcDisable ||
+      IsExtensionRequestEvent( aEvent )
+      
+        ? KErrNone : KErrTotalLossOfPrecision );
+    
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceStateUpdating::EntryL
+// -----------------------------------------------------------------------------
+//
+void CMceStateUpdating::EntryL( TMceStateTransitionEvent& aEvent )
+	{
+	if ( IsExtensionRequestEvent( aEvent ))
+		{
+		HandleExtensionRequestEventL( aEvent );	
+		}
+
+	else
+		{
+		CMceSipSession& session = aEvent.Session();
+		CSIPServerTransaction& request = session.Request();
+		CSIPServerTransaction* requestPtr = &request;
+		
+		switch( aEvent.Code() )
+	    	{
+	    	case EMceMediaUpdated:
+	    	    {
+	    	    if ( session.SubState() == CMceSipSession::EUpdating )
+	    	        {
+	    	        if ( aEvent.ParamStatus() == KErrNone )
+	                    {
+	                    NAT_WAIT_NO_EXEC( session, session.Actions().EncodeL() );
+	                    session.FCActions().UpdateFCAnswerL( *session.Offer() );
+	                    if ( !((requestPtr!=NULL) && !MceSip::HasContent( request )) )
+	        	            { // if not pull mode, do UpdateSucceed()
+	                        session.Actions().UpdateSucceed();
+	        	            }
+	                    session.Actions().SendAnswerL( request );
+	                    }
+	                else
+	                    {
+	        	        MceSip::DiscardRequest( request, aEvent.ParamStatus() );
+	                    session.Actions().UpdateFailed();
+	                    }
+	                }
+	            else
+	                {
+	                if ( aEvent.ParamStatus() == KErrNone )
+	    	            {
+	    	            // Send 183 with SDP if needed
+	    	            if ( ( MCE_NEED_TO_RECEIVE( session ) &&
+	    	                 session.Extensions().Local( CMceSipExtensions::E100rel ) 
+	    	                 != CMceSipExtensions::ENotSupported &&
+	    	                 session.Extensions().Remote( CMceSipExtensions::E100rel ) 
+	    	                 != CMceSipExtensions::ENotSupported ) || MCE_FORCED_TO_RECEIVE( session ))
+	    	                {
+	    	                // encode
+	    	                if ( session.ActiveBody().SecureSession() )
+	                        	{
+	    	                	session.ActiveBody().SecureSession()->iLSReadyToBind = EFalse;
+	                        	}
+	    	                NAT_WAIT_NO_EXEC( session, session.Actions().EncodeL() );
+	                        session.FCActions().UpdateFCAnswerL( *session.Offer() );
+	                        session.Actions().SendResponseL( 
+	                                        request,
+	                                        KMceSipSessionProgress,
+	                                        SipStrConsts::EPhraseSessionProgress );
+	                        // start reserving
+	                        session.Actions().ReserveL();
+	                        if ( session.ActiveBody().SecureSession() )
+	                        	{
+	                        	session.ActiveBody().SecureSession()->iKeyNeedUpdated = EFalse;
+	                        	}
+	                        // change state
+	                        session.Actions().StateChanged( 
+	                            KMceStateAcknowledgementRequired );
+	                        }
+	    	            }
+	                else
+	                    {
+	                    EntryMediaErrorL( aEvent );
+	                    }
+	                }
+	            break;
+	    	    }
+		    
+		    case EMceItcEnable:
+	        case EMceItcDisable:
+	            {
+	            session.Actions().ControlMediaL( aEvent.ParamIDs(), 
+	                                             (TMceItcFunctions)aEvent.Code() );
+	            break;
+	            } 
+	    	default:
+	            {
+	    	    break;
+	    	    }
+	    	    
+	    	}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CMceStateUpdating::ExitL
+// -----------------------------------------------------------------------------
+//
+void CMceStateUpdating::ExitL( TMceStateTransitionEvent& aEvent )
+	{
+	
+	if ( IsExtensionRequestEvent( aEvent ))
+		{
+		//Do Nothing;
+		}
+	
+	else 
+		{
+		CMceSipSession& session = aEvent.Session();
+		TInt status = aEvent.ParamStatus();
+	    CSIPServerTransaction& request = session.Request();
+	    CSIPServerTransaction* requestPtr = &request;
+
+		
+		switch( aEvent.Code() )
+	    	{
+		    case EMceMediaUpdated:
+	    	    {
+	    	    if ( session.SubState() == CMceSipSession::EUpdating )
+	    	        {
+	    	        if ( status == KErrNone )
+	    	            {
+	    	            if ( (requestPtr!=NULL) && !MceSip::HasContent( request ) )
+	        	            { // pull mode
+	        	            session.Actions().StateChanged( KMceStateServerOffering );
+	                        session.Actions().ClientStateChangedL( 
+	                            CMceSession::EProceeding,
+	                            session.ActiveBody(),
+	                            KErrNone );  
+	        	            }
+	                    else
+	                        {
+                            if ( request.Type() == SIPStrings::StringF( SipStrConsts::EUpdate ) )
+                                {
+                                session.Actions().StopPendingTimer();
+                                session.Actions().ClientStateChangedL( CMceSession::EEstablished, session.Request() );
+                                session.Actions().StateChanged( KMceStateEstablished );  
+                                }
+                            else
+                                {
+	                            session.Actions().ClientStateChangedL( CMceSession::EProceeding );
+	                            session.Actions().StateChanged( KMceStateAnswering );   
+                                } 
+	                        }
+	    	            }
+	                else
+	                    {
+	                    session.Actions().ClientStateChangedL( CMceSession::EEstablished, 
+	                                                           *session.Body(), 
+	                                                           status );
+	                    session.Actions().StateChanged( KMceStateEstablished );
+	                    }
+	    	        }
+	    	    else
+	    	        {
+	    	        if ( aEvent.ParamStatus() < 0 )
+	    	            {
+	                    session.Actions().StateChanged( KMceStateTerminated );
+	                    session.Actions().ClientStateChangedL( CMceSession::ETerminated, 
+	                                                           status );
+	    	            }
+	                else
+	                    {
+	                    session.Actions().StateChanged( KMceStateUpdated );
+	                    session.Actions().ClientStateChangedL( CMceSession::EProceeding,
+	                                                           *session.Body(),
+	                                                           KErrNone );
+	                    }
+	    	        }
+	    	    break;
+	    	    }
+	        default:
+	            {
+	    	    break;
+	    	    }
+	    	}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CMceStateUpdating::EntryMediaErrorL
+// -----------------------------------------------------------------------------
+//
+void CMceStateUpdating::EntryMediaErrorL( TMceStateTransitionEvent& aEvent )
+    {
+    CMceSipSession& session = aEvent.Session();
+	CSIPServerTransaction& request = session.Request();
+	
+    MceSip::DiscardRequest( request, aEvent.ParamStatus() );
+    session.Actions().StopMedia();
+    session.FCActions().ReleaseFC();
+    }
+
+
+// End of File
+