multimediacommsengine/mmcesrv/mmceserver/src/mcestateestablished.cpp
changeset 0 1bce908db942
child 17 a5ac35ca6d81
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 #include <sipdialogassocbase.h> 
       
    22 #include <sipdialog.h>			
       
    23 #include "mcestateestablished.h"
       
    24 #include "mcesipsession.h"
       
    25 #include "mceactionset.h"
       
    26 #include "mcefcactionset.h"
       
    27 #include "mcenatmacros.h"
       
    28 #include "mcesdpsession.h"
       
    29 #include "mcesrvlogs.h"
       
    30 
       
    31 
       
    32 // -----------------------------------------------------------------------------
       
    33 // CMceStateEstablished::CMceStateEstablished
       
    34 // -----------------------------------------------------------------------------
       
    35 //
       
    36 CMceStateEstablished::CMceStateEstablished ()
       
    37     : CMceState( KMceStateEstablished )
       
    38 	{
       
    39 	}
       
    40 
       
    41 // -----------------------------------------------------------------------------
       
    42 // CMceStateEstablished::~CMceStateEstablished
       
    43 // -----------------------------------------------------------------------------
       
    44 //
       
    45 CMceStateEstablished::~CMceStateEstablished()
       
    46 	{
       
    47 	}
       
    48 
       
    49 // -----------------------------------------------------------------------------
       
    50 // CMceStateEstablished::DoAcceptL
       
    51 // -----------------------------------------------------------------------------
       
    52 //
       
    53 TBool CMceStateEstablished::DoAcceptL( TMceStateTransitionEvent& aEvent )
       
    54 	{
       
    55 	if ( !IsExtensionRequestEvent( aEvent ) &&
       
    56 		 aEvent.Code() == EMceResponse && 
       
    57 	     MceSip::ResponseCode( aEvent.Session().Response() ) == KMceSipOK )
       
    58 		{
       
    59 	    return EFalse;		
       
    60 		}
       
    61 
       
    62     User::LeaveIfError( 	                 
       
    63        aEvent.Code() == EMceItcTerminateSession  ||
       
    64        aEvent.Code() == EMceItcUpdate  ||
       
    65        aEvent.Code() == EMceItcEnable  ||
       
    66        aEvent.Code() == EMceItcDisable  ||
       
    67        aEvent.Code() == EMceMediaSessionStopped  ||
       
    68        aEvent.Code() == EMceInvite  ||
       
    69        aEvent.Code() == EMceUpdate ||
       
    70        aEvent.Code() == EMceBye ||
       
    71        aEvent.Code() == EMceSessionExpired ||
       
    72        aEvent.Code() == EMceSessionRefresh ||
       
    73        aEvent.Code() == EMceSessionPending ||
       
    74        aEvent.Code() == EMceErrorResponse || // 487 for CANCEL
       
    75        IsExtensionRequestEvent( aEvent )
       
    76        
       
    77        ? KErrNone : KErrTotalLossOfPrecision );
       
    78            
       
    79 	return ETrue;
       
    80 	}
       
    81 
       
    82 // -----------------------------------------------------------------------------
       
    83 // CMceStateEstablished::StateEntry
       
    84 // -----------------------------------------------------------------------------
       
    85 //
       
    86 void CMceStateEstablished::StateEntry( TMceStateTransitionEvent& aEvent )
       
    87     {
       
    88     CMceState::StateEntry( aEvent );
       
    89     
       
    90 	CMceSipSession& session = aEvent.Session();
       
    91     
       
    92     TBool clearSubState = ETrue;
       
    93     
       
    94     if ( &session.Response() )
       
    95         {
       
    96         TUint code = MceSip::ResponseCode( session.Response() );
       
    97         if ( code != KMceSipRequestPending )
       
    98             {
       
    99             session.Actions().StopPendingTimer();
       
   100             }
       
   101         else
       
   102             {
       
   103             clearSubState = EFalse;
       
   104             }
       
   105         }
       
   106     if ( clearSubState )
       
   107         {
       
   108         session.SetSubState( CMceSipSession::ENone );
       
   109         }
       
   110         
       
   111     session.CloseBodyBucket();
       
   112 
       
   113     session.RemoveCompletedRequests( ETrue );
       
   114     
       
   115     session.ResetSdpCounts();
       
   116     
       
   117     }
       
   118 
       
   119 // -----------------------------------------------------------------------------
       
   120 // CMceStateEstablished::EntryL
       
   121 // -----------------------------------------------------------------------------
       
   122 //
       
   123 void CMceStateEstablished::EntryL( TMceStateTransitionEvent& aEvent )
       
   124 	{
       
   125 
       
   126 	if ( IsExtensionRequestEvent( aEvent ))
       
   127 		{
       
   128 		HandleExtensionRequestEventL( aEvent );	
       
   129 		}
       
   130 	
       
   131 	else 
       
   132 		{
       
   133 
       
   134 		CMceSipSession& session = aEvent.Session();
       
   135 
       
   136 	    switch ( aEvent.Code() )
       
   137 	        {
       
   138 	        //client has been asked to update session
       
   139 	        case EMceItcUpdate:
       
   140 	            {
       
   141 	            EntryUpdateL( aEvent );
       
   142 	            break;
       
   143 	            }
       
   144 	        //INVITE has been received due session update or refresh
       
   145 	        case EMceInvite:
       
   146 	            {
       
   147 	            EntryInviteL( aEvent );
       
   148 	            break;
       
   149 	            }
       
   150 	        //UPDATE has been received for instance for session expires
       
   151 	        // or media update
       
   152 	        case EMceUpdate:
       
   153 	            {
       
   154                 EntryInUpdateL( aEvent );
       
   155                 break;
       
   156 	            }
       
   157 	        //client terminates session or session timer expires, 
       
   158 	        //when session is not refresher BYE is sent and media 
       
   159 	        //and FC are stopped
       
   160 	        case EMceSessionExpired:
       
   161 	        case EMceItcTerminateSession:
       
   162 	            {
       
   163 	            EntryTerminateSessionL( aEvent );
       
   164 	            break;
       
   165 	            }
       
   166 	        //BYE has been received
       
   167 	        case EMceBye:
       
   168 	            {
       
   169 	            EntryByeL( aEvent );
       
   170 	            break;
       
   171 	            }
       
   172 	        //media conrol
       
   173 	        case EMceItcEnable:
       
   174 	        case EMceItcDisable:
       
   175 	            {
       
   176 	            EntryMediaL( aEvent );
       
   177 	            break;
       
   178 	            }
       
   179 	        //refresher's session timer fired
       
   180 	        //and thus, refresh is launched (INVITE)
       
   181 	        case EMceSessionRefresh:
       
   182 	            {
       
   183 	            session.Actions().EncodeL();
       
   184 	            session.FCActions().UpdateFCOfferL( *session.Offer() );
       
   185 	            session.Actions().SendSessionRefreshL();
       
   186 	            break;
       
   187 	            }
       
   188 	        //pending timer fired, re-send re-INVITE
       
   189 	        case EMceSessionPending:
       
   190 	            {
       
   191 	            session.Actions().SendInviteL();
       
   192 	            break;
       
   193 	            }
       
   194 	        //media has beed stopped or there is media error
       
   195 	        //session state is not affected, client is only informed
       
   196 	        case EMceMediaSessionStopped:
       
   197 	           	{
       
   198 	           	MediaErrorOccured( aEvent );
       
   199 	           	break;
       
   200 	           	}
       
   201 	              
       
   202 	        default:
       
   203 	            {
       
   204 	            //NOP
       
   205 	            break;
       
   206 	            }
       
   207 	        }
       
   208 		}
       
   209 	         
       
   210 	}
       
   211 
       
   212 // -----------------------------------------------------------------------------
       
   213 // CMceStateEstablished::EntryUpdateL
       
   214 // -----------------------------------------------------------------------------
       
   215 //
       
   216 void CMceStateEstablished::EntryUpdateL( TMceStateTransitionEvent& aEvent )
       
   217     {
       
   218 	CMceSipSession& session = aEvent.Session();
       
   219     
       
   220     // create body candidate
       
   221     session.Actions().CreateBodyCandidateL( CMceComSession::EOutSession );
       
   222     // update body candidate
       
   223     session.Actions().UpdateBodyL( aEvent.ParamIDs(), 
       
   224                                    aEvent.ParamClientMessage() );
       
   225     session.BodyCandidate()->iFcSignallingRequired = 
       
   226                                     session.FCActions().NeedToSendOffer();
       
   227 
       
   228     if ( &session.Body()->SdpSession() &&
       
   229     	 session.Body()->SdpSession().iOOldSchoolCompleted )
       
   230         {
       
   231         session.BodyCandidate()->iRequireSignalling = ETrue;
       
   232         session.Body()->SdpSession().iOOldSchoolCompleted = 0;
       
   233         }
       
   234         
       
   235     //create updated session (body) candidate
       
   236     TMceReturnStatus status = session.Actions().UpdateL();
       
   237                               
       
   238     aEvent.ParamStatus() = status;
       
   239     //if creation fails candidate is rolled back to original
       
   240     if ( MCE_IS_ERROR( status ) )
       
   241         {
       
   242         session.Actions().UpdateFailed();
       
   243         }
       
   244     else if ( status == KMceReady )
       
   245         {
       
   246         if ( MCE_NEED_TO_SEND( session, NULL ) )
       
   247             {
       
   248             NAT_WAIT_NO_EXEC( session, session.Actions().EncodeL() );
       
   249             session.FCActions().UpdateFCOfferL( *session.Offer() );
       
   250             session.Actions().SendInviteL();
       
   251             
       
   252             session.Actions().StateChanged( KMceStateOffering );
       
   253             session.Actions().ClientStateChanged( aEvent.ParamIDs(), 
       
   254                                                   CMceSession::EOffering );
       
   255             }
       
   256         else
       
   257             {
       
   258             session.Actions().UpdateSucceed();
       
   259             }
       
   260         }
       
   261     else
       
   262         {
       
   263         // NOP
       
   264         }
       
   265     }
       
   266 
       
   267 // -----------------------------------------------------------------------------
       
   268 // CMceStateEstablished::EntryInUpdateL
       
   269 // -----------------------------------------------------------------------------
       
   270 //
       
   271 void CMceStateEstablished::EntryInUpdateL(TMceStateTransitionEvent& aEvent)
       
   272     {
       
   273     CMceSipSession& session = aEvent.Session();
       
   274     CSIPServerTransaction& request = session.Request();
       
   275     CSIPServerTransaction* requestPtr = &request;
       
   276     TBool isRefreshing = EFalse;
       
   277 
       
   278     session.Actions().CheckContactIsSecureL(request);
       
   279 
       
   280     if ( (requestPtr!=NULL) && !MceSip::HasContent(request) )
       
   281         {
       
   282         isRefreshing = ETrue;
       
   283         }
       
   284     else
       
   285         {
       
   286         // update extension information
       
   287         session.Extensions().UpdateL(session.Request() );
       
   288         // create SDP
       
   289         User::LeaveIfError(session.Actions().CreateSDP(session.Request() ) );
       
   290 
       
   291         if ( !session.DoesMediaManagerNeedToNegotiate( session.Offer() ) )
       
   292             {
       
   293             // SDP not changed
       
   294             isRefreshing = ETrue;
       
   295             }
       
   296         }
       
   297     
       
   298     if (isRefreshing)
       
   299         {
       
   300         //set substate to refreshing
       
   301         session.SetSubState(CMceSipSession::ERefreshing);
       
   302         //update timer data in body
       
   303         session.Actions().ProcessSessionTimerServerL(session.Request() );
       
   304 
       
   305         // Use previous offer
       
   306         session.SdpCleanup(session.Offer(), session.PrevOffer() );
       
   307 
       
   308         // encode
       
   309         session.Actions().EncodeL();
       
   310 
       
   311         //update FC in answer
       
   312         session.FCActions().UpdateFCAnswerL( *session.Offer() );
       
   313 
       
   314         //reset session timer if session is not refresher
       
   315         session.Actions().ResetSessionTimerL();
       
   316         session.Actions().SendAnswerL(session.Request() );
       
   317         
       
   318         session.Actions().StateChanged( KMceStateEstablished );
       
   319         session.Actions().ClientStateChangedL( CMceSession::EEstablished, session.Request() );  
       
   320         }
       
   321     else
       
   322         {
       
   323         // create body candidate
       
   324         session.Actions().CreateBodyCandidateL(CMceComSession::EInSession);
       
   325 
       
   326         TMceReturnStatus status = KErrNone;
       
   327 
       
   328         // decode 
       
   329         TMceSipWarningCode warning = session.Actions().DecodeL();
       
   330 
       
   331         if ( !warning)
       
   332             {
       
   333             status = session.Actions().Update();
       
   334             if (status == KErrNotSupported)
       
   335                 {
       
   336                 warning = KMceSipWarnSessionDescriptionParameterNotUnderstood;
       
   337                 }
       
   338             }
       
   339 
       
   340         aEvent.ParamStatus() = status;
       
   341 
       
   342         if (warning)
       
   343             {
       
   344             session.Actions().UpdateFailed();
       
   345             session.Actions().SendRejectOfferWithWarningL(warning, session.Request() );
       
   346             aEvent.ParamStatus() = warning;
       
   347             }
       
   348         else
       
   349             if ( MCE_IS_ERROR( status ))
       
   350                 {
       
   351                 session.Actions().UpdateFailed();
       
   352                 User::Leave(status);
       
   353                 }
       
   354             else
       
   355                 {
       
   356                 session.Actions().ClientUpdateSessionL(session.Request() );
       
   357                 }
       
   358         }
       
   359     }
       
   360 
       
   361 // -----------------------------------------------------------------------------
       
   362 // CMceStateEstablished::EntryInviteL
       
   363 // -----------------------------------------------------------------------------
       
   364 //
       
   365 void CMceStateEstablished::EntryInviteL( TMceStateTransitionEvent& aEvent )
       
   366     {
       
   367 	CMceSipSession& session = aEvent.Session();
       
   368 	CSIPServerTransaction& request = session.Request();
       
   369 	CSIPServerTransaction* requestPtr = &request;
       
   370 
       
   371     session.Actions().CheckContactIsSecureL( request );
       
   372      
       
   373 	if ( (requestPtr!=NULL) && !MceSip::HasContent( request ) )
       
   374         {
       
   375         // Pull Mode
       
   376         session.Extensions().UpdateL( request );
       
   377         if ( MCE_NEED_TO_SEND( session, session.Offer() ) ) // is session update
       
   378             {
       
   379             // create body candidate for Pull mode
       
   380             session.Actions().CreateBodyCandidateL( 
       
   381                 CMceComSession::EInSession );
       
   382             }
       
   383         session.Actions().ProcessSessionTimerServerL( session.Request() );
       
   384         session.Actions().ClientUpdateSessionL( request );	  
       
   385         }
       
   386 	else
       
   387 	    {
       
   388 	    // update extension information
       
   389 	    session.Extensions().UpdateL( session.Request() );
       
   390         // create SDP
       
   391         User::LeaveIfError( session.Actions().CreateSDP( session.Request() ) );
       
   392 
       
   393         if ( session.DoesMediaManagerNeedToNegotiate( session.Offer() ) )
       
   394             {
       
   395             // create body candidate
       
   396             session.Actions().CreateBodyCandidateL( CMceComSession::EInSession );
       
   397             
       
   398             TMceReturnStatus status = KErrNone;
       
   399             
       
   400             // decode 
       
   401             TMceSipWarningCode warning = session.Actions().DecodeL();
       
   402             
       
   403             if ( !warning )
       
   404                 {
       
   405                 status = session.Actions().Update();
       
   406                 if ( status == KErrNotSupported )
       
   407                     {
       
   408                     warning = KMceSipWarnSessionDescriptionParameterNotUnderstood;
       
   409                     }
       
   410                 }
       
   411             
       
   412             aEvent.ParamStatus() = status;
       
   413 
       
   414             if ( warning )
       
   415                 {
       
   416                 session.Actions().UpdateFailed();
       
   417                 session.Actions().SendRejectOfferWithWarningL( warning, 
       
   418                                                                session.Request() );
       
   419                 aEvent.ParamStatus() = warning;
       
   420                 }
       
   421             else if ( MCE_IS_ERROR( status ) )
       
   422                 {
       
   423                 session.Actions().UpdateFailed();
       
   424                 User::Leave( status );
       
   425                 }
       
   426             else
       
   427                 {
       
   428                 session.Actions().ClientUpdateSessionL( session.Request() );
       
   429                 }
       
   430             }
       
   431         else // SDP not changed
       
   432             {
       
   433             //set substate to refreshing
       
   434             session.SetSubState( CMceSipSession::ERefreshing );
       
   435             //update timer data in body
       
   436             session.Actions().ProcessSessionTimerServerL( session.Request() );
       
   437             
       
   438             // Use previous offer
       
   439             session.SdpCleanup( session.Offer(), session.PrevOffer() );
       
   440            
       
   441             // encode
       
   442             session.Actions().EncodeL();
       
   443             
       
   444             //update FC in answer
       
   445             session.FCActions().UpdateFCAnswerL( *session.Offer() );
       
   446             
       
   447             session.Actions().SendAnswerL( session.Request() );
       
   448             
       
   449             session.Actions().StateChanged( KMceStateAnswering );
       
   450             session.Actions().ClientStateChangedL( CMceSession::EAnswering,
       
   451                                                    session.Request() );
       
   452             }
       
   453 	    }
       
   454 	//reset session timer
       
   455 	session.Actions().ResetSessionTimerL();
       
   456     }
       
   457 
       
   458 // -----------------------------------------------------------------------------
       
   459 // CMceStateEstablished::EntryTerminateSessionL
       
   460 // -----------------------------------------------------------------------------
       
   461 //
       
   462 void CMceStateEstablished::EntryTerminateSessionL( 
       
   463                                             TMceStateTransitionEvent& aEvent )
       
   464     {
       
   465 	CMceSipSession& session = aEvent.Session();
       
   466 
       
   467     session.Actions().SendBYEL( aEvent.ParamClientMessage() );
       
   468     session.Actions().StopMedia();
       
   469     session.FCActions().ReleaseFC();
       
   470     }
       
   471 
       
   472 // -----------------------------------------------------------------------------
       
   473 // CMceStateEstablished::EntryByeL
       
   474 // -----------------------------------------------------------------------------
       
   475 //
       
   476 void CMceStateEstablished::EntryByeL( TMceStateTransitionEvent& aEvent )
       
   477     {
       
   478 	CMceSipSession& session = aEvent.Session();
       
   479 	
       
   480     //send 200OK and stop media and FC
       
   481     session.Actions().Send200OKL( session.Request() );
       
   482     session.Actions().StopMedia();
       
   483     session.FCActions().ReleaseFC();
       
   484     }
       
   485 
       
   486 // -----------------------------------------------------------------------------
       
   487 // CMceStateEstablished::EntryMediaL
       
   488 // -----------------------------------------------------------------------------
       
   489 //
       
   490 void CMceStateEstablished::EntryMediaL( TMceStateTransitionEvent& aEvent )
       
   491     {
       
   492 	CMceSipSession& session = aEvent.Session();
       
   493 
       
   494     session.Actions().ControlMediaL( aEvent.ParamIDs(), 
       
   495                                     (TMceItcFunctions)aEvent.Code() );
       
   496     }
       
   497     
       
   498     
       
   499     
       
   500 // -----------------------------------------------------------------------------
       
   501 // CMceStateEstablished::MediaErrorOccured
       
   502 // -----------------------------------------------------------------------------
       
   503 //
       
   504 void CMceStateEstablished::MediaErrorOccured( TMceStateTransitionEvent& aEvent )
       
   505 	{
       
   506 	MCESRV_DEBUG( "CMceStateEstablished::MediaErrorOccured, Entry" );                           	
       
   507 	CMceSipSession& session = aEvent.Session();
       
   508 	
       
   509 	// If ClientMediaStateChangedL leaves while trying to pause the RTP sink,
       
   510 	// just trap and log it.
       
   511 	TRAPD( err, session.Actions().ClientMediaStateChangedL( 
       
   512                            aEvent.ParamMccEvent(),
       
   513                            static_cast<TMceMediaEventCode>( aEvent.Code() ) ) );
       
   514 	
       
   515 	if ( err != KErrNone )
       
   516 		{
       
   517 		MCESRV_DEBUG_DVALUE( "ClientMediaStateChangedL leaves with error code", err );
       
   518 		}
       
   519 	
       
   520 	MCESRV_DEBUG( "CMceStateEstablished::MediaErrorOccured, Exit" );                           
       
   521 	}
       
   522 
       
   523 
       
   524 // -----------------------------------------------------------------------------
       
   525 // CMceStateEstablished::ExitL
       
   526 // -----------------------------------------------------------------------------
       
   527 //
       
   528 void CMceStateEstablished::ExitL( TMceStateTransitionEvent& aEvent )
       
   529 	{
       
   530 	
       
   531 	if ( IsExtensionRequestEvent( aEvent ))
       
   532 		{
       
   533 		//Do Nothing;
       
   534 		}
       
   535 
       
   536 	else 
       
   537 		{
       
   538 		CMceSipSession& session = aEvent.Session();
       
   539 		TInt status = aEvent.ParamStatus();
       
   540 
       
   541 	    switch ( aEvent.Code() )
       
   542 	        {
       
   543 	        //received BYE causes server & client to terminated state
       
   544 	        case EMceBye:
       
   545 	            {
       
   546 	            session.Actions().StateChanged( KMceStateTerminated );
       
   547 	            session.Actions().ClientStateChangedL( 
       
   548 	                CMceSession::ETerminated, session.Request() );
       
   549 	            break;
       
   550 	            }
       
   551 	        //client's session termination causes 
       
   552 	        //server & client to terminating state
       
   553 	        case EMceItcTerminateSession:
       
   554 	            {
       
   555 	            session.Actions().StateChanged( KMceStateTerminating );
       
   556 	            session.Actions().ClientStateChanged( 
       
   557 	                aEvent.ParamIDs(), CMceSession::ETerminating );
       
   558 	            break;
       
   559 	            }
       
   560 	        //timer expiration causes server & client to terminating state
       
   561 	        case EMceSessionExpired:
       
   562 	            {
       
   563 	            session.Actions().StateChanged( KMceStateTerminating );
       
   564 	            session.Actions().ClientStateChangedL( CMceSession::ETerminating );
       
   565 	            break;
       
   566 	            }
       
   567 	        //session refresh causes server & client to terminating state
       
   568 	        case EMceSessionRefresh:
       
   569 	            {
       
   570 	            session.Actions().StateChanged( KMceStateOffering );
       
   571 	            session.Actions().ClientStateChangedL( CMceSession::EOffering );
       
   572 	            break;
       
   573 	            }
       
   574 	        case EMceSessionPending:
       
   575 	            {
       
   576 	            session.Actions().StateChanged( KMceStateOffering );
       
   577 	            session.Actions().ClientStateChangedL( CMceSession::EOffering );
       
   578 	            break;
       
   579 	            }
       
   580 	       
       
   581 	        case EMceItcUpdate:
       
   582 	            {
       
   583 	            //client's update,if decoding has been failed 
       
   584 	            //or update is not deeded, does not affect 
       
   585 	            if ( MCE_IS_ERROR( status ) )
       
   586 	                {
       
   587 	                //Client will fetch original session with ITC
       
   588 	                session.Actions().StateChanged( KMceStateEstablished );
       
   589 	                session.Actions().ClientStateChanged( aEvent.ParamIDs(), 
       
   590 	                                                      CMceSession::EEstablished, 
       
   591 	                                                      status );
       
   592 	                }
       
   593 	            else if ( status == KMceAsync )
       
   594 	                {
       
   595 	                session.Actions().StateChanged( KMceStateClientEstablishing );
       
   596 	                session.Actions().ClientStateChanged( aEvent.ParamIDs(), 
       
   597 	                                                      CMceSession::EOffering );
       
   598 	                }
       
   599 	            else if ( status == KMceReady )
       
   600 	                {
       
   601 	                session.Actions().StateChanged( KMceStateEstablished );
       
   602 	                session.Actions().ClientStateChanged( 
       
   603 	                                                aEvent.ParamIDs(), 
       
   604 	                                                CMceSession::EEstablished );
       
   605 	                }
       
   606 	            else
       
   607 	                {
       
   608 	                // NOP
       
   609 	                }
       
   610 	            break;
       
   611 	            }
       
   612             case EMceUpdate:
       
   613                 {
       
   614                 if ( session.SubState() == CMceSipSession::ERefreshing )
       
   615                     {
       
   616                     session.Actions().StateChanged(KMceStateEstablished);
       
   617 
       
   618                     // If warning occurred, client is not informed
       
   619                     if ( MCE_IS_ERROR( status ))
       
   620                         {
       
   621                         session.Actions().ClientStateChangedL(CMceSession::EEstablished, status);
       
   622                         }
       
   623                     }
       
   624                 else
       
   625                     {
       
   626                     session.Actions().StateChanged( KMceStateServerEstablishing );
       
   627 	                }
       
   628 	            break;
       
   629 	            }
       
   630 	        case EMceInvite:
       
   631 	            {
       
   632 	            if ( status == KErrNone )
       
   633 	    	        {
       
   634 	                session.Actions().StateChanged( KMceStateServerEstablishing );
       
   635 	    	        }
       
   636 	            else
       
   637 	                {
       
   638 	                session.Actions().StateChanged( KMceStateEstablished );
       
   639 	                
       
   640 	                // If warning occurred, client is not informed
       
   641 	                if ( MCE_IS_ERROR( status ) )
       
   642 	                    {
       
   643 	                    session.Actions().ClientStateChangedL( 
       
   644 	                                    CMceSession::EEstablished, status );
       
   645 	                    }
       
   646 	                }
       
   647 	            break;
       
   648 	            }
       
   649 	        default:
       
   650 	            {
       
   651 	            }
       
   652 	        }
       
   653 		}
       
   654 	}
       
   655 
       
   656 // End of File