messagingfw/biomsgfw/IACPTSRC/T_iacpcomm.cpp
changeset 62 db3f5fa34ec7
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/IACPTSRC/T_iacpcomm.cpp	Wed Nov 03 22:41:46 2010 +0530
@@ -0,0 +1,1077 @@
+// Copyright (c) 2000-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:
+// This test harness processes an Internet Access Configuration Message
+// and uses the resulting database entry to perform a connection to 
+// the POP3 and SMTP servers.
+// The parser creates the service entries from the files iacp*.txt
+// placed into the data directory c:\biomsg\iacpcomm. If more
+// than one entry is placed into the directory the harness uses the
+// first instance as the target POP3/SMTP provider.
+// The harness contructs and sends any files of the form rfc*.txt
+// with the data directory to the SMTP service, before connecting to 
+// the POP3 service to download mail.
+// The test harness does not support heap fail testing
+// Based on t_iacp.cpp amd t_pops.cpp
+// 
+//
+
+#include "biotestutils.h"
+#include "emailtestutils.h"
+//
+#include "IACPERR.H"
+#include "IACPDEF.H"
+#include <commdb.h>
+#include <popsmtm.h>
+#include <etel.h>
+#include "tmsvbioinfo.h"
+//
+//SMS configuration files path
+_LIT(IACP_TEST_MSG_PATH,	"c:\\test\\bio\\iacpcomm\\");
+
+#define BIO_MSG_ENTRY_PARSED	 1 // Set entry .iMtmData3 to 1 to indicate that the entry has store i.e parsed,externalised
+
+
+// forward references
+class CExampleScheduler;
+class CTestIacp;
+
+//global declarations
+LOCAL_D CExampleScheduler *exampleScheduler;
+LOCAL_D RTest test(_L("IACPCOMM Test Harness"));
+
+// Uncommment the following to provide prompting on the Windows platform
+// #if defined(_DEBUG)
+// #define PROMPTUSER test.Printf(_L("\nPress any key: ")); test.Getch();
+// #else
+// #define PROMPTUSER
+// #endif
+#define PROMPTUSER
+
+//
+//-- CExampleScheduler --
+//
+class CExampleScheduler : public CActiveScheduler 
+	{
+	public:
+	void Error (TInt aError) const;
+	};
+
+void CExampleScheduler::Error(TInt anError) const
+	{
+	CActiveScheduler::Stop();
+	test.Printf(_L("\nLeave signalled, reason=%d\n"),anError);
+	PROMPTUSER
+	}
+
+//--------------------------------------
+//
+//-- CTestIacp --
+//
+
+enum TSessionState
+	{
+	EParse,			// parsing is done at ParseL() stage. and data are externalised.
+	EProcess,		// parsed data are internalised, then commited
+	EInitSMTPMTM,	// initialise the send test utils for SMTP
+	ESendSMTP,		// prep outgoing message and connect to the SMTP service
+					// and send them
+	EInitPOP3MTM,	// initialise the send test utils for SMTP
+	EConnectPOP3,	// connect to the access point setup by the IACP entry
+	EReceivePOP3,	// pull back any messages on the service
+	EDisconnectPOP3,// and disconnect 
+	EFinished		// Time to pack up
+	};
+
+class CTestIacp : public CActive 
+	{
+	public:
+		~CTestIacp();
+		static  CTestIacp * NewL(CBioTestUtils* aBioTestUtils);
+		void StartL(TSessionState aCmd);
+		CTestIacp(CBioTestUtils* aBioTestUtils);
+		void DoCancel();
+		void RunL();
+		TBool DisplaySummary();
+		TInt  Error();
+
+	private:
+		void RequestComplete(TRequestStatus& aStatus,TInt aCompletion);
+		void ConstructL();
+		void CreateParserL(); //sets 'iParser' to point to the created iacp parser
+		void GetMessageBodyL();
+		void DisplayEntryDataL();
+		void ParseMsgL();
+		void ProcessMsgL();
+		void InitSMTPMTML();
+		void InitPOP3MTML();
+		void SendSMTPL();
+		void ConnectPOP3L();
+		void DisconnectPOP3L();
+		void DoRunL();
+		void SetIAPL(TMsvId aService);
+		void deleteParser();
+		void CheckSendStatus();
+		TBool CheckRecvStatus();
+		void LogCommsError(TInt aError);
+		void LogParseError(TInt& aReason);
+		void GetDefaultConnectionL();
+		void ReceivePOP3L();
+
+	private:
+		TSessionState		iState;
+		TInt				iError;
+
+		// for managing the connections to the pop3 and smtp servers
+		CEmailTestUtils*	iSendUtils;
+		TMsvId				iPop3service;	// IACP added entry
+		TMsvId				iSmtpservice;	// as above
+		CMsvEntrySelection* iMsvSelection;
+		TUint32				iIap;		// what commdb record we use for connecting out
+
+		// for managing the input IACP data
+		CBioTestUtils*		iBioTestUtils;
+		CBaseScriptParser2*	iParser;
+
+		HBufC*				iSmsMsg;		//sms body build dependent		
+		TMsvId				iEntryId;       //ID of sms entry
+		CMsvEntrySelection*	iIacpSelection;	//the collection of iacp*.txt entries
+
+		// status
+		TBool				iParsedMsg;
+		TBool				iConnectedToSMTP;
+		TInt				iMsgsSent;
+		TBool				iConnectedToPOP3;
+		TInt				iMsgsReceived;
+	};
+
+//
+CTestIacp::CTestIacp(CBioTestUtils* aBioTestUtils)
+:CActive(EPriorityStandard),iBioTestUtils(aBioTestUtils)
+	{
+	}
+
+CTestIacp* CTestIacp::NewL(CBioTestUtils* aBioTestUtils)
+	{
+	CTestIacp* self = new(ELeave) CTestIacp(aBioTestUtils);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();  //self 
+	return self;
+	}
+
+void CTestIacp::ConstructL()
+	{
+	iBioTestUtils->WriteComment(_L("CTestIacp::ConstructL()."));
+	CreateParserL();
+
+	// for selecting message store items
+	iMsvSelection = new (ELeave) CMsvEntrySelection;
+
+	iIacpSelection=	iBioTestUtils->GenerateMessagesL(IACP_TEST_MSG_PATH);
+
+	CActiveScheduler::Add(this);
+	}
+
+CTestIacp::~CTestIacp()
+	{
+	Cancel();
+
+	deleteParser();
+	delete iIacpSelection;
+	delete iSmsMsg;
+	delete iSendUtils;
+	delete iMsvSelection;
+	}
+
+void CTestIacp::CreateParserL()
+	{
+	TRAPD(error,(iParser = iBioTestUtils->CreateParserTypeL(KUidBIOInternetAccessPointMsg)));
+	if (error == KErrNone)
+		{
+		iBioTestUtils->WriteComment(_L("Created IACP Parser object"));
+		}
+	else
+		{
+		LogParseError(error);
+		User::Leave(error);
+		}	
+	}
+
+void CTestIacp::GetMessageBodyL()
+	{
+	// get a memory version of the message created by the test utils
+	delete iSmsMsg;
+	iSmsMsg = NULL;
+	iSmsMsg = iBioTestUtils->MessageBodyL(iEntryId).AllocL();
+	}
+
+TInt CTestIacp::Error()
+	{
+	return iError;
+	}
+
+void CTestIacp::StartL(TSessionState aCmd)
+	{
+	iState=aCmd;
+	iEntryId = (*iIacpSelection)[0];
+
+	switch (iState)
+		{
+		case EParse:
+			test.Printf(_L("Parsing...\n"));
+			iBioTestUtils->SetEntryL(iEntryId); //clients have to set the right context before calling ParseL() 
+			GetMessageBodyL();
+			ParseMsgL();
+			break;
+
+		case EProcess:
+			test.Printf(_L("Processing...\n"));
+			iBioTestUtils->SetEntryL(iEntryId); //clients have to set the right context before calling CommitL() 
+			ProcessMsgL();
+			break;
+
+		case EInitSMTPMTM:
+			InitSMTPMTML();
+			RequestComplete(iStatus,KErrNone);
+            SetActive();
+			break;
+
+		case EInitPOP3MTM:
+			InitPOP3MTML();
+			RequestComplete(iStatus,KErrNone);
+            SetActive();
+			break;
+
+		case ESendSMTP:
+			SendSMTPL();
+			break;
+
+		case EConnectPOP3:
+			ConnectPOP3L();
+			break;
+
+		case EReceivePOP3:
+			ReceivePOP3L();
+			break;
+
+		case EDisconnectPOP3:
+			DisconnectPOP3L();
+			break;
+
+		default:
+			break;
+		}
+	}
+
+void CTestIacp::RunL()
+	{
+	TRAP(iError, DoRunL());
+	if (iError != KErrNone || iState == EFinished)
+		{
+		CActiveScheduler::Stop();
+		}
+	}
+
+void CTestIacp::DoRunL()
+	{
+	TInt result=iStatus.Int();
+
+	switch (iState)
+		{
+		case EParse:
+			if(result==KErrNone)
+				{
+				iBioTestUtils->WriteComment(_L("Parsed Ok"));
+				StartL(EProcess);
+				}
+			else
+				{
+				LogParseError(result);
+				iParser->Cancel();
+				iState=EFinished;
+				}
+			break;
+
+		case EProcess:
+			if(result==KErrNone)
+				{
+				iBioTestUtils->WriteComment(_L("Processed IACP Ok"));
+				iParsedMsg = ETrue;
+				//StartL(EInitSMTPMTM);
+				StartL(EInitPOP3MTM);
+				}
+			else
+				{
+				LogParseError(result);
+				iParser->Cancel();
+				iState=EFinished;
+				}
+			break;
+
+		case EInitSMTPMTM:
+			iSendUtils->WriteComment(_L("Initialised SMTP MTM Ok"));
+			StartL(ESendSMTP);	
+			break;
+
+		case ESendSMTP:
+			CheckSendStatus();
+			if (iConnectedToSMTP)
+				{
+				StartL(EInitPOP3MTM);
+				}
+			else
+				{
+				iState=EFinished;
+				}
+			break;
+
+		case EInitPOP3MTM:
+			iSendUtils->WriteComment(_L("Initialised POP3 MTM Ok"));
+			StartL(EConnectPOP3);
+			break;
+
+		case EConnectPOP3:
+			if (CheckRecvStatus())
+				{
+				iConnectedToPOP3 = ETrue;
+				iSendUtils->WriteComment(_L("Connected POP3 server Ok"));
+				// count number or entries in remote service
+				User::LeaveIfError(iSendUtils->iServerEntry->SetEntry(iPop3service));
+				User::LeaveIfError(iSendUtils->iServerEntry->GetChildren(*iMsvSelection));
+
+				if (iMsvSelection->Count() > 0)
+					{
+					StartL(EReceivePOP3);
+					}
+				else
+					{
+					StartL(EDisconnectPOP3);
+					}
+				}
+			else
+				{
+				iState=EFinished;
+				}
+			break;
+
+		case EReceivePOP3:
+			if (CheckRecvStatus())
+				{
+				iSendUtils->WriteComment(_L("Retrieved from POP3 Ok"));
+				iMsgsReceived = iMsvSelection->Count();
+				}
+			StartL(EDisconnectPOP3);
+			break;
+
+		case EDisconnectPOP3:
+			iSendUtils->WriteComment(_L("Disconnected POP3 server Ok"));
+			iState = EFinished;
+			break;
+
+		default:
+			break;
+		}
+	}
+
+void CTestIacp::ParseMsgL()
+	{
+	iBioTestUtils->WriteComment(_L("Creating IACP Parser object"));
+	TRAPD(error, iParser->ParseL(iStatus,iSmsMsg->Des())); 
+	if (error == KErrNone)
+		{
+		iBioTestUtils->WriteComment(_L("Created IACP Parser object"));
+		SetActive();
+		}
+	else
+		{
+		LogParseError(error);
+		User::Leave(error);
+		}	
+	}
+
+void CTestIacp::ProcessMsgL()
+	{
+	iBioTestUtils->WriteComment(_L("Starting processing..."));
+
+	DisplayEntryDataL();
+
+	TRAPD(error, iParser->ProcessL(iStatus)); //internalise and process
+	if (error == KErrNone)
+		{
+		iBioTestUtils->WriteComment(_L("Process started ok"));
+		SetActive();
+		}
+	else
+		{
+		LogParseError(error);
+		User::Leave(error);
+		}	
+	}
+
+void CTestIacp::deleteParser()
+	{
+	delete iParser;
+	iParser = 0;
+	delete iBioTestUtils;
+	iBioTestUtils = 0;
+	}
+
+// setup the objects for connecting to the POP3 server
+void CTestIacp::InitPOP3MTML()
+	{
+	// close down iBioTestUtils instance since it shares a single message server
+	// which causes iSendUtils creation to fail
+
+	// first delete the parser to allow iBioTestUtils to be deleted
+	// without panicking
+	deleteParser();
+
+	delete iSendUtils;
+	iSendUtils = 0;
+
+	// now setup the send utils
+	iSendUtils = CEmailTestUtils::NewL(test);
+	iSendUtils->WriteComment(_L("Initialised POP3 Send Utils"));
+
+	iSendUtils->GoServerSideL();
+	iSendUtils->CreatePopServerMtmRegL();
+
+	// Load the DLLs
+	iSendUtils->CreateRegistryObjectAndControlL();
+	iSendUtils->InstallPopMtmGroupL();
+
+	iSendUtils->FindExistingServicesL();
+	iSendUtils->InstantiatePopServerMtmL();
+
+	// processing of message should have added these entries
+	TRAPD(error, (iPop3service = iSendUtils->FindPopServiceL()));
+	if (error != KErrNone)
+		{
+		iSendUtils->WriteComment(_L("Could not locate POP3 service entry"));
+		User::Leave(error);
+		}
+
+	GetDefaultConnectionL();
+
+	SetIAPL(iPop3service);
+	}
+
+// setup the objects for connecting to the SMTP server
+void CTestIacp::InitSMTPMTML()
+	{
+	deleteParser();
+
+	// now setup the send utils
+	iSendUtils = CEmailTestUtils::NewL(test);
+	iSendUtils->WriteComment(_L("Initialised SMTP Send Utils"));
+
+	iSendUtils->GoServerSideL();
+	iSendUtils->CreateSmtpServerMtmRegL();
+
+	// Load the DLLs
+	iSendUtils->CreateRegistryObjectAndControlL();
+	iSendUtils->InstallSmtpMtmGroupL();
+
+	iSendUtils->FindExistingServicesL();
+	iSendUtils->InstantiateSmtpServerMtmL();
+
+	// processing of message should have added these entries
+	TRAPD(error, (iSmtpservice = iSendUtils->FindSmtpServiceL()));
+	if (error != KErrNone)
+		{
+		iSendUtils->WriteComment(_L("Could not locate SMTP service entry"));
+		User::Leave(error);
+		}
+
+	GetDefaultConnectionL();
+
+	SetIAPL(iSmtpservice);
+	}
+
+void CTestIacp::ConnectPOP3L()
+	{
+	iMsvSelection->ResizeL(0);
+	iMsvSelection->AppendL(iPop3service);
+
+	iSendUtils->WriteComment(_L("Connecting to POP3 server..."));
+
+	test.Printf(_L("Connecting to POP3 server...\n"));
+
+	TBuf8<1> aParameter;
+
+	iSendUtils->iPopServerMtm->StartCommandL(*iMsvSelection, KPOP3MTMConnect, aParameter, iStatus);
+
+	SetActive();
+	}
+
+void CTestIacp::ReceivePOP3L()
+	{
+	TBuf<60> outputBuf;
+
+	outputBuf.Format(_L("%d messages in the inbox"), iMsvSelection->Count());
+	iSendUtils->WriteComment(outputBuf);
+
+	outputBuf.Format(_L("%d messages in the inbox\n"), iMsvSelection->Count());
+	test.Printf(outputBuf);
+	
+	iSendUtils->WriteComment(_L("Retrieving messages..."));
+
+	test.Printf(_L("Retrieving messages...\n"));
+
+	iSendUtils->iPopServerMtm->CopyToLocalL(*iMsvSelection, KMsvGlobalInBoxIndexEntryId, iStatus);
+
+	SetActive();
+	}
+
+void CTestIacp::DisconnectPOP3L()
+	{
+	iSendUtils->WriteComment(_L("Disconnecting from POP3 server"));
+
+	test.Printf(_L("Disconnecting from POP3 server...\n"));
+
+	TBuf8<1> aParameter;
+
+	iSendUtils->iPopServerMtm->StartCommandL(*iMsvSelection, KPOP3MTMDisconnect, aParameter, iStatus);
+
+	SetActive();
+	}
+
+void CTestIacp::SendSMTPL()
+	{
+	test.Printf(_L("Creating SMTP messages...\n"));
+
+	iSendUtils->CreateMessageFilesL(iSmtpservice,KMsvGlobalOutBoxIndexEntryId,IACP_TEST_MSG_PATH);
+
+	// see how many we have created
+	iSendUtils->iServerEntry->SetEntry(KMsvGlobalOutBoxIndexEntryId);
+	User::LeaveIfError(iSendUtils->iServerEntry->GetChildren(*iMsvSelection));
+
+	TInt count=iMsvSelection->Count();
+	if (count > 0)
+		{
+		TBuf<60> outputBuf;
+
+		outputBuf.Format(_L("%d messages in the outbox"), count);
+		iSendUtils->WriteComment(outputBuf);
+
+		outputBuf.Format(_L("\n%d messages in the outbox\n"), count);
+		test.Printf(outputBuf);
+
+		test.Printf(_L("Sending SMTP messages...\n"));
+
+		// begin the send
+		iSendUtils->iSmtpServerMtm->CopyFromLocalL(*iMsvSelection,iSmtpservice, iStatus);
+		SetActive();
+		}
+	else
+		{
+		iSendUtils->WriteComment(_L("No messages to send in the outbox"));
+		iState=EFinished;
+		}
+	}
+
+//
+
+void CTestIacp::GetDefaultConnectionL()
+	{
+	// determine what default record has been set as the preferred
+	// connection by the IACP parser when processing the message
+	CCommsDatabase* db = CCommsDatabase::NewL(EDatabaseTypeUnspecified);
+	CleanupStack::PushL(db);
+	TBuf<60> outputBuf;
+
+	//db->GetGlobalSettingL(TPtrC(IAP),iIap);
+	
+	//GetGlobalSettingL() above is now replaced by the connection preferences table below
+	CCommsDbConnectionPrefTableView* view;
+	view = db->OpenConnectionPrefTableViewOnRankLC(ECommDbConnectionDirectionOutgoing, 1/*rank 1 is like a default value*/ );
+
+	view->GotoFirstRecord(); //table with rank 1 only has one record
+	CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref connPref;
+	view->ReadConnectionPreferenceL(connPref);
+	iIap = connPref.iBearer.iIapId;
+	//END of retrieve setting from connection Pref Table
+
+	CleanupStack::PopAndDestroy(2, db);
+
+	outputBuf.Format(_L("Using IAP record %d for connection"), iIap);
+	iSendUtils->WriteComment(outputBuf);
+	}
+
+void CTestIacp::SetIAPL(TMsvId aService)
+	{
+	// set the service with the preferred IAP comms record
+	iSendUtils->iServerEntry->SetEntry(aService);
+	TMsvEntry entry = iSendUtils->iServerEntry->Entry();
+	entry.SetMtmData1(iIap);
+	User::LeaveIfError(iSendUtils->iServerEntry->ChangeEntry(entry));
+	}
+
+void CTestIacp::DoCancel()
+	{
+	test.Printf(_L("DoCancel()"));
+	}
+
+void CTestIacp::RequestComplete(TRequestStatus& aStatus,TInt aCompletion)
+	{
+	TRequestStatus* statusPtr=&aStatus;
+	User::RequestComplete(statusPtr,aCompletion);
+	}
+
+
+void CTestIacp::DisplayEntryDataL()
+    {
+    iBioTestUtils->SetEntryL(iEntryId);
+
+	/*
+    iBioTestUtils->ClearScreen();
+    //test.Console()->SetPos(0,0);
+
+    TMsvEntry entry = iBioTestUtils->Entry();
+    iBioTestUtils->Printf(_L("===== MESSAGE DETAILS =====\n"));
+	iBioTestUtils->Printf(_L("Id:			  0x%x\n"), iEntryId);
+    iBioTestUtils->Printf(_L("iServiceId:     0x%x\n"), entry.iServiceId);
+    iBioTestUtils->Printf(_L("iRelatedId:     0x%x\n"), entry.iRelatedId);
+    iBioTestUtils->Printf(_L("iType:          0x%x\n"), entry.iType);
+    iBioTestUtils->Printf(_L("iMtm:           0x%x\n"), entry.iMtm);
+    TBuf<128> dateStr;
+    entry.iDate.FormatL(dateStr, (_L("%D%M%Y%/0%1%/1%2%/2%3%/3")));
+    iBioTestUtils->Printf(_L("iDate:          %S\n"), &dateStr);
+
+    iBioTestUtils->Printf(_L("iSize:          %d\n"), entry.iSize);
+    iBioTestUtils->Printf(_L("iError:         %d\n"), entry.iError);
+    iBioTestUtils->Printf(_L("iBioType:		0x%x\n"), entry.iBioType);
+    iBioTestUtils->Printf(_L("iMtmData1:      %d\n"), entry.iMtmData1);
+    iBioTestUtils->Printf(_L("iMtmData2:      %d\n"), entry.iMtmData2);
+    iBioTestUtils->Printf(_L("iMtmData3:      %d\n"), entry.iMtmData3);
+    iBioTestUtils->Printf(_L("iDescription:  %S\n"), &entry.iDescription);
+    iBioTestUtils->Printf(_L("iDetails:      %S\n "), &entry.iDetails);
+
+	PROMPTUSER
+	*/
+
+    iBioTestUtils->ClearScreen();
+    //test.Console()->SetPos(0,0);
+
+	if(iBioTestUtils->Entry().MtmData3() != BIO_MSG_ENTRY_PARSED)
+		{
+		iBioTestUtils->WriteComment(_L("BioMg has not been parsed"));
+		User::Leave(KErrGeneral);
+		}
+	iBioTestUtils->LogExtractedFieldsL(iEntryId);
+    }
+
+TBool CTestIacp::DisplaySummary()
+	{
+	TBuf<128> result;
+
+	test.Printf(_L("\nFinal summary\n"));
+	if (iBioTestUtils != 0)
+		iBioTestUtils->WriteComment(_L("Final summary"));
+	else
+		iSendUtils->WriteComment(_L("Final summary"));
+	result = iParsedMsg ? _L("TRUE") : _L("FALSE");
+
+	TBuf<120> logMsg;
+
+	logMsg.Format(_L("Parsed IACP message      : %S\n"), &result);
+	test.Printf(logMsg);
+
+	if (iBioTestUtils != 0)
+		iBioTestUtils->WriteComment(logMsg);
+	else
+		iSendUtils->WriteComment(logMsg);
+
+	result = iConnectedToSMTP ? _L("TRUE") : _L("FALSE");
+	logMsg.Format(_L("Connected to SMTP server : %S\n"), &result);
+	test.Printf(logMsg);
+	if (iBioTestUtils != 0)
+		iBioTestUtils->WriteComment(logMsg);
+	else
+		iSendUtils->WriteComment(logMsg);
+
+	if (iConnectedToSMTP)
+		{
+		logMsg.Format(_L("    Sent %d messages\n"), iMsgsSent);
+		test.Printf(logMsg);
+		if (iBioTestUtils != 0)
+			iBioTestUtils->WriteComment(logMsg);
+		else
+			iSendUtils->WriteComment(logMsg);
+		}
+
+	result = iConnectedToPOP3 ? _L("TRUE") : _L("FALSE");
+	logMsg.Format(_L("Connected to POP3 server : %S\n"), &result);
+	test.Printf(logMsg);
+	if (iBioTestUtils != 0)
+		iBioTestUtils->WriteComment(logMsg);
+	else
+		iSendUtils->WriteComment(logMsg);
+
+	if (iConnectedToPOP3)
+		{
+		logMsg.Format(_L("    Received %d messages\n"), iMsgsReceived);
+		test.Printf(logMsg);
+		if (iBioTestUtils != 0)
+			iBioTestUtils->WriteComment(logMsg);
+		else
+			iSendUtils->WriteComment(logMsg);
+		}
+
+	return iParsedMsg && iConnectedToSMTP && iConnectedToPOP3;
+	}
+
+void CTestIacp::CheckSendStatus()
+	{
+ 	TImSmtpProgress temp;	
+	TPckgC<TImSmtpProgress> paramPack(temp);
+
+	const TDesC8& progBuf = iSendUtils->iSmtpServerMtm->Progress();
+	paramPack.Set(progBuf);
+	TImSmtpProgress progress=paramPack();	
+
+	TBuf<128> logString;
+	//  State of Smtp session?
+	TInt state = progress.Status();
+	switch(state)
+		{
+		case EMsgOutboxProgressWaiting:
+			iSendUtils->WriteComment(_L("Waiting to start"));
+			break;
+
+		case EMsgOutboxProgressDone:
+			if (progress.Error() == 0)
+				iSendUtils->WriteComment(_L("Connection closed OK"));
+			else
+				LogCommsError(progress.Error());
+
+			logString.Format(_L("%d messages: Sent %d, failed to send %d, didn't attempt to send %d.\n"), 
+				progress.SendTotal(),
+				progress.Sent(),
+				progress.FailedToSend(),
+				progress.NotSent());
+			iSendUtils->WriteComment(logString);
+			if (progress.Sent() > 0)
+				{
+				iConnectedToSMTP=ETrue;
+				iMsgsSent=progress.Sent();
+				}
+			break;
+
+		case EMsgOutboxProgressConnecting:
+			logString.Format(_L("Connecting to SMTP server. Sending %d messages"),
+				progress.SendTotal());
+			iSendUtils->WriteComment(logString);
+			break;
+
+		case EMsgOutboxProgressSending:
+			logString.Format(_L("Sending message No.%d/%d. Transmitted %d bytes of %d"),
+				progress.MsgNo()+1,
+				progress.SendTotal(),
+				progress.iSendFileProgress.iBytesSent,
+				progress.iSendFileProgress.iBytesToSend);
+			iSendUtils->WriteComment(logString);
+			break;
+		}
+	}
+
+TBool CTestIacp::CheckRecvStatus()
+	{
+	TBool status = EFalse;
+
+	// Get the progress
+	TPop3Progress prog;	
+	TPckgC<TPop3Progress> paramPack(prog);
+	paramPack.Set(iSendUtils->iPopServerMtm->Progress());
+	TPop3Progress progress=paramPack();
+
+	// Check that the reported progress is EPopConnecting
+	if (progress.iPop3Progress == TPop3Progress::EPopConnecting
+	||	progress.iPop3Progress == TPop3Progress::EPopRefreshing)
+		{
+		if (progress.iErrorCode == 0)
+			{
+			status = ETrue;
+			}
+		else
+			{
+			LogCommsError(progress.iErrorCode);
+			}
+		}
+
+	return status;
+	}
+
+void CTestIacp::LogCommsError(TInt aError)
+	{
+	TBuf<100> errorMsg;
+
+	switch (aError)
+	{
+	case KErrEtelNotCallOwner:
+		errorMsg=_L("Comms error: Not call owner");
+		break;
+	case KErrEtelDuplicatePhoneName:
+		errorMsg=_L("Duplicate phone name");
+		break;
+
+	case KErrEtelAlreadyCallOwner:
+		errorMsg=_L("Already call owner");
+		break;
+
+	case KErrEtelNoCarrier:
+		errorMsg=_L("No carrier");
+		break;
+
+	case KErrEtelBusyDetected:
+		errorMsg=_L("Busy detected");
+		break;
+
+	case KErrEtelNoClientInterestedInThisCall:
+		errorMsg=_L("No client interested in call");
+		break;
+
+	case KErrEtelInitialisationFailure:
+		errorMsg=_L("Initialisation failure");
+		break;
+
+	case KErrEtelCallNotActive:
+		errorMsg=_L("Call not active");
+		break;
+
+	case KErrEtelNoAnswer:
+		errorMsg=_L("No answer");
+		break;
+
+	case KErrEtelNoDialTone:
+		errorMsg=_L("No dial tone");
+		break;
+
+	case KErrEtelConfigPortFailure:
+		errorMsg=_L("Config port failure");
+		break;
+
+	case KErrEtelFaxChunkNotCreated:
+		errorMsg=_L("Fax chunk not created");
+		break;
+
+	case KErrEtelNotFaxOwner:
+		errorMsg=_L("Not fax owner");
+		break;
+
+	case KErrEtelPortNotLoanedToClient:
+		errorMsg=_L("Port not loaned to client");
+		break;
+
+	case KErrEtelWrongModemType:
+		errorMsg=_L("Wrong modem type");
+		break;
+
+	case KErrEtelUnknownModemCapability:
+		errorMsg=_L("Unknown modem capability");
+		break;
+
+	case KErrEtelAnswerAlreadyOutstanding:
+		errorMsg=_L("Answer already outstanding");
+		break;
+	case KErrEtelModemNotDetected:
+		errorMsg=_L("Modem not detected");
+		break;
+
+	case KErrEtelModemSettingsCorrupt:
+		errorMsg=_L("Modem settings corrupt");
+		break;
+
+	case KPop3InvalidUser:
+		errorMsg=_L("Invalid POP3 user");
+		break;
+
+	case KPop3InvalidLogin:
+		errorMsg=_L("Invalid POP3 login");
+		break;
+
+	case KPop3CannotConnect:
+		errorMsg=_L("Cannot connect to POP3 server");
+		break;
+
+	case KPop3CannotCreateApopLogonString:
+		errorMsg=_L("Cannot create Apop logon string");
+		break;
+
+	case KPop3ProblemWithRemotePopServer:
+		errorMsg=_L("Problem with remote POP server");
+		break;
+
+	case KPop3CannotOpenServiceEntry:
+		errorMsg=_L("Cannot open POP3 service entry");
+		break;
+
+	case KPop3CannotSetRequiredFolderContext:
+		errorMsg=_L("Cannot set required folder context");
+		break;
+
+	case KPop3InvalidApopLogin:
+		errorMsg=_L("Invalid Apop login");
+		break;
+
+	case KPopTopError:
+		errorMsg=_L("POP TOP Error");
+		break;
+
+	default:
+		errorMsg.Format(_L("Unknown error %d"), aError);
+		break;
+		}
+
+	TBuf<120> logMsg;
+
+	logMsg.Format(_L("Connection closed with comms error (%S)"), &errorMsg);
+	iSendUtils->WriteComment(logMsg);
+
+	logMsg.Format(_L("Connection closed with comms error (%S)\n"), &errorMsg);
+	test.Printf(logMsg);			  
+	}
+
+void CTestIacp::LogParseError(TInt& aReason)
+	{
+	TBuf<256> tempBuf;
+	switch (aReason)
+		{
+		case KErrCancel:
+			tempBuf= _L("Session cancelled");
+			break;
+		case KErrEof:
+			tempBuf= _L("KErrEof");
+			break;
+		case KErrNoMemory:
+			tempBuf= _L("KErrNoMemory");
+			break;
+		case KErrDisconnected:
+			tempBuf= _L("KErrDisconnected");
+			break;
+		case KErrAccessDenied:
+			tempBuf= _L("KErrAccessDenied");
+			break;
+		case KBspInvalidMessage:
+			tempBuf= _L("Error: Invalid SMS Message. For Internet Access Configuration,SMS Header Field should be //SIAP11 ");
+			break;
+		case KIacpUnknownSmsType:
+			tempBuf=_L("Error:SMS 1st Left Token does not start with niether M nor I");
+			break;
+		case KIacpBIOMsgTypeNotSupported:
+			tempBuf= _L("this Bio msg is not suppported");
+			break;
+		case KIacpMandatoryDataNotSet:
+			tempBuf= _L("Error: Mandatory data missing in SMS message");
+			break;
+		case KIacpUnknownMailProtocol:
+			tempBuf= _L("Error: Unknown Mail Protocol Not a Pop3/Imap4");
+			break;
+		case KIacpErrRightToken:
+			tempBuf= _L("Error: improper right token  i.e not equal t/f (True/False)");
+			break;
+		case KIacpErrLeftToken:
+			tempBuf=_L("Error:SMS Left Tokens should start with 'M' for Mailbox account configuration\r\n and with 'I' for Internet service configuration");
+			break;
+		case KIacpErrSmsDataNotParsed:
+			tempBuf= _L("sms data should be parsed before processing");
+			break;
+		case KIacpErrSmsDataNotRestored:
+			tempBuf= _L("Error: sms data should be parsed before commiting (KIacpErrSmsDataNotRestored)");
+			break;
+		case KIacpScriptErrISPNotFound:
+			tempBuf= _L("Internet Service not found in Dial Out DB");
+			break;
+		case KIacpErrScriptNotDefined: 
+			tempBuf= _L("Script not included in sms");
+			break;
+		case KIacpErrScriptNotFoundInDB:
+			tempBuf= _L("There is no script in DB to append to");
+			break;
+		case KIacpErrScriptAlreadyAdd:
+			tempBuf= _L("Script cannot be add more than ounce for each Bio Msg");
+			break;
+		default:
+			tempBuf.Format(_L("Unknown error %d"), aReason);
+			break;
+		}
+
+	TBuf<300> logMsg;
+
+	logMsg.Format(_L("Parse error (%S)"), &tempBuf);
+	iBioTestUtils->WriteComment(logMsg);
+
+	logMsg.Format(_L("Parse error (%S)\n"), &tempBuf);
+	test.Printf(logMsg);			  
+	}
+
+LOCAL_C void doMainL()
+	{
+	// create a scheduler
+	exampleScheduler = new (ELeave) CExampleScheduler;
+	CleanupStack::PushL(exampleScheduler);
+	CActiveScheduler::Install(exampleScheduler);
+
+	// initialise the bio test utils
+	CBioTestUtils* BioTestUtils = CBioTestUtils::NewL(test,ETuCleanMessageFolder|ETuGoClientSide);
+	BioTestUtils->GoClientSideL();
+	BioTestUtils->WriteComment(_L("Msv Client Side Created"));
+
+	// create a IACP parser
+	CTestIacp* testParser = CTestIacp::NewL(BioTestUtils);
+	CleanupStack::PushL(testParser);
+	test(testParser != NULL);
+
+	BioTestUtils->WriteComment(_L("CTestIacp Object Created."));
+
+	// begin the tests
+	BioTestUtils->TestStart(1);
+	testParser->StartL(EParse);
+	
+	CActiveScheduler::Start();
+
+	if (testParser->DisplaySummary())
+		{
+		BioTestUtils->TestHarnessCompleted();
+		}
+	else
+		{
+		BioTestUtils->TestHarnessFailed(testParser->Error());
+		}
+
+	CleanupStack::PopAndDestroy(2);   // testParser, exampleScheduler
+
+	PROMPTUSER
+	}
+
+GLDEF_C TInt E32Main()
+	{
+	test.Title();
+	test.Start(_L("IACPCOMM Test Harness"));
+	__UHEAP_MARK;
+
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	test(cleanup!=NULL);
+
+	TRAPD(error,doMainL());
+	if (error) test.Printf(_L("Completed with return code %d"),error);
+	delete cleanup;
+
+	__UHEAP_MARKEND;
+	test.Close();
+	test.End();
+
+	return KErrNone;
+	}
+