telephonyprotocols/csdagt/src/ND_SCR.CPP
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyprotocols/csdagt/src/ND_SCR.CPP	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,516 @@
+// 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:
+// Script Control definitions
+// 
+//
+
+/**
+ @file Nd_scr.cpp 
+*/
+
+#include "ND_SCR.H"
+#include "ND_STD.H"
+#include "SLOGGER.H"
+#include "SSCREXEC.H"
+#include "ND_DBACC.H"
+
+
+_LIT(KLoginNameVar,"login_name$");
+_LIT(KLoginPassVar,"login_pass$");
+_LIT(KLoginIpaddrVar,"login_ipaddr$");
+
+// CNetDialScript definitions
+
+CNetDialScript* CNetDialScript::NewL(CCommsDbNetDialAccess* aDb,CDialogProcessor* aDlgPrc,RCall::TCommPort& aCommPort,TCommRole aRole,TInt aLength)
+/**
+2 phased constructor for CNetDialScript, first phase.
+
+@param aDb a pointer to CommDB accessor.
+@param aDlgPrc a pointer to dialog processor.
+@param aCommPort is loaned COMM port from ETel server.
+@param aLength is lenght for used script.
+@exception Leaves if ConstructL() leaves, or not enough memory is available.
+@return a new CNetDialScript object.
+*/
+	{
+	CNetDialScript* r=new(ELeave) CNetDialScript(aDb,aDlgPrc,aLength);
+	CleanupStack::PushL(r);
+	r->ConstructL(aCommPort,aRole);
+	CleanupStack::Pop();
+	return r;
+	}
+
+CNetDialScript::CNetDialScript(CCommsDbNetDialAccess* aDb,CDialogProcessor* aDlgPrc,TInt aLength) 
+	: CActive(EPriorityStandard), iState(EIdle), iDb(aDb), iDlgPrc(aDlgPrc), iUsePct(EFalse), iLength(aLength)
+/**
+Private constructor for CNetDialScript, used in the first phase of construction.
+
+@param aDb a pointer to CommDB accessor.
+@param aDlgPrc is pointer to dialog processor.
+@param aLength is length of the used script.
+*/
+	{}
+
+void CNetDialScript::ConstructL(RCall::TCommPort& aCommPort,TCommRole aRole)
+/**
+Instantiate Member variable.
+Add this object into active scheduler.
+Create script executor.
+
+@param aCommPort a loaned COMM port from ETel server.
+@exception Leaves if CScriptExecutor::NewL() leaves.
+*/
+	{
+	CActiveScheduler::Add(this);
+	iScriptExecutor=CScriptExecutor::NewL(this,aCommPort.iPort,iLength);
+	(void) aRole;
+	GetBcaStack();
+	GetIapIdL();
+	}
+
+CNetDialScript::~CNetDialScript()
+/**
+Destructor.
+Cancel active requests.
+If script executor is used, call Disconnect() to close it.
+Delete script executor.
+*/
+	{
+	Cancel();
+	if(iScriptExecutor!=NULL)
+		iScriptExecutor->Disconnect();
+	delete iScriptExecutor;
+	}
+
+void CNetDialScript::ReConfigureAndCancelCommPort(TRequestStatus& aStatus)
+/**
+Request script executor to reconfigure COMM port.
+*/
+	{
+	iScriptExecutor->ReConfigureAndCancelCommPort(aStatus);
+	}
+
+void CNetDialScript::DropSignals(TRequestStatus& aStatus)
+/**
+Request script executor to Drop signals on COMM port.
+*/
+	{
+	iScriptExecutor->DropSignals(aStatus);
+	}
+
+void CNetDialScript::GetBcaStack()
+	{
+	TRAPD(ret, iDb->GetBcaStackL(iBcaStack););
+	if (ret != KErrNone || iBcaStack.Length() == 0) //Well it looks like there was not BcaStack therefore
+		{
+		_LIT(KDefaultBcaStack, "c32bca");
+		iBcaStack.Copy(KDefaultBcaStack());
+		}
+	}
+
+void CNetDialScript::GetIapIdL()
+	{
+	TInt iapOrError = iDb->GetIapId();
+	if (iapOrError == 0)
+		{
+		User::Leave(KErrNetDialDatabaseDefaultUndefined);
+		}
+	else
+	if (iapOrError > 0)
+		{
+		iIapId = iapOrError;
+		}
+	else
+		{
+		User::Leave(iapOrError);
+		}
+	}
+
+void CNetDialScript::CreateChannel(TRequestStatus& aStatus)
+	{
+	ASSERT(iScriptExecutor);
+	iScriptExecutor->CreateChannel(aStatus);
+	}
+
+void CNetDialScript::CancelCreateChannel()
+	{
+	ASSERT(iScriptExecutor);
+	iScriptExecutor->CancelCreateChannel();
+	}
+
+void CNetDialScript::ShutdownChannel(TRequestStatus& aStatus)
+	{
+	ASSERT(iScriptExecutor);
+	iScriptExecutor->ShutdownChannel(aStatus);
+	}
+
+
+void CNetDialScript::Scan(MNetDialScriptObserver& aObserver)
+/**
+Starts script scanning.
+Scan is synchronous, so just go straight to the RunL() and do it.
+
+@param aObserver a reference to script observer.
+*/
+	{
+	__ASSERT_DEBUG(iLength>0, NetDialPanic(EZeroLengthScript));
+	__ASSERT_DEBUG(iState==EIdle, User::Invariant());
+
+	iCurrentObserver=&aObserver;
+	iStatus=KRequestPending;
+	SetActive();
+	iState=EScanScript;
+	ScriptOperationComplete(KErrNone);
+	}
+
+TBool CNetDialScript::GetLoginParamsL(MNetDialScriptObserver& aObserver, TBool aIsReconnect)
+/**
+Get login parameters. Assumes that there is a non-zero length script.
+Check from CommDB accessor if login dialog is shown, what are the login name and password and IP address.
+If the login params are in script, do not request them from user.
+If dialog is used, get login parameters from dialog processor, set object active and return EFalse.
+Else set state idle and return ETrue as login params should 
+
+@param aObserver a reference to login observer.
+@return EFalse if the request is not complete and ETrue if the request is already complete.
+@exception Leaves if GetLoginParamsL() leaves, panics if script length is zero or iState is not idle.
+*/
+	{
+	__ASSERT_DEBUG(iLength>0, NetDialPanic(EZeroLengthScript));
+	__ASSERT_DEBUG(iState==EIdle, User::Invariant());
+
+	iCurrentObserver=&aObserver;
+	iDb->GetLoginParamsL(iUseLoginDialog,iLoginName,iLoginPass,iIPAddress);
+	if (iScriptExecutor->ReadFound())
+		iUseLoginDialog=EFalse;			// don't use prompt for password there is a READ command
+	if (iUseLoginDialog)
+		{
+		iDlgPrc->Login(*this,iLoginName,iLoginPass,aIsReconnect);
+		iStatus=KRequestPending;
+		SetActive();
+		iState=EGetLogin;
+		return EFalse;
+		}
+	else
+		{
+		iState=EIdle;
+		return ETrue;
+		}
+	}
+
+void CNetDialScript::ExecuteL(MNetDialScriptObserver& aObserver)
+/**
+Set up login script variables and execute script (will be valid if called).
+Get script from CommDB accessor and set it for script executor.
+Get login name, password and IP address from CommDB.
+If PCT is used, call OpenPct(), call DestroyPctNotification() to end notifications and set login params for script executor.
+Call RunScript() to start the script.
+Set object active and iState to EExecute.
+
+@param aObserver a reference to script observer.
+@exception Leaves if GetAndSetScriptL() or SetLoginVarsL() leaves, panics if script length is zero or iState is not idle.
+*/
+	{
+	__ASSERT_DEBUG(iLength>0, NetDialPanic(EZeroLengthScript));
+	__ASSERT_DEBUG(iState==EIdle, User::Invariant());
+	
+	iCurrentObserver=&aObserver;
+	GetAndSetScriptL();
+	SetLoginVarsL();
+	if (iUsePct)
+		{
+		User::LeaveIfError(OpenPct());
+		DestroyPctNotification();
+		iScriptExecutor->SetLoginParams(iLoginName,iLoginPass);		// required for test dialog server
+		}	
+	iScriptExecutor->RunScript();
+	iStatus=KRequestPending;
+	SetActive();
+	iState=EExecute;
+	}
+
+void CNetDialScript::CloseScript()
+/**
+Close script.
+Call CloseScript() from script executor.
+*/
+	{
+	iScriptExecutor->CloseScript();
+	}
+
+void CNetDialScript::CleanupScript()
+/**
+Cleanup script.
+Call Close() from script executor.
+*/
+	{
+	iScriptExecutor->Close();
+	}
+
+void CNetDialScript::ScriptOperationComplete(TInt aError)
+/**
+Completes script request.
+*/
+	{
+	TRequestStatus* statusPtr=&iStatus;
+	User::RequestComplete(statusPtr,aError);
+	}
+
+void CNetDialScript::ConfigureCommPort(TRequestStatus& aStatus, const TCommConfig& aConfig)
+/**
+Configures COMM port.
+Call ConfigureCommPort() from script executor.
+
+@param aConfig a reference to COMM port.
+@return error code for configuration.
+*/
+	{
+	iScriptExecutor->ConfigureCommPort(aStatus, aConfig);
+	}
+
+void CNetDialScript::CancelConfigureCommPort()
+/**
+Cancels Configures COMM port.
+Call CancelConfigureCommPort() from script executor.
+*/
+	{
+	iScriptExecutor->CancelConfigureCommPort();
+	}
+
+
+TInt CNetDialScript::GetExcessData(TDes8& aBuffer)
+/**
+Get excess data.
+Call GetExcessData() from script executor.
+
+@param aBuffer a reference for excess data.
+@return error code for GetExcessData() request.
+*/
+	{
+	return iScriptExecutor->GetExcessData(aBuffer);
+	}
+
+void CNetDialScript::DropDTR(TRequestStatus* aStatusPtr)
+/**
+Drop DTR.
+Call DropDTR() from script executor.
+*/
+	{
+	iScriptExecutor->DropDTR(aStatusPtr);
+	}
+
+
+TInt CNetDialScript::OpenPct()
+/**
+Open PCT.
+Call OpenPct() from dialog processor.
+
+@return error code for OpenPct() request.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tOpening PCT");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+
+	const TInt ret = iDlgPrc->OpenPct();
+	if (ret == KErrNone)
+		iPctOpen = ETrue;
+	return ret;
+	}
+
+void CNetDialScript::DestroyPctNotification()
+/**
+Destroy PCT notification.
+Call DestroyPctNotification() from dialog processor.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tRequesting Destroy PCT Notification");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+	
+	iDlgPrc->DestroyPctNotification(*this);
+	}	
+
+TInt CNetDialScript::WritePct(TDes& aBuffer)
+/**
+Write incoming data into PCT.
+
+@param aBuffer a reference for incoming data.
+@return error code for WritePct() request.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tWriting To PCT");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+	
+	return iDlgPrc->WritePct(aBuffer);
+	}	
+
+void CNetDialScript::ReadPct(TDes& aBuffer)
+/**
+Read data from PCT.
+
+@param aBuffer a reference for read data.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tReading From PCT");)
+	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+	
+	iDlgPrc->ReadPct(*this,aBuffer);
+	}
+
+void CNetDialScript::ClosePct()
+/**
+Close PCT.
+If PCT is open, call ClosePct() from dialog processor 
+*/
+	{
+	if (iPctOpen)
+		{
+		__FLOG_STMT(_LIT8(logString,"NetDial:\tClosing PCT");)
+		__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
+	
+		iDlgPrc->ClosePct();
+		iPctOpen = EFalse;
+		iUsePct = EFalse;
+		}
+	}
+
+void CNetDialScript::CancelDialogServer()
+/**
+Cancel requests.
+Call CancelEverything() from dialog processor.
+*/
+	{
+	iDlgPrc->CancelEverything();
+	}
+
+void CNetDialScript::MDPOLoginComplete(TInt aError)
+/**
+Login complete.
+Complete request with aError.
+
+@param aError a error code for completition.
+*/
+	{
+	TRequestStatus* statusPtr=&iStatus;
+	User::RequestComplete(statusPtr,aError);
+	}
+
+void CNetDialScript::MDPOReadPctComplete(TInt aError)
+/**
+PCT read complete.
+Call ReadPctComplete() from script executor with aError to complete the ReadPct() request.
+
+@param aError a error code for completition.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tRead PCT Complete with Error %d");)
+	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString()),aError);
+	iScriptExecutor->ReadPctComplete(aError);
+	}
+void CNetDialScript::MDPODestroyPctComplete(TInt aError)
+/**
+Destroy PCT complete.
+Call DestroyPctNotificationReceived() from script executor with aError to complete the DestroyPctNotification() request.
+
+@param aError a error code for completition.
+*/
+	{
+	__FLOG_STMT(_LIT8(logString,"NetDial:\tDestroy PCT Notification Complete with Error %d");)
+	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString()),aError);
+
+	iScriptExecutor->DestroyPctNotificationReceived(aError);
+	}
+
+void CNetDialScript::RunL()
+/**
+RunL - Request completed.
+If iState is EScanScript, call DoScanScriptL() and trap error.
+Else copy iStatus.Int() into ret variable.
+Call ScriptFunctionComplete() with ret from current observer.
+Set state to EIdle.
+*/
+	{
+	__ASSERT_DEBUG(iCurrentObserver!=NULL, User::Invariant());
+	__ASSERT_DEBUG(((iState==EScanScript) || (iState==EExecute) || (iState==EGetLogin)), User::Invariant());
+
+	TInt ret=KErrNone;
+	if (iState==EScanScript)
+		{
+		TRAP(ret,DoScanScriptL());
+		}
+	else
+		{
+		ret=iStatus.Int();
+		}
+
+	iCurrentObserver->ScriptFunctionComplete(ret);
+	iState=EIdle;
+	}
+
+void CNetDialScript::DoCancel()
+/**
+Cancels active requests.
+Call Cancel() from script executor.
+If request is pending, call ScriptFunctionComplete() with KErrCancel from current observer.
+*/
+	{
+	iScriptExecutor->Cancel();
+	if(iStatus==KRequestPending)
+		{
+		iCurrentObserver->ScriptFunctionComplete(KErrCancel);
+		}
+	}
+
+void CNetDialScript::DoScanScriptL()
+/**
+Scan the script for a READ command.
+Call GetUsePctL() from CommDB accessor to find out if PCT is used.
+Call GetAndSetScript() to get script from CommDB accessor and set it for script executor.
+Call ScanScriptL() from script executor to start scanning.
+If PCT is not used and ReadFound() returns ETrue, set iUsePct to ETrue.
+We need to know if there is a READ whether or not the PCT flag is set to see if we need the login dialog.
+
+@exception Leaves if GetUsePctL(), GetAndSetScriptL() or ScanScriptL() leaves.
+*/
+	{
+	iDb->GetUsePctL(iUsePct);
+	GetAndSetScriptL();
+	iScriptExecutor->ScanScriptL();
+	if (!iUsePct && iScriptExecutor->ReadFound())
+		iUsePct = ETrue;
+	}
+
+void CNetDialScript::GetAndSetScriptL()
+/**
+Get script from database and set script in script executor.
+*/
+	{
+	if (!iScriptExecutor->IsScriptSet())
+		{
+		HBufC* buffer=iDb->GetScriptLC();
+		TPtr script(buffer->Des());
+		iScriptExecutor->SetScript(script);
+		CleanupStack::PopAndDestroy();
+		}
+	}
+
+void CNetDialScript::SetLoginVarsL()
+/**
+Set up values read from the database as variables.
+*/
+	{
+	iScriptExecutor->SetVariableL(KLoginNameVar,iLoginName);
+	iScriptExecutor->SetVariableL(KLoginPassVar,iLoginPass);
+	iScriptExecutor->SetVariableL(KLoginIpaddrVar,iIPAddress);
+	}	
+