sipvoipprovider/svphold/src/svpholdinestablishingstate.cpp
changeset 0 a4daefaec16c
--- /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;
+            }
+        }
+    }
+
+