--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CStateModel.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,180 @@
+// 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 : CStateModel.cpp
+// Part of : ConnectionMgr
+// Implementation
+// Version : SIP/4.0
+//
+
+
+
+#include "CStateModel.h"
+#include "TStateInit.h"
+#include "TStateInactiveMonitoring.h"
+#include "TStateInactiveConnecting.h"
+#include "TStateActiveResolving.h"
+#include "TStateActiveResolved.h"
+#include "TStateSuspended.h"
+#include "TStateUnavailable.h"
+#include "msipconnectioncontext.h"
+#include "SipLogs.h"
+
+// ----------------------------------------------------------------------------
+// CStateModel::NewL
+// ----------------------------------------------------------------------------
+//
+CStateModel* CStateModel::NewL( MSIPConnectionContext& aContext,
+ MTimerManager& aTimer )
+ {
+ CStateModel* self = new( ELeave ) CStateModel( aContext, aTimer );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::~CStateModel
+// ----------------------------------------------------------------------------
+//
+CStateModel::~CStateModel()
+ {
+ // Lets not call State() if we are not initialized properly
+ if( iStates.Count() == EMaxStates )
+ {
+ State().Exit();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::SendL
+// ----------------------------------------------------------------------------
+//
+void CStateModel::SendL( const TSIPTransportParams& aParams,
+ CSIPRequest& aRequest,
+ TBool aForceUDP,
+ const CUri8* aOutboundProxy,
+ const TInetAddr& aRemoteAddr,
+ TRequestStatus& aStatus )
+ {
+ State().SendL(
+ aParams, aRequest, aForceUDP, aOutboundProxy, aRemoteAddr, aStatus );
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::SendL
+// ----------------------------------------------------------------------------
+//
+void CStateModel::SendL( const TSIPTransportParams& aParams,
+ CSIPResponse& aResponse,
+ TTransactionId aId,
+ TRequestStatus& aStatus )
+ {
+ State().SendL( aParams, aResponse, aId, aStatus );
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::StateValue
+// ----------------------------------------------------------------------------
+//
+MStateModel::TState CStateModel::StateValue() const
+ {
+ return iStateValue;
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::EnterState
+// ----------------------------------------------------------------------------
+//
+void CStateModel::EnterState( MStateModel::TState aState, TInt aError )
+ {
+ __SIP_INT_LOG2( "CStateModel::EnterState(state,error)", aState, aError )
+
+ // Exit the old state
+ State().Exit();
+
+ // Select next state, notify context
+ iStateValue = aState;
+ iContext.StateModelChanged( aState );
+
+ // Enter the next state
+ State().Enter( aError );
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::NetworkStateChanged
+// ----------------------------------------------------------------------------
+//
+void CStateModel::NetworkStateChanged(
+ MSIPNetworkObserver::TNetworkState aState,
+ TInt aError )
+ {
+ __SIP_INT_LOG2( "CStateModel::NetworkStateChanged(state,error)",
+ aState, aError )
+ iError = aError;
+ State().NetworkStateChanged( aState, aError );
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::State
+// ----------------------------------------------------------------------------
+//
+TStateBase& CStateModel::State() const
+ {
+ return const_cast< TStateBase& >( iStates.At( iStateValue ) );
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::Error
+// ----------------------------------------------------------------------------
+//
+TInt CStateModel::Error() const
+ {
+ return iError;
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::CStateModel
+// ----------------------------------------------------------------------------
+//
+CStateModel::CStateModel( MSIPConnectionContext& aContext,
+ MTimerManager& aTimer )
+ : iContext( aContext ), iTimer( aTimer ), iStates( EMaxStates ),
+ iStateValue( MStateModel::EUnavailable ),iError(KErrNone)
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CStateModel::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CStateModel::ConstructL()
+ {
+ iStates.AppendL( TStateInit( *this, iContext ),
+ sizeof( TStateInit ) );
+ iStates.AppendL( TStateInactiveMonitoring( *this, iContext,iTimer ),
+ sizeof( TStateInactiveMonitoring ) );
+ iStates.AppendL( TStateInactiveConnecting( *this, iContext, iTimer ),
+ sizeof( TStateInactiveConnecting ) );
+ iStates.AppendL( TStateActiveResolving( *this, iContext, iTimer ),
+ sizeof( TStateActiveResolving ) );
+ iStates.AppendL( TStateActiveResolved( *this, iContext ),
+ sizeof( TStateActiveResolved ) );
+ iStates.AppendL( TStateSuspended( *this, iContext ),
+ sizeof( TStateSuspended ) );
+ iStates.AppendL( TStateUnavailable( *this, iContext ),
+ sizeof( TStateUnavailable ) );
+ }