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