diff -r 000000000000 -r a4daefaec16c sipvoipprovider/svphold/src/svpholdinestablishingstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipvoipprovider/svphold/src/svpholdinestablishingstate.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,304 @@ +/* +* Copyright (c) 2006-2008 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: Incoming request establishing state for hold state machine. +* +*/ + + +#include "mcesession.h" +#include "mcemediastream.h" +#include "mceaudiostream.h" +#include "svpholdinestablishingstate.h" +#include "svpholdcontroller.h" +#include "svpholdattributehandler.h" +#include "svplogger.h" + + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::CSVPHoldInEstablishingState +// --------------------------------------------------------------------------- +// +CSVPHoldInEstablishingState::CSVPHoldInEstablishingState() + { + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::NewL +// --------------------------------------------------------------------------- +// +CSVPHoldInEstablishingState* CSVPHoldInEstablishingState::NewLC() + { + CSVPHoldInEstablishingState* self = + new ( ELeave ) CSVPHoldInEstablishingState; + + CleanupStack::PushL( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::~CSVPHoldInEstablishingState +// --------------------------------------------------------------------------- +// +CSVPHoldInEstablishingState::~CSVPHoldInEstablishingState() + { + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::DoApplyL +// --------------------------------------------------------------------------- +// +void CSVPHoldInEstablishingState::DoApplyL( CSVPHoldContext& aContext ) + { + SVPDEBUG1( "CSVPHoldInEstablishingState::DoApply" ); + + TSVPHoldStateIndex nextState = KSVPHoldEstablishingStateIndex; + + const RPointerArray< CMceMediaStream >& streams = + aContext.SessionObject()->Streams(); + + const TInt streamCount = streams.Count(); + + if ( !aContext.SpecialResponseHandling( nextState ) ) + { + for ( TInt i = 0; i < streamCount; i++ ) + { + CMceMediaStream* mediaStream = streams[ i ]; + if ( KMceAudio == mediaStream->Type() ) + { + // This media is audio stream. Handling depends on the request + switch ( aContext.HoldRequest() ) + { + case ESVPRemoteHold: + { + // From Connected state + HandleRemoteHolding( nextState ); + break; + } + + case ESVPRemoteResume: + { + // From In state + HandleRemoteResuming( nextState ); + break; + } + + case ESVPRemoteDoubleHold: + { + // From Out state + HandleRemoteHolding( nextState, + KSVPHoldDHStateIndex ); + break; + } + + case ESVPRemoteDoubleHoldResume: + { + // From Doublehold state + HandleRemoteResuming( nextState, + KSVPHoldOutStateIndex ); + break; + } + + case ESVPLocalHold: + case ESVPLocalResume: + case ESVPLocalDoubleHold: + case ESVPLocalDoubleHoldResume: + { + SVPDEBUG1( + "CSVPHoldInEstablishingState::DoApply\ + - Local action - State Error" ); + User::Leave( KErrSVPHoldStateError ); + break; + } + + default: + { + // Error in request solving + SVPDEBUG2( + "CSVPHoldInEstablishingState::DoApply - Error, request %i", + aContext.HoldRequest() ); + break; + } + } + } + } + } + + aContext.SetCurrentStateL( aContext, nextState ); + SVPDEBUG1( "CSVPHoldInEstablishingState::DoApply - Handled" ); + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::DoEnter +// --------------------------------------------------------------------------- +// +void CSVPHoldInEstablishingState::DoEnter( CSVPHoldContext& /*aContext*/ ) + { + // Nothing to do. + SVPDEBUG1( "CSVPHoldInEstablishingState::DoEnter" ); + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::IsOutEstablishingStateActive +// --------------------------------------------------------------------------- +// +TBool CSVPHoldInEstablishingState::IsOutEstablishingStateActive() + { + return EFalse; + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::HandleRemoteHoldingL +// --------------------------------------------------------------------------- +// +void CSVPHoldInEstablishingState:: +HandleRemoteHolding( TSVPHoldStateIndex& aNextState, + TSVPHoldStateIndex aState ) + { + SVPDEBUG1( + "CSVPHoldInEstablishingState::HandleRemoteHoldingL" ); + + if ( KSVPHoldDHStateIndex == aState ) + { + SVPDEBUG1( + "CSVPHoldOutEstablishingState::HandleLocalHoldingL\ + - Next KSVPHoldDHStateIndex" ); + aNextState = KSVPHoldDHStateIndex; + } + else + { + aNextState = KSVPHoldInStateIndex; + } + + SVPDEBUG1( + "CSVPHoldInEstablishingState::HandleRemoteHoldingL - Done" ); + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::HandleRemoteResumingL +// --------------------------------------------------------------------------- +// +void CSVPHoldInEstablishingState:: +HandleRemoteResuming( TSVPHoldStateIndex& aNextState, + TSVPHoldStateIndex aState ) + { + if ( KSVPHoldOutStateIndex == aState ) + { + SVPDEBUG1( + "CSVPHoldInEstablishingState::HandleRemoteResumingL KSVPHoldOutStateIndex" ) + + aNextState = KSVPHoldOutStateIndex; + } + else + { + SVPDEBUG1( + "CSVPHoldInEstablishingState::HandleRemoteResumingL KSVPHoldConnectedStateIndex" ) + + aNextState = KSVPHoldConnectedStateIndex; + } + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::CheckAttribute +// --------------------------------------------------------------------------- +// +TInt CSVPHoldInEstablishingState:: +CheckAttribute( MDesC8Array* aAttributeLines, + KSVPHoldAttributeIndex aNeededAttribute, + TSVPHoldStateIndex& aNextState, + CSVPHoldContext& aContext ) + { + // Checks direction attribute from request whether it is acceptable or not. + SVPDEBUG1( "CSVPHoldInEstablishingState::CheckAttribute" ); + + KSVPHoldAttributeIndex requestAttribute = + aContext.AttributeHandler().FindDirectionAttribute( aAttributeLines ); + + if ( aNeededAttribute == requestAttribute ) + { + return DefineDefaultCaseStateChange( aContext, aNextState ); + } + + else if ( KSVPHoldSendrecvIndex == aNeededAttribute && + KErrNotFound == requestAttribute ) + { + // If there is no direction attribute at all, default is sendrecv + SVPDEBUG1( + "CSVPHoldInEstablishingState::CheckAttributeL - No attribute" ); + aNextState = KSVPHoldConnectedStateIndex; + return KErrNone; + } + + else if ( KSVPHoldSendonlyIndex == aNeededAttribute && + KErrNotFound == requestAttribute ) + { + // no-op request received + SVPDEBUG1( + "CSVPHoldInEstablishingState::CheckAttributeL - No-op" ); + aNextState = KSVPHoldConnectedStateIndex; + return KErrNone; + } + + else + { + // Do not change the aNextState + SVPDEBUG1( + "CSVPHoldInEstablishingState::CheckAttributeL - else" ); + return KErrSVPHoldUnacceptableResponseAttribute; + } + } + +// --------------------------------------------------------------------------- +// CSVPHoldInEstablishingState::DefineDefaultCaseStateChange +// --------------------------------------------------------------------------- +// +TInt CSVPHoldInEstablishingState:: +DefineDefaultCaseStateChange( CSVPHoldContext& aContext, + TSVPHoldStateIndex& aNextState ) + { + switch ( aContext.HoldRequest() ) + { + case ESVPRemoteHold: + { + aNextState = KSVPHoldInStateIndex; + return KErrNone; + } + + case ESVPRemoteResume: + { + aNextState = KSVPHoldConnectedStateIndex; + return KErrNone; + } + + case ESVPRemoteDoubleHold: + { + aNextState = KSVPHoldDHStateIndex; + return KErrNone; + } + + case ESVPRemoteDoubleHoldResume: + { + aNextState = KSVPHoldOutStateIndex; + return KErrNone; + } + + default: + { + SVPDEBUG1( + "CSVPHoldInEstablishingState::CheckAttributeL - Default" ); + return KErrSVPHoldUnacceptableResponseAttribute; + } + } + } + +