realtimenetprots/sipfw/SIP/ConnectionMgr/src/TStateActiveResolving.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/TStateActiveResolving.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,179 @@
+// Copyright (c) 2004-2009 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:
+// Name        : TStateActiveResolving.cpp
+// Part of     : ConnectionMgr
+// Implementation
+// Version     : SIP/4.0
+//
+
+
+
+#include "TStateActiveResolving.h"
+#include "msipconnectioncontext.h"
+#include "SipLogs.h"
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::Enter
+// ----------------------------------------------------------------------------
+//
+void TStateActiveResolving::Enter( TInt /*aError*/ )
+	{
+	__SIP_LOG( "TStateActiveResolving::Enter" )
+	iTimerValue = KInitialResolvingTimer;
+	iCumulativeTimerValue = KInitialResolvingTimer;
+	TInt err( KErrNone );
+
+    // Pass KErrNone for StartMonitoringL at this stage
+    // since error is needed only for context availability
+    // monitoring which is at this point unnecessary
+	if ( !iContext.DoTransportResourcesExist() )
+	    {
+	    TRAP( err,
+    		{
+    		iContext.CreateTransportResourcesL();
+    		iContext.StartMonitoringL( KErrNone );
+    		} );
+    	if ( err )
+    		{
+    		EnterState( MStateModel::EUnavailable, err );
+    		return;
+    		}
+	    }
+
+	if ( HasAddress() )
+		{
+		// Address has to exist, otherwise resolving hasn't been done at this
+		// point and we cannot enter to resolved state
+		EnterActiveResolvedState();
+		}
+	else
+		{		
+		TRAP( err, iTimerId = iTimer.StartL( this, KInitialResolvingTimer ) );
+		if( err )
+			{
+			EnterState( MStateModel::EUnavailable, err );
+			}
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::Exit
+// ----------------------------------------------------------------------------
+//
+void TStateActiveResolving::Exit()
+
+	{
+	iTimer.Stop( iTimerId );
+	}
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::NetworkStateChanged
+// ----------------------------------------------------------------------------
+//
+void TStateActiveResolving::NetworkStateChanged(
+    MSIPNetworkObserver::TNetworkState aState,
+    TInt aError )
+	{
+	  __SIP_INT_LOG2( "TStateActiveResolving::NetworkStateChanged", aState, aError )
+	if( aError)
+		{
+		if (iContext.ConnectionType()==MSIPConnectionContext::ELanBearer)
+		{
+		EnterState( MStateModel::EInactiveMonitoring, aError ); // For Any Error on WLAN, Enable Recovery Timers.
+		}
+		else
+		{
+		EnterState( MStateModel::EUnavailable, aError ); //For other bearers No recovery possible.
+		}
+		return;
+		}
+	if( aState == MSIPNetworkObserver::ENetworkSuspended )
+		{
+		EnterState( MStateModel::ESuspended );
+		}
+	else if( aState == MSIPNetworkObserver::ENetworkInactive )
+		{
+		EnterState( MStateModel::EInactiveMonitoring );
+		}
+	else if( aState == MSIPNetworkObserver::EConnectionLost )
+		{
+		EnterState( MStateModel::EInactiveConnecting );
+		}		
+	else
+		{
+		// do nothing, "else" required by PC-Lint..
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::TimerExpiredL
+// ----------------------------------------------------------------------------
+//
+void TStateActiveResolving::TimerExpiredL( TTimerId /*aTimerId*/,
+								 		   TAny* /*aTimerParam*/ )
+	{
+    if( HasAddress() )
+        {
+        EnterActiveResolvedState();
+        }
+    else
+	    {
+		iTimerId = iTimer.StartL( this, CalculateTimerValue() );
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::HasAddress
+// ----------------------------------------------------------------------------
+//
+TBool TStateActiveResolving::HasAddress()
+	{
+	TInetAddr address;
+	iContext.ResolveLocalAddress( address );
+	return ( !address.IsWildAddr() );
+	}
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::CalculateTimerValue
+// ----------------------------------------------------------------------------
+//
+TUint TStateActiveResolving::CalculateTimerValue()
+    {
+    if ( iCumulativeTimerValue >= KStartDoublingTimerValue )
+        {
+        if ( iTimerValue < KMaximumResolvingTimer )
+            {
+            iTimerValue *= 2;
+            }
+        }
+    iCumulativeTimerValue += iTimerValue;    
+    return iTimerValue;
+    }
+
+// ----------------------------------------------------------------------------
+// TStateActiveResolving::EnterActiveResolvedState
+// ----------------------------------------------------------------------------
+//
+void TStateActiveResolving::EnterActiveResolvedState()
+    {
+    TRAPD( err, iContext.CreateDefaultTransportsL() )
+    if ( err )
+        {
+        EnterState( MStateModel::EUnavailable, err );
+        }
+    else
+        {
+        EnterState( MStateModel::EActiveResolved );
+        }
+    }