diff -r 000000000000 -r 8e480a14352b messagingfw/msgtest/integration/biomsg/src/sendrecv.cpp --- /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 + +#include +#include + +#include + +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 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; + } + } + }