diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcestateserverreserving.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcestateserverreserving.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,231 @@ +/* +* 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 "mcestateserverreserving.h" +#include "mcesipsession.h" +#include "mceactionset.h" +#include "mcefcactionset.h" +#include "mceclientserver.h" + + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::CMceStateServerReserving +// ----------------------------------------------------------------------------- +// +CMceStateServerReserving::CMceStateServerReserving () + : CMceState( KMceStateServerReserving ) + { + } + + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::~CMceStateServerReserving +// ----------------------------------------------------------------------------- +// +CMceStateServerReserving::~CMceStateServerReserving() + { + } + + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::DoAcceptL +// ----------------------------------------------------------------------------- +// +TBool CMceStateServerReserving::DoAcceptL( TMceStateTransitionEvent& aEvent ) + { + User::LeaveIfError( + aEvent.Code() == EMceUpdate || + aEvent.Code() == EMceMediaReserved || + aEvent.Code() == EMceItcEnable || + aEvent.Code() == EMceItcDisable || + IsExtensionRequestEvent( aEvent ) + + ? KErrNone : KErrTotalLossOfPrecision ); + + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::EntryL +// ----------------------------------------------------------------------------- +// +void CMceStateServerReserving::EntryL( TMceStateTransitionEvent& aEvent ) + { + + if ( IsExtensionRequestEvent( aEvent )) + { + HandleExtensionRequestEventL( aEvent ); + } + + else + { + switch ( aEvent.Code() ) + { + case EMceUpdate: + { + EntryUpdateL( aEvent ); + break; + } + case EMceMediaReserved: + { + EntryMediaReservedL( aEvent ); + break; + } + case EMceItcEnable: + case EMceItcDisable: + { + aEvent.Session().Actions().ControlMediaL( aEvent.ParamIDs(), + (TMceItcFunctions)aEvent.Code() ); + break; + } + default: + { + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::ExitL +// ----------------------------------------------------------------------------- +// +void CMceStateServerReserving::ExitL( TMceStateTransitionEvent& aEvent ) + { + + if ( IsExtensionRequestEvent( aEvent )) + { + //Do Nothing; + } + + else + { + CMceSipSession& session = aEvent.Session(); + TInt status = aEvent.ParamStatus(); + switch ( aEvent.Code() ) + { + case EMceUpdate: + { + if ( MCE_IS_ERROR( status ) ) + { + session.Actions().StateChanged( KMceStateTerminated ); + session.Actions().ClientStateChangedL( CMceSession::ETerminated ); + } + else if ( status == KMceAsync ) + { + // go to confirmation required state to wait + // update to complete. New reservation needed after that. + session.Actions().StateChanged( + KMceStateConfirmationRequired ); + } + else // KMceReady + { + // NOP + } + break; + } + case EMceMediaReserved: + { + // other state changes are handled in entry + session.Actions().StateChanged( KMceStateConfirmationRequired ); + break; + } + default: + { + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::EntryUpdateL +// ----------------------------------------------------------------------------- +// +void CMceStateServerReserving::EntryUpdateL( + TMceStateTransitionEvent& aEvent ) + { + CMceSipSession& session = aEvent.Session(); + TMceSipWarningCode warning = KErrNone; + + warning = session.Actions().DecodeL(); + aEvent.ParamStatus() = !warning ? KErrNone : KErrAbort; + if ( !warning ) + { + TMceReturnStatus status = session.Actions().UpdateL(); + aEvent.ParamStatus() = status; + } + + if ( MCE_IS_ERROR( aEvent.ParamStatus() ) ) + { + if ( warning ) //if error, reject offer (4XX out) + { + session.Actions().SendRejectOfferWithWarningL( warning, session.Request() ); + } + else + { + MceSip::DiscardRequest( session.Request() ); + } + + //reject also invite + session.DiscardInvite(); + } + } + +// ----------------------------------------------------------------------------- +// CMceStateServerReserving::EntryMediaReservedL +// ----------------------------------------------------------------------------- +// +void CMceStateServerReserving::EntryMediaReservedL( + TMceStateTransitionEvent& aEvent ) + { + CMceSipSession& session = aEvent.Session(); + if ( MCE_NEED_TO_RECEIVE( session ) ) + { + // find out, is the UPDATE received yet + CSIPServerTransaction* update = NULL; + RStringF trx = session.Request().Type(); + if ( trx == SIPStrings::StringF( SipStrConsts::EUpdate ) ) + { + update = &session.Request(); + } + + if ( update ) + { + session.Actions().EncodeL(); + session.FCActions().UpdateFCAnswerL( *session.Offer() ); + session.Actions().SendAnswerL( *update ); + session.Actions().StateChanged( KMceStateUpdated ); + session.Actions().ClientStateChangedL( CMceSession::EProceeding, + *session.Body(), + KErrNone ); + } + } + else + { + session.Actions().StateChanged( KMceStateUpdated ); + session.Actions().ClientStateChangedL( CMceSession::EProceeding, + *session.Body(), + KErrNone ); + } + } + +// End of file