--- /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 );
+ }
+ }