messagingfw/msgtest/integration/biomsg/src/sendrecv.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtest/integration/biomsg/src/sendrecv.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,513 @@
+// Copyright (c) 1999-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 "sendrecv.h"
+#include <smuthdr.h>
+
+#include <txtrich.h>
+#include <txtfmlyr.h>
+
+#include <bitsids.h>
+
+const TTimeIntervalMicroSeconds32 KWaitForReceiveIteration = 2000000;
+const TTimeIntervalMicroSeconds32 KMaxWaitForMsg = 60000000;
+
+CSendReceive::~CSendReceive()
+	{
+	delete iEntryForObserver;
+
+	iReceived = NULL;
+	delete iReceived;
+	if (iOperation)
+		{
+		iOperation->Cancel();
+		delete iOperation;
+		iOperation = NULL;
+		}
+
+	delete iSelection;
+	iSelection = NULL;
+
+	if (iTimer)
+		{
+		iTimer->Cancel();
+		delete iTimer;
+		iTimer = NULL;
+		}
+	}
+
+
+CSendReceive* CSendReceive::NewL(CSmsTestUtils& aTestUtils)
+	{
+	CSendReceive* self = new (ELeave) CSendReceive(aTestUtils);
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+void CSendReceive::TestSendingL()
+//
+//
+//
+	{
+	iSmsTest.Test().Next(_L("Sending"));
+
+	TTime now;
+	now.HomeTime();
+	now += (TTimeIntervalSeconds) 5;
+
+	iSelection->Reset();
+
+	iSmsTest.DeleteSmsMessagesL(KMsvGlobalOutBoxIndexEntryId);
+
+	TBool read = EFalse;
+	iSmsTest.Printf(_L("Creating msgs in outbox from script:"));
+	iSmsTest.Printf(KSendRecvScript);
+	TRAPD(err, read = iSmsTest.ReadScriptL(KSendRecvScript, KMsvGlobalOutBoxIndexEntryId, *iSelection, now));
+
+	iSmsTest.Test()(!err && read);
+
+	// read any test messages from file
+//	CreateWappMessagesL();
+
+	iSmsTest.Printf(_L("Send and Receive %d messages...\n"), iSelection->Count());
+
+	iCurrentMessageNum = -1;
+	}
+/*
+void CSendReceive::CreateWappMessagesL()
+	{
+
+	TBufC<KMaxFileName> currentFile;
+
+	CMsvEntrySelection* selection = new(ELeave)CMsvEntrySelection();
+	CleanupStack::PushL(selection);
+
+	TInt err = Session().FileSession().GetDir(KMessageFileDirectory, KEntryAttMatchMask, ESortByName, iDir);
+	if (err == KErrPathNotFound)
+		{
+		TInt makeDirErr = Session().FileSession().MkDirAll(KMessageFileDirectory);	
+		makeDirErr==KErrNone ? User::Leave(KErrNotFound): User::Leave(makeDirErr);
+		}
+	else if (err!=KErrNone)
+		{
+		User::Leave(err);
+		}
+
+	// Set the session path for the RFs
+	Session().FileSession().SetSessionPath(KMessageFileDirectory);
+	if (iDir) 
+		delete iDir;
+	User::LeaveIfError(Session().FileSession().GetDir(_L("wapp*.txt"), KEntryAttNormal, ESortByName, iDir));
+    TInt count = iDir->Count();
+    
+	TBuf<60> outputBuf;
+
+	for(TInt loop = 0; loop < count; loop++)
+		{
+		currentFile=( (*iDir)[loop].iName );
+		// Not processed all the messages - so keep the current state
+		
+		}
+	CleanupStack::Pop(); // selection
+	}
+
+HBufC* CSendReceive::ReadWappMessageFromFileL(const TDesC& aFile)
+	{
+	RFile           file;
+	TBuf8<1024>     lineBuffer;   // Buffer for Read function.
+	TInt			err=KErrNone;
+
+	err = file.Open(Session().FileSession(),aFile,EFileStreamText|EFileRead|EFileShareAny);
+
+    if(err != KErrNone)  // Didn't find the file, so leave - should only get valid filenames!
+        {
+        User::Leave(KErrNotFound);
+		}
+
+	// In real life this is set by the Socket Port Observer, or the SMS server.
+	// So,in this test code we must do it by creating a random  telephone number.
+	//	iMessageDetails = CreateDummyPhoneNumberL();
+
+    HBufC*	bioBuf=HBufC::NewLC(1024); // Create a new descriptor on the heap.
+	HBufC*	copyBuffer=HBufC::NewLC(1024);
+
+    do // Read in the text from file, and also check if there is a name field:
+		{
+		err = file.Read(lineBuffer);// Read upto 256 chars, '\n' and all...
+		//err = ReadLineL(file,lineBuffer);
+		if (err==KErrNone)				// Made a valid read,
+			if (lineBuffer.Length()==0) // but read 0 chars
+				err=KErrEof;			// so set err value to end processing
+
+		if(err == KErrNone)
+			{
+			copyBuffer->Des().Copy(lineBuffer);// Copy, and overwrite existing text
+			if( (bioBuf->Length() + copyBuffer->Length()) > bioBuf->Des().MaxLength() )
+					{
+					bioBuf = bioBuf->ReAllocL(bioBuf->Length() + copyBuffer->Length());
+					}
+			bioBuf->Des().Append(*copyBuffer);
+            //bioBuf->Des().Append(_L("\n"));
+			}
+		}
+    while(err != KErrEof);
+
+	CleanupStack::PopAndDestroy(); // Destroy the copyBuffer.
+	CleanupStack::Pop();// Remove the bioBuf.
+    
+	file.Close();
+	return bioBuf;  // Transfer ownership and responsibility of the buffer.
+	}
+
+void CSendReceive::CreateMessageL(const TDesC& aFile)
+	{
+	CParaFormatLayer* paraFormat = CParaFormatLayer::NewL();
+	CleanupStack::PushL(paraFormat);
+	CCharFormatLayer* charFormat = CCharFormatLayer::NewL();
+	CleanupStack::PushL(charFormat);
+	CRichText* richText = CRichText::NewL(paraFormat, charFormat);
+	CleanupStack::PushL(richText);
+
+	HBufC* buffer = ReadWappMessageFromFileL(aFile);
+	CleanupStack::PushL(richText);
+	
+	richText->InsertL(0,*buffer);
+
+	CSmsHeader* header = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *richText);
+	CleanupStack::PushL(header);
+
+	TTime now;
+    now.HomeTime();
+
+	TMsvEntry entry;
+	entry.SetSendingState(KMsvSendStateUponRequest);
+	entry.iBioType = KUidBIOWAPAccessPointMsg;
+
+	iSmsTest.CreateMessageL(KMsvGlobalInBoxIndexEntryId,entry,*header,*richText,now);
+
+	delete buffer;
+	CleanupStack::PopAndDestroy(5);
+	}
+*/
+TBool CSendReceive::SendNextMessageL()
+	{
+	iCurrentMessageNum++;
+	const TInt count = iSelection->Count();
+
+	if (iCurrentMessageNum < count)
+		{
+		iSmsTest.Printf(_L("Sending message %d of %d\n"), iCurrentMessageNum + 1, count);
+
+		iSmsTest.SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+
+		delete iOperation;
+		iOperation = NULL;
+
+		CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection();
+		CleanupStack::PushL(sel);
+		sel->AppendL(iSelection->At(iCurrentMessageNum));
+		iOperation = MsvEntry().CopyL(*sel, iSmsTest.iSmsServiceId, iStatus);
+		CleanupStack::PopAndDestroy(); //sel
+		
+		iState = EStateSending;
+		SetActive();
+		CActiveScheduler::Start();
+		return ETrue;
+		}
+
+	return EFalse;
+	}
+
+void CSendReceive::TestWaitForReceiveL()
+	{
+	iSmsTest.Test().Next(_L("Waiting to receive message"));
+	iState = EStateWaitingToReceive;
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete(status, KErrNone);
+	SetActive();
+	}
+
+CSendReceive::CSendReceive(CSmsTestUtils& aTestUtils)
+: CActive(EPriorityStandard),iCurrentMessageNum(-1),iSmsTest(aTestUtils),iState(EStateWaiting)
+	{
+	}
+
+void CSendReceive::StartL(CMsvEntrySelection* aReceived)
+	{
+	iCurrentTest = 0;
+	iReceived = aReceived;
+	
+	iSmsTest.TestStart(++iCurrentTest, _L("Read Script"));
+	TestSendingL();
+	User::LeaveIfError(iStatus.Int());
+	iSmsTest.TestFinish(iCurrentTest, KErrNone);
+
+	FOREVER
+		{
+		iSmsTest.TestStart(++iCurrentTest, _L("Send Message"));
+		TBool sendNext = SendNextMessageL();
+		if (sendNext)
+			{
+			User::LeaveIfError(iStatus.Int());
+			iSmsTest.TestFinish(iCurrentTest, KErrNone);
+			}
+		else
+			{
+			iSmsTest.Printf(_L("No more messages to send!"));
+			iSmsTest.TestFinish(iCurrentTest, KErrNone);
+			break;
+			}
+		}
+
+	iSmsTest.TestStart(++iCurrentTest, _L("Wait to receive extra message(s)"));
+	User::LeaveIfError(iStatus.Int());
+	iSmsTest.TestFinish(iCurrentTest, KErrNone);
+	}
+
+void CSendReceive::ConstructL()
+	{
+	iSelection = new (ELeave) CMsvEntrySelection();
+	iTimer = CTestTimer::NewL();
+	CActiveScheduler::Add(this);
+
+	iSmsTest.SetCommDbServiceCenterFromScriptL(KSendRecvScript);
+	}
+
+void CSendReceive::RunL()
+	{
+	TRAPD(err, DoRunL());
+	if (err && iStatus == KErrNone)
+		{
+		iStatus = err;
+		}
+	if(!IsActive())
+		CActiveScheduler::Stop();
+	}
+
+void CSendReceive::DoRunL()
+	{
+	switch (iState)
+		{
+		case EStateSending:
+			{
+			DoRunSendingL();
+			delete iOperation;
+			iOperation = NULL;
+			break;
+			}
+		case EStateWaitingToReceive:
+			{
+			DoRunWaitingToReceiveL();
+			break;
+			}
+		case EStateWaitingToReceiveAnyExtra:
+			{
+			DoRunWaitForExtraL();
+			break;
+			}
+		case EStateMessageReceived:
+			{
+			break;
+			}
+		default:
+			{
+			break;
+			}
+		}
+	}
+
+void CSendReceive::DoCancel()
+	{
+	if (iOperation)
+		{
+		iOperation->Cancel();
+		iSmsTest.Printf(_L("Operation Cancelled!\n"));
+		}
+	delete iOperation;
+	iOperation = NULL;
+	}
+
+void CSendReceive::DoRunSendingL()
+	{
+	if (iOperation)
+		iSmsTest.SetProgressL(*iOperation);
+
+	TInt count = iSelection->Count();
+	TBool wait = EFalse;
+
+	while (iStatus == KErrNone && count--)
+		{
+		TRAPD(err, iSmsTest.SetEntryL(iSelection->At(count)));
+
+		if (err == KErrNone)
+			{
+			TMsvEntry entry = MsvEntry().Entry();
+			iSmsTest.SetEntryL(KMsvGlobalOutBoxIndexEntryId);
+
+			TBuf<0x100> output;
+			TBuf<0x50>  nowBuf;
+
+			switch (entry.SendingState())
+				{
+				case KMsvSendStateSending:
+					output.AppendFormat(_L("Message %d Sending with error %d\n"), entry.Id(), entry.iError);
+					wait = ETrue;
+					break;
+				case KMsvSendStateResend:
+					output.AppendFormat(_L("Message %d Resend at "), entry.Id());
+					entry.iDate.FormatL(nowBuf, _L("%-B%:0%J%:1%T%:2%S%:3%+B"));
+					output.Append(nowBuf);
+					output.Append(_L("\n"));
+					wait = ETrue;
+					break;
+				case KMsvSendStateScheduled:
+					output.AppendFormat(_L("Message %d Scheduled at "), entry.Id());					entry.iDate.FormatL(nowBuf, _L("%-B%:0%J%:1%T%:2%S%:3%+B"));
+					entry.iDate.FormatL(nowBuf, _L("%-B%:0%J%:1%T%:2%S%:3%+B"));
+					output.Append(nowBuf);
+					output.Append(_L("\n"));
+					wait = ETrue;
+					break;
+				case KMsvSendStateFailed:
+					output.AppendFormat(_L("Message %d Failed with error %d\n"), entry.Id(), entry.iError);
+					if (entry.iError)
+						iStatus = entry.iError;
+					else
+						iStatus = KErrGeneral;
+
+					break;
+				case KMsvSendStateWaiting:
+					output.AppendFormat(_L("Message %d Waiting with error %d\n"), entry.Id(), entry.iError);
+					wait = ETrue;
+					break;
+				case KMsvSendStateSent:
+				default:
+					break;
+					//nothing
+				}
+
+			iSmsTest.Printf(output);
+			}
+		}
+
+	if (wait)
+		{
+		iTimer->AfterReq(10000000, iStatus);
+		SetActive();
+		iState = EStateSending;
+		}
+	else
+		{
+		iSmsTest.Printf(_L("Sending completed with error %d\n"), iStatus);
+		
+		if (iStatus == KErrNone)
+			{
+			TestWaitForReceiveL();
+			}
+		else
+			{
+			iState = EStateWaiting;
+			}
+		}
+	}
+
+void CSendReceive::WaitForExtraL()
+	{
+	iSmsTest.Printf(_L("Waiting for any extra to arrive...\n"));
+	iCountWaits = 0;
+	iState = EStateWaitingToReceiveAnyExtra;
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete(status, KErrNone);
+	SetActive();
+	}
+
+void CSendReceive::DoRunWaitForExtraL()
+	{
+	iCountWaits++;
+
+	TInt totalSentCount = iSelection->Count();
+	TInt recvCount = iReceived->Count();
+
+	if (recvCount > totalSentCount)
+		{
+		iSmsTest.Printf(_L("Too many messages received:\nSent %d Rcvd %d\n"), totalSentCount, recvCount);
+		iStatus = KErrOverflow;
+		}
+	else
+		DoWaitL();
+	}
+
+void CSendReceive::DoRunWaitingToReceiveL()
+	{
+	iCountWaits++;
+
+	TInt totalSentCount = iSelection->Count();
+	TInt recvCount = iReceived->Count();
+
+	if (recvCount > totalSentCount || recvCount > (iCurrentMessageNum + 1))
+		{
+		iSmsTest.Printf(_L("Too many messages received:\nSent %d Rcvd %d\n"), totalSentCount, recvCount);
+		iStatus = KErrOverflow;
+		}
+	else 
+		{
+		if (totalSentCount == recvCount)
+			{
+			iSmsTest.Printf(_L("All Messages Received!!\n"));
+			}
+		else if (recvCount == iCurrentMessageNum + 1)
+			{
+			//Message received
+			iState = EStateMessageReceived;
+			iCountWaits = 0;
+			TRequestStatus* status = &iStatus;
+			User::RequestComplete(status, KErrNone);
+			SetActive();
+			}
+		else
+			{
+			DoWaitL();
+			}
+		}
+	}
+
+void CSendReceive::DoWaitL()
+	{
+	TInt totalSentCount = iSelection->Count();
+	TInt recvCount = iReceived->Count();
+
+	TInt maxCount = KMaxWaitForMsg.Int() / KWaitForReceiveIteration.Int();
+	TInt waitSecs = KWaitForReceiveIteration.Int() * (maxCount - iCountWaits) / 1000000;
+	iSmsTest.Printf(_L("Waiting %d secs to recv msg\n"), waitSecs);
+
+	if (iCountWaits < maxCount)
+		{
+		iTimer->AfterReq(KWaitForReceiveIteration, iStatus);
+		SetActive();
+		}
+	else
+		{
+		iSmsTest.Printf(_L("Time Out: Message NOT Received\n"));
+
+		if (totalSentCount != recvCount)
+			{
+			iStatus = KErrTimedOut;
+			}
+		}
+	}