multimediacommsengine/mmcesrv/mmceserver/src/mcestateidle.cpp
changeset 0 1bce908db942
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 "mcestateidle.h"
       
    22 #include "mcesipsession.h"
       
    23 #include "mceactionset.h"
       
    24 #include "mcefcactionset.h"
       
    25 
       
    26 // -----------------------------------------------------------------------------
       
    27 // CMceStateIdle::CMceStateIdle
       
    28 // -----------------------------------------------------------------------------
       
    29 //
       
    30 CMceStateIdle::CMceStateIdle ()
       
    31     : CMceState( KMceStateIdle )
       
    32 	{
       
    33 	}
       
    34 
       
    35 // -----------------------------------------------------------------------------
       
    36 // CMceStateIdle::~CMceStateIdle
       
    37 // -----------------------------------------------------------------------------
       
    38 //
       
    39 CMceStateIdle::~CMceStateIdle()
       
    40 	{
       
    41 	}
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 // CMceStateIdle::DoAcceptL
       
    45 // -----------------------------------------------------------------------------
       
    46 //
       
    47 TBool CMceStateIdle::DoAcceptL( TMceStateTransitionEvent& aEvent )
       
    48 	{
       
    49     //not accepted	
       
    50 	User::LeaveIfError( aEvent.EventSource() == EMceMedia ? 
       
    51                         KErrTotalLossOfPrecision :
       
    52                         KErrNone );
       
    53                         
       
    54     //accepted
       
    55     User::LeaveIfError(
       
    56        aEvent.EventSource() == EMceSip && aEvent.Code() == EMceInvite ? KErrNone :
       
    57        aEvent.EventSource() == EMceClient && aEvent.Code() == EMceItcEstablishSession ? KErrNone :
       
    58        KErrTotalLossOfPrecision );
       
    59     
       
    60 	return ETrue;
       
    61 	}
       
    62 
       
    63 // -----------------------------------------------------------------------------
       
    64 // CMceStateIdle::EntryL
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 void CMceStateIdle::EntryL( TMceStateTransitionEvent& aEvent )
       
    68 	{
       
    69 	switch( aEvent.Code() )
       
    70 	    {
       
    71 	    case EMceItcEstablishSession://going to send INVITE out
       
    72 	        {
       
    73 	        EntryEstablishL( aEvent );
       
    74             break;
       
    75 	        }
       
    76 	    case EMceInvite: //INVITE in
       
    77 	        {
       
    78 	        EntryInviteL( aEvent );
       
    79 	        break;
       
    80 	        }
       
    81         default:
       
    82             {
       
    83             //NOP
       
    84             break;
       
    85             }
       
    86 	    }
       
    87 	}
       
    88 
       
    89 // -----------------------------------------------------------------------------
       
    90 // CMceStateIdle::ExitL
       
    91 // -----------------------------------------------------------------------------
       
    92 //
       
    93 void CMceStateIdle::ExitL( TMceStateTransitionEvent& aEvent )
       
    94 	{
       
    95 	CMceSipSession& session = aEvent.Session();
       
    96 	TInt status = aEvent.ParamStatus();
       
    97 	
       
    98 	switch( aEvent.Code() )
       
    99 	    {
       
   100 	    case EMceItcEstablishSession:
       
   101 	        {
       
   102             //server state -> client establishing, client state -> offering
       
   103             session.Actions().ClientStateChanged( aEvent.ParamIDs(),
       
   104             									  CMceSession::EOffering );
       
   105 	        if ( status == KMceAsync )
       
   106 	            {
       
   107                 session.Actions().StateChanged( KMceStateClientEstablishing );
       
   108 	            }
       
   109             else
       
   110                 {
       
   111                 session.Actions().StateChanged( KMceStateOffering );
       
   112 	            }
       
   113 	        break;
       
   114 	        }
       
   115 	    case EMceInvite:
       
   116 	        {
       
   117 			if ( status == KErrNone || status == KMceAsync )
       
   118 				{
       
   119 				if ( ( session.NatSession() && !session.IsNatDisabled() ) &&
       
   120 						( &aEvent.Session().Request()) && 		
       
   121 						MceSip::HasContent( aEvent.Session().Request() ))
       
   122 					{
       
   123 					// Whether synchronous or asynchronous, wait NAT plugin to
       
   124 					// get initialized
       
   125 					session.Actions().StateChanged( KMceStateServerInitializing );
       
   126 					}
       
   127 				else
       
   128 					{
       
   129 					session.Actions().StateChanged( KMceStateServerEstablishing );	
       
   130 					}
       
   131                 }
       
   132             else // if error, server state -> terminated
       
   133                 {
       
   134                 session.Actions().StateChanged( KMceStateTerminated );
       
   135                 }
       
   136 	        break;
       
   137 	        }
       
   138         default:
       
   139             {
       
   140             //NOP
       
   141             break;
       
   142             }
       
   143 	    }
       
   144 	}
       
   145 
       
   146 // -----------------------------------------------------------------------------
       
   147 // CMceStateIdle::EntryEstablishL
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 void CMceStateIdle::EntryEstablishL( TMceStateTransitionEvent& aEvent )
       
   151     {
       
   152     //update session body based on session received from client
       
   153     //and start waiting EMceMceMediaUpdated
       
   154     CMceSipSession& session = aEvent.Session();
       
   155     TInt status = KErrNone;
       
   156 
       
   157     session.Actions().UpdateBodyL( aEvent.ParamIDs(),
       
   158                                    aEvent.ParamClientMessage() );
       
   159     status = session.Actions().UpdateL();                                           
       
   160 
       
   161     if ( status == KMceReady )
       
   162         {
       
   163         session.Actions().EncodeL();
       
   164         session.FCActions().UpdateFCOfferL( *session.Offer() );
       
   165         session.Actions().SendInviteL();
       
   166         }  
       
   167     aEvent.ParamStatus() = status;  
       
   168     }
       
   169 
       
   170 // -----------------------------------------------------------------------------
       
   171 // CMceStateIdle::EntryInviteL
       
   172 // -----------------------------------------------------------------------------
       
   173 //    
       
   174 void CMceStateIdle::EntryInviteL( TMceStateTransitionEvent& aEvent )
       
   175     {
       
   176     // Handle incoming INVITE
       
   177     CMceSipSession& session = aEvent.Session();
       
   178     TInt status = KErrNone;
       
   179     session.Extensions().UpdateL( session.Request() );
       
   180     session.Actions().CheckContactIsSecureL( session.Request() );
       
   181     
       
   182     // Pull mode situation
       
   183     if ( &session.Request() && !MceSip::HasContent( session.Request() ) )
       
   184         {
       
   185         session.Actions().ProcessSessionTimerServerL( session.Request() );
       
   186         session.Actions().ClientUpdateIncomingSessionL( session.Request() );
       
   187 	    }
       
   188 	else
       
   189 	    {
       
   190 	    //create SDP
       
   191         status = session.Actions().CreateSDP( session.Request() );
       
   192         if ( MCE_IS_ERROR( status ) )
       
   193             {
       
   194             if ( MceSip::IsSIPStackError( status ) )
       
   195                 {
       
   196                 MceSip::DiscardRequest( session.Request(), status );
       
   197                 }
       
   198             else
       
   199                 {
       
   200                 User::Leave( status );
       
   201                 }
       
   202             }
       
   203         else
       
   204             {
       
   205             //session timer
       
   206             session.Actions().ProcessSessionTimerServerL( session.Request() );
       
   207         
       
   208             //decode received SDP offer
       
   209             //and start waiting EMceItcUpdate, if everything OK
       
   210             TMceSipWarningCode warning = session.Actions().DecodeL();
       
   211 
       
   212             if ( !warning )
       
   213                 {
       
   214                 status = session.Actions().Update();
       
   215                 if ( status == KErrNotSupported )
       
   216                     {
       
   217                     warning = KMceSipWarnSessionDescriptionParameterNotUnderstood;
       
   218                     }
       
   219                 }
       
   220                 
       
   221             if ( warning ) //if error, reject offer (4XX out)
       
   222                 {
       
   223                 session.Actions().SendRejectOfferWithWarningL( warning, session.Request() );
       
   224                 status = KErrAbort;
       
   225                 }
       
   226             else
       
   227                 {
       
   228                 //if OK show SDP to FC and send session, created based on SDP
       
   229                 //to client for updating
       
   230                 User::LeaveIfError( status );
       
   231 
       
   232 				if ( !session.NatSession() || session.IsNatDisabled() )
       
   233 					{
       
   234 					session.ContinueHandlingIncomingSessionL();
       
   235 					}
       
   236                 }
       
   237             }
       
   238 	    }
       
   239 	aEvent.ParamStatus() = status;
       
   240     }
       
   241 
       
   242 // End Of File