diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcestateupdating.cpp --- /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 +