diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/ConnectionMgr/src/TStateActiveResolving.cpp --- /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 ); + } + }