haitest/bspsvs/suite/e32/src/T_RBusDevCommData.cpp
changeset 0 cec860690d41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/haitest/bspsvs/suite/e32/src/T_RBusDevCommData.cpp	Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,1121 @@
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+#include "T_RBusDevCommData.h"
+#include "T_TCommCapsV01Data.h"
+#include "T_TCommConfigV01Data.h"
+
+/*@{*/
+_LIT(KStrNull,								" ");
+
+_LIT(KCmdConstructor,						"new");
+_LIT(KCmdDestructor,						"~");
+_LIT(KCmdBreak,								"Break");
+_LIT(KCmdBreakCancel,						"BreakCancel");
+_LIT(KCmdCaps,								"Caps");
+_LIT(KCmdConfig,							"Config");
+_LIT(KCmdMinTurnaroundTime,					"MinTurnaroundTime");
+_LIT(KCmdNotifyReceiveDataAvailable,		"NotifyReceiveDataAvailable");
+_LIT(KCmdNotifyReceiveDataAvailableCancel,	"NotifyReceiveDataAvailableCancel");
+_LIT(KCmdNotifySignalChange,				"NotifySignalChange");
+_LIT(KCmdNotifySignalChangeCancel,			"NotifySignalChangeCancel");
+_LIT(KCmdOpen,								"Open");
+_LIT(KCmdQueryReceiveBuffer,				"QueryReceiveBuffer");
+_LIT(KCmdRead,								"Read");
+_LIT(KCmdReadCancel,						"ReadCancel");
+_LIT(KCmdReadOneOrMore,						"ReadOneOrMore");
+_LIT(KCmdReceiveBufferLength,				"ReceiveBufferLength");
+_LIT(KCmdResetBuffers,						"ResetBuffers");
+_LIT(KCmdSetConfig,							"SetConfig");
+_LIT(KCmdSetMinTurnaroundTime,				"SetMinTurnaroundTime");
+_LIT(KCmdSetReceiveBufferLength,			"SetReceiveBufferLength");
+_LIT(KCmdSetSignals,						"SetSignals");
+_LIT(KCmdSignals,							"Signals");
+_LIT(KCmdVersionRequired,					"VersionRequired");
+_LIT(KCmdWrite,								"Write");
+_LIT(KCmdWriteCancel,						"WriteCancel");
+
+_LIT(KFldBufferLength,						"bufferlength");
+_LIT(KFldCaps,								"caps");
+_LIT(KFldClearMask,							"clearmask");
+_LIT(KFldConfig,							"config");
+_LIT(KFldData,								"data");
+_LIT(KFldExpected,							"expected");
+_LIT(KFldExpectedFile,						"expected_file");
+_LIT(KFldFile,								"file");
+_LIT(KFldIsEmpty,							"is_empty");
+_LIT(KFldMask,								"mask");
+_LIT(KFldPortPDD,							"portpdd");
+_LIT(KFldPortLDD,							"portldd");
+_LIT(KFldRepeat,							"repeat");
+_LIT(KFldSave,								"save");
+_LIT(KFldSetMask,							"setmask");
+_LIT(KFldTime,								"time");
+_LIT(KFldTimeOut,							"timeout");
+_LIT(KFldUnit,								"unit");
+_LIT(KFldUseLength,							"uselength");
+_LIT(KFldValue,								"value");
+_LIT(KFldVersionName,						"version_name");
+_LIT(KFldVersionBuild,						"version_build");
+_LIT(KFldVersionMajor,						"version_major");
+_LIT(KFldVersionMinor,						"version_minor");
+
+_LIT(KLogError,								"Error=%d");
+_LIT(KLogErrorBufferLength,					"Buffer Length %d must be greater than 0");
+_LIT(KLogErrorExpectedValue,				"Expected Value does not match actual");
+_LIT(KLogErrorExpectedSignal,				"Expected Signal %d does not match actual %d");
+_LIT(KLogMissingParameter,					"Missing parameter '%S'");
+_LIT(KLogNullCapsData,						"Caps Data - '%S' is NULL");
+_LIT(KLogNullConfigData,					"Config Data - '%S' is NULL");
+_LIT(KLogLoadPhysicalDeviceError,			"Load Physical Device '%S' error=%d");
+_LIT(KLogLoadLogicalDeviceError,			"Load Logical Device '%S' error=%d");
+/*@}*/
+
+_LIT(KStrKSignalCTS,						"KSignalCTS");
+_LIT(KStrKSignalDSR,						"KSignalDSR");
+_LIT(KStrKSignalDCD,						"KSignalDCD");
+_LIT(KStrKSignalRNG,						"KSignalRNG");
+_LIT(KStrKSignalRTS,						"KSignalRTS");
+_LIT(KStrKSignalDTR,						"KSignalDTR");
+_LIT(KStrKSignalBreak,						"KSignalBreak");
+const CDataWrapperBase::TEnumEntryTable	CT_RBusDevCommData::iEnumTableSignals[] =
+	{
+//	Enum as a descriptor					Enum
+	KStrKSignalCTS,							KSignalCTS,
+	KStrKSignalDSR,							KSignalDSR,
+	KStrKSignalDCD,							KSignalDCD,
+	KStrKSignalRNG,							KSignalRNG,
+	KStrKSignalRTS,							KSignalRTS,
+	KStrKSignalDTR,							KSignalDTR,
+	KStrKSignalBreak,						KSignalBreak,
+	KStrNull,								-1
+	};
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CT_RBusDevCommData* CT_RBusDevCommData::NewL()
+	{
+	CT_RBusDevCommData*	ret=new (ELeave) CT_RBusDevCommData();
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;
+	}
+
+CT_RBusDevCommData::CT_RBusDevCommData()
+:	CT_RBusLogicalChannelData()
+,	iBusDevComm(NULL)
+,	iBufferRead(NULL)
+,	iBufferReadPtr(NULL, 0)
+,	iBufferReadOneOrMorePtr(NULL, 0)
+,	iReadOneOrMoreLeft(0)
+,	iHasReadExpected(EFalse)
+,	iBufferLength(0)
+,	iMinTurnaroundTime(0)
+,	iReceiveBufferLength(0)
+,	iSignals(0)
+,	iNotifySignals(0)
+,	iHasNotifySignalsExpected(EFalse)
+,	iNotifySignalsExpected(0)
+,	iCallbackBreak(NULL)
+,	iCallbackNotifyReceiveDataAvailable(NULL)
+,	iCallbackNotifySignalChange(NULL)
+,	iCallbackRead(NULL)
+,	iCallbackReadOneOrMore(NULL)
+,	iCallbackWrite(NULL)
+	{
+	}
+
+CT_RBusDevCommData::~CT_RBusDevCommData()
+/**
+ * Public destructor
+ */
+	{
+	DestroyData();
+
+	delete iBufferRead;
+	iBufferRead=NULL;
+
+	delete iCallbackWrite;
+	iCallbackWrite=NULL;
+
+	delete iCallbackReadOneOrMore;
+	iCallbackReadOneOrMore=NULL;
+
+	delete iCallbackRead;
+	iCallbackRead=NULL;
+
+	delete iCallbackNotifySignalChange;
+	iCallbackNotifySignalChange=NULL;
+
+	delete iCallbackNotifyReceiveDataAvailable;
+	iCallbackNotifyReceiveDataAvailable=NULL;
+
+	delete iCallbackBreak;
+	iCallbackBreak=NULL;
+	}
+
+void CT_RBusDevCommData::ConstructL()
+	{
+	iCallbackBreak						=CActiveCallbackBase::NewL(*this);
+	iCallbackNotifyReceiveDataAvailable	=CActiveCallbackBase::NewL(*this);
+	iCallbackNotifySignalChange			=CActiveCallbackBase::NewL(*this);
+	iCallbackRead						=CT_ActiveCallbackIO::NewL(*this);
+	iCallbackReadOneOrMore				=CT_ActiveCallbackIO::NewL(*this);
+	iCallbackWrite						=CT_ActiveCallbackIO::NewL(*this);
+	}
+
+void CT_RBusDevCommData::DestroyData()
+	{
+	delete iBusDevComm;
+	iBusDevComm=NULL;
+	}
+
+TAny* CT_RBusDevCommData::GetObject()
+/**
+ * Return a pointer to the object that the data wraps
+ *
+ * @return	pointer to the object that the data wraps
+ */
+	{
+	return iBusDevComm;
+	}
+
+RHandleBase* CT_RBusDevCommData::GetHandleBase()
+	{
+	return iBusDevComm;
+	}
+
+RBusLogicalChannel* CT_RBusDevCommData::GetBusLogicalChannel()
+	{
+	return iBusDevComm;
+	}
+
+void CT_RBusDevCommData::PrepareReadExpectedBufferLengthL(CT_ActiveCallbackIO& aCallback, const TDesC& aSection)
+	{
+	TInt	repeat=1;
+	GetIntFromConfig(aSection, KFldRepeat, repeat);
+
+	TPtrC	readExpected;
+	iHasReadExpected=GetStringFromConfig(aSection, KFldExpected, readExpected);
+	if ( iHasReadExpected )
+		{
+		aCallback.PrepareFromStringL(repeat, readExpected);
+		iBufferLength=aCallback.BufferLength();
+		}
+	else
+		{
+		iHasReadExpected=GetStringFromConfig(aSection, KFldExpectedFile, readExpected);
+		if ( iHasReadExpected )
+			{
+			aCallback.PrepareFromFileL(repeat, readExpected);
+			}
+		}
+
+	if ( iHasReadExpected )
+		{
+		iBufferLength=aCallback.BufferLength();
+		}
+
+	GetIntFromConfig(aSection, KFldBufferLength, iBufferLength);
+	if ( iBufferLength <= 0 )
+		{
+		ERR_PRINTF2(KLogErrorBufferLength, iBufferLength);
+		SetBlockResult(EFail);
+		}
+	}
+
+TBool CT_RBusDevCommData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand			The command to process
+ * @param aSection			The section in the ini containing data for the command
+ * @param aAsyncErrorIndex	Command index for async calls to return errors to
+ *
+ * @return					ETrue if the command is processed
+ *
+ * @leave					System wide error
+ */
+	{
+	TBool	ret=ETrue;
+	TInt	err=KErrNone;
+
+	if ( aCommand==KCmdConstructor )
+		{
+		err=DoCmdConstructor();
+		}
+	else if ( aCommand==KCmdDestructor )
+		{
+		DoCmdDestructor();
+		}
+	else if ( aCommand==KCmdBreak )
+		{
+		DoCmdBreak(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdBreakCancel )
+		{
+		DoCmdBreakCancel();
+		}
+	else if ( aCommand==KCmdCaps )
+		{
+		DoCmdCapsL(aSection);
+		}
+	else if ( aCommand==KCmdConfig )
+		{
+		DoCmdConfigL(aSection);
+		}
+	else if ( aCommand==KCmdMinTurnaroundTime )
+		{
+		DoCmdMinTurnaroundTime(aSection);
+		}
+	else if ( aCommand==KCmdNotifyReceiveDataAvailable )
+		{
+		DoCmdNotifyReceiveDataAvailable(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdNotifyReceiveDataAvailableCancel )
+		{
+		DoCmdNotifyReceiveDataAvailableCancel();
+		}
+	else if ( aCommand==KCmdNotifySignalChange )
+		{
+		DoCmdNotifySignalChange(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdNotifySignalChangeCancel )
+		{
+		DoCmdNotifySignalChangeCancel();
+		}
+	else if ( aCommand==KCmdOpen )
+		{
+		err=DoCmdOpen(aSection);
+		}
+	else if ( aCommand==KCmdQueryReceiveBuffer )
+		{
+		err=DoCmdQueryReceiveBuffer(aSection);
+		}
+	else if ( aCommand==KCmdRead )
+		{
+		DoCmdReadL(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdReadCancel )
+		{
+		DoCmdReadCancel();
+		}
+	else if ( aCommand==KCmdReadOneOrMore )
+		{
+		DoCmdReadOneOrMoreL(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdReceiveBufferLength )
+		{
+		DoCmdReceiveBufferLength(aSection);
+		}
+	else if ( aCommand==KCmdResetBuffers )
+		{
+		DoCmdResetBuffers();
+		}
+	else if ( aCommand==KCmdSetConfig )
+		{
+		err=DoCmdSetConfigL(aSection);
+		}
+	else if ( aCommand==KCmdSetMinTurnaroundTime )
+		{
+		err=DoCmdSetMinTurnaroundTime(aSection);
+		}
+	else if ( aCommand==KCmdSetReceiveBufferLength )
+		{
+		err=DoCmdSetReceiveBufferLength(aSection);
+		}
+	else if ( aCommand==KCmdSetSignals )
+		{
+		DoCmdSetSignals(aSection);
+		}
+	else if ( aCommand==KCmdSignals )
+		{
+		DoCmdSignals(aSection);
+		}
+	else if ( aCommand==KCmdVersionRequired )
+		{
+		DoCmdVersionRequired(aSection);
+		}
+	else if ( aCommand==KCmdWrite )
+		{
+		DoCmdWriteL(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdWriteCancel )
+		{
+		DoCmdWriteCancel();
+		}
+	else
+		{
+		ret=CT_RBusLogicalChannelData::DoCommandL(aCommand, aSection, aAsyncErrorIndex);
+		}
+
+	if ( err!=KErrNone )
+		{
+		ERR_PRINTF2(KLogError, err);
+		SetError(err);
+		}
+
+	return ret;
+	}
+
+TInt CT_RBusDevCommData::DoCmdConstructor()
+	{
+	DestroyData();
+	TRAPD(err, iBusDevComm=new (ELeave) RBusDevComm());
+	return err;
+	}
+
+void CT_RBusDevCommData::DoCmdDestructor()
+	{
+	DestroyData();
+	}
+
+void CT_RBusDevCommData::DoCmdBreak(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	TInt	timeOut=0;
+	GetIntFromConfig(aSection, KFldTimeOut, timeOut);
+
+	TInt	time;
+	if ( !GetIntFromConfig(aSection, KFldTime, time) )
+		{
+		ERR_PRINTF2(KLogMissingParameter, &KFldTime());
+		SetBlockResult(EFail);
+		}
+	else
+		{
+		INFO_PRINTF1(_L("Break"));
+		iBusDevComm->Break(iCallbackBreak->iStatus, time);
+		iCallbackBreak->Activate(aAsyncErrorIndex, timeOut);
+		IncOutstanding();
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdBreakCancel()
+	{
+	INFO_PRINTF1(_L("BreakCancel"));
+	iBusDevComm->BreakCancel();
+	}
+
+void CT_RBusDevCommData::DoCmdCapsL(const TDesC& aSection)
+	{
+	TPtrC	dataName;
+	if ( GetStringFromConfig(aSection, KFldCaps, dataName) )
+		{
+		CT_TCommCapsV01Data*	wrapper=static_cast<CT_TCommCapsV01Data*>(GetDataWrapperL(dataName));
+		TDes8*					data=wrapper->Descriptor();
+		if ( data!=NULL )
+			{
+			INFO_PRINTF1(_L("Caps"));
+			iBusDevComm->Caps(*data);
+			}
+		else
+			{
+			ERR_PRINTF2(KLogNullCapsData, &dataName);
+			SetBlockResult(EFail);
+			}
+		}
+	else
+		{
+		ERR_PRINTF2(KLogMissingParameter, &KFldCaps());
+		SetBlockResult(EFail);
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdConfigL(const TDesC& aSection)
+	{
+	TPtrC	dataName;
+	if ( GetStringFromConfig(aSection, KFldConfig, dataName) )
+		{
+		CT_TCommConfigV01Data*	wrapper=static_cast<CT_TCommConfigV01Data*>(GetDataWrapperL(dataName));
+		TDes8*					data=wrapper->Descriptor();
+		if ( data!=NULL )
+			{
+			INFO_PRINTF1(_L("Config"));
+			iBusDevComm->Config(*data);
+			}
+		else
+			{
+			ERR_PRINTF2(KLogNullConfigData, &dataName);
+			SetBlockResult(EFail);
+			}
+		}
+	else
+		{
+		ERR_PRINTF2(KLogMissingParameter, &KFldConfig());
+		SetBlockResult(EFail);
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdMinTurnaroundTime(const TDesC& aSection)
+	{
+	TUint	actual=iBusDevComm->MinTurnaroundTime();
+	INFO_PRINTF2(_L("MinTurnaroundTime : %d"), actual);
+
+	TUint	expected;
+	if ( GetUintFromConfig(aSection, KFldExpected(), expected) )
+		{
+		if ( expected!=actual )
+			{
+			ERR_PRINTF1(KLogErrorExpectedValue);
+			SetBlockResult(EFail);
+			}
+		}
+
+	TBool	save=EFalse;
+	GetBoolFromConfig(aSection, KFldSave(), save);
+	if ( save )
+		{
+		iMinTurnaroundTime=actual;
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdNotifyReceiveDataAvailable(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	TInt	timeOut=0;
+	GetIntFromConfig(aSection, KFldTimeOut, timeOut);
+
+	INFO_PRINTF1(_L("NotifyReceiveDataAvailable"));
+	iBusDevComm->NotifyReceiveDataAvailable(iCallbackNotifyReceiveDataAvailable->iStatus);
+	iCallbackNotifyReceiveDataAvailable->Activate(aAsyncErrorIndex, timeOut);
+	IncOutstanding();
+	}
+
+void CT_RBusDevCommData::DoCmdNotifyReceiveDataAvailableCancel()
+	{
+	INFO_PRINTF1(_L("NotifyReceiveDataAvailableCancel"));
+	iBusDevComm->NotifyReceiveDataAvailableCancel();
+	}
+
+void CT_RBusDevCommData::DoCmdNotifySignalChange(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	TInt	timeOut=0;
+	GetIntFromConfig(aSection, KFldTimeOut, timeOut);
+
+	iHasNotifySignalsExpected=GetOrFromConfig(aSection, KFldExpected(), iEnumTableSignals, iNotifySignalsExpected);
+
+	TUint	mask;
+	if ( GetOrFromConfig(aSection, KFldMask(), iEnumTableSignals, mask) )
+		{
+		INFO_PRINTF1(_L("NotifySignalChange with mask"));
+		iBusDevComm->NotifySignalChange(iCallbackNotifySignalChange->iStatus, iNotifySignals, mask);
+		}
+	else
+		{
+		INFO_PRINTF1(_L("NotifySignalChange without mask"));
+		iBusDevComm->NotifySignalChange(iCallbackNotifySignalChange->iStatus, iNotifySignals);
+		}
+	iCallbackNotifySignalChange->Activate(aAsyncErrorIndex, timeOut);
+	IncOutstanding();
+	}
+
+void CT_RBusDevCommData::DoCmdNotifySignalChangeCancel()
+	{
+	INFO_PRINTF1(_L("NotifySignalChangeCancel"));
+	iBusDevComm->NotifySignalChangeCancel();
+	}
+
+TInt CT_RBusDevCommData::DoCmdOpen(const TDesC& aSection)
+	{
+	TBool	dataOk=ETrue;
+
+	TPtrC	pdd;
+	if ( GetStringFromConfig(aSection, KFldPortPDD, pdd) && pdd.Length()!=0 )
+		{
+		TInt	errLoad=User::LoadPhysicalDevice(pdd);
+		if ( (errLoad!=KErrNone) && (errLoad!=KErrAlreadyExists) )
+			{
+			dataOk=EFalse;
+			ERR_PRINTF3(KLogLoadPhysicalDeviceError, &pdd, errLoad);
+			SetBlockResult(EFail);
+			}
+		}
+
+	TPtrC	ldd;
+	if ( GetStringFromConfig(aSection, KFldPortLDD, ldd) && ldd.Length()!=0 )
+		{
+		TInt	errLoad=User::LoadLogicalDevice(ldd);
+		if ( (errLoad!=KErrNone) && (errLoad!=KErrAlreadyExists) )
+			{
+			dataOk=EFalse;
+			ERR_PRINTF3(KLogLoadLogicalDeviceError, &ldd, errLoad);
+			SetBlockResult(EFail);
+			}
+		}
+
+	TInt	unit;
+	if ( !GetIntFromConfig(aSection, KFldUnit, unit) )
+		{
+		dataOk=EFalse;
+		ERR_PRINTF2(KLogMissingParameter, &KFldUnit());
+		SetBlockResult(EFail);
+		}
+
+	TInt	err=KErrNone;
+	if ( dataOk )
+		{
+		INFO_PRINTF1(_L("Open"));
+		err=iBusDevComm->Open(unit);
+		}
+
+	return err;
+	}
+
+TInt CT_RBusDevCommData::DoCmdQueryReceiveBuffer(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("QueryReceiveBuffer"));
+	TInt	actual=iBusDevComm->QueryReceiveBuffer();
+	TInt	ret=KErrNone;
+	if ( actual<0 )
+		{
+		ret=actual;
+		}
+	else
+		{
+		TInt	expected;
+		if ( GetIntFromConfig(aSection, KFldExpected(), expected) )
+			{
+			if ( expected!=actual )
+				{
+				ERR_PRINTF1(KLogErrorExpectedValue);
+				SetBlockResult(EFail);
+				}
+			}
+
+		TBool	isEmpty;
+		if ( GetBoolFromConfig(aSection, KFldIsEmpty(), isEmpty) )
+			{
+			if ( isEmpty )
+				{
+				if ( actual!=0 )
+					{
+					ERR_PRINTF1(KLogErrorExpectedValue);
+					SetBlockResult(EFail);
+					}
+				}
+			else
+				{
+				if ( actual==0 )
+					{
+					ERR_PRINTF1(KLogErrorExpectedValue);
+					SetBlockResult(EFail);
+					}
+				}
+			}
+
+		TBool	save=EFalse;
+		GetBoolFromConfig(aSection, KFldSave(), save);
+		if ( save )
+			{
+			iBufferLength=actual;
+			}
+		}
+
+	return ret;
+	}
+
+void CT_RBusDevCommData::DoCmdReadL(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	TInt	timeOut=0;
+	GetIntFromConfig(aSection, KFldTimeOut, timeOut);
+
+	TBool	useLength=EFalse;
+	GetBoolFromConfig(aSection, KFldUseLength(), useLength);
+
+	PrepareReadExpectedBufferLengthL(*iCallbackRead, aSection);
+	if ( iBufferLength>0 )
+		{
+		delete iBufferRead;
+		iBufferRead=HBufC8::New(iBufferLength);
+
+		iBufferReadPtr.Set(iBufferRead->Des());
+		if ( useLength )
+			{
+			INFO_PRINTF2(_L("Read with length %d"), iBufferLength);
+			iBusDevComm->Read(iCallbackRead->iStatus, iBufferReadPtr, iBufferLength);
+			}
+		else
+			{
+			INFO_PRINTF1(_L("Read without length"));
+			iBusDevComm->Read(iCallbackRead->iStatus, iBufferReadPtr);
+			}
+		iCallbackRead->Activate(aAsyncErrorIndex, timeOut);
+		IncOutstanding();
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdReadCancel()
+	{
+	INFO_PRINTF1(_L("ReadCancel"));
+	iBusDevComm->ReadCancel();
+	}
+
+void CT_RBusDevCommData::DoCmdReadOneOrMoreL(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	TInt	timeOut=0;
+	GetIntFromConfig(aSection, KFldTimeOut, timeOut);
+
+	PrepareReadExpectedBufferLengthL(*iCallbackReadOneOrMore, aSection);
+	if ( iBufferLength>0 )
+		{
+		delete iBufferRead;
+		iBufferRead=HBufC8::New(iBufferLength);
+
+		iBufferReadPtr.Set(iBufferRead->Des());
+		iBufferReadPtr.SetLength(iBufferLength);
+		iBufferReadOneOrMorePtr.Set(iBufferRead->Des());
+		iBufferReadOneOrMorePtr.SetLength(iBufferLength);
+		iReadOneOrMoreLeft=iBufferLength;
+		INFO_PRINTF2(_L("iBufferLength=%d"), iBufferLength);
+		INFO_PRINTF2(_L("iBufferRead->MaxLength=%d"), iBufferRead->Des().MaxLength());
+		INFO_PRINTF2(_L("iBufferReadPtr.Length=%d"), iBufferReadPtr.Length());
+		INFO_PRINTF2(_L("iBufferReadPtr.MaxLength=%d"), iBufferReadPtr.MaxLength());
+		INFO_PRINTF1(_L("ReadOneOrMore"));
+		iBusDevComm->ReadOneOrMore(iCallbackReadOneOrMore->iStatus, iBufferReadPtr);
+		iCallbackReadOneOrMore->Activate(aAsyncErrorIndex, timeOut);
+		IncOutstanding();
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdReceiveBufferLength(const TDesC& aSection)
+	{
+	TInt	actual=iBusDevComm->ReceiveBufferLength();
+	INFO_PRINTF2(_L("ReceiveBufferLength : %d"), actual);
+
+	TInt	expected;
+	if ( GetIntFromConfig(aSection, KFldExpected(), expected) )
+		{
+		if ( expected!=actual )
+			{
+			ERR_PRINTF1(KLogErrorExpectedValue);
+			SetBlockResult(EFail);
+			}
+		}
+
+	TBool	save=EFalse;
+	GetBoolFromConfig(aSection, KFldSave(), save);
+	if ( save )
+		{
+		iReceiveBufferLength=actual;
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdResetBuffers()
+	{
+	INFO_PRINTF1(_L("ResetBuffers"));
+	iBusDevComm->ResetBuffers();
+	}
+
+TInt CT_RBusDevCommData::DoCmdSetConfigL(const TDesC& aSection)
+	{
+	TInt	ret=KErrNone;
+
+	TPtrC	dataName;
+	if ( GetStringFromConfig(aSection, KFldConfig, dataName) )
+		{
+		CT_TCommConfigV01Data*	wrapper=static_cast<CT_TCommConfigV01Data*>(GetDataWrapperL(dataName));
+		TDes8*					data=wrapper->Descriptor();
+		if ( data!=NULL )
+			{
+			INFO_PRINTF1(_L("SetConfig"));
+			ret=iBusDevComm->SetConfig(*data);
+			}
+		else
+			{
+			ERR_PRINTF2(KLogNullConfigData, &dataName);
+			SetBlockResult(EFail);
+			}
+		}
+	else
+		{
+		ERR_PRINTF2(KLogMissingParameter, &KFldConfig());
+		SetBlockResult(EFail);
+		}
+
+	return ret;
+	}
+
+TInt CT_RBusDevCommData::DoCmdSetMinTurnaroundTime(const TDesC& aSection)
+	{
+	TUint	value=iMinTurnaroundTime;
+	GetUintFromConfig(aSection, KFldValue(), value);
+
+	INFO_PRINTF1(_L("SetMinTurnaroundTime"));
+	return iBusDevComm->SetMinTurnaroundTime(value);
+	}
+
+TInt CT_RBusDevCommData::DoCmdSetReceiveBufferLength(const TDesC& aSection)
+	{
+	TInt	value=iReceiveBufferLength;
+	GetIntFromConfig(aSection, KFldValue(), value);
+
+	INFO_PRINTF1(_L("SetReceiveBufferLength"));
+	return iBusDevComm->SetReceiveBufferLength(value);
+	}
+
+void CT_RBusDevCommData::DoCmdSetSignals(const TDesC& aSection)
+	{
+	TUint	setMask=iSignals;
+	GetOrFromConfig(aSection, KFldSetMask(), iEnumTableSignals, setMask);
+
+	TUint	clearMask=~setMask;
+	GetOrFromConfig(aSection, KFldClearMask(), iEnumTableSignals, clearMask);
+
+	INFO_PRINTF1(_L("SetSignals"));
+	iBusDevComm->SetSignals(setMask, clearMask);
+	}
+
+void CT_RBusDevCommData::DoCmdSignals(const TDesC& aSection)
+	{
+	TUint	actual=iBusDevComm->Signals();
+	INFO_PRINTF2(_L("Signals:0x%x"), actual);
+
+	TUint	expected;
+	if ( GetOrFromConfig(aSection, KFldExpected(), iEnumTableSignals, expected) )
+		{
+		if ( expected!=actual )
+			{
+			ERR_PRINTF1(KLogErrorExpectedValue);
+			SetBlockResult(EFail);
+			}
+		}
+
+	TBool	save=EFalse;
+	GetBoolFromConfig(aSection, KFldSave(), save);
+	if ( save )
+		{
+		iSignals=actual;
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdVersionRequired(const TDesC& aSection)
+	{
+	TVersion				version=iBusDevComm->VersionRequired();
+	TBuf<KMaxVersionName>	versionName(version.Name());
+
+	INFO_PRINTF2(_L("Version name  : %S"), &versionName);
+	INFO_PRINTF2(_L("Version build : %d"), (TInt)version.iBuild);
+	INFO_PRINTF2(_L("Version major : %d"), (TInt)version.iMajor);
+	INFO_PRINTF2(_L("Version minor : %d"), (TInt)version.iMinor);
+
+	TPtrC	expectedVersionName;
+	if( GetStringFromConfig(aSection, KFldVersionName(), expectedVersionName) )
+		{
+		if( version.Name() != expectedVersionName )
+			{
+			ERR_PRINTF3(_L("Expected Version Name (%S) != Actual Version Name (%S)"), &expectedVersionName, &versionName);
+			SetBlockResult(EFail);	
+			}
+		}
+
+	TInt	intTemp;
+	if( GetIntFromConfig(aSection, KFldVersionBuild(), intTemp) )
+		{
+		if( version.iBuild != intTemp )
+			{
+			ERR_PRINTF3(_L("Expected Version Build (%d) != Actual Version Build (%d)"), intTemp, version.iBuild);
+			SetBlockResult(EFail);
+			}
+		}
+
+	if( GetIntFromConfig(aSection, KFldVersionMajor(), intTemp) )
+		{
+		if( version.iMajor != intTemp )
+			{
+			ERR_PRINTF3(_L("Expected Version Major (%d) != Actual Version Major (%d)"), intTemp, version.iMajor);
+			SetBlockResult(EFail);
+			}
+		}
+
+	if( GetIntFromConfig(aSection, KFldVersionMinor(), intTemp) )
+		{
+		if( version.iMinor != intTemp )
+			{
+			ERR_PRINTF3(_L("Expected Version Minor (%d) != Actual Version Minor (%d)"), intTemp, version.iMinor);
+			SetBlockResult(EFail);
+			}
+		}
+
+	if (version.Name() == _L("") && version.iBuild == 0 && version.iMajor == 0 && version.iMinor == 0)
+		{
+		ERR_PRINTF1(_L("Some version fields are not set!"));
+		SetBlockResult(EFail);
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdWriteL(const TDesC& aSection, const TInt aAsyncErrorIndex)
+	{
+	TBool	dataOk=ETrue;
+	TBool	useLength=EFalse;
+	GetBoolFromConfig(aSection, KFldUseLength(), useLength);
+
+	TInt	timeOut=0;
+	GetIntFromConfig(aSection, KFldTimeOut, timeOut);
+
+	TInt	repeat=1;
+	GetIntFromConfig(aSection, KFldRepeat, repeat);
+
+	TPtrC	data;
+	if ( GetStringFromConfig(aSection, KFldData, data) )
+		{
+		iCallbackWrite->PrepareFromStringL(repeat, data);
+		}
+	else
+		{
+		if ( GetStringFromConfig(aSection, KFldFile, data) )
+			{
+			iCallbackWrite->PrepareFromFileL(repeat, data);
+			}
+		else
+			{
+			dataOk=EFalse;
+			ERR_PRINTF2(KLogMissingParameter, &KFldData);
+			ERR_PRINTF2(KLogMissingParameter, &KFldFile);
+			SetBlockResult(EFail);
+			}
+		}
+
+	if ( dataOk )
+		{
+		iBufferLength=iCallbackWrite->BufferLength();
+
+		if ( useLength )
+			{
+			INFO_PRINTF2(_L("Write with length %d"), iBufferLength);
+			iBusDevComm->Write(iCallbackWrite->iStatus, iCallbackWrite->Buffer(), iBufferLength);
+			}
+		else
+			{
+			INFO_PRINTF1(_L("Write without length"));
+			iBusDevComm->Write(iCallbackWrite->iStatus, iCallbackWrite->Buffer());
+			}
+		iCallbackWrite->Activate(aAsyncErrorIndex, timeOut);
+		IncOutstanding();
+		}
+	}
+
+void CT_RBusDevCommData::DoCmdWriteCancel()
+	{
+	INFO_PRINTF1(_L("WriteCancel"));
+	iBusDevComm->WriteCancel();
+	}
+
+void CT_RBusDevCommData::RunL(CActive* aActive, TInt aIndex)
+/**
+ Virtual RunL - Called on completion of an asynchronous command
+ @internalComponent
+ @see MTPActiveCallback
+ @param aActive Active Object that RunL has been called on
+ @pre N/A
+ @post N/A
+ @leave system wide error code
+*/
+	{
+	TBool	activeOk=ETrue;
+	TInt	err=KErrNone;
+
+	if ( aActive!=NULL )
+		{
+		err=aActive->iStatus.Int();
+		}
+
+	if ( aActive==iCallbackRead )
+		{
+		iCallbackRead->KillTimer();
+		INFO_PRINTF1(_L("RunL: Read()"));
+
+		if ( err==KErrNone )
+			{
+			TInt	length=iBufferReadPtr.Length();
+			HBufC*	bufferRead=HBufC::NewLC(length);
+			bufferRead->Des().Copy(iBufferReadPtr);
+			INFO_PRINTF2(_L("Received Data Length:%d"), length);
+			if ( iHasReadExpected )
+				{
+				const TDesC8&	expectedBuffer=iCallbackRead->Buffer();
+				if ( expectedBuffer.Match(iBufferReadPtr)!=0 )
+					{
+					for ( TInt index=0; index<length; ++index )
+						{
+						const TUint8&	actual=(*iBufferRead)[index];
+						const TUint8&	expected=expectedBuffer[index];
+						if ( actual!=expected )
+							{
+							ERR_PRINTF4(_L("Index:%d Read:%d Expected:%d"), index, (TInt)actual, (TInt)expected);
+							SetBlockResult(EFail);
+							}
+						}
+					}
+				}
+			CleanupStack::PopAndDestroy(bufferRead);
+			}
+		}
+	else if ( aActive==iCallbackReadOneOrMore )
+		{
+		INFO_PRINTF1(_L("RunL: ReadOneOrMore()"));
+
+		if ( err==KErrNone )
+			{
+			TInt	length=iBufferReadPtr.Length();
+			if ( iReadOneOrMoreLeft!=length )
+				{
+				iBufferReadPtr.SetLength(iReadOneOrMoreLeft);
+				iReadOneOrMoreLeft-=length;
+				INFO_PRINTF2(_L("iReadOneOrMoreLeft:%d"), iReadOneOrMoreLeft);
+				iBufferReadPtr.Set(iBufferReadPtr.RightTPtr(iReadOneOrMoreLeft));
+				iBufferReadPtr.SetLength(iReadOneOrMoreLeft);
+				INFO_PRINTF1(_L("ReadOneOrMore"));
+				iBusDevComm->ReadOneOrMore(iCallbackReadOneOrMore->iStatus, iBufferReadPtr);
+				iCallbackReadOneOrMore->Activate(aIndex);
+				IncOutstanding();
+				}
+			else
+				{
+				iCallbackReadOneOrMore->KillTimer();
+				HBufC*	bufferRead=HBufC::NewLC(iBufferLength);
+				bufferRead->Des().Copy(iBufferReadOneOrMorePtr);
+				if ( iHasReadExpected )
+					{
+					const TDesC8&	expectedBuffer=iCallbackReadOneOrMore->Buffer();
+					if ( expectedBuffer.Match(iBufferReadOneOrMorePtr)!=0 )
+						{
+						for ( TInt index=0; index<iBufferLength; ++index )
+							{
+							const TUint8&	actual=(*iBufferRead)[index];
+							const TUint8&	expected=expectedBuffer[index];
+							if ( actual!=expected )
+								{
+								ERR_PRINTF4(_L("Index:%d Read:%d Expected:%d"), index, (TInt)actual, (TInt)expected);
+								}
+							}
+
+						ERR_PRINTF1(KLogErrorExpectedValue);
+						SetBlockResult(EFail);
+						}
+					}
+				CleanupStack::PopAndDestroy(bufferRead);
+				}
+			}
+		}
+	else if ( aActive==iCallbackBreak )
+		{
+		iCallbackBreak->KillTimer();
+		INFO_PRINTF1(_L("RunL: Break()"));
+		}
+	else if ( aActive==iCallbackNotifySignalChange )
+		{
+		iCallbackNotifySignalChange->KillTimer();
+		INFO_PRINTF1(_L("RunL: NotifySignalChange()"));
+
+		if ( err==KErrNone )
+			{
+			INFO_PRINTF2(_L("Signals Changed=0x%x"), iNotifySignals);
+			if ( iHasNotifySignalsExpected )
+				{
+				if ( iNotifySignals!=iNotifySignalsExpected )
+					{
+					ERR_PRINTF3(KLogErrorExpectedSignal, iNotifySignals, iNotifySignalsExpected);
+					SetBlockResult(EFail);
+					}
+				}
+			}
+		}
+	else if ( aActive==iCallbackWrite )
+		{
+		iCallbackWrite->KillTimer();
+		INFO_PRINTF1(_L("RunL: Write()"));
+		}
+	else if ( aActive==iCallbackNotifyReceiveDataAvailable )
+		{
+		iCallbackNotifyReceiveDataAvailable->KillTimer();
+		INFO_PRINTF1(_L("RunL: NotifyReceiveDataAvailable()"));
+		}
+	else
+		{
+		CT_RBusLogicalChannelData::RunL(aActive, aIndex);
+		activeOk=EFalse;
+		}
+
+	if ( activeOk )
+		{
+		DecOutstanding();
+		}
+
+	if ( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("RunL Error %d"), err);
+		SetAsyncError(aIndex, err);
+		}
+	}
+
+void CT_RBusDevCommData::DoCancel(CActive* aActive, TInt aIndex)
+/**
+ Virtual DoCancel - Request to cancel the asynchronous command
+ @internalComponent
+ @see - MTPActiveCallback
+ @param aActive Active Object that DoCancel has been called on
+ @pre - N/A
+ @post - N/A
+ @leave system wide error code
+*/
+	{
+	TBool	activeOk=ETrue;
+	SetBlockResult(EFail);
+
+	if ( aActive==iCallbackRead )
+		{
+		ERR_PRINTF1(_L("ReadCancel Called"));
+		iBusDevComm->ReadCancel();
+		}
+	else if ( aActive==iCallbackReadOneOrMore )
+		{
+		ERR_PRINTF1(_L("ReadCancel Called"));
+		iBusDevComm->ReadCancel();
+		}
+	else if ( aActive==iCallbackBreak )
+		{
+		ERR_PRINTF1(_L("BreakCancel Called"));
+		iBusDevComm->BreakCancel();
+		}
+	else if ( aActive==iCallbackNotifySignalChange )
+		{
+		ERR_PRINTF1(_L("NotifySignalChangeCancel Called"));
+		iBusDevComm->NotifySignalChangeCancel();
+		}
+	else if ( aActive==iCallbackWrite )
+		{
+		ERR_PRINTF1(_L("WriteCancel Called"));
+		iBusDevComm->WriteCancel();
+		}
+	else if ( aActive==iCallbackNotifyReceiveDataAvailable )
+		{
+		ERR_PRINTF1(_L("NotifyReceiveDataAvailableCancel Called"));
+		iBusDevComm->NotifyReceiveDataAvailableCancel();
+		}
+	else
+		{
+		activeOk=EFalse;
+		CT_RBusLogicalChannelData::DoCancel(aActive, aIndex);
+		}
+
+	if ( activeOk )
+		{
+		DecOutstanding();
+		}
+	}