telephonyprotocols/csdagt/src/Nd_dlupStates.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyprotocols/csdagt/src/Nd_dlupStates.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1262 @@
+// Copyright (c) 2003-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:
+// Dial Up States
+// 
+//
+
+/**
+ @file Nd_dlupstates.cpp 
+*/
+
+
+#include "Nd_dlupStates.h"
+#include "SLOGGER.H"
+#include <comms-infras/eventlogger.h>
+#include <csdprog.h>
+#include "ND_DBACC.H"
+
+
+CDlUpInit* CDlUpInit::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Init State
+
+2 phased constructor for CDlUpInit, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpInit object.
+*/
+	{
+	CDlUpInit* r=new(ELeave) CDlUpInit(aSMObserver, aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpInit::CDlUpInit(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CAgentStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpInit, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpInit::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{}
+
+CDlUpInit::~CDlUpInit()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpInit::StartState()
+/**
+Starts dialup init state.
+If connection is reconnect and used script is not NULL, delete script.
+Call JumpToRunl() with KErrNone.
+*/
+	{
+	if (((iNdEnv->BaseEnv())->IsReconnect()) && (iNdEnv->Script()!=NULL))
+			{
+			iNdEnv->DeleteScript();
+			}
+	JumpToRunl(KErrNone);
+	}
+
+CAgentStateBase* CDlUpInit::NextStateL(TBool aContinue)
+/**
+Changes to from init state to next state.
+If connection is not continued, create disconnect state.
+Else create dialling state.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpDisconnect or CDlUpDialling object.
+*/
+	{
+	if(!aContinue)
+		{
+		return CDlUpDisconnect::NewL(*iSMObserver,*iNdEnv);
+		}
+	else
+		{
+		return CDlUpDialling::NewL(*iSMObserver,*iNdEnv);
+		}
+	}
+
+void CDlUpInit::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	}
+
+void CDlUpInit::RunL()
+/**
+Dial up init completed.
+Call CompleteState() with KErrNone.
+*/
+	{
+	__ASSERT_DEBUG(iStatus==KErrNone, User::Invariant());
+	(iNdEnv->BaseEnv())->CompleteState(KErrNone);
+	}
+
+CDlUpDialling* CDlUpDialling::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Dialling State
+
+2 phased constructor for CDlUpDialling, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpDialling object.
+*/
+	{
+	CDlUpDialling* r=new(ELeave) CDlUpDialling(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpDialling::CDlUpDialling(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CAgentStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpDialling, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpDialling::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{}
+
+CDlUpDialling::~CDlUpDialling()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpDialling::StartState()
+/**
+Starts dialup dialling state.
+Call UpdateProgress() with EStartingDialling and KErrNone.
+If reconnect, trap and start reconnect by calling StartReconnectL() from ETel server processor.
+Else trap and start dial up by calling StartDialUpL() from ETel server processor.
+If trap error, call JumpToRunl() with the trap error and return.
+Else set state active.
+*/
+	{
+	TInt err=KErrNone;
+	iSMObserver->UpdateProgress(ECsdStartingDialling,KErrNone);
+	// Either start reconnection or dial up
+	if ((iNdEnv->BaseEnv())->IsReconnect())
+		{
+		TRAP(err,(iNdEnv->TelServPrc())->StartReconnectL(*this));
+		}	
+	else
+		{
+		TRAP(err,(iNdEnv->TelServPrc())->StartDialUpL(*this));
+		}
+	// JumpToRunl with leave error if ETel server processor calls leave.
+	if(err!=KErrNone)
+		{
+		JumpToRunl(err);
+		return;
+		}
+	// Else continue connection, set state active and wait for completition.
+	else
+		{
+		iStatus=KRequestPending;
+		SetActive();
+		}
+	}
+
+CAgentStateBase* CDlUpDialling::NextStateL(TBool aContinue)
+/**
+Changes to from dialling state to next state.
+If connection is not continued or iStatus is not KErrNone, create Disconnect state.
+Else create Open Data Port (BCA), Scan Script (non-BCA) state.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpDisconnect or CDlUpOpenDataPort (BCA) / CDlUpScanScript (non-BCA) object.
+*/
+	{ 
+	if((!aContinue)||(iStatus!=KErrNone))
+		{
+		return CDlUpDisconnect::NewL(*iSMObserver,*iNdEnv);
+		}
+	else
+		{
+#ifdef SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT
+		if (iNdEnv->UseScript())
+			{			
+		return CDlUpOpenDataPort::NewL(*iSMObserver, *iNdEnv);
+			}
+		else
+			{
+			return CDlUpOpen::NewL(*iSMObserver,*iNdEnv);
+			}			
+#else
+		return CDlUpOpenDataPort::NewL(*iSMObserver, *iNdEnv);
+
+#endif
+		}
+	}
+
+void CDlUpDialling::TelFunctionComplete(TInt aError)
+	{
+	TRequestStatus* status=&iStatus;
+	User::RequestComplete(status,aError);
+	}
+
+void CDlUpDialling::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	// if a log event creation is ongoing, we want to let it go and the log event should reflect the reality
+	// a call has been made and custumer will be charged for it
+	//iNdEnv->Logger()->Cancel();
+	if((iNdEnv->TelServPrc())!=NULL)
+		(iNdEnv->TelServPrc())->Cancel();
+	if (iStatus == KRequestPending)
+		{
+		TelFunctionComplete(KErrCancel);
+		}
+	}
+
+void CDlUpDialling::RunL()
+/**
+Dialling completed (should not complete if connection cancelled).
+If there is an error then signal it by calling ConnectionComplete() with EFinishedDialling and iStatus.Int().
+Call UpdateProgress() with ECsdFinishedDialling and KErrNone.
+Call PreventConnectionRetries() to stop new connections.
+Call CompleteState() with KErrNone.
+Dialling is always asynchronous, so should not complete if cancelled.
+*/
+	{
+	if(iStatus!=KErrNone)
+		{
+		__FLOG_STMT(_LIT(logString3,"Dialling");)
+		__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KCompletedPhaseLogString()), &logString3() ,iStatus.Int());
+		if (iNdEnv->Script()!=NULL)
+			iNdEnv->Script()->CloseScript();
+		iSMObserver->ConnectionComplete(ECsdFinishedDialling,iStatus.Int());
+		return;
+		}
+	iSMObserver->UpdateProgress(ECsdFinishedDialling,KErrNone);
+	iSMObserver->PreventConnectionRetries();
+	// request asynch creation of logevent and go to next state
+	TBuf<KCommsDbSvrMaxFieldLength> remoteParty;
+	(iNdEnv->NetDialDb())->GetRemoteParty(remoteParty);
+	TDialString telNum;
+	TRAPD(ret, (iNdEnv->NetDialDb())->DoDiallingResolutionL(telNum,EForDisplay));
+#ifdef SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT	
+	iNdEnv->GetUseScriptL();
+	if (!iNdEnv->UseScript())
+		{
+		// We need to do this stuff now because it will not be done later in the login script setup
+		RCall::TCommPort commPort;
+		iNdEnv->TelServPrc()->GetCommPortL(commPort); //This updates Nifman's record and is needed by ppp
+ 		iSMObserver->ServiceStarted();
+		}
+#endif // SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT		
+	// JumpToRunl if error
+	if(ret==KErrNone)
+		{
+		// no logging if problem in finding telephone number
+		iNdEnv->Logger()->LogDataAddEvent(R_LOG_CON_CONNECTED, remoteParty,R_LOG_DIR_OUT,telNum,KLogDataEventTypeUid);
+		}
+	// go to next state without waiting for logevent creation being completed.
+	(iNdEnv->BaseEnv())->CompleteState(KErrNone);
+	}
+TInt CDlUpDialling::RunError(TInt aError)
+/**
+	Handles errors
+*/
+	{
+	iSMObserver->ConnectionComplete(ECsdScannedScript,aError);
+	return KErrNone;
+	}
+
+CDlUpScanScript* CDlUpScanScript::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Scan Script State
+
+2 phased constructor for CDlUpScanScript, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpScanScript object.
+*/
+	{
+	CDlUpScanScript* r=new(ELeave) CDlUpScanScript(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpScanScript::CDlUpScanScript(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CAgentStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpDialling, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpScanScript::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{}
+
+CDlUpScanScript::~CDlUpScanScript()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpScanScript::StartState()
+/**
+Starts Dialup Scan Script state, scans "login" script for READ command.
+Call UpdateProgress() with ECsdScanningScript and KErrNone.
+Setup script by calling SetUpScriptL().
+If SetUpScriptL leaves, call JumpToRunl() with leave error.
+If script is used, start scannin script and set state active.
+Else call JumpToRunl() with KErrNone.
+*/
+	{
+	if (iNdEnv->UseScript())
+		{
+		(iNdEnv->Script())->Scan(*this);
+		iStatus=KRequestPending;
+		SetActive();
+		}
+	else
+		{
+		JumpToRunl(KErrNone);
+		}
+	}
+
+CAgentStateBase* CDlUpScanScript::NextStateL(TBool aContinue)
+/**
+Changes to from Scan Script state to next state.
+If connection is not continued or iStatus is not KErrNone, create Close Data Port (BCA) / Hangup (non-BCA) state.
+Else create get login info state.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpCloseDataPort (BCA) / CDlUpHangUp (non-BCA) or CDlUpGetLoginInfo object.
+*/
+	{ 
+	if((!aContinue)||(iStatus!=KErrNone))
+		{
+		return CDlUpCloseDataPort::NewL(*iSMObserver,*iNdEnv, iStatus.Int());
+		}
+	else
+		{
+		return CDlUpGetLoginInfo::NewL(*iSMObserver,*iNdEnv);
+		}
+	}
+
+void CDlUpScanScript::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	if (iNdEnv->Script()!=NULL)
+		{
+		(iNdEnv->Script())->Cancel();
+		}
+	if (iStatus == KRequestPending)
+		{
+		ScriptFunctionComplete(KErrCancel);
+		}
+	}
+
+void CDlUpScanScript::RunL()
+/**
+Scan completed  (should not complete if connection cancelled).
+If there is an error then signal it by calling ConnectionComplete() with EScannedScript and iStatus.Int().
+Call UpdateProgress() with ECsdScannedScript and KErrNone.
+Call CompleteState() with KErrNone.
+*/
+	{
+	if(iStatus!=KErrNone)
+		{
+		__FLOG_STMT(_LIT(logString3,"Scan Script");)
+		__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KCompletedPhaseLogString()), &logString3(), iStatus.Int());
+		if (iNdEnv->Script()!=NULL)
+			iNdEnv->Script()->CloseScript();
+		iSMObserver->ConnectionComplete(ECsdScannedScript,iStatus.Int());
+		return;
+		}
+	iSMObserver->UpdateProgress(ECsdScannedScript,KErrNone);
+	(iNdEnv->BaseEnv())->CompleteState(KErrNone);
+	}
+
+void CDlUpScanScript::ScriptFunctionComplete(TInt aError)
+	{
+	TRequestStatus* status=&iStatus;
+	User::RequestComplete(status,aError);
+	}
+
+CDlUpGetLoginInfo* CDlUpGetLoginInfo::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Get Login Info State
+
+2 phased constructor for CDlUpGetLoginInfo, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpGetLoginInfo object.
+*/
+	{
+	CDlUpGetLoginInfo* r=new(ELeave) CDlUpGetLoginInfo(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpGetLoginInfo::CDlUpGetLoginInfo(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CGetLoginInfo(aSMObserver,aNdEnv)
+/**
+Private constructor for CDlUpGetLoginInfo, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpGetLoginInfo::ConstructL()
+/**
+Instantiate Member variable.
+*/
+	{}
+
+CDlUpGetLoginInfo::~CDlUpGetLoginInfo()
+/**
+Destructor.
+
+Cancel active request.
+*/
+	{
+	}
+
+CAgentStateBase* CDlUpGetLoginInfo::NextStateL(TBool aContinue)
+/**
+Changes to from get login info state to next state.
+
+If connection is not continued or iStatus is not KErrNone, create Hangup state.
+Else create login state.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpCloseDataPort (BCA) / CDlUpHangUp (non-BCA) or CDlUpLogin object.
+*/
+	{ 
+	if((!aContinue)||(iStatus!=KErrNone))
+		{
+		__FLOG_STMT(_LIT(logString,"NetDial:\tGetLoginInfo state cancelling (aContinue %d, iStatus %d)");)
+		__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString()), aContinue, iStatus.Int());
+
+		TInt err = iStatus.Int();
+		if (!aContinue && err == KErrNone)
+			{
+			// Ensure that CDlUpCloseDataPort receives an error in the case where aContinue==EFalse and iStatus==KErrNone.
+			// If not, CDlUpCloseDataPort will carry on as if we are doing a normal startup, advance to CDlUpOpen, and cause
+			// a NIFMAN panic (ConnectComplete(), state is EDisconnecting).  Note that the aContinue flag does not seem to be
+			// propagated between states, so even though it may be EFalse here (indicating a connection cancellation), in
+			// CDlUpCloseDataPort it seems to revert back to ETrue.
+			err = KErrCancel;
+			}
+		return CDlUpCloseDataPort::NewL(*iSMObserver,*iNdEnv, err);
+		}
+	else //succesful run of state
+		{
+		return CDlUpLogin::NewL(*iSMObserver,*iNdEnv);
+		}
+	}
+
+CDlUpLogin* CDlUpLogin::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Login State
+
+2 phased constructor for CDlUpLogin, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpLogin object.
+*/
+	{
+	CDlUpLogin* r=new(ELeave) CDlUpLogin(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpLogin::CDlUpLogin(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CAgentStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpLogin, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpLogin::ConstructL()
+/**
+Instantiate Member variable.
+*/
+	{}
+
+CDlUpLogin::~CDlUpLogin()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpLogin::StartState()
+/**
+Starts dialup call login state.
+Call UpdateProgress() with ECsdStartingLogIn and KErrNone.
+Call DoStartStateL() and trap possible leave.
+If DoStartStateL leaves, call JumpToRunl() with leave error.
+*/
+	{
+	iSMObserver->UpdateProgress(ECsdStartingLogIn,KErrNone);
+	// This call executes the actual script.
+	TRAPD(ret,DoStartStateL());
+	if (ret!=KErrNone)
+		JumpToRunl(ret);
+	}
+
+void CDlUpLogin::DoStartStateL()
+/**
+If login script is valid then execute it.
+If script is used, call ExecuteL() and set state active.
+Else call JumpToRunl() with KErrNone.
+*/
+	{
+	if (iNdEnv->UseScript())
+		{
+		(iNdEnv->Script())->ExecuteL(*this);
+		iStatus=KRequestPending;
+		SetActive();
+		}
+	else
+		{
+		JumpToRunl(KErrNone);
+		}
+	}
+
+CAgentStateBase* CDlUpLogin::NextStateL(TBool aContinue)
+/**
+Changes to from login state to next state.
+If connection is not continued or iStatus is not KErrNone, create hangup state.
+Else create open state (non-BCA).  Create close data port state (BCA).
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpCloseDataPort (BCA), CDlUpHangUp or CDlUpOpen (non-BCA) object.
+*/
+	{ 
+	(void)aContinue;
+	return CDlUpCloseDataPort::NewL(*iSMObserver,*iNdEnv, iStatus.Int());
+	}
+
+void CDlUpLogin::ScriptFunctionComplete(TInt aError)
+	{
+	TRequestStatus* status=&iStatus;
+	User::RequestComplete(status,aError);
+	}
+
+void CDlUpLogin::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	if(iNdEnv->Script()!=NULL)
+		(iNdEnv->Script())->Cancel();
+	if (iStatus == KRequestPending)
+		{
+		ScriptFunctionComplete(KErrCancel);
+		}
+	}
+
+void CDlUpLogin::RunL()
+/**
+Login completed  (should not complete if connection cancelled).
+If there is an error then signal it by calling ConnectionComplete() with ECsdFinishedLogIn and iStatus.Int().
+Call UpdateProgress() with EScannedScript and KErrNone.
+Call CompleteState() with KErrNone.
+*/
+	{
+	if(iStatus!=KErrNone)
+		{
+		__FLOG_STMT(_LIT(logString3,"Login");)
+		__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KCompletedPhaseLogString()), &logString3(), iStatus.Int());
+		if (iNdEnv->Script()!=NULL)
+			iNdEnv->Script()->CloseScript();
+		iSMObserver->ConnectionComplete(ECsdFinishedLogIn,iStatus.Int());
+		return;
+		}
+	
+	iSMObserver->UpdateProgress(ECsdFinishedLogIn,KErrNone);
+	(iNdEnv->BaseEnv())->CompleteState(KErrNone);
+	}
+
+CDlUpOpen* CDlUpOpen::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Open State
+
+2 phased constructor for CDlUpOpen, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpOpen object.
+*/
+	{
+	CDlUpOpen* r=new(ELeave) CDlUpOpen(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpOpen::CDlUpOpen(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CNdCallBackStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpOpen, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpOpen::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{
+	CNdCallBackStateBase::ConstructL();
+	}
+
+CDlUpOpen::~CDlUpOpen()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpOpen::StartState()
+/**
+Starts dialup open state.
+Call JumpToRunl() with KErrNone.
+*/
+	{
+	JumpToRunl(KErrNone);
+	}
+
+CAgentStateBase* CDlUpOpen::NextStateL(TBool /*aContinue*/)
+/**
+Changes to from open state to next state.
+If call back is used, create dial in init state.
+else if connection is reconnect, create dial up init state.
+Else create hangup state.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlInInit, CDlUpInit or CDlUpHangUp object.
+*/
+	{
+	if((iNdEnv->BaseEnv())->CallBack())
+		{
+		return CDlInInit::NewL(*iSMObserver,*iNdEnv);
+		}
+	else if((iNdEnv->BaseEnv())->IsReconnect())
+		{
+		return CDlUpInit::NewL(*iSMObserver,*iNdEnv);
+		}
+	else
+		{
+		return CDlUpHangUp::NewL(*iSMObserver,*iNdEnv);
+		}
+	}
+#ifdef SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT
+void CDlUpOpen::TelFunctionComplete(TInt aError)
+	{
+	iTelEvent = ETrue;
+	JumpToRunl(aError);
+	}
+#endif
+
+void CDlUpOpen::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+#ifdef SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT
+	if(NULL != iNdEnv->TelServPrc())
+		{
+		iNdEnv->TelServPrc()->Cancel();			
+		}	
+#endif
+//	(iNdEnv->BaseEnv())->CompleteState(KErrCancel);
+	}
+
+void CDlUpOpen::RunL()
+/**
+Open completed.
+Call UpdateProgress() with ECsdConnectionOpen and KErrNone.
+If script is used, close it.
+Call ConnectionComplete() with ECsdConnectionOpen and KErrNone.
+*/
+	{
+#ifdef SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT	
+	if (iTelEvent)
+		{
+		iTelEvent = EFalse;		
+		iSMObserver->Notification(EAgentToNifEventTypeDisableConnection, 
+			reinterpret_cast<TAny*>(KErrDisconnected));
+		return;
+		}	
+#endif					
+	__ASSERT_DEBUG(iStatus==KErrNone,User::Invariant());
+	iSMObserver->UpdateProgress(ECsdConnectionOpen,KErrNone);
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tConnection Open");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+	if (iNdEnv->Script()!=NULL)
+		iNdEnv->Script()->CloseScript();
+	iSMObserver->ConnectionComplete(ECsdConnectionOpen,KErrNone);
+#ifdef SYMBIAN_NETWORKING_CSDAGENT_BCA_SUPPORT
+	iNdEnv->TelServPrc()->ListenForStatusChange(*this);
+#endif	
+	}
+
+CDlUpHangUp* CDlUpHangUp::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up HangUp State
+
+2 phased constructor for CDlUpHangUp, first phase.
+
+@param aSMObserver a reference to state machine observer.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CDlUpHangUp object.
+*/
+	{
+	CDlUpHangUp* r=new(ELeave) CDlUpHangUp(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpHangUp::CDlUpHangUp(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CNdCallBackStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpHangUp, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpHangUp::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{
+	CNdCallBackStateBase::ConstructL();
+	}
+
+CDlUpHangUp::~CDlUpHangUp()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpHangUp::StartState()
+/**
+Starts dialup hangup state.
+Call UpdateProgress() with ECsdStartingHangUp and KErrNone.
+If script is used, clean up script.
+If dataport is loaned, recover it by calling ReturnCommPortL() from ETel server processor.
+If ReturnCommPortL leaves, call JumpToRunl() with the leave error and return.
+If call is active, call StartHangUpAfterDialOut() from ETel server processor and set state active.
+Else call JumpToRunl() with KErrNone.
+*/
+	{
+	iSMObserver->UpdateProgress(ECsdStartingHangUp,KErrNone);
+	
+	if (iNdEnv->Script()!=NULL)
+		{
+		(iNdEnv->Script())->CleanupScript();
+		}
+
+	if (iNdEnv->TelServPrc()->CommPortLoaned())
+		{
+		// returns ownership of the comm port to ETEL
+		TRAPD(err,(iNdEnv->TelServPrc())->ReturnCommPortL());
+		if (err!=KErrNone)
+			{
+			JumpToRunl(err);
+			return;
+			}
+		}
+
+	if (iNdEnv->TelServPrc()->CallActive())
+		{
+		(iNdEnv->TelServPrc())->StartHangUpAfterDialOut(*this);
+		iStatus=KRequestPending;
+		SetActive();
+		}
+	else
+		JumpToRunl(KErrNone);
+	}
+
+CAgentStateBase* CDlUpHangUp::NextStateL(TBool /*aContinue*/)
+/**
+Changes to from hangup state to next state.
+Next State will always be Disconnect regardless of implementation results
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpDisconnect object.
+*/
+	{
+	return CDlUpDisconnect::NewL(*iSMObserver,*iNdEnv);
+	}
+
+void CDlUpHangUp::TelFunctionComplete(TInt aError)
+	{
+	TRequestStatus* status=&iStatus;
+	User::RequestComplete(status,aError);
+	}
+
+void CDlUpHangUp::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	(iNdEnv->TelServPrc())->Cancel();
+	if (iStatus == KRequestPending)
+		{
+		TelFunctionComplete(KErrCancel);
+		}
+	}
+
+void CDlUpHangUp::RunL()
+/**
+Hangup completed.
+If there is an error then log it, otherwise advance to closed phase.
+Else call UpdateProgress() with ECsdFinishedHangUp and KErrNone.
+Call CompleteState() with iStatus.Int().
+*/
+	{	
+	//update the log object
+	iNdEnv->Logger()->LogDataUpdateEvent(R_LOG_CON_DISCONNECTED, KLogDataEventTypeUid);
+	if(iStatus!=KErrNone)
+		{
+#ifdef __FLOG_ACTIVE
+		_LIT(logString3,"Hang Up");
+		_LIT8(logString2,"NetDial:\tDisconnection Error %d");
+#endif
+		__FLOG_STATIC2(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(KCompletedPhaseLogString()), &logString3(), iStatus.Int());
+		__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString2()), iStatus.Int());
+		}
+	else
+		{
+		iSMObserver->UpdateProgress(ECsdFinishedHangUp,KErrNone);
+		}
+	(iNdEnv->BaseEnv())->CompleteState(iStatus.Int());
+	}
+
+CDlUpDisconnect* CDlUpDisconnect::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Disconnect State
+*/
+	{
+	CDlUpDisconnect* r=new(ELeave) CDlUpDisconnect(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpDisconnect::CDlUpDisconnect(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CNdCallBackStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpDisconnect, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpDisconnect::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{
+	CNdCallBackStateBase::ConstructL();
+	}
+
+CDlUpDisconnect::~CDlUpDisconnect()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpDisconnect::StartState()
+/**
+Starts dialup disconnect state.
+If script is used, clean up script.
+If ETel server processor is used, close all ETel call objects.
+Call JumpToRunl() with KErrNone.
+*/
+	{
+	if ((iNdEnv->Script())!=NULL)
+		{
+		(iNdEnv->Script())->CleanupScript();
+		}
+	if ((iNdEnv->TelServPrc())!=NULL)
+		{
+		(iNdEnv->TelServPrc())->CloseCall();
+		}
+	// We need to make sure that logging is finished before closing everything.
+	// forward iStatus to the logger, which will be responsible to complete iStatus when it is finished.
+	iStatus = KRequestPending;
+	SetActive();
+	iNdEnv->Logger()->LogDataNotifyLastEventUpdate(&iStatus);
+	}
+
+CAgentStateBase* CDlUpDisconnect::NextStateL(TBool /*aContinue*/)
+/**
+Changes to from disconnect state to next state.
+Next State will always be Disconnect regardless of implementation results.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpDisconnect object.
+*/
+	{
+	return CDlUpDisconnect::NewL(*iSMObserver,*iNdEnv);
+	}
+
+void CDlUpDisconnect::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	}
+
+void CDlUpDisconnect::RunL()
+/**
+Disconnect completed.
+Call DisconnectComplete().
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tDisconnect Complete");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+
+	iSMObserver->DisconnectComplete();
+	}
+
+CDlUpOpenDataPort* CDlUpOpenDataPort::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+/**
+Dial Up Open Data Port State
+*/
+	{
+	CDlUpOpenDataPort* r=new(ELeave) CDlUpOpenDataPort(aSMObserver,aNdEnv);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpOpenDataPort::CDlUpOpenDataPort(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv)
+	: CAgentStateBase(aSMObserver),iNdEnv(&aNdEnv)
+/**
+Private constructor for CDlUpOpenDataPort, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpOpenDataPort::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{
+	}
+
+CDlUpOpenDataPort::~CDlUpOpenDataPort()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpOpenDataPort::StartState()
+/**
+Starts Dial Up Open Data Port state.
+Set up script and initiate creation of channel.
+Call JumpToRunl() with KErrNone.
+*/
+	{
+	ASSERT(iNdEnv);
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tOpening Data Port"));
+	__FLOG_STATIC(KNetDialLogFolder(), KNetDialLogFile(), logString());
+
+	iSMObserver->UpdateProgress(ECsdScanningScript,KErrNone);
+	TRAPD(ret,iNdEnv->SetUpScriptL());
+	if (ret!=KErrNone)
+		{
+		JumpToRunl(ret);
+		return;
+		}
+
+	iNdEnv->Script()->CreateChannel(iStatus);
+	iStatus = KRequestPending;
+	SetActive();
+	}
+
+CAgentStateBase* CDlUpOpenDataPort::NextStateL(TBool aContinue)
+/**
+Changes to from Open Data Port state to next state.
+Next State will be Hangup on errors or connection start cancellation, else Scan Script.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpHangUp or CDlUpOpenDataPort object.
+*/
+	{
+	if((!aContinue)||(iStatus!=KErrNone))
+		{
+		return CDlUpHangUp::NewL(*iSMObserver,*iNdEnv);
+		}
+	else
+		{
+		return CDlUpScanScript::NewL(*iSMObserver, *iNdEnv);
+		}
+	}
+
+void CDlUpOpenDataPort::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	iNdEnv->Script()->CancelCreateChannel();
+	}
+
+void CDlUpOpenDataPort::RunL()
+/**
+Dial Up Open Data Port completed.
+Call CompleteState() with KErrNone.
+*/
+	{
+	if (iStatus!=KErrNone)
+		{
+#ifdef __FLOG_ACTIVE
+		_LIT(logString3,"Open Data Port");
+#endif
+		__FLOG_STATIC2(KNetDialLogFolder(), KNetDialLogFile(), TRefByValue<const TDesC>(KCompletedPhaseLogString()), &logString3(), iStatus.Int());
+		if (iNdEnv->Script()!=NULL)
+			iNdEnv->Script()->CloseScript();
+		iSMObserver->ConnectionComplete(ECsdScannedScript,iStatus.Int());
+		return;
+		}
+
+	(iNdEnv->BaseEnv())->CompleteState(KErrNone);
+	}
+
+CDlUpCloseDataPort* CDlUpCloseDataPort::NewL(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv, TInt aError)
+/**
+Dial Up Close Data Port State
+*/
+	{
+	CDlUpCloseDataPort* r=new(ELeave) CDlUpCloseDataPort(aSMObserver,aNdEnv, aError);
+	CleanupStack::PushL(r);
+	r->ConstructL();
+	CleanupStack::Pop();
+	return r;
+	}
+
+CDlUpCloseDataPort::CDlUpCloseDataPort(MAgentStateMachineEnv& aSMObserver, MNetdialEnv& aNdEnv, TInt aError)
+	: CAgentStateBase(aSMObserver), iNdEnv(&aNdEnv), iError(aError)
+/**
+Private constructor for CDlUpCloseDataPort, used in the first phase of construction.
+
+@param aSMObserver a reference to the database accessor.
+@param aNdEnv a reference to the Netdial which defines a set of utility functions.
+*/
+	{}
+
+void CDlUpCloseDataPort::ConstructL()
+/**
+Instantiate Member variable.
+Call base class CNdCallBackStateBase::ConstructL().
+
+@exception Leaves if CNdCallBackStateBase::ConstructL() leaves, or not enough memory is available.
+*/
+	{
+	}
+
+CDlUpCloseDataPort::~CDlUpCloseDataPort()
+/**
+Destructor.
+Cancel active request.
+*/
+	{
+	Cancel();
+	}
+
+void CDlUpCloseDataPort::StartState()
+/**
+Starts Dial Up Close Data Port state.
+Initiate shutdown of data port
+*/
+	{
+	ASSERT(iNdEnv);
+	ASSERT (iNdEnv->Script());
+
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tClosing Data Port"));
+	__FLOG_STATIC(KNetDialLogFolder(), KNetDialLogFile(), logString());
+
+	iNdEnv->Script()->ShutdownChannel(iStatus);
+	iStatus = KRequestPending;
+	SetActive();
+	}
+
+CAgentStateBase* CDlUpCloseDataPort::NextStateL(TBool aContinue)
+/**
+Changes to from Close Data Port state to next state.
+
+@exception Leaves if NewL() leaves.
+@return a new CDlUpCloseDataPort object.
+*/
+	{
+	if((!aContinue) || (iError != KErrNone) || (iStatus.Int() != KErrNone))
+		{
+		__FLOG_STMT(_LIT(logString,"NetDial:\tCloseDataPort state cancelling (iError %d, aContinue %d, iStatus %d)");)
+		__FLOG_STATIC3(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString()), iError, aContinue, iStatus.Int());
+
+		return CDlUpHangUp::NewL(*iSMObserver,*iNdEnv);
+		}
+	else
+		{
+		return CDlUpOpen::NewL(*iSMObserver, *iNdEnv);
+		}
+	}
+
+void CDlUpCloseDataPort::DoCancel()
+/**
+Cancels active requests.
+*/
+	{
+	}
+
+void CDlUpCloseDataPort::RunL()
+/**
+Close Data Port completed.
+Call CompleteState() with KErrNone.
+*/
+	{
+	// Note: we assume that if iError != KErrNone then ConnectionComplete() has already been called by
+	// the failing state (otherwise NIFMAN will panic due to the lack of a ConnectComplete() in response
+	// to its earlier Connect()).
+	if (iStatus!=KErrNone)
+		{
+#ifdef __FLOG_ACTIVE
+		_LIT(logString3,"Close Data Port");
+		_LIT8(logstring2,"Saved error = %d");
+#endif
+		__FLOG_STATIC2(KNetDialLogFolder(), KNetDialLogFile(), TRefByValue<const TDesC>(KCompletedPhaseLogString()), &logString3(), iStatus.Int());
+		if (iError != KErrNone)
+			{
+			__FLOG_STATIC1(KNetDialLogFolder(), KNetDialLogFile(), TRefByValue<const TDesC8>(logstring2()), iError);
+			}
+		else
+			{
+			// Only do the ConnectionComplete() due to errors in this state if a previous state has not already done
+			// so (i.e. iError == KErrNone) otherwise NIFMAN will panic.
+			iSMObserver->ConnectionComplete(iStatus.Int());
+			return;
+			}
+		}
+	(iNdEnv->BaseEnv())->CompleteState(KErrNone);
+	}
+