diff -r 9f5ae1728557 -r db3f5fa34ec7 messagingfw/msgtest/integration/email/src/sms.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/integration/email/src/sms.cpp Wed Nov 03 22:41:46 2010 +0530 @@ -0,0 +1,636 @@ +// 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 "sms.h" + +// +CSmsBaseUtils::CSmsBaseUtils() + :iSession(NULL), iEntry(NULL), iOrder(KMsvGroupByType|KMsvGroupByStandardFolders,EMsvSortById,ETrue) + { + } + + +CSmsBaseUtils::~CSmsBaseUtils() + { + delete iEntry; + iEntry=NULL; + delete iSession; + iSession=NULL; + } + + +void CSmsBaseUtils::StartL() + { + iSession=CMsvSession::OpenSyncL(*this); + } + + +CMsvEntry& CSmsBaseUtils::EntryL() + { + if ( iEntry == NULL ) + { + User::Leave(KErrGeneral); + } + return *iEntry; + } + + +void CSmsBaseUtils::SetEntryL(TMsvId aId) + { + delete iEntry; + iEntry=NULL; + iEntry=iSession->GetEntryL(aId); + } + + +void CSmsBaseUtils::SetDefaultServiceL(TUid aMtm,TMsvId aService) const + { + CMsvEntry* rootEntry=iSession->GetEntryL(KMsvRootIndexEntryIdValue); + CleanupStack::PushL(rootEntry); + CMsvStore* store = rootEntry->EditStoreL(); + CleanupStack::PushL(store); + CMsvDefaultServices* services = new(ELeave)CMsvDefaultServices; + CleanupStack::PushL(services); + services->RestoreL(*store); + + TMsvDefaultService defaultService; + defaultService.iMtm=aMtm; + defaultService.iService=aService; + services->ChangeDefaultServiceL(defaultService); + services->StoreL(*store); + store->CommitL(); + + CleanupStack::PopAndDestroy(3, rootEntry); + } + + +TInt CSmsBaseUtils::DefaultServiceL(TUid aMtm,TMsvId& aService) const + { + CMsvEntry* rootEntry=iSession->GetEntryL(KMsvRootIndexEntryIdValue); + CleanupStack::PushL(rootEntry); + CMsvStore* store=rootEntry->ReadStoreL(); + CleanupStack::PushL(store); + CMsvDefaultServices* services=new(ELeave)CMsvDefaultServices; + CleanupStack::PushL(services); + services->RestoreL(*store); + + TInt ret=services->DefaultService(aMtm, aService); + + CleanupStack::PopAndDestroy(3, rootEntry); + + return ret; + } + + +// +void CSmsTestUtils::StartL() + { + _LIT(KSmsAccountName, "Short Message"); + + CSmsBaseUtils::StartL(); + + CSmsSettings* smsSettings = CSmsSettings::NewL(); + CleanupStack::PushL(smsSettings); + SetEntryL(KMsvRootIndexEntryId); + + EntryL().SetSortTypeL(SelectionOrdering()); + CMsvEntrySelection* selection=EntryL().ChildrenWithTypeL(KUidMsvServiceEntry); + CleanupStack::PushL(selection); + TInt count=selection->Count(); + TBool found=EFalse; + TPtrC accountName(KSmsAccountName); + TMsvId idSms=0; + for (TInt i=count; i>0 && !found; ) + { + SetEntryL(selection->At(--i)); + if (EntryL().Entry().iMtm == KUidMsgTypeSMS && EntryL().Entry().iType == KUidMsvServiceEntry) + { + idSms=EntryL().EntryId(); + found=ETrue; + } + } + + if (!found) + { + TMsvEntry entry; + entry.iMtm = KUidMsgTypeSMS; + entry.iType = KUidMsvServiceEntry; + entry.SetReadOnly(EFalse); + entry.SetVisible(EFalse); + entry.SetOperation(ETrue); + entry.iDetails.Set(accountName); + + SetEntryL(KMsvRootIndexEntryId); + EntryL().CreateL(entry); + idSms=entry.Id(); + + smsSettings->SetValidityPeriod(ESmsVPWeek); + smsSettings->SetValidityPeriodFormat(TSmsFirstOctet::ESmsVPFInteger); + smsSettings->SetReplyQuoted(EFalse); + smsSettings->SetRejectDuplicate(ETrue); + smsSettings->SetDelivery(ESmsDeliveryImmediately); + smsSettings->SetDeliveryReport(ETrue); + smsSettings->SetReplyPath(EFalse); + smsSettings->SetMessageConversion(ESmsConvPIDNone); + smsSettings->SetCanConcatenate(ETrue); + + SetEntryL(idSms); + + CMsvStore* msvstore=EntryL().EditStoreL(); + CleanupStack::PushL(msvstore); + smsSettings->StoreL(*msvstore); + msvstore->CommitL(); + CleanupStack::PopAndDestroy(msvstore); + } + + SetEntryL(idSms); + + CMsvStore* smsStore = EntryL().EditStoreL(); + CleanupStack::PushL(smsStore); + + smsSettings->RestoreL(*smsStore); + + TPtrC ptrSCName; + TPtrC ptrSCNumber; + + smsSettings->AddSCAddressL(ptrSCName, ptrSCNumber); + + smsSettings->StoreL(*smsStore); + smsStore->CommitL(); + + CleanupStack::PopAndDestroy(smsStore); + + SetDefaultServiceL(KUidMsgTypeSMS, idSms); + CleanupStack::PopAndDestroy(2); + } + + +// +CSmsBaseClientTest* CSmsBaseClientTest::NewL(CSmsTestUtils& aSmsUtils,RTest& aTest) + { + CSmsBaseClientTest* self = new (ELeave) CSmsBaseClientTest(aSmsUtils,aTest); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CSmsBaseClientTest* CSmsBaseClientTest::NewL(CSmsTestUtils* aSmsUtils, RTest& aTest) + { + CSmsBaseClientTest* self = new (ELeave) CSmsBaseClientTest(aSmsUtils, aTest); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CSmsBaseClientTest::~CSmsBaseClientTest() + { + Cancel(); + delete iCurrentSelection; + delete iOperation; + delete iOwnedSmsUtils; + } + +void CSmsBaseClientTest::DoCancel() + { + if (iOperation) + { + iOperation->Cancel(); + } + } + +void CSmsBaseClientTest::SetCurrentOperation(CMsvOperation* aOperation) + { + delete iOperation; + iOperation = aOperation; + } + + +CMsvOperation& CSmsBaseClientTest::CurrentOperation() + { + return *iOperation; + } + +void CSmsBaseClientTest::ConstructL() + { + CBaseTestHarness::ConstructL(); + iCurrentSelection = new (ELeave) CMsvEntrySelection; + } + +CSmsBaseClientTest::CSmsBaseClientTest(CSmsTestUtils& aSmsUtils, RTest& aTest) +: CBaseTestHarness(aTest), + iSmsUtils(aSmsUtils) + { + iOperation = NULL; + } + +CSmsBaseClientTest::CSmsBaseClientTest(CSmsTestUtils* aSmsUtils, RTest& aTest) +: CBaseTestHarness(aTest), + iSmsUtils(*aSmsUtils), + iOwnedSmsUtils(aSmsUtils) + { + iOperation = NULL; + } + +CSmsTestUtils& CSmsBaseClientTest::SmsTestUtils() + { + return iSmsUtils; + } + + +// +CSmsBaseClientSectionParser* CSmsBaseClientSectionParser::NewL(CSmsBaseClientTest& aSmsTest, CTestScript& aScript, const TDesC& aNewSectionName) + { + CSmsBaseClientSectionParser* self = new (ELeave) CSmsBaseClientSectionParser(aSmsTest, aScript); + CleanupStack::PushL(self); + self->ConstructL(aNewSectionName); + CleanupStack::Pop(self); + return self; + } + +void CSmsBaseClientSectionParser::LogCommentL(const TDesC& /*aComment*/) + { +// iEmailTest.EmailTestUtils().WriteComment(aComment); + } + +void CSmsBaseClientSectionParser::ConstructL(const TDesC& aNewSectionName) + { + CBaseSectionParser::ConstructL(aNewSectionName); + TTestDebugInfo debugInfo = iSmsTest.GetDebugInfo(); + debugInfo.SetTestHarnessName(iSection->SectionPosition()); + iSmsTest.SetDebugInfo(debugInfo); + iCommandParsers->AppendL(CNewSmsTestCommandParser::NewL(iScript,iSmsTest)); + iCommandParsers->AppendL(CSmsBaseUtilitiesParser::NewL(iSmsTest)); + } + +CSmsBaseClientSectionParser::CSmsBaseClientSectionParser(CSmsBaseClientTest& aSmsTest, CTestScript& aScript) : CBaseSectionParser(aScript), iSmsTest(aSmsTest) + { + } + + +// +CNewSmsBaseTestCommandParser* CNewSmsBaseTestCommandParser::NewL(CTestScript& aScript, CMainTestHarness& aMainTest, TBool aKeepLogFile) + { + CNewSmsBaseTestCommandParser* self = new (ELeave) CNewSmsBaseTestCommandParser(aScript, aMainTest, aKeepLogFile); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CNewSmsBaseTestCommandParser::ProcessL() + { + // Create sms stuff + CSmsTestUtils* smsUtils = new(ELeave) CSmsTestUtils(); + CleanupStack::PushL(smsUtils); + + // Create an Sms test, give it the test utilities + CSmsBaseClientTest* smsTest = CSmsBaseClientTest::NewL(smsUtils,iMainTest.TestConsole()); + CleanupStack::Pop(smsUtils); // smsTest has taken ownership + CleanupStack::PushL(smsTest); + + // Attach the Sms test to the main test + iMainTest.AddStateL(smsTest, iDebugInfo); + CleanupStack::Pop(smsTest); // SmsTest is now owned by the iMainTest + + // Check that there is one argument, the Sms test section name + CheckNumberOfArgumentsL(1); + + // Create an Sms section parser + CSmsBaseClientSectionParser* sectionParser = CSmsBaseClientSectionParser::NewL(*smsTest, iScript, (*iArgumentList)[0]); + CleanupStack::PushL(sectionParser); + sectionParser->ParseL(); + CleanupStack::PopAndDestroy(sectionParser); + } + +void CNewSmsBaseTestCommandParser::ConstructL() + { + CBaseCommandParser::ConstructL(); + AddCommandL(CCommandSmsBaseClientTest); + } + +CNewSmsBaseTestCommandParser::CNewSmsBaseTestCommandParser(CTestScript& aScript, CMainTestHarness& aMainTest, TBool aKeepLogFile) : iMainTest(aMainTest), iScript(aScript), iKeepLogFile(aKeepLogFile) + { + } + + +// +CSmsClientTest* CSmsClientTest::NewL(CSmsTestUtils& aSmsUtils, RTest& aTest) + { + CSmsClientTest* self = new (ELeave) CSmsClientTest(aSmsUtils, aTest); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CSmsClientTest::~CSmsClientTest() + { + } + +void CSmsClientTest::ConstructL() + { + CSmsBaseClientTest::ConstructL(); + } + +CSmsClientTest::CSmsClientTest(CSmsTestUtils& aSmsUtils, RTest& aTest) : CSmsBaseClientTest(aSmsUtils, aTest) + { + } + + +// +CSmsClientSectionParser* CSmsClientSectionParser::NewL(CSmsClientTest& aSmsTest, CTestScript& aScript, const TDesC& aNewSectionName) + { + CSmsClientSectionParser* self = new (ELeave) CSmsClientSectionParser(aSmsTest, aScript); + CleanupStack::PushL(self); + self->ConstructL(aNewSectionName); + CleanupStack::Pop(self); + return self; + } + +void CSmsClientSectionParser::ConstructL(const TDesC& aNewSectionName) + { + CSmsBaseClientSectionParser::ConstructL(aNewSectionName); + } + +CSmsClientSectionParser::CSmsClientSectionParser(CSmsClientTest& aSmsTest, CTestScript& aScript) : CSmsBaseClientSectionParser(aSmsTest, aScript), iSmsTest(aSmsTest) + { + } + + + +// +CNewSmsTestCommandParser* CNewSmsTestCommandParser::NewL(CTestScript& aScript, CSmsBaseClientTest& aSmsTest) + { + CNewSmsTestCommandParser* self = new (ELeave) CNewSmsTestCommandParser(aScript, aSmsTest); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + }; + +void CNewSmsTestCommandParser::ProcessL() + { + // Create an sms test, give it the test utilities + CSmsClientTest* smsTest = CSmsClientTest::NewL(iSmsTest.SmsTestUtils(), iSmsTest.TestConsole()); + CleanupStack::PushL(smsTest); + + // Attach the sms test to the main test + iSmsTest.AddStateL(smsTest, iDebugInfo); + CleanupStack::Pop(smsTest); // smsTest is now owned by the iMainTest + + // Check that there is one argument, the sms test section name + CheckNumberOfArgumentsL(1); + + // Create an sms section parser + CSmsClientSectionParser* sectionParser = CSmsClientSectionParser::NewL(*smsTest, iScript, (*iArgumentList)[0]); + CleanupStack::PushL(sectionParser); + sectionParser->ParseL(); + CleanupStack::PopAndDestroy(sectionParser); + } + +void CNewSmsTestCommandParser::ConstructL() + { + CBaseCommandParser::ConstructL(); + AddCommandL(CCommandSmsClientTest); + } + +CNewSmsTestCommandParser::CNewSmsTestCommandParser(CTestScript& aScript, CSmsBaseClientTest& aSmsTest) : iSmsTest(aSmsTest), iScript(aScript) + { + } + + + +// +CSmsBaseUtilitiesParser* CSmsBaseUtilitiesParser::NewL(CSmsBaseClientTest& aSmsTest) + { + CSmsBaseUtilitiesParser* self = new (ELeave) CSmsBaseUtilitiesParser(aSmsTest); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CSmsBaseUtilitiesParser::ProcessL() + { + TInt howMany; + + if ((*iCurrentCommand) == KCommandSmsBegin) + { + iSmsTest.AddStateL(new(ELeave) CSmsBegin(iSmsTest.SmsTestUtils()),iDebugInfo); + } + else if ((*iCurrentCommand) == KCommandSmsCreateMessage) + { + if (iArgumentList->Count() == 4) // If optional howmany is specified + { + TPtrC param = (*iArgumentList)[3]; + TLex lex(param); + if (lex.Val(howMany)!=KErrNone) + howMany=1; + } + else + { + howMany = 1; + CheckNumberOfArgumentsL(3); + } + RFs fs; + fs.Connect(); + TParse fileName; + ResolveFile(fs, (*iArgumentList)[0], (*iArgumentList)[1], fileName); + fs.Close(); + TMsvId folder; + TPtrC folderName = (*iArgumentList)[2]; + if (folderName == _L("inbox")) + folder = KMsvGlobalInBoxIndexEntryId; + else if (folderName == _L("outbox")) + folder = KMsvGlobalOutBoxIndexEntryId; + else if (folderName == _L("sent")) + folder = KMsvSentEntryId; + else + folder = KMsvDraftEntryId; + iSmsTest.AddStateL(new (ELeave) CCreateSmsMessage(folder, iSmsTest.iCurrentServiceId, fileName.FullName(), iSmsTest.SmsTestUtils(),howMany), iDebugInfo); + } + else if ((*iCurrentCommand) == KCommandSmsEnd) + { + iSmsTest.AddStateL(new(ELeave) CSmsEnd(iSmsTest.SmsTestUtils()),iDebugInfo); + } + else + { + User::Leave(KErrNotFound); + } + } + +void CSmsBaseUtilitiesParser::ConstructL() + { + CBaseCommandParser::ConstructL(); + AddCommandL(KCommandSmsBegin); + AddCommandL(KCommandSmsCreateMessage); + AddCommandL(KCommandSmsEnd); + } + +CSmsBaseUtilitiesParser::CSmsBaseUtilitiesParser(CSmsBaseClientTest& aSmsTest) : iSmsTest(aSmsTest) + { + } + + +// +void CSmsBegin::StartL(TRequestStatus& aStatus) + { + iSmsUtils.StartL(); + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + +CSmsBegin::CSmsBegin(CSmsTestUtils& aSmsUtils) : iSmsUtils(aSmsUtils) + {} + + +// +void CSmsEnd::StartL(TRequestStatus& aStatus) + { +// iSmsUtils.StartL(); + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + +CSmsEnd::CSmsEnd(CSmsTestUtils& aSmsUtils) : iSmsUtils(aSmsUtils) + {} + + +// +CCreateSmsMessage::CCreateSmsMessage(TMsvId aFolderId, const TMsvId& aServiceId, const TDesC& aFileName, CSmsTestUtils& aSmsUtils,TInt aHowMany) : CActive(EPriorityNormal), iCurrentFolderId(aFolderId), iServiceId(aServiceId), iSmsUtils(aSmsUtils), iHowMany(aHowMany) + { + CActiveScheduler::Add(this); + iFileName = aFileName; + } + +void CCreateSmsMessage::StartL(TRequestStatus& aStatus) + { + delete iTimer; + iTimer = 0; + iTimer = CTestTimer::NewL(); + iReportStatus = &aStatus; + iTimer->AfterReq(5000000, iStatus); + aStatus = KRequestPending; + iState = ECreateSmsWait1; + SetActive(); + } + +void CCreateSmsMessage::RunL() + { + TInt i; + switch (iState) + { + case ECreateSmsWait1: + for (i=0; iAfterReq(5000000, iStatus); + + iState = ECreateSmsWait2; + SetActive(); + break; + + case ECreateSmsWait2: + // We should be safely back on the client side so we can continue. + User::RequestComplete(iReportStatus, iStatus.Int()); + break; + }; + } + +void CCreateSmsMessage::CreateMessageL() + { + CParaFormatLayer* paraFormatLayer=CParaFormatLayer::NewL(); + CleanupStack::PushL(paraFormatLayer); + + CCharFormatLayer* charFormatLayer=CCharFormatLayer::NewL(); + CleanupStack::PushL(charFormatLayer); + + CRichText* bodyText=CRichText::NewL(paraFormatLayer, charFormatLayer, CEditableText::EFlatStorage, 256); + CleanupStack::PushL(bodyText); + + + CSendAs* sendAs=CSendAs::NewL(*this); + CleanupStack::PushL(sendAs); + + sendAs->SetMtmL(KUidMsgTypeSMS); + + if (sendAs->AvailableServices().Count() < 1) + { + User::Leave(KErrNotFound); + } + sendAs->SetService(0); + + sendAs->CreateMessageL(iCurrentFolderId); + + TRAPD(err, sendAs->SaveMessageL(ETrue)); + if (err != KErrNone) + { + sendAs->AbandonMessage(); + } + else + { + TMsvId messageId=sendAs->MessageId(); + iSmsUtils.SetEntryL(messageId); + + //Get the new message + CSmsHeader* smsHeader = CSmsHeader::NewL(CSmsPDU::ESmsSubmit, *bodyText); + CleanupStack::PushL(smsHeader); + CMsvStore* store = iSmsUtils.EntryL().EditStoreL(); + CleanupStack::PushL(store); + + smsHeader->RestoreL(*store); + + TMsvEntry entry=iSmsUtils.EntryL().Entry(); + + entry.SetSendingState(KMsvSendStateSuspended); + + TBuf details; + if ( TSmsUtilities::GetDetails(iSmsUtils.EntryL().Session().FileSession(), smsHeader->Message(), details) == KErrNone ) + { + entry.iDetails.Set(details); + } + + TBuf desc; + if ( TSmsUtilities::GetDescription(smsHeader->Message(), desc) == KErrNone ) + { + entry.iDescription.Set(desc); + } + entry.SetInPreparation(EFalse); + + // Update entry with data set from .ini file + iSmsUtils.EntryL().ChangeL(entry); + smsHeader->StoreL(*store); + + CleanupStack::PopAndDestroy(2, smsHeader); + } + CleanupStack::PopAndDestroy(sendAs); + CleanupStack::PopAndDestroy(3); // bodyText, paraFormatLayer, charFormatLayer + } + +void CCreateSmsMessage::DoCancel() + { + } + +CCreateSmsMessage::~CCreateSmsMessage() + { + if (iTimer) + { + iTimer->Cancel(); + } + delete iTimer; + } + +