diff -r 000000000000 -r 8e480a14352b messagingfw/msgtestfw/TestActions/Sms/src/CmtfTestActionCompareSmsMessages.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtestfw/TestActions/Sms/src/CmtfTestActionCompareSmsMessages.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,261 @@ +// Copyright (c) 2003-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: +// __ACTION_INFO_BEGIN__ +// [Action Name] +// CompareSmsMessages +// [Action Parameters] +// TMsvId FolderId1 : Value of Folder Id to be compared with. +// TMsvId FolderId2 : Value of Folder Id to be compared +// CMsvSession session : Reference to the session. +// TInt Result : Value of enumerated constants if not +// identical(zero if one folder has +// corresponding same message in other folder). +// [Action Description] +// Compare and check the whether the messages in one folder has corresponding same message +// in other folder. The output of the Test action should be zero if all parts of +// the message in both folders are identical, otherwise the corresponding +// enumerated value of the non-identical part of the message. +// [APIs Used] +// CMsvEntrySelection::ChildrenL +// CMsvEntrySelection::Count +// CMsvSession::GetEntryL +// CMsvEntry::Entry +// CMsvStore::RestoreBodyTextL +// CSmsHeader::RestoreL +// __ACTION_INFO_END__ +// +// + +/** + @file +*/ + +// system includes +#include +#include +#include +#include + + +// user includes +#include "CmtfTestActionCompareSmsMessages.h" +#include "CMtfTestCase.h" +#include "CMtfTestActionParameters.h" + +CMtfTestAction* CMtfTestActionCompareSmsMessages::NewL(CMtfTestCase& aTestCase,CMtfTestActionParameters* aActionParameters) + { + CMtfTestActionCompareSmsMessages* self = new (ELeave) CMtfTestActionCompareSmsMessages(aTestCase); + CleanupStack::PushL(self); + self->ConstructL(aActionParameters); + CleanupStack::Pop(); + return self; + } + + +CMtfTestActionCompareSmsMessages::CMtfTestActionCompareSmsMessages(CMtfTestCase& aTestCase) + :CMtfSynchronousTestAction(aTestCase) + { + } + + +CMtfTestActionCompareSmsMessages::~CMtfTestActionCompareSmsMessages() + { + } + +void CMtfTestActionCompareSmsMessages::ExecuteActionL() + { + TestCase().INFO_PRINTF2(_L("Test Action %S start..."), &KTestActionCompareSmsMessages); + TMsvId paramFolderId1 = ObtainValueParameterL(TestCase(),ActionParameters().Parameter(0)); + TMsvId paramFolderId2 = ObtainValueParameterL(TestCase(),ActionParameters().Parameter(1)); + + iParamSession = ObtainParameterReferenceL(TestCase(),ActionParameters().Parameter(2)); + + CMsvEntry* folderEntry1 = CMsvEntry::NewL(*iParamSession,paramFolderId1,TMsvSelectionOrdering()); + CleanupStack::PushL(folderEntry1); + CMsvEntrySelection* folder1Selection =folderEntry1->ChildrenWithMtmL(KUidMsgTypeSMS); + CleanupStack::PushL(folder1Selection); + folderEntry1->SetEntryL(paramFolderId2); + CMsvEntrySelection* folder2Selection =folderEntry1->ChildrenWithMtmL(KUidMsgTypeSMS); + CleanupStack::PushL(folder2Selection); + TInt count1 = folder1Selection->Count(); + TInt resCount=0; + TInt enumVal; + TInt folder1Count=count1; + TInt count2 = folder2Selection->Count(); + if((count1 <= 0)||(count2 < count1)) + { + User::Leave(KErrGeneral); + } + TMsvId msgId1 = KMsvRootIndexEntryId; + CMsvEntry* f1Entry = iParamSession->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(f1Entry); + TMsvId msgId2 = KMsvRootIndexEntryId; + CMsvEntry* f2Entry = iParamSession->GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(f2Entry); + + while (count1--) + { + msgId1 = (*folder1Selection)[count1]; + f1Entry->SetEntryL(msgId1); + TMsvEntry msgEntry1 = f1Entry->Entry(); + while (count2--) + { + msgId2 = (*folder2Selection)[count2]; + f2Entry->SetEntryL(msgId2); + TMsvEntry msgEntry2 = f2Entry->Entry(); + + if (IsMatchHeaderL(*f1Entry, *f2Entry)) + { + enumVal = EFailedToMatchHeader; + } + else if (!IsMatchL(*f1Entry, *f2Entry)) + { + enumVal = EFailedToMatchBody; + } + else + { + resCount++; + if(resCount == folder1Count) + { + enumVal = EAllMatched; + } + break; + } + } + } + StoreParameterL(TestCase(),enumVal,ActionParameters().Parameter(3)); + CleanupStack::PopAndDestroy(f2Entry); + CleanupStack::PopAndDestroy(f1Entry); + CleanupStack::PopAndDestroy(folder2Selection); + CleanupStack::PopAndDestroy(folder1Selection); + CleanupStack::PopAndDestroy(folderEntry1); + TestCase().INFO_PRINTF2(_L("Test Action %S completed."), &KTestActionCompareSmsMessages); + TestCase().ActionCompletedL(*this); + } + + + + TBool CMtfTestActionCompareSmsMessages::IsMatchL(CMsvEntry& aFolder1Msg, CMsvEntry& aFolder2Msg) +/** + * Compares the body text of Folder1 and Folder2 + * + * @return Returns ETrue if the body text matches + */ + { + HBufC* folder1MsgBody = GetBodyTextL(aFolder1Msg); + HBufC* folder2MsgBody = GetBodyTextL(aFolder2Msg); + TBool retVal = (*folder1MsgBody == *folder2MsgBody); + return retVal; + } + + TBool CMtfTestActionCompareSmsMessages::IsMatchHeaderL(CMsvEntry& aFolder1Msg, CMsvEntry& aFolder2Msg) +/** + * Compares the Message Header of Folder1 and Folder2 + * + * @return Returns ETrue if the body text matches + */ + { + CSmsHeader* folder1MsgHeader = GetSubmitHeaderL(aFolder1Msg); + CleanupStack::PushL(folder1MsgHeader); + CSmsHeader* folder2MsgHeader = GetDeliverHeaderL(aFolder2Msg); + CleanupStack::PushL(folder2MsgHeader); + + CArrayPtrFlat& f1Recipients = folder1MsgHeader->Recipients(); + CArrayPtrFlat& f2Recipients = folder2MsgHeader->Recipients(); + + TInt f1Count = f1Recipients.Count(); + TInt f2Count = f2Recipients.Count(); + TBool retVal = ETrue; + if((f1Count == f2Count)&&(folder1MsgHeader->Type()==folder2MsgHeader->Type())) + { + for(TInt i=0;iFileSession(), CSmsPDU::ESmsSubmit, CSmsBuffer::NewL())); + CleanupStack::PushL(header); + + CMsvStore* store = aMessage.ReadStoreL(); + CleanupStack::PushL(store); + header->RestoreL(*store); + CleanupStack::PopAndDestroy(store); + + CleanupStack::Pop(header); + return header; + } + + CSmsHeader* CMtfTestActionCompareSmsMessages::GetDeliverHeaderL(CMsvEntry& aMessage) + /** + * Returns the CSmsHeader restored from message aMessage. + */ + { + CSmsHeader* header = CSmsHeader::NewL(CSmsMessage::NewL(iParamSession->FileSession(), CSmsPDU::ESmsDeliver, CSmsBuffer::NewL())); + CleanupStack::PushL(header); + + CMsvStore* store = aMessage.ReadStoreL(); + CleanupStack::PushL(store); + header->RestoreL(*store); + CleanupStack::PopAndDestroy(store); + + CleanupStack::Pop(header); + return header; + } + + +HBufC* CMtfTestActionCompareSmsMessages::GetBodyTextL(CMsvEntry& aMessage) +/** + * @return The body text of message aMessage + */ + { + CMsvStore* store = aMessage.ReadStoreL(); + CleanupStack::PushL(store); + + CRichText* richText; + CParaFormatLayer* paraFormatLayer; + CCharFormatLayer* charFormatLayer; + paraFormatLayer=CParaFormatLayer::NewL(); + CleanupStack::PushL(paraFormatLayer); + charFormatLayer=CCharFormatLayer::NewL(); + CleanupStack::PushL(charFormatLayer); + + richText=CRichText::NewL(paraFormatLayer, charFormatLayer); + CleanupStack::PushL(richText); + store->RestoreBodyTextL(*richText); + const TInt len =richText->DocumentLength(); + HBufC* buf = HBufC::NewL(len); + TPtr ptr(buf->Des()); + richText->Extract(ptr); + CleanupStack::PopAndDestroy(richText); + CleanupStack::PopAndDestroy(charFormatLayer); + CleanupStack::PopAndDestroy(paraFormatLayer); + CleanupStack::PopAndDestroy(store); + return buf; + }