telephonyprotocols/csdagt/script/SIO.CPP
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
equal deleted inserted replaced
-1:000000000000 0:3553901f7fa8
       
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // NetDial Serial IO Functions
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file Sio.cpp 
       
    20 */
       
    21 
       
    22 #include "SSCREXEC.H"
       
    23 #include "SIO.H"
       
    24 #include "SLOGGER.H"
       
    25 #include <networking/bca.h>
       
    26 
       
    27 const TInt KChatterPriority=0;
       
    28 const TInt KCommReadPriority=10;
       
    29 const TInt KCommWritePriority=20;
       
    30 const TInt KChatBufferSize=64;
       
    31 const TInt KWriteTimeOutSec=6;
       
    32 const TInt KOneSecInMicroSecs=1000000;
       
    33 const TInt KPreSendPauseTimeMicroSec=200000;
       
    34 const TInt KClockTick=15500;
       
    35 const TReal KTRealOneSecInMicroSecs=1E6;
       
    36 
       
    37 // CScriptIO definitions 
       
    38 CScriptIO* CScriptIO::NewL(CScriptExecutor* aScriptExecutor, const TDesC& aCommsChannel)
       
    39 
       
    40 /**
       
    41 2 phased constructor for CScriptIO, first phase.
       
    42 
       
    43 @param aScriptExecutor a pointer to script executor.
       
    44 @param aCommPort a reference to COMM port.
       
    45 @exception Leaves if ConstructL() leaves, or not enough memory is available.
       
    46 @return a new CScriptIO object.
       
    47 */
       
    48 	{
       
    49 	CScriptIO* c=new(ELeave) CScriptIO(aScriptExecutor);
       
    50 	CleanupStack::PushL(c);
       
    51 	c->ConstructL(aCommsChannel);
       
    52 	CleanupStack::Pop();
       
    53 	return c;
       
    54 	}
       
    55 
       
    56 CScriptIO::CScriptIO(CScriptExecutor* aScriptExecutor)
       
    57 	: iScriptExecutor(aScriptExecutor)
       
    58 /**
       
    59 Constructor for CSetCommand, used in the first phase of construction.
       
    60 
       
    61 @param aScriptExecutor a pointer to script executor.
       
    62 @param aCommPort a reference to COMM port.
       
    63 */
       
    64 	{}
       
    65 
       
    66 void CScriptIO::ConstructL(const TDesC& aCommsChannel)
       
    67 /**
       
    68 Instantiates member variables.
       
    69 */
       
    70 	{
       
    71 	CommConstructL(KCommReadPriority,KCommWritePriority);
       
    72 	iChat=CCommChatter::NewL(this,KChatterPriority,KChatBufferSize);
       
    73 	iPreSendPause=CPreSendPause::NewL(this);
       
    74 	iExcessData.Set(NULL,0);
       
    75 
       
    76 	iCommsChannel.CreateL(aCommsChannel);
       
    77 	iCommsChannel.Copy(aCommsChannel);
       
    78 	}
       
    79 
       
    80 void CScriptIO::CreateChannel(TRequestStatus& aStatus)
       
    81 	{
       
    82 	ASSERT(iCreateAndShutdownStatus == NULL);
       
    83 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),_L("Script:\tOpening Comm Port '%S'"), &iCommsChannel);
       
    84 
       
    85 	iCommClosed = EFalse;
       
    86 	TInt err = CommOpen(iCommsChannel);
       
    87 	if (err != KErrNone)
       
    88 		{
       
    89 		__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),_L("Script: Error %d opening Comm Port"), err);
       
    90 		TRequestStatus* stat = &aStatus;
       
    91 		User::RequestComplete(stat, err);	
       
    92 		}
       
    93 	iCreateAndShutdownStatus = &aStatus;
       
    94 	}
       
    95 
       
    96 void CScriptIO::CancelCreateChannel()
       
    97 	{
       
    98 	__FLOG_STMT(_LIT8(logString,"Script:\tCancelCreateChannel()");)
       
    99 	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
       
   100 	CommCancel();
       
   101 	}
       
   102 
       
   103 void CScriptIO::InitializeComplete()
       
   104 	{
       
   105 	__FLOG_STMT(_LIT8(logString,"Script:\tInitializeComplete()");)
       
   106 	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
       
   107 	ASSERT(iCreateAndShutdownStatus);
       
   108 	User::RequestComplete(iCreateAndShutdownStatus, KErrNone);
       
   109 	iCreateAndShutdownStatus = NULL;
       
   110 	}
       
   111 
       
   112 void CScriptIO::ShutdownComplete(TInt aError)
       
   113 	{
       
   114 	__FLOG_STMT(_LIT8(logString,"Script:\tShutdownComplete(aError %d)");)
       
   115 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),logString(), aError);
       
   116 
       
   117 	ASSERT(iCreateAndShutdownStatus);
       
   118 	if (iCreateError != KErrNone) //The creation error is probably more interesting than a bad shutdown error
       
   119 		{
       
   120 		aError = iCreateError;
       
   121 		}
       
   122 	User::RequestComplete(iCreateAndShutdownStatus, aError);
       
   123 	iCreateAndShutdownStatus = NULL;
       
   124 	iCreateError = KErrNone;
       
   125 	iCommClosed = ETrue;
       
   126 	}
       
   127 
       
   128 void CScriptIO::ConfigurePort(TRequestStatus& aStatus, const TCommConfig& aConfiguration)
       
   129 /**
       
   130 Configures COMM port.
       
   131 
       
   132 @return error value from RComm::SetConfig() request.
       
   133 */
       
   134 	{
       
   135 	using namespace BasebandChannelAdaptation;
       
   136 	iConfig() = aConfiguration;
       
   137 	iBca->Ioctl(aStatus, KBcaOptLevelExtSerial, KSerialSetConfig, iConfig);
       
   138 	}
       
   139 
       
   140 void CScriptIO::CancelConfigurePort()
       
   141 /**
       
   142 Cancel Configuration of COMM port.
       
   143 */
       
   144 	{
       
   145 	iBca->CancelIoctl();
       
   146 	}
       
   147 
       
   148 void CScriptIO::ShutdownChannel(TRequestStatus& aStatus)
       
   149 	{
       
   150 	ASSERT(iCreateAndShutdownStatus == NULL);
       
   151 	iCreateAndShutdownStatus = &aStatus;
       
   152 	Stop(KErrNone);
       
   153 	}
       
   154 
       
   155 void CScriptIO::Stop(TInt  aError)
       
   156 /**
       
   157 Upcall from CScriptBcaControl class indicating an error was encountered.  Clean up and close BCA.
       
   158 
       
   159 @param aError System wide error code. 
       
   160 */
       
   161 	{
       
   162 	__FLOG_STMT(_LIT8(logString,"Script:\tStop(aError %d)");)
       
   163 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),logString(), aError);
       
   164 
       
   165 	iCreateError = aError;
       
   166 	delete iChat;
       
   167 	iChat = NULL;
       
   168 	delete iPreSendPause;
       
   169 	iPreSendPause = NULL;
       
   170 	CommClose();
       
   171 	}
       
   172 
       
   173 CScriptIO::~CScriptIO()
       
   174 /**
       
   175 Destructor.
       
   176 Deletes iChat.
       
   177 Deletes iPreSendPause.
       
   178 Calls CommDelete().
       
   179 */
       
   180 	{
       
   181 	iCommsChannel.Close();
       
   182 	delete iChat;
       
   183 	delete iPreSendPause;
       
   184 	CommDelete();
       
   185 	}
       
   186 
       
   187 
       
   188 void CScriptIO::Start()
       
   189 /**
       
   190 Starts write.
       
   191 */
       
   192 	{
       
   193 	CommWriteReady();
       
   194 	iWritePending=ETrue;
       
   195 	iChat->StartTimer(KWriteTimeOutSec*KOneSecInMicroSecs);
       
   196 	}
       
   197 
       
   198 void CScriptIO::CommReadComplete(TInt aStatus)
       
   199 /**
       
   200 Reads completely - stops timer and if no error checks string against the desired string
       
   201 */
       
   202 	{
       
   203 	__FLOG_STMT(_LIT8(logString1,"Script:\tRead Complete");)
       
   204 	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
       
   205 	if(aStatus==KErrCommsLineFail)
       
   206 		{
       
   207 		__FLOG_STMT(_LIT8(logString2,"Script:\tComms Error %d");)
       
   208 		__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString2()),aStatus);
       
   209 		iChat->StopTimer();
       
   210 		iReadPending=EFalse;
       
   211 		TRAPD(ret,iScriptExecutor->CompletedReadL(KErrCommsLineFail));
       
   212 		if (KErrNone != ret)
       
   213 			{
       
   214 			__FLOG_STMT(_LIT8(logString6,"Script:\tCompleteReadL Failure");)
       
   215 			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString6());
       
   216 			}
       
   217 		return;
       
   218 		}
       
   219 
       
   220 	__ASSERT_ALWAYS(iReadPending,NetDialPanic(EIllegalReadComplete));
       
   221 	iReadPending=EFalse;
       
   222 
       
   223 	
       
   224 	if (aStatus==KErrCommsFrame)
       
   225 		{
       
   226 		__FLOG_STMT(_LIT(logString3,"Script:\tComms Error %d");)
       
   227 		__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString3()),aStatus);
       
   228 		User::After(KClockTick);		// wait for a clock tick and continue
       
   229 		aStatus=KErrNone;
       
   230 		}
       
   231 
       
   232 	else if (aStatus!=KErrNone)
       
   233 		{
       
   234 		TRAPD(ret,iScriptExecutor->CompletedReadL(aStatus));
       
   235 		if (KErrNone != ret)
       
   236 			{
       
   237 			__FLOG_STMT(_LIT8(logString7,"Script:\tCompleteReadL Failure");)
       
   238 			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString7());
       
   239 			}
       
   240 		return;
       
   241 		}
       
   242 
       
   243 #ifdef __FLOG_ACTIVE
       
   244 	_LIT(logString4,"Rx:\t%S");
       
   245 	TBuf16<KLogBufferSize> temp;
       
   246 	temp.Copy(iRxBuffer.Left(Min(iRxBuffer.Length(),KLogBufferSize)));
       
   247 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString4()),&temp);
       
   248 #endif
       
   249 
       
   250 	if (iScriptExecutor->RequestUsePct())
       
   251 		{
       
   252 		TInt err=iScriptExecutor->WritePct(iRxBuffer);
       
   253 		if (err!=KErrNone)
       
   254 			{
       
   255 			TRAPD(ret,iScriptExecutor->CompletedReadL(err));
       
   256 			if (KErrNone != ret)
       
   257 				{
       
   258 				__FLOG_STMT(_LIT8(logString8,"Script:\tCompleteReadL Failure");)
       
   259 				__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString8());
       
   260 				}
       
   261 			return;
       
   262 			}
       
   263 		}
       
   264 
       
   265 	if (!iScriptExecutor->ReadPctPending())
       
   266 		{
       
   267 		for (iRxBufOffset=0; iRxBufOffset<iRxBuffer.Length(); iRxBufOffset++)
       
   268 			{
       
   269 			iChat->AddChar(iRxBuffer[iRxBufOffset]);
       
   270 			if(iStringFound!=-1)
       
   271 				{
       
   272 				iExcessData.Set(iRxBuffer.Right(iRxBuffer.Length()-iRxBufOffset-1));
       
   273 #ifdef __FLOG_ACTIVE
       
   274 				_LIT(logString5,"Script:\tExcess data buffer set to: %S");
       
   275 				TBuf16<KLogBufferSize> temp;
       
   276 				temp.Copy(iExcessData.Left(Min(iExcessData.Length(),KLogBufferSize)));
       
   277 				__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString5()),&temp);
       
   278 #endif
       
   279 				break;
       
   280 				}
       
   281 			}
       
   282 		}
       
   283 	else
       
   284 		iStringFound=KErrNotFound;
       
   285 
       
   286 	if(iStringFound!=KErrNotFound)
       
   287 		{
       
   288 		iChat->StopTimer();
       
   289 		TRAPD(ret,iScriptExecutor->CompletedReadL(aStatus,iStringFound));
       
   290 		if (KErrNone != ret)
       
   291 			{
       
   292 			__FLOG_STMT(_LIT8(logString9,"Script:\tCompleteReadL Failure");)
       
   293 			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString9());
       
   294 			}
       
   295 		}
       
   296 	else
       
   297 		{
       
   298 		iReadPending=ETrue;
       
   299 		CommReadOneOrMore(iRxBuffer);
       
   300 		}
       
   301 	}
       
   302 
       
   303 void CScriptIO::CommWriteComplete(TInt aStatus)
       
   304 /**
       
   305 Writes completely - stops timer
       
   306 */
       
   307 	{
       
   308 	__FLOG_STMT(_LIT8(logString,"Script:\tWrite Complete");)
       
   309 	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
       
   310 	iChat->StopTimer();
       
   311 	if(aStatus==KErrCommsLineFail)
       
   312  		{
       
   313  		__FLOG_STMT(_LIT8(logString2,"Script:\tComms Error %d");)
       
   314  		__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),logString2(),aStatus);
       
   315  		iWritePending=EFalse;
       
   316  		iScriptExecutor->CompletedWrite(KErrCommsLineFail);
       
   317  		return;
       
   318  		}
       
   319 	__ASSERT_ALWAYS(iWritePending,NetDialPanic(EIllegalWriteComplete));
       
   320 	iWritePending=EFalse;
       
   321 	if(aStatus==KErrCommsFrame)		// ignore Comms Frame Error
       
   322 		aStatus=KErrNone;
       
   323 	iScriptExecutor->CompletedWrite(aStatus);
       
   324 	}
       
   325 
       
   326 void CScriptIO::ChatStringMatch(TInt aIndex)
       
   327 /**
       
   328 Logs matching string found and sets iStringFound to aIndex.
       
   329 */
       
   330 	{
       
   331 	__FLOG_STMT(_LIT8(logString,"Script:\tMatching String Found %d");)
       
   332 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC8>(logString()),aIndex);
       
   333 	iStringFound=aIndex;
       
   334 	}
       
   335 
       
   336 void CScriptIO::ChatTimeout()
       
   337 /**
       
   338 Timeout has occurred without while read/write pending.  Calls executor with error.
       
   339 */
       
   340 	{
       
   341 	CommCancel();
       
   342 	if(iWritePending)
       
   343 		{
       
   344 		__FLOG_STMT(_LIT8(logString1,"Script:\tWrite Chat Time Out");)
       
   345 		__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString1());
       
   346 		iWritePending=EFalse;
       
   347 		iScriptExecutor->CompletedWrite(KErrTimedOut);
       
   348 		}
       
   349 	else if(iReadPending)
       
   350 		{
       
   351 		__FLOG_STMT(_LIT8(logString2,"Script:\tRead Chat Time Out");)
       
   352 		__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString2());
       
   353 		iReadPending=EFalse;
       
   354 		TRAPD(ret,iScriptExecutor->CompletedReadL(KErrTimedOut));
       
   355 		if (KErrNone != ret)
       
   356 			{
       
   357 			__FLOG_STMT(_LIT8(logString3,"Script:\tCompleteReadL Failure");)
       
   358 			__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString3());
       
   359 			}
       
   360 		}
       
   361 	else
       
   362 		NetDialPanic(EIllegalTimeOutComplete);
       
   363 	}
       
   364 
       
   365 void CScriptIO::Read(CLabelSearchArray* aSearchArray, const TReal& aTimeOut)
       
   366 /**
       
   367 Read from port.
       
   368 */
       
   369 	{
       
   370 	__ASSERT_ALWAYS(aSearchArray!=NULL, NetDialPanic(ENullSearchArray));
       
   371 
       
   372 	iExcessData.Set(NULL,0);	// clear excess data buffer
       
   373 
       
   374 	for(TInt i=0; i<aSearchArray->Count(); i++)
       
   375 		{
       
   376 		iChat->AddString((*aSearchArray)[i]->ChatString());
       
   377 		}
       
   378 	iReadPending=ETrue;
       
   379 	iStringFound=KErrNotFound;
       
   380 //	
       
   381 	TReal realTimeInterval=aTimeOut*KTRealOneSecInMicroSecs;
       
   382 	TInt timeInterval=TInt(realTimeInterval);
       
   383 	if (realTimeInterval>TReal(timeInterval))
       
   384 		timeInterval++;
       
   385 	__FLOG_STMT(_LIT8(logString,"Script:\tRead Pending In %d Microseconds");)
       
   386 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),logString(),timeInterval);
       
   387 //
       
   388 	iChat->StartTimer(timeInterval);
       
   389 	CommReadOneOrMore(iRxBuffer);
       
   390 	iRxBufOffset=0;
       
   391 	}
       
   392 
       
   393 void CScriptIO::ReadEcho()
       
   394 /**
       
   395 Reads echo.
       
   396 */
       
   397 	{
       
   398 	__FLOG_STMT(_LIT8(logString,"Script:\tRead Echo");)
       
   399 	__FLOG_STATIC(KNetDialLogFolder(),KNetDialLogFile(),logString());
       
   400 	iExcessData.Set(NULL,0);	// clear excess data buffer
       
   401 
       
   402 	iReadPending=ETrue;
       
   403 	iChat->StartTimer(KMaxTInt);
       
   404 	CommReadOneOrMore(iRxBuffer);
       
   405 	iRxBufOffset=0;
       
   406 	}
       
   407 
       
   408 void CScriptIO::Write(const TDesC8& aString)
       
   409 /**
       
   410 Writes to port - start pre-send pause, when it completes, will start write.
       
   411 */
       
   412 	{
       
   413 	if (aString.Length()>KTxBufferSize)
       
   414 		iTxBuffer.Copy(aString.Left(KTxBufferSize));
       
   415 	else
       
   416 		iTxBuffer.Copy(aString);
       
   417 	__ASSERT_ALWAYS(!iWritePending, NetDialPanic(EIllegalWritePending));
       
   418 	iWritePending=ETrue;
       
   419 	iPreSendPause->Start();
       
   420 	}
       
   421 
       
   422 void CScriptIO::PreSendPauseCompleted()
       
   423 /**
       
   424 PreSend pause is finished, can now do write.
       
   425 */
       
   426 	{
       
   427 #ifdef __FLOG_ACTIVE
       
   428 	_LIT(logString,"Tx:\t%S");
       
   429 	TBuf16<KLogBufferSize> temp;
       
   430 	temp.Copy(iTxBuffer.Left(Min(iTxBuffer.Length(),KLogBufferSize)));
       
   431 	__FLOG_STATIC1(KNetDialLogFolder(),KNetDialLogFile(),TRefByValue<const TDesC>(logString()),&temp);
       
   432 #endif
       
   433 	CommWrite(iTxBuffer);
       
   434 	iChat->StartTimer(KWriteTimeOutSec*KOneSecInMicroSecs);
       
   435 	}
       
   436 
       
   437 TBool CScriptIO::RWPending()
       
   438 /**
       
   439 Returns true if a read or write is pending.
       
   440 */
       
   441 	{
       
   442 	return (iWritePending)||(iReadPending);
       
   443 	}
       
   444 
       
   445 TInt CScriptIO::GetExcessData(TDes8& aBuffer)
       
   446 /**
       
   447 Gets excess data.
       
   448 */
       
   449 	{
       
   450 	TInt len=aBuffer.Length();
       
   451 	if(iExcessData.Length()>len)
       
   452 		aBuffer.Copy(iExcessData.Right(len));
       
   453 	else
       
   454 		aBuffer.Copy(iExcessData);
       
   455 	return KErrNone;
       
   456 	}
       
   457 
       
   458 void CScriptIO::Disconnect()
       
   459 /**
       
   460 Disconnection - resets handshaking and closes comm port.
       
   461 */
       
   462 	{
       
   463 	Cancel();
       
   464 /*	TCommConfig cbuf;
       
   465 	TCommConfigV01 &cfg=cbuf();
       
   466 	iCommPort.Config(cbuf);
       
   467 	cfg.iHandshake = KConfigFreeRTS	| KConfigFreeDTR;
       
   468 	iCommPort.SetConfig(cbuf);		// ignore return value
       
   469 	iCommPort.SetSignalsToSpace(KSignalRTS | KSignalDTR);
       
   470 */
       
   471 	// Don't issue a CommClose() if we have already issued it before.
       
   472 	if (!iCommClosed)
       
   473 		{
       
   474 		CommClose();
       
   475 		}
       
   476 	}
       
   477 
       
   478 void CScriptIO::ReConfigureAndCancelPort(TRequestStatus& aStatus)
       
   479 /**
       
   480 Cancels and reconfigures Comm Port to allow RTS and DTR to be subsequently dropped (see also DropSignals()).
       
   481 
       
   482 @param aStatus TRequestStatus to complete once Comm Port is configured.
       
   483 */
       
   484 	{
       
   485 	using namespace BasebandChannelAdaptation;
       
   486 
       
   487 	Cancel();
       
   488 
       
   489 	// Someone has (presumably accidentally) defined Ioctls KSerialConfig and KSerialSetConfig as
       
   490 	// requiring a package buffer within a package buffer, hence the use of "()()".
       
   491 	iConfig()().iHandshake = KConfigFreeRTS | KConfigFreeDTR;
       
   492 
       
   493 	iBca->Ioctl(aStatus, KBcaOptLevelExtSerial, KSerialSetConfig, iConfig);
       
   494 	}
       
   495 
       
   496 void CScriptIO::DropSignals(TRequestStatus& aStatus)
       
   497 /**
       
   498 Drop RTS and DTR.  Occurs once ReConfigureAndCancelPort() has released the signals.
       
   499 
       
   500 @param aStatus TRequestStatus to complete once signals have been dropped.
       
   501 */
       
   502 	{
       
   503 	SetControlLines(&aStatus, 0, KSignalRTS | KSignalDTR);
       
   504 	}
       
   505 
       
   506 void CScriptIO::Cancel()
       
   507 /**
       
   508 Cancel - cancels timers and read/write
       
   509 */
       
   510 	{
       
   511 	
       
   512 	CommCancel();
       
   513 	if (iPreSendPause)
       
   514 		{
       
   515 		iPreSendPause->Cancel();
       
   516 		}
       
   517 	iReadPending=EFalse;
       
   518 	iWritePending=EFalse;
       
   519 	iExcessData.Set(NULL,0);
       
   520 	if (iChat)
       
   521 		{
       
   522 		iChat->StopTimer();
       
   523 		iChat->DeleteAllAndStop();
       
   524 		}
       
   525 	}
       
   526 
       
   527 
       
   528 void CScriptIO::ReadEchoCancel()
       
   529 /**
       
   530 Cancel read - cancels timers and read
       
   531 */
       
   532 	{
       
   533 	
       
   534 	CommReadCancel();
       
   535 	iReadPending=EFalse;
       
   536 	iExcessData.Set(NULL,0);
       
   537 	iChat->StopTimer();
       
   538 	}
       
   539 
       
   540 void CScriptIO::DropDTR(TRequestStatus* aStatusPtr)
       
   541 /**
       
   542 Drop DTR.
       
   543 */
       
   544 	{
       
   545 	Cancel();
       
   546 	SetControlLines(aStatusPtr, 0, KSignalDTR);
       
   547 	}
       
   548 
       
   549 
       
   550 void CScriptIO::RaiseDTR(TRequestStatus* aStatusPtr)
       
   551 /**
       
   552 Raide DTR.
       
   553 */
       
   554 	{
       
   555 	Cancel();
       
   556 	SetControlLines(aStatusPtr, KSignalDTR, 0);
       
   557 	}
       
   558 
       
   559 void CScriptIO::SetControlLines(TRequestStatus* aStatusPtr, TUint aSetMask, TUint aClearMask)
       
   560 /**
       
   561 Issue request to BCA to alter control lines.
       
   562 */
       
   563 	{
       
   564 	using namespace BasebandChannelAdaptation;
       
   565 	TPckgBuf<TSerialSetControlLines> lines;
       
   566 	lines().iSetMask = aSetMask;
       
   567 	lines().iClearMask = aClearMask;
       
   568 	if (aStatusPtr == NULL)
       
   569 		{
       
   570 		// During conversion from RComm to BCA, synchronous behaviour was allowed in this particular circumstance.
       
   571 		// This is to avoid wholesale changes to the CSD Agent to accomodate rarely (if ever) traversed
       
   572 		// code paths.  The original RComm based code would previously issue a synchronous RComm::SetSignals()
       
   573 		// call at this point, so the synchronous behaviour here is no worse than before.
       
   574 		TRequestStatus status;
       
   575 		iBca->Ioctl(status, KBcaOptLevelExtSerial, KSerialSetControlLines, lines);
       
   576 		User::WaitForRequest(status);
       
   577 		}
       
   578 	else
       
   579 		{
       
   580 		iBca->Ioctl(*aStatusPtr, KBcaOptLevelExtSerial, KSerialSetControlLines, lines);
       
   581 		}
       
   582 	}
       
   583 
       
   584 const TDesC& CScriptIO::BcaStack()
       
   585 	{
       
   586 	ASSERT(iScriptExecutor);
       
   587 	return iScriptExecutor->BcaStack();
       
   588 	}
       
   589 
       
   590 TInt CScriptIO::IapId()
       
   591 	{
       
   592 	ASSERT(iScriptExecutor);
       
   593 	return iScriptExecutor->IapId();
       
   594 	}
       
   595 
       
   596 // CPreSendPause definitions
       
   597 
       
   598 CPreSendPause* CPreSendPause::NewL(CScriptIO* aNotifier)
       
   599 /**
       
   600 2 phased constructor for CPreSendPause, first phase.
       
   601 
       
   602 @param aNotifier a pointer to script IO notifier.
       
   603 @exception Leaves if ConstructL() leaves, or not enough memory is available.
       
   604 @return a new CPreSendPause object.
       
   605 */
       
   606 	{
       
   607 	CPreSendPause* p=new(ELeave) CPreSendPause(aNotifier);
       
   608 	CleanupStack::PushL(p);
       
   609 	p->ConstructL(); // CTimer::ConstructL()
       
   610 	CleanupStack::Pop();
       
   611 	return p;
       
   612 	}
       
   613 
       
   614 CPreSendPause::CPreSendPause(CScriptIO* aNotifier) 
       
   615 	: CTimer(EPriorityStandard), iNotifier(aNotifier)
       
   616 /**
       
   617 Constructor for CScriptCharacterConverter, used in the first phase of construction.
       
   618 */
       
   619 	{
       
   620 	CActiveScheduler::Add(this);
       
   621 	}
       
   622 
       
   623 void CPreSendPause::Start()
       
   624 /**
       
   625 Starts timer.
       
   626 */
       
   627 	{
       
   628 	After(KPreSendPauseTimeMicroSec);
       
   629 	}
       
   630 
       
   631 void CPreSendPause::RunL()
       
   632 /**
       
   633 Notifies script IO that pause complete.
       
   634 */
       
   635 	{
       
   636 	iNotifier->PreSendPauseCompleted();
       
   637 	}